python - 在 AutoCAD 中使用 Item Method 查找 block

标签 python pywin32 autocad

我正在尝试使用 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

我不明白为什么第二个有效而第一个无效。当我阅读文档时,似乎他们都应该找到相同的对象。

最佳答案

调用 ItemBlocks 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/

相关文章:

Python .month 格式是 numeric(1) 想要 MMM(Jan)

python - Pandas:将分组中的唯一项放入单独的行而不是数组中

python - 如何使用pywin32在Excel文件中有效地将值填充到一列?

lisp - 如何按实体名称选择 Autocad 实体以用于 lisp 中的 autocad 命令

c# - 如何通过 C# 外部应用程序访问 AutoCAD 应用程序的特定实例

python 删除xml中的非标签

python - 如何最大化非事件窗口?

python - 如何使用 python win32com 或 comtypes 中的 COM 访问 IRTDServer?

python - 使用 Python 自动化 AutoCAD

python - 在 PYTHONPATH 元素顶部导入两个同名的模块