AutoLISP使用反应器【高级课件】

上传人:8** 文档编号:163860814 上传时间:2021-01-25 格式:PPT 页数:60 大小:659KB
返回 下载 相关 举报
AutoLISP使用反应器【高级课件】_第1页
第1页 / 共60页
AutoLISP使用反应器【高级课件】_第2页
第2页 / 共60页
AutoLISP使用反应器【高级课件】_第3页
第3页 / 共60页
AutoLISP使用反应器【高级课件】_第4页
第4页 / 共60页
AutoLISP使用反应器【高级课件】_第5页
第5页 / 共60页
点击查看更多>>
资源描述

《AutoLISP使用反应器【高级课件】》由会员分享,可在线阅读,更多相关《AutoLISP使用反应器【高级课件】(60页珍藏版)》请在金锄头文库上搜索。

1、第11章 使用反应器,1,精制课件,11.1 反应器 反应器是一种反馈机制,它可以在发生某些特定事件时,将所发生的事件通知给应用程序,应用程序将会根据发生的具体事件做出相应的决策。例如,在某个图元上链接了一个反应器,如果用户移动这个图元,应用程序就会接到反应器的通知,知道了该图元被移动这个事件,如果需要,应用程序可以用适当的动作(如移动与该图元相关的其它图元,或显示有关信息等)响应该通知。 1. 反应器的类型 反应器有多种类型,每种反应器对应一个或多个AutoCAD事件。反应器可以分为以下几个大类: l数据库反应器:当图形数据库发生特定类型的事件时,该反应器将通知应用程序。,2,精制课件,l文

2、档反应器:当前图形文档发生改变(如打开新的图形文档、激活其它文档窗口、改变文档的锁定状态等)时,该反应器将通知应用程序。 l编辑器反应器:在调用AutoCAD命令(如打开图形、关闭图形、保存图形、输入输出DXF文件、改变系统变量的值等)时,该反应器将通知应用程序。 l链接反应器:当加载和卸载ARX应用程序时,该反应器将通知应用程序。 l对象反应器:当特定对象(AutoCAD图元)被修改、复制或删除时,该反应器将通知应用程序。 调用函数vlr-types可返回反应器类型的完整列表。表11-1列出了AutoCAD反应器类型及其标识符。,3,精制课件,表11-1AutoCAD反应器类型及其标识符,反

3、应器类型的标识符 说明 :VLR-AcDb-Reactor 数据库反应器 :VLR- DocManager- Reactor 文档管理反应器 :VLR-Editor- Reactor 通用编辑器反应器 :VLR-Linker- Reactor 链接反应器 :VLR-Object- Reactor 对象反应器,其中通用编辑器反应器被进一步细分为更加明确的几种反应器类型,见表11-2。表11-1中的通用编辑器反应器类型只是为了向后兼容才保留的,表11-2所示的各种编辑类型的反应器不能被通用编辑器 :VLR-Editor-Reactor引用。,4,精制课件,表11-2 编辑类型的各种反应器及其标识符

4、,反应器类型的标识符 说明 :VLR-Command-Reactor 通报命令事件 :VLR-DeepClone-Reactor 通报 deep clone 事件 :VLR-DWG-Reactor 通报打开或关闭图形文件的事件 :VLR-DXF-Reactor 通报和读写 DXF 文件相关的事件 :VLR-Insert-Reactor 通报和插入块有关的事件 :VLR-Lisp-Reactor 通报 LISP 事件 :VLR-Miscellaneous-Reactor (表中未列出的)其它编辑器反应器类型 :VLR-Mouse-Reactor 通报鼠标事件(例如双击) :VLR-SysVar-

5、Reactor 通报对系统变量的修改 :VLR-Toolbar-Reactor 通报对工具栏上位图的修改 :VLR-Undo-Reactor 通报 undo 事件 :VLR-Wblock-Reactor 通报和写块有关的事件 :VLR-Window-Reactor 通报和移动或改变AutoCAD窗口大小的事件 :VLR-XREF-Reactor 通报附着或修改 XREF 有关的事件,5,精制课件,3. 反应器回调事件 大部分AutoCAD操作都会产生一些特定的事件,这些事件能够用来触发反应器的动作,这样的事件被称为回调事件。例如,当发出Save命令保存图形时,将会发生AutoCAD保存图形文件

6、(:vlr-beginSave)的事件,当保存过程结束时,将会发生AutoCAD已将当前图形保存到磁盘(:vlr-saveComplete)的事件。设计基于反应器的应用程序就是根据回调事件的内容编写这些事件发生时所要激活的函数。 vlr-reaction-names函数返回与给定反应器类型相关的所有事件组成的表: (vlr-reaction-names reactor-type) 参数reactor-type是反应器类型的标识,见表11-1和表11-2。,6,精制课件,例如,下列代码将返回和图形反应器相关的所有事件组成的表: (vlr-reaction-names :VLR-DWG-React

7、or) 返回(: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 :

8、VLR-openedForModify :VLR-modified :VLR-subObjModified :VLR-modifyUndone :VLR-modifiedXData :VLR-unappended :VLR-reappended :VLR-objectClosed),7,精制课件,加载并运行以下代码,将会打印出所有相关反应器事件的列表(按反应器类型排序)。 (defun print-reactors-and-events () (foreach rtype (vlr-types) (princ (strcat n (vl-princ-to-string rtype) (fore

9、ach rname (vlr-reaction-names rtype) (princ (strcat nt (vl-princ-to-string rname) (princ) ) AutoLISP Reference列出了与各种反应器类型相关的所有事件,有关信息在创建反应器的函数部分做了说明。 和ActiveX一样,必须首先调用vl-load-com函数,加载支持反应器和其它AutoLISP扩展函数之后,才能实现反应器的功能。,8,精制课件,11.2 定义反应器的回调函数 反应器的回调函数就是回调事件发生时所要执行的函数。反应器的回调函数是用AutoLISP定义的。编写回调函数有以下一些限

10、制: 不能使用command函数调用AutoCAD命令,只能用ActiveX函数访问图形对象。 不能使用entget和entmod函数。 不能使用选择集操作函数。 不能使用交互输入函数。 在事件处理函数中不要加载警告和信息之外的对话框。 定义对象反应器回调函数和定义其它反应器的回调函数也不完全相同。,9,精制课件,11.2.1 定义对象反应器的回调函数 定义对象反应器的回调函数的格式如下: (defun function (notifier-object reactor-object parameter-list) 参数notifier-object是事件发生的对象。 参数reactor-ob

11、jec是调用这个函数的反应器对象。 参数parameter-list是回调事件返回的回调数据表。 例如,例11-1定义了名为print-radius的回调函数。notifier-object是事件发生的对象,reactor-object是调用这个函数的反应器对象,parameter-list是回调事件返回的回调数据表。虽然在本例并不关心parameter-list的值,但定义回调函数时,也要进行变量声明。,10,精制课件,【例11-1】定义名字为print-radius的回调函数,该函数用来打印圆的半径。 (defun print-radius (notifier-object reactor

12、-object parameter-list) (vl-load-com) (cond (vlax-property-available-p notifier-object Radius) ;判断该图形对象是否具有radius特性 (princ “这个圆的半径是: ) (princ (vla-get-radius notifier-object) ) ) ),11,精制课件,11.2.2 定义其它反应器的回调函数 由于其它反应器不需要链接到AutoCAD图元上,因此定义其它反应器的回调函数只需要以下两个参数: (defun function(reactor-object parameter-l

13、ist) 参数reactor-object是调用这个函数的反应器对象。 参数parameter-list是回调事件返回的回调数据表。 例11-2定义了名为saveDrawingInfo的回调函数。参数calling-reactor是调用该函数的反应器对象。参数commandInfo是回调事件返回的回调数据表。该函数在发生保存AutoCAD图形的事件时将被激活,显示文件的路径和大小等信息。,12,精制课件,【例11-2】定义名字为saveDrawingInfo的回调函数。 (defun saveDrawingInfo(calling-reactor commandInfo / dwgname f

14、ilesize) (vl-load-com) (setq dwgname (cadr commandInfo) filesize (vl-file-size dwgname) (alert(strcat 这个文件( dwgname )的大小是 (itoa filesize) 字节.) (princ) ) 在该例中,通过函数vl-file-size获取图形文件的大小,通过警告对话框显示这些信息。,13,精制课件,11.2.3. AutoCAD预定义的回调函数 AutoCAD提供了两个预定义的回调函数,可以在测试反应器时使用这些函数: (1)vlr-beep-reaction函数 vlr-beep

15、-reaction的功能是让计算机发出“嘟嘟”声。 (2)vlr-trace-reaction函数 vlr-trace-reaction函数的功能是将参数列表打印到VLISP的“跟踪”窗口。,14,精制课件,11.3 创建反应器 创建反应器的主要工作就是将事件和回调函数相关联。创建反应器用vlr-reactor函数。每种类型的反应器都有一个与之对应的用于创建该反应器的AutoLISP函数,这些函数的名称和反应器类型的名称相同,只是没有前面的冒号。例如,vlr-acdb-reactor为创建数据库反应器函数,vlr-toolbar-reactor为创建工具栏反应器函数。所有创建反应器的构造函数都

16、返回一个反应器对象。 AutoLISP Reference列出了与每种反应器类型相关的所有可能事件。例如,通过vlr-DWG-reactor条目,可看到表11-3所示与DWG反应器相关的所有可能事件。,15,精制课件,表11-3 DWG反应器事件,事件名称 说明 :vlr-beginClose 图形数据库将被关闭。 :vlr-databaseConstructed 已经构建图形数据库。 :vlr-databaseToBeDestroyed 将从内存中删除图形数据库的内容。 :vlr-beginDwgOpen AutoCAD将打开图形文件。 :vlr-endDwgOpen AutoCAD已结束打开操作。 :vlr-dwgFileOpened 新图形已被加载到AutoCAD图形窗口。 :vlr-beginSave AutoCAD将保存图形文件。 :v

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号