您好,登錄后才能下訂單哦!
這篇文章主要講解了如何python控制Autocad:pyautocad,內(nèi)容清晰明了,對(duì)此有興趣的小伙伴可以學(xué)習(xí)一下,相信大家閱讀完之后會(huì)有幫助。
發(fā)現(xiàn)pyautocad模塊:可以用python控制autocad的包。今天把文檔中的重點(diǎn)內(nèi)容摘錄出來(lái),以后繪圖、計(jì)算大工程量、或者識(shí)別施工圖的時(shí)候時(shí)候也許可以用到。
一、連接cad
pyautocad包可以用任何版本的cad進(jìn)行操作,實(shí)際上接口都是一樣的。文檔中首先給出連接cad的代碼:
from pyautocad import Autocad, APoint acad = Autocad(create_if_not_exists=True) acad.prompt("Hello, Autocad from Python\n") print acad.doc.Name
第一行:自動(dòng)連接上cad,只要cad是開(kāi)著的,就創(chuàng)建了一個(gè)<pyautocad.api.Autocad> 對(duì)象。這個(gè)對(duì)象連接最近打開(kāi)的cad文件。
如果此時(shí)還沒(méi)有打開(kāi)cad,將會(huì)創(chuàng)建一個(gè)新的dwg文件,并自動(dòng)開(kāi)啟cad軟件(貼心)
第二行:acad.prompt() 用來(lái)在cad控制臺(tái)中打印文字
第三行:acad.doc.Name儲(chǔ)存著cad最近打開(kāi)的圖形名
二、ActiveX interface(這個(gè)到底是什么東西)
可以利用ActiveX interface,python中儲(chǔ)存的autocad對(duì)象中保存了一些可以簡(jiǎn)化操作的自動(dòng)化操作(可以迭代對(duì)象、搜索對(duì)象等等)
三、用acad.model 對(duì)象繪制簡(jiǎn)單圖形
acad.model對(duì)象是用來(lái)在圖形中添加圖元的,先來(lái)做一個(gè)簡(jiǎn)單的功能,在兩點(diǎn)之間畫(huà)線,以一個(gè)點(diǎn)為圓心畫(huà)圓
# 已經(jīng)導(dǎo)入 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、循環(huán)中的第一行用于添加一個(gè)Text,參數(shù):(u'%s' % text, x, y)
如果后面不需要操作AddText對(duì)象的話,只是實(shí)現(xiàn)在cad中創(chuàng)建一個(gè)Text并不一定要?jiǎng)?chuàng)建變量,直接調(diào)用acad.model.AddText()方法就可以做到了。
2、acad.model.AddCircle(p1, 10) 畫(huà)圓,同理
3、可以嘗試更多的 addXxxx 方法,由于文檔中并沒(méi)有寫(xiě)輸入變量究竟是什么,慢慢嘗試吧
嘗試過(guò)可以使用的:addPolyLine(
練練手:
用遞歸程序?qū)懸粋€(gè)在cad中畫(huà)一個(gè)螺旋圖,寫(xiě)的有點(diǎn)啰嗦,
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)
畫(huà)出來(lái)是這個(gè)樣子的,還是挺好玩的
四、遍歷cad圖形對(duì)象以及訪問(wèn)/修改對(duì)象屬性
基本的遍歷圖形中所有圖元的方法:
for obj in acad.iter_objects(): print obj.ObjectName # ObjectName 可以打印出對(duì)象的類型
想要按類型查找出所有某種圖元(如所有Text對(duì)象):
for text in acad.iter_objects('Text'): print text.TextString, text.InsertionPoint
或者也可以在類型選擇時(shí)填入多種類型,如:
for obj in acad.iter_objects(['Text', 'Line']): print obj.ObjectName
pyautocad還提供了一個(gè)比較
*文檔中特地說(shuō)明:按照類型查找可以混淆大小寫(xiě),也可以只輸入類型的一部分,比如查找”te”類型就可以自動(dòng)匹配到text類型,輸入”li“就自動(dòng)匹配到Ellipse和Line類型,挺方便的吧~
訪問(wèn)對(duì)象的屬性
以下內(nèi)容文檔中貌似沒(méi)有寫(xiě),探究一下:
用dir(text)可以得出很多text下的屬性和方法:
# 屬性/方法 第一種形式(可以直接調(diào)用) 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圖元的屬性和方法是分明存在的,但是應(yīng)該怎么才能get或者set這些屬性呢?
可以看到形如“_IAcadMText__com__set_Width”的私有屬性(現(xiàn)在我也不知道這些屬性能夠怎么利用,也許這個(gè)是句柄??不懂)。但是所有這些屬性中,可以直接調(diào)用的方法中大部分(在代碼區(qū)里的第一類公有屬性中)是可以與之匹配的。
這些公有屬性應(yīng)該是可以調(diào)用的,下面是一些例子:
1、調(diào)用move方法(set)
text.move(APoint(0,0), APoint(100,100)) #( 原點(diǎn),相對(duì)原點(diǎn)的位置)
用這行代碼就可以將所有的text對(duì)象向右、向上平移100個(gè)單位
2、訪問(wèn)layer屬性(setter、getter)
print text.layer # 0
就提取出了text.layer的值,如果想要改變text對(duì)象的layer,直接賦值即可(給layer變量復(fù)制的layer名字必須已經(jīng)存在,否則會(huì)報(bào)錯(cuò))
text.layer = "new layer" print text.layer # new layer
3、提取PolyLine的各個(gè)頂點(diǎn)(很有用)
# 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個(gè)元素構(gòu)成第一個(gè)坐標(biāo), 3、4個(gè)元素構(gòu)成第二個(gè)坐標(biāo)
以上操作證明了確實(shí)可以通過(guò)調(diào)用對(duì)象的公有屬性來(lái)操作cad中的對(duì)象,但是麻煩的是,由于這些方法都是ctype的,dir()這些方法無(wú)法得知具體應(yīng)該輸入那些參數(shù)和參數(shù)的類型,有待解決…
如果實(shí)在沒(méi)有找到這些方法的文檔說(shuō)明,就只好一個(gè)一個(gè)試出來(lái)使用方法了
(補(bǔ)充:help(obj) 可以得到一些信息,但是好像還是沒(méi)有參數(shù)類型信息。只能得到哪些obj的屬性可以set,哪些可以get等等)
看完上述內(nèi)容,是不是對(duì)如何python控制Autocad:pyautocad有進(jìn)一步的了解,如果還想學(xué)習(xí)更多內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。