明经通道 发表于 2012-12-5 20:21:37

第十二章 反应器和回调函数 (一) Visual LISP反应器函数

第十二章 反应器和回调函数

注意:本章的部分内容源于AutoCAD 2002在线帮助文档,并做了部分修改以提供更多的例子和说明。

警告:尽管反应器对开发人员来说确实很好很强大,但在使用时却要特别谨慎和节制。根据定义在某一特定情况下反应器的不同类型和数量,你可能会很容易并快速地消耗系统资源并使AutoCAD变得迟钝,甚至不稳定或死机。所以在选择如何在应用程序开发使用反应器时要特别小心。

反应器是AutoCAD和用户的应用程序之间的简单链接,它允许用函数来响应发生在AutoCAD内的事件。例如可以创建反应器来通知用户的应用程序某个图元被删除。此时应用程序就会执行一些动作去响应这个事件。在窗体上的按钮是一个事件驱动程序的简单例子,它使用事件和响应来执行动作。当选择该按钮时,它就激活事件,就象信号或广播。该事件被反应器侦查到并通过使用被称为回调过程来执行作为结果的动作。

在AutoCAD中,你可考虑这种方案,例如使用CommandWillStart事件来激发一个命令反应器回调函数,基于那些被执行过的命令来执行的一些动作。就如当用户启动HATCH命令时,你想通过激发一个回调函数来做这样的回应,就是在阴影被放入图形中之前将指定的图层设为当前图层,而当命令完成后,又想恢复之前的图层状态。而且你还想要在该命令由于错误而失败时,也能恢复到原来的图层状态?又或者当用户在中途想直接按取消键取消该命令时又如何?这此都可以通过使用反应器和Visual LISP程序来实现。

你首先要做的是定义一个将要被用于回调的函数。如果该函数作为命令反应器的结果,那么切记不要在函数中使用(command)或(vl-cmdf),因为这会启动无限次循环并最终令AutoCAD崩溃。这听起来象常识,对吧?但有时侯这样的事虽不明显却会造成巨大的问题。这也就是对开发者来说需要特别小心使用反应器的原因。

下一步要做的就是定义反应器,并且构建这个反应器,当事件检测遇到合适的条件时,它能调用回调函数。(命令是HATCH或BHATCH,忽略所有其它命令)。

表12-1显示了你如何使用命令反应器去响应HATCH或BHATCH命令,定义“HATCHING”图层并将其设为当前图层直至该完成(通过CommandEnded事件),或因出错而中止(通过CommandFailed事件),或用户取消(通过CommandCancelled事件)。

Visual LISP反应器函数

( vl-load-com) 加载AutoLISP反应器支持函数和其它AutoLISP扩展
( vlr-acdb-reactor data callbacks) 构造一个全局的“数据库”反应器对象
( vlr-add obj) 启动一个被禁用的反应器对象
( vlr-added-p obj) 测试以确定指定的反应器对象是否已启用
( vlr-beep-reaction ) 产生声音提示的回调函数
( vlr-current-reaction-name) 如果在反应器回调函数中调用该函数,它返回当前事件的名称(符号)
( vlr-data obj) 返回与反应器相关的应用程序特定数据
( vlr-data-set obj data) 覆盖与反应器相关的应用程序特定数据
( vlr-deepclone-reactor obj data) 构造编辑器反应器对象,在发生深度克隆事件时给出通知
( vlr-docmanager-reactor obj data) 构造反应器对象,通知与图形文档相关的事件
( vlr-dwg-reactor obj data) 构造编辑器反应器对象,通知图形事件(如打开或关闭图形文件)
( vlr-dxf-reactor obj data) 构造编辑器反应器对象,通知与读写 DXF 文件相关的事件
( vlr-editor-reactor data callbacks) 构造全局的“编辑器”反应器对象
( vlr-linker-reactor data callbacks) 构造全局的“链接”反应器对象,在每次应用程序加载或卸载 ObjectARX 应用程序时通知应用程序
( vlr-miscellaneous-reactor data callbacks) 构造编辑器反应器对象,它不属于任何其他编辑器反应器类型
( vlr-mouse-reactor data callbacks) 构造编辑器反应器对象,通知鼠标事件(如双击)
( vlr-notification reactor) 确定当反应器相关联的名称空间不在活动状态时是否激发反应器
( vlr-object-reactor owners data callbacks) 构造对象反应器对象
( vlr-owner-add reactor owner) 将对象添加到对象反应器的所有者列表
( vlr-owner-remove reactor owner) 从对象反应器的所有者列表中删除对象
( vlr-owners reactor) 返回对象反应器的所有者列表
( vlr-pers reactor) 使反应器成为永久反应器(非临时)
( vlr-pers-list [reactor]) 返回由当前图形文档中永久反应器组成的表
( vlr-pers-p reactor) 确定反应器是否是永久反应器
( vlr-pers-release reactor) 使反应器成为临时反应器(非永久)
( vlr-reaction-name reactor-type) 返回由该类型反应器所有可能回调条件组成的表
( vlr-reaction-set reactor event function) 添加或替换反应器中的一个回调函数
( vlr-reactions reactor) 返回反应器的形如 (event-name . callback_function) 的点对表
( vlr-reactors ) 返回由现有反应器组成的表
( vlr-remove reactor) 禁用反应器
( vlr-remove-all reactor-type) 禁用指定类型的所有反应器
( vlr-set-notification reactor `range) 确定当相关联的名称空间不在活动状态时是否执行反应器回调函数
( vlr-sysvar-reactor data callbacks) 构造编辑器反应器对象,在修改系统变量时通知应用程序
( vlr-toolbar-reactor data callbacks) 构造编辑器反应器对象,在工具栏中的位图改变时通知应用程序
( vlr-trace-reaction) 预定义回调函数,在“跟踪”窗口显示一个或多个回调参数
( vlr-type reactor) 返回代表反应器类型的符号
( vlr-types) 返回由所有反应器类型组成的表(见下一节)
( vlr-undo-reactor data callbacks) 构造通知放弃操作的编辑器反应器
( vlr-wblock-reactor data callbacks) 构造编辑器反应器对象,在发生与写块相关的事件时通知应用程序
( vlr-window-reactor data callbacks) 构造编辑器反应器对象,在发生与移动或缩放 AutoCAD 窗口相关的事件时通知应用程序
( vlr-xref-reactor data callbacks) 构造编辑器反应器对象,在发生附着或修改外部参照事件时通知应用程序



http://bbs.mjtd.com/xwb/images/bgimg/icon_logo.png 该贴已经同步到 明经通道的微博

zcmzz0511 发表于 2012-12-6 09:07:21

抢沙发啦,楼主辛苦了

zyhandw 发表于 2012-12-6 10:10:14

感谢楼主!
先做一标记,留待以后学习

东北-水地暖-温 发表于 2012-12-6 12:54:26

这才刚刚登堂入室,接下来才能细品堂奥。

smartstar 发表于 2012-12-8 17:56:19

支持明经。

pengfei2010 发表于 2013-6-12 22:23:08

谢谢,学习了,这个很强大

ltrliu 发表于 2015-8-11 15:04:25

新人学习中

趣意人生 发表于 2021-9-29 08:22:19

感谢楼主! 先做一标记,留待以后学习
页: [1]
查看完整版本: 第十二章 反应器和回调函数 (一) Visual LISP反应器函数