第11章 使用反应器 清华CAD二次开发 LISP

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

第11章使用反应器11.1反应器反应器是一种反馈机制,它可以在发生某些特定事件时,将所发生的事件通知给应用程序,应用程序将会根据发生的具体事件做出相应的决策。例如,在某个图元上链接了一个反应器,如果用户移动这个图元,应用程序就会接到反应器的通知,知道了该图元被移动这个事件,如果需要,应用程序可以用适当的动作(如移动与该图元相关的其它图元,或显示有关信息等)响应该通知。1.反应器的类型反应器有多种类型,每种反应器对应一个或多个AutoCAD事件。反应器可以分为以下几个大类:l数据库反应器:当图形数据库发生特定类型的事件时,该反应器将通知应用程序。l文档反应器:当前图形文档发生改变(如打开新的图形文档、激活其它文档窗口、改变文档的锁定状态等)时,该反应器将通知应用程序。l编辑器反应器:在调用AutoCAD命令(如打开图形、关闭图形、保存图形、输入输出DXF文件、改变系统变量的值等)时,该反应器将通知应用程序。l链接反应器:当加载和卸载ARX应用程序时,该反应器将通知应用程序。l对象反应器:当特定对象(AutoCAD图元)被修改、复制或删除时,该反应器将通知应用程序。调用函数vlr-types可返回反应器类型的完整列表。表11-1列出了AutoCAD反应器类型及其标识符。表11-1AutoCAD反应器类型及其标识符反应器类型的标识符说明:VLR-AcDb-Reactor数据库反应器:VLR-DocManager-Reactor文档管理反应器:VLR-Editor-Reactor通用编辑器反应器:VLR-Linker-Reactor链接反应器:VLR-Object-Reactor对象反应器其中通用编辑器反应器被进一步细分为更加明确的几种反应器类型,见表11-2。表11-1中的通用编辑器反应器类型只是为了向后兼容才保留的,表11-2所示的各种编辑类型的反应器不能被通用编辑器:VLR-Editor-Reactor引用。表11-2编辑类型的各种反应器及其标识符反应器类型的标识符说明:VLR-Command-Reactor通报命令事件:VLR-DeepClone-Reactor通报deepclone事件:VLR-DWG-Reactor通报打开或关闭图形文件的事件:VLR-DXF-Reactor通报和读写DXF文件相关的事件:VLR-Insert-Reactor通报和插入块有关的事件:VLR-Lisp-Reactor通报LISP事件:VLR-Miscellaneous-Reactor(表中未列出的)其它编辑器反应器类型:VLR-Mouse-Reactor通报鼠标事件(例如双击):VLR-SysVar-Reactor通报对系统变量的修改:VLR-Toolbar-Reactor通报对工具栏上位图的修改:VLR-Undo-Reactor通报undo事件:VLR-Wblock-Reactor通报和写块有关的事件:VLR-Window-Reactor通报和移动或改变AutoCAD窗口大小的事件:VLR-XREF-Reactor通报附着或修改XREF有关的事件3.反应器回调事件大部分AutoCAD操作都会产生一些特定的事件,这些事件能够用来触发反应器的动作,这样的事件被称为回调事件。例如,当发出Save命令保存图形时,将会发生AutoCAD保存图形文件(:vlr-beginSave)的事件,当保存过程结束时,将会发生AutoCAD已将当前图形保存到磁盘(:vlr-saveComplete)的事件。设计基于反应器的应用程序就是根据回调事件的内容编写这些事件发生时所要激活的函数。vlr-reaction-names函数返回与给定反应器类型相关的所有事件组成的表:(vlr-reaction-namesreactor-type)参数reactor-type是反应器类型的标识,见表11-1和表11-2。例如,下列代码将返回和图形反应器相关的所有事件组成的表:(vlr-reaction-names:VLR-DWG-Reactor)返回(:VLR-beginDwgOpen:VLR-endDwgOpen:VLR-dwgFileOpened:VLR-databaseConstructed:VLR-databaseToBeDestroyed:VLR-beginSave:VLR-saveComplete:VLR-beginClose)下列代码将返回和对象反应器相关的所有事件组成的表:(vlr-reaction-names:vlr-object-reactor);返回(:VLR-cancelled:VLR-copied:VLR-erased:VLR-unerased:VLR-goodbye:VLR-openedForModify:VLR-modified:VLR-subObjModified:VLR-modifyUndone:VLR-modifiedXData:VLR-unappended:VLR-reappended:VLR-objectClosed)加载并运行以下代码,将会打印出所有相关反应器事件的列表(按反应器类型排序)。(defunprint-reactors-and-events()(foreachrtype(vlr-types)(princ(strcat\n(vl-princ-to-stringrtype)))(foreachrname(vlr-reaction-namesrtype)(princ(strcat\n\t(vl-princ-to-stringrname)))))(princ))AutoLISPReference列出了与各种反应器类型相关的所有事件,有关信息在创建反应器的函数部分做了说明。和ActiveX一样,必须首先调用vl-load-com函数,加载支持反应器和其它AutoLISP扩展函数之后,才能实现反应器的功能。11.2定义反应器的回调函数反应器的回调函数就是回调事件发生时所要执行的函数。反应器的回调函数是用AutoLISP定义的。编写回调函数有以下一些限制:①不能使用command函数调用AutoCAD命令,只能用ActiveX函数访问图形对象。②不能使用entget和entmod函数。③不能使用选择集操作函数。④不能使用交互输入函数。⑤在事件处理函数中不要加载警告和信息之外的对话框。定义对象反应器回调函数和定义其它反应器的回调函数也不完全相同。11.2.1定义对象反应器的回调函数定义对象反应器的回调函数的格式如下:(defunfunction(notifier-objectreactor-objectparameter-list)…)参数notifier-object是事件发生的对象。参数reactor-objec是调用这个函数的反应器对象。参数parameter-list是回调事件返回的回调数据表。例如,例11-1定义了名为print-radius的回调函数。notifier-object是事件发生的对象,reactor-object是调用这个函数的反应器对象,parameter-list是回调事件返回的回调数据表。虽然在本例并不关心parameter-list的值,但定义回调函数时,也要进行变量声明。【例11-1】定义名字为print-radius的回调函数,该函数用来打印圆的半径。(defunprint-radius(notifier-objectreactor-objectparameter-list)(vl-load-com)(cond((vlax-property-available-pnotifier-objectRadius);判断该图形对象是否具有radius特性(princ“这个圆的半径是:)(princ(vla-get-radiusnotifier-object)))))11.2.2定义其它反应器的回调函数由于其它反应器不需要链接到AutoCAD图元上,因此定义其它反应器的回调函数只需要以下两个参数:(defunfunction(reactor-objectparameter-list)…)参数reactor-object是调用这个函数的反应器对象。参数parameter-list是回调事件返回的回调数据表。例11-2定义了名为saveDrawingInfo的回调函数。参数calling-reactor是调用该函数的反应器对象。参数commandInfo是回调事件返回的回调数据表。该函数在发生保存AutoCAD图形的事件时将被激活,显示文件的路径和大小等信息。【例11-2】定义名字为saveDrawingInfo的回调函数。(defunsaveDrawingInfo(calling-reactorcommandInfo/dwgnamefilesize)(vl-load-com)(setqdwgname(cadrcommandInfo)filesize(vl-file-sizedwgname))(alert(strcat这个文件(dwgname)的大小是(itoafilesize)字节.))(princ))在该例中,通过函数vl-file-size获取图形文件的大小,通过警告对话框显示这些信息。11.2.3.AutoCAD预定义的回调函数AutoCAD提供了两个预定义的回调函数,可以在测试反应器时使用这些函数:(1)vlr-beep-reaction函数vlr-beep-reaction的功能是让计算机发出“嘟嘟”声。(2)vlr-trace-reaction函数vlr-trace-reaction函数的功能是将参数列表打印到VLISP的“跟踪”窗口。11.3创建反应器创建反应器的主要工作就是将事件和回调函数相关联。创建反应器用vlr--reactor函数。每种类型的反应器都有一个与之对应的用于创建该反应器的AutoLISP函数,这些函数的名称和反应器类型的名称相同,只是没有前面的冒号。例如,vlr-acdb-reactor为创建数据库反应器函数,vlr-toolbar-reactor为创建工具栏反应器函数。所有创建反应器的构造函数都返回一个反应器对象。AutoLISPReference列出了与每种反应器类型相关的所有可能事件。例如,通过vlr-DWG-reactor条目,可看到表11-3所示与DWG反应器相关的所有可能事件。表11-3DWG反应器事件事件名称说明:vlr-beginClose图形数据库将被关闭。:vlr-databaseConstructed已经构建图形数据库。:vlr-databaseToBeDestroyed将从内存中删除图形数据库的内容。:vlr-beginDwgOpenAutoCAD将打开图形文件。:vlr-endDwgOpenAutoCAD已结束打开操作。:vlr-dwgFileOpened新图形已被加载到AutoCAD图形窗口。:vlr-beginSaveAutoCAD将保存图形文件。:vlr-saveCompleteAutoCAD已将当前图形保存到磁盘。11.3.1创建对象反应器因为对象反应器必须链接到特定的AutoCAD图元(对象)上,所以在定义对象反应器时,必须指定反应器所要链接的图元。创建对象反应器通过函数vlr-object-reactor,该函数的调用格式如下:(vlr-object-reactorownersdatacallbacks)参数owners为VLA对象表,表内可以是多个VLA对象。这些对象也被称为反应器的所有者。参数data为与反应器对象相关联的数据,如果没有数据则该项为nil。参数callbacks为点对表,用于指明事件和与该事件相关联的回调函数。点对表的格式如下:(event-name.callback_function)该点对表的event-name是表11-4所示Object事件中的名称标识,callback_function为回调函数。表11-5是针表11-4所示对特定的回调事件返回的回调数据表。该函数的返回值为reactor_objec

1 / 60
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功