基于PythonAutoCADActiveX⼆次开发,pyautocad应⽤技术AutoCAD应⽤程序开发系列
基于Python AutoCAD ActiveX ⼆次开发技术
主要库:pyautocad==0.2.0
内容#:基于Python AutoCAD ActiveX ⼆次开发,学习笔记
更新⽇期:2019-11-07
写在前⾯,先感谢
上述两篇⽂章点醒,于我开了⼀扇新世界的⼤门。
笔者作为⼀个传输设计⾏业从业⼈员,需⼤量⽤到AUTOCAD,然⽽Pyautocad库所提供的实例较少,⽆法满⾜⼯程设计⾃动化、信息化要求。注:本⽂⼤量实例参考来源为VBA + AutoCADActiveX。
遇到问题,便要解决问题。主要参考⽂件如下:
1、AutoCADActiveX和VBA.pdf
2、AutoCADActiveX和VBA参考明经翻译版).chm # 注该⽂档为国内明经论坛基于acadauto.chm翻译详解版
3、acadauto.chm
4、acad_aag.chm
5、AutoCADActiveX⼆次开发技术.pdf
经查阅相应⽂献,重现了《AutoCADActiveX⼆次开发技术》⼀书内的所有案例、要点。
前⾔
⽬录:
第⼀章:Autocad的概述——略
第⼆章:AutoCAD ActiveX Automation概述
1、什么是AutoCAD ActiveX
2、AutoCAD ActiveX Automation的基础
3、AutoCAD ActiveX Automation的开发技术基础
3.1、Application 对象
3.2、Document对象
3.3、Collection 对象
3.4、图形对象和⾮图形对象
3.5 、Preferences、Plot 和Utility对象
4、访问对象层次
直接引⽤对象:
if __name__ == '__main__':
acad = Autocad ( create_if_not_exists=False )
acad.prompt ( "Hello! AutoCAD from pyautocad." )
acaddoc = acad.ActiveDocument  # ⽂档
acadapp = acad.ActiveDocument.Application  # 应⽤程序
# del #图形空间⽅法2
acadmod = acad.ActiveDocument.ModelSpace  # 图形空间⽅法1    acadpaper = acad.ActiveDocument.PaperSpace  # 图纸空间
#注:简写对象
如图:
5、集合对象操作
< #重新⽣成模型U
acadapp.Update#更新模型不可⽤why
5.1、新建图层并添加
layer1 = acaddoc.Layers.Add("MyNewLayer")
5.2、在集合中查对象
layer1 = acaddoc.Layers.Add("MyNewLayer")
print(unt)
for i in range(unt):
print(acaddoc.Layers.Item(i).Name)
返回值:0,MyNewLayer
5.3、查图层为“ABC“的对象
try:
layerabc = acaddoc.Layers.Item ( "ABC" )
except :
print("未到%s该图层"%"ABC")
返回值:未到ABC该图层
5.4、删除图层中的对象
# 删除图层内的对象
try:
layerabc = acaddoc.Layers.Item ( "MyNewLayer" )
layerabc.Delete
except :
print("未到%s该图层"%"MyNewLayer")
6、属性、⽅法和变量
# 定义数组,画曲线
point1 = APoint ( 0.5, 0.5 )
point2 = APoint ( 0.5, 0.5 )
Pnt1 = APoint ( 1, 1 )
Pnt2 = APoint ( 5, 5 )
Pnt3 = APoint ( 10, 0 )
SplinePnts = np.array ( [Pnt1, Pnt2, Pnt3] )
print ( SplinePnts )  # 返回数列列表
# list_1 = [[1, 2], [3, 4, 5], [6, 7], [8], [9]] 取出列表嵌套
# list_2 = sum ( list_1, [] )
# print ( list_2 )
SplinePnts = shape ( 1, SplinePnts.shape[0] * SplinePnts.shape[1] )[0]
print ( SplinePnts )  # 返回数列数列取出嵌套
SplinePnts = aDouble ( SplinePnts )
print ( SplinePnts )  # 返回值 array('d', [1.0, 1.0, 0.0, 5.0, 5.0, 0.0, 10.0, 0.0, 0.0]) 注:activex认可的列表类型startTan = APoint ( 1, -10 )
endTan = APoint ( 1, -5 )
SplineObj = acadmod.AddSpline ( SplinePnts, point1, point2 )
如图:
6.1、计算两点之间的距离
# 在cad内取两点,并计算出两闪之间的距离
point0 = APoint ( 1, 1 )
point1 = acaduti.GetPoint ( point0, "请选取第⼀个点" )  # point0 为基点,格式需要,如果不定义point0则⽆法输出后续提⽰⽂本point2 = acaduti.GetPoint ( APoint ( point1 ), "请选取第⼆个点" )
print ( point1, point2 )  # 返回 (27.52961261004657, 2.076389051527485, 0.0) (42.26598855138491, 15.752497838362387, 0.0) # 计算两点之间的距离
x = point1[0] - point2[0]
y = point1[1] - point2[1]
z = point1[2] - point2[2]
dist = (((x ** 2 + y ** 2) ** 0.5) ** 2 + z ** 2) ** 0.5
print ( dist ) # 返回9.999 注:注意取⼩数
6.2、代码转换,连接CAD(略)
6.3、Polyline多段线
# Polyline 多段线
plinepnts = [3, 0, 8, 0, 11, 4, 0, 4]
plinepnts = aDouble ( plinepnts )
polylneobj = acadmod.AddLightweightPolyline ( plinepnts )
polylneobj.setBulge ( 2, 0.5 ) # polylneobj.setBulge(index ,value ) 设置圆弧,index 为序号,value为半径
print ( polylneobj )  # 返回9.999 注:注意取⼩数
# """
如图
6.4、Text ⽂本
# Text ⽂本
Textstr = "CC我的果冻"
Texth = 2.5
Textpoint = APoint ( 10, 10 )
textobj = acadmod.AddText ( Textstr, Textpoint, Texth )
print ( textobj )  #
如图(略)
6.5、产⽣⼀个三维对象(略)Sphere
obj = acadmod.AddSphere(center,radius)
6.6、统计⽂本,含MText及Text
# 统计⽂本,含MText及Text
print ( acadmod.Count )
s = 0
for i in range ( acadmod.Count ):
if acadmod.Item ( i ).EntityName == "AcDbText" or acadmod.Item ( i ).EntityName == "AcDbMText":
print ( acadmod.Item ( i ).textString ) #获取text及Mtext⽂本内容⽅法为.textString
s += 1 #递增
print ( s )  #
python 定义数组6.7、取得最后⼀个实体对象,并删除
# 取得最后⼀个实体对象,并删除
obj= acadmod.Item ( acadmod.Count-1 )
obj.Delete()
6.8、通过点击画直线
# 通过点击画直线
point0 = APoint ( 1, 1 )
point1 = acaduti.GetPoint ( point0, "请选取第⼀个点" )  # point0 为基点,格式需要,如果不定义point0则⽆法输出后续提⽰⽂本
point2 = acaduti.GetPoint ( APoint ( point1 ), "请选取第⼆个点" )
print ( point1, point2 )
lineobj = acadmod.AddLine ( APoint ( point1 ), APoint ( point2 ) ) #注,通过取得的集合,要转换成cad点位才可能正常使⽤
# """
6.9、输⼊关键字
# 输⼊关键字
acaduti.InitializeUserInput ( 128, "Triangle Rectangle Circle" ) #注:可接受关键字的⽤户输⼊⽅法有: GetKeyword, GetInteger, GetReal, GetDistance, # GetAngle, GetOrientation, GetPoint, 和 GetCorner定义输⼊的内容类别,具体参考见列表
str2 = acaduti.GetKeyword ( "请在CAD内输⼊关键字" )
print ( str2 ) #取出关键字
6.10、取得选择集
# 取得选择集
try:
acaddoc.SelectionSets.Item ( "SS1" ).Delete #注:新建选择集⽆法重名,必需删前⼀个
except:
ssget1 = acaddoc.SelectionSets.Add("SS1")
ssget1.SelectOnScreen()
print(ssget1)