2-对象结构与数据类型

2020年03月04日 星期三

在上一部分中,讲解了如何安装pyautocad模块并尝试了第一个HelloWorld程序。在这一部分将讲解对象结构和数据类型。1.4 对象结构在AutoCAD安装目录中,可以通过acadauto.chm找到Autodesk AutoCAD 2014:ActiveX Reference Guide帮助文件, 这一文件给出了应用接口程序处理CAD文件时的对象结构。以下就是一个ActiveX……

​ 在上一部分中,讲解了如何安装pyautocad模块并尝试了第一个HelloWorld程序。在这一部分将讲解对象结构和数据类型。

1.4 对象结构

​ 在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对象后,基本上可以处理大部分的对象。

1.5 数据类型

​ 数据类型的匹配在接口程序实现中尤为重要。在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  

最后更新:2020年3月4日 星期三 天气阴

精选博客

组合杆件的长细比

本文主要讲一下对于由两种材料构成的组合杆件换算长细比的事。……

继 续 阅 读

平面桁架单元刚度矩阵推导

这里只讲杆单元刚度矩阵的推导,基于前提是已经根据势能最小原理得到了局部坐标系下单元刚度矩阵表达式,即对于弹性杆单元,通用单元刚度矩阵表达式为……

继 续 阅 读

APDL输入与输出

Mechanical APDL 在ANSYS帮助文件中是这样称呼我们习以为常的采用APDL来操作也就是那个黑乎乎的程序的。因此后续都用这个来称呼。工欲善其事必先利其器,关于APDL的编辑器,目前来看PSPAD还基本可以。ANSYS看起来并没有设置很好的接口,因为APDL看起来并不是一种很利于编程的语言,无论是数据格式还是流程都相当不友好。网上也有采用Python去做接口,但是仔细一看就是换了……

继 续 阅 读