




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、第第 11 章章 使用反應器使用反應器 11.1 反應器反應器 反應器是一種反饋機制,它可以在發生某些特定事件時,反應器是一種反饋機制,它可以在發生某些特定事件時,將所發生的事件通知給應用程序,應用程序將會根據發生的具將所發生的事件通知給應用程序,應用程序將會根據發生的具體事件做出相應的決策。例如,在某個圖元上鏈接了一個反應體事件做出相應的決策。例如,在某個圖元上鏈接了一個反應器,如果用戶移動這個圖元,應用程序就會接到反應器的通知,器,如果用戶移動這個圖元,應用程序就會接到反應器的通知,知道了該圖元被移動這個事件,如果需要,應用程序可以用適知道了該圖元被移動這個事件,如果需要,應用程序可以用適
2、當的動作(如移動與該圖元相關的其它圖元,或顯示有關信息當的動作(如移動與該圖元相關的其它圖元,或顯示有關信息等)響應該通知。等)響應該通知。1. 1. 反應器的類型反應器的類型 反應器有多種類型,每種反應器對應一個或多個反應器有多種類型,每種反應器對應一個或多個AutoCADAutoCAD事事件。反應器可以分為以下幾個大類:件。反應器可以分為以下幾個大類: l l 數據庫反應器:當圖形數據庫發生特定類型的事件時,該數據庫反應器:當圖形數據庫發生特定類型的事件時,該反應器將通知應用程序。反應器將通知應用程序。 l l文檔反應器:當前圖形文檔發生改變(如打開新的圖形文檔、文檔反應器:當前圖形文檔發
3、生改變(如打開新的圖形文檔、激活其它文檔窗口、改變文檔的鎖定狀態等)時,該反應器將激活其它文檔窗口、改變文檔的鎖定狀態等)時,該反應器將通知應用程序。通知應用程序。 l l編輯器反應器:在調用編輯器反應器:在調用AutoCADAutoCAD命令(如打開圖形、關閉圖命令(如打開圖形、關閉圖形、保存圖形、輸入輸出形、保存圖形、輸入輸出DXFDXF文件、改變系統變量的值等)時,文件、改變系統變量的值等)時,該反應器將通知應用程序。該反應器將通知應用程序。 l l 鏈接反應器:當加載和卸載鏈接反應器:當加載和卸載ARXARX應用程序時,該反應器將通應用程序時,該反應器將通知應用程序。知應用程序。 l
4、l對象反應器:當特定對象(對象反應器:當特定對象(AutoCADAutoCAD圖元)被修改、復制或圖元)被修改、復制或刪除時,該反應器將通知應用程序。刪除時,該反應器將通知應用程序。 調用函數調用函數vlr-typesvlr-types可返回反應器類型的完整列表。表可返回反應器類型的完整列表。表11-111-1列列出了出了AutoCADAutoCAD反應器類型及其標識符。反應器類型及其標識符。表表11-1AutoCAD11-1AutoCAD反應器類型及其標識符反應器類型及其標識符 反應器類型的標識符反應器類型的標識符 說明說明:VLR-AcDb-Reactor :VLR-AcDb-Reacto
5、r 數據庫反應器數據庫反應器:VLR- DocManager- Reactor :VLR- DocManager- Reactor 文檔管理反應器文檔管理反應器:VLR-Editor- Reactor :VLR-Editor- Reactor 通用編輯器反應器通用編輯器反應器:VLR-Linker- Reactor :VLR-Linker- Reactor 鏈接反應器鏈接反應器:VLR-Object- Reactor :VLR-Object- Reactor 對象反應器對象反應器 其中通用編輯器反應器被進一步細分為更加明確的幾種反應器類型,其中通用編輯器反應器被進一步細分為更加明確的幾種反應器
6、類型,見表見表11-211-2。表。表11-111-1中的通用編輯器反應器類型只是為了向后兼容才保留的,中的通用編輯器反應器類型只是為了向后兼容才保留的,表表11-211-2所示的各種編輯類型的反應器不能被通用編輯器所示的各種編輯類型的反應器不能被通用編輯器 :VLR-Editor-:VLR-Editor-ReactorReactor引用。引用。 表表11-2 11-2 編輯類型的各種反應器及其標識符編輯類型的各種反應器及其標識符 反應器類型的標識符反應器類型的標識符 說明說明:VLR-Command-Reactor :VLR-Command-Reactor 通報命令事件通報命令事件:VLR-
7、DeepClone-Reactor :VLR-DeepClone-Reactor 通報通報 deep clone deep clone 事件事件:VLR-DWG-Reactor :VLR-DWG-Reactor 通報打開或關閉圖形文件的事件通報打開或關閉圖形文件的事件:VLR-DXF-Reactor :VLR-DXF-Reactor 通報和讀寫通報和讀寫 DXF DXF 文件相關的事件文件相關的事件:VLR-Insert-Reactor :VLR-Insert-Reactor 通報和插入塊有關的事件通報和插入塊有關的事件:VLR-Lisp-Reactor :VLR-Lisp-Reactor 通
8、報通報 LISP LISP 事件事件:VLR-Miscellaneous-Reactor :VLR-Miscellaneous-Reactor (表中未列出的)其它編輯器反應器類型(表中未列出的)其它編輯器反應器類型:VLR-Mouse-Reactor :VLR-Mouse-Reactor 通報鼠標事件(例如雙擊)通報鼠標事件(例如雙擊):VLR-SysVar-Reactor :VLR-SysVar-Reactor 通報對系統變量的修改通報對系統變量的修改:VLR-Toolbar-Reactor :VLR-Toolbar-Reactor 通報對工具欄上位圖的修改通報對工具欄上位圖的修改:VLR
9、-Undo-Reactor :VLR-Undo-Reactor 通報通報 undo undo 事件事件:VLR-Wblock-Reactor :VLR-Wblock-Reactor 通報和寫塊有關的事件通報和寫塊有關的事件:VLR-Window-Reactor :VLR-Window-Reactor 通報和移動或改變通報和移動或改變AutoCADAutoCAD窗口大小的事件窗口大小的事件:VLR-XREF-Reactor :VLR-XREF-Reactor 通報附著或修改通報附著或修改 XREF XREF 有關的事件有關的事件3. 3. 反應器回調事件反應器回調事件 大部分大部分AutoCAD
10、AutoCAD操作都會產生一些特定的事件,這些事件能夠操作都會產生一些特定的事件,這些事件能夠用來觸發反應器的動作,這樣的事件被稱為回調事件。例如,當用來觸發反應器的動作,這樣的事件被稱為回調事件。例如,當發出發出SaveSave命令保存圖形時,將會發生命令保存圖形時,將會發生AutoCAD保存圖形文件保存圖形文件(:vlr-beginSave:vlr-beginSave)的事件,當保存過程結束時,將會發生)的事件,當保存過程結束時,將會發生AutoCAD已將當前圖形保存到磁盤(已將當前圖形保存到磁盤(:vlr-saveComplete:vlr-saveComplete)的事)的事件。設計基于
11、反應器的應用程序就是根據回調事件的內容編寫這件。設計基于反應器的應用程序就是根據回調事件的內容編寫這些事件發生時所要激活的函數。些事件發生時所要激活的函數。 vlr-reaction-namesvlr-reaction-names函數返回與給定反應器類型相關的所有函數返回與給定反應器類型相關的所有事件組成的表:事件組成的表: (vlr-reaction-names reactor-type)(vlr-reaction-names reactor-type) 參數參數reactor-typereactor-type是反應器類型的標識,見表是反應器類型的標識,見表11-111-1和表和表11-21
12、1-2。例如,下列代碼將返回和圖形反應器相關的所有事件組成的表:例如,下列代碼將返回和圖形反應器相關的所有事件組成的表:(vlr-reaction-names :VLR-DWG-Reactor)(vlr-reaction-names :VLR-DWG-Reactor)返回返回(:VLR-beginDwgOpen :VLR-endDwgOpen :VLR-dwgFileOpened :VLR-(:VLR-beginDwgOpen :VLR-endDwgOpen :VLR-dwgFileOpened :VLR-databaseConstructed :VLR-databaseToBeDestroy
13、ed :VLR-databaseConstructed :VLR-databaseToBeDestroyed :VLR-beginSave :VLR-saveComplete :VLR-beginClose) beginSave :VLR-saveComplete :VLR-beginClose) 下列代碼將返回和對象反應器相關的所有事件組成的表:下列代碼將返回和對象反應器相關的所有事件組成的表:(vlr-reaction-names :vlr-object-reactor)(vlr-reaction-names :vlr-object-reactor); ;返回返回(:VLR-cancell
14、ed :VLR-copied :VLR-erased :VLR-unerased :VLR-(:VLR-cancelled :VLR-copied :VLR-erased :VLR-unerased :VLR-goodbye :VLR-openedForModify :VLR-modified :VLR-goodbye :VLR-openedForModify :VLR-modified :VLR-subObjModified :VLR-modifyUndone :VLR-modifiedXData :VLR-subObjModified :VLR-modifyUndone :VLR-modi
15、fiedXData :VLR-unappended :VLR-reappended :VLR-objectClosed)unappended :VLR-reappended :VLR-objectClosed) 加載并運行以下代碼,將會打印出所有相關反應器事件的列表(按反應加載并運行以下代碼,將會打印出所有相關反應器事件的列表(按反應器類型排序)。器類型排序)。(defun print-reactors-and-events ()(defun print-reactors-and-events () (foreach rtype (vlr-types) (foreach rtype (vlr-
16、types) (princ (strcat n (vl-princ-to-string rtype) (princ (strcat n (vl-princ-to-string rtype) (foreach rname (vlr-reaction-names rtype) (foreach rname (vlr-reaction-names rtype) (princ (strcat nt (vl-princ-to-string rname) (princ (strcat nt (vl-princ-to-string rname) (princ) (princ) ) AutoLISP Refe
17、rence AutoLISP Reference列出了與各種反應器類型相關的所有事件,有關信列出了與各種反應器類型相關的所有事件,有關信息在創建反應器的函數部分做了說明。息在創建反應器的函數部分做了說明。 和和ActiveXActiveX一樣,必須首先調用一樣,必須首先調用vl-load-comvl-load-com函數,加載支持反應器和其函數,加載支持反應器和其它它AutoLISPAutoLISP擴展函數之后,才能實現反應器的功能。擴展函數之后,才能實現反應器的功能。11.2 11.2 定義反應器的回調函數定義反應器的回調函數 反應器的回調函數就是回調事件發生時所要執行的函數。反反應器的回調
18、函數就是回調事件發生時所要執行的函數。反應器的回調函數是用應器的回調函數是用AutoLISPAutoLISP定義的。編寫回調函數有以下一定義的。編寫回調函數有以下一些限制:些限制: 不能使用不能使用commandcommand函數調用函數調用AutoCADAutoCAD命令,只能用命令,只能用ActiveXActiveX函數訪問圖形對象。函數訪問圖形對象。 不能使用不能使用entgetentget和和entmodentmod函數。函數。 不能使用選擇集操作函數。不能使用選擇集操作函數。 不能使用交互輸入函數。不能使用交互輸入函數。 在事件處理函數中不要加載警告和信息之外的對話框。在事件處理函數
19、中不要加載警告和信息之外的對話框。 定義對象反應器回調函數和定義其它反應器的回調函數也定義對象反應器回調函數和定義其它反應器的回調函數也不完全相同。不完全相同。11.2.1 11.2.1 定義對象反應器的回調函數定義對象反應器的回調函數定義對象反應器的回調函數的格式如下:定義對象反應器的回調函數的格式如下: (defun function (notifier-object reactor-object (defun function (notifier-object reactor-object parameter-list)parameter-list) )參數參數notifier-obje
20、ctnotifier-object是事件發生的對象。是事件發生的對象。參數參數reactor-objecreactor-objec是調用這個函數的反應器對象。是調用這個函數的反應器對象。參數參數parameter-listparameter-list是回調事件返回的回調數據表。是回調事件返回的回調數據表。 例如,例例如,例11-111-1定義了名為定義了名為print-radiusprint-radius的回調函數。的回調函數。notifier-objectnotifier-object是事件發生的對象,是事件發生的對象,reactor-objectreactor-object是調用是調用這個
21、函數的反應器對象,這個函數的反應器對象,parameter-listparameter-list是回調事件返回的回是回調事件返回的回調數據表。雖然在本例并不關心調數據表。雖然在本例并不關心parameter-listparameter-list的值,但定義的值,但定義回調函數時,也要進行變量聲明。回調函數時,也要進行變量聲明。【例例11-111-1】定義名字為定義名字為print-radiusprint-radius的回調函數,該函數用來打的回調函數,該函數用來打印圓的半徑。印圓的半徑。(defun print-radius (notifier-object reactor-object pa
22、rameter-list)(defun print-radius (notifier-object reactor-object parameter-list) (vl-load-com) (vl-load-com) (cond (cond (vlax-property-available-p notifier-object Radius)(vlax-property-available-p notifier-object Radius) ;判斷該;判斷該圖形對象是否具有圖形對象是否具有radiusradius特性特性 (princ (princ “這個圓的半徑是:這個圓的半徑是: ) (pr
23、inc (vla-get-radius notifier-object) (princ (vla-get-radius notifier-object) ) ) ) ) )11.2.2 11.2.2 定義其它反應器的回調函數定義其它反應器的回調函數 由于其它反應器不需要鏈接到由于其它反應器不需要鏈接到AutoCADAutoCAD圖元上,因此定義其它圖元上,因此定義其它反應器的回調函數只需要以下兩個參數:反應器的回調函數只需要以下兩個參數:(defun function(reactor-object parameter-list)(defun function(reactor-object pa
24、rameter-list) )參數參數reactor-objectreactor-object是調用這個函數的反應器對象。是調用這個函數的反應器對象。參數參數parameter-listparameter-list是回調事件返回的回調數據表。是回調事件返回的回調數據表。例例11-211-2定義了名為定義了名為saveDrawingInfosaveDrawingInfo的回調函數。參數的回調函數。參數calling-calling-reactorreactor是調用該函數的反應器對象。參數是調用該函數的反應器對象。參數commandInfocommandInfo是回調是回調事件返回的回調數據表。
25、該函數在發生保存事件返回的回調數據表。該函數在發生保存AutoCADAutoCAD圖形的事件圖形的事件時將被激活,顯示文件的路徑和大小等信息。時將被激活,顯示文件的路徑和大小等信息。 【例例11-211-2】定義名字為定義名字為saveDrawingInfosaveDrawingInfo的回調函數。的回調函數。(defun saveDrawingInfo(calling-reactor commandInfo / dwgname (defun saveDrawingInfo(calling-reactor commandInfo / dwgname filesize)filesize) (vl
26、-load-com) (vl-load-com) (setq dwgname (cadr commandInfo) filesize (vl-file-size (setq dwgname (cadr commandInfo) filesize (vl-file-size dwgname)dwgname) (alert(strcat (alert(strcat 這個文件(這個文件( dwgname dwgname )的大小是)的大小是 (itoa filesize) (itoa filesize) 字節字節.).) (princ) (princ) ) 在該例中,通過函數在該例中,通過函數vl-
27、file-sizevl-file-size獲取圖形文件的大小,通過警告對話獲取圖形文件的大小,通過警告對話框顯示這些信息。框顯示這些信息。11.2.3. AutoCAD11.2.3. AutoCAD預定義的回調函數預定義的回調函數 AutoCADAutoCAD提供了兩個預定義的回調函數,可以在測提供了兩個預定義的回調函數,可以在測試反應器時使用這些函數:試反應器時使用這些函數: (1 1)vlr-beep-reactionvlr-beep-reaction函數函數vlr-beep-reactionvlr-beep-reaction的功能是讓計算機發出的功能是讓計算機發出“嘟嘟嘟嘟”聲。聲。 (
28、2 2)vlr-trace-reactionvlr-trace-reaction函數函數vlr-trace-reactionvlr-trace-reaction函數的功能是將參數列表打印到函數的功能是將參數列表打印到VLISPVLISP的的“跟蹤跟蹤”窗口。窗口。11.3 11.3 創建反應器創建反應器 創建反應器的主要工作就是將事件和回調函數相關聯。創建創建反應器的主要工作就是將事件和回調函數相關聯。創建反應器用反應器用vlr-vlr-reactor-reactor函數。每種類型的反應器都有一個與函數。每種類型的反應器都有一個與之對應的用于創建該反應器的之對應的用于創建該反應器的AutoLI
29、SPAutoLISP函數,這些函數的名稱函數,這些函數的名稱和反應器類型的名稱相同,只是沒有前面的冒號。例如,和反應器類型的名稱相同,只是沒有前面的冒號。例如,vlr-vlr-acdb-reactoracdb-reactor為創建數據庫反應器函數,為創建數據庫反應器函數,vlr-toolbar-reactorvlr-toolbar-reactor為創建工具欄反應器函數。所有創建反應器的構造函數都返回為創建工具欄反應器函數。所有創建反應器的構造函數都返回一個反應器對象。一個反應器對象。 AutoLISP ReferenceAutoLISP Reference列出了與每種反應器類型相關的所有可列出
30、了與每種反應器類型相關的所有可能事件。例如,通過能事件。例如,通過vlr-DWG-reactorvlr-DWG-reactor條目,可看到表條目,可看到表11-311-3所示所示與與DWGDWG反應器相關的所有可能事件。反應器相關的所有可能事件。表表11-3 DWG反應器事件反應器事件 事件名稱事件名稱 說明說明:vlr-beginClose :vlr-beginClose 圖形數據庫將被關閉。圖形數據庫將被關閉。:vlr-databaseConstructed :vlr-databaseConstructed 已經構建圖形數據庫。已經構建圖形數據庫。:vlr-databaseToBeDest
31、royed :vlr-databaseToBeDestroyed 將從內存中刪除圖形數據庫的內容。將從內存中刪除圖形數據庫的內容。:vlr-beginDwgOpen AutoCAD:vlr-beginDwgOpen AutoCAD將打開圖形文件。將打開圖形文件。:vlr-endDwgOpen AutoCAD:vlr-endDwgOpen AutoCAD已結束打開操作。已結束打開操作。:vlr-dwgFileOpened :vlr-dwgFileOpened 新圖形已被加載到新圖形已被加載到AutoCADAutoCAD圖形窗口。圖形窗口。:vlr-beginSave AutoCAD:vlr-be
32、ginSave AutoCAD將保存圖形文件。將保存圖形文件。:vlr-saveComplete AutoCAD:vlr-saveComplete AutoCAD已將當前圖形保存到磁盤。已將當前圖形保存到磁盤。11.3.111.3.1創建對象反應器創建對象反應器 因為對象反應器必須鏈接到特定的因為對象反應器必須鏈接到特定的AutoCADAutoCAD圖元(對象)上,所以在定義圖元(對象)上,所以在定義對象反應器時,必須指定反應器所要鏈接的圖元。創建對象反應器通過函數對象反應器時,必須指定反應器所要鏈接的圖元。創建對象反應器通過函數vlr-object-reactorvlr-object-rea
33、ctor,該函數的調用格式如下:,該函數的調用格式如下: (vlr-object-reactor owners data callbacks)(vlr-object-reactor owners data callbacks) 參數參數ownersowners為為VLAVLA對象表,表內可以是多個對象表,表內可以是多個VLAVLA對象。這些對象也被稱為對象。這些對象也被稱為反應器的所有者。反應器的所有者。 參數參數datadata為與反應器對象相關聯的數據,如果沒有數據則該項為為與反應器對象相關聯的數據,如果沒有數據則該項為nilnil。 參數參數callbackscallbacks為點對表,
34、用于指明事件和與該事件相關聯的回調函數。為點對表,用于指明事件和與該事件相關聯的回調函數。點對表的格式如下:點對表的格式如下: (event-name . callback_function)(event-name . callback_function) 該點對表的該點對表的event-nameevent-name是表是表11-411-4所示所示ObjectObject事件中的名稱標識,事件中的名稱標識,callback_functioncallback_function為回調函數。表為回調函數。表11-511-5是針表是針表11-411-4所示對特定的回調事件所示對特定的回調事件返回的回調
35、數據表。返回的回調數據表。 該函數的返回值為該函數的返回值為reactor_object(對象反應器)。(對象反應器)。 名稱標識名稱標識 事件事件:vlr-cancelled :vlr-cancelled 對對象的修改已經取消。對對象的修改已經取消。:vlr-copied :vlr-copied 對象已被復制。對象已被復制。:vlr-erased :vlr-erased 對象的刪除標志已被設置。對象的刪除標志已被設置。:vlr-unerased :vlr-unerased 對象的刪除標志已被重置。對象的刪除標志已被重置。:vlr-goodbye :vlr-goodbye 即將從內存中刪除對象
36、。即將從內存中刪除對象。:vlr-openedForModify :vlr-openedForModify 即將修改對象。即將修改對象。:vlr-modified :vlr-modified 對象已被修改。如果取消修改,還將激發對象已被修改。如果取消修改,還將激發 :vlr-cancelled :vlr-cancelled 和和:vlr-modifyUndone:vlr-modifyUndone。:vlr-subObjModified :vlr-subObjModified 對象的子圖元已被修改。在修改多段線或網格頂對象的子圖元已被修改。在修改多段線或網格頂 點時觸發該事件。點時觸發該事件。:
37、vlr-modifyUndone :vlr-modifyUndone 對象的修改已被放棄。對象的修改已被放棄。:vlr-modifiedXData :vlr-modifiedXData 對象的擴展圖元數據已被修改。對象的擴展圖元數據已被修改。:vlr-unappended :vlr-unappended 已從圖形數據庫中拆離對象。已從圖形數據庫中拆離對象。:vlr-reappended :vlr-reappended 對象已被重新鏈接到圖形數據庫。對象已被重新鏈接到圖形數據庫。:vlr-objectClosed :vlr-objectClosed 對對象的修改已經完成。對對象的修改已經完成。表
38、表11-4 Object事件及其名稱標識事件及其名稱標識 名稱名稱 表長度表長度 參數參數:vlr-cancelled 0:vlr-cancelled 0:vlr-erased :vlr-erased :vlr-unerased :vlr-unerased :vlr-goodbye:vlr-goodbye:vlr-openedForModify :vlr-openedForModify :vlr-modified :vlr-modified :vlr-modifyUndone :vlr-modifyUndone :vlr-modifiedXData :vlr-modifiedXData :vl
39、r-unappended :vlr-unappended :vlr-reappended :vlr-reappended :vlr-objectClosed:vlr-objectClosed:vlr-copied 1 :vlr-copied 1 由復制操作創建的對象由復制操作創建的對象(ename)(ename)。:vlr-subObjModified 1 :vlr-subObjModified 1 已被修改的子對象已被修改的子對象(ename)(ename)。表表11-5 Object 事件回調數據事件回調數據 例如,下面的代碼創建了一個對象反應器。該對象反應器例如,下面的代碼創建了一個對象
40、反應器。該對象反應器只有一個所有者,即只有一個所有者,即VLAVLA對象對象myCirclemyCircle;與該反應器對象相關;與該反應器對象相關聯的數據為聯的數據為Circle ReactorCircle Reactor;點對表為;點對表為(:vlr-modified . (:vlr-modified . print-radius)print-radius),當發生,當發生myCirclemyCircle對象被修改(即對象被修改(即:vlr-:vlr-modifiedmodified)事件時,調用)事件時,調用print-radiusprint-radius回調函數:回調函數:(setq
41、circleReactor (vlr-object-reactor (list myCircle) (setq circleReactor (vlr-object-reactor (list myCircle) Circle Reactor (:vlr-modified . print-radius)Circle Reactor (:vlr-modified . print-radius) 上述反應器對象賦給了變量上述反應器對象賦給了變量circleReactorcircleReactor。可以通過該變。可以通過該變量實現對該反應器的查詢、修改或刪除等。量實現對該反應器的查詢、修改或刪除等。
42、創建對象反應器除了必須指定反應器所要鏈接的圖元之外,創建對象反應器除了必須指定反應器所要鏈接的圖元之外,還要注意以下幾點:還要注意以下幾點:(1 1)在定義所有者列表時,只能指定)在定義所有者列表時,只能指定VLAVLA對象,而不允許使用對象,而不允許使用enameename對象。要求對象。要求VLAVLA對象是因為回調函數只能用對象是因為回調函數只能用ActiveXActiveX方法修方法修改改AutoCADAutoCAD對象,而對象,而ActiveXActiveX方法要求使用方法要求使用VLAVLA對象。對象。盡管不能在回調反應器中使用由盡管不能在回調反應器中使用由entlastentla
43、st和和entgetentget等函數獲取等函數獲取VLAVLA對象,但可以用對象,但可以用vlax-ename-vla-objectvlax-ename-vla-object函數將函數將enameename對象對象轉換成轉換成VLAVLA對象。對象。(2 2)如果對象已被包括在對象反應器的所有者列表之中,那么)如果對象已被包括在對象反應器的所有者列表之中,那么就不能在回調函數中修改該對象。如果這樣做,將會導致一個就不能在回調函數中修改該對象。如果這樣做,將會導致一個出錯消息,并使出錯消息,并使AutoCADAutoCAD崩潰。崩潰。 下面是實現對象反應器功能的實例下面是實現對象反應器功能的實
44、例: :(1 1)加載例)加載例11-311-3所示程序段所示程序段【例例11-311-3】生成一個圓的生成一個圓的VLAVLA對象。對象。(setq myCircle(setq myCircle(progn(progn (setq ctrPt (getpoint (setq ctrPt (getpoint n n輸入圓心輸入圓心: : ) ) radius (distance ctrPt (getpoint ctrpt n radius (distance ctrPt (getpoint ctrpt n輸入半徑輸入半徑 : ): ) ) ) (vla-addCircle (vla-addCi
45、rcle (vla-get-ModelSpace (vla-get-ModelSpace ;將圓加入到圖形模型空間;將圓加入到圖形模型空間 (vla-get-ActiveDocument (vlax-get-acad-object)(vla-get-ActiveDocument (vlax-get-acad-object) (vlax-3d-point ctrPt) (vlax-3d-point ctrPt) radius radius ) ) 該代碼使用該代碼使用vla-addCirclevla-addCircle畫一個圓,將返回值賦給變量畫一個圓,將返回值賦給變量myCirclemyCir
46、cle。該返。該返回值是回值是VLAVLA對象,包含指向所畫圓對象的指針。對象,包含指向所畫圓對象的指針。(2 2)加載例)加載例11-1 11-1 所示回調函數所示回調函數print-radiusprint-radius。(3 3)定義對象反應器)定義對象反應器(setq circleReactor (vlr-object-reactor (list myCircle)(setq circleReactor (vlr-object-reactor (list myCircle) Circle Reactor (:vlr-modified . print-radius) Circle Reac
47、tor (:vlr-modified . print-radius)(4 4)在)在AutoCADAutoCAD圖形窗口圖形窗口,選取該圓并修改其大小,選取該圓并修改其大小,print-radius print-radius 函函數將在數將在AutoCADAutoCAD命令窗口顯示一個消息。例如,如果用夾點或命令窗口顯示一個消息。例如,如果用夾點或STRETCHSTRETCH命令改命令改變了該圓的大小,將在命令提示區顯示以下信息:變了該圓的大小,將在命令提示區顯示以下信息: * * * STRETCH STRETCH * * * Specify stretch point or Base po
48、int/Copy/Undo/eXit: Specify stretch point or Base point/Copy/Undo/eXit:這個圓的這個圓的半徑是半徑是: :190.0190.0 如果用夾點或如果用夾點或STRETCHSTRETCH命令改變其他圓時的大小,將沒有該提示信息中的命令改變其他圓時的大小,將沒有該提示信息中的“這個圓的半徑是這個圓的半徑是: :”,這是因為在其他的圓上沒有鏈接,這是因為在其他的圓上沒有鏈接circleReactorcircleReactor反應反應器。器。11.3.2 11.3.2 創建其它反應器創建其它反應器 其它反應器不需要鏈接其它反應器不需要鏈
49、接AutoCADAutoCAD圖元,所以在定義時,只需要兩個參數。圖元,所以在定義時,只需要兩個參數。創建其它反應器通過函數創建其它反應器通過函數vlr-vlr-reactor-reactor,該函數的調用格式如下:,該函數的調用格式如下: (vlr-(vlr-reactor data callbacks)-reactor data callbacks) 參數參數datadata為任意要與反應器對象關聯的數據,如果沒有數據則該項為為任意要與反應器對象關聯的數據,如果沒有數據則該項為nilnil。 參數參數callbackscallbacks為點對表,指明事件和與該事件相關聯的回調函數,點對為點
50、對表,指明事件和與該事件相關聯的回調函數,點對表的格式如下:表的格式如下: (event-name . callback_function)(event-name . callback_function) 例如,下列代碼定義了一個例如,下列代碼定義了一個DWGDWG編輯器反應器。當用戶發出編輯器反應器。當用戶發出SaveSave命令時,命令時,該反應器將激活該反應器將激活saveDrawingInfosaveDrawingInfo函數。函數。 (vlr-dwg-Reactor nil (:vlr-saveComplete . saveDrawingInfo)(vlr-dwg-Reactor n
51、il (:vlr-saveComplete . saveDrawingInfo) 在該例中,第一個參數為在該例中,第一個參數為nilnil是因為沒有與反應器相關聯的數據;第二個是因為沒有與反應器相關聯的數據;第二個參數是點對表,指明參數是點對表,指明:vlr-saveComplete:vlr-saveComplete事件與事件與saveDrawingInfosaveDrawingInfo回調函數相回調函數相關聯。當關聯。當:vlr-saveComplete:vlr-saveComplete事件發生時,事件發生時,AutoCADAutoCAD傳遞給回調函數一個圖形傳遞給回調函數一個圖形文件名字的
52、字符串。文件名字的字符串。 每個點對表都指定了反應器要通報的事件,以及該事件發生時要調用的每個點對表都指定了反應器要通報的事件,以及該事件發生時要調用的回調函數。在本例中,只指定了一個事件回調函數。在本例中,只指定了一個事件:vlr-saveComplete:vlr-saveComplete。 只要用戶發出命令,不管是從只要用戶發出命令,不管是從AutoCADAutoCAD命令行、菜單、工具欄或命令行、菜單、工具欄或AutoLISPAutoLISP程序,都會通知編輯器反應器。所以,該程序,都會通知編輯器反應器。所以,該DWGDWG反應器的回調函數需要明確它反應器的回調函數需要明確它應對什么事件
53、作出響應。在本例中,回調函數應對什么事件作出響應。在本例中,回調函數saveDrawingInfosaveDrawingInfo只是檢查只是檢查SaveSave命令。命令。 下面是下面是實現實現DWGDWG反應器功能的實例:反應器功能的實例: (1) 1) 加載例加載例11-211-2所定義的回調函數所定義的回調函數saveDrawingInfosaveDrawingInfo。 (2(2) 定義定義DWGDWG反應器反應器 (vlr-dwg-Reactor nil (:vlr-saveComplete . saveDrawingInfo)(vlr-dwg-Reactor nil (:vlr-s
54、aveComplete . saveDrawingInfo) (3 3)在)在AutoCADAutoCAD圖形窗口點取存盤的圖標或調用存圖的命令。當完成存圖形窗口點取存盤的圖標或調用存圖的命令。當完成存圖工作時將會彈出圖圖工作時將會彈出圖11-111-1所示的所示的AutoCAD MessageAutoCAD Message對話框。說明該實例成功。對話框。說明該實例成功。圖圖11-1AutoCAD11-1AutoCAD的的MessageMessage對話框對話框 11.3.3 11.3.3 將數據附著到反應器對象將數據附著到反應器對象 利用創建反應器函數的參數利用創建反應器函數的參數datad
55、ata可以為反應器指定與其關聯的數據,如可以為反應器指定與其關聯的數據,如果該項為果該項為nilnil,表示不需要為反應器指定與其關聯的數據。,表示不需要為反應器指定與其關聯的數據。 一個對象可能鏈接多個反應器,如果它們的參數一個對象可能鏈接多個反應器,如果它們的參數datadata都為都為nilnil,應用程,應用程序將無法區分它們。在這種情況下就應該為反應器指定文本字符串或應用程序將無法區分它們。在這種情況下就應該為反應器指定文本字符串或應用程序能識別的其它數據。序能識別的其它數據。 例如,前面創建對象反應器例如,前面創建對象反應器circleReactorcircleReactor的實例
56、中,字符串的實例中,字符串“CircleReactorCircleReactor”就是與反應器就是與反應器circleReactorcircleReactor相關聯的數據。相關聯的數據。11.4 11.4 查詢、修改和控制反應器的狀態查詢、修改和控制反應器的狀態11.4.1 11.4.1 查詢反應器查詢反應器 有多種不同的方法來獲取反應器的信息。可以使用標準的有多種不同的方法來獲取反應器的信息。可以使用標準的VLISPVLISP數據查數據查看工具查看反應器的信息,也可以用有關反應器的看工具查看反應器的信息,也可以用有關反應器的AutoLISPAutoLISP函數。函數。1.1.了解圖形中有關反
57、應器的總體情況了解圖形中有關反應器的總體情況 通過通過vlr-reactorsvlr-reactors函數可以了解當前圖形中總共用到了哪些函數可以了解當前圖形中總共用到了哪些反應器或有哪些指定類型的反應器。反應器或有哪些指定類型的反應器。vlr-reactorsvlr-reactors函數的調用格函數的調用格式如下:式如下:(vlr-reactors reactor-type.)(vlr-reactors reactor-type.) 參數參數reactor-typereactor-type為反應器類型的標識符。如果指定了為反應器類型的標識符。如果指定了reactor-typereactor-
58、type參數,該函數返回由指定類型反應器組成的表。如參數,該函數返回由指定類型反應器組成的表。如果省略參數果省略參數reactor-typereactor-type,該函數返回所有當前圖形所有的反應,該函數返回所有當前圖形所有的反應器。器。 以下表達式列出圖形中的所有反應器:以下表達式列出圖形中的所有反應器: (vlr-reactors)(vlr-reactors) ;返回;返回(:VLR-Object-Reactor #VLR-Object-(:VLR-Object-Reactor #) (:VLR-Editor-Reactor #)Reactor) (:VLR-Editor-Reactor
59、 #),有一個對象,有一個對象反應器和一個編輯器反應器。反應器和一個編輯器反應器。以下表達式列出所有的對象反應器:以下表達式列出所有的對象反應器: (vlr-reactors :vlr-object-reactor)(vlr-reactors :vlr-object-reactor) ;返回;返回(:VLR-Object-(:VLR-Object-Reactor #)Reactor #),有一個對象反應器,有一個對象反應器以下表達式列出所有數據庫反應器:以下表達式列出所有數據庫反應器:(vlr-reactors :vlr-acdb-reactor)(vlr-reactors :vlr-acdb
60、-reactor) ;返回;返回nilnil,沒有數據庫反應器,沒有數據庫反應器以下表達式列出所有以下表達式列出所有DWGDWG反應器:反應器: (vlr-reactors :vlr-dwg-reactor)(vlr-reactors :vlr-dwg-reactor);返回;返回(:VLR-DWG-Reactor (:VLR-DWG-Reactor # #)# #),有一個,有一個DWGDWG反應器,有兩個指反應器,有兩個指向該向該DWGDWG反應器的指針。反應器的指針。2. 2. 用用VLISPVLISP的檢驗工具檢查反應器的檢驗工具檢查反應器 可以使用可以使用VLISPVLISP的檢驗工
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 一年級體育下冊 第八課換物賽跑教學設計
- 小學音樂湘藝版一年級上冊(演唱)火車開啦 郊游教學設計及反思
- 批發市場客戶忠誠度提升考核試卷
- 石油化工產品批發考核試卷
- 跨境電商禮儀培訓
- 環保型船舶防污劑的合成與應用考核試卷
- 五年級下冊6.設計我們的小船教學設計及反思
- 玩具行業企業家精神與領導力培養實踐考核試卷
- 員工批判性思維訓練考核試卷
- 教師培訓收獲成果匯報
- 湖南2025屆新高考教學教研聯盟(長郡二十校)高三第二次預熱演練數學試題(含答案)
- 2025年注會合同法試題及答案
- 2025年礦區招聘考試試題及答案
- DBJ50T-220-2015 房屋建筑工程質量保修規程
- 8個事故案例13個警示視頻文字完善篇(礦山局迎檢資料)
- 黑龍江省齊齊哈爾市重點達標名校2025屆中考一模生物試題含解析
- Unit 3 Diverse Cultures Reading and Thinking (說課稿)高一英語同步高效課堂(人教版2019必修第三冊)001
- 工地試驗室管理經驗交流
- 2025年全國普通話水平測試50套復習題庫及答案
- 乙女游戲情感敘事中的虛擬親密關系
- 【培訓課件】跨境服務免稅政策及管理解讀
評論
0/150
提交評論