在 AutoCAD 中使用 Item Method 查找块
Finding blocks with Item Method in AutoCAD
我正在尝试使用 Python 和 pywin32
在 AutoCAD 中自动执行某些任务。 AutoCAD 版本为 2018.
我尝试按照 AutoCAD 文档中显示的方法进行操作:http://help.autodesk.com/view/ACD/2018/ENU/?guid=GUID-A5B6ACC4-DCD8-4FE2-AB06-D3C3C349475B
我想select一个特定的块,然后编辑它的一些属性。
我的代码:
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
这正确地打印了块名称,但是尝试访问 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
method on the Blocks collection, you are obtaining a Block Definition object (AcDbBlockTableRecord
), which is a container for the set of objects constituting the block geometry and does not have the HasAttributes
时 属性.
然而,当遍历 Paperspace Collection (which is itself a type of Block Definition), you are encountering Block Reference objects (AcDbBlockReference
), which do have the HasAttributes
属性 持有的对象时。
考虑到块定义本质上是块的 "blueprint",每个块引用都是一个实例,显示在块定义中找到的对象,在特定位置、比例、旋转和方向绘图。
属性也有 Attribute Definitions within the Block Definition, and corresponding Attribute References 附加到每个块 参考。这样的属性引用然后可以为绘图中插入的每个块引用保存不同的文本内容。
除此之外,有趣的是,属性引用也可以独立于块定义以编程方式附加到块引用,但是,在使用标准开箱即用的前端操作 AutoCAD 时,这是不允许的。
根据以上信息,您将需要迭代在相关布局容器中找到的块引用,并且,如果块引用满足您的条件,则迭代块引用持有的属性引用集(这您可以使用满足您条件的那些属性的 GetAttributes
method), changing the Textstring
属性 来获得。
我正在尝试使用 Python 和 pywin32
在 AutoCAD 中自动执行某些任务。 AutoCAD 版本为 2018.
我尝试按照 AutoCAD 文档中显示的方法进行操作:http://help.autodesk.com/view/ACD/2018/ENU/?guid=GUID-A5B6ACC4-DCD8-4FE2-AB06-D3C3C349475B
我想select一个特定的块,然后编辑它的一些属性。
我的代码:
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
这正确地打印了块名称,但是尝试访问 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
method on the Blocks collection, you are obtaining a Block Definition object (AcDbBlockTableRecord
), which is a container for the set of objects constituting the block geometry and does not have the HasAttributes
时 属性.
然而,当遍历 Paperspace Collection (which is itself a type of Block Definition), you are encountering Block Reference objects (AcDbBlockReference
), which do have the HasAttributes
属性 持有的对象时。
考虑到块定义本质上是块的 "blueprint",每个块引用都是一个实例,显示在块定义中找到的对象,在特定位置、比例、旋转和方向绘图。
属性也有 Attribute Definitions within the Block Definition, and corresponding Attribute References 附加到每个块 参考。这样的属性引用然后可以为绘图中插入的每个块引用保存不同的文本内容。
除此之外,有趣的是,属性引用也可以独立于块定义以编程方式附加到块引用,但是,在使用标准开箱即用的前端操作 AutoCAD 时,这是不允许的。
根据以上信息,您将需要迭代在相关布局容器中找到的块引用,并且,如果块引用满足您的条件,则迭代块引用持有的属性引用集(这您可以使用满足您条件的那些属性的 GetAttributes
method), changing the Textstring
属性 来获得。