使用反应器清华CAD二次开发LISP.ppt
《使用反应器清华CAD二次开发LISP.ppt》由会员分享,可在线阅读,更多相关《使用反应器清华CAD二次开发LISP.ppt(60页珍藏版)》请在三一办公上搜索。
1、第 11 章 使用反应器,11.1 反应器 反应器是一种反馈机制,它可以在发生某些特定事件时,将所发生的事件通知给应用程序,应用程序将会根据发生的具体事件做出相应的决策。例如,在某个图元上链接了一个反应器,如果用户移动这个图元,应用程序就会接到反应器的通知,知道了该图元被移动这个事件,如果需要,应用程序可以用适当的动作(如移动与该图元相关的其它图元,或显示有关信息等)响应该通知。1.反应器的类型 反应器有多种类型,每种反应器对应一个或多个AutoCAD事件。反应器可以分为以下几个大类:l数据库反应器:当图形数据库发生特定类型的事件时,该反应器将通知应用程序。,l文档反应器:当前图形文档发生改变
2、(如打开新的图形文档、激活其它文档窗口、改变文档的锁定状态等)时,该反应器将通知应用程序。l编辑器反应器:在调用AutoCAD命令(如打开图形、关闭图形、保存图形、输入输出DXF文件、改变系统变量的值等)时,该反应器将通知应用程序。l链接反应器:当加载和卸载ARX应用程序时,该反应器将通知应用程序。l对象反应器:当特定对象(AutoCAD图元)被修改、复制或删除时,该反应器将通知应用程序。调用函数vlr-types可返回反应器类型的完整列表。表11-1列出了AutoCAD反应器类型及其标识符。,表11-1AutoCAD反应器类型及其标识符,反应器类型的标识符 说明:VLR-AcDb-React
3、or 数据库反应器:VLR-DocManager-Reactor 文档管理反应器:VLR-Editor-Reactor 通用编辑器反应器:VLR-Linker-Reactor 链接反应器:VLR-Object-Reactor 对象反应器,其中通用编辑器反应器被进一步细分为更加明确的几种反应器类型,见表11-2。表11-1中的通用编辑器反应器类型只是为了向后兼容才保留的,表11-2所示的各种编辑类型的反应器不能被通用编辑器:VLR-Editor-Reactor引用。,表11-2 编辑类型的各种反应器及其标识符,反应器类型的标识符 说明:VLR-Command-Reactor 通报命令事件:VLR
4、-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 通报对工具栏上位图的修改:VL
5、R-Undo-Reactor 通报 undo 事件:VLR-Wblock-Reactor 通报和写块有关的事件:VLR-Window-Reactor 通报和移动或改变AutoCAD窗口大小的事件:VLR-XREF-Reactor 通报附着或修改 XREF 有关的事件,3.反应器回调事件 大部分AutoCAD操作都会产生一些特定的事件,这些事件能够用来触发反应器的动作,这样的事件被称为回调事件。例如,当发出Save命令保存图形时,将会发生AutoCAD保存图形文件(:vlr-beginSave)的事件,当保存过程结束时,将会发生AutoCAD已将当前图形保存到磁盘(:vlr-saveComple
6、te)的事件。设计基于反应器的应用程序就是根据回调事件的内容编写这些事件发生时所要激活的函数。vlr-reaction-names函数返回与给定反应器类型相关的所有事件组成的表:(vlr-reaction-names reactor-type)参数reactor-type是反应器类型的标识,见表11-1和表11-2。,例如,下列代码将返回和图形反应器相关的所有事件组成的表:(vlr-reaction-names:VLR-DWG-Reactor)返回(:VLR-beginDwgOpen:VLR-endDwgOpen:VLR-dwgFileOpened:VLR-databaseConstructe
7、d:VLR-databaseToBeDestroyed:VLR-beginSave:VLR-saveComplete:VLR-beginClose)下列代码将返回和对象反应器相关的所有事件组成的表:(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-unapp
8、ended:VLR-reappended:VLR-objectClosed),加载并运行以下代码,将会打印出所有相关反应器事件的列表(按反应器类型排序)。(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 nt(vl-princ-to-string rname)(princ)AutoLISP Reference列出了与各种反应器类型相关的所有
9、事件,有关信息在创建反应器的函数部分做了说明。和ActiveX一样,必须首先调用vl-load-com函数,加载支持反应器和其它AutoLISP扩展函数之后,才能实现反应器的功能。,11.2 定义反应器的回调函数 反应器的回调函数就是回调事件发生时所要执行的函数。反应器的回调函数是用AutoLISP定义的。编写回调函数有以下一些限制:不能使用command函数调用AutoCAD命令,只能用ActiveX函数访问图形对象。不能使用entget和entmod函数。不能使用选择集操作函数。不能使用交互输入函数。在事件处理函数中不要加载警告和信息之外的对话框。定义对象反应器回调函数和定义其它反应器的回
10、调函数也不完全相同。,11.2.1 定义对象反应器的回调函数定义对象反应器的回调函数的格式如下:(defun function(notifier-object reactor-object parameter-list)参数notifier-object是事件发生的对象。参数reactor-objec是调用这个函数的反应器对象。参数parameter-list是回调事件返回的回调数据表。例如,例11-1定义了名为print-radius的回调函数。notifier-object是事件发生的对象,reactor-object是调用这个函数的反应器对象,parameter-list是回调事件返回的
11、回调数据表。虽然在本例并不关心parameter-list的值,但定义回调函数时,也要进行变量声明。,【例11-1】定义名字为print-radius的回调函数,该函数用来打印圆的半径。(defun print-radius(notifier-object reactor-object parameter-list)(vl-load-com)(cond(vlax-property-available-p notifier-object Radius);判断该图形对象是否具有radius特性(princ“这个圆的半径是:)(princ(vla-get-radius notifier-object
12、),11.2.2 定义其它反应器的回调函数 由于其它反应器不需要链接到AutoCAD图元上,因此定义其它反应器的回调函数只需要以下两个参数:(defun function(reactor-object parameter-list)参数reactor-object是调用这个函数的反应器对象。参数parameter-list是回调事件返回的回调数据表。例11-2定义了名为saveDrawingInfo的回调函数。参数calling-reactor是调用该函数的反应器对象。参数commandInfo是回调事件返回的回调数据表。该函数在发生保存AutoCAD图形的事件时将被激活,显示文件的路径和大小
13、等信息。,【例11-2】定义名字为saveDrawingInfo的回调函数。(defun saveDrawingInfo(calling-reactor commandInfo/dwgname filesize)(vl-load-com)(setq dwgname(cadr commandInfo)filesize(vl-file-size dwgname)(alert(strcat 这个文件(dwgname)的大小是(itoa filesize)字节.)(princ)在该例中,通过函数vl-file-size获取图形文件的大小,通过警告对话框显示这些信息。,11.2.3.AutoCAD预定义
14、的回调函数 AutoCAD提供了两个预定义的回调函数,可以在测试反应器时使用这些函数:(1)vlr-beep-reaction函数vlr-beep-reaction的功能是让计算机发出“嘟嘟”声。(2)vlr-trace-reaction函数vlr-trace-reaction函数的功能是将参数列表打印到VLISP的“跟踪”窗口。,11.3 创建反应器 创建反应器的主要工作就是将事件和回调函数相关联。创建反应器用vlr-reactor函数。每种类型的反应器都有一个与之对应的用于创建该反应器的AutoLISP函数,这些函数的名称和反应器类型的名称相同,只是没有前面的冒号。例如,vlr-acdb-
15、reactor为创建数据库反应器函数,vlr-toolbar-reactor为创建工具栏反应器函数。所有创建反应器的构造函数都返回一个反应器对象。AutoLISP Reference列出了与每种反应器类型相关的所有可能事件。例如,通过vlr-DWG-reactor条目,可看到表11-3所示与DWG反应器相关的所有可能事件。,表11-3 DWG反应器事件,事件名称 说明:vlr-beginClose 图形数据库将被关闭。:vlr-databaseConstructed 已经构建图形数据库。:vlr-databaseToBeDestroyed 将从内存中删除图形数据库的内容。:vlr-beginD
16、wgOpen AutoCAD将打开图形文件。:vlr-endDwgOpen AutoCAD已结束打开操作。:vlr-dwgFileOpened 新图形已被加载到AutoCAD图形窗口。:vlr-beginSave AutoCAD将保存图形文件。:vlr-saveComplete AutoCAD已将当前图形保存到磁盘。,创建对象反应器 因为对象反应器必须链接到特定的AutoCAD图元(对象)上,所以在定义对象反应器时,必须指定反应器所要链接的图元。创建对象反应器通过函数vlr-object-reactor,该函数的调用格式如下:(vlr-object-reactor owners data ca
17、llbacks)参数owners为VLA对象表,表内可以是多个VLA对象。这些对象也被称为反应器的所有者。参数data为与反应器对象相关联的数据,如果没有数据则该项为nil。参数callbacks为点对表,用于指明事件和与该事件相关联的回调函数。点对表的格式如下:(event-name.callback_function)该点对表的event-name是表11-4所示Object事件中的名称标识,callback_function为回调函数。表11-5是针表11-4所示对特定的回调事件返回的回调数据表。该函数的返回值为reactor_object(对象反应器)。,名称标识 事件:vlr-can
18、celled 对对象的修改已经取消。:vlr-copied 对象已被复制。:vlr-erased 对象的删除标志已被设置。:vlr-unerased 对象的删除标志已被重置。:vlr-goodbye 即将从内存中删除对象。:vlr-openedForModify 即将修改对象。:vlr-modified 对象已被修改。如果取消修改,还将激发:vlr-cancelled 和:vlr-modifyUndone。:vlr-subObjModified 对象的子图元已被修改。在修改多段线或网格顶 点时触发该事件。:vlr-modifyUndone 对象的修改已被放弃。:vlr-modifiedXDat
19、a 对象的扩展图元数据已被修改。:vlr-unappended 已从图形数据库中拆离对象。:vlr-reappended 对象已被重新链接到图形数据库。:vlr-objectClosed 对对象的修改已经完成。,表11-4 Object事件及其名称标识,名称 表长度 参数:vlr-cancelled 0:vlr-erased:vlr-unerased:vlr-goodbye:vlr-openedForModify:vlr-modified:vlr-modifyUndone:vlr-modifiedXData:vlr-unappended:vlr-reappended:vlr-objectClo
20、sed:vlr-copied 1 由复制操作创建的对象(ename)。:vlr-subObjModified 1 已被修改的子对象(ename)。,表11-5 Object 事件回调数据,例如,下面的代码创建了一个对象反应器。该对象反应器只有一个所有者,即VLA对象myCircle;与该反应器对象相关联的数据为Circle Reactor;点对表为(:vlr-modified.print-radius),当发生myCircle对象被修改(即:vlr-modified)事件时,调用print-radius回调函数:(setq circleReactor(vlr-object-reactor(li
21、st myCircle)Circle Reactor(:vlr-modified.print-radius)上述反应器对象赋给了变量circleReactor。可以通过该变量实现对该反应器的查询、修改或删除等。,创建对象反应器除了必须指定反应器所要链接的图元之外,还要注意以下几点:(1)在定义所有者列表时,只能指定VLA对象,而不允许使用ename对象。要求VLA对象是因为回调函数只能用ActiveX方法修改AutoCAD对象,而ActiveX方法要求使用VLA对象。尽管不能在回调反应器中使用由entlast和entget等函数获取VLA对象,但可以用vlax-ename-vla-object
22、函数将ename对象转换成VLA对象。(2)如果对象已被包括在对象反应器的所有者列表之中,那么就不能在回调函数中修改该对象。如果这样做,将会导致一个出错消息,并使AutoCAD崩溃。下面是实现对象反应器功能的实例:,(1)加载例11-3所示程序段【例11-3】生成一个圆的VLA对象。(setq myCircle(progn(setq ctrPt(getpoint n输入圆心:)radius(distance ctrPt(getpoint ctrpt n输入半径:)(vla-addCircle(vla-get-ModelSpace;将圆加入到图形模型空间(vla-get-ActiveDocume
23、nt(vlax-get-acad-object)(vlax-3d-point ctrPt)radius)该代码使用vla-addCircle画一个圆,将返回值赋给变量myCircle。该返回值是VLA对象,包含指向所画圆对象的指针。,(2)加载例11-1 所示回调函数print-radius。(3)定义对象反应器(setq circleReactor(vlr-object-reactor(list myCircle)Circle Reactor(:vlr-modified.print-radius)(4)在AutoCAD图形窗口,选取该圆并修改其大小,print-radius 函数将在Auto
24、CAD命令窗口显示一个消息。例如,如果用夹点或STRETCH命令改变了该圆的大小,将在命令提示区显示以下信息:*STRETCH*Specify stretch point or Base point/Copy/Undo/eXit:这个圆的半径是:190.0 如果用夹点或STRETCH命令改变其他圆时的大小,将没有该提示信息中的“这个圆的半径是:”,这是因为在其他的圆上没有链接circleReactor反应器。,11.3.2 创建其它反应器 其它反应器不需要链接AutoCAD图元,所以在定义时,只需要两个参数。创建其它反应器通过函数vlr-reactor,该函数的调用格式如下:(vlr-reac
25、tor data callbacks)参数data为任意要与反应器对象关联的数据,如果没有数据则该项为nil。参数callbacks为点对表,指明事件和与该事件相关联的回调函数,点对表的格式如下:(event-name.callback_function)例如,下列代码定义了一个DWG编辑器反应器。当用户发出Save命令时,该反应器将激活saveDrawingInfo函数。(vlr-dwg-Reactor nil(:vlr-saveComplete.saveDrawingInfo)在该例中,第一个参数为nil是因为没有与反应器相关联的数据;第二个参数是点对表,指明:vlr-saveComple
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 使用 反应器 清华 CAD 二次开发 LISP
链接地址:https://www.31ppt.com/p-5229295.html