標籤:

使用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個圖塊。

作為圖塊插入到繪圖中的圖形,其類型是INSERT。可以通過其name屬性得到其圖塊的名稱,通過其insert屬性得到其位置。

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介面。


推薦閱讀:

爬蟲怎麼解決封IP?
第八章 Python爬蟲實戰(1):爬取Drupal論壇帖子列表
數據科學導論:序章

TAG:Python | AutoCAD |