《AutoLISPVisualLISP教程第十章》由会员分享,可在线阅读,更多相关《AutoLISPVisualLISP教程第十章(88页珍藏版)》请在金锄头文库上搜索。
1、AutoLISP-Visual-LISPAutoLISP-Visual-LISP教教程第十章程第十章 ActiveX ActiveX AutomationAutomation是是一一种种新新的的方方法法,通通过它它可可以以用用编程程的的方方式式操操作作AutoCADAutoCAD图形形。在在许多多操操作作AutoCADAutoCAD图形形对象象的的实例例中中,ActiveXActiveX的的速速度度比比传统的的AutoLISPAutoLISP函函数数要要快快。在在某某些些情情况况下下,例例如在反如在反应器回器回调函数中函数中访问图形形对象象时,只能使用,只能使用ActiveXActiveX。
2、许多多语言言和和环境境可可以以使使用用ActiveXActiveX编程程界界面面,如如C+C+、Visual Visual BasicBasic、JavaJava和和DelphiDelphi等等。在在AutoLISPAutoLISP中中使使用用ActiveXActiveX对象象,其其模模型型、属属性性和和方方法法和和在在其其他他编程程环境境中中使使用用的的ActiveXActiveX对象象完完全全相同。相同。 如果要在如果要在AutoLISP中使用中使用ActiveX函数,必须首先调用函数,必须首先调用vl-load-com函数来初始化函数来初始化ActiveX环境。环境。vl-load-co
3、m函数首先检函数首先检查是否加载了查是否加载了ActiveX支持的函数,如果已加载,该函数不做任支持的函数,如果已加载,该函数不做任何工作,否则将加载何工作,否则将加载ActiveX和其他和其他Visual LISP扩展部分的函扩展部分的函数。本章所有实例的前提是已调用了数。本章所有实例的前提是已调用了vl-load-com函数。函数。 10.1 AutoCAD10.1 AutoCAD对象模型象模型 对象象是是ActiveXActiveX应用用程程序序的的主主要要组成成部部分分。例例如如,直直线、圆弧弧、多多义线和和圆等等都都被被称称为图形形对象象。但但在在使使用用ActiveXActiveX
4、时,以以下下AutoCADAutoCAD概念也被称概念也被称为对象:象: 样式式设置置对象象,如如线型型(linetype)(linetype)、文文本本样式式(style)(style)和和尺尺寸寸样式式(dimstyle)(dimstyle)等。等。 组织结构构对象象,如,如图层(layer)(layer)和和块(block)(block)等。等。 图形形显示示对象象,如,如视图(view)(view)和和视口口(viewport)(viewport)。 图形的模型空形的模型空间(modelspace)(modelspace)和和图纸空空间(paperspace)(paperspace)。
5、甚至甚至连图形形和和AutoCADAutoCAD本身本身都被都被认为是是对象。象。 AutoCAD用层次结构来组织它的对象。结构的根是应用程用层次结构来组织它的对象。结构的根是应用程序对象,即序对象,即AutoCAD本身。该层次结构被称为本身。该层次结构被称为AutoCAD的对象的对象模型,见图模型,见图10-1 。 图图10-1 AutoCAD对象模型图对象模型图 AutoCADAutoCAD的的所所有有对象象都都有有一一个个或或多多个个属属性性。属属性性用用于于描描述述对象象。例例如如,圆具具有有半半径径、面面积、线型型等等属属性性,通通过半半径径、面面积、线型型等等属属性性描描述述一一个
6、个具具体体的的圆。椭圆具具有有面面积和和线型型属属性性,虽然然没没有有半径半径这个属性,但可以用其个属性,但可以用其长轴和短和短轴的比例来描述它。的比例来描述它。 下一下一级对象也是其上象也是其上级对象的属性。象的属性。 AutoCADAutoCAD的的对象象还包包括括方方法法,它它们是是为特特定定类型型的的对象象所所提提供供的的操操作作。某某些些方方法法可可应用用于于大大多多数数图形形对象象,例例如如,MirrorMirror(镜像像)和和MoveMove(平平移移)方方法法。而而另另一一些些方方法法,如如OffsetOffset(等等距距线)只能只能应用到用到圆弧、弧、圆、椭圆和直和直线等
7、少数几种等少数几种图形形对象。象。 AutoCAD通过集合将所有对象进行分类,例如,块集合是由通过集合将所有对象进行分类,例如,块集合是由 AutoCAD图形中的所有块定义组成的,而模型空间集合则包括图形中的所有块定义组成的,而模型空间集合则包括模型空间中的所有的图形对象(圆、直线、多义线等)。模型空间中的所有的图形对象(圆、直线、多义线等)。 10.2.110.2.1访问AutoCADAutoCAD应用程序用程序1. 1. 获取取AutoCADAutoCAD应用程序用程序 AutoCADAutoCAD应用用程程序序即即AutoCADAutoCAD本本身身,是是AutoCADAutoCAD所所
8、有有对象象的的根根对象象,是是访问所所有有AutoCADAutoCAD对象象的的起起点点。获取取AutoCADAutoCAD应用用程程序序对象,只能通象,只能通过函数函数vlax-get-acad-objectvlax-get-acad-object,格式如下:,格式如下: (setq myacad(vlax-get-acad-object) 该函数没有参数,返回指向该函数没有参数,返回指向AutoCAD应用程序的指针应用程序的指针# ,返回值的数,返回值的数据类型为据类型为VLA,即,即VLISP ActiveX对象。该表达式将指向对象。该表达式将指向AutoCAD应用程序的指针赋给了变量应
9、用程序的指针赋给了变量myacad。 2. 2. 了解了解AutoCADAutoCAD应用程序的属性和方法用程序的属性和方法(vlax-dump-object vlax-dump-object VLAVLA对象象 TT), ,该函函数数的的功功能能是是列列出出指指定定VLAVLA对象象的的属属性性和和方方法法,参参数数为VLAVLA对象象,如如果果未未设置置T T,只只列列出出指定指定VLAVLA对象的属性。例如象的属性。例如(vlax-dump-object myacad t)(vlax-dump-object myacad t)返回返回; IAcadApplication: An inst
10、ance of the AutoCAD application; IAcadApplication: An instance of the AutoCAD application; ; Property valuesProperty values: :; ActiveDocument = #; ActiveDocument = #; Application (RO) = #; Application (RO) = #; Caption (RO) = AutoCAD 2006 Drawing1.dwg; Caption (RO) = AutoCAD 2006 Drawing1.dwg; Docu
11、ments (RO) = #; Documents (RO) = #; FullName (RO) = C:Program FilesAutoCAD 2006acad.exe; FullName (RO) = C:Program FilesAutoCAD 2006acad.exe; Height = 730; Height = 730; HWND (RO) = 66224; HWND (RO) = 66224; LocaleId (RO) = 1033; LocaleId (RO) = 1033; MenuBar (RO) = #; MenuBar (RO) = #; MenuGroups (
12、RO) = #; MenuGroups (RO) = #; Name (RO) = AutoCAD; Name (RO) = AutoCAD; Path (RO) = C:Program FilesAutoCAD 2006; Path (RO) = C:Program FilesAutoCAD 2006; Preferences (RO) = #; Preferences (RO) = #; StatusId (RO) = .Indexed contents not shown.; StatusId (RO) = .Indexed contents not shown.; VBE (RO) =
13、 AutoCAD: Problem in loading VBA; VBE (RO) = AutoCAD: Problem in loading VBA; Version (RO) = 16.2s (LMS Tech); Version (RO) = 16.2s (LMS Tech); Visible = -1; Visible = -1; Width = 1020; Width = 1020; WindowLeft = 2; WindowLeft = 2; WindowState = 1; WindowState = 1; WindowTop = 2; WindowTop = 2; ; Me
14、thods supported:Methods supported:; Eval (1); Eval (1); GetAcadState (); GetAcadState (); GetInterfaceObject (1); GetInterfaceObject (1); ListArx (); ListArx (); LoadArx (1); LoadArx (1); LoadDVB (1); LoadDVB (1); Quit (); Quit (); RunMacro (1); RunMacro (1); UnloadArx (1); UnloadArx (1); UnloadDVB
15、(1); UnloadDVB (1); Update (); Update (); ZoomAll (); ZoomAll (); ZoomCenter (2); ZoomCenter (2); ZoomExtents (); ZoomExtents (); ZoomPickWindow (); ZoomPickWindow (); ZoomPrevious (); ZoomPrevious (); ZoomScaled (2); ZoomScaled (2); ZoomWindow (2); ZoomWindow (2) 在在Property Property valuesvalues(属属
16、性性)部部份份列列出出了了AutoCADAutoCAD应用用程程序序具具有有ActiveDocumentActiveDocument(活活动的的文文档档)、ApplicationApplication(应用用程程序序的的指指针)、CaptionCaption(标题)、)、FullNameFullName(可(可执行文件名)等属性。行文件名)等属性。 其其中中标记为#VLA-OBJECT # 的的属属性性是是VLAVLA对象象。例例如如,ActiveDocumentActiveDocument(活活动的的文文档档)、Documents Documents (一一般般文文档档)、MenuBar M
17、enuBar ( (菜菜单条条) )、MenuGroups MenuGroups ( (菜菜单组) )和和Preferences Preferences ( (设置置) )这些些对象象属属于于VLAVLA对象象,它它们可可以以被被继续访问,引引出出下下一一级ActiveXActiveX对象,了解它象,了解它们的属性和方法。的属性和方法。 带有有标记(RO)(RO)的的属属性性是是只只读的的,不不能能被被修修改改,例例如如属属性性Caption Caption (RO) (RO) = = AutoCAD AutoCAD 2006 2006 Drawing1.dwgDrawing1.dwg,表表示
18、示AutoCADAutoCAD应用用程程序序的的标题是是AutoCAD AutoCAD 2006 2006 Drawing1.dwgDrawing1.dwg,它是只,它是只读的,不能被修改。的,不能被修改。 在在Methods supported (支持的方法支持的方法)部份列出了可以对过部份列出了可以对过AutoCAD应用程序施加应用程序施加Eval、GetAcadState、GetInterface Object等操作。等操作。 10.2.210.2.2访问其他其他AutoCADAutoCAD对象象 获取取AutoCADAutoCAD应用用程程序序这个个根根对象象之之后后,沿沿着着Auto
19、CADAutoCAD对象象模模型型图,就可以将其作,就可以将其作为起点,逐起点,逐级访问它的下一它的下一级VLAVLA对象。象。 获取取AutoCADAutoCAD应用用程程序序之之外外的的对象象,是是一一个个前前缀为vla-get-vla-get-的的函函数,格式如下:数,格式如下: (vla-get-property objectvla-get-property object) 参参数数objectobject必必须是是VLAVLA对象象,propertyproperty是是objectobject的的VLAVLA对象象类型的属性。型的属性。该属性可通属性可通过vlax-dump-obje
20、ctvlax-dump-object函数函数获得。得。 假假定定本本作作业依依次次绘制制了了一一条条起起点点为(10,20)(10,20)终点点为(60,20)(60,20)的的直直线和和圆心心为(35,20)(35,20)半半径径为2525的的一一个个圆。按按照照以以下下步步骤,可可以以沿沿着着AutoCADAutoCAD对象象模模型型图所所示示的的AutoCADAutoCAD应用用程程序序活活动文文档档模模型空型空间图形形对象的象的顺序,序,访问这条直条直线和和这个个圆。1. 1. 获取取AutoCADAutoCAD应用程序用程序对象象 (setq myacad (vlax-get-aca
21、d-object) (setq myacad (vlax-get-acad-object) ; ;返返回回AutoCADAutoCAD应用用程程序序的的指指针#VLA-OBJECT #00b5e51c,将其,将其赋给变量量myacad myacad 。2. 2. 了解了解AutoCADAutoCAD应用程序的属性用程序的属性 (vlax-dump-object (vlax-dump-object myacad)myacad); ;返返 回回 的的 属属 性性 信信 息息 中中 有有 以以 下下 一一 行行: :;ActiveDocument=# 。ActiveDocument是是AutoCAD
22、应应用用程程序序的的属属性性之之一一,也也是是AutoCAD应应用用程程序的下一级序的下一级VLA对象。对象。 3. 3. 获取活取活动文档程序文档程序对象象 (setq (setq mydoc(vla-get-ActiveDocument mydoc(vla-get-ActiveDocument myacad)myacad); ;返返回回活活动动文文档档的的 指指 针针 #, 将将 其其 赋赋 给给 变变 量量mydoc。 4. 4. 了解活了解活动文档的属性文档的属性(vlax-dump-object mydoc)(vlax-dump-object mydoc)返回的属性信息中有以下一行:
23、返回的属性信息中有以下一行:;ModelSpace ;ModelSpace (RO) (RO) = = #VLA-OBJECT #011c1e04。ModelSpaceModelSpace是活是活动文档的属性之一,也是活文档的属性之一,也是活动文档的下一文档的下一级VLAVLA对象。象。5. 5. 获取模型空取模型空间对象象(setq myms(vla-get-ModelSpace mydoc)(setq myms(vla-get-ModelSpace mydoc)返返回回模模型型空空间的的指指针#VLA-OBJECT #011c1e04,将将其其赋给变量量mymsmyms。 6.6.了解活了
24、解活动文档的属性和方法文档的属性和方法(vlax-dump-object myms t)(vlax-dump-object myms t)返回的属性信息中有以下一行:返回的属性信息中有以下一行:; Count (RO) = 2; Count (RO) = 2。说明明该模型空模型空间当前有两个当前有两个图形形对象。象。返返 回回 的的 方方 法法 信信 息息 中中 有有 Add3DfaceAdd3Dface、 Add3DmeshAdd3Dmesh、 Add3DpolyAdd3Dpoly、 AddArcAddArc、AddAttributeAddAttribute、 AddBox AddBox、A
25、ddCircleAddCircle、ItemItem等等许多方法。多方法。其中其中 Item是根据序号获取图形对象,第一个图形对象的序号为是根据序号获取图形对象,第一个图形对象的序号为0。 7. 7. 获取模型空取模型空间的第一个的第一个图形形对象象(setq myline(vla-item myms 0)(setq myline(vla-item myms 0)返返 回回 第第 一一 个个 图 形形 对 象象 , ,即即 这 条条 直直 线 的的 指指 针 #VLA-OBJECT #IAcadLine 011b9e74,将其,将其赋给变量量mylinemyline。8.8.了解了解这条直条直
26、线的属性和方法的属性和方法(vlax-dump-object myline t)(vlax-dump-object myline t)返回有关返回有关这条直条直线属性的信息如下:属性的信息如下:; Property values:; Property values:; Angle (RO) = 0.0; Angle (RO) = 0.0; Application (RO) = #; Application (RO) = #; Delta (RO) = (50.0 0.0 0.0); Delta (RO) = (50.0 0.0 0.0); Document (RO) = #; Document
27、 (RO) = #; EndPoint = (60.0 20.0 0.0); EndPoint = (60.0 20.0 0.0); Handle (RO) = 81; Handle (RO) = 81; HasExtensionDictionary (RO) = 0; HasExtensionDictionary (RO) = 0; Hyperlinks (RO) = #; Hyperlinks (RO) = #; Layer = 0; Layer = 0; Length (RO) = 50.0; Length (RO) = 50.0; Linetype = ByLayer; Linetyp
28、e = ByLayer; LinetypeScale = 1.0; LinetypeScale = 1.0; Lineweight = -1; Lineweight = -1; Normal = (0.0 0.0 1.0); Normal = (0.0 0.0 1.0); ObjectID (RO) = 2129985160; ObjectID (RO) = 2129985160; ObjectName (RO) = AcDbLine; ObjectName (RO) = AcDbLine; OwnerID (RO) = 2129984760; OwnerID (RO) = 212998476
29、0; PlotStyleName = ByLayer; PlotStyleName = ByLayer; StartPoint = (10.0 20.0 0.0); StartPoint = (10.0 20.0 0.0); Thickness = 0.0; Thickness = 0.0; TrueColor = #; TrueColor = #; Visible = -1; Visible = -1 从从以以上上有有关关这条条直直线属属性性的的信信息息中中,可可以以了了解解到到这条条直直线与与X X轴正正方方向向夹角角为0 0 、三三个个坐坐标的的增增量量分分别是是(50.0 (50.0
30、0.0 0.0 0.0)0.0)、终点点坐坐标是是(60.0 (60.0 20.0 20.0 0.0)0.0)、句句柄柄是是8181、所所在在图层的的名名字字是是00、长度度为50.050.0、线型型名名是是ByLayerByLayer、线型型比比例例为1.01.0、线宽为-1-1(默默认)、厚厚度度方方向向为(0.0 (0.0 0.0 0.0 1.0)1.0)、打打印印样式式名名是是ByLayerByLayer、起点坐、起点坐标是是(10.0 20.0 0.0)(10.0 20.0 0.0)、厚度、厚度为 0.0 0.0。返回返回这条直条直线的有关方法的信息如下:的有关方法的信息如下:; M
31、ethods supported:; Methods supported:; ArrayPolar (3); ArrayPolar (3); ArrayRectangular (6); ArrayRectangular (6); Copy (); Copy (); Delete (); Delete (); GetBoundingBox (2); GetBoundingBox (2); GetExtensionDictionary (); GetExtensionDictionary (); GetXData (3); GetXData (3); Highlight (1); Highligh
32、t (1); IntersectWith (2); IntersectWith (2); Mirror (2); Mirror (2); Mirror3D (3); Mirror3D (3); Move (2); Move (2); Offset (1); Offset (1); Rotate (2); Rotate (2); Rotate3D (3); Rotate3D (3); ScaleEntity (2); ScaleEntity (2); SetXData (2); SetXData (2); TransformBy (1); TransformBy (1); Update ();
33、Update () 从从以以上上有有关关这个个圆有有关关方方法法的的信信息息中中,可可以以了了解解到到对这个个圆可可以以施施加加ArrayPolarArrayPolar(环形形阵列列)、ArrayRectangularArrayRectangular(矩矩形形阵列列)、CopyCopy(复复制制)、DeleteDelete(删除除)、 GetBoundingBoxGetBoundingBox ( (包包容容盒盒) )、GetExtensionDictionaryGetExtensionDictionary ( (获取取延延长方方向向) )、GetXDataGetXData ( (获取取扩展展数
34、数据据) )、HighlightHighlight ( (高高亮亮显示示) )、IntersectWithIntersectWith( (交交点点) )、MirrorMirror( (镜像像) )、Mirror3DMirror3D( (三三维镜像像) )、MoveMove( (平平移移) )、OffsetOffset( (等等距距) )、RotateRotate( (旋旋转) )、Rotate3DRotate3D( (三三维旋旋转) )、ScaleEntityScaleEntity( (比比例例缩 放放 ) )、 SetXDataSetXData( (设 置置 扩 展展 数数 据据 ) )、
35、TransformByTransformBy( (变 换 ) )、UpdateUpdate( (更新更新) )这些操作。些操作。9. 9. 获取模型空取模型空间的第二个的第二个图形形对象象 (setq mycircle(vla-item myms 1) (setq mycircle(vla-item myms 1) 返返回回第第二二个个图形形对象象, ,即即圆的的指指针#VLA-OBJECT #011bed74,将其,将其赋给变量量mylinemyline。10. 10. 了解了解这个个圆的属性和方法的属性和方法(vlax-dump-object mycircle t)(vlax-dump-o
36、bject mycircle t) 返返回回有有关关这个个圆的的属属性性信信息息中中大大部部分分与与直直线相相同同,不不同同的的部部份份有有AreaArea(面面积)= = 1963.51963.5、 CenterCenter(圆心心)= = (35.0 (35.0 20.0 20.0 0.0)0.0)、CircumferenceCircumference(周周长)= = 157.08157.08、DiameterDiameter(直直径径)= = 50.050.0和和RadiusRadius(半径)(半径)= 25.0= 25.0。 返回有关返回有关这个个圆的方法信息中与直的方法信息中与直线
37、完全相同。完全相同。10.2.3 10.2.3 使用使用检验工具了解工具了解AutoCADAutoCAD对象的属性象的属性 上上一一节介介绍了了通通过函函数数了了解解AutoCADAutoCAD对象象和和这些些对象象的的属属性性与与方法,本方法,本节介介绍利用利用检验工具了解工具了解AutoCADAutoCAD对象的属性。象的属性。 按按照照上上一一节的的顺序序用用检验工工具具了了解解AutoCADAutoCAD应用用程程序序、活活动文文档、模型空档、模型空间和和图形形对象的步象的步骤如下:如下:1.1.获取取AutoCADAutoCAD应用程序用程序对象象 (setq myacad (vla
38、x-get-acad-object) (setq myacad (vlax-get-acad-object) 返返回回AutoCADAutoCAD应用用程程序序的的指指针#VLA-OBJECT #IAcadApplication 00b5e51c,将其,将其赋给变量量myacad myacad 。2.2.了解了解AutoCADAutoCAD应用程序用程序对象象 要了解要了解VLA对象的属性,首先选取择指向该对象的变量。选对象的属性,首先选取择指向该对象的变量。选取取myacad,然后单击按钮,将弹出,然后单击按钮,将弹出图图10-2 所示所示AutoCAD应用应用程序的检验窗口。程序的检验窗口
39、。 图图10-2 AutoCAD应用程序的检验窗口应用程序的检验窗口3.3.了解活了解活动文档的属性文档的属性 双击上图所示双击上图所示AutoCAD应用程序的检验窗口的应用程序的检验窗口的Active Document属性,将弹出图属性,将弹出图10-3所示活动文档的检验窗口。所示活动文档的检验窗口。 图图10-3 活动文档的检验窗口活动文档的检验窗口4.4.了解模型空了解模型空间的属性的属性 双击活动文档的检验窗口的双击活动文档的检验窗口的ModelSpace属性,将弹出图属性,将弹出图10-4所示模型空间检验窗口。在该窗口可以看到属性所示模型空间检验窗口。在该窗口可以看到属性Count的
40、值为的值为2,说明在模型空间当前有两个图形对象。,说明在模型空间当前有两个图形对象。 图图10-4 模型空间检验窗口模型空间检验窗口5.5.了解直了解直线的属性的属性 由由于于模模型型空空间的的检验窗窗口口没没有有直直线的的VLAVLA对象象,所所以以必必须以以下下表达式表达式获取取这条直条直线的的VLAVLA对象。象。(setq myacad (vlax-get-acad-object)(setq myacad (vlax-get-acad-object)(setq mydoc(vla-get-ActiveDocument myacad)(setq mydoc(vla-get-ActiveD
41、ocument myacad)(setq myms(vla-get-ModelSpace mydoc)(setq myms(vla-get-ModelSpace mydoc)(setq myline(vla-item myms 0)(setq myline(vla-item myms 0) 以上表达式获取了这条直线的以上表达式获取了这条直线的VLA对象的指针,并将其赋给对象的指针,并将其赋给了了myline变量。选取变量。选取myline,然后单击按钮,然后单击按钮 ,将弹出图,将弹出图10-5所示这条直线的检验窗口。所示这条直线的检验窗口。 图图10-5 直线的检验窗口直线的检验窗口 6.6
42、.了解了解圆的属性的属性 同同样的理由,必的理由,必须以下表达式以下表达式获取取这个个圆的的VLAVLA对象。象。 (setq mycircle(vla-item myms 1) (setq mycircle(vla-item myms 1)图图10-6 圆的检验窗口圆的检验窗口 以上表达式获取了这个圆的对以上表达式获取了这个圆的对象的指针,并将其赋给了象的指针,并将其赋给了mycircle变量。选取变量。选取mycircle,然后单击按钮然后单击按钮 ,将弹出图,将弹出图10-6所示这个圆的检验窗口。所示这个圆的检验窗口。 不难看出,用检验窗口显示有不难看出,用检验窗口显示有关关VLA对象的
43、属性,与对象的属性,与10.2.1节节通过通过vlax-dump-object函数显示函数显示有关有关VLA对象的属性基本相同。对象的属性基本相同。 10.2.410.2.4通通过HelpHelp功能了解功能了解AutoCADAutoCAD对象象通通过HelpHelp功能了解功能了解AutoCADAutoCAD对象的步象的步骤是:是: 在在VLISPVLISP环境下,按功能境下,按功能键F1F1; 在在随随后后显示示的的AutoCAD AutoCAD 2006 2006 Help:Developer Help:Developer DocumentationDocumentation对话框框的的
44、目目录选项卡内双卡内双击 ;在展开的目在展开的目录树上双上双击 ;在在ObjectsObjects目目录下下双双击AutoCADAutoCAD图形形对象象,例例如如双双击 ,即即可可显示示图10107 7所示有关直所示有关直线对象方法和属性的信息。象方法和属性的信息。图图107有关直线对象方法和属性的帮助信息有关直线对象方法和属性的帮助信息 以以上上帮帮助助信信息息告告诉用用户创建建一一条条直直线用用AddlineAddline方方法法,编辑直直线用第一列用第一列显示的各种方法,第二列示的各种方法,第二列显示了直示了直线的全部属性。的全部属性。 至至此此已已介介绍了了了了解解AutoCADAu
45、toCAD对象象的的属属性性通通过帮帮助助功功能能显示示的的不不难看看出出,用用检验窗窗口口显示示有有关关VLAVLA对象象的的属属性性,与与10.210.2节通通过vlax-dump-objectvlax-dump-object函数函数显示有关示有关VLAVLA对象的属性基本相同。象的属性基本相同。10.3 10.3 在在Visual LISPVisual LISP函数中使用函数中使用ActiveXActiveX方法方法10.3.110.3.1通通过HelpHelp功能功能详细了解了解AutoCADAutoCAD图形形对象的方法象的方法 上上一一节的的帮帮助助功功能能和和10.210.2节的
46、的vlax-dump-objectvlax-dump-object函函数数都都提提供供了了AutoCADAutoCAD图形形对象象的的方方法法,但但这只只是是一一些些方方法法的的名名称称,下下面面以以了了解解创建建一一条条直直线的的AddlineAddline方方法法为例例,介介绍详细了了解解AutoCADAutoCAD图形形对象的方法。象的方法。 双双击图10107 7所所示示有有关关直直线对象象帮帮助助信信息息中中的的蓝色色带下下划划线的的超文本超文本AddlineAddline,显示有关示有关创建直建直线的的语法,法,见图10108 8。图图108创建直线的语法创建直线的语法 对于于Vi
47、sual Visual LISPLISP的的用用户来来说,该语法法很很陌陌生生,因因为它它是是为Visual Visual BasicBasic用用户定定义的的。在在Visual Visual BasicBasic环境境下下,AddLineAddLine的的语法定法定义如下:如下:RetVal = object. AddLine(StarPoint,EndPoint)RetVal = object. AddLine(StarPoint,EndPoint) 其其中中objectobject是是模模型型空空间、图纸空空间或或图块对象象的的集集合合,StarPointStarPoint、EndPoi
48、ntEndPoint是是VariantVariant(3 3个个双双精精度度类型型元元素素组成成的的变体)的数据体)的数据类型,返回型,返回值是直是直线对象。象。因因此此确确定定Visual Visual LISPLISP函函数数的的创建建直直线的的方方法法还需需要要做做以以下下两两件件事:事: (1 1)将)将Visual BasicVisual Basic环境下的境下的语句改写句改写为AutoLISPAutoLISP表达式。表达式。 (2)将)将AutoLISP的数据转换为的数据转换为ActiveX所需类型的数据。所需类型的数据。 10.3.2 10.3.2 将将Visual BasicV
49、isual Basic环境下的境下的语句改写句改写为AutoLISPAutoLISP表达式表达式 先分析先分析Visual BasicVisual Basic环境下的境下的语句:句: RetVal = object.AddLine(StartPoint,EndPoint) RetVal = object.AddLine(StartPoint,EndPoint)RetValRetVal是是返返回回值,objectobject是是AddLineAddLine的的上上一一级对象象,StartPointStartPoint和和EndPointEndPoint是是AddLineAddLine函数的参数。
50、函数的参数。 在在VLISP ActiveX环境下,模型空间是直线对象的上一级对环境下,模型空间是直线对象的上一级对象,模型空间对象作为象,模型空间对象作为AddLine的第一个参数,的第一个参数,StartPoint和和EndPoint作为作为AddLine 的其余参数。返回值赋给变量的其余参数。返回值赋给变量myline。 valx-3d-point是是VLISP ActiveX的函数,其功能是将的函数,其功能是将AutoLISP的的3维点转换为维点转换为ActiveX要求的变体类型的数据。要求的变体类型的数据。 采用采用AutoLISPAutoLISP表达式表达式为: (setq (se
51、tq myline(vla-addline myline(vla-addline myms myms (vlax-3d-point (vlax-3d-point (10 (10 20) 20) (vlax-3d-(vlax-3d-point (80 30) point (80 30) 其中其中mymsmyms是模型空是模型空间对象的指象的指针,获取取该指指针的表达式如下:的表达式如下: (setq myacad (vlax-get-acad-object) (setq myacad (vlax-get-acad-object) (setq mydoc(vla-get-ActiveDocumen
52、t myacad) (setq mydoc(vla-get-ActiveDocument myacad) (setq myms(vla-get-ModelSpace mydoc) (setq myms(vla-get-ModelSpace mydoc) vlax-3d-pointvlax-3d-point是是VLISP VLISP ActiveXActiveX的的函函数数,其其功功能能是是将将AutoLISPAutoLISP的的2 2维或或3 3维点点转换为ActiveXActiveX要求的要求的变体体类型的数据。型的数据。 二者的转换关系见图二者的转换关系见图10-9。 图图10-9 Vis
53、ual Basic环境下的语句与环境下的语句与AutoLISP表达式的对应关系表达式的对应关系 整数整数 实数数 字符串字符串 VLA VLA对象象 变体体 安全数安全数组 :vlax_true:vlax_false :vlax_true:vlax_false单字字节字符字符 + +布布尔尔类型型 + +整数整数 + +长整数整数 + +单精度精度实数数 + + + +双精度双精度实数数 + + + +对象象 + +字符串字符串 + +变体体 + +数数组 + +10.3.3 ActiveX能够自动进行转换的能够自动进行转换的AutoLISP的一些数据类型的一些数据类型 AutoLISP和和A
54、ctiveX有些数据类型的定义是类似的,当有些数据类型的定义是类似的,当ActiveX遇到这样类遇到这样类型的数据时,能够自动进行转换。表型的数据时,能够自动进行转换。表10-1所示为所示为ActiveX要求的数据类型和要求的数据类型和Auto LISP数据类型的关系表。表的第数据类型的关系表。表的第1列为列为ActiveX要求的数据类型,表的第要求的数据类型,表的第1行为行为AutoLISP的数据类型。如果表格的交叉处有加号的数据类型。如果表格的交叉处有加号(+),表示这样的,表示这样的ActiveX数据数据类型时可以直接使用相应的类型时可以直接使用相应的AutoLISP数据类型。数据类型。
55、 表表10-1 AutoLISP数据类型和数据类型和ActiveX数据类型的关系数据类型的关系 10.3.4 VLISP10.3.4 VLISP扩充的数据充的数据类型型 为了了实现ActiveXActiveX的的功功能能,VLISPVLISP扩充充了了一一些些数数据据类型型,这些些数数据据类型是以前型是以前AutoLISPAutoLISP所没有的。所没有的。1. 1. 变体(体(variantvariant) 要要想想使使用用ActiveXActiveX方方法法,就就必必须遵遵守守它它的的数数据据声声明明的的规则。对于于数数量量、高高度度、半半径径这些些数数据据ActiveXActiveX允允
56、许AutoLISPAutoLISP使使用用整整型型或或实型型的的数数据据,它它可可以以自自动将将其其转换为长整整数数或或双双精精度度的的数数据据类型型,见表表10-110-1。对于于起起点点、终点点、圆心心这些些数数据据必必须经过必必要要的的转换,才能才能为ActiveXActiveX所用。所用。 变体体实质上上是是自自定定义的的数数据据结构构,它它可可以以包包括括不不同同类型型的的数数据据。例例如如字字符符串串、整整数数和和数数组都都可可以以表表示示为变体体。变体体的的主主要要特特点点是是数数据据的的类型型和和值存存放放在在一一起起。这种种自自定定义的的特特点点,在在向向ActiveXAct
57、iveX服服务器器传递参参数数时非非常常有有用用,因因为它它使使得得基基于于任任何何语言言的的服服务器器都能理解都能理解这样的数据。的数据。(1 1)创建建变体体 创建建变体用体用vlax-make-variantvlax-make-variant函数,函数,调用的格式如下:用的格式如下: (vlax-make-variant (vlax-make-variant 值 类型型) 如如果果省省略略参参数数的的值和和类型型,创建建的的变体体将将为vlax-vbEmptyvlax-vbEmpty类型型(未未初初始始化化)。类型型是是指指变体体的的类型型,见表表10-210-2。表表示示变体体的的类型
58、型时,可可以以用用它它的的值,如如整整型型用用2 2,也也可可以以用用预定定义的的类型型常常量量,如如vlax-vbIntegervlax-vbInteger,最最好好用用预定定义的的类型型常常量量,因因为在后在后续的的AutoCADAutoCAD版本中版本中类型的型的值可能会有可能会有变化。化。 该函数返回的函数返回的值为所所创建的建的变体。体。 如果省略参数类型,该函数根据如果省略参数类型,该函数根据LISP数据值的类型来确定数据值的类型来确定默认的默认的ActiveX数据类型,见表数据类型,见表10-3。 类型型 值 含含义Vlax-vbEmpty Vlax-vbEmpty 预定定义的的
59、变体体0 0 未初始化(默未初始化(默认值)Vlax-vbNull 1 Vlax-vbNull 1 空数据空数据Vlax-vbInteger 2 Vlax-vbInteger 2 整数型整数型Vlax-vbLong 3 Vlax-vbLong 3 长整数型整数型Vlax-vbSingle 4 Vlax-vbSingle 4 单精度浮点数精度浮点数Vlax-vbDouble 5 Vlax-vbDouble 5 双精度浮点数双精度浮点数Vlax-vbString 8 Vlax-vbString 8 字符串字符串Vlax-vbObject 9 Vlax-vbObject 9 对象象Vlax-vbBo
60、olean 11 Vlax-vbBoolean 11 布布尔尔值Vlax-vbArray 8192 Vlax-vbArray 8192 数数组表表10-2 10-2 预定定义的的变体体类型及其含型及其含义LISPLISP数据数据值的的类型型 默默认的数据的数据类型型Nil vlax-vbEmptyNil vlax-vbEmptyvlax-null vlax-vbNullvlax-null vlax-vbNullInteger vlax-vbLongInteger vlax-vbLongReal vlax-vbDoubleReal vlax-vbDoubleString vlax-vbStrin
61、gString vlax-vbStringVLA-object vlax-vbObjectVLA-object vlax-vbObjectvlax-truevlax-true、vlax-false vlax-vbBooleanvlax-false vlax-vbBooleanVariant Variant 与初始与初始值的的类型相同型相同vlax-make-safearray vlax-vbArrayvlax-make-safearray vlax-vbArray表表10-3 LISP数据类型与默认的数据类型与默认的ActiveX数据类型对照表数据类型对照表 以下是一些以下是一些创建建变体的表
62、达式:体的表达式: (setq (setq varnil(vlax-make-variant)varnil(vlax-make-variant); ;返返回回#variant #0,创建建了未初始化的了未初始化的变体,体,变体的体的类型型为0 0即即vlax-vbEmptyvlax-vbEmpty,值为nilnil。 (setq varint (vlax-make-variant 50 vlax-vbInteger) (setq varint (vlax-make-variant 50 vlax-vbInteger); ;返返回回#variant #50,创建建了了整整型型变体体,变体体的的类
63、型型为2 2即即vlax-vlax-vbIntegervbInteger,值为5050。 (setq (setq varlng(vlax-make-variant varlng(vlax-make-variant 5)5); ;返返回回#variant #5,创建了建了长整型整型变体,体,变体的体的类型型为3 3即即vlax-vbLongvlax-vbLong,值为5 5。 (setq (setq varstr(vlax-make-variant varstr(vlax-make-variant tsinghua)tsinghua); ;返返 回回#variant #tsinghua,创建建了
64、了字字符符串串类型型的的变体体,变体体的的类型型为8 8即即vlax-vbStringvlax-vbString,值为tsinghuatsinghua。(2 2)了解)了解变体的数据体的数据类型型了了解解变体体的的数数据据类型型用用vlax-variant-typevlax-variant-type函函数数,返返回回变体体的的数数据据类型型见表表10-210-2。调用的格式如下:用的格式如下:(vlax-variant-type varnil(vlax-variant-type varnil变体体类型的数据型的数据) )例如例如(vlax-variant-type varnil) (vlax-
65、variant-type varnil) ;返回;返回nilnil(vlax-variant-type varint) (vlax-variant-type varint) ;返回;返回2 2即即vlax-vbIntegervlax-vbInteger(vlax-variant-type varstr) (vlax-variant-type varstr) ;返回;返回8 8即即vlax-vbStringvlax-vbString(3 3)了解)了解变体的体的值了解了解变体的体的值用用vlax-variant-valuevlax-variant-value函数,函数,调用的格式如下:用的格式如
66、下:(vlax-variant-value (vlax-variant-value 变体体类型的数据型的数据) )例如例如(vlax-variant-value varnil) (vlax-variant-value varnil) ;返回;返回nilnil(vlax-variant-value varint) (vlax-variant-value varint) ;返回;返回5050(vlax-variant-value varstr) (vlax-variant-value varstr) ;返回;返回tsinghuatsinghua(4 4)改)改变变体的数据体的数据类型型 改改变变体
67、体的的数数据据类型型用用vlax-variant-change-typevlax-variant-change-type函函数数,数数据据类型型见表表10-210-2,返返回回转换为指指定定变体体类型型后后的的值,如如果果不不能能将将varvar转换为指指定定类型型,则返回返回nilnil。调用的格式如下:用的格式如下:(vlax-variant-change-type (vlax-variant-change-type 变体体类型的数据型的数据 新新类型型) ) 例如,将名例如,将名为varintvarint的的变量的量的值设为变体:体:(setq varint (vlax-make-var
68、iant 5) (setq varint (vlax-make-variant 5) ; ;返回返回# 将将名名为 varintstr varintstr 的的变量量设置置为 varint varint 中中包包含含的的值,但但将将该值转换为字字符串:符串:(setq (setq varintStr varintStr (vlax-variant-change-type (vlax-variant-change-type varint varint vlax-vbstring) vlax-vbstring) ; ;返回返回#检查 varintstr varintstr 的的值:_$ (vlax
69、-variant-value varintStr) _$ (vlax-variant-value varintStr) ; ;返回返回55这说明明 varintstr varintstr 中确中确实包含字符串。包含字符串。2. 2. 安全数安全数组 在在VLISPVLISP中中,有有可可能能与与一一些些强强制制数数据据类型型的的编译型型应用用程程序序进行行数数据据交交换,而而这样的的程程序序不不可可能能直直接接接接受受AutoLISPAutoLISP特特有有的的表表的的数数据据类型型,比比如如ActiveXActiveX,为了解决了解决这个矛盾,个矛盾,VLISPVLISP设立了安全数立了安全
70、数组这一数据一数据类型。型。安安全全数数组是是一一种种特特殊殊的的数数组。它它限限制制了了不不能能在在数数组的的边界界之之外外赋值,因因此此不会引起数据异常,所以不会引起数据异常,所以这类数数组是安全的。是安全的。(1 1)创建安全数建安全数组 创建安全数建安全数组用用vlax-make-safearrayvlax-make-safearray函数,函数,调用的格式如下:用的格式如下:(vlax-make-safearray (vlax-make-safearray 类型型 ( (下限下限 . . 上限上限) () (下限下限 . . 上限上限).).)该函函数数要要求求至至少少有有两两个个参
71、参数数,第第一一个个参参数数是是确确定定该数数组中中元元素素的的数数据据类型型,可确定的数据可确定的数据类型及其型及其预定定义的数据的数据类型如表型如表10-410-4所示。所示。表表10-4 可作为安全数组的预定义的数据类型可作为安全数组的预定义的数据类型 预定定义的的变体体类型型 值 含含 义vlax-vbInteger 2 vlax-vbInteger 2 整数整数Vlax-vbLong 3 Vlax-vbLong 3 长整数整数Vlax-vbSingle 4 Vlax-vbSingle 4 单精度浮点数精度浮点数Vlax-vbDouble 5 Vlax-vbDouble 5 双精度浮点
72、数双精度浮点数Vlax-vbString 8 Vlax-vbString 8 字符串字符串Vlax-vbObject 9 Vlax-vbObject 9 对象象Vlax-vbBoolean 11 Vlax-vbBoolean 11 布布尔尔类型型Vlax-vbVariant 12 Vlax-vbVariant 12 变体体 由由于于它它们的的值在在AutoCADAutoCAD以以后后的的版版本本中中可可能能会会作作修修改改,所所以以应该使使用用预定定义的常量,而不要直接使用常量所的常量,而不要直接使用常量所对应的数的数值。 该函函数数的的其其他他参参数数如如,(下下限限 . . 上上限限) )
73、 (下下限限 . . 上上限限).).,为确确定定数数组每每维的的上上下下限限。其其中中第第一一个个点点对确确定定第第一一维的的上上下下限限,余余类推推。下下限限可可为0 0或或任任何何正正负整整数数。不不同同的的维可可以以有有不不同同的的边界界。该函函数数可可创建建最最多多1616维的数的数组。 返回返回值为创建的安全数建的安全数组。 以下是一些以下是一些创建安全数建安全数组的表达式:的表达式: (setq (setq p1 p1 (vlax-make-safearray (vlax-make-safearray vlax-vbDouble vlax-vbDouble (0 (0 . . 2
74、) 2) ;返返回回#,该例例创建建一一个个名名字字为p1p1的的一一维数数组,下下限限标为0 0,上上限限为2 2,所以,所以该数数组可以存可以存储三个数据三个数据为双精度的双精度的实数。数。 (setq (setq mt2(vlax-make-safearray mt2(vlax-make-safearray vlax-vbString vlax-vbString (0 (0 . . 1) 1) (1 (1 . . 3)3);返返回回#,创建建一一个个名名字字为mt2mt2的的二二维字字符符串串数数组,第第一一维下下限限为0 0,上限,上限为1 1,包括两个元素,第二,包括两个元素,第二维
75、下限下限为1 1,上限,上限为3 3包括三个元素。包括三个元素。新创建的数组中的元素按如表新创建的数组中的元素按如表10-5所示方式初始化。所示方式初始化。 表表10-5 新创建的数组中的元素初始化方式新创建的数组中的元素初始化方式 数据数据类型型 初始初始值数数值 0 0字符串字符串 零零长度字符串。度字符串。布布尔尔值 vlax-false vlax-false 对象象 nil nil 变体体 未初始化未初始化 (vlax-vbEmpty) (vlax-vbEmpty)(2 2)为整个安全数整个安全数组赋值 为整整个个安安全全数数组赋值用用vlax-safearray-fillvlax-s
76、afearray-fill函函数数,调用用的的格格式如下:式如下:(vlax-safearray-fill (vlax-safearray-fill 变量量 数数值表表) ) 参参数数变量量必必须是是安安全全数数组类型型的的变量量,数数值表表是是数数值类型型的的表表 , 表表 的的 长 度度 必必 须 等等 于于 数数 组 元元 素素 的的 个个 数数 。 该 函函 数数 返返 回回#。 例例如如,已已创建建了了一一个个名名字字为p1p1的的一一维数数组,下下限限为0 0,上上限限为2 2,所所存存数数据据为双双精精度度实数数。用用vlax-safearray-fillvlax-safearr
77、ay-fill函函数数填填满该数数组:(vlax-safearray-fill p1 (1 2 3)(vlax-safearray-fill p1 (1 2 3); ;返回返回# 如如果果赋值的的元元素素的的数数目目与与数数组所所包包含含元元素素的的数数目目不不等等,vlax-safearray-fillvlax-safearray-fill函数返回出函数返回出错信息。例如:信息。例如: (vlax-safearray-fill (vlax-safearray-fill p1 p1 (1 (1 2 2 3 3 4) 4) ;返返回回 error: error: vlax-vlax-safear
78、ray-fill safearray-fill failed. failed. Invalid Invalid initialization initialization list. list. 错误:函函数数失失败,无效的,无效的设置初置初值的表。的表。 对于于多多维数数组,数数值表表必必须为表表的的列列表表,其其中中每每个个表表对应于于数数组中中的的一一维。例例如如已已创建建了了一一个个名名字字为mt2mt2的的二二维字字符符串串数数组,第第一一维下下限限为0 0,上上限限为1 1,包包括括两两个个元元素素,第第二二维下下限限为1 1,上上限限为3 3包包括括三三个个元元素素。用用vlax
79、-safearray-fillvlax-safearray-fill函函数数填填满该数数组:(vlax-safearray-fill (vlax-safearray-fill mt2 mt2 (a (a b b c) c) (d (d e e f) f) ; ;返回返回#(3 3)列出安全数)列出安全数组的内容的内容 列出安全数列出安全数组的内容用的内容用vlax-safearray-listvlax-safearray-list函数,函数,调用的格式如下:用的格式如下:(vlax-safearray-list (vlax-safearray-list 安全数安全数组) )例如例如(vlax-
80、safearray-list p1) (vlax-safearray-list p1) ; ;返回返回(1.0 2.0 3.0)(1.0 2.0 3.0)(vlax-safearray-list mt2) (vlax-safearray-list mt2) ; ;返回返回(a b c) (d e f)(a b c) (d e f)(4 4)为安全数安全数组内指定的元素内指定的元素赋值 为安安全全数数组内内指指定定的的元元素素赋值用用vlax-safearray-put-elementvlax-safearray-put-element函函数数,调用用的格式如下:的格式如下:(vlax-safe
81、array-put-element (vlax-safearray-put-element 变量量 索引索引 .) .) 参参数数变量量的的类型型为SafeArraySafeArray的的变量量;对于于一一维数数组,应指指定定一一个个索索引引值,对于于二二维数数组,应指指定定两两个个索索引引值,依依此此类推推;值是是赋给安安全全数数组内内指指定定的的元素元素的元素元素的值;返回指定;返回指定给数数组元素的元素的值。例例如如,已已创建建了了名名字字为p1p1的的由由双双精精度度数数据据构构成成的的一一维数数组,数数组的的下下界界为0 0,上界,上界为2 2。用。用vlax-safearray-p
82、ut-elementvlax-safearray-put-element填填满该数数组:(vlax-safearray-put-element (vlax-safearray-put-element p1 p1 0 0 10)10);返返回回1010,将将数数组组p1p1的的第第1 1个个元元素素赋赋值值为为10(vlax-safearray-put-element 10(vlax-safearray-put-element p1 p1 1 1 20)20);返返回回2020,将将数数组组p1p1的的第第2 2个个元元素素赋赋值值为为20(vlax-safearray-put-element
83、20(vlax-safearray-put-element p1 p1 2 2 30)30);返返回回3030,将将数数组组p1p1的的第第3 3个个元元素素赋赋值值为为3030调调用用 vlax-safearray-list vlax-safearray-list 函函数数确确认认p1p1的的内内容容:返返回回(10.0 (10.0 20.0 20.0 30.0) 30.0) 对于于二二维数数组,应指指定定两两个个索索引引值。例例如如已已创建建了了名名字字为mt2mt2的的由由字字符符串串构构成成的的二二维数数组,第第一一维下下限限为0 0,上上限限为1 1,包包括括两两个个元元素素,第二第
84、二维下限下限为1 1,上限,上限为3 3包括三个元素。包括三个元素。每个每个维的下界的下界为1 1,上界,上界为2 2。用。用vlax-safearray-put-elementvlax-safearray-put-element填填满该数数组:(vlax-safearray-put-element mt2 0 1 a1)(vlax-safearray-put-element mt2 0 1 a1);返回;返回a1a1(vlax-safearray-put-element mt2 0 2 b2)(vlax-safearray-put-element mt2 0 2 b2);返回;返回b2b2(
85、vlax-safearray-put-element mt2 0 3 c3)(vlax-safearray-put-element mt2 0 3 c3);返回;返回c3c3(vlax-safearray-put-element mt2 1 1 d4)(vlax-safearray-put-element mt2 1 1 d4);返回;返回d4d4(vlax-safearray-put-element mt2 1 2 e5)(vlax-safearray-put-element mt2 1 2 e5);返回;返回e5e5(vlax-safearray-put-element mt2 1 3 f
86、6)(vlax-safearray-put-element mt2 1 3 f6);返回;返回f6f6调用用 vlax-safearray-list vlax-safearray-list 函数确函数确认mt2mt2的内容:的内容:(vlax-safearray-list mt2)(vlax-safearray-list mt2);返回;返回(a1 b2 c3) (d4 e5 f6)(a1 b2 c3) (d4 e5 f6)(5 5)在)在变体中使用安全数体中使用安全数组 安安全全数数组的的数数据据必必须用用变体体传给ActiveXActiveX。如如果果需需要要为一一个个数数组创建建一一个个
87、变体体,就就必必须先先创建建数数组再再转换成成变体体。例例如如创建建一个包含一个包含5 5个双精度个双精度实数数数数组的的变体的步体的步骤如下:如下: 给数数组分配空分配空间(setq a5(vlax-make-safearray vlax-vbDouble (0 . 4) (setq a5(vlax-make-safearray vlax-vbDouble (0 . 4) 给数数组赋值(vlax-safearray-fill a5 (1.1 2.2 3.3 4.4 5.5) (vlax-safearray-fill a5 (1.1 2.2 3.3 4.4 5.5) 将数将数组存存储到到变体体
88、(setq (setq vara5 vara5 (vlax-make-variant (vlax-make-variant a5) a5) ;返返回回#variant #.这样变量量vara5vara5就是一个包含具有就是一个包含具有5 5个双精度个双精度实数的数数的数组的的变体。体。(6 6)用函数)用函数vlax-3d-pointvlax-3d-point来来创建建ActiveXActiveX要求的三要求的三维点点 用用vlax-3d-pointvlax-3d-point函数可以将函数可以将3 3个数字的表个数字的表转换为三三维点。点。调用的格式如下:用的格式如下:(vlax-3d-poi
89、nt (vlax-3d-point 三三维点表、二点表、二维点表、点表、3 3个数字或个数字或2 2个数字个数字) ) 例如以下表达式都可以将例如以下表达式都可以将创建建ActiveXActiveX要求的三要求的三维点点赋给变量量CircleCenterCircleCenter。 (setq (setq CircleCenter CircleCenter (vlax-3d-point (vlax-3d-point (12.5 (12.5 10 10 0)0);返返回回#variant #. (setq (setq CircleCenter CircleCenter (vlax-3d-point
90、 (vlax-3d-point (12.5 (12.5 10 10 );返返回回#variant #. (setq (setq CircleCenter CircleCenter (vlax-3d-point (vlax-3d-point 12.5 12.5 10 10 0)0);返返回回#variant #. (setq CircleCenter (vlax-3d-point 12.5 10) (setq CircleCenter (vlax-3d-point 12.5 10);返回;返回# 也可也可传给 vlax-3d-point vlax-3d-point 两个或三个数(而不是表),例如
91、:两个或三个数(而不是表),例如:如如果果省省略略参参数数中中的的第第三三个个数数(即即点点的的 Z Z 坐坐标),vlax-3d-pointvlax-3d-point函函数数将将其其设置置为0 0。用用vlax-safearray-listvlax-safearray-list函数函数验证用用vlax-3d-pointvlax-3d-point函数函数设置的置的变量的内容:量的内容:(vlax-safearray-list (vlax-variant-value circcenter);返回;返回(12.5 10.0 0.0) 10.3.5 AutoCAD10.3.5 AutoCAD实体名和
92、实体名和VLAVLA对象之间的转换对象之间的转换1. 1. 将将AutoCADAutoCAD实体名转换为实体名转换为VLAVLA对象对象 函函数数vlax-ename-vla-objectvlax-ename-vla-object可可以以将将AutoCADAutoCAD实实体体名名转转换换为为VLAVLA对象。调用格式如下:对象。调用格式如下: (vlax-ename-vla-object AutoCAD (vlax-ename-vla-object AutoCAD实体名体名) ) 返回返回值为VLAVLA对象。象。 例如,以下表达式获取了当前作业的第一个图形对象的图元名:例如,以下表达式获取
93、了当前作业的第一个图形对象的图元名: (setq e1(entnext) (setq e1(entnext) ;返回;返回调用调用vlax-ename-vla-objectvlax-ename-vla-object函数将该图元名转换成函数将该图元名转换成VLAVLA对象:对象: (setq (setq vla-object(vlax-ename-vla-object vla-object(vlax-ename-vla-object e1) e1) ; 返返 回回#2. 2. 将将VLAVLA图形对象转换为图形对象转换为AutoCADAutoCAD实体名实体名 函函数数vlax-vla-obje
94、ct-enamevlax-vla-object-ename可可以以将将VLAVLA对对象象转转换换为为AutoCADAutoCAD实体名。调用格式如下:实体名。调用格式如下: (vlax-vla-object-ename VLA (vlax-vla-object-ename VLA图形形对象象) ) 返回返回值为AutoCADAutoCAD实体名。体名。 例例如如,vla-objectvla-object是是标标识识一一个个图图形形对对象象的的VLA VLA 对对象象,以以下下表表达式可以将该达式可以将该VLAVLA对象转换为对象转换为AutoCADAutoCAD实体名:实体名: (setq
95、(setq new-ename(vlax-vla-object-ename new-ename(vlax-vla-object-ename vla-object) vla-object) ;返回;返回2. 2. 将将VLAVLA图形对象转换为图形对象转换为AutoCADAutoCAD实体名实体名 函函数数vlax-vla-object-enamevlax-vla-object-ename可可以以将将VLAVLA对对象象转转换换为为AutoCADAutoCAD实体名。调用格式如下:实体名。调用格式如下: (vlax-vla-object-ename VLA (vlax-vla-object-en
96、ame VLA图形形对象象) ) 返回返回值为AutoCADAutoCAD实体名。体名。 例例如如,vla-objectvla-object是是标标识识一一个个图图形形对对象象的的VLA VLA 对对象象,以以下下表表达式可以将该达式可以将该VLAVLA对象转换为对象转换为AutoCADAutoCAD实体名:实体名: (setq (setq new-ename(vlax-vla-object-ename new-ename(vlax-vla-object-ename vla-object) vla-object) ;返回;返回 假假定定以以(100 (100 80)80)为为圆圆心心,以以50
97、50为为半半径径绘绘制制了了一一个个圆圆,并并且且将将获获取取这这个个圆圆的的VLAVLA对对象象赋赋给给了了变变量量circcirc。可可以以用用以以下下两两种种函函数数获获取图形对象的属性。取图形对象的属性。1. 1. 用带有用带有vla-getvla-get前缀的函数,这类函数的调用语法如下:前缀的函数,这类函数的调用语法如下: (vla-get-property VLA (vla-get-property VLA图形对象图形对象) ) 该该类类函函数数的的名名字字是是由由vla-get-vla-get-和和propertyproperty合合成成的的。propertyproperty为
98、为符符号号或或字字符符串,标识要检索的属性。返回串,标识要检索的属性。返回VLAVLA图形对象指定的属性。图形对象指定的属性。 例如获取该圆的半径:例如获取该圆的半径: (setq rad(vla-get-radius circ) (setq rad(vla-get-radius circ);返回;返回50.050.0 获取该圆的面积:获取该圆的面积: (setq area(vla-get-area circ) (setq area(vla-get-area circ);返回;返回7853.987853.98 获取该圆的颜色:获取该圆的颜色: (setq area(vla-get-color
99、circ) (setq area(vla-get-color circ);返回;返回256(bylayer)256(bylayer) 获取该圆的圆心:获取该圆的圆心: (setq cntr(vla-get-center circ) (setq cntr(vla-get-center circ);返回;返回# 返返回回值值为为安安全全数数组组类类型型的的变变体体。用用函函数数vlax-safearray-listvlax-safearray-list列列出出安安全全数数组的内容:组的内容: (vlax-safearray-list (vlax-safearray-list (vlax-varia
100、nt-value (vlax-variant-value cntr)cntr);返返回回(100.0 (100.0 80.0 80.0 0.0)0.0)2. 2. 用函数用函数vlax-get-propertyvlax-get-property获取任意获取任意ActiveXActiveX对象的任意属性对象的任意属性函数函数vlax-get-propertyvlax-get-property的调用格式如下:的调用格式如下:(vlax-get-property VLA(vlax-get-property VLA图形对象图形对象 property) property)参数参数propertyprop
101、erty为符号或字符串,标识要检索的属性。返回对象属性的值。为符号或字符串,标识要检索的属性。返回对象属性的值。例如,获取该圆的半径:例如,获取该圆的半径:(setq rad(vlax-get-property circ radius)(setq rad(vlax-get-property circ radius);返回;返回50.050.0获取该圆的面积:获取该圆的面积:(setq area(vlax-get-property circ area)(setq area(vlax-get-property circ area);返回;返回7853.987853.98获取该圆的圆心:获取该圆的圆
102、心:(setq (setq cntr cntr (vlax-get-property (vlax-get-property circ circ center)center);返返回回#variant #,.,返回值为安全数组类型的变体。返回值为安全数组类型的变体。获取该圆的颜色:获取该圆的颜色:(vlax-get-property circ Color)(vlax-get-property circ Color);返回;返回25625610.4.2 10.4.2 修改图形对象的属性修改图形对象的属性 假假定定以以(100 (100 80)80)为为圆圆心心,以以5050为为半半径径绘绘制制了了
103、一一个个圆圆,并并且且将将获获取取这这个个圆圆的的VLAVLA对对象象赋赋给给了了变变量量circcirc。可可以以用用以以下下两两种种函函数获取图形对象的属性。数获取图形对象的属性。1. 1. 用带有用带有vla-put-vla-put-前缀的函数,这类函数的调用语法如下:前缀的函数,这类函数的调用语法如下:(vla-put-property VLA(vla-put-property VLA图形对象图形对象 新的属性值新的属性值) ) 该该 类类 函函 数数 的的 名名 字字 是是 由由 vla-put-vla-put-和和 propertyproperty合合 成成 的的 。propert
104、yproperty为为符符号号或或字字符符串串,标标识识要要修修改改的的属属性性。返返回回VLAVLA图图形形对对象象指指定定的的属属性性。例例如如修修改改一一个个圆圆的的半半径径时时,property property 就就是是改为具体的属性改为具体的属性radiusradius,2020可作为半径这个属性的新值。可作为半径这个属性的新值。 例如修改该圆的半径:例如修改该圆的半径:(vla-put-radius (vla-put-radius circ circ 20)20);返返回回nil, nil, 该该圆圆的的位位置置不不变变,半半径径改改变变为为2020。修改该圆的面积:修改该圆的面
105、积: (vla-put-area (vla-put-area circ circ 1000)1000);返返回回nil, nil, 该该圆圆的的位位置置不不变变,面积改变为面积改变为10001000。修改该圆的圆心:修改该圆的圆心: (vla-put-center (vla-put-center circ circ (vlax-3d-point (vlax-3d-point (150 (150 50 50 0) 0) ;返回返回nil, nil, 该圆的位置改变为该圆的位置改变为(150 50 0)(150 50 0) 该该表表达达式式用用vlax-3d-pointvlax-3d-point函
106、函数数来来将将新新的的圆圆心心点点表表转转换换为为ActiveXActiveX所要求的数据类型。所要求的数据类型。 注注意意,有有可可能能属属性性的的修修改改并并不不立立即即反反映映到到AutoCADAutoCAD图图形形,这这是是因因为为AutoCADAutoCAD对对属属性性修修改改做做了了延延迟迟。其其目目的的是是为为了了让让用用户户可可以以一一次次修修改改多多个个属属性性。如如果果需需要要显显式式地地更更新新图图形形窗窗口口,可可调调用用函函数数vla-updatevla-update,其调用格式如下:,其调用格式如下: (vla-update VLA (vla-update VLA图
107、形对象图形对象) )2.2.用函数用函数vlax-put-propertyvlax-put-property修改任意修改任意ActiveXActiveX对象的任意属性对象的任意属性函数函数vlax-put-propertyvlax-put-property的调用格式如下:的调用格式如下:(vlax-put-property VLA(vlax-put-property VLA图形对象图形对象 property property 新的属性值新的属性值) )参数参数propertyproperty为符号或字符串,标识要修改的属性。为符号或字符串,标识要修改的属性。例如,修改该圆的半径:例如,修改该圆
108、的半径:(vlax-put-property (vlax-put-property circ circ radius radius 80) 80) ;返返回回nil, nil, 该该圆圆的的位位置置不变,半径改变为不变,半径改变为2020。修改该圆的面积:修改该圆的面积:(vlax-put-property (vlax-put-property circ circ area area 2004) 2004) ;返返回回nil, nil, 该该圆圆的的位位置置不变,面积改变为不变,面积改变为20042004。修改该圆的圆心:修改该圆的圆心:(vlax-put-property (vlax-put
109、-property circ circ center center (vlax-3d-point (vlax-3d-point (180 (180 20 0)20 0); ; 返回返回nil, nil, 该圆的位置改变为该圆的位置改变为(180 20 0)(180 20 0)修改该圆的颜色:修改该圆的颜色:(vlax-put-property circ Color acRed)(vlax-put-property circ Color acRed)(vlax-put-property circ Color 1)(vlax-put-property circ Color 1) 也也可可以以用用预
110、预定定义义的的常常量量来来修修改改对对象象的的属属性性。例例如如,如如果果要要将将圆的填充颜色设为红色,可以用常量圆的填充颜色设为红色,可以用常量acRedacRed代替颜色号代替颜色号1 1。(vla-put-color myCircle acRed)(vla-put-color myCircle acRed)10.5 10.5 确定是否可以修改对象确定是否可以修改对象 如如果果在在当当前前程程序序运运行行的的同同时时,其其他他应应用用程程序序也也在在操操作作某某些些AutoCADAutoCAD对对象象,当当前前的的程程序序可可能能无无法法访访问问那那些些对对象象。这这在在设设计计含含有有反
111、反应应器器的的应应用用程程序序时时非非常常重重要要,因因为为反反应应器器执执行行相相应应代代码码来来响响应应外外部部事事件件,而而这这些些外外部部事事件件将将无无法法预预知知。详详细细信信息息参参见见10.710.7将将反反应应器器附附着着到到AutoCADAutoCAD图图形形上上。有有时时甚甚至至一一个个很很简简单的事情(如图层被锁住)也可能阻止程序改变对象的属性。单的事情(如图层被锁住)也可能阻止程序改变对象的属性。 VLISP VLISP 提提供供了了下下列列函函数数,可可用用来来在在操操作作某某对对象象前前,先先测测试试一一下下是是否否可可访访问该对象。问该对象。 l lvlax-r
112、ead-enabled-p vlax-read-enabled-p 测试是否可读该对象。测试是否可读该对象。 l lvlax-write-enabled-p vlax-write-enabled-p 测试是否可修改该对象的属性。测试是否可修改该对象的属性。 l l vlax-erased-p vlax-erased-p 测测试试该该对对象象是是否否已已被被删删除除,因因为为被被删删除除的的对对象象可可能能仍仍保留在图形数据库中。保留在图形数据库中。 如果如果结果果为真,真,这些函数返回些函数返回T T,否,否则返回返回nilnil。 下面测试某下面测试某mylinemyline直线对象:直线对
113、象:(1) (1) 确定该直线是否可读确定该直线是否可读(vlax-read-enabled-p myline) (vlax-read-enabled-p myline) ;返回;返回T T,说明可读,说明可读(2) (2) 确定该直线是否可被修改确定该直线是否可被修改(vlax-write-enabled-p myline) (vlax-write-enabled-p myline) ;返回;返回T T,说明可被修改,说明可被修改(3) (3) 确定该直线是否已被删除确定该直线是否已被删除(vlax-erased-p myline) (vlax-erased-p myline) ;返回;返回
114、nilnil,说明未被删除,说明未被删除(vla-delete myline) (vla-delete myline) ;删除;删除myline,myline,返回返回nilnil(4) (4) 调用调用vlax-read-enabled-pvlax-read-enabled-p来查看来查看mylinemyline是否仍然可读是否仍然可读(vlax-read-enabled-p myline) (vlax-read-enabled-p myline) ;返回;返回nilnil,说明不可读,说明不可读(5) (5) 再次调用再次调用 vlax-erased-p vlax-erased-p来验证该
115、对象是否已被删除来验证该对象是否已被删除(vlax-erased-p myline) (vlax-erased-p myline) ;返回;返回T T,说明已被删除,说明已被删除10.6 10.6 使用用参数带回返回值的使用用参数带回返回值的ActiveXActiveX方法方法 有些有些ActiveXActiveX方法要求用方法要求用户给它它们提供提供变量,以使它量,以使它们能能对变量量赋值。GetBoundingBox GetBoundingBox 方法就是一例,方法就是一例,图10-1010-10是它在是它在 ActiveX and VBA ActiveX and VBA Referenc
116、eReference中的定中的定义。 图10-10 10-10 GetBoundingBox GetBoundingBox 方法的定方法的定义 从从图图10-1010-10可可以以看看到到,用用GetBoundingBoxGetBoundingBox方方法法可可以以获获取取图图形形对对象象边边界界框框的的左左下下角角点点MinPointMinPoint和和右右上上角角点点MaxPointMaxPoint。这这两两个个点点是是在在WCSWCS下的三维坐标。下的三维坐标。假假定定最最后后生生成成的的实实体体是是以以(200200,100100)为为圆圆心心,以以5050为为半半径径的的圆圆。用用G
117、etBoundingBoxGetBoundingBox方方法法获获取取该该圆圆边边界界框框的的左左下下角角点点MinPointMinPoint和和右右上角点上角点MaxPointMaxPoint。(1 1)获取该圆的实体名)获取该圆的实体名(setq ec(entlast) (setq ec(entlast) ;返回;返回(2 2)将该圆转换为)将该圆转换为VLAVLA对象对象(setq (setq mycircle(vlax-ename-vla-object mycircle(vlax-ename-vla-object ec) ec) ; 返返 回回 #VLA-#OBJECT IAcadLi
118、ne 011bf2d4( 3 3) 用用 GetBoundingBoxGetBoundingBox方方 法法 获获 取取 该该 圆圆 边边 界界 框框 的的 左左 下下 角角 点点MinPointMinPoint和右上角点和右上角点MaxPointMaxPoint(vla-getboundingbox (vla-getboundingbox myCircle myCircle minpoint minpoint maxpoint)maxpoint);返返回回nilnil vla-getboundingboxvla-getboundingbox函函数数将将该该圆圆边边界界框框的的左左下下角角点点
119、和和右右上上角角点点的的坐坐标标存存放放在在变变量量minpointminpoint和和maxpointmaxpoint变变量量。这这两两个个变变量量,是含有三个双精度实数的安全数组的类型。是含有三个双精度实数的安全数组的类型。(4 4)用用函函数数vlax-safearray-listvlax-safearray-list查查看看minpointminpoint和和maxpointmaxpoint的的值值(setq (setq p1(vlax-safearray-list p1(vlax-safearray-list minpoint)minpoint);返返回回(150.0 (150.0
120、3.0 3.0 0.0) 0.0) (setq (setq p2(vlax-safearray-list p2(vlax-safearray-list maxpoint)maxpoint);返返回回(190.0 (190.0 20.0 20.0 0.0)0.0)10.7 10.7 判断某方法或属性是否可应用于某对象判断某方法或属性是否可应用于某对象 如如果果使使用用了了某某对对象象不不能能应应用用的的方方法法或或的的属属性性,就就会会导导致致错错误误。如如果果不不能能确确定定属属性性或或方方法法是是否否可可应应用用于于该该对对象象时时,应应该该用用函函数数vlax-method-applica
121、ble-pvlax-method-applicable-p和和 vlax-property-available-pvlax-property-available-p对对 该该对对象象进进行行测测试试。如如果果方方法法或或属属性性可可应应用用到到该该对对象象,这这些些函函数数返返回回T T,否则返回,否则返回nilnil。1. 1. 判断某方法是否可应用于某对象判断某方法是否可应用于某对象 1212 通通过过函函数数vlax-method-applicable-pvlax-method-applicable-p可可以以判判断断某某方方法法是是否否可可应用于某对象。该函数的调用格式如下:应用于某对
122、象。该函数的调用格式如下:(vlax-method-applicable-p VLA(vlax-method-applicable-p VLA对象对象 method) method) 参数参数method为符号或字符串,指定要检查的方法的名称。如为符号或字符串,指定要检查的方法的名称。如果果VLA对象支持该方法,返回对象支持该方法,返回T,否则返回,否则返回nil。 例例如如,以以下下表表达达式式测测试试copycopy方方法法是是否否可可应应用用到到mylinemyline指指向向的的直线对象:直线对象:(vlax-method-applicable-p (vlax-method-appli
123、cable-p myline myline copy)copy); ;返返回回T T,说说明明copycopy方方法可以应用到直线对象法可以应用到直线对象以以下下表表达达式式测测试试AddBoxAddBox方方法法是是否否可可应应用用到到mylinemyline指指向向的的直直线线对对象:象:(vlax-method-applicable-p (vlax-method-applicable-p myline myline AddBox)AddBox);返返回回nilnil,说说明明AddBox AddBox 方法不能应用到直线对象方法不能应用到直线对象2. 2. 判断某对象是否具有某属性判断某
124、对象是否具有某属性 通通过过函函数数vlax-property-available-pvlax-property-available-p可可以以判判断断某某对对象象是是否否具具有某属性。该函数的调用格式如下:有某属性。该函数的调用格式如下:(vlax-property-available-p (vlax-property-available-p VLAVLA对对 象象 property property check-check-modify)modify) 参参数数propertyproperty为符符号号或或字字符符串串,指指定定要要检查的的属属性性。如如果果指指定定参参数数check-ch
125、eck-modifymodify的的值为T T,该函函数数还检查VLAVLA对象象的的指指定定属属性性是是否否可可被被修修改改。只只要要VLAVLA对象象具具有有指指定定属属性性,该函函数数就就返返回回T T,否否则返返回回返返回回nilnil。如如果果指指定定check-check-modifymodify参数的参数的值为T T,而,而该属性不可用或属性不可用或该属性不能修改,属性不能修改,该函数返回函数返回nilnil。 例如,下列表达式测试例如,下列表达式测试ColorColor和和CenterCenter是否是是否是mylinemyline具有的属性:具有的属性: (vlax-prop
126、erty-available-p myline Color)(vlax-property-available-p myline Color);返回;返回T T(vlax-property-available-p myline Center)(vlax-property-available-p myline Center);返回;返回nilnil 假假定定myCirclemyCircle是是直直线线一一个个圆圆的的VLAVLA对对象象,如如果果调调用用该该函函数数时时不不提提供供可可选选参参数数TT,测试圆的,测试圆的AreaArea属性:属性: (vlax-property-available
127、-p (vlax-property-available-p myCircle myCircle area)area);返返回回T T,说说明明圆圆具具有有areaarea属属性性 如果调用该函数时可选参数设置为如果调用该函数时可选参数设置为T T,测试圆的,测试圆的AreaArea属性:属性:(vlax-property-available-p (vlax-property-available-p myCircle myCircle area area T)T);返返回回T T,说说明明圆圆具具有有areaarea属性,而且可以被直接修改。属性,而且可以被直接修改。10.8 10.8 使用集合
128、对象使用集合对象 集集合合的的概概念念是是在在理理解解AutoCADAutoCAD对对象象模模型型中中引引入入的的,在在AutoCADAutoCAD对对象象模模型型中中的的所所有有对对象象都都是是用用集集合合来来分分组组的的。例例如如,块块集集合合是是由由AutoCADAutoCAD文文档档中中的的所所有有块块组组成成的的。VLISPVLISP提提供供处处理理集集合合对对象象的的函数,该类函数有函数,该类函数有vlax-map-collectionvlax-map-collection和和vlax-forvlax-for。10.8.1 10.8.1 将某一个函数应用到集合中的每一个对象将某一个
129、函数应用到集合中的每一个对象 1414 vlax-map-collectionvlax-map-collection函函数数可可将将某某一一个个函函数数应应用用到到集集合合中中的的每每一个对象,其调用格式如下:一个对象,其调用格式如下: (vlax-map-collection collection-object function) (vlax-map-collection collection-object function) 参参数数collection-objectcollection-object代代表表集集合合的的VLAVLA对对象象。functionfunction为为要要应应用用
130、到到collection-objectcollection-object的的函函数数名名或或lambdalambda表表达达式式。返返回回值值为为VLAVLA对象。对象。 例例如如,下下列列代代码码将将在在控控制制台台窗窗口口顺顺序序地地显显示示了了模模型型空空间间每每一一个对象的所有属性:个对象的所有属性:(vl-load-com)(vl-load-com)(setq myacad (vlax-get-acad-object)(setq myacad (vlax-get-acad-object)(setq mydoc(vla-get-ActiveDocument myacad)(setq m
131、ydoc(vla-get-ActiveDocument myacad)(setq myms(vla-get-ModelSpace mydoc)(setq myms(vla-get-ModelSpace mydoc)(vlax-map-collection myms vlax-dump-Object)(vlax-map-collection myms vlax-dump-Object)显示结果如下:显示结果如下:; IAcadCircle: AutoCAD Circle Interface; IAcadCircle: AutoCAD Circle Interface; Property valu
132、es:; Property values:; ; Application Application (RO) (RO) = = #VLA-OBJECT #00b5e51c; Area = 7853.98; Area = 7853.98; Center = (200.0 100.0 0.0); Center = (200.0 100.0 0.0); Circumference = 314.159; Circumference = 314.159; Diameter = 100.0; Diameter = 100.0; Document(RO)=#; Document(RO)=#; Handle (
133、RO) = 84; Handle (RO) = 84; HasExtensionDictionary (RO) = 0; HasExtensionDictionary (RO) = 0; ; Hyperlinks Hyperlinks (RO)=#VLA-OBJECT (RO)=#011c00c4; Layer = 0; Layer = 0; Linetype = ByLayer; Linetype = ByLayer; LinetypeScale = 1.0; LinetypeScale = 1.0; Lineweight = -1; Lineweight = -1; Normal = (0
134、.0 0.0 1.0); Normal = (0.0 0.0 1.0); ObjectID (RO) = 2130083424; ObjectID (RO) = 2130083424; ObjectName (RO) = AcDbCircle; ObjectName (RO) = AcDbCircle; OwnerID (RO) = 2130083064; OwnerID (RO) = 2130083064; PlotStyleName = ByLayer; PlotStyleName = ByLayer; Radius = 50.0; Radius = 50.0; Thickness = 0
135、.0; Thickness = 0.0; TrueColor = #; TrueColor = #; Visible = -1; Visible = -1(限于篇幅,以上只列出了第一个图元的属性。)(限于篇幅,以上只列出了第一个图元的属性。)10.8.2 10.8.2 将一系列函数应用到集合中的每一个对象将一系列函数应用到集合中的每一个对象 如如果果要要对对集集合合中中的的每每一一个个对对象象用用一一系系列列函函数数求求值值,可可使使用用vlax-forvlax-for函函数数,该该函函数数遍遍历历整整个个对对象象集集,对对每每个个表表达达式式进进行行求求值值。其调用格式如下:其调用格式如下:
136、(vlax-for (vlax-for symbol symbol collection collection expression1 expression1 expression2 expression2 .).) 参数参数symbol为符号,将其指定给集合中的每个为符号,将其指定给集合中的每个VLA对象。对象。collection为表示集合的为表示集合的VLA对象。对象。expression1, expression2. 为要计算的表达式。该函数与为要计算的表达式。该函数与foreach函数类似,函数类似,只返回只返回for循环中最后一个表达式求值的结果。循环中最后一个表达式求值的结果。
137、例例10-110-1是是调用用vlax-forvlax-for函数的函数的实例,它利例,它利vlax-forvlax-for函数函数对当当前前图形中每种形中每种颜色的使用情况色的使用情况进行了行了统计。 【例【例10-110-1】 统计当前图形中每种颜色使用情况。统计当前图形中每种颜色使用情况。(defun (defun show-Color-Statistics show-Color-Statistics (/ (/ objectColor objectColor colorSublist colorSublist colorList)colorList) (setq (setq model
138、Space modelSpace (vla-get-ModelSpace (vla-get-ModelSpace (vla-get-ActiveDocument (vla-get-ActiveDocument (vlax-get-Acad-Object)(vlax-get-Acad-Object) (vlax-for obj modelSpace (vlax-for obj modelSpace (setq objectColor (vla-get-Color obj) (setq objectColor (vla-get-Color obj) (if (setq colorSublist (
139、assoc objectColor colorList) (if (setq colorSublist (assoc objectColor colorList) (setq colorList (setq colorList (subst (subst (cons (cons objectColor objectColor (1+(cdr (1+(cdr colorSublist) colorSublist) colorSublist colorList)colorSublist colorList) (setq colorList (cons (cons objectColor 1) co
140、lorList) (setq colorList (cons (cons objectColor 1) colorList) ) )(if colorList(if colorList (progn (progn (setq (setq colorList colorList (vl-sort (vl-sort colorList colorList (lambda (lambda (lst1 (lst1 lst2) lst2) ( (list llpoint) (princ (vlax-safearray-list llpoint) (princ ) (princ ) (princ (vla
141、x-safearray-list urpoint) (princ (vlax-safearray-list urpoint) (princ) (princ) ) 加加载载该该程程序序,在在“Command:”“Command:”或或控控制制台台的的“$”“$”提提示示下下调调用用该该函函数数,如如果果用用直直线线或或圆圆作作为为被被选选对对象象,该该函函数数打打印印出出包包容容方方框框的的左左下下和和右右上上两两个个角角点点,若若选选中中射射线线,将将出出现现提提示示“; “; error: error: Automation Automation Error. Error. Invalid
142、Invalid extentsextents(Automation Automation 错错误误。范范围围无无效效”。这这是是因因为为射射线线沿沿其其发发射射方方向向无无限限延延伸伸,而而不不可可能能被被包包括括在在某某方方框框中中,所所以以调调用用GetBoundingBoxGetBoundingBox导导致致程程序序崩崩溃溃。从从出出错错提提示示中中可可以以看看到到该该错错属属于于Automation Automation 错错误误,而而系系统统对该类错误未提供说明。对该类错误未提供说明。(3 3)定)定义例例10-310-3所示的所示的box2box2函数。在函数。在box2box2函
143、数中,通函数中,通过vl-vl-catch-all-applycatch-all-apply函数函数调用用vla-getboundingboxvla-getboundingbox函数及其参数,函数及其参数,将其返回将其返回值赋给变量量errerr。若。若errerr是是ActiveXActiveX返回的出返回的出错信息,提信息,提示用示用户不能建立包容方框,程序退出。否不能建立包容方框,程序退出。否则,即,即ActiveXActiveX没有返没有返回出回出错信息,程序将正常运行。信息,程序将正常运行。 vl-catch-all-error-p vl-catch-all-error-p函数可以检
144、查函数函数可以检查函数vl-catch-all-vl-catch-all-applyapply的返回值,如果的返回值,如果vl-catch-all-applyvl-catch-all-apply的返回值是一个出错的返回值是一个出错信息,则信息,则vl-catch-all-error-pvl-catch-all-error-p函数返回函数返回T T,否则返回,否则返回nilnil。【例【例10-310-3】 获取图元包容方框的角点获取图元包容方框的角点(defun box2(/ mydoc myhndl myobj llpoint urpoint)(defun box2(/ mydoc myhn
145、dl myobj llpoint urpoint) (vl-load-com) (vl-load-com) (setq (setq mydoc(vla-get-activedocument mydoc(vla-get-activedocument (vlax-get-acad-(vlax-get-acad-object)object) (setq (setq myhndl(cdr myhndl(cdr (assoc (assoc 5(entget 5(entget (car (car (entsel (entsel nn选选择择一个图元:一个图元:) (setq myobj(vla-handl
146、etoobject mydoc myhndl) (setq myobj(vla-handletoobject mydoc myhndl) (setq (setq err(vl-catch-all-apply err(vl-catch-all-apply vla-getboundingbox vla-getboundingbox (list myobj llpoint urpoint)(list myobj llpoint urpoint) (if (vl-catch-all-error-p err) (if (vl-catch-all-error-p err) (princ n (princ
147、n所选图元不能建立包容方框,程序将退出所选图元不能建立包容方框,程序将退出 !) !) (progn (progn (princ n (princ n包容方框的角点包容方框的角点) (princ (vlax-safearray-list llpoint)(princ ) (princ (vlax-safearray-list llpoint)(princ ) (princ (vlax-safearray-list urpoint) (princ (vlax-safearray-list urpoint) ) ) (princ) (princ) )10.11 10.11 举例举例1. 1. 用用
148、ActiveXActiveX方法定义在模型控件绘制一条直线的命令。方法定义在模型控件绘制一条直线的命令。 用用ActiveXActiveX方方法法生生成成图图形形对对象象的的步步骤骤是是: 获获取取AutoCADAutoCAD应应用用程程序序对对象象。 获获取取活活动动文文档档对对象象。 获获取取模模型型空空对对象象。 将将AutoLISPAutoLISP数数据据转转换换为为ActiveXActiveX的数据类型。的数据类型。 调用填加具体图形对象的方法。调用填加具体图形对象的方法。【例【例10-410-4】用】用ActiveXActiveX方法定义绘制一条直线的命令。方法定义绘制一条直线的命
149、令。(defun c:actvline(/ myacad mydoc myms p1 p2 myline)(defun c:actvline(/ myacad mydoc myms p1 p2 myline) (vl-load-com) (vl-load-com) (setq myacad (vlax-get-acad-object) (setq myacad (vlax-get-acad-object); ;获取获取AutoCADAutoCAD应用程序本身应用程序本身 (setq mydoc(vla-get-ActiveDocument myacad) (setq mydoc(vla-get
150、-ActiveDocument myacad); ;获取活动文档获取活动文档 (setq myms(vla-get-ModelSpace mydoc) (setq myms(vla-get-ModelSpace mydoc); ;获取模型空间获取模型空间 (setq p1(getpoint n (setq p1(getpoint n输入直线的起点输入直线的起点:):) (setq p2(getpoint p1 n (setq p2(getpoint p1 n输入直线的终点输入直线的终点:):) ; ;将普通的三维点转换为将普通的三维点转换为ActiveXActiveX的变体,再调用填加直线的方
151、法的变体,再调用填加直线的方法(setq (setq myline(vla-addline myline(vla-addline myms myms (vlax-3d-point (vlax-3d-point p1) p1) (vlax-3d-point (vlax-3d-point p2)p2)(princ)(princ) )2. 2. 用用ActiveXActiveX方法定义将选到的圆改变为指定面积的命令。方法定义将选到的圆改变为指定面积的命令。用用ActiveXActiveX方方法法修修改改图图形形对对象象的的步步骤骤是是: 获获取取图图形形对对象象的的图图元元名名。 将将图元名转换为图
152、元名转换为VLAVLA对象。对象。 更新图形对象指定的属性。更新图形对象指定的属性。【例【例10-510-5】用】用ActiveXActiveX方法定义将选到的圆改变为指定面积的命令。方法定义将选到的圆改变为指定面积的命令。(defun c:chcircarea(/ ec area v_c)(defun c:chcircarea(/ ec area v_c) (vl-load-com) (vl-load-com) (setq ec(car (entsel n (setq ec(car (entsel n选择一个圆选择一个圆:):); ;获取圆的图元名获取圆的图元名 (setq area(getreal n (setq area(getreal n输入圆的新的面积输入圆的新的面积:);:); (while (= area 0) (while (vla-object v_c(vlax-ename-vla-object ec)ec); ;将将圆圆的的图图元元名名转转换换为为VLAVLA对象对象 (vla-put-area v_c area) (vla-put-area v_c area); ;更新圆的面积更新圆的面积 (princ) (princ) )结束结束