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

如何在pyautocad中读取AutoCAD块参照BOM及解决属性读取报错

解决pyautocad读取AutoCAD块BOM时的KeyError:9问题

嘿,我之前刚踩过这个坑!你遇到的KeyError:9是因为AutoCAD里某些块属性的数据类型不在pyautocad依赖的comtypes默认类型映射里,直接调用GetAttributes()就会触发这个错误。而且你原代码还有个小问题——你遍历的是Block(块定义),但实际要读取的是图纸里插入的BlockReference(块参照),这俩可不是一回事儿!

先看你原代码的核心问题:

from pyautocad import Autocad
acad = Autocad()
for obj in acad.iter_objects(['Block']):
    if obj.HasAttributes:
        obj.GetAttributes()

这里的['Block']指的是后台的块定义,不是插入到图纸里的实际BOM块实例;另外GetAttributes()直接返回属性列表时,遇到特殊数据类型会触发comtypes的类型转换错误。

调整后的可运行代码:

from pyautocad import Autocad

acad = Autocad(create_if_not_exists=True)

# 遍历图纸中所有的块参照(BlockReference),这才是插入的BOM块实例
for block_ref in acad.iter_objects(['BlockReference']):
    if block_ref.HasAttributes:
        print(f"--- 块名称: {block_ref.Name} ---")
        # 逐个处理每个属性,捕获类型转换异常
        for attr in block_ref.GetAttributes():
            tag = attr.TagString
            try:
                # 优先读取TextString,大部分BOM属性是文本类型,更稳定
                value = attr.TextString
            except Exception:
                # 如果TextString读取失败,尝试读Value,同时捕获KeyError
                try:
                    value = attr.Value
                except KeyError:
                    value = "<无法读取的属性类型>"
            print(f"{tag}: {value}")

关键细节解释:

  • 对象类型修正:把Block换成BlockReference,才能获取到图纸里实际插入的BOM块实例,而不是后台的块定义。
  • 异常捕获机制:通过两层try-except处理特殊数据类型的属性,避免因为单个属性读取失败导致整个程序崩溃。
  • 优先用TextString:AutoCAD块属性的文本内容基本都存在TextString中,比直接读取Value更可靠,因为Value可能返回整数、实数等各种类型,容易触发comtypes的类型映射问题。

进阶筛选技巧:

如果你只需要读取特定名称的BOM块,可以加个名称判断:

# 替换成你的BOM块的实际名称
target_block_name = "BOM_MAIN"
for block_ref in acad.iter_objects(['BlockReference']):
    if block_ref.Name == target_block_name and block_ref.HasAttributes:
        # 处理属性逻辑
        pass

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 10:02:33