明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 4151|回复: 3

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

[复制链接]
发表于 2012-12-9 12:59 | 显示全部楼层 |阅读模式
反应器类型
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)
)



该贴已经同步到 明经通道的微博

本帖被以下淘专辑推荐:

发表于 2012-12-12 15:19 | 显示全部楼层
楼主辛苦了!留下记号,以备学习
发表于 2012-12-12 17:47 | 显示全部楼层
嗨,哥们:能不能不照本宣科,来点树上没有的果子。
发表于 2012-12-13 12:24 | 显示全部楼层
今天终于能上网了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-4-20 04:08 , Processed in 0.277435 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表