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 dxf drawing = 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 dxf import math drawing = 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=(50math.cos(a),50math.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), (50math.cos(a),50math.sin(a)), (50math.cos(nexta),50math.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对象的addlayer方法添加一个图层。记住图层的名字,在创建各种形状时,通过其layer属性设定其所属的图层。
给形状设定属性时,既可以在构造函数里通过命名参数指定,也可以把创建的形状当成dict,使用其[]方法设置和获得。
示例代码:
from dxfwrite import DXFEngine as dxf drawing = dxf.drawing(‘layers.dxf’) for i in range(5): drawing.add_layer( ‘LAYER{9712d1b0ae091f3a4a596b93bd6b9ff479ef0818eaa8cb96fef39cc945859a28}d’ {9712d1b0ae091f3a4a596b93bd6b9ff479ef0818eaa8cb96fef39cc945859a28} i, color = i + 1, ) drawing.add( dxf.polyline( points=[ (10i,10i), (-10i,10i), (-10i,-10i), (10i,-10i), (10i,10i), ], layer=’LAYER_{9712d1b0ae091f3a4a596b93bd6b9ff479ef0818eaa8cb96fef39cc945859a28}d’ {9712d1b0ae091f3a4a596b93bd6b9ff479ef0818eaa8cb96fef39cc945859a28} 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 dxf drawing = 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的便车而变得无穷无尽。比如说:
-
用Python下载户型图,然后用图像识别的方法得到边框,最后生成DXF(但开发商的户型图一般尺寸特别不准)
-
给Qt的Painting System写一个后端,用于保存为DXF(看起来靠谱)