AutoCAD二次开发实用教程第12章 使用Ac课件.ppt
第12章 使用ActiveX,Visual LISP为AutoCAD提供了许多新的功能,包括支持ActiveX对象的操作以及支持ActiveX与其他程序的交互等。 ActiveX Automation技术使用户可以方便地使用其他许多面向对象的高级语言来开发AutoCAD程序,它的作用是面向对象的编程接口,程序可以据此访问AutoCAD所有的绘图对象和非绘图对象。,第12章 使用ActiveX,ActiveX Automation是一种新的方法,通过它可以用编程的方式操作AutoCAD图形。,第12章 使用ActiveX,许多语言和环境都可以使用ActiveX编程界面,如C+、Visual Basic、Java和Delphi等。在AutoLISP中使用ActiveX对象,与其模型、属性和方法和在其他编程环境中使用的ActiveX对象完全相同。,12.1 在AutoLISP中使用ActiveX对象,对象是ActiveX应用程序的主要组成部分。例如,直线、圆弧、多义线和圆等都被称为图形对象。但在使用ActiveX时,以下AutoCAD本身及概念都被称为对象。 1. 样式设置对象,如线型(linetype)、文本样式(style)和尺寸样式(dimstyle)等。 2. 组织结构对象,如图层(layer)和块(block)等。 3. 图形显示对象,如视图(view)和视口(viewport)。 4. 图形的模型空间(modelspace)和图纸空间(paperspace)。,12.2 AutoCAD对象模型,AutoCAD对象是通过分层方式来组织的,应用程序(Application)对象为根对象。这种分层结构的视图被归结为对象模型。Application对象还提供指向AutoCAD图形(通过Documents集合)、AutoCAD菜单和工具栏(通过 MenuBa 和MenuGroup 集合)以及 VBA IDE(通过VBE特性)的链接。,12.2.1 对象属性,AutoCAD对象模型中的所有对象都有一个或多个特性,我们把这些特性称为属性。属性用于描述对象。例如,圆具有半径、面积、线型等属性,通过半径、面积、线型等属性描述一个具体的圆。椭圆具有面积和线型属性,虽然没有半径这个属性,但可以用其长轴和短轴的比例来描述它。通过ActiveX函数访问AutoCAD数据时必须知道特性名称。,12.2.2 对象方法,ActiveX对象也包括方法 ,它们是为特定类型的对象提供的动作。某些方法可应用到大多数AutoCAD图形对象。 在Visual LISP中,ActiveX方法是用AutoLISP函数实现的,在Visual LISP文档中,用户会看到许多关于ActiveX函数的内容,但是应该清楚在ActiveX术语中,它们应被称为方法。,12.2.3 对象集合,AutoCAD通过集合将所有对象进行分类。虽然这些集合包含了不同类型的数据,但是可以使用相似的技术来处理它们。每一个集合都提供了向其中添加对象的方法。大多数集合是通过 Add 方法完成的。但添加图元对象通常使用名为 Add 的方法。例如,要添加直线,请使用 AddLine 方法。,12.3 访问AutoCAD对象,通过Document对象的Application特性可以访问Application对象。在对象层次结构中,Application对象位于Document对象的上方。 如果要AutoLISP中使用ActiveX函数,用户必须先加载支持代码来使这些函数可用。,12.3.1 访问AutoCAD应用程序,获取AutoCAD应用程序2. AutoCAD应用程序的属性和方法,12.3.2 应用程序对象以下的其他ActiveX对象,沿着AutoCAD对象模型层次图,应用程序对象的ActiveDocument特性将把用户带到文档对象,它代表当前AutoCAD图形。 文档对象有许多特性。对非图形对象(如图层、线型和组等)的访问是由名称相近的特性(如Layers、Linetype和Groups等)提供的。,12.3.3 过程总结,实现的功能是用ActiveX Automation在AutoCAD图形中画一个圆对象,函数调用序列如下所示:(vl-load-com)(setq acadObject(vlax-get-acad-object)(setq acadDocument(vla-get-ActiveDocument acadObject) (setq mSpace(vla-get-ModelSpace acadDocument)(setq mycircle(vla-acadCircle mSpace(vlax-3d-point (3.0 3.0 0.0)2.0),12.3.4 编程技巧,在编程中应避免反复调用AutoCAD应用程序、活动文档和模型空间对象,因为它们降低程序的运行速度,在编写程序时,用户应该让自己的应用程序一次获取这些对象,然后在整个应用程序中都引用所获取的对象指针。,12.3.5 在Visual LISP函数中使用 ActiveX,为访问ActiveX对象,Visual LISP给AutoLISP语言增加了一些函数。1. vla-函数和每个ActiveX方法相对应,可用这些函数调用ActiveX方法(如vla-addCircle调用addCircle方法)。2. vla-get-函数和每个特性相对应,可获取ActiveX特性的值(如vla-get-Color获取对象的Color特性)。3. vla-put-函数和每个特性相对应,可设置ActiveX特性的值(如vla- put Color获取对象的Color特性)。,12.3.6 确定所需的Visual LISP函数,Visual LISP ActiveX函数实际上是提供了对ActiveX方法的访问能力,如,在Visual LISP控制台提示下输入下列AutoLISP语句:_$ (setq mycircle(vla-addCircle mSpace(vlax-3d-point (3.0 3.0 0.0)2.0)# 该命令用addCircle方法向图形中添加圆,为绘制圆而调用的函数是vla-addCircle。,12.4 ActiveX对象访问,Application对象是AutoCAD对象模型中的基础,从Application对象可以访问其他任何对象,或是被访问对象的特性或方法。如果要在AutoLISP中使用ActiveX函数,必须先调用vl-load-com函数来加载所有的ActiveX函数。 该函数先检查是否已经加载了ActiveX函数,如果已经加载,则该函数不做任何工作,如果尚未加载ActiveX支持函数,vl-load-com函数将为AutoLISP语言加载ActiveX以及其他Visual LISP扩展部分。,12.4 ActiveX对象访问,12.4.1 查看对象特性 查看AutoCAD应用程序对象的特性,可以选中指向此对象的变量,然后选择“视图”“检验”命令,或者单击“视图”工具栏中的“检验”按钮。,12.4 ActiveX对象访问,12.4.2 访问图形对象获取AutoCAD应用程序2. AutoCAD应用程序的属性和方法,12.4 ActiveX对象访问,12.4.3 访问其他AutoCAD对象 获取AutoCAD应用程序这个根对象之后,沿着AutoCAD对象模型图,就可以将其作为起点,逐级访问它的下一级VLA对象。,12.4 ActiveX对象访问,12.4.4 使用检验工具了解AutoCAD对象的属性1. 获取AutoCAD应用程序对象2. AutoCAD应用程序对象3. 活动文档的属性4. 模型空间的属性5. 直线的属性6. 圆的属性,12.4 ActiveX对象访问,12.4.5 通过Help功能了解AutoCAD对象1.在VLISP环境下,按功能键F1。2.在随后显示的AutoCAD 2007Help:Developer 3.Documentation对话框的目录选项卡内双击 。4.在展开的目录树上双击 。5.在Objects目录下双击AutoCAD图形对象。,12.5 在Visual LISP函数中使用ActiveX方法,Visual LISP为AutoLISP提供了一系列操作ActiveX对象的函数,这些函数可分为以下几种:1)VLA-前缀的函数2)VLA-Get前缀的函数3)VLA-Put前缀的函数4)VLAX-前缀的函数,12.5 在Visual LISP函数中使用ActiveX方法,12.5.1查找所需要的函数 Visual LISP中ActiveX方法操作函数是一个非常复杂的函数系列,如果要查找进行相应操作的函数,可参考AutoCAD在线帮助中的“AutoCAD ActiveX and VBA references”部分(对应的AutoCAD安装路径Help子目录下的acadauto.chm文件)。,12.5 在Visual LISP函数中使用ActiveX方法,12.5.2确定函数参数 确定了函数名,还需要进一步确定这个函数的参数和数据类型,在“AutoCAD ActiveX and VBA references”中有使用ActiveX函数的详细信息。,12.5 在Visual LISP函数中使用ActiveX方法,12.5.3 将Visual Basic环境下的语句改写为AutoLISP表达式1. 先分析Visual Basic环境下的语句:RetVal = object.AddLine(StartPoint,EndPoint)2.采用AutoLISP表达式为:(setq myline(vla-addline myms (vlax-3d-point (10 20) (vlax-3d-point (80 30),12.5 在Visual LISP函数中使用ActiveX方法,12.5.4 转换数据类型为ActiveX型 实体类型是一种特殊的数据类型,实际上可以看做是一种自定义的数据结构。可以含有不同类型的数据,固定长度的字符串数据和用户定义的类型除外。与数据一同存储的是数据类型的识别信息,这种自定义的数据类型使得与ActiveX的数据交互可以很顺利,因为它是基于多种程序设计语言都能够接受的数据结构。,12.6 AutoCAD实体名和VLA对象之间的转换,1将AutoCAD实体名转换为VLA对象2. 将VLA图形对象转换为AutoCAD实体名(1)用带有vla-get前缀的函数(2)用函数vlax-get-property获取任意ActiveX对象的任意属性,12.7 修改图形对象的属性,用带有vla-put-前缀的函数这类函数的调用语法如下:(vla-put-property VLA图形对象 新的属性值)2.用函数vlax-put-property修改ActiveX对象属性函数vlax-put-property的调用格式如下:(vlax-put-property VLA图形对象 property 新的属性值)参数property为符号或字符串,标志要修改的属性。,12.8 确定方法或属性是否适用于特定对象,如果使用不适于指定对象的方法或属性,将会导致程序出错,所以在不能确定属性或方法是否应用到某个对象时,最好用vlax-method-application-p函数或vlax-property-available-p函数测试一下对象,如果方法或特性可用,则函数返回T,否则返回nil。1函数vlax-method-application-p2函数vlax-property-available-p,12.9 确定是否可以修改对象,VLISP 提供了下列函数,可用来在操作某对象前,先测试一下是否可访问该对象。vlax-read-enabled-p 测试是否可读该对象。vlax-write-enabled-p 测试是否可修改该对象属性。vlax-erased-p 测试该对象是否已被删除,因为被删除的对象可能仍保留在图形数据库中。返回值均为:如果结果为真,这些函数返回T,否则返回nil。,12.10 使用用参数带回返回值的ActiveX方法,有些ActiveX方法要求用户给它们提供变量,以使它们能对变量赋值。 有些ActiveX方法要求用户给它们提供变量,以使它们能对变量赋值。GetBoundingBox 方法就是一例。 其中,MinPoint和MaxPoint参数在定义中已经说明仅用于输出,因此所提供的输出参数必须是前面带有单引号的变量名(以声明不对此变量求值)。,12.11 使用集合对象,集合的概念是在理解AutoCAD对象模型中引入的,在AutoCAD对象模型中的所有对象都是用集合来分组的。例如,块集合是由AutoCAD文档中的所有块组成的。VLISP提供处理集合对象的函数,该类函数有vlax-map-collection和vlax-for。,12.11 使用集合对象,12.11.1 将某一个函数应用到集合中的每一个对象vlax-map-collection函数可将某一个函数应用到集合中的每一个对象,其调用格式如下:(vlax-map-collection collection-object function),12.11 使用集合对象,12.11.2 将一系列函数应用到集合中的每一个对象 如果要对集合中的每一个对象用一系列函数求值,可使用vlax-for函数,该函数遍历整个对象集,对每个表达式进行求值。其调用格式如下:(vlax-for symbol collection expression1 expression2 .),12.11 使用集合对象,12.11.3 获取集合中的成员对象 用item方法可以从集合中获取其成员对象。集合的count属性则显示集合内对象的数量。利用item方法和count属性,可以单个地处理集合中的每个对象。,12.11 使用集合对象,12.11.4 释放VLA对象和释放内存 同将多个变量指向同一个AutoCAD图元一样,也可能将多个VLA对象指向同一个图形对象。只要VLA对象还指向图形对象,AutoCAD就会保留该对象所需的内存。 用equal函数比较两个VLA对象,如果两个VLA对象指向同一个图形对象,equal 函数将返回 T。如果不再需要引用该VLA对象,可调用函数vlax-release-object释放VLA对象。,12.11 使用集合对象,12.11.5 处理ActiveX方法返回的错误 当ActiveX方法失败时,所采取的办法是引发异常,而不是返回出错代码通知程序。因此,如果程序使用了ActiveX方法,必须在程序中设法截取异常,否则程序会中止并失去响应。,谢谢!,