標籤:

使用Python創建AutoCAD DXF文檔

儘管AutoCAD有良好的二次開發特性,但Python的愛好者們還是將觸角伸向了它。===========================================================================================================================================================================================================================================================================================================================================================

1. DXF格式文檔

AutoCAD所使用的默認文檔格式為DWG,這是一種AutoCAD私有的文件格式。早在上個世紀末,DWG就已經遭到破解,據說Visio公司(尚未被微軟收購)也在裡面起了神秘的作用。經過多年撕逼,AutoCAD的競爭者們組建了大托拉斯,推出了可讀寫DWG格式的開發庫(Teigha)。然而,Teigha也是個商業軟體,不給保護費只能用倆月。

好在AutoCAD同時推出了開放格式的DXF,儘管功能有所縮減,但基本的圖層圖塊繪圖等功能還都一應俱全。我們今天就介紹如何用Python創建DXF。

2. 安裝dxfwrite

老規矩:

pip install dxfwrite

3. Hello CAD

將以下代碼保存並執行:

from dxfwrite import DXFEngine as dxfdrawing = dxf.drawing(hello.dxf)drawing.add(dxf.text(Hello CAD!))drawing.save()

運行後會在當前目錄產生hello.dxf,用AutoCAD打開:

4. 繪製形狀

繪製形狀前,要創建一個Drawing對象,並綁定DXF的文件名。可以使用DXFEngine的line、circle、polyline等方法創建線條、圓形和多邊形。創建完成後,用Drawing對象的add方法將形狀實體添加到繪圖裡。最後,調用Drawing對象的save方法將DXF文件保存起來。

代碼示例:

from dxfwrite import DXFEngine as dxfimport mathdrawing = dxf.drawing(shapes.dxf)drawing.add(dxf.circle(radius=50, center=(0,0)))drawing.add( dxf.polyline( points=[(30,40),(30,-40),(-30,-40),(-30,40),(30,40)] ))for i in range(20): a = 18.0 * i / 180.0 * math.pi drawing.add( dxf.line( start=(0,0,100), end=(50*math.cos(a),50*math.sin(a),0) ) )for i in range(5): a = 18.0 * i / 180.0 * math.pi nexta = 18.0 * (i + 1) / 180.0 * math.pi pface = dxf.polyface() pface.add_face( [ (0,0,100), (50*math.cos(a),50*math.sin(a)), (50*math.cos(nexta),50*math.sin(nexta)), ], color = 3 ) drawing.add(pface)drawing.save()

得到DXF:

注意幾點:

  • 凡是點,總是以一個2維或者3維Tuple表示。如果是2維Tuple (x,y),則代表點【x,y,0】,若是3維Tuple (x,y,z),則代表點【x,y,z】。
  • 繪製多邊形時,要採用點序列。如果想要閉合的多邊形,這個點序列也應該是閉合的。
  • 繪製多變形面時,先創建一個polyface對象,然後用其add_face方法為它『貼』上表面,最後,把polyface對象加入到繪圖裡。

5. 管理圖層

默認的情況下,繪圖都會被繪製在0層上,這不是一個很好的習慣。

使用Drawing對象的add_layer方法添加一個圖層。記住圖層的名字,在創建各種形狀時,通過其layer屬性設定其所屬的圖層。

給形狀設定屬性時,既可以在構造函數里通過命名參數指定,也可以把創建的形狀當成dict,使用其[]方法設置和獲得。

示例代碼:

from dxfwrite import DXFEngine as dxfdrawing = dxf.drawing(layers.dxf)for i in range(5): drawing.add_layer( LAYER_%d % i, color = i + 1, ) drawing.add( dxf.polyline( points=[ (10*i,10*i), (-10*i,10*i), (-10*i,-10*i), (10*i,-10*i), (10*i,10*i), ], layer=LAYER_%d % i, color = 256, ) )drawing.save()

得到的DXF

我們還注意到有很多紅色的層,這是dxf默認添加的圖層。

6. 創建和使用圖塊

在AutoCAD中我們常常將一些簡單形狀組合起來,形成圖塊,將來反覆調用。dxfwrite提供了一個創建內建圖塊的方法。

創建圖塊的方法是,首先用DXFEngine的block方法創建一個block對象。這個block對象就如同Drawing對象一樣,可以創建圖層、添加形狀等,然後用Drawing.blocks.add方法將這個block對象加入到Drawing中。注意,這裡所有的坐標都在圖塊坐標系之下。

使用圖塊的方法是,用DXFEngine的insert方法創建一個實體(還是用用Drawing的add方法加入到繪圖中),其blockname參數為block的名字,insert參數為對象的位置。這個對象的位置,對應了對象內部(0,0,0)這個點。例如,圖塊內有點P(3,4),圖塊insert的坐標為(1,2),那麼P點在Drawing中的絕對位置為(1+3,2+4) = (4,6)

例子:

from dxfwrite import DXFEngine as dxfdrawing = dxf.drawing(blocks.dxf)block = dxf.block(name=MY_BLOCK)block.add( dxf.polyline(points=[(5,5),(-5,5),(-5,-5),(5,-5),(5,5)]))block.add( dxf.circle(radius=5, center=(0,0)))drawing.blocks.add(block)for i in range(4): block_instance = dxf.insert( blockname=MY_BLOCK, insert=(10 * i, 10) ) drawing.add(block_instance)drawing.save()

得到的DXF

7. 總結

雖然DXF庫的功能有限,但用於創建scratch基本上夠用了。至於其應用,則因為搭上了Python的便車而變得無窮無盡。比如說:

1. 用Python下載戶型圖,然後用圖像識別的方法得到邊框,最後生成DXF(但開發商的戶型圖一般尺寸特別不準)

2. 給Qt的Painting System寫一個後端,用於保存為DXF(看起來靠譜)


推薦閱讀:

那些你知道,或是不知道的AutoCAD小秘密-009:關於字體的那些事
那些你知道,或是不知道的AutoCAD小秘密-011:屬性塊——能改文字的塊

TAG:Python | AutoCAD |