发现pyautocad模块:可以用python控制autocad的包。今天把文档中的重点内容摘录出来,以后绘图、计算大工程量、或者识别施工图的时候时候也许可以用到。 一、连接cad pyautocad包可以用任何版本的cad进行操作,实际上接口都是一样的。文档中首先给出连接cad的代码: from pyautocad import Autocad, APointacad = Autocad(create_if_not_exists=True)acad.prompt('Hello, Autocad from Python\n')print acad.doc.Name 第一行:自动连接上cad,只要cad是开着的,就创建了一个 对象。这个对象连接最近打开的cad文件。 如果此时还没有打开cad,将会创建一个新的dwg文件,并自动开启cad软件(贴心) 第二行:acad.prompt() 用来在cad控制台中打印文字 第三行:acad.doc.Name储存着cad最近打开的图形名二、ActiveX interface(这个到底是什么东西) 可以利用ActiveX interface,python中储存的autocad对象中保存了一些可以简化操作的自动化操作(可以迭代对象、搜索对象等等) 三、用acad.model 对象绘制简单图形 acad.model对象是用来在图形中添加图元的,先来做一个简单的功能,在两点之间画线,以一个点为圆心画圆 # 已经导入 APoint 类p1 = APoint(0, 0)p2 = APoint(50, 25)for i in range(5): text = acad.model.AddText(u'Hi %s!' % i, p1, 2.5) acad.model.AddLine(p1, p2) acad.model.AddCircle(p1, 10) p1.y += 10 1、循环中的第一行用于添加一个Text,参数:(u’%s’ % text, x, y) 如果后面不需要操作AddText对象的话,只是实现在cad中创建一个Text并不一定要创建变量,直接调用acad.model.AddText()方法就可以做到了。 2、acad.model.AddCircle(p1, 10) 画圆,同理 3、可以尝试更多的 addXxxx 方法,由于文档中并没有写输入变量究竟是什么,慢慢尝试吧 尝试过可以使用的:addPolyLine( 练练手: 用递归程序写一个在cad中画一个螺旋图,写的有点啰嗦, from pyautocad import Autocad, APointacad = Autocad(create_if_not_exists = True)p = APoint(5, 0)def recur(p, step, layer): if layer == 50: return p2 = next_p(p, layer, step) acad.model.AddLine(p, p2) layer += 1 step += 5 print step recur(p2, step, layer)def next_p(p, i, step): x = p.x y = p.y if i % 4 == 0: x += step elif i % 4 == 1: y += step elif i % 4 == 2: x -= step elif i % 4 == 3: y -= step return APoint(x, y)if __name__ == '__main__': recur(p, 0, 0) - 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
画出来是这个样子的,还是挺好玩的
四、遍历cad图形对象以及访问/修改对象属性 基本的遍历图形中所有图元的方法: for obj in acad.iter_objects(): print obj.ObjectName # ObjectName 可以打印出对象的类型 想要按类型查找出所有某种图元(如所有Text对象): for text in acad.iter_objects('Text'): print text.TextString, text.InsertionPoint 或者也可以在类型选择时填入多种类型,如: for obj in acad.iter_objects(['Text', 'Line']): print obj.ObjectName pyautocad还提供了一个比较 *文档中特地说明:按照类型查找可以混淆大小写,也可以只输入类型的一部分,比如查找”te”类型就可以自动匹配到text类型,输入”li“就自动匹配到Ellipse和Line类型,挺方便的吧~ 访问对象的属性 以下内容文档中貌似没有写,探究一下: 用dir(text)可以得出很多text下的属性和方法: 这些cad图元的属性和方法是分明存在的,但是应该怎么才能get或者set这些属性呢? 可以看到形如“_IAcadMText__com__set_Width”的私有属性(现在我也不知道这些属性能够怎么利用,也许这个是句柄??不懂)。但是所有这些属性中,可以直接调用的方法中大部分(在代码区里的第一类公有属性中)是可以与之匹配的。 这些公有属性应该是可以调用的,下面是一些例子: 1、调用move方法(set) text.move(APoint(0,0), APoint(100,100))#( 原点,相对原点的位置) 用这行代码就可以将所有的text对象向右、向上平移100个单位 2、访问layer属性(setter、getter) 就提取出了text.layer的值,如果想要改变text对象的layer,直接赋值即可(给layer变量复制的layer名字必须已经存在,否则会报错) text.layer = 'new layer'print text.layer# new layer 3、提取PolyLine的各个顶点(很有用) # for item in acad.iter_objects('PolyLine'): print item.Coordinates'''(-462.01707322354014, 719.8251441314151, 207.17175903027055, 1056.4031530064085, 389.6778054895749, 574.9096117303479, -143.80140284041954, 434.6687742615859, -326.30744929972207, -60.84885181138725, -564.9692056597924, 308.45202158973643, -327.4641724567995, 461.94033545845366, -593.0470534647193, 546.8614421365228, -616.4452718779175, 803.9696476627087)'''# 第1、2个元素构成第一个坐标, 3、4个元素构成第二个坐标 以上操作证明了确实可以通过调用对象的公有属性来操作cad中的对象,但是麻烦的是,由于这些方法都是ctype的,dir()这些方法无法得知具体应该输入那些参数和参数的类型,有待解决… 如果实在没有找到这些方法的文档说明,就只好一个一个试出来使用方法了 (补充:help(obj) 可以得到一些信息,但是好像还是没有参数类型信息。只能得到哪些obj的属性可以set,哪些可以get等等) 藏点东西 822811233
|