组合杆件的长细比
本文主要讲一下对于由两种材料构成的组合杆件换算长细比的事。……
在上一部分中,讲解了如何安装pyautocad模块并尝试了第一个HelloWorld程序。在这一部分将讲解对象结构和数据类型。1.4 对象结构在AutoCAD安装目录中,可以通过acadauto.chm找到Autodesk AutoCAD 2014:ActiveX Reference Guide帮助文件, 这一文件给出了应用接口程序处理CAD文件时的对象结构。以下就是一个ActiveX……
在上一部分中,讲解了如何安装pyautocad模块并尝试了第一个HelloWorld程序。在这一部分将讲解对象结构和数据类型。
在AutoCAD安装目录中,可以通过acadauto.chm找到Autodesk AutoCAD 2014:ActiveX Reference Guide帮助文件, 这一文件给出了应用接口程序处理CAD文件时的对象结构。以下就是一个ActiveX对象关系树形图(部分,截取不全),可以看到顶层是Application对象。
注意到所有的类及其方法属性都是大驼峰式命名。这与Python的习惯命名方式并不相同。我们对上述对象结构图进一步加以总结如下所示。
可以看到,为了对ActiveX对象进行操作,首先需要获取顶层Application对象,即所打开的CAD应用程序。
pyautocad模块中提供了Autocad类,可用于访问顶层对象,具体语句如下:
from pyautocad import Autocad
acad = Autocad(create_if_not_exists=True)
app = acad.Application
如此创建一个Autocad类实例acad,并基于此实例获取了Application对象,即活动的CAD程序。(也就是说无法同时对打开的多个CAD程序进行操作)。后续对象操作即可在此基础上展开。相应的属性和方法即可参照Autodesk AutoCAD 2014:ActiveX Reference Guide帮助文件得到。
在acadauto.chm中所示ActiveX中方法与属性均是采用的大驼峰式,这个与python中命名习惯显著不同。(不过实际上小写也可以用)。对于ActiveX中方法参数说明:带有方括号的表示此参数可选。以下述取点函数为例,Point参数为基点,并非必须。
RetVal = object.GetPoint([Point [, Prompt]])
理论上可以按照前述树形图对所需对象进行操作,如得到当前活动的CAD文档并输出文档名称。
print(app.name)
doc = acad.Application.ActiveDocument # 获取当前文档
print(doc.name)
输出:
AutoCAD
Drawing1.dwg
不过并不需要按照树形图按部就班得到对象,pyautocad提供了访问若干类的快捷方式:
acad.app:当前活动的cad程序,相当于acad.Application; acad.doc:即正在活动的当前cad文件,理论上等同与A1.ActiveDocument。Layers图层、Groups组、SelectionSets等均是基于此对象之上; acad.model:当前活动cad文件中的模型空间(用于绘图),相当于acad.ActiveDocument. ModelSpace。后续图形实例的绘制均是基于此对象
与此同时,Autocad模块还具有几个子类:
APoint类:用于直接生成满足各种绘图方法参数数据类型要求的点
APoint(x,y,z)
或APoint(x,y)
aDouble类: 用于将元组转换为所需数据类型aDouble((x, y, z))
ACAD对象:包含有所有的AutoCAD中的枚举常数,应用这些常数是都是以ACAD开头。如ACAD.acAttachmentPointBottomLeft用于设置文字左下对齐; 也就是说本质上再获取了acad对象后,基本上可以处理大部分的对象。
数据类型的匹配在接口程序实现中尤为重要。在ActiveX各种方法所需参数中,int、double、string等类型可以直接采用,一般通过对象方法生成的图元对象如CIRCLE,POLYLINE等也是支持的,其他重要的数据类型有:
(1)three-element array of doubles
通常在参数中需要点坐标时会用到上述参数,如绘制圆方法object.AddCircle(Center, Radius)
:
Center:Variant (three-element array of doubles); input-only The 3D WCS coordinates specifying the circle's center.
Radius:Double; input-only The radius of the circle. Must be a positive number.
这里three-element array of doubles并非Python中原生list或tuple,在pyautocad中在创建上述Array of doubles类型的数据,有两种方法。 ①通过pyautocad中的Apoint类:
from pyautocad import APoint
P = APoint(x,y)
其返回值数据类型即是Array of doubles。 ②另一种创建Array of doubles数据的方式是aDouble命令,其可将Python中的tuple转化。如
aa = (0,0,0)
P = aDouble(aa)
上述语句相当于直接采用APoint。需要注意的时此时tuple需要同时包含x,y,z坐标,即如果采用
aa = (0,0)
P = aDouble(aa)
将会报错。不过aDouble的更大作用在于产生包含多个点坐标的Array of doubles。如对于绘制多段线方法object.AddPolyline(VerticesList)
:
VerticesList:Variant (array of doubles); input-only An array of OCS coordinates used to create the polyline vertices. Each vertex is represented with three elements, with the first two
being the X and Y coodinates in OCS; the third element is ignored. At least two points (six elements) are required for constructing a polyline object. The array size must be a multiple of three.
这里VerticesList需要至少六个元素。如:
aa = (0, 0, 0)
bb = (1, 1, 1)
cc = aa + bb
P = aDouble(cc)
(2)array of object 不少方法参数和返回值为该类型,但由于pyautocad无法直接生成该类型数据凡是涉及到该数据类型的均不能操作
object.AddItems (Items) Items:An array of objects to add to the selection set.
上述方法是指将对象加入一个选择集、组合等,理论上如果参数只是object的话就没有问题,但是这里需要array of objects,由于不支持直接创建这种类型,也没有其他命令实现转化,故上述方法无法实现。 如果返回值类型为array of objects,相应也会报错。如以下是绘制一个圆并进行阵列。
# 圆形阵列
p = APoint(0,0)
dd = acad.model.addcircle(p,10)
aa = acad.doc.Utility
ff = APoint(0,100)
dd.ArrayPolar(4,math.pi/2.0,ff)
上述语句目的是对圆形进行阵列以得到4个圆形,然而由于dd.ArrayPolar(4,math.pi/2.0,ff)的返回值是array of objects类型,在python中不支持这种类型,相应会报错(尽管依旧能生成阵列)。当然通过循环语句可方便实现相当于阵列的功能。相应的Hatch也无法实现。
(3)枚举常数 ActiveX有一些枚举常数,为了应用这些常数,需首先引入ACAD模块。
from pyautocad import ACAD
如对于MTEXT图元对象,其对齐属性object.AttachmentPoint
可选值为:
acAttachmentPointTopLeft acAttachmentPointTopCenter acAttachmentPointTopRight acAttachmentPointMiddleLeft acAttachmentPointMiddleCenter acAttachmentPointMiddleRight acAttachmentPointBottomLeft acAttachmentPointBottomCenter acAttachmentPointBottomRight
具体应用示例:
object.AttachmentPoint = ACAD.acAttachmentPointMiddleCenter