You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python中获取AutoCAD MassProp命令的属性参数?

解决Python获取AutoCAD MassProp属性的问题

一、修复IAcad3DSolid转换错误

你代码里直接调用acad.IAcad3DSolid()是错误用法,pyautocad返回的选中对象是动态COM绑定对象,需要用comtypes的Cast方法转换为具体接口。示例代码:

import pyautocad
from comtypes.client import Cast
from comtypes.gen.AutoCAD import IAcad3DSolid

acad = pyautocad.Autocad()
reslt = acad.get_selection(text='select objects')
# 先判断对象是否为3D实体
if reslt[0].ObjectName == "AcDb3dSolid":
    solid = Cast(reslt[0], IAcad3DSolid)
else:
    print("选中对象不是3D实体")

二、正确获取MassProp相关属性

方法1:直接读取对象属性(推荐)

无需执行MassProp命令,多数属性可直接从实体/面域对象的属性读取,更可靠:

import pyautocad
from comtypes.client import Cast
from comtypes.gen.AutoCAD import IAcadRegion, IAcad3DSolid

acad = pyautocad.Autocad()
selected = acad.get_selection(text='select objects')[0]

if selected.ObjectName == "AcDbRegion":
    region = Cast(selected, IAcadRegion)
    print(f"面积: {region.Area}")
    print(f"周长: {region.Perimeter}")
elif selected.ObjectName == "AcDb3dSolid":
    solid = Cast(selected, IAcad3DSolid)
    print(f"面积: {solid.Area}")
    print(f"体积: {solid.Volume}")
    print(f"质心: {solid.Centroid}")
    print(f"质量: {solid.Mass}")
else:
    print("该对象类型不支持直接读取目标属性")

方法2:修复MassProp命令后变量读取为0的问题

若必须用MassProp命令,问题根源是SendCommand异步执行,且命令执行需要完成交互,同时需等待AutoCAD完成计算再读取变量:

import pyautocad
import time

acad = pyautocad.Autocad()
# 先选中目标对象
acad.get_selection(text='select objects')
# 执行MassProp,发送两次回车:第一次确认选择,第二次关闭结果对话框
acad.doc.SendCommand("MassProp\n\n")
# 短暂等待AutoCAD完成计算并更新变量
time.sleep(0.5)
# 读取系统变量
area = acad.doc.GetVariable("AREA")
userr2 = acad.doc.GetVariable("USERR2")
userr3 = acad.doc.GetVariable("USERR3")
userr4 = acad.doc.GetVariable("USERR4")
userr5 = acad.doc.GetVariable("USERR5")

print(f"面积: {area}")
print(f"周长(USERR2): {userr2}")
print(f"质心X(USERR3): {userr3}")
print(f"质心Y(USERR4): {userr4}")
print(f"质心Z(USERR5): {userr5}")

三、关键注意事项

  • 不同对象类型的属性范围不同:需先通过ObjectName判断是面域(AcDbRegion)还是3D实体(AcDb3dSolid)
  • 系统变量AREA、USERR2-USERR5会被后续操作覆盖,需在MassProp执行后立即读取
  • 优先使用对象直接属性,避免SendCommand异步执行带来的不可靠性

内容的提问来源于stack exchange,提问作者vns955

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 06:33:26