做标书的朋友肯定遇到过这种情况:好几十个CAD图,要批量修改属性——图名、日期、版本号、负责人。
你一个个打开改?改完第一批,第二批又忘了。
Autodesk没有公开的Python库能直接改DWG,官方API是C++的。这条路走不通。
但我今天要说的是:曲线救国,用DXF中间格式绕过这个问题。
DXF是CAD的文本格式公开标准,任何人都能读能写。原理很简单:
DWG (二进制) → DXF (文本) → 修改 → DWG/DXF先把DWG转成DXF,Python读取DXF内容,修改属性,再保存回去。
就这几行代码:
import ezdxfdoc = ezdxf.readfile('source.dxf')msp = doc.modelspace()for e in msp.query('ATTRIB'): e.dxf.text = '新属性'doc.saveas('updated.dxf')解释一下:
ezdxfreadfilequery('ATTRIB')dxf.textsaveas如果想转回DWG,用AutoCAD或者DraftSight批量转换即可。
先别急着找DWG文件,复制这段测试一下流程:
import ezdxfimport os# 创建一个测试DXF文件doc = ezdxf.new('R2010')msp = doc.modelspace()# 添加一些测试块for i inrange(5):# 创建属性块 msp.add_block_ref('TEST_BLOCK', (i*100, 0), {'NAME': f'图{i+1:02d}','DATE': '2024-01-01','VERSION': 'V1.0' })# 保存测试文件test_file = 'test_blocks.dxf'doc.saveas(test_file)print(f"✅ 测试文件已创建: {test_file}")# 读取并修改print("\n读取文件...")doc2 = ezdxf.readfile(test_file)msp2 = doc2.modelspace()# 查找所有属性attrs = list(msp2.query('ATTRIB'))print(f"找到 {len(attrs)} 个属性")# 修改属性for i, attr inenumerate(attrs): old_value = attr.dxf.text attr.dxf.text = f'图{i+1:02d}_修改版'print(f" {old_value} → {attr.dxf.text}")# 保存修改后的文件output_file = 'test_blocks_modified.dxf'doc2.saveas(output_file)print(f"\n✅ 修改完成: {output_file}")# 清理测试文件os.remove(test_file)os.remove(output_file)print("🧹 测试文件已清理")跑完后你会看到:属性从"图01"变成了"图01_修改版"。流程跑通了,就可以用到实际项目里了。
坐标系和单位
DXF里的单位默认是1:1,和你的项目单位可能不一致。转换前确认好。
元数据规范
每个项目的属性命名规则不一样,脚本要按你们的规范来写匹配规则。
版本兼容
DXF有不同版本(R12、R14、2000+),读写时注意版本兼容性。
这只是个起点。
实际场景中,结合你们的图纸元数据规范,可以扩展成:
做标书的朋友应该懂这能省多少事。其他的自己发挥。
以往文章合集: