天天看點

利用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\n")
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(, )
p2 = APoint(, )
for i in range():
    text = acad.model.AddText(u'Hi %s!' % i, p1, )
    acad.model.AddLine(p1, p2)
    acad.model.AddCircle(p1, )
    p1.y += 
           

    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(, )

def recur(p, step, layer):
    if layer == :
        return
    p2 = next_p(p, layer, step)
    acad.model.AddLine(p, p2)
    layer += 
    step += 
    print step
    recur(p2, step, layer)

def next_p(p, i, step):
    x = p.x
    y = p.y
    if i %  == :
        x += step
    elif i %  == :
        y += step
    elif i %  == :
        x -= step
    elif i %  == :
        y -= step
    return APoint(x, y)
if __name__ == '__main__':
    recur(p, , )
           

     畫出來是這個樣子的,還是挺好玩的

利用python控制Autocad:pyautocad

四、周遊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(,), APoint(,))
#( 原點,相對原點的位置)
           

    用這行代碼就可以将所有的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等等)

藏點東西

822811233