利用python控制Autocad:pyautocad方式
發(fā)現(xiàn)pyautocad模塊:可以用python控制autocad的包。今天把文檔中的重點內(nèi)容摘錄出來,以后繪圖、計算大工程量、或者識別施工圖的時候時候也許可以用到。
一、連接cad
pyautocad包可以用任何版本的cad進(jìn)行操作,實際上接口都是一樣的。文檔中首先給出連接cad的代碼:
from pyautocad import Autocad, APointacad = Autocad(create_if_not_exists=True)acad.prompt('Hello, Autocad from Pythonn')print acad.doc.Name
第一行:自動連接上cad,只要cad是開著的,就創(chuàng)建了一個<pyautocad.api.Autocad> 對象。這個對象連接最近打開的cad文件。
如果此時還沒有打開cad,將會創(chuàng)建一個新的dwg文件,并自動開啟cad軟件(貼心)
第二行:acad.prompt() 用來在cad控制臺中打印文字
第三行:acad.doc.Name儲存著cad最近打開的圖形名
二、ActiveX interface(這個到底是什么東西)
可以利用ActiveX interface,python中儲存的autocad對象中保存了一些可以簡化操作的自動化操作(可以迭代對象、搜索對象等等)
三、用acad.model 對象繪制簡單圖形
acad.model對象是用來在圖形中添加圖元的,先來做一個簡單的功能,在兩點之間畫線,以一個點為圓心畫圓
# 已經(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)中的第一行用于添加一個Text,參數(shù):(u’%s’ % text, x, y)
如果后面不需要操作AddText對象的話,只是實現(xiàn)在cad中創(chuàng)建一個Text并不一定要創(chuàng)建變量,直接調(diào)用acad.model.AddText()方法就可以做到了。
2、acad.model.AddCircle(p1, 10) 畫圓,同理
3、可以嘗試更多的 addXxxx 方法,由于文檔中并沒有寫輸入變量究竟是什么,慢慢嘗試吧
嘗試過可以使用的:addPolyLine(
練練手:
用遞歸程序?qū)懸粋€在cad中畫一個螺旋圖,寫的有點??攏?/p>
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)
畫出來是這個樣子的,還是挺好玩的
四、遍歷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類型,挺方便的吧~
訪問對象的屬性
以下內(nèi)容文檔中貌似沒有寫,探究一下:
用dir(text)可以得出很多text下的屬性和方法:
# 屬性/方法 第一種形式(可以直接調(diào)用)AddRefApplicationArrayPolarArrayRectangularAttachmentPointBackgroundFillCopyDatabaseDeleteDocumentDrawingDirectionEntityNameEntityTransparencyEntityTypeEraseFieldCodeGetBoundingBoxGetExtensionDictionaryGetIDsOfNamesGetTypeInfoGetTypeInfoCountGetXDataHandleHasExtensionDictionaryHeightHighlightHyperlinksInsertionPointIntersectWithInvokeLayerLineSpacingDistanceLineSpacingFactorLineSpacingStyleLinetypeLinetypeScaleLineweightMaterialMirrorMirror3DMoveNormalObjectIDObjectID32ObjectNameOwnerIDOwnerID32PlotStyleNameQueryInterfaceReleaseRotateRotate3DRotationScaleEntitySetXDataStyleNameTextStringTransformByTrueColorUpdateVisibleWidth# 屬性/方法 第二種形式_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_colorfrom_paramvalue
這些cad圖元的屬性和方法是分明存在的,但是應(yīng)該怎么才能get或者set這些屬性呢?
可以看到形如“_IAcadMText__com__set_Width”的私有屬性(現(xiàn)在我也不知道這些屬性能夠怎么利用,也許這個是句柄??不懂)。但是所有這些屬性中,可以直接調(diào)用的方法中大部分(在代碼區(qū)里的第一類公有屬性中)是可以與之匹配的。
這些公有屬性應(yīng)該是可以調(diào)用的,下面是一些例子:
1、調(diào)用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變量復(fù)制的layer名字必須已經(jīng)存在,否則會報錯)
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個元素構(gòu)成第一個坐標(biāo), 3、4個元素構(gòu)成第二個坐標(biāo)
以上操作證明了確實可以通過調(diào)用對象的公有屬性來操作cad中的對象,但是麻煩的是,由于這些方法都是ctype的,dir()這些方法無法得知具體應(yīng)該輸入那些參數(shù)和參數(shù)的類型,有待解決…
如果實在沒有找到這些方法的文檔說明,就只好一個一個試出來使用方法了
(補充:help(obj) 可以得到一些信息,但是好像還是沒有參數(shù)類型信息。只能得到哪些obj的屬性可以set,哪些可以get等等)
以上這篇利用python控制Autocad:pyautocad方式就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持好吧啦網(wǎng)。
相關(guān)文章:
