




已閱讀5頁,還剩55頁未讀, 繼續(xù)免費閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
第11章使用反應(yīng)器,11.1反應(yīng)器反應(yīng)器是一種反饋機制,它可以在發(fā)生某些特定事件時,將所發(fā)生的事件通知給應(yīng)用程序,應(yīng)用程序?qū)鶕?jù)發(fā)生的具體事件做出相應(yīng)的決策。例如,在某個圖元上鏈接了一個反應(yīng)器,如果用戶移動這個圖元,應(yīng)用程序就會接到反應(yīng)器的通知,知道了該圖元被移動這個事件,如果需要,應(yīng)用程序可以用適當(dāng)?shù)膭幼鳎ㄈ缫苿优c該圖元相關(guān)的其它圖元,或顯示有關(guān)信息等)響應(yīng)該通知。1.反應(yīng)器的類型反應(yīng)器有多種類型,每種反應(yīng)器對應(yīng)一個或多個AutoCAD事件。反應(yīng)器可以分為以下幾個大類:l數(shù)據(jù)庫反應(yīng)器:當(dāng)圖形數(shù)據(jù)庫發(fā)生特定類型的事件時,該反應(yīng)器將通知應(yīng)用程序。,l文檔反應(yīng)器:當(dāng)前圖形文檔發(fā)生改變(如打開新的圖形文檔、激活其它文檔窗口、改變文檔的鎖定狀態(tài)等)時,該反應(yīng)器將通知應(yīng)用程序。l編輯器反應(yīng)器:在調(diào)用AutoCAD命令(如打開圖形、關(guān)閉圖形、保存圖形、輸入輸出DXF文件、改變系統(tǒng)變量的值等)時,該反應(yīng)器將通知應(yīng)用程序。l鏈接反應(yīng)器:當(dāng)加載和卸載ARX應(yīng)用程序時,該反應(yīng)器將通知應(yīng)用程序。l對象反應(yīng)器:當(dāng)特定對象(AutoCAD圖元)被修改、復(fù)制或刪除時,該反應(yīng)器將通知應(yīng)用程序。調(diào)用函數(shù)vlr-types可返回反應(yīng)器類型的完整列表。表11-1列出了AutoCAD反應(yīng)器類型及其標(biāo)識符。,表11-1AutoCAD反應(yīng)器類型及其標(biāo)識符,反應(yīng)器類型的標(biāo)識符說明:VLR-AcDb-Reactor數(shù)據(jù)庫反應(yīng)器:VLR-DocManager-Reactor文檔管理反應(yīng)器:VLR-Editor-Reactor通用編輯器反應(yīng)器:VLR-Linker-Reactor鏈接反應(yīng)器:VLR-Object-Reactor對象反應(yīng)器,其中通用編輯器反應(yīng)器被進一步細分為更加明確的幾種反應(yīng)器類型,見表11-2。表11-1中的通用編輯器反應(yīng)器類型只是為了向后兼容才保留的,表11-2所示的各種編輯類型的反應(yīng)器不能被通用編輯器:VLR-Editor-Reactor引用。,表11-2編輯類型的各種反應(yīng)器及其標(biāo)識符,反應(yīng)器類型的標(biāo)識符說明:VLR-Command-Reactor通報命令事件:VLR-DeepClone-Reactor通報deepclone事件:VLR-DWG-Reactor通報打開或關(guān)閉圖形文件的事件:VLR-DXF-Reactor通報和讀寫DXF文件相關(guān)的事件:VLR-Insert-Reactor通報和插入塊有關(guān)的事件:VLR-Lisp-Reactor通報LISP事件:VLR-Miscellaneous-Reactor(表中未列出的)其它編輯器反應(yīng)器類型:VLR-Mouse-Reactor通報鼠標(biāo)事件(例如雙擊):VLR-SysVar-Reactor通報對系統(tǒng)變量的修改:VLR-Toolbar-Reactor通報對工具欄上位圖的修改:VLR-Undo-Reactor通報undo事件:VLR-Wblock-Reactor通報和寫塊有關(guān)的事件:VLR-Window-Reactor通報和移動或改變AutoCAD窗口大小的事件:VLR-XREF-Reactor通報附著或修改XREF有關(guān)的事件,3.反應(yīng)器回調(diào)事件大部分AutoCAD操作都會產(chǎn)生一些特定的事件,這些事件能夠用來觸發(fā)反應(yīng)器的動作,這樣的事件被稱為回調(diào)事件。例如,當(dāng)發(fā)出Save命令保存圖形時,將會發(fā)生AutoCAD保存圖形文件(:vlr-beginSave)的事件,當(dāng)保存過程結(jié)束時,將會發(fā)生AutoCAD已將當(dāng)前圖形保存到磁盤(:vlr-saveComplete)的事件。設(shè)計基于反應(yīng)器的應(yīng)用程序就是根據(jù)回調(diào)事件的內(nèi)容編寫這些事件發(fā)生時所要激活的函數(shù)。vlr-reaction-names函數(shù)返回與給定反應(yīng)器類型相關(guān)的所有事件組成的表:(vlr-reaction-namesreactor-type)參數(shù)reactor-type是反應(yīng)器類型的標(biāo)識,見表11-1和表11-2。,例如,下列代碼將返回和圖形反應(yīng)器相關(guān)的所有事件組成的表:(vlr-reaction-names:VLR-DWG-Reactor)返回(:VLR-beginDwgOpen:VLR-endDwgOpen:VLR-dwgFileOpened:VLR-databaseConstructed:VLR-databaseToBeDestroyed:VLR-beginSave:VLR-saveComplete:VLR-beginClose)下列代碼將返回和對象反應(yīng)器相關(guān)的所有事件組成的表:(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),加載并運行以下代碼,將會打印出所有相關(guān)反應(yīng)器事件的列表(按反應(yīng)器類型排序)。(defunprint-reactors-and-events()(foreachrtype(vlr-types)(princ(strcatn(vl-princ-to-stringrtype)(foreachrname(vlr-reaction-namesrtype)(princ(strcatnt(vl-princ-to-stringrname)(princ)AutoLISPReference列出了與各種反應(yīng)器類型相關(guān)的所有事件,有關(guān)信息在創(chuàng)建反應(yīng)器的函數(shù)部分做了說明。和ActiveX一樣,必須首先調(diào)用vl-load-com函數(shù),加載支持反應(yīng)器和其它AutoLISP擴展函數(shù)之后,才能實現(xiàn)反應(yīng)器的功能。,11.2定義反應(yīng)器的回調(diào)函數(shù)反應(yīng)器的回調(diào)函數(shù)就是回調(diào)事件發(fā)生時所要執(zhí)行的函數(shù)。反應(yīng)器的回調(diào)函數(shù)是用AutoLISP定義的。編寫回調(diào)函數(shù)有以下一些限制:不能使用command函數(shù)調(diào)用AutoCAD命令,只能用ActiveX函數(shù)訪問圖形對象。不能使用entget和entmod函數(shù)。不能使用選擇集操作函數(shù)。不能使用交互輸入函數(shù)。在事件處理函數(shù)中不要加載警告和信息之外的對話框。定義對象反應(yīng)器回調(diào)函數(shù)和定義其它反應(yīng)器的回調(diào)函數(shù)也不完全相同。,11.2.1定義對象反應(yīng)器的回調(diào)函數(shù)定義對象反應(yīng)器的回調(diào)函數(shù)的格式如下:(defunfunction(notifier-objectreactor-objectparameter-list)參數(shù)notifier-object是事件發(fā)生的對象。參數(shù)reactor-objec是調(diào)用這個函數(shù)的反應(yīng)器對象。參數(shù)parameter-list是回調(diào)事件返回的回調(diào)數(shù)據(jù)表。例如,例11-1定義了名為print-radius的回調(diào)函數(shù)。notifier-object是事件發(fā)生的對象,reactor-object是調(diào)用這個函數(shù)的反應(yīng)器對象,parameter-list是回調(diào)事件返回的回調(diào)數(shù)據(jù)表。雖然在本例并不關(guān)心parameter-list的值,但定義回調(diào)函數(shù)時,也要進行變量聲明。,【例11-1】定義名字為print-radius的回調(diào)函數(shù),該函數(shù)用來打印圓的半徑。(defunprint-radius(notifier-objectreactor-objectparameter-list)(vl-load-com)(cond(vlax-property-available-pnotifier-objectRadius);判斷該圖形對象是否具有radius特性(princ“這個圓的半徑是:)(princ(vla-get-radiusnotifier-object),11.2.2定義其它反應(yīng)器的回調(diào)函數(shù)由于其它反應(yīng)器不需要鏈接到AutoCAD圖元上,因此定義其它反應(yīng)器的回調(diào)函數(shù)只需要以下兩個參數(shù):(defunfunction(reactor-objectparameter-list)參數(shù)reactor-object是調(diào)用這個函數(shù)的反應(yīng)器對象。參數(shù)parameter-list是回調(diào)事件返回的回調(diào)數(shù)據(jù)表。例11-2定義了名為saveDrawingInfo的回調(diào)函數(shù)。參數(shù)calling-reactor是調(diào)用該函數(shù)的反應(yīng)器對象。參數(shù)commandInfo是回調(diào)事件返回的回調(diào)數(shù)據(jù)表。該函數(shù)在發(fā)生保存AutoCAD圖形的事件時將被激活,顯示文件的路徑和大小等信息。,【例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獲取圖形文件的大小,通過警告對話框顯示這些信息。,11.2.3.AutoCAD預(yù)定義的回調(diào)函數(shù)AutoCAD提供了兩個預(yù)定義的回調(diào)函數(shù),可以在測試反應(yīng)器時使用這些函數(shù):(1)vlr-beep-reaction函數(shù)vlr-beep-reaction的功能是讓計算機發(fā)出“嘟嘟”聲。(2)vlr-trace-reaction函數(shù)vlr-trace-reaction函數(shù)的功能是將參數(shù)列表打印到VLISP的“跟蹤”窗口。,11.3創(chuàng)建反應(yīng)器創(chuàng)建反應(yīng)器的主要工作就是將事件和回調(diào)函數(shù)相關(guān)聯(lián)。創(chuàng)建反應(yīng)器用vlr-reactor函數(shù)。每種類型的反應(yīng)器都有一個與之對應(yīng)的用于創(chuàng)建該反應(yīng)器的AutoLISP函數(shù),這些函數(shù)的名稱和反應(yīng)器類型的名稱相同,只是沒有前面的冒號。例如,vlr-acdb-reactor為創(chuàng)建數(shù)據(jù)庫反應(yīng)器函數(shù),vlr-toolbar-reactor為創(chuàng)建工具欄反應(yīng)器函數(shù)。所有創(chuàng)建反應(yīng)器的構(gòu)造函數(shù)都返回一個反應(yīng)器對象。AutoLISPReference列出了與每種反應(yīng)器類型相關(guān)的所有可能事件。例如,通過vlr-DWG-reactor條目,可看到表11-3所示與DWG反應(yīng)器相關(guān)的所有可能事件。,表11-3DWG反應(yīng)器事件,事件名稱說明:vlr-beginClose圖形數(shù)據(jù)庫將被關(guān)閉。:vlr-databaseConstructed已經(jīng)構(gòu)建圖形數(shù)據(jù)庫。:vlr-databaseToBeDestroyed將從內(nèi)存中刪除圖形數(shù)據(jù)庫的內(nèi)容。:vlr-beginDwgOpenAutoCAD將打開圖形文件。:vlr-endDwgOpenAutoCAD已結(jié)束打開操作。:vlr-dwgFileOpened新圖形已被加載到AutoCAD圖形窗口。:vlr-beginSaveAutoCAD將保存圖形文件。:vlr-saveCompleteAutoCAD已將當(dāng)前圖形保存到磁盤。,11.3.1創(chuàng)建對象反應(yīng)器因為對象反應(yīng)器必須鏈接到特定的AutoCAD圖元(對象)上,所以在定義對象反應(yīng)器時,必須指定反應(yīng)器所要鏈接的圖元。創(chuàng)建對象反應(yīng)器通過函數(shù)vlr-object-reactor,該函數(shù)的調(diào)用格式如下:(vlr-object-reactorownersdatacallbacks)參數(shù)owners為VLA對象表,表內(nèi)可以是多個VLA對象。這些對象也被稱為反應(yīng)器的所有者。參數(shù)data為與反應(yīng)器對象相關(guān)聯(lián)的數(shù)據(jù),如果沒有數(shù)據(jù)則該項為nil。參數(shù)callbacks為點對表,用于指明事件和與該事件相關(guān)聯(lián)的回調(diào)函數(shù)。點對表的格式如下:(event-name.callback_function)該點對表的event-name是表11-4所示Object事件中的名稱標(biāo)識,callback_function為回調(diào)函數(shù)。表11-5是針表11-4所示對特定的回調(diào)事件返回的回調(diào)數(shù)據(jù)表。該函數(shù)的返回值為reactor_object(對象反應(yīng)器)。,名稱標(biāo)識事件:vlr-cancelled對對象的修改已經(jīng)取消。:vlr-copied對象已被復(fù)制。:vlr-erased對象的刪除標(biāo)志已被設(shè)置。:vlr-unerased對象的刪除標(biāo)志已被重置。: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事件及其名稱標(biāo)識,名稱表長度參數(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由復(fù)制操作創(chuàng)建的對象(ename)。:vlr-subObjModified1已被修改的子對象(ename)。,表11-5Object事件回調(diào)數(shù)據(jù),例如,下面的代碼創(chuàng)建了一個對象反應(yīng)器。該對象反應(yīng)器只有一個所有者,即VLA對象myCircle;與該反應(yīng)器對象相關(guān)聯(lián)的數(shù)據(jù)為CircleReactor;點對表為(:vlr-modified.print-radius),當(dāng)發(fā)生myCircle對象被修改(即:vlr-modified)事件時,調(diào)用print-radius回調(diào)函數(shù):(setqcircleReactor(vlr-object-reactor(listmyCircle)CircleReactor(:vlr-modified.print-radius)上述反應(yīng)器對象賦給了變量circleReactor??梢酝ㄟ^該變量實現(xiàn)對該反應(yīng)器的查詢、修改或刪除等。,創(chuàng)建對象反應(yīng)器除了必須指定反應(yīng)器所要鏈接的圖元之外,還要注意以下幾點:(1)在定義所有者列表時,只能指定VLA對象,而不允許使用ename對象。要求VLA對象是因為回調(diào)函數(shù)只能用ActiveX方法修改AutoCAD對象,而ActiveX方法要求使用VLA對象。盡管不能在回調(diào)反應(yīng)器中使用由entlast和entget等函數(shù)獲取VLA對象,但可以用vlax-ename-vla-object函數(shù)將ename對象轉(zhuǎn)換成VLA對象。(2)如果對象已被包括在對象反應(yīng)器的所有者列表之中,那么就不能在回調(diào)函數(shù)中修改該對象。如果這樣做,將會導(dǎo)致一個出錯消息,并使AutoCAD崩潰。下面是實現(xiàn)對象反應(yīng)器功能的實例:,(1)加載例11-3所示程序段【例11-3】生成一個圓的VLA對象。(setqmyCircle(progn(setqctrPt(getpointn輸入圓心:)radius(distancectrPt(getpointctrptn輸入半徑:)(vla-addCircle(vla-get-ModelSpace;將圓加入到圖形模型空間(vla-get-ActiveDocument(vlax-get-acad-object)(vlax-3d-pointctrPt)radius)該代碼使用vla-addCircle畫一個圓,將返回值賦給變量myCircle。該返回值是VLA對象,包含指向所畫圓對象的指針。,(2)加載例11-1所示回調(diào)函數(shù)print-radius。(3)定義對象反應(yīng)器(setqcircleReactor(vlr-object-reactor(listmyCircle)CircleReactor(:vlr-modified.print-radius)(4)在AutoCAD圖形窗口,選取該圓并修改其大小,print-radius函數(shù)將在AutoCAD命令窗口顯示一個消息。例如,如果用夾點或STRETCH命令改變了該圓的大小,將在命令提示區(qū)顯示以下信息:*STRETCH*SpecifystretchpointorBasepoint/Copy/Undo/eXit:這個圓的半徑是:190.0如果用夾點或STRETCH命令改變其他圓時的大小,將沒有該提示信息中的“這個圓的半徑是:”,這是因為在其他的圓上沒有鏈接circleReactor反應(yīng)器。,11.3.2創(chuàng)建其它反應(yīng)器其它反應(yīng)器不需要鏈接AutoCAD圖元,所以在定義時,只需要兩個參數(shù)。創(chuàng)建其它反應(yīng)器通過函數(shù)vlr-reactor,該函數(shù)的調(diào)用格式如下:(vlr-reactordatacallbacks)參數(shù)data為任意要與反應(yīng)器對象關(guān)聯(lián)的數(shù)據(jù),如果沒有數(shù)據(jù)則該項為nil。參數(shù)callbacks為點對表,指明事件和與該事件相關(guān)聯(lián)的回調(diào)函數(shù),點對表的格式如下:(event-name.callback_function)例如,下列代碼定義了一個DWG編輯器反應(yīng)器。當(dāng)用戶發(fā)出Save命令時,該反應(yīng)器將激活saveDrawingInfo函數(shù)。(vlr-dwg-Reactornil(:vlr-saveComplete.saveDrawingInfo)在該例中,第一個參數(shù)為nil是因為沒有與反應(yīng)器相關(guān)聯(lián)的數(shù)據(jù);第二個參數(shù)是點對表,指明:vlr-saveComplete事件與saveDrawingInfo回調(diào)函數(shù)相關(guān)聯(lián)。當(dāng):vlr-saveComplete事件發(fā)生時,AutoCAD傳遞給回調(diào)函數(shù)一個圖形文件名字的字符串。,每個點對表都指定了反應(yīng)器要通報的事件,以及該事件發(fā)生時要調(diào)用的回調(diào)函數(shù)。在本例中,只指定了一個事件:vlr-saveComplete。只要用戶發(fā)出命令,不管是從AutoCAD命令行、菜單、工具欄或AutoLISP程序,都會通知編輯器反應(yīng)器。所以,該DWG反應(yīng)器的回調(diào)函數(shù)需要明確它應(yīng)對什么事件作出響應(yīng)。在本例中,回調(diào)函數(shù)saveDrawingInfo只是檢查Save命令。下面是實現(xiàn)DWG反應(yīng)器功能的實例:(1)加載例11-2所定義的回調(diào)函數(shù)saveDrawingInfo。(2)定義DWG反應(yīng)器(vlr-dwg-Reactornil(:vlr-saveComplete.saveDrawingInfo)(3)在AutoCAD圖形窗口點取存盤的圖標(biāo)或調(diào)用存圖的命令。當(dāng)完成存圖工作時將會彈出圖11-1所示的AutoCADMessage對話框。說明該實例成功。,圖11-1AutoCAD的Message對話框,11.3.3將數(shù)據(jù)附著到反應(yīng)器對象利用創(chuàng)建反應(yīng)器函數(shù)的參數(shù)data可以為反應(yīng)器指定與其關(guān)聯(lián)的數(shù)據(jù),如果該項為nil,表示不需要為反應(yīng)器指定與其關(guān)聯(lián)的數(shù)據(jù)。一個對象可能鏈接多個反應(yīng)器,如果它們的參數(shù)data都為nil,應(yīng)用程序?qū)o法區(qū)分它們。在這種情況下就應(yīng)該為反應(yīng)器指定文本字符串或應(yīng)用程序能識別的其它數(shù)據(jù)。例如,前面創(chuàng)建對象反應(yīng)器circleReactor的實例中,字符串“CircleReactor”就是與反應(yīng)器circleReactor相關(guān)聯(lián)的數(shù)據(jù)。11.4查詢、修改和控制反應(yīng)器的狀態(tài)11.4.1查詢反應(yīng)器有多種不同的方法來獲取反應(yīng)器的信息。可以使用標(biāo)準(zhǔn)的VLISP數(shù)據(jù)查看工具查看反應(yīng)器的信息,也可以用有關(guān)反應(yīng)器的AutoLISP函數(shù)。,1.了解圖形中有關(guān)反應(yīng)器的總體情況通過vlr-reactors函數(shù)可以了解當(dāng)前圖形中總共用到了哪些反應(yīng)器或有哪些指定類型的反應(yīng)器。vlr-reactors函數(shù)的調(diào)用格式如下:(vlr-reactorsreactor-type.)參數(shù)reactor-type為反應(yīng)器類型的標(biāo)識符。如果指定了reactor-type參數(shù),該函數(shù)返回由指定類型反應(yīng)器組成的表。如果省略參數(shù)reactor-type,該函數(shù)返回所有當(dāng)前圖形所有的反應(yīng)器。以下表達式列出圖形中的所有反應(yīng)器:(vlr-reactors);返回(:VLR-Object-Reactor#)(:VLR-Editor-Reactor#),有一個對象反應(yīng)器和一個編輯器反應(yīng)器。,以下表達式列出所有的對象反應(yīng)器:(vlr-reactors:vlr-object-reactor);返回(:VLR-Object-Reactor#),有一個對象反應(yīng)器以下表達式列出所有數(shù)據(jù)庫反應(yīng)器:(vlr-reactors:vlr-acdb-reactor);返回nil,沒有數(shù)據(jù)庫反應(yīng)器以下表達式列出所有DWG反應(yīng)器:(vlr-reactors:vlr-dwg-reactor);返回(:VLR-DWG-Reactor#),有一個DWG反應(yīng)器,有兩個指向該DWG反應(yīng)器的指針。,2.用VLISP的檢驗工具檢查反應(yīng)器可以使用VLISP的檢驗工具檢查反應(yīng)器。在VLISP編輯器窗口選擇circleReactor,單擊按鈕,將彈出圖11-2所示檢驗窗口,該窗口顯示以下信息:,圖11-2有關(guān)反應(yīng)器的檢驗窗口,l反應(yīng)器的類型標(biāo)識符,如VLR-Object-Reactorl該反應(yīng)器的所有者,如l事件和與之相關(guān)聯(lián)的回調(diào)函數(shù),如:VLR-modifiedPRINT-RADIUSl該反應(yīng)器是否是活動的:如果是活動的,added-p為T,否則它為nill附著到反應(yīng)器上的用戶數(shù)據(jù),如“CircleReactor”l反應(yīng)器的文檔范圍:如active-document-onlyl該反應(yīng)器所在文擋:如雙擊以O(shè)wners開頭的條目,可查看反應(yīng)器所有者的列表。,3.用函數(shù)調(diào)用、查詢反應(yīng)器VLISP還提供了可在應(yīng)用程序或控制臺提示處查看反應(yīng)器定義的函數(shù):(1)vlr-type函數(shù)返回指定反應(yīng)器的類型,例如:(vlr-typecircleReactor);返回:VLR-Object-Reactor(對象反應(yīng)器)(2)vlr-current-reaction-name函數(shù)返回當(dāng)前反應(yīng)器觸發(fā)回調(diào)函數(shù)的事件名稱。例如:(vlr-current-reaction-name);返回nil(3)vlr-data返回附著到反應(yīng)器的特定應(yīng)用程序數(shù)據(jù),可用該數(shù)據(jù)區(qū)分鏈接在同一個對象上的多個反應(yīng)器。例如:(vlr-datacircleReactor);返回CircleReactor“(4)vlr-owners函數(shù)返回向某對象反應(yīng)器發(fā)出通報的AutoCAD圖形中的對象(反應(yīng)器所有者)列表,下述函數(shù)調(diào)用將列出circleReactor的所有者:(vlr-ownerscircleReactor);返回(#)(5)vlr-reactions函數(shù)返回指定反應(yīng)器的回調(diào)條件回調(diào)函數(shù)列表,下例將返回circleReactor的相關(guān)信息。例如:(vlr-reactionscircleReactor);返回(:VLR-modified.PRINT-RADIUS),11.4.2修改反應(yīng)器1添加或替換反應(yīng)器的回調(diào)函數(shù)通過函數(shù)vlr-reaction-set可以添加或替換反應(yīng)器中的一個回調(diào)函數(shù)。該函數(shù)的調(diào)用格式如下:(vlr-reaction-setreactoreventfunction)參數(shù)reactor為反應(yīng)器對象。event為符號,表示該反應(yīng)器類型可用的事件之一。Function為要添加或替換的AutoLISP函數(shù)名。返回值未確定。例如,下面的命令使反應(yīng)器circleReactor在修改對象時調(diào)用print-area函數(shù):(vlr-reaction-setcircleReactor:vlr-modifiedprint-area);返回PRINT-AREA,2.修改與反應(yīng)器相關(guān)聯(lián)的數(shù)據(jù)通過函數(shù)vlr-data-set可以修改與反應(yīng)器相關(guān)聯(lián)的數(shù)據(jù)。該函數(shù)的調(diào)用格式如下:(vlr-data-setobjdata)參數(shù)obj為反應(yīng)器對象,表示要修改數(shù)據(jù)的反應(yīng)器對象。data為新數(shù)據(jù)。返回值為參數(shù)data。例如,查看附著到反應(yīng)器circleReactor的數(shù)據(jù)值:(vlr-datacircleReactor)返回CircleReactor用字符串CircleAreaReactor替換反應(yīng)器circleReactor的原有數(shù)據(jù)CircleReactor:(vlr-data-setcircleReactorCircleAreaReactor);返回CircleAreaReactor驗證是否有了改變:(vlr-datacircleReactor);返回CircleAreaReactor注意,應(yīng)小心使用vlr-data-set函數(shù),以免構(gòu)成循環(huán)結(jié)構(gòu)。,3.將一個數(shù)據(jù)庫對象添加到反應(yīng)器的所有者列表內(nèi)通過函數(shù)vlr-owner-add可以將一個數(shù)據(jù)庫對象添加到指定反應(yīng)器的所有者列表內(nèi)。該函數(shù)的調(diào)用格式如下:(vlr-owner-addreactorowner)參數(shù)reactor為反應(yīng)器對象。owner為要添加到反應(yīng)器所有者列表中的VLA對象。返回值為已添加了反應(yīng)器的VLA對象。例如,在下例中,名為archie的圓弧對象被添加到反應(yīng)器circleReactor的所有者列表中:(vlr-owner-addcircleReactorarchie);返回#可通過檢驗該反應(yīng)器來驗證這點:更新反應(yīng)器circleReactor的檢驗窗口,用鼠標(biāo)雙擊檢驗窗口的Owners開頭的條目,將彈出圖113所示的反應(yīng)器所有者檢驗窗口。,圖113反應(yīng)器所有者的檢驗窗口,4.從反應(yīng)器所有者列表中刪除某所有者對象通過函數(shù)vlr-owner-remove可以從反應(yīng)器所有者列表中刪除某所有者對象。該函數(shù)的調(diào)用格式如下:(vlr-owner-removereactorowner)參數(shù)reactor為反應(yīng)器對象。owner為要從反應(yīng)器所有者列表中刪除的VLA對象。返回值為被刪除的VLA對象。例如:(vlr-owner-removecircleReactorarchie);返回#,11.4.3控制反應(yīng)器的狀態(tài)1.判斷反應(yīng)器是否是活動的通過函數(shù)vlr-added-p可以判斷反應(yīng)器是否是活動的。vlr-added-p函數(shù)的調(diào)用格式如下:(vlr-added-pobj)參數(shù)obj為反應(yīng)器對象,表示要測試的反應(yīng)器。如果反應(yīng)器是活動的(已在AutoCAD中注冊),返回T,如果該反應(yīng)器失效,則返回nil。例如:(vlr-added-pcircleReactor);返回T,表示該反應(yīng)器是活動的,2.使反應(yīng)器失效通過函數(shù)vlr-remove可以使指定的反應(yīng)器失效。vlr-remove函數(shù)的調(diào)用格式如下:(vlr-removeobj)參數(shù)obj為反應(yīng)器對象。如果成功,返回反應(yīng)器對象,否則,返回nil。例如,使反應(yīng)器circleReactor失效:(vlr-removecircleReactor);返回#注意,失效的反應(yīng)器,并沒有從內(nèi)存中被刪除,該反應(yīng)器仍然存在。,2.恢復(fù)失效的反應(yīng)器通過函數(shù)vlr-add可以恢復(fù)指定的失效反應(yīng)器,使之成為活動的(在AutoCAD中注冊)。vlr-add函數(shù)的調(diào)用格式如下:(vlr-addobj)參數(shù)obj為反應(yīng)器對象,表示要恢復(fù)的失效反應(yīng)器。如果成功,返回反應(yīng)器對象,否則,返回nil。例如,恢復(fù)失效的circleReactor反應(yīng)器:(vlr-addcircleReactor);返回#通過函數(shù)vlr-remove-all可以使圖形中所有的反應(yīng)器失效。vlr-remove-all函數(shù)的調(diào)用格式如下:(vlr-remove-allreactor-type),可選參數(shù)reactor-type為反應(yīng)器類型的標(biāo)識符,如果未指定reactor-type,該函數(shù)禁用圖形中所有的反應(yīng)器。返回為包含若干個子表的表,每個子表的第一個元素表示反應(yīng)器的類型,后續(xù)元素表示禁用的反應(yīng)器對象。如果沒有活動的反應(yīng)器,該函數(shù)返回nil。例如,下面的函數(shù)調(diào)用將禁用所有編輯器反應(yīng)器:(vlr-remove-all:vlr-editor-reactor)返回(:VLR-Editor-Reactor#)下面的調(diào)用函數(shù)將禁用所有反應(yīng)器:(vlr-remove-all)返回(:VLR-Object-Reactor#)(:VLR-Editor-Reactor#),11.5臨時反應(yīng)器和永久反應(yīng)器反應(yīng)器可以是臨時的,也可以是永久的。二者的區(qū)別是:下一次打開該圖形時,臨時反應(yīng)器將丟失,永久反應(yīng)器則仍然存在。前者是反應(yīng)器的默認(rèn)模式。1.將臨時反應(yīng)器變成永久反應(yīng)器通過函數(shù)vlr-pers可以將臨時反應(yīng)器變成永久反應(yīng)器。函數(shù)vlr-pers的調(diào)用格式如下:(vlr-persobj)參數(shù)obj為反應(yīng)器對象。如果成功則返回指定的反應(yīng)器對象,否則返回nil。例如:(vlr-perscircleReactor);返回#,2.將永久反應(yīng)器改變?yōu)榕R時反應(yīng)器通過函數(shù)vlr-pers-release可以將永久反應(yīng)器改變?yōu)榕R時反應(yīng)器。函數(shù)vlr-pers的調(diào)用格式如下:(vlr-pers-releaseobj)參數(shù)obj為反應(yīng)器對象。如果成功則返回反應(yīng)器對象,否則返回nil。(vlr-pers-releasecircleReactor);返回#3.判斷反應(yīng)器是否是永久反應(yīng)器通過函數(shù)vlr-pers-p可以判斷反應(yīng)器是否是永久反應(yīng)器。函數(shù)vlr-pers-p的調(diào)用格式如下:(vlr-pers-pobj)參數(shù)obj為反應(yīng)器對象。如果指定反應(yīng)器是永久反應(yīng)器,則返回指定的反應(yīng)器對象,否則返回nil。例如:(vlr-pers-pcircleReactor);返回#,4.列出當(dāng)前圖形文檔中的永久反應(yīng)器通過函數(shù)vlr-pers-list可以列出當(dāng)前圖形文檔中的永久反應(yīng)器。函數(shù)vlr-pers-list的調(diào)用格式如下:(vlr-pers-listreactor-type)參數(shù)reactor-type為要列出的反應(yīng)器對象。如果未指定reactorr-type,該函數(shù)列出所有永久反應(yīng)器。返回值為由反應(yīng)器對象組成的表。例如:(vlr-pers-list);返回(#(#),打開含有永久反應(yīng)器的圖形時的注意事項反應(yīng)器只是鏈接事件和回調(diào)函數(shù)的一種工具,回調(diào)函數(shù)本身不是反應(yīng)器的一部分,它一般也不是圖形的一部分。只有AutoCAD中加載了相關(guān)聯(lián)的回調(diào)函數(shù)時,圖形中保存的反應(yīng)才有實際作用。如果將反應(yīng)器和回調(diào)函數(shù)定義在獨立名稱空VLX中,則在打開圖形時會自動加載回調(diào)函數(shù)。如果打開的圖形包括VLISP反應(yīng)器信息,但沒有加載相關(guān)回調(diào)函數(shù),AutoCAD會顯示一個錯誤信息。可用函數(shù)vlr-pers-list返回圖形文檔中所有永久反應(yīng)器組成的表。,11.6反應(yīng)器的使用規(guī)則由于將來可能修改反應(yīng)器的內(nèi)部實現(xiàn)機制,使用反應(yīng)器時請盡量遵守下述規(guī)則,如果不遵守這些規(guī)則,可能會導(dǎo)致應(yīng)用程序出現(xiàn)不可預(yù)料的結(jié)果。(1)不要依賴于反應(yīng)器通報的順序除了少數(shù)特例之外,建議不要依賴于反應(yīng)器通報的順序。例如,OPEN命令將觸發(fā)BeginCommand、BeginOpen、EndOpen和EndCommand事件。然而,它們發(fā)出的順序可能不是這樣的??梢砸蕾嚨捻樞蛑挥蠦egin事件是在相應(yīng)End事件之前。例如commandWillStart()總是在commandEnded()之前發(fā)生,而beginInsert()總是在endInsert()之前發(fā)生。因為將來可能引入新的事件通報,可能會重新排列現(xiàn)有通報順序,所以依賴于更復(fù)雜的順序,可能會給您的應(yīng)用程序帶來問題。,(2)不要依賴于通報間函數(shù)調(diào)用的順序在通報之間函數(shù)調(diào)用的順序也是不能保證的。例如,當(dāng)收到對象A的通報:vlr-erased時,它僅表示對象A被刪除,如果在收到對象A的通報:vlr-erased之后收到了對象B的通報:vlr-erased,這只是表示對象A和B都已被刪除。并不能保證B是在A后面被刪除。如果應(yīng)用程序依賴于這個層次的關(guān)系,那么應(yīng)用程序在后續(xù)版本的AutoCAD中很可能會崩潰。所以不要依賴于這些順序,而應(yīng)該依賴于用反應(yīng)器來指示系統(tǒng)的狀態(tài)。(3)不要在反應(yīng)器回調(diào)函數(shù)中使用任何需要和用戶交互的函數(shù)在反應(yīng)器回調(diào)函數(shù)中試圖調(diào)用交互函數(shù)會導(dǎo)致嚴(yán)重問題,因為在事件發(fā)生時,AutoCAD可能仍在處理某命令。所以要避免使用要求用戶輸入的函數(shù),如getpoint、entsel和getkword等,也不要使用選擇集操作函數(shù)和command函數(shù)。,(4)在事件處理函數(shù)中不要加載對話框?qū)υ捒蚝陀脩艚换ズ瘮?shù)一樣,也會影響AutoCAD的當(dāng)前操作。但是,消息對話框和警告對話框可認(rèn)為是非交互的,所以可以使用它們。(5)不要更新引發(fā)事件的對象引起對象觸發(fā)回調(diào)函數(shù)的事件可能仍在處理之中,當(dāng)調(diào)用回調(diào)函數(shù)時AutoCAD可能仍在使用該對象。所以,在回調(diào)函數(shù)中不要試圖更新這樣的對象。然而,可以從觸發(fā)事件的對象中讀取信息。例如,假設(shè)有一塊用磚填充的地板,而且將反應(yīng)器鏈接到地板邊界上。如果修改地板的尺寸,反應(yīng)器回調(diào)函數(shù)將自動添加或刪除磚以填充新的地板面積。通過函數(shù)能夠獲取邊界的新面積,但不能去修改邊界本身。,(6)不要在回調(diào)函數(shù)中執(zhí)行能觸發(fā)相同事件的操作如果在反應(yīng)器回調(diào)函數(shù)中執(zhí)行的某操作過程中觸發(fā)了同樣的事件,將會陷入一個無限循環(huán)。例如,如果在BeginOpen事件的回調(diào)函數(shù)中試圖打開一個圖形,AutoCAD將持續(xù)打開更多的圖形,直到打開的圖形數(shù)目達到上限,無法再打開圖形為止。(7)能在發(fā)生同一事件時調(diào)用多個回調(diào)函數(shù)在設(shè)置反應(yīng)器以前要確認(rèn)當(dāng)前沒有設(shè)置該反應(yīng)器,否則可能在發(fā)生同一事件時調(diào)用多個回調(diào)函數(shù)。(8)顯示有模對話框時,不會發(fā)生任何事件所謂有模對話框,是指操作其它窗口之前必須關(guān)閉的話框時。顯示這樣的對話框時,不會發(fā)生任何事件。,11.7定義反應(yīng)器實例1.定義將對象反應(yīng)器鏈接到指定直線的命令。要求:當(dāng)直線被修改時,彈出顯示該直線長度的信息對話框。很明顯,反應(yīng)器的鏈接對象就是指定的直線。觸發(fā)事件是直線被修改,從表11-4可以查找出圖形對象被修改的事件是:vlr-modified。回調(diào)函數(shù)的功能是調(diào)用信息對話框顯示被選直線長度。程序的代碼如下:【例11-4】定義將對象反應(yīng)器鏈接到指定直線的命令。(vl-load-com)(defunc:rct-line(/elrltvrl)(setqel(car(entseln選擇一條鏈接反應(yīng)器的直線:)(setqrlt(list(vlax-ename-vla-objectel);將圖元名轉(zhuǎn)換為VLA對象,;創(chuàng)建對象反應(yī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ù)值轉(zhuǎn)換為字符串(alert(strcat直線的長度是:l);調(diào)用信息對話框),加載以上程序,在Command:提示下輸入rct-line命令,用鼠標(biāo)指定一條直線,該反應(yīng)器就會鏈接到指定的直線上。修改這條直線時,就會出現(xiàn)圖114所示顯示有該直線當(dāng)前長度信息的對話框。,圖114顯示直線當(dāng)前長度信息的對話框,2.定義繪制圖115所示圖形的命令。要求:將對象反應(yīng)器鏈接到圓上,如果圓被修改,兩條直線與圓的相對位置和相對比例不變。,圖115一個圓和兩條直線組成的圖形,根據(jù)題意,反應(yīng)器的鏈接對象是圓。觸發(fā)事件是圓被修改,從表11-4可以查找出圖形對象被修改的事件是:vlr-modified?;卣{(diào)函數(shù)的功能是兩條直線隨之被修改,且修改后與圓的相對位置和相對比例不變。兩條直線是與該反應(yīng)器相關(guān)聯(lián)的對象。,【例11-5】定義將對象反應(yīng)器鏈接到圓上的命令,如果圓被修改,兩條直線與圓的相對位置和相對比例不變。(vl-load-com)(defunc:c1l2(/p0p1p2p3p4rr1eh1eh2l1-l2rltvrl)(setqp0(getpointn輸入圓心:)(setqr(getdistp0n輸入半徑:)(commandcirclep0r)(setqr1(*1.25r)(setqec(entlast)(setqp1(polarp00r1)(setqp2(polarp0(*0.5pi)r1)(setqp3(polarp0pir1),(setqp4(polarp0(*-0.5pi)r1)(commandlinep1p3)(setqeh1(cdr(assoc5(entget(entlast);第一條直線的句柄(commandlinep2p4)(setqeh2(cdr(assoc5(entget(entlast);第二條直線的句柄(setql1-l2(listeh1eh2);兩條直線的句柄表(setqrlt(list(vlax-ename-vla-objectec);圓的圖元名轉(zhuǎn)換為VLA對象(setqvrl(vlr-pers(vlr-object-reactorrltl1-l2(:vlr-modified.c-2l);反應(yīng)器鏈接到圓上,兩條直線的句柄表為關(guān)聯(lián)數(shù)據(jù),當(dāng)發(fā)生修改該圓的事件時,調(diào)用c-2l函數(shù)(princ);靜默退出),;定義c-2l函數(shù)(defunc-2l(notifier-objectreactor-objectparameter-list/ecec_lel1el2ell_1ell_2p0p1p2p3p4p0 xp0yp0z)(setqec(vlax-vla-object-enamenotifier-object);VLA對象的圓轉(zhuǎn)換為圖元名ec_l(entgetec);圓的圖元表p0(cdr(assoc10ec_l);獲取圓心的坐標(biāo)r(*1.25(cdr(assoc40ec_l);獲取圓的半徑之后1.25)(setqel1(handent(car(vlr-datareactor-object);第一條直線的圖元名(setqel2(handent(cadr(vlr-datareactor-object);第二直條線的圖元名,(setqp0 x(carp0);獲取圓心的X坐標(biāo)(setqp0y(cadrp0);獲取圓心的Y坐標(biāo)(setqp0z(caddrp0);獲取圓心的Z坐標(biāo)(setqp1(list(+p0 xr)p0yp0z);修改直線端點的坐標(biāo)(setqp2(listp0 x(+p0yr)p0z);修改直線端點的坐標(biāo)(setqp3(list(-p0 xr)p0yp0z);修改直線端點的坐標(biāo)(setqp4(listp0 x(-p0yr)p0z);修改直線端點的坐標(biāo)(setqell_1(entgetel1);第一條直線的圖元表(setqell_1(subst(vl-list*10p1)(assoc10ell_1)ell_1);直線的新端點替換直線的老端點(setqell_1(subst(vl-list*11p3)(assoc11ell_1)ell_1);直線的新端點替換直線的老端點,(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);更新第二
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 包工包料施工合同
- 土地估價委托合同
- 三農(nóng)產(chǎn)業(yè)發(fā)展規(guī)劃策略方案
- 尾礦庫施工方案
- 公路設(shè)施護欄施工方案
- 店招工程施工方案
- 2025年果蔬罐頭加工項目建議書
- 平頂山古建基礎(chǔ)施工方案
- 《紅樓夢》閱讀題選
- 自然保護區(qū)專項施工方案
- 【消毒供應(yīng)中心護理人員職業(yè)暴露與安全防護探究5200字(論文)】
- 2025年湖南省邵陽市新寧縣初三第一次聯(lián)考綜合試題含答案
- 2024-2025學(xué)年新教材高中地理 第三章 產(chǎn)業(yè)區(qū)位因素 第二節(jié) 工業(yè)區(qū)位因素及其變化(2)教案 新人教版必修2
- 常用焊管規(guī)格表
- 認(rèn)知心理學(xué):認(rèn)知科學(xué)與你的生活
- 中國文學(xué)經(jīng)典導(dǎo)讀智慧樹知到答案2024年華東政法大學(xué)
- DL∕T 1860-2018 自動電壓控制試驗技術(shù)導(dǎo)則
- 中國與澳大利亞雙邊貿(mào)易全景圖(附中澳主要進出口產(chǎn)業(yè)數(shù)據(jù))
- 【課件】+現(xiàn)實與理想-西方古典繪畫+課件高中美術(shù)人美版(2019)美術(shù)鑒賞
- 離婚被告辯護詞格式范文
- 2024年歐洲苯乙烯-馬來酸酐共聚物市場主要企業(yè)市場占有率及排名
評論
0/150
提交評論