利用python控制Autocad:pyautocad方式
Posted bobin123
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了利用python控制Autocad:pyautocad方式相关的知识,希望对你有一定的参考价值。
发现pyautocad模块:可以用python控制autocad的包。今天把文档中的重点内容摘录出来,以后绘图、计算大工程量、或者识别施工图的时候时候也许可以用到。
一、连接cad
pyautocad包可以用任何版本的cad进行操作,实际上接口都是一样的。文档中首先给出连接cad的代码:
from pyautocad import Autocad, APoint acad = Autocad(create_if_not_exists=True) acad.prompt("Hello, Autocad from Python
") print acad.doc.Name
第一行:自动连接上cad,只要cad是开着的,就创建了一个<pyautocad.api.Autocad> 对象。这个对象连接最近打开的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, APoint acad = 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)
画出来是这个样子的,还是挺好玩的
四、遍历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下的属性和方法:
# 属性/方法 第一种形式(可以直接调用) AddRef Application ArrayPolar ArrayRectangular AttachmentPoint BackgroundFill Copy Database Delete Document DrawingDirection EntityName EntityTransparency EntityType Erase FieldCode GetBoundingBox GetExtensionDictionary GetIDsOfNames GetTypeInfo GetTypeInfoCount GetXData Handle HasExtensionDictionary Height Highlight Hyperlinks InsertionPoint IntersectWith Invoke Layer LineSpacingDistance LineSpacingFactor LineSpacingStyle Linetype LinetypeScale Lineweight Material Mirror Mirror3D Move Normal ObjectID ObjectID32 ObjectName OwnerID OwnerID32 PlotStyleName QueryInterface Release Rotate Rotate3D Rotation ScaleEntity SetXData StyleName TextString TransformBy TrueColor Update Visible Width # 属性/方法 第二种形式 _AddRef _GetIDsOfNames _GetTypeInfo _IAcadEntity__com_ArrayPolar _IAcadEntity__com_ArrayRectangular _IAcadEntity__com_Copy _IAcadEntity__com_GetBoundingBox _IAcadEntity__com_Highlight _IAcadEntity__com_IntersectWith _IAcadEntity__com_Mirror _IAcadEntity__com_Mirror3D _IAcadEntity__com_Move _IAcadEntity__com_Rotate _IAcadEntity__com_Rotate3D _IAcadEntity__com_ScaleEntity _IAcadEntity__com_TransformBy _IAcadEntity__com_Update _IAcadEntity__com__get_EntityName _IAcadEntity__com__get_EntityTransparency _IAcadEntity__com__get_EntityType _IAcadEntity__com__get_Hyperlinks _IAcadEntity__com__get_Layer _IAcadEntity__com__get_Linetype _IAcadEntity__com__get_LinetypeScale _IAcadEntity__com__get_Lineweight _IAcadEntity__com__get_Material _IAcadEntity__com__get_PlotStyleName _IAcadEntity__com__get_TrueColor _IAcadEntity__com__get_Visible _IAcadEntity__com__get_color _IAcadEntity__com__set_EntityTransparency _IAcadEntity__com__set_Layer _IAcadEntity__com__set_Linetype _IAcadEntity__com__set_LinetypeScale _IAcadEntity__com__set_Lineweight _IAcadEntity__com__set_Material _IAcadEntity__com__set_PlotStyleName _IAcadEntity__com__set_TrueColor _IAcadEntity__com__set_Visible _IAcadEntity__com__set_color _IAcadMText__com_FieldCode _IAcadMText__com__get_AttachmentPoint _IAcadMText__com__get_BackgroundFill _IAcadMText__com__get_DrawingDirection _IAcadMText__com__get_Height _IAcadMText__com__get_InsertionPoint _IAcadMText__com__get_LineSpacingDistance _IAcadMText__com__get_LineSpacingFactor _IAcadMText__com__get_LineSpacingStyle _IAcadMText__com__get_Normal _IAcadMText__com__get_Rotation _IAcadMText__com__get_StyleName _IAcadMText__com__get_TextString _IAcadMText__com__get_Width _IAcadMText__com__set_AttachmentPoint _IAcadMText__com__set_BackgroundFill _IAcadMText__com__set_DrawingDirection _IAcadMText__com__set_Height _IAcadMText__com__set_InsertionPoint _IAcadMText__com__set_LineSpacingDistance _IAcadMText__com__set_LineSpacingFactor _IAcadMText__com__set_LineSpacingStyle _IAcadMText__com__set_Normal _IAcadMText__com__set_Rotation _IAcadMText__com__set_StyleName _IAcadMText__com__set_TextString _IAcadMText__com__set_Width _IAcadObject__com_Delete _IAcadObject__com_Erase _IAcadObject__com_GetExtensionDictionary _IAcadObject__com_GetXData _IAcadObject__com_SetXData _IAcadObject__com__get_Application _IAcadObject__com__get_Database _IAcadObject__com__get_Document _IAcadObject__com__get_Handle _IAcadObject__com__get_HasExtensionDictionary _IAcadObject__com__get_ObjectID _IAcadObject__com__get_ObjectID32 _IAcadObject__com__get_ObjectName _IAcadObject__com__get_OwnerID _IAcadObject__com__get_OwnerID32 _IDispatch__com_GetIDsOfNames _IDispatch__com_GetTypeInfo _IDispatch__com_GetTypeInfoCount _IDispatch__com_Invoke _IUnknown__com_AddRef _IUnknown__com_QueryInterface _IUnknown__com_Release _Invoke _QueryInterface _Release __class__ __cmp__ __com_interface__ __ctypes_from_outparam__ __del__ __delattr__ __dict__ __doc__ __eq__ __format__ __getattr__ __getattribute__ __hash__ __init__ __map_case__ __metaclass__ __module__ __new__ __nonzero__ __reduce__ __reduce_ex__ __repr__ __setattr__ __setstate__ __sizeof__ __str__ __subclasshook__ __weakref__ _b_base_ _b_needsfree_ _case_insensitive_ _compointer_base__get_value _idlflags_ _iid_ _invoke _methods_ _needs_com_addref_ _objects _type_ color from_param value
这些cad图元的属性和方法是分明存在的,但是应该怎么才能get或者set这些属性呢?
可以看到形如“_IAcadMText__com__set_Width”的私有属性(现在我也不知道这些属性能够怎么利用,也许这个是句柄??不懂)。但是所有这些属性中,可以直接调用的方法中大部分(在代码区里的第一类公有属性中)是可以与之匹配的。
这些公有属性应该是可以调用的,下面是一些例子:
1、调用move方法(set)
text.move(APoint(0,0), APoint(100,100)) #( 原点,相对原点的位置)
用这行代码就可以将所有的text对象向右、向上平移100个单位
2、访问layer属性(setter、getter)
print text.layer # 0
就提取出了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等等)
以上这篇利用python控制Autocad:pyautocad方式就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。
以上是关于利用python控制Autocad:pyautocad方式的主要内容,如果未能解决你的问题,请参考以下文章
python 利用subprocess调用cmd命令程序,并正确输出控制台的输出中文
有啥函数或者库是用于:利用python来控制其他exe软件,实现自动处理的?
Python3 利用POP3与smtplib进行计算机远程控制