日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

python控制autocad_利用python控制Autocad:pyautocad方式

發(fā)布時(shí)間:2024/10/6 python 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python控制autocad_利用python控制Autocad:pyautocad方式 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

發(fā)現(xiàn)pyautocad模塊:可以用python控制autocad的包。今天把文檔中的重點(diǎn)內(nè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是開著的,就創(chuàng)建了一個(gè) 對象。這個(gè)對象連接最近打開的cad文件。

如果此時(shí)還沒有打開cad,將會(huì)創(chuàng)建一個(gè)新的dwg文件,并自動(dòng)開啟cad軟件(貼心)

第二行:acad.prompt() 用來在cad控制臺(tái)中打印文字

第三行:acad.doc.Name儲(chǔ)存著cad最近打開的圖形名

二、ActiveX interface(這個(gè)到底是什么東西)

可以利用ActiveX interface,python中儲(chǔ)存的autocad對象中保存了一些可以簡化操作的自動(dòng)化操作(可以迭代對象、搜索對象等等)

三、用acad.model 對象繪制簡單圖形

acad.model對象是用來在圖形中添加圖元的,先來做一個(gè)簡單的功能,在兩點(diǎn)之間畫線,以一個(gè)點(diǎn)為圓心畫圓

# 已經(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對象的話,只是實(shí)現(xiàn)在cad中創(chuàng)建一個(gè)Text并不一定要?jiǎng)?chuàng)建變量,直接調(diào)用acad.model.AddText()方法就可以做到了。

2、acad.model.AddCircle(p1, 10) 畫圓,同理

3、可以嘗試更多的 addXxxx 方法,由于文檔中并沒有寫輸入變量究竟是什么,慢慢嘗試吧

嘗試過可以使用的:addPolyLine(

練練手:

用遞歸程序?qū)懸粋€(gè)在cad中畫一個(gè)螺旋圖,寫的有點(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)

畫出來是這個(gè)樣子的,還是挺好玩的

四、遍歷cad圖形對象以及訪問/修改對象屬性

基本的遍歷圖形中所有圖元的方法:

for obj in acad.iter_objects():

print obj.ObjectName

# ObjectName 可以打印出對象的類型

想要按類型查找出所有某種圖元(如所有Text對象):

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è)比較

*文檔中特地說明:按照類型查找可以混淆大小寫,也可以只輸入類型的一部分,比如查找”te”類型就可以自動(dòng)匹配到text類型,輸入”li“就自動(dòng)匹配到Ellipse和Line類型,挺方便的吧~

訪問對象的屬性

以下內(nèi)容文檔中貌似沒有寫,探究一下:

用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),相對原點(diǎn)的位置)

用這行代碼就可以將所有的text對象向右、向上平移100個(gè)單位

2、訪問layer屬性(setter、getter)

print text.layer # 0

就提取出了text.layer的值,如果想要改變text對象的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í)可以通過調(diào)用對象的公有屬性來操作cad中的對象,但是麻煩的是,由于這些方法都是ctype的,dir()這些方法無法得知具體應(yīng)該輸入那些參數(shù)和參數(shù)的類型,有待解決…

如果實(shí)在沒有找到這些方法的文檔說明,就只好一個(gè)一個(gè)試出來使用方法了

(補(bǔ)充:help(obj) 可以得到一些信息,但是好像還是沒有參數(shù)類型信息。只能得到哪些obj的屬性可以set,哪些可以get等等)

以上這篇利用python控制Autocad:pyautocad方式就是小編分享給大家的全部內(nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持WEB開發(fā)者。

總結(jié)

以上是生活随笔為你收集整理的python控制autocad_利用python控制Autocad:pyautocad方式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。