第十二章 反应器和回调函数 (二) 反应器类型
反应器类型AutoCAD反应器有多种类型,每种反应器对应一个或多个AutoCAD事件。不同类型的反应器可以分为如下五大类:
数据库反应器
当图形数据库发生特定类型事件时(如当对象被添加到图形数据库),数据库反应器将通知应用程序。
文档反应器
如果当前图形文档发生改变(如打开新的图形文档、激活其他文档窗口、改变文档的锁定状态等),文档反应器将通知应用程序。这并不包括所有包含于编辑器反应器中的事件。
编辑器反应器
在调用AutoCAD命令(如打开图形、关闭图形、保存图形、输入输出DXF文件、改变系统变量的值等)时,编辑器反应器将通知应用程序。
链接反应器
当加载和卸载ARX应用程序时,链接反应器将通知应用程序。
对象反应器
当特定对象被修改、复制或删除时,对象反应器将通知应用程序。
除了编辑器反应器外,其他类别的反应器只有一种反应器类型。下表列出了Visual LISP代码中的所有反应器类型:
反应器类型表
反应器类型标志符说明
:VLR-AcDb-Reactor 数据库反应器
:VLR-DocManager-Reactor 文档管理反应器
:VLR-Editor-Reactor 通用编辑器反应器,为向后兼容而保留
:VLR-Linker-Reactor 链接反应器
:VLR-Object-Reactor 对象反应器
从 AutoCAD 2000 开始,编辑器反应器被分为更明确的几种反应器类型。:VLR-Editor-Reactor 类型是为考虑向后兼容才保留的,但在 AutoCAD 2000 中引入的新编辑器反应器不能通过 :VLR-Editor-Reactor 引用。下表列出了从 AutoCAD 2000 开始可用的编辑器反应器类型:
编辑器反应器类型
反应器类型说明
: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-Reactor 通报对系统变量的修改
:VLR-Toolbar-Reactor 通报对工具栏上位图的修改
:VLR-Undo-Reactor 通报 undo 事件
:VLR-Wblock-Reactor 通报和写块有关的事件
:VLR-Window-Reactor 通报和移动 AutoCAD 窗口或改变 AutoCAD 窗口大小有关的事件
:VLR-XREF-Reactor 通报和附着或修改 XREF 有关的事件
注:用vlr-types函数可返回反应器类型的完整列表。
对每种反应器,都有一些事件可使它通知应用程序,这些事件被称为回调事件,因为它们将触发反应器调用与该事件相关的函数。例如,当发出Save或QSAVE命令保存图形时,会发生:vlr-beginSave事件。当保存过程结束时,会发生:vlr-saveComplete事件。在设计基于反应器的应用程序时,要确定所感兴趣的事件,并编写这些事件发生时所要激活的回调函数。
vlr-reaction-names函数返回与给定反应器类型相关的所有事件组成的表:
(vlr-reaction-names reactor type)
例如,下述命令返回和对象反应器相关的所有事件组成的表:
$ (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)
注:如果该命令或其他任何vlr-*命令失败,并出现“函数未定义”消息,那么有可能是忘了调用用于加载AutoLISP反应器支持函数的vl-load-com函数。
在VLISP加载并运行如下代码,可以打印出所有相关反应器事件列表(按反应器类型排序):
(defun print-reactors-and-events ()
(foreach rtype (vlr-types)
(princ (strcat "\n" (vl-princ-to-string rtype)))
(foreach rname (vlr-reaction-names rtype)
(princ (strcat "\n\t" (vl-princ-to-string rname)))
)
)
(princ)
)
http://bbs.mjtd.com/xwb/images/bgimg/icon_logo.png 该贴已经同步到 明经通道的微博 楼主辛苦了!留下记号,以备学习 嗨,哥们:能不能不照本宣科,来点树上没有的果子。 今天终于能上网了。
页:
[1]