我正在尝试使用 Python 和 pywin32
在 AutoCAD 中自动执行某些任务. AutoCAD版本为2018。
我已尝试按照 AutoCAD 文档中显示的方法进行操作:http://help.autodesk.com/view/ACD/2018/ENU/?guid=GUID-A5B6ACC4-DCD8-4FE2-AB06-D3C3C349475B
我想选择一个特定的 block ,然后编辑它的一些属性。
我的代码:
acad = win32com.client.Dispatch("AutoCAD.Application")
acad.ActiveDocument = acad.Documents.Open(os.path.normpath(os.path.join(baseDir,filename)))
time.sleep(2)
doc = acad.ActiveDocument # Document object
entity = doc.Blocks.Item('TTLB ATTRIBUTES')
print entity.Name
print entity.HasAttributes
这会正确打印 block 名称,但尝试访问 HasAttributes
属性会导致此错误:
AttributeError: Item.HasAttributes
如果我将代码更改为简单地遍历所有对象,那么它就可以工作了:
acad = win32com.client.Dispatch("AutoCAD.Application")
acad.ActiveDocument = acad.Documents.Open(os.path.normpath(os.path.join(baseDir,filename)))
time.sleep(2)
doc = acad.ActiveDocument # Document object
for entity in doc.PaperSpace:
if entity.EntityName == 'AcDbBlockReference':
if entity.Name == 'TTLB ATTRIBUTES':
print entity.Name
print entity.HasAttributes
我不明白为什么第二个有效而第一个无效。当我阅读文档时,似乎他们都应该找到相同的对象。
最佳答案
调用 Item
时Blocks collection 上的方法,您将获得 Block Definition对象 (AcDbBlockTableRecord
),它是构成 block 几何体的对象集的容器,并且不具有 HasAttributes
属性(property)。
然而,当遍历 Paperspace Collection 持有的对象时(它本身就是一种 block 定义),你遇到了 Block Reference对象 (AcDbBlockReference
),确实具有 HasAttributes
属性(property)。
考虑到 block 定义本质上是 block 的“蓝图”,每个 block 引用都是一个实例,显示在 block 定义中找到的对象,在绘图中的特定位置、比例、旋转和方向。
属性还有Attribute Definitions在 block 定义 中,以及相应的 Attribute References附加到每个 block 引用。这样的属性引用然后可以为绘图中插入的每个 block 引用保存不同的文本内容。
除此之外,有趣的是,属性引用也可以独立于 block 定义以编程方式附加到 block 引用,但是,当使用标准的现成前端操作 AutoCAD 时,这是不允许的。
根据上述信息,您需要迭代在相关布局容器中找到的 block 引用,并且,如果 block 引用满足您的条件,则迭代 block 引用持有的属性引用集(您可以使用 GetAttributes
方法获取),更改 Textstring
符合您标准的那些属性的属性。
关于python - 在 AutoCAD 中使用 Item Method 查找 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59328526/