4autocad2009-机械图学基础随书光盘2.97g ch11n_第1页
4autocad2009-机械图学基础随书光盘2.97g ch11n_第2页
4autocad2009-机械图学基础随书光盘2.97g ch11n_第3页
4autocad2009-机械图学基础随书光盘2.97g ch11n_第4页
4autocad2009-机械图学基础随书光盘2.97g ch11n_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、机械设计11.1AutoCAD 对象模型在对象程序编写中,首先您要了解并掌握对象的属性、方法和事件,才能在程序的编写过程中灵活地运用。11.1.1对象的属性AutoCAD 对象模型中的对象均具有一个或多个属性。以圆为例,圆可以用半径、圆心来描述,所有的特征就称为“属性”。对于一个圆来说,它就有:Center、Application、Area、Circumference、Color、Diameter、Handle、HasExtenDictionary、Hyperlinks、Layer、Linetype、LinetypeScale、Lineweight、Normal、ObjectID、OwnerI

2、D、PlotStyleName、 Radius、Thickness、Visible 这些属性。在 ActiveX 函数中要获得 AutoCAD 图形对象的有关特征就要用到对应的属性名称。由于不同的对象就有不同的属性,所以您可以在 AutoCAD的线上说明文件中查到所有详细的资料。11.1.2对象的方法对象还包含方法,方法是用来指定对象的执行方式。ActiveX 对象也有对应的方法,即可知道要对 ActiveX 的对象做怎样的操作。如圆的方法就有: ArrayPolar 、 ArrayRectangular 、Copy 、Delete 、GetBoundingBoxGetExten Dictio

3、nary 、GetXData 、Highlight ersectWith、Mirror、Mirror3D、Move、Offse、Tro e、Ro e3D、ScaleEntity、SetXDaransformBy 等。在 Visual LISP 中,ActiveX 方法的执行是通过一系列新增的 Visual LISP 函数(即 vl开头的函数),也可从文件中悉数查询到该类函数的详细语法信息。通常,在方法设定任务之前都会需要信息,而这些信息就是参数。例如,如果要将圆半径改为 5,那么 5就是参数。11.1.3对象的事件事件就是程序执行所需要的条件。一旦某个事件被激活,系统就会执行对应的程序代154

4、第 11 章 对象码,这在以后的程序中可以经常看到。AutoCAD ActiveX 中新增了事件驱动。当 AutoCAD 的当前状态发生变化时或某些事件发生后,AutoCAD 就会激发对应的事件与消息,用户可以在事件处理中加入自定义的事件处理子程序。在 AutoCAD有三类 40 个事件:如:响应指令行指令,响应系统变量的改变,单文字文件下、关闭、打印文件,响应加载和卸载 LISP 与 ARX 程序。应用程序层次事件响应新建、打开、如,mandEnded 事件。文字文件层次事件 如:响应新建、删除、修改物体,响应快捷菜单、对象选择、重新产生视图,多文件下响应加载与卸载 LISP 与 ARX 程

5、序。如, vlr-beginRightClick 事件。对象层次事件 当实体物体被修改时就会激发此事件,如:vlr-modified,vlr-erased事件。11.1.4对象的集合值得一提的是,在 AutoCAD 的对象模型中,所有对象都是以集合来分组的,例如选集 selectionsets 就是图形中所有选取图形的集合,图块集合 blocks 就是 AutoCAD 图形中所有图块的集合。因此,在存取选集或图块作请参考下一章。要从对象的集合中调出。有关选择集的操11.1.5对象的使用对象操作的语法如下:(以 VBA 为例)设定对象属性对象 A.属性=某个输入的数值 circle.radius

6、=5(设定圆的半径为 5)。提取对象属性变量=对象 A.属性 radius=circle.radius(将圆的半径存入 raidus 变量中)。如果这个对象具有这种方法 I,就执行某个操作对象 A.方法 Icircle.delete(删除圆)。11.1.6AutoCAD 的对象结构如图 11-1 所示,AutoCAD 中的对象是以层次式结构来组织的,其根部是应用程序对155机械设计象。对象的继承阶层结构就称为“对象模型”,对象模型将显示对象的阶层关系,各级属性的使用必须依照该对象模型中的继承层次关系。156非数据库驻数据库驻对象(支持 I AcadObj ect )数据库驻图元(支持 I Ac

7、adEni t y 与 I AcadObj ect )第 11 章 对象图 11-1 ActiveX 的对象模型结构最对象是 AutoCAD Application,它被用来管理 AutoCAD 的应用程序,它将包含以下几个对象:Preferen集合对象(即 Preferen设定窗口)s 集合对象(用来处理当前活动的图形,它包含多个子对象,其中有图形文件所有的对象集合,辅助工具群等)Bar、Groups 集合对象(用来操作菜单与)在 Visual LISP 中使用 ActiveX 对象11.2Visual LISP 将提供一系列函数来处理 ActiveX 对象,这些函数名称都是以“vla-”为

8、前缀的。例如,vla-addLine、vla-get-Color、vla-polor 等。换句话说,前缀为“vla-”的函数都是 ActiveX 函数,它们将对 AutoCAD 数据对象调用对应的方法来对其属性进行操作。11.2.1ActiveX 对象的分类综上所述,这些在 VBA 里的函数可依其使用对象的方法来进一步分类:vla- 函数与每个 ActiveX 方法相对应可用这些函数来调用 ActiveX 方法(如,以 vla-addCircle 调用 AddCircle 方法)。设定对象的属性 vla-put- 函数和每个特性相对应,可更新特性的值(如,以vla-polor 来更新对象的颜色

9、特性)。取得对象的属性 vla-get- 函数和每个特性相对应,可提取 ActiveX 对象特性的值(如,以 vla-get-Color 来提取对象的颜色特性)。Visual LISP 还提供了一些和 ActiveX 有关的函数,其前缀为 vlax-。这是一些更综合的 ActiveX 函数,它们可被应用到许多方法、对象或特性。譬如说:在 ActiveX 的支持下,Visual LISP 就可以像 VBA 一样存取Word、Excel 等应用程序,以进行不同程序之间的资料共享。利用 vlax-get-property 函数,可提取任意 ActiveX 对象的任意特性。如果图形包括自定义的 Act

10、iveX 物件,或需要从其他应用程序中存取对象,也可使用如 vlax-invoke-method、vlax-get-property 和 vlax-put-property 这类的函数来存取对象的方法和特性。157机械设计在 AutoCAD 提供的 ActiveX Automation文件中详细介绍了所有“vla- 类函数所涉及的对象属性和方法,但是均以 VBA 的形式来说明的,在下节中,在 Visual LISP 中使用 ActiveX 函数。说明如何11.2.2如何调用 Visual LISP 所提供的 ActiveX 函数Visual LISP 中的 ActiveX 函数将提供运用 Ac

11、tiveX 对象方法的途径,下面以在图形中加入一个圆为例,来说明如何利用 ActiveX 对象的方法:(setq myCircle(vla-addCircle *mSpace* (vlax-3d-po(5.0 5.0 0) 3.0) #这两条语法表示利用 vla-addCircle 函数绘制圆。其中 *mSpace* 是指向模型空间的VLA 变量。如果您不知道如何在 AutoCAD 图形中利用 ActiveX 类函数来画圆,那么您可以参考ActiveX Automation文件,查询利用 ActiveX 如何定义圆图形对象。图 11-2 所示就是查询圆对象定义的操作。158第 11 章 对象图

12、 11-2 查询圆对象定义的操作在图 11-2 所示的图形对象的说明中有很多文字说明,列出了对象所拥有的方法、属性和事件。如果找到了需要的方法,那么在方法名称前加上“vla-“前缀即为执行该方法的Visual LISP 函数。在 Visual LISP 中,函数名称不区分大小写,“ vla-addcircle” 与“ vla-AddCirle” 是同一个函数。找到与所需方法相对应的 Visual LISP 函数后,要如何调用这些函数呢?目前在Visual LISP 语法中并没有详细阐述这类函数的调用方法, 开发必须在 ActiveXAutomation 说明文件中查询与该方法对应的函数调用方法

13、。例如,在模型空间集合的对象说明文件中可单击的“AddCircle”项目来查看该方法的定义,如图 11-3 所示。159机械设计图 11-3 “AddCircle”方法的信息查询160第 11 章 对象您也可以在 ActiveX Automation 和说明窗口中单击顶部的【Methods】钮,在方法列表中选择“AddCircle”方法来取得该方法的使用说明,如图 11-4 所示。图 11-4 “AddCircle”方法的另一种查询方式从图 11-4 中可看出:在 Automation 说明文件中,方法是用 VBA 来定义的。例如,对于 AddCircle 方法可定义如下:RetVal=obj

14、ect.AddCircle(Center,Radius)在一般的具体应用中,如果要在模型空间中以 5,5 为圆心,3 为半径画圆,请输入以下语法:Dim Center(0 to 2) As Double, Radius as Double Center(0)=5.0 : Center(1)=5.0 : Center(2)=0Radius=3.0Set myCircle=Thisdrawing.MSpace.AddCircle(Center,Radius)在 VBA 中,返回值是前置的,即 myCircle,返回值是在 Automation 说明文件中所定义的圆对象。赋予值给对象变量时要用 Se

15、t。相应地,在 Visual LISP 中是用下面的方式来调用方法161机械设计的:()(setq *acadObject* (vlax-get-acad-object)(setq *acad* (vla-get-Active*acadObject*)*)(setq *mSpace* (vla-get-MSpace *acad(setq center (vlax-make-safearray vlax-vbDouble (0 . 2) (vlax-safearray-fill center (5.0 5.0 0)(setq radius 3.0)(setq myCircle(vla-addCi

16、rcle *mSpace* center radius)在 Visual LISP 中,ActiveX 函数返回值 myCircle 是 AutoCAD 对象,亦即 VLA 对象数据类型。在 vla 函数调用时,方法名称(object.AddCirCle)前所的对象 object 通常是第一个参数,该对象是当前要修改或处理的对象。在此范例中就是模型空间 M在 Visual LISP 中写为:(vla-addCircle *mSpace*.)Space。因此,*mSpace* 指的是当前的模型空间对象。对象具有阶层关系,模型空间对象的阶层性如图 11-5 所示。图 11-5 模型空间对象的阶层性

17、根据对象的继承性,可以逐个处理各层次的属性。在上例中,已提出了处理当前图形中模型空间的方法。在 VBA 中,Thisdrawing 将代表当前文档(即),162圆 Circle模型空间集合文件AutoCAD应用程序第 11 章 对象Thisdrawing.即取得模型空间集合对象。在 Visual LISP 中,先以(setq *acadObject*(vlax-get-acad-object)来取得 AutoCAD应用程序对象;以(setq *acad*(vla-get-Active*acadObject*)来取得*)来取得模型空间集当前的文档;以(setq *mSpace*(vla-get-

18、M合对象。Space*acad11.3Visual LISP 中的 ActiveX 变量本节将为您介绍有关 Visual LISP 中所使用的各种 ActiveX 变量。11.3.1安全数组让再仔细分析一下上例,以了解如何将 VBA 变量转换成相应的 Visual LISP 变量:Dim Center(0 to 2) As Double, Radius as Double Center(0)=5.0 : Center(1)=5.0 : Center(2)=0 Radius=3.0在 VBA 范例中,利用 ActiveX 方法向 AutoCAD 的图形模型空间添加一个圆对象时了两个变量 Cent

19、er 与 Radius。其中,Center 是一维数组,由三个双精度数组组成,这将在 WCS 坐标系统中定义了圆心坐标。Radius 是非负值双精度数,用来定义圆的半径。(setq center (vlax-make-safearray vlax-vbDouble (0 . 2) (vlax-safearray-fill center (5.0 5.0 0)(setq radius 3.0)在 Visual LISP 中,的数据类型是 ActiveX使用了以 vla- 为前缀的函数 vla-AddCircle,这类函数操作数的数据类型。在此范例中, center 的数据类型是安全数组(safe

20、array)。如果要在控制台窗口中查看 center,将得到:_$ center #(setq center (vlax-make-safearray vlax-vbDouble (0 . 2) 将建立一个一维的,由三个双精度数组成的空安全数组,vlax-vbDouble 表示双精度,其中点对 (0 . 2)表示数组下标从 0到 2。此句相当于 VBA 中的:163机械设计Dim Center(0 to 2) As Double(vlax-safearray-fill center (5.0 5.0 0) 会向刚建立的空数组中填入数据,相当于 VBA中的:Center(0)=5.0 : Cen

21、ter(1)=5.0 : Center(2)=0安全数组是ActiveX 的数据类型,可在 Visual LISP 中向 vla- 类函数传递值。但是,radius 是 Visual LISP 中的实数(Real)类型的数值,但它也可以向 vla- 类函数传递值。在传递的过程中,radius 将自动转换为 ActiveX 所需的双精度数(vlax-vbDouble)。11.3.2变量的转换要在 Visual LISP 中顺利运用 ActiveX 函数须依 ActiveX 方法定义里的变量类型来提供对应的 LISP 变量类型。如果发生错误(例如,需要整数型变量时却传递了实数型变量),将导致应用程

22、序。例如,当您利用d 与 entmake 函数来产生 AutoCAD 图元时,Visual LISP就可提供灵活的点坐标表示方法(也就是说:点可以是二维点也可以是三维点)。在利用ActiveX 函数时,也必须保证参数传递的正确性,使用 vlax-3d-po函数,就可以将表示二维点或三维点的表、坐标值转换成有效的三维点。该函数的语法如下:(vlax-3d-po) (vlax-3d-pox y z)例如:_$ (setq aPo(vlax-3D-po(list 5 5) (5.0 5.0 0.0)_$(setq aPo(vlax-3d-po5 5)(5.0 5.0 0.0)vlax-tmatrix

23、 函数可以将模型有效地转换到通用转换矩阵中,从而可以被 vla-TransformBy 函数所调用。该函数还可以将由四个表所定义的转换矩阵中的每一元素转换成实数,如下所示:_$( vlax-tmatrix (list (list 1 1 1 0)(list 1 2 3 0)(list 2 3 4 5)(list 2 9 8 3)#164第 11 章对象表 11-1 列出ActiveX 函数针对要求的 ActiveX 数据类型所能接受的 Visual LISP 数据类型。表的每一行都代表 ActiveX 函数所用的一种数据类型,每一列则代表一种 Visual LISP 的数据类型。其中一些可以自

24、动转换, 如前述的实数型 Real 转换为双精度型 vlax-vbDouble。而有一些则需要函数转换,例如,一次转换:图元名称到 VLA 对象的转换要使用 vlax-ename-vla-object 函数;二次转换:图元名称到变体要先将其转换为 VLA 对象,再用 vlax-make-variant 函数转换为变体变量。表 11-1 ActiveX 数据类型所能接受的Visual LISP 数据类型11.3.3变体(Variant)“变体”是一种数据类型,它可以包含数值、字符串或日期资料。Variant数据类型占用 16 字节的空间,可以包含的数据可达 Decimal 的范围,或 22 字节

25、(加上字符串长度)的字符大小,同时可存放任何字符。VarType 函数定义了变体中的各种数据类型。如果一变量没有明确其数据类型,那么均会变成“变体”数据类型。有关前面的那个画圆的 VBA 范例还可以这样写:Dim Center As Vara , Radius as Double Thisdrawing.Utility.CreateTypedArray Center, vbDouble, 5.0,5.0,0 Radius=3.0Set myCircle=Thisdrawing.MSpace.AddCircle(Center,Radius)在此,圆的中心点定义为一个变体(Variant)变量。变

26、体变量可以代表任何类型的变量,因此它的使用也很灵活。在 AutoCAD 的开发中经常用来表示一个点或多个点。165非nil(非 0)整数实数元 素 名 称字 符 串表整数长 整 数单精度浮点数双精度浮点数字 符 串VLA 对象变体安 全 数 组vlax-true/ vlax-false机械设计CreateTypedArray 将赋予 Center 值,使之成为一个一维并具有三个双精度数的数组。对应且使用变体的 Visual LISP 程序应为:(1)()(2)(setq *acadObject* (vlax-get-acad-object)(3)(setq *acad* (vla-get-Ac

27、tive*acadObject*)*)(4)(setq *mSpace* (vla-get-MSpace *acad(5)(setq sacenter (vlax-make-safearray vlax-vbDouble (0 . 2) (6)(vlax-safearray-fill sacenter (5.0 5.0 0)(7)(setq center (vlax-make-variant sacenter) (8)(setq radius 3.0)(9)(setq myCircle(vla-addCircle *mSpace* center radius)或者(1)()(2)(setq *

28、acadObject* (vlax-get-acad-object)(3)(setq *acad* (vla-get-Active*acadObject*)*)(4)(setq *mSpace* (vla-get-MSpace *acad(5)(setq center (vlax-3d-po(5.0 5.0 0)(6)(setq radius 3.0)(7)(setq myCircle(vla-addCircle *mSpace* center radius)上面前段的第(5)(7)行与后段的第(5)行程序代码的作用是一样的,都是为了得到一个安全数组的变体变量 center。通常会使用以下的个

29、 Visual LISP 函数来建立和使用变体:vlax-make-variant vlax-variant-type vlax-variant-valuevlax-variant-change-type建立变体返回变体的数据类型返回变体变量的值改变变体变量的数据类型vlax-make-variant 函数vlax-make-variant 函数将接受两个参数:值与类型。值参数是要赋予该变体的值。类166第 11 章对象型参数则是指定如表 11-2 所示。到该变体中的数据类型。可供指定的类型参数以及其所代表整数值将表 11-2 vlax-make-variant 函数所指定的类型参数(续表)8

30、192+n 中的n 表示某种数据类型的安全数组( vlax-vbArray )。如双精度数组(vlax-vbDouble)为 8197(8192 + 5)。从上表中可以看出:这些类型参数都对应着一个整数值。它们的值在 AutoCAD 未来的版本可能会做修改,所以应该尽量使用类型参数名称,而不要直接使用它所对应的整数值。例如,下述函数将用来调用并建立一个整数变体,并将其值设为 6:_$ (setq var(vlax-make-variant 6 vlax-vbeger) # 返回值将表明变体的数据类型( 2 表示 vbeger)和变体值( 5 )。如果调用vlax-make-variant 时不

31、指定数据类型,那么函数将使用其预设类型。例如,下述函数调用将用来建立一个变体,并将其值设为 6,但没有指定数据类型:_$ (setq var(vlax-make-variant 6) # 在预设的情况下,vlax-make-variant 会将指定的整数值赋予长型整数类型,而不是整167类 型 参 数意义值vlax-vb eger整数2vlax-vbLong长型整数3vlax-vbSingle单精度浮点数4vlax-vbDouble双精度浮点数5vlax-vbString字符串8vlax-vbObject对象9vlax-vb类型11vlax-vbArray数组8192+n类 型 参 数意义值v

32、lax-vbEmpty未初始化(默认值)vlax-vbNull不包括有效数据机械设计数类型。当您将一个数值赋予变体时,就应该明确地说明想要的数据类型。如果不指定值和数据类型,vlax-make-variant 将建立一个未初始化的变体(vlax-vbEmpty)。vlax-variant-type 函数vlax-variant-type 将用来取得变体变量的类型,其用法如下:(vlax-variant-type var)其中,参数 var 变量为变体,返回值即为表 11-2 中类型参数所代表的整数值。例如:以下程序将变体设为整数,并将变体明确定义为整数型:_$ (setq var(vlax-m

33、ake-variant 6 vlax-vbeger) # _$ (vlax-variant-type var )如果要将变体设为长型整数,然后再显示变体的数据类型,则程序如下:_$ (setq var(vlax-make-variant 6) # _$ (vlax-variant-type var )以下程序可将建立双精度的安全数组,并将安全数组指定为变体,然后再显示变体的数据类型:_$ (setq 3dubs (vlax-make-safearray vlax-vbDouble (0 . 2) # _$ (setq center(vlax-make-variant 3dubs) # _$ (

34、vlax-variant-type center)8197vlax-variant-value 函数vlax-variant-value 将用来取得变体变量的值,其用法如下:(vlax-variant-value var)其中,参数 var 变量为变体,返回值即为表 11-2 中类型参数所代表的整数值。例如:下列程序可将变体设为整数,并将变体明确定义为整数型,再取得变体的值:_$ (setq var(vlax-make-variant 6 vlax-vbeger) # _$ (vlax-variant-value var )168第 11 章 对象6如果欲将变体设为长整数,然后再显示变体的数据

35、值,则程序为:_$ (setq var(vlax-make-variant 6) # _$ (vlax-variant-value var ) 6当要建立双精度的安全数组,并将安全数组指定为变体,然后再显示变体的数据类型时,程序如下:_$ (setq 3dubs (vlax-make-safearray vlax-vbDouble (0 . 2) # _$ (setq center(vlax-make-variant 3dubs) # _$ (vlax-variant-value center)# 11.4提取及设定对象的属性Visual LISP 将提供 vla-get- 函数来取得对象的属

36、性,以及 vla-put- 函数来设定对象的属性。为了说明这些函数的应用,请您先在 Visual LISP 的控制台提示号下执行下列语法:()(setq *acadObject* (vlax-get-acad-object)(setq *acad* (vla-get-Active*acadObject*)*)(setq *mSpace* (vla-get-MSpace *acad(setq myCircle(vla-addCircle *mSpace* (vlax-3d-poCircle:)3.0)(getpo nPick the Centofor a然后在 AutoCAD 的图形窗口中,在画

37、面上点取一点,就可以看到以此点为圆心,半径为 3.0 的圆。11.4.1提取对象的属性用来查看对象属性的函数名前缀为“vla-get-”,语法如下:169机械设计(vla-get-property object)例如,vla-get-center 将返回圆的圆心。您可以利用该函数来绘制一个与上例同心的圆:(vla-addCircle *mSpace*(vla-get-center myCircle)2.0) #如图 11-6 所示就是在 AutoCAD 图形窗口中出现的两个圆。指责他人过错容易,但能大肚容人包涵才是善举。170第 11 章 对象图 11-6 利用 ActiveX 函数所产生的两

38、个圆11.4.2设定对象属性用于更改属性的函数其函数名称前缀均为“vla-put-”,其语法为:(vla-put-property object new-value)例如,vla-penter 可改变圆的圆心,以下指令可将上例中圆(myCircle)的圆心X,然后再利用 vla-penter 函数来更新该圆:坐标向左偏移个绘图_$ (setq myCenter (vla-get-center myCircle)将返回 myCircle 的圆心坐标。_$ (setq x (- (car myCenter) 1)_$ (setq newcenter (list x (cadr myCenter)

39、(caddr myCenter)将返回新的圆心坐标。_$(vla-penter myCircle newcenter)返回 nil于 AutoCAD 的图形窗口中将显示如图 11-7 所示的圆。图 11-7 利用 ActiveX 函数更改图形对象的属性171机械设计图形对象属性被更改后,在 AutoCAD 的图形窗口中,该图形显示并不会立即刷新,这是因为 AutoCAD 允许同时更改图形对象的多个属性。若要更新显示,则需执行以下函数:(vla-update object)通常,您可以使用已预先定义的类型参数来更改对象的属性。例如,要将圆变为红色,您可以使用“ acRed” 来替代常用的颜色代码

40、:$(vla-polor myCircle acRed)您可以在VBA 的编辑窗口中,选择【视图(V)】【浏览对象(O)】选项,以在窗口中查询以 ac 为前缀的类型参数。11.4.3判断对象是否可以存取在应用程序中处理当前的 AutoCAD 对象时,如果该对象也同时被其他应用程序所使用,那么该对象可能就不能在该应用程序中被存取。例如,图层被锁定将导致改变对象属性的动作失败,而使程序中断。Visual LISP 将提供如下于使用某一对象前先判断该对象能否被存取的函数:vlax-read-enable-p vlax-write-enable-p vlax-erased-p据库中判断对象能否判断对象

41、能否更改判断对象是否已被删除,被删除的对象仍将在图形数若检测结果为 True,这些检测函数的返回值将为 T,否则为 nil。下面的范例将用来说明如何检测圆直线对象(假设 myCircle 圆对象已存在):$ (vlax-read-enable-p myCircle)$ (vlax-write-enable-p myCircle)$ (vlax-erased-p myCircle)返回 T返回 T返回 nil172第 11 章 对象如果删除了 myCircle 圆对象,则:$ (vlax-read-enable-p myCircle)$ (vlax-erased-p myCircle)返回 ni

42、l返回 T11.4.4使用变量来ActiveX 函数的返回值在 Visual LISP 中调用 ActiveX 方法时,有些 ActiveX 方法将要求提供变数,以使它们能赋予变量一个值。GetBoundingBox 方法就是一例。如图 11-8 所示即可充分地明了 ActiveX Automation说明中对该函数的定义。图 11-8 查询 GetBoundingBox 方法的操作在该方法定义中,MinPo及 MaxPo两个参数将用来返回值,参数的数据类型是由三个双精实数组成的一维数组。从下面的范例就可以看出 Visual LISP 函数要如何来获得圆的边界点,并将返回值储存在对应的变量中:

43、_$ (vla-getboundingbox myCircle minpomaxpo )173机械设计nil_$ minpo #_$ maxpo#可以使用 vlax-safearray- list在此,查看其值:174第 11 章对象_$ (vlax-safearray-list minpo ) (231.127 130.823 -1.0e-008)_$ (vlax-safearray-list maxpo )(237.127 136.823 1.0e-008)在上示函数中所套用的两个符号参数将成为 Visual LISP 的变量,就如同用 setq 函数来赋予一值给一个变量一样。正因如此,在

44、函数定义时,您就应该将它们成函数的局部变量,以免变为整体变量。11.4.5列出对象的属性及方法欲列出对象的属性,如图 11-9 所示,您可以在图】【检验】命令。Visual LISP 的主操作窗口中,选择【视图 11-9 检查对象的属性同样地,您也可以利用 vlax-dump-object 函数来查看对象的属性。在 Visual LISP 的控制台与应用程序中执行该函数,即可列出指定对象的属性。以下的程序代码将从模型空间中获得对象,然后在利用 vlax-dump-object 函数来列出对象的属性。其标准语法如下:(vlax-dump-object obj T)175在此输入要检查的程序机械设

45、计其中,obj 代表对象,T 选项可有可无,不含 T 时,就只列出对象的属性;如果包含T则列出对象的属性和方法。举例如下(假设myCircle已存在):176第 11 章对象_$ (vlax-dump-object myCircle); IAcadCircle: AutoCAD Circle 接口;特性值:; Application (RO) = #; Area = 28.2743; Center = (234.127 133.823 0.0); Circumference = 18.8496; Color = 256; Diameter = 6.0;(RO) = #; Handle (RO)

46、 = 3F; HasExtenDictionary (RO) = 0; Hyperlinks (RO) = #; Layer = 0; Linetype = ByLayer; LinetypeScale = 1.0; Lineweight = -1; Normal = (0.0 0.0 1.0); ObjectID (RO) = 1074171384; ObjectName (RO) = AcDbCircle; OwnerID (RO) = 1074171128; PlotStyleName = ByLayer; Radius = 3.0; Thickness = 0.0; Visible =

47、 -1 T当包含 T 选项时:_$ (vlax-dump-object myCircle t); IAcadCircle: AutoCAD Circle 接口;特性值:;Application (RO) = #;Area = 28.2743;Center = (234.127 133.823 0.0)177机械设计;Circumference = 18.8496;Color = 256;Diameter = 6.0;(RO) = #;Handle (RO) = 3F;HasExtenDictionary (RO) = 0;Hyperlinks (RO) = #;Layer = 0;Linety

48、pe = ByLayer;LinetypeScale = 1.0;Lineweight = -1;Normal = (0.0 0.0 1.0);ObjectID (RO) = 1074171384;ObjectName (RO) = AcDbCircle;OwnerID (RO) = 1074171128;PlotStyleName = ByLayer;Radius = 3.0;Thickness = 0.0;Visible = -1;支持的方法:;ArrayPolar (3);ArrayRectangular (6);Copy ();Delete ();GetBoundingBox (2);

49、GetExtenDictionary ();GetXData (3);Highlight (1);ersectWith (2);Mirror (2);Mirror3D (3);Move (2);Offset (1)178第 11 章对象;Ro e (2);Ro e3D (3);ScaleEntity (2);SetXData (2);TransformBy (1);Update () T11.4.6判断对象的方法或属性是否可用对于指定的对象,不属于该对象的方法与属性将导致错误。为此,当不确定某个方法或属性能否使用时,就可以使用 vlax-method-applicable-p 与 vlax-p

50、roperty-available-p这两个函数来加以判断。如果的方法或属性适用于该对象,则这两个函数的返回值为T,否则为 nil。判断方法的函数语法如下:(vlax-method-available-p object method)其中,object 为对象,method 为要判断的方法,例如(假设 myCircle 已存在):_$ (vlax-method-applicable-p myCircle copy)_$ (vlax-method-applicable-p myCircle addbox)判断属性的函数语法如下:(vlax-property-available-p object

51、property T)返回 T返回 nil其中,object 为对象,property 为要判断的属性,如果在调用 vlax-property-available-p函数时使用了“T”参数,那么将改变判断方式。如果对象拥有该属性并且该属性可以被更改,则函数返回值为“T”;如果对象没有该属性或该属性不可更改,函数返回值为“nil”。例如(假设 myCircle 已存在):以下表示圆心和图层均为 myCircle 的属性:_$ (vlax-property-available-p myCircle center)_$ (vlax-property-available-p myCircle laye

52、r)返回 T返回 T以下表示 application 属性属于 myCircle,但不可修改:_$ (vlax-property-available-p myCircle application)_$ (vlax-property-available-p myCircle application T)返回 T返回 nil179机械设计11.4.7使用对象集合在 AutoCAD 对象模型中的所有对象都是用集合来分组的。例如,图层集合就是由 AutoCAD 文字文件中的所有图层所组成的。Visual LISP 提供了 vlax-map-collection 和 vlaxfor 函数来处理集合中的

53、AutoCAD 对象。vlax-map-collection 函数可以将另一个函数应用到集合中的每一个对象。其语法为:(vlax-map-collection collection-object function)其中,collection-object 代表一个集合对象,function 为要应用的函数或 lambda 表达式,函数返回值即为集合对象。例如,下列程序代码将模型空间所有图形颜色改为绿色(*mSpace* 表示模型空间对象):_$ (vlax-map-Collection *mSpace* (lambda (x) (vla-polor x acGreen)#如果要对集合中的每一个

54、对象使用一系列函数来求值,您可使用 vlax-for:(vlax-for symbol collection express.)与 foreach 函数用法类似,vlax-for 将返回 for 循环中最后一个表达式求值的结果。以下的范例定义了一个函数,它用 vlax-for 将模型空间中所有对象的颜色改为绿色(*mSpace* 表示模型空间对象):(vlax-for obj *mSpace* (vla-polor obj 3)如果在遍历操作某集合时修改该集合(添加或删除成员),可能会引起错误。11.4.8取出对象集合中的对象对象集合由对象组成,有时需要对其中某个或一些对象进行一些操作时,就要

55、从对象集合中取出所需的对象。Item 方法可用来在对象中寻找相关的成员,而 Count 属性可用于统计对象集合中对象的数目。利用 Item 方法及 Count 属性,就可以对对象集合中的对象进行单独的操作。例如,可以寻找模型空间中所有的对象,并判断这些对象的类型是什么,然后对需要处理的对象进行单独的处理。以下的程序段将让模型空间里所有圆对象颜色变为绿色:(setq index 0)(repeat (vla-get-count *mSpace*)180第 11 章对象(if (= AcDbCircle(vla-get-objectname (vla-item *mSpace*index)(vla

56、-p)olor (vla-item *mSpace* index) acGreen)(setq index (+ index 1)Item 方法和 Count 属性对群组与选集也同样适用。11.4.9将对象从内存中AutoCAD 中可以将多个变量指向同一个 AutoCAD 图元,也可以将多个VLA 物件指向同一个图形对象。一般只要用 equal 函数就可以比较两个 VLA 对象,如果两个对象要指向同一个图形对象,equal 函数将返回 T。只要 VLA 对象还指向图形对象,AutoCAD 就会保留该对象所需的内存。如果不再需要该对象,就可使用函数 vlax-release-object 来通知

57、 AutoCAD:(vlax-release-object object)其中,object 为某个要取消的 VLA 对象。例如(*mSpace* 为模型空间 VLA 对象):_$ (vlax-release-object *mSpace*)返回 3与关闭文件类似,删除某对象后,就不能再使用该 VLA 对象指针了,但是调用vlax-release-object 函数时并不会内存。不过,如果了对象的所有,AutoCAD在必要时就会相关内存。如果要测试是否了某对象,就可以使用函数vlax-object-released-p:(vlax-object-released-p object)例如,下列程

58、序代码将用来测试了执行 vlax-release-object 前后的 *mSpace*对象(*mSpace* 为模型空间 VLA 对象):181机械设计_$ (vlax-object-released-p *mSpace*)_$ (vlax-release-object *mSpace*)_$ (vlax-object-released-p *mSpace*)返回返回返回nil 3T了该对象,函数将返回 T,否则返回 nil。11.4.10对象数据转换Visual LISP 还提供了许多AutoCAD 图形对象的方法,包括:由 ActiveX 函数返回的 VLA 对象。由 entget 和

59、entsel 返回的图元名称(ename)。此图元名称将指向某开启图形中的对象。由 handent 返回的句柄。句柄的图元在不同 AutoCAD 任务期间将保持不变。对象 ID 码。ARX 将用它来标识对象。为了灵活地使用这些对象,Visual LISP 提供了将一种对象标志符号转换为另一种标志符号的函数。就以下述小节来分述之。在图元名称和 VLA 对象之间做转换要将 entget 等函数提取到的图元名称转换成对象的函数,您可以使用 ActiveX 函数,以及将 VLA 对象转换成图元名称的函数。欲将图元名称转换成 VLA 对象,就要用到 vlax-ename-vla-object 函数,例如:_$ (setq ename-circle (car (entsel nPick a Circle:)_$ (setq vlaobj-circle(vlax-ename-vla-obj

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论