使用Python讀取AutoCAD DXF文檔
作為《使用Python創建AutoCAD DXF文檔》的姊妹篇,本文介紹用Python讀取DXF
==================================================================================================================================================================================================================
1. 老規矩
pip install dxfgrabbern
2.獲取圖層
首先用AutoCAD畫一個圖,然後導出為DXF格式。
這個圖有兩個圖層,圖層0和自定義的Mylayer。圖層0有一些線段,圖層Mylayer有一個圓和一個圓弧。dxfgrabber可以讀取多個版本的DXF,這裡,把這個工程保存為R12 DXF,起名為『mydraw.dxf』
import dxfgrabbernndxf = dxfgrabber.readfile("mydraw.dxf")nfor layer in dxf.layers:n print(layer.name,layer.color,layer.linetype)n
得到輸出為
(u0, 7, uCONTINUOUS)n(uMYLAYER, 5, uCONTINUOUS)n
3.獲取圖形
在DXF中,所有的圖形(Entity)都『打散』在dxf文件中,而不是與圖層間形成層級關係。圖形所在的層是通過圖形的layer屬性得到的。
import dxfgrabbernndxf = dxfgrabber.readfile("mydraw.dxf")nfor e in dxf.entities:n print(e.dxftype,e.layer)n if e.dxftype == LINE:n print (e.start,e.end)n if e.dxftype == CIRCLE:n print (e.center,e.radius)n if e.dxftype == ARC:n print (e.center,e.radius,e.start_angle,e.end_angle) n
對於線的端點、圓心之類的屬性,點坐標均為三維的(x,y,z)形式。上述程序的輸出為:
(uLINE, u0)n((0.0, 500.0, 0.0), (700.0, 500.0, 0.0))n(uLINE, u0)n((700.0, 500.0, 0.0), (1000.0, 0.0, 0.0))n(uLINE, u0)n((1000.0, 0.0, 0.0), (0.0, 250.0, 0.0))n(uLINE, u0)n((0.0, 250.0, 0.0), (0.0, 500.0, 0.0))n(uCIRCLE, uMYLAYER)n((1500.0, 800.0, 0.0), 450.0)n(uARC, uMYLAYER)n((3450.0, 700.0, 0.0), 750.0, 180.0, 42.0)n
4. 獲取圖塊
下面在AutoCAD里創建一個圖塊,並插入2個圖塊。由於定義的圖形也轉換成了圖塊,所以現在應該有3個圖塊。
import dxfgrabbernndxf = dxfgrabber.readfile("mydraw.dxf")nfor e in dxf.entities:n print(e.dxftype,e.name,e.insert)n
運行結果
(uINSERT, uMYBLOCK, (0.0, 0.0, 0.0))n(uINSERT, uMYBLOCK, (2000.0, 0.0, 0.0))n(uINSERT, uMYBLOCK, (3000.0, 0.0, 0.0))n
用以下方法得到所有的block:
import dxfgrabbernndxf = dxfgrabber.readfile("mydraw.dxf")nfor b in dxf.blocks:n print(b.name)n
對於每一個block對象,可以直接用枚舉的方法得到其包含的圖形:
import dxfgrabbernndxf = dxfgrabber.readfile("mydraw.dxf")nmyblock = dxf.blocks[MYBLOCK]nfor e in b:n print (e.dxftype)n
得到
CIRCLEnPOLYLINEn
5. 總結
dxfgrabber的功能很強大,但是由於1. DXF是純文本格式 2. dxfgrabber是純Python實現的,故在讀取大型設計的時候,可能力不從心。在這種情況下,可以考慮使用Python的COM介面。
推薦閱讀: