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

