基于Python AutoCAD ActiveX 二次开发,pyautocad应用技术

AutoCAD应用程序开发系列

基于Python AutoCAD ActiveX 二次开发技术

主要库:pyautocad==0.2.0

 

内容#:基于Python AutoCAD ActiveX 二次开发,学习笔记

 

更新日期:2019-11-07

写在前面,先感谢

https://blog.csdn.net/Hulunbuir/article/details/83715279  # Python pyautocad库 使用简介

https://blog.csdn.net/Tong_T/article/details/83029695 # Python3操作AutoCAD

上述两篇文章点醒,于我开了一扇新世界的大门。

笔者作为一个传输设计行业从业人员,需大量用到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二次开发技术》一书内的所有案例、要点。


版权声明:本文为CSDN博主「qq_44792233」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_44792233/article/details/102946651
论坛QQ群:101190324

 

 

前言

目录:

第一章: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  # 应用程序
    # acadmod=acad.model #图形空间方法2
    acadmod = acad.ActiveDocument.ModelSpace  # 图形空间 方法1
    acadpaper = acad.ActiveDocument.PaperSpace  # 图纸空间
    #注:简写对象

 

如图:

基于Python AutoCAD ActiveX 二次开发,pyautocad应用技术_第1张图片

5、集合对象操作

acaddoc.regen #重新生成模型U
acadapp.Update#更新模型 不可用why

 

5.1、新建图层并添加

layer1 = acaddoc.Layers.Add("MyNewLayer")

 

5.2、在集合中查找对象

layer1 = acaddoc.Layers.Add("MyNewLayer")
print(acaddoc.Layers.count)
for i in range(acaddoc.Layers.count):
    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 = SplinePnts.reshape ( 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 注:注意取小数
# """

 

如图

基于Python AutoCAD ActiveX 二次开发,pyautocad应用技术_第2张图片

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 )  #

 

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)

 

6.11、块处理

# 块处理
point1 = APoint ( 10, 20 )
blockobj = acaddoc.Blocks.Add ( point1, "ci_block_obj" )  # 创建块,名字为"ci_block_obj"
blockobj.AddCircle ( point1, 1 )  # 给块加个圆
xscale, yscale, zscyle = 1.0, 1.0, 1.0
angle1 = 30.0
blockrefobj = acadmod.InsertBlock ( point1, "ci_block_obj",xscale, yscale, zscyle , angle1 ) #插入块

 

6.12、焦点切换(略)

第三章:基础入门(略)

第四章:简单的AutoCADActiveX编程

1、基础编号知识

# """
# 创建剖面线,填充
curlinetype = acaddoc.ActiveLinetype #取当前线型
entline = acaddoc.Linetypes.Add("CENTER") # 从文件"acad.lin"添加线型
try :
    acaddoc.Linetypes.Load ( "CENTER", "acad.lin" )  # 从文件"acad.lin"加载线型
except:
    pass
finally:
    acaddoc.ActiveLinetype = entline
patternName = "ANSI31"
PatternType = 0
assocVar = False
hatchObj = acadmod.AddHatch ( PatternType, patternName, assocVar ) # 定义填充对象
hatchObj.LinetypeScale = 6  #填充比例
hatchObj.PatternScale = 2 # 填充问距
point1 = APoint ( 175, 125, 0 )
outerLoop = acadmod.AddCircle ( point1, 80 ) # 画个圆
hatchObj.AppendOuterLoop ( outerLoop )  # 异常 ,'发生意:对象数组无效', 待解决
hatchObj.Evaluate
acaddoc.Regen ( True )
# """

 

第五章:创建和编辑AutoCAD对象

1、创建二维对象

注:在ActiveX自动操作中只提供一种方法来创建圆,该方法就是使用圆心和半径。

2、创建直线

(1)AddLine:通过两点创建线。

(2)AddLightweightPolyline:通过顶点的列表创建二维细多段线。

# AddLightweightPolyline
points = [2, 4, 4, 2, 6, 4]  # 三个点位 
points = aDouble ( points )  # 转换对cad可识别坐标
obj = acadmod.AddLightweightPolyline ( points )  # 画图

 

(3)AddMLine:创建复线。

(4)AddPolyline:创建二维或三维多段线。

3、创建Pline对象 (略)

4、创建点对象

point1 = APoint ( 40, 40 )
pointObj = acadmod.AddPoint ( point1 )
acaddoc.SetVariable("PDMODE", 34) # PDSIZE用来控制点形状的大小,PDMODE值为0和1时除外。PDSIZE设定为0时,则按5%的屏幕高度生成点。
acaddoc.SetVariable("PDSIZE", 1) #PDSIZE为正值时指定点形状的绝对大小,负值时被理解为视口大小的百分比。

 

5、创建实体填充区域

point1 = APoint ( 40, 40 )
point2 = APoint ( 40, 50 )
point3 = APoint ( 50, 40 )
point4 = APoint ( 50, 40 )
obj = acadmod.AddSolid ( point1, point2, point3,point4 )

 

6、创建面域(略)

7、选择对象

创建命名的选择,使用Add方法。该方法只需要单独一个参数,就是选择集的名称。

用户可通过使用以下的方法添加对象到活动的选择集:

(1)Addltem:添加一个或多个对象到指定的选择集。

(2)Select:选择对象并将其放入活动的选择集中。用户可选择所有对象、矩形窗选区域或矩形框选区域的对象、多边形窗选区域或多边形框选区域的对象、栅选的对象、最近创建的对象、最近选择集的对象。

(3)SelectAtPoint:选择通过给定点的对象并将其放入活动的选择集中。

(4)SelectByPolygon:通过栅选的对象并将其放入活动的选择集中。

(5)SelectOnScreen:提示用户从屏幕中拾取对象并将其添加到活动的选择中。

# 创建选择集
try:
    ssget1 = acaddoc.SelectionSets.Add ( "NewSelectionSet" ) #新增 "NewSelectionSet" 图层
except:
    print(f"该选择集已经存在%s")
    ssget1 = acaddoc.SelectionSets ( "NewSelectionSet" ) # 如果"NewSelectionSet"图层存在删除该图层
    ssget1.Delete

 

# 选择对象,并将每一对象的颜色改为蓝色
try:
    ssget1 = acaddoc.SelectionSets.Add ( "SS1" ) #新增 "NewSelectionSet" 图层
    ssget1.SelectOnScreen
except:
    print(f"该选择集已经存在%s")
    ssget1 = acaddoc.SelectionSets ( "SS1" ) # 如果"SS1"图层存在删除该图层
    ssget1.Clear() # 如果"SS1"图层存在删除该图层
    ssget1.SelectOnScreen() # 在CAD内选择对象

for i in ssget1:
    i.Color = 5 #注:acBlue 无法使用,原因未知,颜色索引号的取值范围为[0,256]
    i.Update

 

附表:

基于Python AutoCAD ActiveX 二次开发,pyautocad应用技术_第3张图片

8、过滤对象

用户可用过滤器列表通过属性限制选择集,如通过颜色或对象类型。例如,可以只复制电路板图形中的红色对象或确定图层中的对象。

注:过滤器只识别直接分配给对象的颜色或线型,而非继承于图层的颜色或线型。

使用过滤器机制,必须提供用于分类的过滤器类型和过滤器数据。过滤器类型是指定使用哪种过滤的代码。AutoCADActiveX自动操作使用DXF组码来指定过滤器类型。

基于Python AutoCAD ActiveX 二次开发,pyautocad应用技术_第4张图片

# 选择所有的文本对象,并将每一对象的颜色改为蓝色
acaddoc.SelectionSets.Item ( "SS1" ).Delete  # 新增 "SS1" 图层
ssget1 = acaddoc.SelectionSets ( "SS1" )  # 如果"SS1"图层存在删除该图层
ssget1.Clear ()  # 如果"SS1"图层存在删除该图层
# ssget1.SelectOnScreen (  )  #  
# ssget1.SelectOnScreen ( 8,"TEXT"  )  #  注: #'参数 FilterType (位于 SelectOnScreen 中) 无效' 原因未知
corner1 = APoint ( 30, 30, 0 )
corner2 = APoint ( 40, 40, 0 )
ssget1.select ( 4 , corner1, corner2 )
# Window  代码0:选择完全在矩形区域内的所有对象,矩形对角由 Point1 和 Point2 定义。
# Crossing 代码1:选择在矩形区域内和与矩形区域相交的对象,矩形对角由 Point1 和 Point2 定义。
# Previous 代码3:选择最近的选择集。如果用户在图纸空间和模型空间之间进行切换并试图使用选择集,该模式将被忽略。
# Last 代码4:选择最近生成的可见对象。
# All 代码5:选择所有对象。

for i in ssget1:
    i.Color = 5  # 注:acBlue 无法 使用,原因未知,颜色索引号的取值范围为[0,256]
    i.Update

 

20191106更新,注:关于FilterType 、FilterData无效原因:

# 调试数组,使其可以在vb环境下使用,注:python 中提供了list窗口,可以当作数组使用。
# 但列表中的元素可以是任何对象,因此列表中保存的是对象的指针,这样一来,为了保存一个简单的列表。就需要三个指针和三个整数对象。
# 这是与VB主意数组区别最大的地方,故需要用Numpy进行转换
# python 喟然也提供了array模块,但其只支持一维数组,不支持多维数组,也没有各种去处函数。因而不适合数值运算。

 

关于python语言comtypes接口传递VARIANT(变体)数据处理方法如下:

# 例:VB内要求语法如下:object.SetXData XDataType, XData 
# XDataType , XData ariant[变体] (短整数数组); 仅用于输入
point1.SetXData ( array.array ( "h", [1001, 1070] ), ['Test_Application1', 600] )
# 例2:VB内要求语法如下:object.SelectOnScreen [FilterType][, FilterData] 
# FilterType----ariant[变体] (短整数数组); 仅用于输入; 可选项指定使用的过滤器类型的 DXF 组码。 
# FilterData----ariant[变体] (短整数数组); 仅用于输入; 可选项过滤器的值。 
ssget1.SelectOnScreen ( array.array ( "h", [0] ), ['Line'] )

 

9、复制对象

# 创建复制对象
point1 = APoint ( 30, 30 )
point2 = APoint ( 40, 30 )
radius1 = 10
radius2 = 5
ciobj1 = acadmod.AddCircle ( point1, radius1 )
ciobj2 = acadmod.AddCircle ( point1, radius2 )
print ( array.array ( 'i', [0, 1, 2, 3, 4, 6, 7, 8, 9, 100] ) )
print ( np.array ( [ciobj1, ciobj2], dtype="O" ) )
obj2 = np.array ( [ciobj1, ciobj2] )
# ciobj1.radius ( 111.1 ) # BUG TypeError: 'float' object is not callable 浮点数无法被传递
# copyobjs = acaddoc.CopyObjects ( obj2 )  # BUG2 对象无法被调整用 AttributeError: module 'numpy.ctypeslib' has no attribute '_typecodes'
# """
# doc1 = GetBestInterface ( acad.Application.Documents.Add () )
circle = acadmod.AddCircle ( APoint ( 0.0, 0.0 ), 1.0 )
obj = acadmod.Item ( acadmod.Count - 1 )  # 取得刚画的矩形
obj.Color = 3  # 改颜色
acaddoc.SendCommand ( "_COPYBASE 0,0\n\r" )
acaddoc.SendCommand ( "_PASTECLIP 0,0\n\r" )
# 简单粗暴的复制

 

10、偏移对象

# """
# 偏移对象:obj.Offset(float)
point1 = APoint ( 30, 30 )
radius1 = 10
ciobj1 = acadmod.AddCircle ( point1, radius1 )
try:
    offsetObj = ciobj1.Offset ( 6 )# BUG传递数据会提示Keyerror但不影响画图。
except KeyError:
    pass
# offsetObj ( 0 ).Color = 1
# """
plpnts = [1, 1, 1, 2, 2, 2, 3, 2, 4, 4, 4, 1]
plpnts = aDouble ( plpnts )
plobj = acadmod.AddLightWeightPolyline ( plpnts )
try:
    offsetObj = plobj.Offset ( 0.8 )  # BUG传递数据会提示Keyerror但不影响画图。
except KeyError:
    pass
# """

 

11、删除对象

# """
ciobj1.delete

 

12、阵列对象

# 阵列对象:obj.ArrayPolar() ,ciobj1.ArrayRectangular
point1 = APoint ( 2, 2 )
radius1 = 1
ciobj1 = acadmod.AddCircle ( point1, radius1 )
# acadapp.ZoomAll()
point2 = APoint ( 10, 10 )
try:
    retObj = ciobj1.ArrayPolar ( 36, 2, point2 )  # 圆型阵列
except:
    pass
# ciobj1.ArrayRectangular ( numberOfRows, numberOfColumns, numberOfLevels, distanceBwtnRows, distanceBwtnColumns, distanceBwtnLevels )
# 矩型阵列
try:
    retObj = ciobj1.ArrayRectangular ( 4, 4, 2, 1, 1, 1 )
except:
    pass

 

13、移动对象

# 移动对象:obj.move(point1, point2)
point1 = APoint ( 2, 2 )
radius1 = 1
ciobj1 = acadmod.AddCircle ( point1, radius1 )
# acadapp.ZoomAll()
point2 = APoint ( 6, 2 )
ciobj1.move ( point1, point2 )

 

14、旋转对象

# 旋转对象:obj.Rotate( basePoint, rotationAngle )
plpnts = [1, 1, 0, 1, 2, 0, 4, 2, 0, 4, 1, 0, 1, 1, 0]  # 画一个矩形方法1
plpnts = aDouble ( plpnts )
plobj = acadmod.AddPolyline ( plpnts )
acaddoc.SendCommand ( "rec" + chr ( 13 ) + "5,5" + " 8,6" + chr ( 13 ) )  # 注,一切通过activex 不可用bug的方法均可尝试直接调用cad命令行操作
obj = acadmod.Item ( acadmod.Count - 1 )  #取得刚画的矩形
obj.Color = 111  # 改颜色
basePoint = APoint(5,5)
rotationAngle = np.pi*0.5  # 注autocad 内旋转角度用pi 表示,例pi =180 ,pi*0.5 = 90
obj.Rotate( basePoint, rotationAngle ) #obj.Rotate( basePoint, rotationAngle )

 

15、延伸和修剪对象

# 延伸和修剪对象:
startpoint = APoint ( 10, 10 )
endpoint = APoint ( 30, 10 )
lineobj = acadmod.addline ( startpoint, endpoint )  # 画条直接,长20
endpoint = APoint ( 50, 10 )  # 改终点
lineobj.endpoint = endpoint  # 长度改为40

 

16、编辑样条曲线

# """
# 修改样条曲线:
startpoint = APoint ( 0.5, 0.5 )
endpoint = APoint ( 0.5, 0.5 )
point1 = APoint ( 1, 1 )
point2 = APoint ( 5, 5 )
point3 = APoint ( 10, 7 )
SplinePnts = np.array ( [point1, point2, point3] )
SplinePnts = SplinePnts.reshape ( 1, SplinePnts.shape[0] * SplinePnts.shape[1] )[0]
SplinePnts = aDouble ( SplinePnts )
splobj = acadmod.addspline ( SplinePnts, startpoint, endpoint )  # 画条样条曲线
controlPoint = APoint ( 0, 3 )
splobj.SetControlPoint ( 0, controlPoint )  # 修改样条曲线第一个基点
# """

 

17、尺寸标注

# 尺寸标注:
definingPoint = acaduti.GetPoint ( APoint ( 0, 0 ), "选择被标注点:" )
leaderEndPoint = acaduti.GetPoint ( APoint ( definingPoint ), "选择标注文字显示位置点:" )
print ( definingPoint, leaderEndPoint )
# 定义关键词
kwordList = "True False"
# ’允许键入回车键
useXAxis = acaduti.InitializeUserInput ( 2, kwordList )  # 取得稍后返回的关键信息
if useXAxis == None:
    useXAxis = True
else:
    useXAxis = False
returnString = acaduti.GetKeyword ( "显示X坐标True / 显示Y坐标 < True >:" )  # 在cad命令行显示提示信息
# 根据关键词确定显示被标注点的X坐标或Y坐标
print ( useXAxis )
oldOSMODE = acaddoc.GetVariable ( "OSMODE" )
print ( (definingPoint, leaderEndPoint, False) )
dimObj = acadmod.AddDimOrdinate ( APoint ( definingPoint ), APoint ( leaderEndPoint ), False )  # 新增引线,显示X轴坐标或Y轴坐标
acaddoc.SetVariable ( "OSMODE", oldOSMODE )
dimObj.ArrowheadSize = 5.5  # 引线样式,箭头大小
dimObj.TextHeight = 7  # 引线样式,引线高度
dimObj.TextGap = 2.5  # 引线样式,文本间隙
dimObj.DecimalSeparator = "."  # 引线样式,小数分隔符

 

18、图纸空间的设置(略)

第六章:AutoCAD对象

1、阴影对象,即:h 填充对象

# """
# 阴影对象,即:h 填充对象
plpnts = apoint_xyz ( APoint ( 5, 0 ), APoint ( 5, 5 ), APoint ( 0, 5 ), APoint ( 0, 0 ), APoint ( 5, 0 ) )  # apint to xyz
plpnts = aDouble ( plpnts )
plobj = acadmod.AddPolyline ( plpnts )  # 画正方形
circleobj = acadmod.AddCircle ( APoint ( 5, 0 ), 5 )
PatternType = 0  # 图案常数:0,为选择那些定义在 acad.pat 文件中的图案名称。1,使用当前线线型定义的线图案。2,从 acad.pat 文件名的其它 PAT 中选择图案名称。
PatternName = "ANSI31"  # 图案名字
Associativity = True  # 图案填充为关联与否
hatchobj = acadmod.AddHatch ( PatternType, PatternName, Associativity )
acaddoc.SendCommand ( "h" + chr ( 13 ) + "1,1" + chr ( 13 )  + chr ( 13 ) )  # 注,一切通过activex 不可用bug的方法均可尝试直接调用cad命令行操作
# hatchobj.AppendOuterLoop ( circleobj )  # 矩形 对象数组无效 why? BUG 重像,对象数组无法传递。
# hatchobj.Evaluate
# acadapp.Regen ( True )
# """编辑阴影(略)

 

2、图层对象

# """
# 图层
layname = acaddoc.ActiveLayer.Name  # 当前图层
print ( layname )
acaddoc.ActiveLayer.Plottable = False  # 设置当前图层属性为不打印
laynum = acaddoc.Layers.Count  # 图层数量
print ( laynum )
layobj = acaddoc.Layers.Add ( "ABC" )  # 新建图层
layobj.color = 5  # 改图层颜色
# XXXobj.Layer = "ABC" #指定XXXOBJ 图层,修改对象图层。
layobj.layeron = False  # 关闭图层
layobj.delete()  # 删除图层
# """

 

3、颜色对象

AutoCAD颜色索引表:

基于Python AutoCAD ActiveX 二次开发,pyautocad应用技术_第5张图片

使用方法(略)

4、线型对象

try:
    acaddoc.Linetypes.Load ( "CENTER", "acad.lin" )
except _ctypes.COMError:
    print ( "{}线型已存在".format ( "CENTER" ) )

 

5、文本对象

文本样式对照表:

基于Python AutoCAD ActiveX 二次开发,pyautocad应用技术_第6张图片

# """
# 文本对象
# point1 = acaduti.GetPoint ( APoint ( 0, 0 ), "请选文本插入点" )  # 选择点
textObj = acadmod.addtext ( "hello word!", APoint ( 10, 10 ), "2.5" )  # 插入文本
# 左对齐文字
textObj.Alignment = 0  # 左对齐,默认值
textObj.Alignment = 1  # 中心对齐,
textObj.Alignment = 2  # 右对齐
MTextObj = acadmod.AddMText( APoint ( 10, 10 ), "10", "cccccccccccccccc") #多行文字
MTextObj.height = 2.5 # 修改多行文字高度
# """

 

第七章:设置AutoCAD环境

1、图形对象

基于Python AutoCAD ActiveX 二次开发,pyautocad应用技术_第7张图片

# 图形对象
dwgname = r"d:\1.dwg"
try:
    acadapp.Documents.open ( dwgname )  # 打开文件
except:
    print ( "未找到文件" )
acaddoc.save  # 保存文件
acaddoc.saveas ( "1.dwg" )  # 另存为文件
a = input ( "是否保存文件Y/N" )
if a == "Y":
    acaddoc.save  # 保存文件
else:
    pass
#设置autocad窗口大小(略)
acadapp.WindowState = "0" # 窗口最大化
acadapp.WindowState = "1" # 窗口最小化

 

2、控制图形显示

缩放图形(略)

视图操作(略)

更新窗口(updata,regen)

3、构造线

obj = acadmod.addxline ( APoint ( 5, 0 ), APoint ( 6, 8 ) )

 

4、打印面积

acaddoc.SendCommand ( "rec 0,0\n 1,3\n" )
obj = acadmod.Item ( acadmod.Count - 1 )  # 取得刚画的矩形
obj.closed = True  # 改为封闭图形
print ( obj.area )  # 打印出面积

 

5、取得用户输入(用户交互)

# 获取用户输入
# GetString
strobj = acaduti.getstring ( 1, "请输入内容:" )
print ( strobj )
# GetPoint
pointobj = acaduti.GetPoint ( APoint ( 0, 0 ), "请选择点:" )
print ( pointobj )
# GetKeyWord
acaduti.InitializeUserInput ( 128, "keyword1,keyword2" )
keyobj = acaduti.GetKeyword ( "提示关键字:" )
print ( keyobj )
# GetInteger
ingobj = acaduti.GetInteger ( "提示输入整数:" )
print ( ingobj )

 

第八章:定制个性菜单和工具栏

1、创建菜单(略)

2、创建工具栏(略)

第九章:三维绘图(略)

第十章:创建实例程序(待更新)

第十一章:参数化图形的设计(待更新

第十二章:自动加载图形(待更新)

第十三章:显示对象信息编程

第十四章:对层的操作编程

第十五章:AutoCAD Automation 对象

第十六章:加载DVB工程编程

第十七章:在AutoCAD环境中调用DLL编程

第十八章:AutoCAD二次开发实例

第十九章:AutoCAD和Access数据库编程

附录:参考函数列表

你可能感兴趣的:(python,python,pyautocad,activex二次开发,autocad)