跳到主要内容Python 使用 ezdxf 读写 DXF 文件指南 | 极客日志Python
Python 使用 ezdxf 读写 DXF 文件指南
介绍在 Python 中使用 ezdxf 库处理 DXF 文件的方法。涵盖安装、DXF 结构概念、创建新文件、读取现有文件、操作图层、添加文字与块等核心功能。通过代码示例演示如何提取几何信息、批量修改及可视化调试,适用于工程制图自动化、BIM 数据提取等场景。
草莓泡芙5 浏览 在工程制图、建筑、机械设计等领域,DXF(Drawing Exchange Format) 是一种广泛使用的矢量图形文件格式,由 Autodesk 开发,用于在不同 CAD 软件之间交换数据。如果你需要在 Python 中自动化处理 CAD 图纸——比如提取几何信息、批量修改图层、生成简单图纸或与 BIM 系统集成——那么 就是你不可或缺的利器。
ezdxf
ezdxf 是一个功能强大且易于上手的开源 Python 库,支持读取、创建和修改 DXF 文件(兼容 R12 到 R2018 等多个版本)。本文将带你从安装到实战,全面掌握 ezdxf 的核心用法。
一、安装 ezdxf
💡 建议同时安装 matplotlib 或 opencv-python,便于可视化调试(非必需)。
二、基础概念:DXF 文件结构简述
在使用 ezdxf 前,了解 DXF 的基本组成有助于理解 API 设计:
- Entities(实体):如 LINE(直线)、CIRCLE(圆)、TEXT(文字)、POLYLINE(多段线)等。
- Layers(图层):用于组织和控制实体的显示/打印属性。
- Blocks(块):可重复使用的图形组合(类似'符号')。
- Modelspace / Paperspace:模型空间(实际设计区域)和布局空间(打印排版区域)。
ezdxf 将这些概念封装为直观的 Python 对象。
三、创建一个新的 DXF 文件
下面是一个创建包含直线和圆的简单 DXF 文件的示例:
import ezdxf
doc = ezdxf.new(dxfversion='R2010')
msp = doc.modelspace()
msp.add_line((0, 0), (10, 10))
msp.add_circle(center=(5, 5), radius=3)
doc.saveas("example.dxf")
print("DXF 文件已生成:example.dxf")
运行后,你将得到一个可在 AutoCAD、DraftSight、FreeCAD 等软件中打开的 .dxf 文件。
四、读取现有 DXF 文件并遍历实体
假设你有一个现成的 drawing.dxf,想提取其中所有直线坐标:
import ezdxf
doc = ezdxf.readfile("drawing.dxf")
msp = doc.modelspace()
for entity in msp:
if entity.dxftype() == 'LINE':
start = entity.dxf.start
end = entity.dxf.end
print(f"直线:{start} → {end}")
elif entity.dxftype() == 'CIRCLE':
center = entity.dxf.center
radius = entity.dxf.radius
print(f"圆:中心 {center},半径 {radius}")
✅ entity.dxftype() 返回实体类型字符串,是判断实体种类的关键方法。
五、操作图层(Layers)
图层是 CAD 组织图形的核心机制。ezdxf 允许你创建、修改和分配图层:
doc.layers.new(name="WALLS", dxfattribs={'color': 1})
msp.add_line((0, 0), (100, 0), dxfattribs={'layer': 'WALLS'})
layer = doc.layers.get("WALLS")
layer.color = 3
六、添加文字与标注
msp.add_text(
"Hello, CAD!",
dxfattribs={
'insert': (10, 20),
'height': 2.5,
'layer': 'ANNOTATION'
}
)
msp.add_mtext("这是\n多行文本", dxfattribs={'insert': (10, 30), 'char_height': 2})
七、使用块(Blocks)提高复用性
块类似于'模板',适合重复图形(如门窗符号、设备图标):
block = doc.blocks.new(name='DOOR')
block.add_line((0, 0), (0, 2))
block.add_arc(center=(0, 0), radius=2, start_angle=0, end_angle=90)
msp.add_blockref(
name='DOOR',
insert=(5, 5),
dxfattribs={'xscale': 1, 'yscale': 1, 'rotation': 0}
)
八、实用技巧与注意事项
1. 版本兼容性
- 使用
ezdxf.new(dxfversion='R12') 可生成更老的 DXF 版本(兼容性更好)。
- 但 R12 不支持某些高级实体(如 LWPOLYLINE),建议优先使用 R2000 或 R2010。
2. 坐标系统
- DXF 使用笛卡尔坐标系(X 向右,Y 向上),与屏幕坐标一致。
- 所有坐标均为
(x, y) 或 (x, y, z) 元组。
3. 性能优化
- 处理大型 DXF 文件时,避免频繁调用
save(),应在最后一次性保存。
- 可使用
doc.entitydb.purge() 清理未引用的实体(谨慎使用)。
4. 可视化调试(可选)
虽然 ezdxf 本身不提供绘图功能,但可结合 matplotlib 快速预览:
import matplotlib.pyplot as plt
from ezdxf.addons.drawing import RenderContext, Frontend
from ezdxf.addons.drawing.matplotlib import MatplotlibBackend
doc = ezdxf.readfile("example.dxf")
msp = doc.modelspace()
fig = plt.figure()
ax = fig.add_axes([0, 0, 1, 1])
ctx = RenderContext(doc)
out = MatplotlibBackend(ax)
Frontend(ctx, out).draw_layout(msp)
plt.show()
需安装 matplotlib 和 ezdxf[draw](pip install ezdxf[draw])。
九、典型应用场景
- 自动化出图:根据数据库生成标准 CAD 图纸。
- BIM 数据提取:从建筑模型导出的 DXF 中解析墙体、门窗位置。
- 激光切割/数控编程:生成符合设备要求的 DXF 路径。
- GIS 数据转换:将 Shapefile 或 GeoJSON 转为 DXF 供 CAD 使用。
结语
ezdxf 以简洁的 API 和强大的功能,让 Python 成为处理 DXF 文件的高效工具。无论你是工程师、开发者还是科研人员,只要涉及 CAD 数据自动化,ezdxf 都值得纳入你的技术栈。
微信扫一扫,关注极客日志
微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
相关免费在线工具
- curl 转代码
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
- Base64 字符串编码/解码
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
- Base64 文件转换器
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
- Markdown转HTML
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online
- HTML转Markdown
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online
- JSON 压缩
通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online