版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第第 11 章章 使用反应器使用反应器 11.1 反应器反应器 反应器是一种反馈机制,它可以在发生某些特定事件时,反应器是一种反馈机制,它可以在发生某些特定事件时,将所发生的事件通知给应用程序,应用程序将会根据发生的具将所发生的事件通知给应用程序,应用程序将会根据发生的具体事件做出相应的决策。例如,在某个图元上链接了一个反应体事件做出相应的决策。例如,在某个图元上链接了一个反应器,如果用户移动这个图元,应用程序就会接到反应器的通知,器,如果用户移动这个图元,应用程序就会接到反应器的通知,知道了该图元被移动这个事件,如果需要,应用程序可以用适知道了该图元被移动这个事件,如果需要,应用程序可以用适
2、当的动作(如移动与该图元相关的其它图元,或显示有关信息当的动作(如移动与该图元相关的其它图元,或显示有关信息等)响应该通知。等)响应该通知。1. 1. 反应器的类型反应器的类型 反应器有多种类型,每种反应器对应一个或多个反应器有多种类型,每种反应器对应一个或多个AutoCADAutoCAD事事件。反应器可以分为以下几个大类:件。反应器可以分为以下几个大类: l l 数据库反应器:当图形数据库发生特定类型的事件时,该数据库反应器:当图形数据库发生特定类型的事件时,该反应器将通知应用程序。反应器将通知应用程序。 l l文档反应器:当前图形文档发生改变(如打开新的图形文档、文档反应器:当前图形文档发
3、生改变(如打开新的图形文档、激活其它文档窗口、改变文档的锁定状态等)时,该反应器将激活其它文档窗口、改变文档的锁定状态等)时,该反应器将通知应用程序。通知应用程序。 l l编辑器反应器:在调用编辑器反应器:在调用AutoCADAutoCAD命令(如打开图形、关闭图命令(如打开图形、关闭图形、保存图形、输入输出形、保存图形、输入输出DXFDXF文件、改变系统变量的值等)时,文件、改变系统变量的值等)时,该反应器将通知应用程序。该反应器将通知应用程序。 l l 链接反应器:当加载和卸载链接反应器:当加载和卸载ARXARX应用程序时,该反应器将通应用程序时,该反应器将通知应用程序。知应用程序。 l
4、l对象反应器:当特定对象(对象反应器:当特定对象(AutoCADAutoCAD图元)被修改、复制或图元)被修改、复制或删除时,该反应器将通知应用程序。删除时,该反应器将通知应用程序。 调用函数调用函数vlr-typesvlr-types可返回反应器类型的完整列表。表可返回反应器类型的完整列表。表11-111-1列列出了出了AutoCADAutoCAD反应器类型及其标识符。反应器类型及其标识符。表表11-1AutoCAD11-1AutoCAD反应器类型及其标识符反应器类型及其标识符 反应器类型的标识符反应器类型的标识符 说明说明:VLR-AcDb-Reactor :VLR-AcDb-Reacto
5、r 数据库反应器数据库反应器:VLR- DocManager- Reactor :VLR- DocManager- Reactor 文档管理反应器文档管理反应器:VLR-Editor- Reactor :VLR-Editor- Reactor 通用编辑器反应器通用编辑器反应器:VLR-Linker- Reactor :VLR-Linker- Reactor 链接反应器链接反应器:VLR-Object- Reactor :VLR-Object- Reactor 对象反应器对象反应器 其中通用编辑器反应器被进一步细分为更加明确的几种反应器类型,其中通用编辑器反应器被进一步细分为更加明确的几种反应器
6、类型,见表见表11-211-2。表。表11-111-1中的通用编辑器反应器类型只是为了向后兼容才保留的,中的通用编辑器反应器类型只是为了向后兼容才保留的,表表11-211-2所示的各种编辑类型的反应器不能被通用编辑器所示的各种编辑类型的反应器不能被通用编辑器 :VLR-Editor-:VLR-Editor-ReactorReactor引用。引用。 表表11-2 11-2 编辑类型的各种反应器及其标识符编辑类型的各种反应器及其标识符 反应器类型的标识符反应器类型的标识符 说明说明:VLR-Command-Reactor :VLR-Command-Reactor 通报命令事件通报命令事件:VLR-
7、DeepClone-Reactor :VLR-DeepClone-Reactor 通报通报 deep clone deep clone 事件事件:VLR-DWG-Reactor :VLR-DWG-Reactor 通报打开或关闭图形文件的事件通报打开或关闭图形文件的事件:VLR-DXF-Reactor :VLR-DXF-Reactor 通报和读写通报和读写 DXF DXF 文件相关的事件文件相关的事件:VLR-Insert-Reactor :VLR-Insert-Reactor 通报和插入块有关的事件通报和插入块有关的事件:VLR-Lisp-Reactor :VLR-Lisp-Reactor 通
8、报通报 LISP LISP 事件事件:VLR-Miscellaneous-Reactor :VLR-Miscellaneous-Reactor (表中未列出的)其它编辑器反应器类型(表中未列出的)其它编辑器反应器类型:VLR-Mouse-Reactor :VLR-Mouse-Reactor 通报鼠标事件(例如双击)通报鼠标事件(例如双击):VLR-SysVar-Reactor :VLR-SysVar-Reactor 通报对系统变量的修改通报对系统变量的修改:VLR-Toolbar-Reactor :VLR-Toolbar-Reactor 通报对工具栏上位图的修改通报对工具栏上位图的修改:VLR
9、-Undo-Reactor :VLR-Undo-Reactor 通报通报 undo undo 事件事件:VLR-Wblock-Reactor :VLR-Wblock-Reactor 通报和写块有关的事件通报和写块有关的事件:VLR-Window-Reactor :VLR-Window-Reactor 通报和移动或改变通报和移动或改变AutoCADAutoCAD窗口大小的事件窗口大小的事件:VLR-XREF-Reactor :VLR-XREF-Reactor 通报附着或修改通报附着或修改 XREF XREF 有关的事件有关的事件3. 3. 反应器回调事件反应器回调事件 大部分大部分AutoCAD
10、AutoCAD操作都会产生一些特定的事件,这些事件能够操作都会产生一些特定的事件,这些事件能够用来触发反应器的动作,这样的事件被称为回调事件。例如,当用来触发反应器的动作,这样的事件被称为回调事件。例如,当发出发出SaveSave命令保存图形时,将会发生命令保存图形时,将会发生AutoCAD保存图形文件保存图形文件(:vlr-beginSave:vlr-beginSave)的事件,当保存过程结束时,将会发生)的事件,当保存过程结束时,将会发生AutoCAD已将当前图形保存到磁盘(已将当前图形保存到磁盘(:vlr-saveComplete:vlr-saveComplete)的事)的事件。设计基于
11、反应器的应用程序就是根据回调事件的内容编写这件。设计基于反应器的应用程序就是根据回调事件的内容编写这些事件发生时所要激活的函数。些事件发生时所要激活的函数。 vlr-reaction-namesvlr-reaction-names函数返回与给定反应器类型相关的所有函数返回与给定反应器类型相关的所有事件组成的表:事件组成的表: (vlr-reaction-names reactor-type)(vlr-reaction-names reactor-type) 参数参数reactor-typereactor-type是反应器类型的标识,见表是反应器类型的标识,见表11-111-1和表和表11-21
12、1-2。例如,下列代码将返回和图形反应器相关的所有事件组成的表:例如,下列代码将返回和图形反应器相关的所有事件组成的表:(vlr-reaction-names :VLR-DWG-Reactor)(vlr-reaction-names :VLR-DWG-Reactor)返回返回(:VLR-beginDwgOpen :VLR-endDwgOpen :VLR-dwgFileOpened :VLR-(:VLR-beginDwgOpen :VLR-endDwgOpen :VLR-dwgFileOpened :VLR-databaseConstructed :VLR-databaseToBeDestroy
13、ed :VLR-databaseConstructed :VLR-databaseToBeDestroyed :VLR-beginSave :VLR-saveComplete :VLR-beginClose) beginSave :VLR-saveComplete :VLR-beginClose) 下列代码将返回和对象反应器相关的所有事件组成的表:下列代码将返回和对象反应器相关的所有事件组成的表:(vlr-reaction-names :vlr-object-reactor)(vlr-reaction-names :vlr-object-reactor); ;返回返回(:VLR-cancell
14、ed :VLR-copied :VLR-erased :VLR-unerased :VLR-(:VLR-cancelled :VLR-copied :VLR-erased :VLR-unerased :VLR-goodbye :VLR-openedForModify :VLR-modified :VLR-goodbye :VLR-openedForModify :VLR-modified :VLR-subObjModified :VLR-modifyUndone :VLR-modifiedXData :VLR-subObjModified :VLR-modifyUndone :VLR-modi
15、fiedXData :VLR-unappended :VLR-reappended :VLR-objectClosed)unappended :VLR-reappended :VLR-objectClosed) 加载并运行以下代码,将会打印出所有相关反应器事件的列表(按反应加载并运行以下代码,将会打印出所有相关反应器事件的列表(按反应器类型排序)。器类型排序)。(defun print-reactors-and-events ()(defun print-reactors-and-events () (foreach rtype (vlr-types) (foreach rtype (vlr-
16、types) (princ (strcat n (vl-princ-to-string rtype) (princ (strcat n (vl-princ-to-string rtype) (foreach rname (vlr-reaction-names rtype) (foreach rname (vlr-reaction-names rtype) (princ (strcat nt (vl-princ-to-string rname) (princ (strcat nt (vl-princ-to-string rname) (princ) (princ) ) AutoLISP Refe
17、rence AutoLISP Reference列出了与各种反应器类型相关的所有事件,有关信列出了与各种反应器类型相关的所有事件,有关信息在创建反应器的函数部分做了说明。息在创建反应器的函数部分做了说明。 和和ActiveXActiveX一样,必须首先调用一样,必须首先调用vl-load-comvl-load-com函数,加载支持反应器和其函数,加载支持反应器和其它它AutoLISPAutoLISP扩展函数之后,才能实现反应器的功能。扩展函数之后,才能实现反应器的功能。11.2 11.2 定义反应器的回调函数定义反应器的回调函数 反应器的回调函数就是回调事件发生时所要执行的函数。反反应器的回调
18、函数就是回调事件发生时所要执行的函数。反应器的回调函数是用应器的回调函数是用AutoLISPAutoLISP定义的。编写回调函数有以下一定义的。编写回调函数有以下一些限制:些限制: 不能使用不能使用commandcommand函数调用函数调用AutoCADAutoCAD命令,只能用命令,只能用ActiveXActiveX函数访问图形对象。函数访问图形对象。 不能使用不能使用entgetentget和和entmodentmod函数。函数。 不能使用选择集操作函数。不能使用选择集操作函数。 不能使用交互输入函数。不能使用交互输入函数。 在事件处理函数中不要加载警告和信息之外的对话框。在事件处理函数
19、中不要加载警告和信息之外的对话框。 定义对象反应器回调函数和定义其它反应器的回调函数也定义对象反应器回调函数和定义其它反应器的回调函数也不完全相同。不完全相同。11.2.1 11.2.1 定义对象反应器的回调函数定义对象反应器的回调函数定义对象反应器的回调函数的格式如下:定义对象反应器的回调函数的格式如下: (defun function (notifier-object reactor-object (defun function (notifier-object reactor-object parameter-list)parameter-list) )参数参数notifier-obje
20、ctnotifier-object是事件发生的对象。是事件发生的对象。参数参数reactor-objecreactor-objec是调用这个函数的反应器对象。是调用这个函数的反应器对象。参数参数parameter-listparameter-list是回调事件返回的回调数据表。是回调事件返回的回调数据表。 例如,例例如,例11-111-1定义了名为定义了名为print-radiusprint-radius的回调函数。的回调函数。notifier-objectnotifier-object是事件发生的对象,是事件发生的对象,reactor-objectreactor-object是调用是调用这个
21、函数的反应器对象,这个函数的反应器对象,parameter-listparameter-list是回调事件返回的回是回调事件返回的回调数据表。虽然在本例并不关心调数据表。虽然在本例并不关心parameter-listparameter-list的值,但定义的值,但定义回调函数时,也要进行变量声明。回调函数时,也要进行变量声明。【例例11-111-1】定义名字为定义名字为print-radiusprint-radius的回调函数,该函数用来打的回调函数,该函数用来打印圆的半径。印圆的半径。(defun print-radius (notifier-object reactor-object pa
22、rameter-list)(defun print-radius (notifier-object reactor-object parameter-list) (vl-load-com) (vl-load-com) (cond (cond (vlax-property-available-p notifier-object Radius)(vlax-property-available-p notifier-object Radius) ;判断该;判断该图形对象是否具有图形对象是否具有radiusradius特性特性 (princ (princ “这个圆的半径是:这个圆的半径是: ) (pr
23、inc (vla-get-radius notifier-object) (princ (vla-get-radius notifier-object) ) ) ) ) )11.2.2 11.2.2 定义其它反应器的回调函数定义其它反应器的回调函数 由于其它反应器不需要链接到由于其它反应器不需要链接到AutoCADAutoCAD图元上,因此定义其它图元上,因此定义其它反应器的回调函数只需要以下两个参数:反应器的回调函数只需要以下两个参数:(defun function(reactor-object parameter-list)(defun function(reactor-object pa
24、rameter-list) )参数参数reactor-objectreactor-object是调用这个函数的反应器对象。是调用这个函数的反应器对象。参数参数parameter-listparameter-list是回调事件返回的回调数据表。是回调事件返回的回调数据表。例例11-211-2定义了名为定义了名为saveDrawingInfosaveDrawingInfo的回调函数。参数的回调函数。参数calling-calling-reactorreactor是调用该函数的反应器对象。参数是调用该函数的反应器对象。参数commandInfocommandInfo是回调是回调事件返回的回调数据表。
25、该函数在发生保存事件返回的回调数据表。该函数在发生保存AutoCADAutoCAD图形的事件图形的事件时将被激活,显示文件的路径和大小等信息。时将被激活,显示文件的路径和大小等信息。 【例例11-211-2】定义名字为定义名字为saveDrawingInfosaveDrawingInfo的回调函数。的回调函数。(defun saveDrawingInfo(calling-reactor commandInfo / dwgname (defun saveDrawingInfo(calling-reactor commandInfo / dwgname filesize)filesize) (vl
26、-load-com) (vl-load-com) (setq dwgname (cadr commandInfo) filesize (vl-file-size (setq dwgname (cadr commandInfo) filesize (vl-file-size dwgname)dwgname) (alert(strcat (alert(strcat 这个文件(这个文件( dwgname dwgname )的大小是)的大小是 (itoa filesize) (itoa filesize) 字节字节.).) (princ) (princ) ) 在该例中,通过函数在该例中,通过函数vl-
27、file-sizevl-file-size获取图形文件的大小,通过警告对话获取图形文件的大小,通过警告对话框显示这些信息。框显示这些信息。11.2.3. AutoCAD11.2.3. AutoCAD预定义的回调函数预定义的回调函数 AutoCADAutoCAD提供了两个预定义的回调函数,可以在测提供了两个预定义的回调函数,可以在测试反应器时使用这些函数:试反应器时使用这些函数: (1 1)vlr-beep-reactionvlr-beep-reaction函数函数vlr-beep-reactionvlr-beep-reaction的功能是让计算机发出的功能是让计算机发出“嘟嘟嘟嘟”声。声。 (
28、2 2)vlr-trace-reactionvlr-trace-reaction函数函数vlr-trace-reactionvlr-trace-reaction函数的功能是将参数列表打印到函数的功能是将参数列表打印到VLISPVLISP的的“跟踪跟踪”窗口。窗口。11.3 11.3 创建反应器创建反应器 创建反应器的主要工作就是将事件和回调函数相关联。创建创建反应器的主要工作就是将事件和回调函数相关联。创建反应器用反应器用vlr-vlr-reactor-reactor函数。每种类型的反应器都有一个与函数。每种类型的反应器都有一个与之对应的用于创建该反应器的之对应的用于创建该反应器的AutoLI
29、SPAutoLISP函数,这些函数的名称函数,这些函数的名称和反应器类型的名称相同,只是没有前面的冒号。例如,和反应器类型的名称相同,只是没有前面的冒号。例如,vlr-vlr-acdb-reactoracdb-reactor为创建数据库反应器函数,为创建数据库反应器函数,vlr-toolbar-reactorvlr-toolbar-reactor为创建工具栏反应器函数。所有创建反应器的构造函数都返回为创建工具栏反应器函数。所有创建反应器的构造函数都返回一个反应器对象。一个反应器对象。 AutoLISP ReferenceAutoLISP Reference列出了与每种反应器类型相关的所有可列出
30、了与每种反应器类型相关的所有可能事件。例如,通过能事件。例如,通过vlr-DWG-reactorvlr-DWG-reactor条目,可看到表条目,可看到表11-311-3所示所示与与DWGDWG反应器相关的所有可能事件。反应器相关的所有可能事件。表表11-3 DWG反应器事件反应器事件 事件名称事件名称 说明说明:vlr-beginClose :vlr-beginClose 图形数据库将被关闭。图形数据库将被关闭。:vlr-databaseConstructed :vlr-databaseConstructed 已经构建图形数据库。已经构建图形数据库。:vlr-databaseToBeDest
31、royed :vlr-databaseToBeDestroyed 将从内存中删除图形数据库的内容。将从内存中删除图形数据库的内容。:vlr-beginDwgOpen AutoCAD:vlr-beginDwgOpen AutoCAD将打开图形文件。将打开图形文件。:vlr-endDwgOpen AutoCAD:vlr-endDwgOpen AutoCAD已结束打开操作。已结束打开操作。:vlr-dwgFileOpened :vlr-dwgFileOpened 新图形已被加载到新图形已被加载到AutoCADAutoCAD图形窗口。图形窗口。:vlr-beginSave AutoCAD:vlr-be
32、ginSave AutoCAD将保存图形文件。将保存图形文件。:vlr-saveComplete AutoCAD:vlr-saveComplete AutoCAD已将当前图形保存到磁盘。已将当前图形保存到磁盘。11.3.111.3.1创建对象反应器创建对象反应器 因为对象反应器必须链接到特定的因为对象反应器必须链接到特定的AutoCADAutoCAD图元(对象)上,所以在定义图元(对象)上,所以在定义对象反应器时,必须指定反应器所要链接的图元。创建对象反应器通过函数对象反应器时,必须指定反应器所要链接的图元。创建对象反应器通过函数vlr-object-reactorvlr-object-rea
33、ctor,该函数的调用格式如下:,该函数的调用格式如下: (vlr-object-reactor owners data callbacks)(vlr-object-reactor owners data callbacks) 参数参数ownersowners为为VLAVLA对象表,表内可以是多个对象表,表内可以是多个VLAVLA对象。这些对象也被称为对象。这些对象也被称为反应器的所有者。反应器的所有者。 参数参数datadata为与反应器对象相关联的数据,如果没有数据则该项为为与反应器对象相关联的数据,如果没有数据则该项为nilnil。 参数参数callbackscallbacks为点对表,
34、用于指明事件和与该事件相关联的回调函数。为点对表,用于指明事件和与该事件相关联的回调函数。点对表的格式如下:点对表的格式如下: (event-name . callback_function)(event-name . callback_function) 该点对表的该点对表的event-nameevent-name是表是表11-411-4所示所示ObjectObject事件中的名称标识,事件中的名称标识,callback_functioncallback_function为回调函数。表为回调函数。表11-511-5是针表是针表11-411-4所示对特定的回调事件所示对特定的回调事件返回的回调
35、数据表。返回的回调数据表。 该函数的返回值为该函数的返回值为reactor_object(对象反应器)。(对象反应器)。 名称标识名称标识 事件事件:vlr-cancelled :vlr-cancelled 对对象的修改已经取消。对对象的修改已经取消。:vlr-copied :vlr-copied 对象已被复制。对象已被复制。:vlr-erased :vlr-erased 对象的删除标志已被设置。对象的删除标志已被设置。:vlr-unerased :vlr-unerased 对象的删除标志已被重置。对象的删除标志已被重置。:vlr-goodbye :vlr-goodbye 即将从内存中删除对象
36、。即将从内存中删除对象。:vlr-openedForModify :vlr-openedForModify 即将修改对象。即将修改对象。:vlr-modified :vlr-modified 对象已被修改。如果取消修改,还将激发对象已被修改。如果取消修改,还将激发 :vlr-cancelled :vlr-cancelled 和和:vlr-modifyUndone:vlr-modifyUndone。:vlr-subObjModified :vlr-subObjModified 对象的子图元已被修改。在修改多段线或网格顶对象的子图元已被修改。在修改多段线或网格顶 点时触发该事件。点时触发该事件。:
37、vlr-modifyUndone :vlr-modifyUndone 对象的修改已被放弃。对象的修改已被放弃。:vlr-modifiedXData :vlr-modifiedXData 对象的扩展图元数据已被修改。对象的扩展图元数据已被修改。:vlr-unappended :vlr-unappended 已从图形数据库中拆离对象。已从图形数据库中拆离对象。:vlr-reappended :vlr-reappended 对象已被重新链接到图形数据库。对象已被重新链接到图形数据库。:vlr-objectClosed :vlr-objectClosed 对对象的修改已经完成。对对象的修改已经完成。表
38、表11-4 Object事件及其名称标识事件及其名称标识 名称名称 表长度表长度 参数参数:vlr-cancelled 0:vlr-cancelled 0:vlr-erased :vlr-erased :vlr-unerased :vlr-unerased :vlr-goodbye:vlr-goodbye:vlr-openedForModify :vlr-openedForModify :vlr-modified :vlr-modified :vlr-modifyUndone :vlr-modifyUndone :vlr-modifiedXData :vlr-modifiedXData :vl
39、r-unappended :vlr-unappended :vlr-reappended :vlr-reappended :vlr-objectClosed:vlr-objectClosed:vlr-copied 1 :vlr-copied 1 由复制操作创建的对象由复制操作创建的对象(ename)(ename)。:vlr-subObjModified 1 :vlr-subObjModified 1 已被修改的子对象已被修改的子对象(ename)(ename)。表表11-5 Object 事件回调数据事件回调数据 例如,下面的代码创建了一个对象反应器。该对象反应器例如,下面的代码创建了一个对象
40、反应器。该对象反应器只有一个所有者,即只有一个所有者,即VLAVLA对象对象myCirclemyCircle;与该反应器对象相关;与该反应器对象相关联的数据为联的数据为Circle ReactorCircle Reactor;点对表为;点对表为(:vlr-modified . (:vlr-modified . print-radius)print-radius),当发生,当发生myCirclemyCircle对象被修改(即对象被修改(即:vlr-:vlr-modifiedmodified)事件时,调用)事件时,调用print-radiusprint-radius回调函数:回调函数:(setq
41、circleReactor (vlr-object-reactor (list myCircle) (setq circleReactor (vlr-object-reactor (list myCircle) Circle Reactor (:vlr-modified . print-radius)Circle Reactor (:vlr-modified . print-radius) 上述反应器对象赋给了变量上述反应器对象赋给了变量circleReactorcircleReactor。可以通过该变。可以通过该变量实现对该反应器的查询、修改或删除等。量实现对该反应器的查询、修改或删除等。
42、创建对象反应器除了必须指定反应器所要链接的图元之外,创建对象反应器除了必须指定反应器所要链接的图元之外,还要注意以下几点:还要注意以下几点:(1 1)在定义所有者列表时,只能指定)在定义所有者列表时,只能指定VLAVLA对象,而不允许使用对象,而不允许使用enameename对象。要求对象。要求VLAVLA对象是因为回调函数只能用对象是因为回调函数只能用ActiveXActiveX方法修方法修改改AutoCADAutoCAD对象,而对象,而ActiveXActiveX方法要求使用方法要求使用VLAVLA对象。对象。尽管不能在回调反应器中使用由尽管不能在回调反应器中使用由entlastentla
43、st和和entgetentget等函数获取等函数获取VLAVLA对象,但可以用对象,但可以用vlax-ename-vla-objectvlax-ename-vla-object函数将函数将enameename对象对象转换成转换成VLAVLA对象。对象。(2 2)如果对象已被包括在对象反应器的所有者列表之中,那么)如果对象已被包括在对象反应器的所有者列表之中,那么就不能在回调函数中修改该对象。如果这样做,将会导致一个就不能在回调函数中修改该对象。如果这样做,将会导致一个出错消息,并使出错消息,并使AutoCADAutoCAD崩溃。崩溃。 下面是实现对象反应器功能的实例下面是实现对象反应器功能的实
44、例: :(1 1)加载例)加载例11-311-3所示程序段所示程序段【例例11-311-3】生成一个圆的生成一个圆的VLAVLA对象。对象。(setq myCircle(setq myCircle(progn(progn (setq ctrPt (getpoint (setq ctrPt (getpoint n n输入圆心输入圆心: : ) ) radius (distance ctrPt (getpoint ctrpt n radius (distance ctrPt (getpoint ctrpt n输入半径输入半径 : ): ) ) ) (vla-addCircle (vla-addCi
45、rcle (vla-get-ModelSpace (vla-get-ModelSpace ;将圆加入到图形模型空间;将圆加入到图形模型空间 (vla-get-ActiveDocument (vlax-get-acad-object)(vla-get-ActiveDocument (vlax-get-acad-object) (vlax-3d-point ctrPt) (vlax-3d-point ctrPt) radius radius ) ) 该代码使用该代码使用vla-addCirclevla-addCircle画一个圆,将返回值赋给变量画一个圆,将返回值赋给变量myCirclemyCir
46、cle。该返。该返回值是回值是VLAVLA对象,包含指向所画圆对象的指针。对象,包含指向所画圆对象的指针。(2 2)加载例)加载例11-1 11-1 所示回调函数所示回调函数print-radiusprint-radius。(3 3)定义对象反应器)定义对象反应器(setq circleReactor (vlr-object-reactor (list myCircle)(setq circleReactor (vlr-object-reactor (list myCircle) Circle Reactor (:vlr-modified . print-radius) Circle Reac
47、tor (:vlr-modified . print-radius)(4 4)在)在AutoCADAutoCAD图形窗口图形窗口,选取该圆并修改其大小,选取该圆并修改其大小,print-radius print-radius 函函数将在数将在AutoCADAutoCAD命令窗口显示一个消息。例如,如果用夹点或命令窗口显示一个消息。例如,如果用夹点或STRETCHSTRETCH命令改命令改变了该圆的大小,将在命令提示区显示以下信息:变了该圆的大小,将在命令提示区显示以下信息: * * * STRETCH STRETCH * * * Specify stretch point or Base po
48、int/Copy/Undo/eXit: Specify stretch point or Base point/Copy/Undo/eXit:这个圆的这个圆的半径是半径是: :190.0190.0 如果用夹点或如果用夹点或STRETCHSTRETCH命令改变其他圆时的大小,将没有该提示信息中的命令改变其他圆时的大小,将没有该提示信息中的“这个圆的半径是这个圆的半径是: :”,这是因为在其他的圆上没有链接,这是因为在其他的圆上没有链接circleReactorcircleReactor反应反应器。器。11.3.2 11.3.2 创建其它反应器创建其它反应器 其它反应器不需要链接其它反应器不需要链
49、接AutoCADAutoCAD图元,所以在定义时,只需要两个参数。图元,所以在定义时,只需要两个参数。创建其它反应器通过函数创建其它反应器通过函数vlr-vlr-reactor-reactor,该函数的调用格式如下:,该函数的调用格式如下: (vlr-(vlr-reactor data callbacks)-reactor data callbacks) 参数参数datadata为任意要与反应器对象关联的数据,如果没有数据则该项为为任意要与反应器对象关联的数据,如果没有数据则该项为nilnil。 参数参数callbackscallbacks为点对表,指明事件和与该事件相关联的回调函数,点对为点
50、对表,指明事件和与该事件相关联的回调函数,点对表的格式如下:表的格式如下: (event-name . callback_function)(event-name . callback_function) 例如,下列代码定义了一个例如,下列代码定义了一个DWGDWG编辑器反应器。当用户发出编辑器反应器。当用户发出SaveSave命令时,命令时,该反应器将激活该反应器将激活saveDrawingInfosaveDrawingInfo函数。函数。 (vlr-dwg-Reactor nil (:vlr-saveComplete . saveDrawingInfo)(vlr-dwg-Reactor n
51、il (:vlr-saveComplete . saveDrawingInfo) 在该例中,第一个参数为在该例中,第一个参数为nilnil是因为没有与反应器相关联的数据;第二个是因为没有与反应器相关联的数据;第二个参数是点对表,指明参数是点对表,指明:vlr-saveComplete:vlr-saveComplete事件与事件与saveDrawingInfosaveDrawingInfo回调函数相回调函数相关联。当关联。当:vlr-saveComplete:vlr-saveComplete事件发生时,事件发生时,AutoCADAutoCAD传递给回调函数一个图形传递给回调函数一个图形文件名字的
52、字符串。文件名字的字符串。 每个点对表都指定了反应器要通报的事件,以及该事件发生时要调用的每个点对表都指定了反应器要通报的事件,以及该事件发生时要调用的回调函数。在本例中,只指定了一个事件回调函数。在本例中,只指定了一个事件:vlr-saveComplete:vlr-saveComplete。 只要用户发出命令,不管是从只要用户发出命令,不管是从AutoCADAutoCAD命令行、菜单、工具栏或命令行、菜单、工具栏或AutoLISPAutoLISP程序,都会通知编辑器反应器。所以,该程序,都会通知编辑器反应器。所以,该DWGDWG反应器的回调函数需要明确它反应器的回调函数需要明确它应对什么事件
53、作出响应。在本例中,回调函数应对什么事件作出响应。在本例中,回调函数saveDrawingInfosaveDrawingInfo只是检查只是检查SaveSave命令。命令。 下面是下面是实现实现DWGDWG反应器功能的实例:反应器功能的实例: (1) 1) 加载例加载例11-211-2所定义的回调函数所定义的回调函数saveDrawingInfosaveDrawingInfo。 (2(2) 定义定义DWGDWG反应器反应器 (vlr-dwg-Reactor nil (:vlr-saveComplete . saveDrawingInfo)(vlr-dwg-Reactor nil (:vlr-s
54、aveComplete . saveDrawingInfo) (3 3)在)在AutoCADAutoCAD图形窗口点取存盘的图标或调用存图的命令。当完成存图形窗口点取存盘的图标或调用存图的命令。当完成存图工作时将会弹出图图工作时将会弹出图11-111-1所示的所示的AutoCAD MessageAutoCAD Message对话框。说明该实例成功。对话框。说明该实例成功。图图11-1AutoCAD11-1AutoCAD的的MessageMessage对话框对话框 11.3.3 11.3.3 将数据附着到反应器对象将数据附着到反应器对象 利用创建反应器函数的参数利用创建反应器函数的参数datad
55、ata可以为反应器指定与其关联的数据,如可以为反应器指定与其关联的数据,如果该项为果该项为nilnil,表示不需要为反应器指定与其关联的数据。,表示不需要为反应器指定与其关联的数据。 一个对象可能链接多个反应器,如果它们的参数一个对象可能链接多个反应器,如果它们的参数datadata都为都为nilnil,应用程,应用程序将无法区分它们。在这种情况下就应该为反应器指定文本字符串或应用程序将无法区分它们。在这种情况下就应该为反应器指定文本字符串或应用程序能识别的其它数据。序能识别的其它数据。 例如,前面创建对象反应器例如,前面创建对象反应器circleReactorcircleReactor的实例
56、中,字符串的实例中,字符串“CircleReactorCircleReactor”就是与反应器就是与反应器circleReactorcircleReactor相关联的数据。相关联的数据。11.4 11.4 查询、修改和控制反应器的状态查询、修改和控制反应器的状态11.4.1 11.4.1 查询反应器查询反应器 有多种不同的方法来获取反应器的信息。可以使用标准的有多种不同的方法来获取反应器的信息。可以使用标准的VLISPVLISP数据查数据查看工具查看反应器的信息,也可以用有关反应器的看工具查看反应器的信息,也可以用有关反应器的AutoLISPAutoLISP函数。函数。1.1.了解图形中有关反
57、应器的总体情况了解图形中有关反应器的总体情况 通过通过vlr-reactorsvlr-reactors函数可以了解当前图形中总共用到了哪些函数可以了解当前图形中总共用到了哪些反应器或有哪些指定类型的反应器。反应器或有哪些指定类型的反应器。vlr-reactorsvlr-reactors函数的调用格函数的调用格式如下:式如下:(vlr-reactors reactor-type.)(vlr-reactors reactor-type.) 参数参数reactor-typereactor-type为反应器类型的标识符。如果指定了为反应器类型的标识符。如果指定了reactor-typereactor-
58、type参数,该函数返回由指定类型反应器组成的表。如参数,该函数返回由指定类型反应器组成的表。如果省略参数果省略参数reactor-typereactor-type,该函数返回所有当前图形所有的反应,该函数返回所有当前图形所有的反应器。器。 以下表达式列出图形中的所有反应器:以下表达式列出图形中的所有反应器: (vlr-reactors)(vlr-reactors) ;返回;返回(:VLR-Object-Reactor #VLR-Object-(:VLR-Object-Reactor #) (:VLR-Editor-Reactor #)Reactor) (:VLR-Editor-Reactor
59、 #),有一个对象,有一个对象反应器和一个编辑器反应器。反应器和一个编辑器反应器。以下表达式列出所有的对象反应器:以下表达式列出所有的对象反应器: (vlr-reactors :vlr-object-reactor)(vlr-reactors :vlr-object-reactor) ;返回;返回(:VLR-Object-(:VLR-Object-Reactor #)Reactor #),有一个对象反应器,有一个对象反应器以下表达式列出所有数据库反应器:以下表达式列出所有数据库反应器:(vlr-reactors :vlr-acdb-reactor)(vlr-reactors :vlr-acdb
60、-reactor) ;返回;返回nilnil,没有数据库反应器,没有数据库反应器以下表达式列出所有以下表达式列出所有DWGDWG反应器:反应器: (vlr-reactors :vlr-dwg-reactor)(vlr-reactors :vlr-dwg-reactor);返回;返回(:VLR-DWG-Reactor (:VLR-DWG-Reactor # #)# #),有一个,有一个DWGDWG反应器,有两个指反应器,有两个指向该向该DWGDWG反应器的指针。反应器的指针。2. 2. 用用VLISPVLISP的检验工具检查反应器的检验工具检查反应器 可以使用可以使用VLISPVLISP的检验工
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 城市公园健身区廊架施工合同
- 园林绿化施工代理合同
- 港口客运站施工图设计合同
- 2024年大型设备租赁合同
- 2024花木苗定购合同范文
- 历史建筑幕墙安装合同模板
- 2024年别墅区景观规划合同
- 2024年企业间环境保护与污染治理合同
- 地下停车场反支撑吊顶转换层方案
- 2024年云计算服务使用合同
- 重症感染合并糖尿病
- 《业财融合》纲要课件
- 人工智能伦理与社会影响的讨论
- 运动损伤的预防措施适当的热身和拉伸
- 2024年深交所期权测试专业考试库
- 公司生产总监述职报告
- 小学生消防知识竞赛题(含答案)
- 2023年乒乓球二级裁判考试题库(含答案)
- 智能控制技术未来职业生涯发展展示
- 2023年(输电专业)安全准入考试题库(附答案)
- 房车营地规划设施方案
评论
0/150
提交评论