如何在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
相关产品推荐
相关产品推荐

