明经通道 发表于 2012-12-9 12:59:20

第十二章 反应器和回调函数 (二) 反应器类型

反应器类型
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 该贴已经同步到 明经通道的微博

zyhandw 发表于 2012-12-12 15:19:15

楼主辛苦了!留下记号,以备学习

东北-水地暖-温 发表于 2012-12-12 17:47:42

嗨,哥们:能不能不照本宣科,来点树上没有的果子。

smartstar 发表于 2012-12-13 12:24:54

今天终于能上网了。
页: [1]
查看完整版本: 第十二章 反应器和回调函数 (二) 反应器类型