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

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

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

l

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

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

l

鏈接反應(yīng)器:當(dāng)加載和卸載ARX應(yīng)用程序時(shí),該反應(yīng)器將通知應(yīng)用程序。

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

反應(yīng)器類型的標(biāo)識(shí)符說(shuō)明:VLR-AcDb-Reactor數(shù)據(jù)庫(kù)反應(yīng)器:VLR-DocManager-Reactor文檔管理反應(yīng)器:VLR-Editor-Reactor通用編輯器反應(yīng)器:VLR-Linker-Reactor鏈接反應(yīng)器:VLR-Object-Reactor對(duì)象反應(yīng)器

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

2021/6/274表11-2編輯類型的各種反應(yīng)器及其標(biāo)識(shí)符

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

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

(vlr-reaction-namesreactor-type)

參數(shù)reactor-type是反應(yīng)器類型的標(biāo)識(shí),見(jiàn)表11-1和表11-2。2021/6/276例如,下列代碼將返回和圖形反應(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)下列代碼將返回和對(duì)象反應(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)2021/6/277

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

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

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

;判斷該圖形對(duì)象是否具有radius特性

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

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

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

AutoCAD提供了兩個(gè)預(yù)定義的回調(diào)函數(shù),可以在測(cè)試反應(yīng)器時(shí)使用這些函數(shù):(1)vlr-beep-reaction函數(shù)vlr-beep-reaction的功能是讓計(jì)算機(jī)發(fā)出“嘟嘟”聲。(2)vlr-trace-reaction函數(shù)vlr-trace-reaction函數(shù)的功能是將參數(shù)列表打印到VLISP的“跟蹤”窗口。2021/6/271411.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)器都有一個(gè)與之對(duì)應(yīng)的用于創(chuàng)建該反應(yīng)器的AutoLISP函數(shù),這些函數(shù)的名稱和反應(yīng)器類型的名稱相同,只是沒(méi)有前面的冒號(hào)。例如,vlr-acdb-reactor為創(chuàng)建數(shù)據(jù)庫(kù)反應(yīng)器函數(shù),vlr-toolbar-reactor為創(chuàng)建工具欄反應(yīng)器函數(shù)。所有創(chuàng)建反應(yīng)器的構(gòu)造函數(shù)都返回一個(gè)反應(yīng)器對(duì)象。

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

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

(vlr-object-reactorownersdatacallbacks)

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

(event-name.callback_function)

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

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

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

2021/6/2718名稱表長(zhǎng)度參數(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)建的對(duì)象(ename)。:vlr-subObjModified1已被修改的子對(duì)象(ename)。表11-5Object事件回調(diào)數(shù)據(jù)

2021/6/2719

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

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

創(chuàng)建對(duì)象反應(yīng)器除了必須指定反應(yīng)器所要鏈接的圖元之外,還要注意以下幾點(diǎn):(1)在定義所有者列表時(shí),只能指定VLA對(duì)象,而不允許使用ename對(duì)象。要求VLA對(duì)象是因?yàn)榛卣{(diào)函數(shù)只能用ActiveX方法修改AutoCAD對(duì)象,而ActiveX方法要求使用VLA對(duì)象。盡管不能在回調(diào)反應(yīng)器中使用由entlast和entget等函數(shù)獲取VLA對(duì)象,但可以用vlax-ename->vla-object函數(shù)將ename對(duì)象轉(zhuǎn)換成VLA對(duì)象。(2)如果對(duì)象已被包括在對(duì)象反應(yīng)器的所有者列表之中,那么就不能在回調(diào)函數(shù)中修改該對(duì)象。如果這樣做,將會(huì)導(dǎo)致一個(gè)出錯(cuò)消息,并使AutoCAD崩潰。下面是實(shí)現(xiàn)對(duì)象反應(yīng)器功能的實(shí)例:2021/6/2721(1)加載例11-3所示程序段【例11-3】生成一個(gè)圓的VLA對(duì)象。(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畫(huà)一個(gè)圓,將返回值賦給變量myCircle。該返回值是VLA對(duì)象,包含指向所畫(huà)圓對(duì)象的指針。2021/6/2722(2)加載例11-1所示回調(diào)函數(shù)print-radius。(3)定義對(duì)象反應(yīng)器(setqcircleReactor(vlr-object-reactor(listmyCircle)"CircleReactor"'((:vlr-modified.print-radius))))(4)在AutoCAD圖形窗口,選取該圓并修改其大小,print-radius函數(shù)將在AutoCAD命令窗口顯示一個(gè)消息。例如,如果用夾點(diǎn)或STRETCH命令改變了該圓的大小,將在命令提示區(qū)顯示以下信息:**STRETCH**Specifystretchpointor[Basepoint/Copy/Undo/eXit]:這個(gè)圓的半徑是:190.0

如果用夾點(diǎn)或STRETCH命令改變其他圓時(shí)的大小,將沒(méi)有該提示信息中的“這個(gè)圓的半徑是:”,這是因?yàn)樵谄渌膱A上沒(méi)有鏈接circleReactor反應(yīng)器。2021/6/272311.3.2創(chuàng)建其它反應(yīng)器其它反應(yīng)器不需要鏈接AutoCAD圖元,所以在定義時(shí),只需要兩個(gè)參數(shù)。創(chuàng)建其它反應(yīng)器通過(guò)函數(shù)vlr-

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

(vlr-

-reactordatacallbacks)

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

(event-name.callback_function)

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

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

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

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

(2)

定義DWG反應(yīng)器

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

(3)在AutoCAD圖形窗口點(diǎn)取存盤的圖標(biāo)或調(diào)用存圖的命令。當(dāng)完成存圖工作時(shí)將會(huì)彈出圖11-1所示的AutoCADMessage對(duì)話框。說(shuō)明該實(shí)例成功。圖11-1AutoCAD的Message對(duì)話框

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

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

(vlr-reactors)

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

(vlr-reactors:vlr-object-reactor)

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

;返回nil,沒(méi)有數(shù)據(jù)庫(kù)反應(yīng)器以下表達(dá)式列出所有DWG反應(yīng)器:

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

圖11-2有關(guān)反應(yīng)器的檢驗(yàn)窗口

l

反應(yīng)器的類型標(biāo)識(shí)符,如VLR-Object-Reactorl

該反應(yīng)器的所有者,如<VLR-OBJECTIAcadCircle03708534>l

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

該反應(yīng)器是否是活動(dòng)的:如果是活動(dòng)的,added-p為T,否則它為nill

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

反應(yīng)器的文檔范圍:如active-document-onlyl

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

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

(vlr-typecircleReactor)

;返回:VLR-Object-Reactor(對(duì)象反應(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ū)分鏈接在同一個(gè)對(duì)象上的多個(gè)反應(yīng)器。例如:(vlr-datacircleReactor)

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

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

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

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

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

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

(vlr-datacircleReactor)返回"CircleReactor"

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

(vlr-data-setcircleReactor"CircleAreaReactor")

;返回"CircleAreaReactor"

驗(yàn)證是否有了改變:

(vlr-datacircleReactor)

;返回"CircleAreaReactor"

注意,應(yīng)小心使用vlr-data-set函數(shù),以免構(gòu)成循環(huán)結(jié)構(gòu)。

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

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

(vlr-owner-addcircleReactorarchie)

;返回#<vla-OBJECTIAcadArc03ad0bcc>

可通過(guò)檢驗(yàn)該反應(yīng)器來(lái)驗(yàn)證這點(diǎn):更新反應(yīng)器circleReactor的檢驗(yàn)窗口,用鼠標(biāo)雙擊檢驗(yàn)窗口的{Owners}開(kāi)頭的條目,將彈出圖11-3所示的反應(yīng)器所有者檢驗(yàn)窗口。

2021/6/2733圖11-3反應(yīng)器所有者的檢驗(yàn)窗口

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

(vlr-owner-removereactorowner)

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

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

(vlr-added-pobj)

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

(vlr-added-pcircleReactor)

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

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

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

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

(vlr-addobj)

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

(vlr-addcircleReactor)

;返回#<VLR-Object-reactor>

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

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

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

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

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

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

(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臨時(shí)反應(yīng)器和永久反應(yīng)器反應(yīng)器可以是臨時(shí)的,也可以是永久的。二者的區(qū)別是:下一次打開(kāi)該圖形時(shí),臨時(shí)反應(yīng)器將丟失,永久反應(yīng)器則仍然存在。前者是反應(yīng)器的默認(rèn)模式。1.將臨時(shí)反應(yīng)器變成永久反應(yīng)器通過(guò)函數(shù)vlr-pers可以將臨時(shí)反應(yīng)器變成永久反應(yīng)器。函數(shù)vlr-pers的調(diào)用格式如下:

(vlr-persobj)

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

(vlr-perscircleReactor)

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

(vlr-pers-releaseobj)

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

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

(vlr-pers-pobj)

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

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

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

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

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

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

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

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

根據(jù)題意,反應(yīng)器的鏈接對(duì)象是圓。觸發(fā)事件是圓被修改,從表11-4可以查找出圖形對(duì)象被修改的事件是:vlr-modified?;卣{(diào)函數(shù)的功能是兩條直線隨之被修改,且修改后與圓的相對(duì)位置和相對(duì)比例不變。兩條直線是與該反應(yīng)器相關(guān)聯(lián)的對(duì)象。2021/6/2750【例11-5】定義將對(duì)象反應(yīng)器鏈接到圓上的命令,如果圓被修改,兩條直線與圓的相對(duì)位置和相對(duì)比例不變。(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)));圓的圖元名轉(zhuǎn)換為VLA對(duì)象

(setqvrl(vlr-pers(vlr-object-reactorrltl1-l2'((:vlr-modified.c-2l)))));反應(yīng)器鏈接到圓上,兩條直線的句柄表為關(guān)聯(lián)數(shù)據(jù),當(dāng)發(fā)生修改該圓的事件時(shí),調(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對(duì)象的圓轉(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))));第二直條線的圖元名2021/6/2753(setqp0x(carp0));獲取圓心的X坐標(biāo)

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

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

(setqp1(list(+p0xr)p0yp0z));修改直線端點(diǎn)的坐標(biāo)

(setqp2(listp0x(+p0yr)p0z));修改直線端點(diǎn)的坐標(biāo)

(setqp3(list(-p0xr)p0yp0z));修改直線端點(diǎn)的坐標(biāo)

(setqp4(listp0x(-p0yr)p0z));修改直線端點(diǎn)的坐標(biāo)

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

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

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

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

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

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

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

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

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論