第11章 使用反應器 清華CAD二次開發(fā) LISP_第1頁
第11章 使用反應器 清華CAD二次開發(fā) LISP_第2頁
第11章 使用反應器 清華CAD二次開發(fā) LISP_第3頁
第11章 使用反應器 清華CAD二次開發(fā) LISP_第4頁
第11章 使用反應器 清華CAD二次開發(fā) LISP_第5頁
已閱讀5頁,還剩55頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

使用反應器2021/6/27111.1反應器反應器是一種反饋機制,它可以在發(fā)生某些特定事件時,將所發(fā)生的事件通知給應用程序,應用程序將會根據(jù)發(fā)生的具體事件做出相應的決策。例如,在某個圖元上鏈接了一個反應器,如果用戶移動這個圖元,應用程序就會接到反應器的通知,知道了該圖元被移動這個事件,如果需要,應用程序可以用適當?shù)膭幼鳎ㄈ缫苿优c該圖元相關的其它圖元,或顯示有關信息等)響應該通知。1.反應器的類型反應器有多種類型,每種反應器對應一個或多個AutoCAD事件。反應器可以分為以下幾個大類:

l

數(shù)據(jù)庫反應器:當圖形數(shù)據(jù)庫發(fā)生特定類型的事件時,該反應器將通知應用程序。2021/6/272l文檔反應器:當前圖形文檔發(fā)生改變(如打開新的圖形文檔、激活其它文檔窗口、改變文檔的鎖定狀態(tài)等)時,該反應器將通知應用程序。

l編輯器反應器:在調(diào)用AutoCAD命令(如打開圖形、關閉圖形、保存圖形、輸入輸出DXF文件、改變系統(tǒng)變量的值等)時,該反應器將通知應用程序。

l

鏈接反應器:當加載和卸載ARX應用程序時,該反應器將通知應用程序。

l對象反應器:當特定對象(AutoCAD圖元)被修改、復制或刪除時,該反應器將通知應用程序。調(diào)用函數(shù)vlr-types可返回反應器類型的完整列表。表11-1列出了AutoCAD反應器類型及其標識符。2021/6/273表11-1AutoCAD反應器類型及其標識符

反應器類型的標識符說明:VLR-AcDb-Reactor數(shù)據(jù)庫反應器:VLR-DocManager-Reactor文檔管理反應器:VLR-Editor-Reactor通用編輯器反應器:VLR-Linker-Reactor鏈接反應器:VLR-Object-Reactor對象反應器

其中通用編輯器反應器被進一步細分為更加明確的幾種反應器類型,見表11-2。表11-1中的通用編輯器反應器類型只是為了向后兼容才保留的,表11-2所示的各種編輯類型的反應器不能被通用編輯器:VLR-Editor-Reactor引用。

2021/6/274表11-2編輯類型的各種反應器及其標識符

反應器類型的標識符說明:VLR-Command-Reactor通報命令事件:VLR-DeepClone-Reactor通報deepclone事件:VLR-DWG-Reactor通報打開或關閉圖形文件的事件:VLR-DXF-Reactor通報和讀寫DXF文件相關的事件:VLR-Insert-Reactor通報和插入塊有關的事件:VLR-Lisp-Reactor通報LISP事件:VLR-Miscellaneous-Reactor(表中未列出的)其它編輯器反應器類型:VLR-Mouse-Reactor通報鼠標事件(例如雙擊):VLR-SysVar-Reactor通報對系統(tǒng)變量的修改:VLR-Toolbar-Reactor通報對工具欄上位圖的修改:VLR-Undo-Reactor通報undo事件:VLR-Wblock-Reactor通報和寫塊有關的事件:VLR-Window-Reactor通報和移動或改變AutoCAD窗口大小的事件:VLR-XREF-Reactor通報附著或修改XREF有關的事件2021/6/2753.反應器回調(diào)事件大部分AutoCAD操作都會產(chǎn)生一些特定的事件,這些事件能夠用來觸發(fā)反應器的動作,這樣的事件被稱為回調(diào)事件。例如,當發(fā)出Save命令保存圖形時,將會發(fā)生AutoCAD保存圖形文件(:vlr-beginSave)的事件,當保存過程結束時,將會發(fā)生AutoCAD已將當前圖形保存到磁盤(:vlr-saveComplete)的事件。設計基于反應器的應用程序就是根據(jù)回調(diào)事件的內(nèi)容編寫這些事件發(fā)生時所要激活的函數(shù)。

vlr-reaction-names函數(shù)返回與給定反應器類型相關的所有事件組成的表:

(vlr-reaction-namesreactor-type)

參數(shù)reactor-type是反應器類型的標識,見表11-1和表11-2。2021/6/276例如,下列代碼將返回和圖形反應器相關的所有事件組成的表:(vlr-reaction-names:VLR-DWG-Reactor)返回(:VLR-beginDwgOpen:VLR-endDwgOpen:VLR-dwgFileOpened:VLR-databaseConstructed: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-unappended:VLR-reappended:VLR-objectClosed)2021/6/277

加載并運行以下代碼,將會打印出所有相關反應器事件的列表(按反應器類型排序)。(defunprint-reactors-and-events()(foreachrtype(vlr-types)(princ(strcat"\n"(vl-princ-to-stringrtype)))(foreachrname(vlr-reaction-namesrtype)(princ(strcat"\n\t"(vl-princ-to-stringrname)))))(princ))AutoLISPReference列出了與各種反應器類型相關的所有事件,有關信息在創(chuàng)建反應器的函數(shù)部分做了說明。和ActiveX一樣,必須首先調(diào)用vl-load-com函數(shù),加載支持反應器和其它AutoLISP擴展函數(shù)之后,才能實現(xiàn)反應器的功能。2021/6/27811.2定義反應器的回調(diào)函數(shù)反應器的回調(diào)函數(shù)就是回調(diào)事件發(fā)生時所要執(zhí)行的函數(shù)。反應器的回調(diào)函數(shù)是用AutoLISP定義的。編寫回調(diào)函數(shù)有以下一些限制:①不能使用command函數(shù)調(diào)用AutoCAD命令,只能用ActiveX函數(shù)訪問圖形對象。②不能使用entget和entmod函數(shù)。③不能使用選擇集操作函數(shù)。④不能使用交互輸入函數(shù)。⑤在事件處理函數(shù)中不要加載警告和信息之外的對話框。定義對象反應器回調(diào)函數(shù)和定義其它反應器的回調(diào)函數(shù)也不完全相同。2021/6/27911.2.1定義對象反應器的回調(diào)函數(shù)定義對象反應器的回調(diào)函數(shù)的格式如下:

(defunfunction(notifier-objectreactor-objectparameter-list)…)參數(shù)notifier-object是事件發(fā)生的對象。參數(shù)reactor-objec是調(diào)用這個函數(shù)的反應器對象。參數(shù)parameter-list是回調(diào)事件返回的回調(diào)數(shù)據(jù)表。例如,例11-1定義了名為print-radius的回調(diào)函數(shù)。notifier-object是事件發(fā)生的對象,reactor-object是調(diào)用這個函數(shù)的反應器對象,parameter-list是回調(diào)事件返回的回調(diào)數(shù)據(jù)表。雖然在本例并不關心parameter-list的值,但定義回調(diào)函數(shù)時,也要進行變量聲明。2021/6/2710【例11-1】定義名字為print-radius的回調(diào)函數(shù),該函數(shù)用來打印圓的半徑。(defunprint-radius(notifier-objectreactor-objectparameter-list)(vl-load-com)(cond

((vlax-property-available-pnotifier-object"Radius")

;判斷該圖形對象是否具有radius特性

(princ“這個圓的半徑是:")(princ(vla-get-radiusnotifier-object)))))2021/6/271111.2.2定義其它反應器的回調(diào)函數(shù)由于其它反應器不需要鏈接到AutoCAD圖元上,因此定義其它反應器的回調(diào)函數(shù)只需要以下兩個參數(shù):(defunfunction(reactor-objectparameter-list)…)參數(shù)reactor-object是調(diào)用這個函數(shù)的反應器對象。參數(shù)parameter-list是回調(diào)事件返回的回調(diào)數(shù)據(jù)表。例11-2定義了名為saveDrawingInfo的回調(diào)函數(shù)。參數(shù)calling-reactor是調(diào)用該函數(shù)的反應器對象。參數(shù)commandInfo是回調(diào)事件返回的回調(diào)數(shù)據(jù)表。該函數(shù)在發(fā)生保存AutoCAD圖形的事件時將被激活,顯示文件的路徑和大小等信息。

2021/6/2712【例11-2】定義名字為saveDrawingInfo的回調(diào)函數(shù)。(defunsaveDrawingInfo(calling-reactorcommandInfo/dwgnamefilesize)(vl-load-com)(setqdwgname(cadrcommandInfo)filesize(vl-file-sizedwgname))(alert(strcat"這個文件("dwgname")的大小是"(itoafilesize)"字節(jié)."))(princ))

在該例中,通過函數(shù)vl-file-size獲取圖形文件的大小,通過警告對話框顯示這些信息。2021/6/271311.2.3.AutoCAD預定義的回調(diào)函數(shù)

AutoCAD提供了兩個預定義的回調(diào)函數(shù),可以在測試反應器時使用這些函數(shù):(1)vlr-beep-reaction函數(shù)vlr-beep-reaction的功能是讓計算機發(fā)出“嘟嘟”聲。(2)vlr-trace-reaction函數(shù)vlr-trace-reaction函數(shù)的功能是將參數(shù)列表打印到VLISP的“跟蹤”窗口。2021/6/271411.3創(chuàng)建反應器創(chuàng)建反應器的主要工作就是將事件和回調(diào)函數(shù)相關聯(lián)。創(chuàng)建反應器用vlr-

-reactor函數(shù)。每種類型的反應器都有一個與之對應的用于創(chuàng)建該反應器的AutoLISP函數(shù),這些函數(shù)的名稱和反應器類型的名稱相同,只是沒有前面的冒號。例如,vlr-acdb-reactor為創(chuàng)建數(shù)據(jù)庫反應器函數(shù),vlr-toolbar-reactor為創(chuàng)建工具欄反應器函數(shù)。所有創(chuàng)建反應器的構造函數(shù)都返回一個反應器對象。

AutoLISPReference列出了與每種反應器類型相關的所有可能事件。例如,通過vlr-DWG-reactor條目,可看到表11-3所示與DWG反應器相關的所有可能事件。2021/6/2715表11-3DWG反應器事件

事件名稱說明:vlr-beginClose圖形數(shù)據(jù)庫將被關閉。:vlr-databaseConstructed已經(jīng)構建圖形數(shù)據(jù)庫。:vlr-databaseToBeDestroyed將從內(nèi)存中刪除圖形數(shù)據(jù)庫的內(nèi)容。:vlr-beginDwgOpenAutoCAD將打開圖形文件。:vlr-endDwgOpenAutoCAD已結束打開操作。:vlr-dwgFileOpened新圖形已被加載到AutoCAD圖形窗口。:vlr-beginSaveAutoCAD將保存圖形文件。:vlr-saveCompleteAutoCAD已將當前圖形保存到磁盤。2021/6/271611.3.1創(chuàng)建對象反應器因為對象反應器必須鏈接到特定的AutoCAD圖元(對象)上,所以在定義對象反應器時,必須指定反應器所要鏈接的圖元。創(chuàng)建對象反應器通過函數(shù)vlr-object-reactor,該函數(shù)的調(diào)用格式如下:

(vlr-object-reactorownersdatacallbacks)

參數(shù)owners為VLA對象表,表內(nèi)可以是多個VLA對象。這些對象也被稱為反應器的所有者。參數(shù)data為與反應器對象相關聯(lián)的數(shù)據(jù),如果沒有數(shù)據(jù)則該項為nil。參數(shù)callbacks為點對表,用于指明事件和與該事件相關聯(lián)的回調(diào)函數(shù)。點對表的格式如下:

(event-name.callback_function)

該點對表的event-name是表11-4所示Object事件中的名稱標識,callback_function為回調(diào)函數(shù)。表11-5是針表11-4所示對特定的回調(diào)事件返回的回調(diào)數(shù)據(jù)表。該函數(shù)的返回值為reactor_object(對象反應器)。

2021/6/2717名稱標識事件:vlr-cancelled對對象的修改已經(jīng)取消。:vlr-copied對象已被復制。:vlr-erased對象的刪除標志已被設置。:vlr-unerased對象的刪除標志已被重置。:vlr-goodbye即將從內(nèi)存中刪除對象。:vlr-openedForModify即將修改對象。:vlr-modified對象已被修改。如果取消修改,還將激發(fā)

:vlr-cancelled和:vlr-modifyUndone。:vlr-subObjModified對象的子圖元已被修改。在修改多段線或網(wǎng)格頂點時觸發(fā)該事件。:vlr-modifyUndone對象的修改已被放棄。:vlr-modifiedXData對象的擴展圖元數(shù)據(jù)已被修改。:vlr-unappended已從圖形數(shù)據(jù)庫中拆離對象。:vlr-reappended對象已被重新鏈接到圖形數(shù)據(jù)庫。:vlr-objectClosed對對象的修改已經(jīng)完成。表11-4Object事件及其名稱標識

2021/6/2718名稱表長度參數(shù):vlr-cancelled0:vlr-erased:vlr-unerased:vlr-goodbye:vlr-openedForModify:vlr-modified:vlr-modifyUndone:vlr-modifiedXData:vlr-unappended:vlr-reappended:vlr-objectClosed:vlr-copied1由復制操作創(chuàng)建的對象(ename)。:vlr-subObjModified1已被修改的子對象(ename)。表11-5Object事件回調(diào)數(shù)據(jù)

2021/6/2719

例如,下面的代碼創(chuàng)建了一個對象反應器。該對象反應器只有一個所有者,即VLA對象myCircle;與該反應器對象相關聯(lián)的數(shù)據(jù)為"CircleReactor";點對表為(:vlr-modified.print-radius),當發(fā)生myCircle對象被修改(即:vlr-modified)事件時,調(diào)用print-radius回調(diào)函數(shù):(setqcircleReactor(vlr-object-reactor(listmyCircle)"CircleReactor"'((:vlr-modified.print-radius))))

上述反應器對象賦給了變量circleReactor??梢酝ㄟ^該變量實現(xiàn)對該反應器的查詢、修改或刪除等。2021/6/2720

創(chuàng)建對象反應器除了必須指定反應器所要鏈接的圖元之外,還要注意以下幾點:(1)在定義所有者列表時,只能指定VLA對象,而不允許使用ename對象。要求VLA對象是因為回調(diào)函數(shù)只能用ActiveX方法修改AutoCAD對象,而ActiveX方法要求使用VLA對象。盡管不能在回調(diào)反應器中使用由entlast和entget等函數(shù)獲取VLA對象,但可以用vlax-ename->vla-object函數(shù)將ename對象轉換成VLA對象。(2)如果對象已被包括在對象反應器的所有者列表之中,那么就不能在回調(diào)函數(shù)中修改該對象。如果這樣做,將會導致一個出錯消息,并使AutoCAD崩潰。下面是實現(xiàn)對象反應器功能的實例:2021/6/2721(1)加載例11-3所示程序段【例11-3】生成一個圓的VLA對象。(setqmyCircle(progn(setqctrPt(getpoint"\n輸入圓心:")radius(distancectrPt(getpointctrpt"\n輸入半徑

:")))(vla-addCircle

(vla-get-ModelSpace;將圓加入到圖形模型空間

(vla-get-ActiveDocument(vlax-get-acad-object)))

(vlax-3d-pointctrPt)radius)))

該代碼使用vla-addCircle畫一個圓,將返回值賦給變量myCircle。該返回值是VLA對象,包含指向所畫圓對象的指針。2021/6/2722(2)加載例11-1所示回調(diào)函數(shù)print-radius。(3)定義對象反應器(setqcircleReactor(vlr-object-reactor(listmyCircle)"CircleReactor"'((:vlr-modified.print-radius))))(4)在AutoCAD圖形窗口,選取該圓并修改其大小,print-radius函數(shù)將在AutoCAD命令窗口顯示一個消息。例如,如果用夾點或STRETCH命令改變了該圓的大小,將在命令提示區(qū)顯示以下信息:**STRETCH**Specifystretchpointor[Basepoint/Copy/Undo/eXit]:這個圓的半徑是:190.0

如果用夾點或STRETCH命令改變其他圓時的大小,將沒有該提示信息中的“這個圓的半徑是:”,這是因為在其他的圓上沒有鏈接circleReactor反應器。2021/6/272311.3.2創(chuàng)建其它反應器其它反應器不需要鏈接AutoCAD圖元,所以在定義時,只需要兩個參數(shù)。創(chuàng)建其它反應器通過函數(shù)vlr-

-reactor,該函數(shù)的調(diào)用格式如下:

(vlr-

-reactordatacallbacks)

參數(shù)data為任意要與反應器對象關聯(lián)的數(shù)據(jù),如果沒有數(shù)據(jù)則該項為nil。參數(shù)callbacks為點對表,指明事件和與該事件相關聯(lián)的回調(diào)函數(shù),點對表的格式如下:

(event-name.callback_function)

例如,下列代碼定義了一個DWG編輯器反應器。當用戶發(fā)出Save命令時,該反應器將激活saveDrawingInfo函數(shù)。

(vlr-dwg-Reactornil'((:vlr-saveComplete.saveDrawingInfo)))

在該例中,第一個參數(shù)為nil是因為沒有與反應器相關聯(lián)的數(shù)據(jù);第二個參數(shù)是點對表,指明:vlr-saveComplete事件與saveDrawingInfo回調(diào)函數(shù)相關聯(lián)。當:vlr-saveComplete事件發(fā)生時,AutoCAD傳遞給回調(diào)函數(shù)一個圖形文件名字的字符串。2021/6/2724

每個點對表都指定了反應器要通報的事件,以及該事件發(fā)生時要調(diào)用的回調(diào)函數(shù)。在本例中,只指定了一個事件:vlr-saveComplete。只要用戶發(fā)出命令,不管是從AutoCAD命令行、菜單、工具欄或AutoLISP程序,都會通知編輯器反應器。所以,該DWG反應器的回調(diào)函數(shù)需要明確它應對什么事件作出響應。在本例中,回調(diào)函數(shù)saveDrawingInfo只是檢查Save命令。下面是實現(xiàn)DWG反應器功能的實例:(1)加載例11-2所定義的回調(diào)函數(shù)saveDrawingInfo。

(2)

定義DWG反應器

(vlr-dwg-Reactornil'((:vlr-saveComplete.saveDrawingInfo)))

(3)在AutoCAD圖形窗口點取存盤的圖標或調(diào)用存圖的命令。當完成存圖工作時將會彈出圖11-1所示的AutoCADMessage對話框。說明該實例成功。圖11-1AutoCAD的Message對話框

2021/6/272511.3.3將數(shù)據(jù)附著到反應器對象利用創(chuàng)建反應器函數(shù)的參數(shù)data可以為反應器指定與其關聯(lián)的數(shù)據(jù),如果該項為nil,表示不需要為反應器指定與其關聯(lián)的數(shù)據(jù)。一個對象可能鏈接多個反應器,如果它們的參數(shù)data都為nil,應用程序將無法區(qū)分它們。在這種情況下就應該為反應器指定文本字符串或應用程序能識別的其它數(shù)據(jù)。例如,前面創(chuàng)建對象反應器circleReactor的實例中,字符串“CircleReactor”就是與反應器circleReactor相關聯(lián)的數(shù)據(jù)。11.4查詢、修改和控制反應器的狀態(tài)11.4.1查詢反應器有多種不同的方法來獲取反應器的信息??梢允褂脴藴实腣LISP數(shù)據(jù)查看工具查看反應器的信息,也可以用有關反應器的AutoLISP函數(shù)。2021/6/27261.了解圖形中有關反應器的總體情況通過vlr-reactors函數(shù)可以了解當前圖形中總共用到了哪些反應器或有哪些指定類型的反應器。vlr-reactors函數(shù)的調(diào)用格式如下:(vlr-reactors[reactor-type...])

參數(shù)reactor-type為反應器類型的標識符。如果指定了reactor-type參數(shù),該函數(shù)返回由指定類型反應器組成的表。如果省略參數(shù)reactor-type,該函數(shù)返回所有當前圖形所有的反應器。以下表達式列出圖形中的所有反應器:

(vlr-reactors)

;返回((:VLR-Object-Reactor#<VLR-Object-Reactor>)(:VLR-Editor-Reactor#<VLR-Editor-Reactor>)),有一個對象反應器和一個編輯器反應器。2021/6/2727以下表達式列出所有的對象反應器:

(vlr-reactors:vlr-object-reactor)

;返回((:VLR-Object-Reactor#<VLR-Object-Reactor>)),有一個對象反應器以下表達式列出所有數(shù)據(jù)庫反應器:(vlr-reactors:vlr-acdb-reactor)

;返回nil,沒有數(shù)據(jù)庫反應器以下表達式列出所有DWG反應器:

(vlr-reactors:vlr-dwg-reactor);返回((:VLR-DWG-Reactor#<VLR-DWG-Reactor>#<VLR-DWG-Reactor>)),有一個DWG反應器,有兩個指向該DWG反應器的指針。2021/6/27282.用VLISP的檢驗工具檢查反應器可以使用VLISP的檢驗工具檢查反應器。在VLISP編輯器窗口選擇circleReactor,單擊按鈕,將彈出圖11-2所示檢驗窗口,該窗口顯示以下信息:

圖11-2有關反應器的檢驗窗口

l

反應器的類型標識符,如VLR-Object-Reactorl

該反應器的所有者,如<VLR-OBJECTIAcadCircle03708534>l

事件和與之相關聯(lián)的回調(diào)函數(shù),如:VLR-modifiedPRINT-RADIUSl

該反應器是否是活動的:如果是活動的,added-p為T,否則它為nill

附著到反應器上的用戶數(shù)據(jù),如“CircleReactor”l

反應器的文檔范圍:如active-document-onlyl

該反應器所在文擋:如<VLA-OBJECTIacadDocument01165340>雙擊以{Owners}開頭的條目,可查看反應器所有者的列表。

2021/6/27293.用函數(shù)調(diào)用、查詢反應器VLISP還提供了可在應用程序或控制臺提示處查看反應器定義的函數(shù):(1)vlr-type函數(shù)返回指定反應器的類型,例如:

(vlr-typecircleReactor)

;返回:VLR-Object-Reactor(對象反應器)(2)vlr-current-reaction-name函數(shù)返回當前反應器觸發(fā)回調(diào)函數(shù)的事件名稱。例如:(vlr-current-reaction-name)

;返回nil(3)vlr-data返回附著到反應器的特定應用程序數(shù)據(jù),可用該數(shù)據(jù)區(qū)分鏈接在同一個對象上的多個反應器。例如:(vlr-datacircleReactor)

;返回"CircleReactor“(4)vlr-owners函數(shù)返回向某對象反應器發(fā)出通報的AutoCAD圖形中的對象(反應器所有者)列表,下述函數(shù)調(diào)用將列出circleReactor的所有者:(vlr-ownerscircleReactor)

;返回(#<VLA-OBJECTIAcadCircle03ad077c>)(5)vlr-reactions函數(shù)返回指定反應器的回調(diào)條件-回調(diào)函數(shù)列表,下例將返回circleReactor的相關信息。例如:(vlr-reactionscircleReactor)

;返回((:VLR-modified.PRINT-RADIUS))2021/6/273011.4.2修改反應器1添加或替換反應器的回調(diào)函數(shù)通過函數(shù)vlr-reaction-set可以添加或替換反應器中的一個回調(diào)函數(shù)。該函數(shù)的調(diào)用格式如下:(vlr-reaction-setreactoreventfunction)

參數(shù)reactor為反應器對象。event為符號,表示該反應器類型可用的事件之一。Function為要添加或替換的AutoLISP函數(shù)名。返回值未確定。例如,下面的命令使反應器circleReactor在修改對象時調(diào)用print-area函數(shù):(vlr-reaction-setcircleReactor:vlr-modified'print-area)

;返回PRINT-AREA2021/6/27312.修改與反應器相關聯(lián)的數(shù)據(jù)通過函數(shù)vlr-data-set可以修改與反應器相關聯(lián)的數(shù)據(jù)。該函數(shù)的調(diào)用格式如下:(vlr-data-setobjdata)

參數(shù)obj為反應器對象,表示要修改數(shù)據(jù)的反應器對象。data為新數(shù)據(jù)。返回值為參數(shù)data。例如,查看附著到反應器circleReactor的數(shù)據(jù)值:

(vlr-datacircleReactor)返回"CircleReactor"

用字符串"CircleAreaReactor"替換反應器circleReactor的原有數(shù)據(jù)"CircleReactor":

(vlr-data-setcircleReactor"CircleAreaReactor")

;返回"CircleAreaReactor"

驗證是否有了改變:

(vlr-datacircleReactor)

;返回"CircleAreaReactor"

注意,應小心使用vlr-data-set函數(shù),以免構成循環(huán)結構。

2021/6/27323.將一個數(shù)據(jù)庫對象添加到反應器的所有者列表內(nèi)通過函數(shù)vlr-owner-add可以將一個數(shù)據(jù)庫對象添加到指定反應器的所有者列表內(nèi)。該函數(shù)的調(diào)用格式如下:(vlr-owner-addreactorowner)

參數(shù)reactor為反應器對象。owner為要添加到反應器所有者列表中的VLA對象。返回值為已添加了反應器的VLA對象。例如,在下例中,名為archie的圓弧對象被添加到反應器circleReactor的所有者列表中:

(vlr-owner-addcircleReactorarchie)

;返回#<vla-OBJECTIAcadArc03ad0bcc>

可通過檢驗該反應器來驗證這點:更新反應器circleReactor的檢驗窗口,用鼠標雙擊檢驗窗口的{Owners}開頭的條目,將彈出圖11-3所示的反應器所有者檢驗窗口。

2021/6/2733圖11-3反應器所有者的檢驗窗口

4.從反應器所有者列表中刪除某所有者對象通過函數(shù)vlr-owner-remove可以從反應器所有者列表中刪除某所有者對象。該函數(shù)的調(diào)用格式如下:

(vlr-owner-removereactorowner)

參數(shù)reactor為反應器對象。owner為要從反應器所有者列表中刪除的VLA對象。返回值為被刪除的VLA對象。例如:

(vlr-owner-removecircleReactorarchie);返回#<vla-OBJECTIAcadArc03ad0bcc>2021/6/273411.4.3控制反應器的狀態(tài)1.判斷反應器是否是活動的通過函數(shù)vlr-added-p可以判斷反應器是否是活動的。vlr-added-p函數(shù)的調(diào)用格式如下:

(vlr-added-pobj)

參數(shù)obj為反應器對象,表示要測試的反應器。如果反應器是活動的(已在AutoCAD中注冊),返回T,如果該反應器失效,則返回nil。例如:

(vlr-added-pcircleReactor)

;返回T,表示該反應器是活動的2021/6/27352.使反應器失效通過函數(shù)vlr-remove可以使指定的反應器失效。vlr-remove函數(shù)的調(diào)用格式如下:(vlr-removeobj)

參數(shù)obj為反應器對象。如果成功,返回反應器對象,否則,返回nil。例如,使反應器circleReactor失效:(vlr-removecircleReactor);返回#<VLR-Object-reactor>

注意,失效的反應器,并沒有從內(nèi)存中被刪除,該反應器仍然存在。

2021/6/27362.恢復失效的反應器通過函數(shù)vlr-add可以恢復指定的失效反應器,使之成為活動的(在AutoCAD中注冊)。vlr-add函數(shù)的調(diào)用格式如下:

(vlr-addobj)

參數(shù)obj為反應器對象,表示要恢復的失效反應器。如果成功,返回反應器對象,否則,返回nil。例如,恢復失效的circleReactor反應器:

(vlr-addcircleReactor)

;返回#<VLR-Object-reactor>

通過函數(shù)vlr-remove-all可以使圖形中所有的反應器失效。vlr-remove-all函數(shù)的調(diào)用格式如下:

(vlr-remove-all[reactor-type])2021/6/2737

可選參數(shù)reactor-type為反應器類型的標識符,如果未指定reactor-type,該函數(shù)禁用圖形中所有的反應器。返回為包含若干個子表的表,每個子表的第一個元素表示反應器的類型,后續(xù)元素表示禁用的反應器對象。如果沒有活動的反應器,該函數(shù)返回nil。例如,下面的函數(shù)調(diào)用將禁用所有編輯器反應器:

(vlr-remove-all:vlr-editor-reactor)

返回((:VLR-Editor-Reactor#<VLR-Editor-Reactor>))

下面的調(diào)用函數(shù)將禁用所有反應器:

(vlr-remove-all)

返回((:VLR-Object-Reactor#<VLR-Object-Reactor>#<VLR-Object-Reactor>#<VLR-Object-Reactor>)(:VLR-Editor-Reactor#<VLR-Editor-Reactor>))2021/6/273811.5臨時反應器和永久反應器反應器可以是臨時的,也可以是永久的。二者的區(qū)別是:下一次打開該圖形時,臨時反應器將丟失,永久反應器則仍然存在。前者是反應器的默認模式。1.將臨時反應器變成永久反應器通過函數(shù)vlr-pers可以將臨時反應器變成永久反應器。函數(shù)vlr-pers的調(diào)用格式如下:

(vlr-persobj)

參數(shù)obj為反應器對象。如果成功則返回指定的反應器對象,否則返回nil。例如:

(vlr-perscircleReactor)

;返回#<VLR-Object-Reactor>2021/6/27392.將永久反應器改變?yōu)榕R時反應器通過函數(shù)vlr-pers-release可以將永久反應器改變?yōu)榕R時反應器。函數(shù)vlr-pers的調(diào)用格式如下:

(vlr-pers-releaseobj)

參數(shù)obj為反應器對象。如果成功則返回反應器對象,否則返回nil。

(vlr-pers-releasecircleReactor);返回#<VLR-Object-Reactor>3.判斷反應器是否是永久反應器通過函數(shù)vlr-pers-p可以判斷反應器是否是永久反應器。函數(shù)vlr-pers-p的調(diào)用格式如下:

(vlr-pers-pobj)

參數(shù)obj為反應器對象。如果指定反應器是永久反應器,則返回指定的反應器對象,否則返回nil。例如:

(vlr-pers-pcircleReactor);返回#<VLR-Object-Reactor>2021/6/27404.列出當前圖形文檔中的永久反應器通過函數(shù)vlr-pers-list可以列出當前圖形文檔中的永久反應器。函數(shù)vlr-pers-list的調(diào)用格式如下:

(vlr-pers-list[reactor-type])

參數(shù)reactor-type為要列出的反應器對象。如果未指定reactorr-type,該函數(shù)列出所有永久反應器。返回值為由反應器對象組成的表。例如:(vlr-pers-list)

;返回(#<VLR-Object-Reactor>#<VLR-Object-Reactor>(#<VLR-Object-Reactor>)2021/6/2741打開含有永久反應器的圖形時的注意事項反應器只是鏈接事件和回調(diào)函數(shù)的一種工具,回調(diào)函數(shù)本身不是反應器的一部分,它一般也不是圖形的一部分。只有AutoCAD中加載了相關聯(lián)的回調(diào)函數(shù)時,圖形中保存的反應才有實際作用。如果將反應器和回調(diào)函數(shù)定義在獨立名稱空VLX中,則在打開圖形時會自動加載回調(diào)函數(shù)。如果打開的圖形包括VLISP反應器信息,但沒有加載相關回調(diào)函數(shù),AutoCAD會顯示一個錯誤信息??捎煤瘮?shù)vlr-pers-list返回圖形文檔中所有永久反應器組成的表。2021/6/274211.6反應器的使用規(guī)則由于將來可能修改反應器的內(nèi)部實現(xiàn)機制,使用反應器時請盡量遵守下述規(guī)則,如果不遵守這些規(guī)則,可能會導致應用程序出現(xiàn)不可預料的結果。(1)不要依賴于反應器通報的順序除了少數(shù)特例之外,建議不要依賴于反應器通報的順序。例如,OPEN命令將觸發(fā)BeginCommand、BeginOpen、EndOpen和EndCommand事件。然而,它們發(fā)出的順序可能不是這樣的??梢砸蕾嚨捻樞蛑挥蠦egin事件是在相應End事件之前。例如commandWillStart()總是在commandEnded()之前發(fā)生,而beginInsert()總是在endInsert()之前發(fā)生。因為將來可能引入新的事件通報,可能會重新排列現(xiàn)有通報順序,所以依賴于更復雜的順序,可能會給您的應用程序帶來問題。2021/6/2743(2)不要依賴于通報間函數(shù)調(diào)用的順序在通報之間函數(shù)調(diào)用的順序也是不能保證的。例如,當收到對象A的通報:vlr-erased時,它僅表示對象A被刪除,如果在收到對象A的通報:vlr-erased之后收到了對象B的通報:vlr-erased,這只是表示對象A和B都已被刪除。并不能保證B是在A后面被刪除。如果應用程序依賴于這個層次的關系,那么應用程序在后續(xù)版本的AutoCAD中很可能會崩潰。所以不要依賴于這些順序,而應該依賴于用反應器來指示系統(tǒng)的狀態(tài)。(3)不要在反應器回調(diào)函數(shù)中使用任何需要和用戶交互的函數(shù)在反應器回調(diào)函數(shù)中試圖調(diào)用交互函數(shù)會導致嚴重問題,因為在事件發(fā)生時,AutoCAD可能仍在處理某命令。所以要避免使用要求用戶輸入的函數(shù),如getpoint、entsel和getkword等,也不要使用選擇集操作函數(shù)和command函數(shù)。2021/6/2744(4)在事件處理函數(shù)中不要加載對話框對話框和用戶交互函數(shù)一樣,也會影響AutoCAD的當前操作。但是,消息對話框和警告對話框可認為是非交互的,所以可以使用它們。(5)不要更新引發(fā)事件的對象引起對象觸發(fā)回調(diào)函數(shù)的事件可能仍在處理之中,當調(diào)用回調(diào)函數(shù)時AutoCAD可能仍在使用該對象。所以,在回調(diào)函數(shù)中不要試圖更新這樣的對象。然而,可以從觸發(fā)事件的對象中讀取信息。例如,假設有一塊用磚填充的地板,而且將反應器鏈接到地板邊界上。如果修改地板的尺寸,反應器回調(diào)函數(shù)將自動添加或刪除磚以填充新的地板面積。通過函數(shù)能夠獲取邊界的新面積,但不能去修改邊界本身。2021/6/2745(6)不要在回調(diào)函數(shù)中執(zhí)行能觸發(fā)相同事件的操作如果在反應器回調(diào)函數(shù)中執(zhí)行的某操作過程中觸發(fā)了同樣的事件,將會陷入一個無限循環(huán)。例如,如果在BeginOpen事件的回調(diào)函數(shù)中試圖打開一個圖形,AutoCAD將持續(xù)打開更多的圖形,直到打開的圖形數(shù)目達到上限,無法再打開圖形為止。

(7)能在發(fā)生同一事件時調(diào)用多個回調(diào)函數(shù)在設置反應器以前要確認當前沒有設置該反應器,否則可能在發(fā)生同一事件時調(diào)用多個回調(diào)函數(shù)。(8)顯示有模對話框時,不會發(fā)生任何事件所謂有模對話框,是指操作其它窗口之前必須關閉的話框時。顯示這樣的對話框時,不會發(fā)生任何事件。2021/6/274611.7定義反應器實例1.定義將對象反應器鏈接到指定直線的命令。要求:當直線被修改時,彈出顯示該直線長度的信息對話框。很明顯,反應器的鏈接對象就是指定的直線。觸發(fā)事件是直線被修改,從表11-4可以查找出圖形對象被修改的事件是:vlr-modified?;卣{(diào)函數(shù)的功能是調(diào)用信息對話框顯示被選直線長度。程序的代碼如下:【例11-4】定義將對象反應器鏈接到指定直線的命令。(vl-load-com)(defunc:rct-line(/elrltvrl)(setqel(car(entsel"\n選擇一條鏈接反應器的直線:")))(setqrlt(list(vlax-ename->vla-objectel)));將圖元名轉換為VLA對象2021/6/2747;創(chuàng)建對象反應器,回調(diào)事件是圖元被修改,回調(diào)函數(shù)是show-l

(setqvrl(vlr-pers(vlr-object-reactorrltnil'((:vlr-modified.show-l)))))(princ));定義回調(diào)函數(shù)(defunshow-l(notifier-objectreactor-objectparameter-list/l)(setql(vla-get-lengthnotifier-object));將被選直線的長度賦給變量l(setql(rtosl24));將數(shù)值轉換為字符串

(alert(strcat"直線的長度是:"l));調(diào)用信息對話框)2021/6/2748

加載以上程序,在Command:提示下輸入rct-line命令,用鼠標指定一條直線,該反應器就會鏈接到指定的直線上。修改這條直線時,就會出現(xiàn)圖11-4所示顯示有該直線當前長度信息的對話框。圖11-4顯示直線當前長度信息的對話框2021/6/27492.定義繪制圖11-5所示圖形的命令。要求:將對象反應器鏈接到圓上,如果圓被修改,兩條直線與圓的相對位置和相對比例不變。圖11-5一個圓和兩條直線組成的圖形

根據(jù)題意,反應器的鏈接對象是圓。觸發(fā)事件是圓被修改,從表11-4可以查找出圖形對象被修改的事件是:vlr-modified?;卣{(diào)函數(shù)的功能是兩條直線隨之被修改,且修改后與圓的相對位置和相對比例不變。兩條直線是與該反應器相關聯(lián)的對象。2021/6/2750【例11-5】定義將對象反應器鏈接到圓上的命令,如果圓被修改,兩條直線與圓的相對位置和相對比例不變。(vl-load-com)(defunc:c1l2(/p0p1p2p3p4rr1eh1eh2l1-l2rltvrl)(setqp0(getpoint"\n輸入圓心:"))(setqr(getdistp0"\n輸入半徑:"))(command"circle"p0r)(setqr1(*1.25r))(setqec(entlast))(setqp1(polarp00r1))(setqp2(polarp0(*0.5pi)r1))(setqp3(polarp0pir1))2021/6/2751(setqp4(polarp0(*-0.5pi)r1))(command"line"p1p3"")(setqeh1(cdr(assoc5(entget(entlast)))));第一條直線的句柄

(command"line"p2p4"")(setqeh2(cdr(assoc5(entget(entlast)))));第二條直線的句柄

(setql1-l2(listeh1eh2));兩條直線的句柄表

(setqrlt(list(vlax-ename->vla-objectec)));圓的圖元名轉換為VLA對象

(setqvrl(vlr-pers(vlr-object-reactorrltl1-l2'((:vlr-modified.c-2l)))));反應器鏈接到圓上,兩條直線的句柄表為關聯(lián)數(shù)據(jù),當發(fā)生修改該圓的事件時,調(diào)用c-2l函數(shù)

(princ);靜默退出)2021/6/2752;定義c-2l函數(shù)(defunc-2l(notifier-objectreactor-objectparameter-list/ecec_lel1el2ell_1ell_2p0p1p2p3p4p0xp0yp0z)(setqec(vlax-vla-object->enamenotifier-object);VLA對象的圓轉換為圖元名

ec_l(entgetec);圓的圖元表

p0(cdr(assoc10ec_l));獲取圓心的坐標

r(*1.25(cdr(assoc40ec_l)));獲取圓的半徑之后×1.25)(setqel1(handent(car(vlr-datareactor-object))));第一條直線的圖元名

(setqel2(handent(cadr(vlr-datareactor-object))));第二直條線的圖元名2021/6/2753(setqp0x(carp0));獲取圓心的X坐標

(setqp0y(cadrp0));獲取圓心的Y坐標

(setqp0z(caddrp0));獲取圓心的Z坐標

(setqp1(list(+p0xr)p0yp0z));修改直線端點的坐標

(setqp2(listp0x(+p0yr)p0z));修改直線端點的坐標

(setqp3(list(-p0xr)p0yp0z));修改直線端點的坐標

(setqp4(listp0x(-p0yr)p0z));修改直線端點的坐標

(setqell_1(entgetel1));第一條直線的圖元表

(setqell_1(subst(vl-list*10p1)(assoc10ell_1)ell_1));直線的新端點替換直線的老端點

(setqell_1(subst(vl-list*11p3)(assoc11ell_1)ell_1));直線的新端點替換直線的老端點2021/6/2754(entmodell_1);更新第一條直線

(setqell_2(entgetel2));第二條直線的圖元表

(setqell_2(subst(vl-list*10p2)(assoc10ell_2)ell_2));直線的新端點替換直線的老端點

(setqell_2(subst(vl-list*11p4)(assoc11ell_2)ell_2));直線的新端點替換直線的老端點

(entmodell_2);更新第二條直線)

加載以上程序,在Command:提示下輸入c1l2命令,輸入圓心和半徑,即可繪制出圖11-5所示圖形。修改這個圓,

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論