AutoCAD軟件的二次開(kāi)發(fā).ppt
《AutoCAD軟件的二次開(kāi)發(fā).ppt》由會(huì)員分享,可在線閱讀,更多相關(guān)《AutoCAD軟件的二次開(kāi)發(fā).ppt(55頁(yè)珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
第七章AutoCAD軟件的二次開(kāi)發(fā),VisualLISP簡(jiǎn)介AutoLISP程序設(shè)計(jì)語(yǔ)言,改變AutoCAD工作方式的方法:定制編程AutoLISP/VisualLISPAutoCADVBA(VisualBasicforApplication)ADS(AutoCADDevelopmentSystem)ObjectARX(AutoCADRuntimeeXtension),1.LISP(ListProcessingLanguage):人工智能領(lǐng)域中廣泛采用的一種程序設(shè)計(jì)語(yǔ)言,由于其處理的對(duì)象是符號(hào)表達(dá)式,因此也稱(chēng)為符號(hào)式語(yǔ)言。應(yīng)用領(lǐng)域:人工智能、機(jī)器人、專(zhuān)家系統(tǒng)、博弈、定理證明等。版本:MacLISP、InterLISP、ZetaLISP、CommonLISP,2.AutoLISP:嵌套于AutoCAD內(nèi)部,將LISP語(yǔ)言與AutoCAD有機(jī)結(jié)合的編程語(yǔ)言,用于定制和擴(kuò)展AutoCAD的功能,是AutoCAD二次開(kāi)發(fā)的工具之一。使用AutoLISP可以直接調(diào)用幾乎所有的AutoCAD命令;AutoLISP既具備高級(jí)語(yǔ)言的基本結(jié)構(gòu)和功能,又具有一般高級(jí)語(yǔ)言所沒(méi)有的強(qiáng)大的圖形處理功能。用途:利用AutoLISP進(jìn)行AutoCAD二次開(kāi)發(fā),實(shí)現(xiàn)直接增加和修改AutoCAD命令;擴(kuò)大AutoCAD的圖形編輯功能;建立圖形庫(kù)和數(shù)據(jù)庫(kù)并對(duì)當(dāng)前圖形進(jìn)行直接訪問(wèn)和修改;開(kāi)發(fā)CAD軟件包。,一、AutoLISP簡(jiǎn)介,3.AutoLISP的典型應(yīng)用參數(shù)化繪圖程序設(shè)計(jì)尺寸驅(qū)動(dòng)程序鼠標(biāo)驅(qū)動(dòng)程序驅(qū)動(dòng)利用AutoCAD提供的PDB模板構(gòu)成的DCL(DialogControlLanguage)文件創(chuàng)建自己的對(duì)話框。,4.AutoLISP的特點(diǎn)AutoLISP語(yǔ)言是在普通LISP語(yǔ)言基礎(chǔ)上,擴(kuò)充了許多適用于CAD應(yīng)用的特殊功能而形成的,是一種僅能用解釋方式運(yùn)行于AutoCAD內(nèi)部的解釋型程序設(shè)計(jì)語(yǔ)言。AutoLISP語(yǔ)言中的一切成分都是以函數(shù)形式給出的,沒(méi)有語(yǔ)句概念和其它語(yǔ)法結(jié)構(gòu)。AutoLISP把數(shù)據(jù)和程序統(tǒng)一表達(dá)為表結(jié)構(gòu),因此可以把程序當(dāng)作數(shù)據(jù)來(lái)處理,也可以把數(shù)據(jù)當(dāng)作程序來(lái)執(zhí)行。AutoLISP語(yǔ)言中的程序運(yùn)行過(guò)程就是對(duì)函數(shù)求值得過(guò)程,在函數(shù)求值過(guò)程中實(shí)現(xiàn)函數(shù)功能。AutoLISP語(yǔ)言的主要控制結(jié)構(gòu)采用遞歸方式,程序設(shè)計(jì)簡(jiǎn)單易懂。,一、AutoLISP簡(jiǎn)介,二、AutoLISP的程序結(jié)構(gòu):AutoLISP程序是由一個(gè)或者一系列按照特定順序排列的標(biāo)準(zhǔn)表組成的,程序所實(shí)現(xiàn)的功能就是每個(gè)標(biāo)準(zhǔn)表所實(shí)現(xiàn)功能的總和。,1.標(biāo)準(zhǔn)表:由左右兩個(gè)括號(hào)組成,其功能由括號(hào)內(nèi)的代碼實(shí)現(xiàn);標(biāo)準(zhǔn)表中的第一個(gè)元素均為操作符或者函數(shù)名,其余元素都是相應(yīng)函數(shù)的參數(shù)。標(biāo)準(zhǔn)表格式:(函數(shù)名[][]……[]),標(biāo)準(zhǔn)表示例:(setqx10.0)(setqy10.0)(setqz(+xy))(setqa“HelloWorld!”)(command“l(fā)ine”“0.0”“10,10”“”)(command“circle”“100,100”“50”),注意:標(biāo)準(zhǔn)表中可包含別的表。,2.AutoLISP程序書(shū)寫(xiě)格式的特點(diǎn)AutoLISP程序是由標(biāo)準(zhǔn)表組成的,因此程序中所有的括號(hào)都必須左右匹配;AutoLISP程序閱讀函數(shù)時(shí),按照從左到右的規(guī)則進(jìn)行。操作符(函數(shù)名)必須放在標(biāo)準(zhǔn)表中第一個(gè)元素的位置。標(biāo)準(zhǔn)表中的函數(shù)與參數(shù)、參數(shù)與參數(shù)之間至少要用一個(gè)空格來(lái)分開(kāi)。2個(gè)標(biāo)準(zhǔn)表之間和表內(nèi)的多余空格和回車(chē)都是不需要的,因此一個(gè)表可以占多行,一行內(nèi)也可寫(xiě)多個(gè)表。AutoLISP程序中用“;”作注釋?zhuān)绦驁?zhí)行時(shí)會(huì)自動(dòng)跳過(guò)每一行中分號(hào)以后的部分。注釋可放于程序中的任何地方。AutoLISP程序的擴(kuò)展名為(.lsp),并以ASCII碼文本文件的形式表達(dá),可用文本編輯軟件進(jìn)行編輯。,(setqx10.0)(setqy10.0)(setqz(+xy))(setqa“HelloWorld!”)(command“l(fā)ine”“0.0”“10,10”“”)(command“circle”“100,100”“50”),學(xué)習(xí)AutoLISP的核心是掌握AutoLISP函數(shù),包括AutoCAD自帶的內(nèi)部函數(shù)和由用戶自行定義的外部函數(shù)。,二、AutoLISP的程序結(jié)構(gòu),三、AutoLISP的內(nèi)存分配,1.AutoLISP運(yùn)行時(shí)所需的兩個(gè)內(nèi)存區(qū)域:Heap(堆區(qū)域):存儲(chǔ)所有函數(shù)和變量。程序使用的函數(shù)和表越多,變量名越長(zhǎng),函數(shù)越復(fù)雜,該區(qū)域所占的空間越大。Heap:25000bytesStack(棧區(qū)域):存儲(chǔ)函數(shù)的變量和局部結(jié)構(gòu)。標(biāo)準(zhǔn)表中嵌套的表越多,函數(shù)執(zhí)行的遞歸次數(shù)越多,該區(qū)域所占的空間越大。Stack:20000byets,2.內(nèi)存出錯(cuò)提示信息堆空間用光:Insufficientnodespace。沒(méi)有足夠的內(nèi)存裝載AutoLISP:Insufficiecntmemory-AutoLISPdisabled。,注意:AutoCAD平臺(tái)上運(yùn)行AutoLISP時(shí),用戶不能擴(kuò)展系統(tǒng)的堆或棧空間,四、AutoLISP程序執(zhí)行過(guò)程,在AutoCAD環(huán)境中command命令提示符下輸入AutoLISP程序,回車(chē)直接運(yùn)行,返回結(jié)果立即顯示在文本屏幕上。,例:(setqstring“programmingwithAutoLISPisgreatfun!”),用文本編輯軟件編寫(xiě)AutoLISP程序,再用Load函數(shù)在AutoCAD環(huán)境中裝載并運(yùn)行。,例:1.編寫(xiě)AutoLISP程序代碼,存盤(pán)(d:\MyAutoLISP.lsp)(princ“\nWelcome!)(defunc:welcome()(print“AutoLISPwelcomeyou!”))2.啟動(dòng)AutoCAD,加載AutoLISP應(yīng)用程序在command命令提示符下鍵入:(load“d:/lisp/myautolisp.lsp”)3.運(yùn)行defun定義的函數(shù)在command命令提示行下鍵入:welcome,回車(chē),五、VisualLISP:Autodesk公司為增強(qiáng)AutoLISP程序開(kāi)發(fā)能力而設(shè)計(jì)的軟件工具。,VisualLISP集成開(kāi)發(fā)環(huán)境的組成部分:語(yǔ)法檢查器:可識(shí)別錯(cuò)誤的AutoLISP結(jié)構(gòu)和內(nèi)部函數(shù)調(diào)用中不合適的參數(shù)。文件編譯器:可改善程序的執(zhí)行速度并提供一個(gè)有效的開(kāi)發(fā)平臺(tái)。資源管理器:允許用戶在一個(gè)窗口中一步步地執(zhí)行AutoLISP程序源代碼,并在AutoCAD圖形窗口中顯示代碼執(zhí)行結(jié)果。AutoLISP格式工具:可重新安排程序格式,增強(qiáng)程序可讀性。檢查和觀察工具:可方便地訪問(wèn)變量和表達(dá)式的值,還可瀏覽AutoCAD圖形實(shí)體的各項(xiàng)屬性值。上下文相關(guān)菜單:提供有關(guān)AutoLISP函數(shù)信息以及對(duì)符號(hào)名的搜索。項(xiàng)目管理系統(tǒng):使用戶可以更方便地管理多文件應(yīng)用程序。編譯過(guò)的AutoLISP文件將被封裝為一個(gè)單獨(dú)的模塊。窗口保護(hù)和恢復(fù)功能:使用戶可以保存并再次使用任一VisualLISP情景窗口環(huán)境。智能化的控制臺(tái)窗口:基本功能對(duì)應(yīng)于AutoCAD文本屏幕窗口,同時(shí)提供了一些交互特性。,AutoLISP表達(dá)式和數(shù)據(jù)結(jié)構(gòu)AutoLISP變量基本輸出函數(shù)符號(hào)和函數(shù)控制,一、數(shù)據(jù)類(lèi)型,1.整型:32位帶符號(hào)的整數(shù).范圍:-2147483648~+2147483647(-231~+231-1)。注意:如果輸入的整數(shù)超過(guò)范圍,則AutoLISP將整數(shù)轉(zhuǎn)換為實(shí)數(shù);如果兩個(gè)整數(shù)運(yùn)算結(jié)果超過(guò)這個(gè)范圍,結(jié)果將是無(wú)效的。例:(seta2147483648)輸出:2.14748e+009轉(zhuǎn)換為實(shí)數(shù)(seta(+21474836463)輸出:-2147483647無(wú)效結(jié)果,2.實(shí)型:用雙精度的浮點(diǎn)數(shù)表示,至少有14位有效位數(shù)的精度,可用科學(xué)計(jì)數(shù)法表示。,3.字符串:字符常數(shù),由雙引號(hào)引起來(lái)的字符系列。字符串長(zhǎng)度:不包括雙引號(hào)的字符個(gè)數(shù),最大為100個(gè)字符,超過(guò)部分無(wú)效。任何字符都可以用\nnn的格式表示,\是ASCII碼的前導(dǎo)標(biāo)識(shí)字符,nnn是該字符的ASCII碼。(例:ABCD可表示為\101\102\103\104),注意:其中的字符e、n、r、t都必須是小寫(xiě)。,常用控制字符的表示方法,例:(setqa(getpoint“\n請(qǐng)用鼠標(biāo)指示一個(gè)點(diǎn):”))(setqa(getpoint“\012請(qǐng)用鼠標(biāo)指示一個(gè)點(diǎn):”)),4.表:以“(”開(kāi)始,以配對(duì)的“)”結(jié)束,()里可為空,可有若干元素(簡(jiǎn)單或復(fù)雜),還可是其他的表。表的長(zhǎng)度:表中的元素個(gè)數(shù)。例:(1.01.00.0)(“this”“that”“theother”)(1“ONE”)((ab)c(cd))長(zhǎng)度:3323(+123)(sin(*0.5pi)),長(zhǎng)度:42,用表可以方便地構(gòu)造出復(fù)雜的數(shù)據(jù)結(jié)構(gòu)。,5.選擇集:一個(gè)或多個(gè)圖形對(duì)象的集合,用戶可通過(guò)AutoLISP程序向選擇集添加或者從選擇集中刪除圖形對(duì)象。例:_$(ssget“X”)說(shuō)明:返回一個(gè)包含圖形文件中所有對(duì)象的選擇集。,6.實(shí)體名:為圖形對(duì)象指定的16進(jìn)制的數(shù)字標(biāo)識(shí)。通過(guò)該標(biāo)識(shí),可找到實(shí)體在圖形數(shù)據(jù)庫(kù)中的位置,并可進(jìn)一步對(duì)其進(jìn)行編輯。例:_$(entlast)說(shuō)明:返回最后一個(gè)加入圖形文件的對(duì)象的實(shí)體名,7.VLA:VisualLISP在ActiveX中使用的對(duì)象。AutoCAD的對(duì)象如直線、圖層、視圖、視口等都屬于VLA對(duì)象。,8.文件描述:賦予被打開(kāi)文件的標(biāo)識(shí),類(lèi)似于文件指針。例:_$(setqfile(open“c:\\1.txt”“r”))#,9.符號(hào)與變量:,(1)符號(hào):標(biāo)識(shí),用來(lái)作為變量、函數(shù)的名稱(chēng)。規(guī)定:不能只包含數(shù)字,不能包含:().‘“;,大小寫(xiě)等價(jià)。例:合法符號(hào):A11AB1-d+e非法符號(hào):(a)b’4“5注意:符號(hào)的長(zhǎng)度如果不是十分必要,最好不要超過(guò)6個(gè)字符。,(2)變量的數(shù)據(jù)類(lèi)型:變量被賦予的值得類(lèi)型就是變量本省的類(lèi)型,程序運(yùn)行過(guò)程中,同一變量可被賦予不同類(lèi)型的值,可用type命令了解變量的數(shù)據(jù)類(lèi)型。,(3)變量賦值Setq函數(shù):(setq變量1值1變量2值2……)例:(setqa(+12)),(4)預(yù)定義符號(hào)Nil:如果變量沒(méi)有被賦值,則其值為Nil,注意:Nil不是空串也不是0值。T:邏輯常量True。PAUSE:與command函數(shù)配合使用,用于暫停,等待用戶輸入。PI:圓周率。注意:每個(gè)變量都占用一定的內(nèi)存空間,為節(jié)省存儲(chǔ)空間,可重復(fù)使用變量名,或?qū)⒉辉偈褂玫淖兞抠x予Nil,以便釋放該變量所占用的內(nèi)存空間。如果所定義變量名與預(yù)定義符號(hào)或系統(tǒng)內(nèi)部函數(shù)名稱(chēng)相同,則后面的定義取代前面的定義。,(5)顯示變量的值:在變量名稱(chēng)前加“!”,可在AutoCAD命令提示區(qū)看到變量的值??衫眠@種方法將變量的值直接傳遞給AutoCAD。例:command:(setqa‘(10.010.0))command:lineSpecifyfirstpoint!a,二、表達(dá)式,1.操作符前置表示法:函數(shù)名和操作符號(hào)放在所有操作數(shù)前面。例:(seta(*z(+xy)))說(shuō)明:a=z*(x+y)操作符前置表示法使得運(yùn)算和函數(shù)的調(diào)用形式得到統(tǒng)一。,2.運(yùn)算的優(yōu)先級(jí):函數(shù)之間不存在優(yōu)先的關(guān)系,運(yùn)算的順序僅由表的層次來(lái)決定。最里層的表最先被求值,把求值的結(jié)果返回給外面的層,一直到求出最終的結(jié)果。例:(seta(*z(+xy)))說(shuō)明:a=z*(x+y),3.AutoLISP的求值過(guò)程:函每個(gè)表達(dá)式都返回一個(gè)數(shù)值,供外層表達(dá)式使用。如果沒(méi)有外層表達(dá)式,AutoLISP將這個(gè)值返回給AutoCAD,AutoCAD最多顯示六位小數(shù)。,3.AutoLISP的求值規(guī)則整型數(shù)、實(shí)型數(shù)、字符串、文件指針和函數(shù),以它們本省的值作為求值的結(jié)果;符號(hào)以它們當(dāng)前的約束值作為求值的結(jié)果;表根據(jù)其第一個(gè)元素來(lái)進(jìn)行計(jì)算:如果第一個(gè)元素為函數(shù)名,則表中的剩余元素作為該函數(shù)的變?cè)蝗绻淼牡谝粋€(gè)元素是一個(gè)表,這個(gè)表就假設(shè)為函數(shù)定義,以外層表中剩余的元素作為該函數(shù)的變?cè)M(jìn)行計(jì)算;如果表的第一個(gè)元素是quote函數(shù),就不再對(duì)這樣的表求值,而是直接引用這個(gè)表例:(setqa(quote(1010)))等價(jià)于(setqa’(1010)),三、數(shù)據(jù)存儲(chǔ)結(jié)構(gòu),指針:如果內(nèi)存單元A的內(nèi)容是另一個(gè)內(nèi)存單元B的地址,則A稱(chēng)為指向B的指針。,節(jié)點(diǎn):如果內(nèi)存單元A分為左右兩個(gè)部分,分別存放2個(gè)內(nèi)存單元B、C的地址,則A稱(chēng)為左右2個(gè)指針,具有左右2個(gè)指針的內(nèi)存單元稱(chēng)為節(jié)點(diǎn)。,AotoLISP的內(nèi)存由一系列的節(jié)點(diǎn)組成,每個(gè)節(jié)點(diǎn)長(zhǎng)度為12個(gè)字節(jié),等分為兩部分,作為左右指針,每個(gè)節(jié)點(diǎn)都有它的地址。AutoLISP通過(guò)訪問(wèn)符號(hào)、字符串、表等節(jié)點(diǎn)對(duì)其進(jìn)行存取。,1.符號(hào)的存儲(chǔ)結(jié)構(gòu):一個(gè)符號(hào)至少需要3個(gè)節(jié)點(diǎn)。,,,符號(hào)表,鏈接到符號(hào)表鏈尾,并指向存放符號(hào)名的節(jié)點(diǎn),存放符號(hào)名和符號(hào)值指針的節(jié)點(diǎn),存放符號(hào)值的節(jié)點(diǎn),符號(hào)名超過(guò)6個(gè)字符,需申請(qǐng)存放符號(hào)名的空間,原半個(gè)節(jié)點(diǎn)作為指向符號(hào)名的指針,2.字符串的存儲(chǔ)結(jié)構(gòu):字符串在內(nèi)存中是以連續(xù)空間存儲(chǔ)的。,3.表的存儲(chǔ)結(jié)構(gòu):用一組節(jié)點(diǎn)存儲(chǔ),節(jié)點(diǎn)的右指針指向下一個(gè)元素的地址,最后一個(gè)元素的右指針為空,節(jié)點(diǎn)的左指針指向各自的元素。,4.點(diǎn)對(duì):只有兩個(gè)元素,且兩個(gè)元素都是原子的表。形式:(原子.原子)例:(a.b)(1.2)點(diǎn)對(duì)只用1個(gè)節(jié)點(diǎn)存放指針,節(jié)點(diǎn)的左指針指向第一個(gè)元素,節(jié)點(diǎn)的右指針指向第二個(gè)元素。,點(diǎn)對(duì)可以節(jié)省存儲(chǔ)空間,且可簡(jiǎn)化某些函數(shù)對(duì)表的運(yùn)算,是AutoLISP程序開(kāi)發(fā)中常用的數(shù)據(jù)結(jié)構(gòu)。,四、AutoLISP語(yǔ)言的控制流程,1.AutoLISP的3種基本結(jié)構(gòu):順序結(jié)構(gòu)分支結(jié)構(gòu)循環(huán)結(jié)構(gòu)直到型循環(huán)(給定邏輯條件不滿足時(shí)執(zhí)行循環(huán)體,直到滿足為止)當(dāng)型循環(huán)(當(dāng)給定邏輯條件滿足時(shí)執(zhí)行循環(huán)體,直到不滿足為止),2.AutoLISP的3種控制語(yǔ)句:選擇語(yǔ)句、循環(huán)語(yǔ)句、轉(zhuǎn)移語(yǔ)句,(1)條件語(yǔ)句:If語(yǔ)句和cond語(yǔ)句,If語(yǔ)句的基本形式:(iftestexprthenexpr[elseexpr]),例:Command:(if(=13)“Yes!!”“no.”)Command:(if(=2(+11))“Yes!!”)Command:(if(=2(+34))“Yes!!”),If語(yǔ)句可嵌套使用,cond語(yǔ)句的基本形式:(cond[(testresult…)…]),例:(cond((minuspa)(-a));;;判斷a是否為負(fù)數(shù),如果是,返回-a(ta);;;默認(rèn)情況,用t作為測(cè)試表達(dá)式),求a的絕對(duì)值,例:(cond((=s“Y”)1)((=s“y”)1)((=s“N”)0)((=s“n”)0)(tnil)),判斷字符串s的值,視情況返回0、1、Nil,(2)循環(huán)語(yǔ)句:repeat循環(huán)和while循環(huán),repeat函數(shù)的基本形式:(repeatint[expr…]),例:Command:(setqa10b100)100Command:(repeat4(setqa(+a10)(setqb(+b100))500,While函數(shù)的基本形式:(whiletestexpr[expr…]),例:(setqtest1)while(10為止,期間執(zhí)行循環(huán)體,四、函數(shù)與函數(shù)控制,1.定義AutoLISP函數(shù)defun函數(shù)格式:(defun函數(shù)名([函數(shù)參數(shù)][/變量表…])表達(dá)式…),例:(defunadd10(x)setqx(+10 x))command:(setqx5)command:(add10 x),定義加10的函數(shù),函數(shù)調(diào)用,2.調(diào)用AutoLISP函數(shù)(函數(shù)名[函數(shù)參數(shù)…]),3.調(diào)用AutoCAD命令:command函數(shù)(command“AutoCAD命令”“命令所需的數(shù)據(jù)”),例:(command“l(fā)ine”“10,10”“”“20,20”“”),4.定義AutoCAD命令:defun函數(shù)(defunC:AutoCAD命令名(/局部變量表…)表達(dá)式…),例:(defunc:cir(/p1p2)(setqp1(getpoint“\n請(qǐng)指示圓心:”))(setqp2(getpoint“\n請(qǐng)指示圓上一點(diǎn):”))(setqr(distancep1p2)(command“circle”p1r)),查詢與Command函數(shù)顯示控制幾何工具的使用方法,一、查詢和命令,1.Command函數(shù):將AutoCAD命令送到AutoCAD操作環(huán)境的命令行。格式:(command“AutoCAD命令”“命令所需的數(shù)據(jù)”)說(shuō)明:函數(shù)參數(shù)的類(lèi)型可以是整型、實(shí)型、字符串、點(diǎn)、實(shí)體名或選擇集。如果參數(shù)是類(lèi)似于角度、距離和點(diǎn)的數(shù)據(jù),則可用字符串或者數(shù)據(jù)本身的值作為參數(shù)輸入。,例:(command“circle”“0,0”“3,3”)(command“thickness”1)(setqpt‘(113))(setradius5)(command“circle”ptradius),(1)暫停以等候輸入的預(yù)定義參數(shù):pause,例:(command“circle”“5,5”pause“l(fā)ine”“5,5”“7,5”),注意:暫停等候用戶輸入時(shí),函數(shù)被認(rèn)為是激活的,用戶不能其它的AutoLISP表達(dá)式來(lái)進(jìn)行計(jì)算。,例:(setqblk“MY_BLOCK”)(setqoldlayer(getvar“clayer”)(command“l(fā)ayer”“set”“NEW_LAY”“”)(command“insert”blkpause“”“”pause)(command“l(fā)ayer”“set”oldlayer),(2)將拾取點(diǎn)傳入AutoCAD命令,對(duì)需要用戶指定拾取點(diǎn)和對(duì)象的AutoCAD命令,要將這些點(diǎn)和對(duì)象的組合不使用pause符號(hào)而傳入command函數(shù),則必須將它們保存在變量中,在傳入command函數(shù)(其中點(diǎn)可作為字符串傳入command函數(shù))。,例:(command“circle”“5,5”“2”)(command“l(fā)ine”“3,5”“7,5”)(setqe1(entlast))(setqpoint‘(57))(command“trim”e1“”point“”),(3)對(duì)command函數(shù)的undo操作,如果想將幾條command函數(shù)作為一組命令全部撤銷(xiāo),則必須使用undobegin和undoend選項(xiàng)。,例:(command"undo""be")(command“circle”“5,5”“2”)(command“l(fā)ine”“3,5”“7,5”“”)(setqe1(entlast))(setqpoint‘(57))(command“trim”e1“”point“”)(command"undo"“end"),2.系統(tǒng)和環(huán)境變量的查詢和設(shè)置查詢函數(shù):(getvar“AutoCAD系統(tǒng)變量名”)說(shuō)明:獲得AutoCAD系統(tǒng)變量的值。設(shè)置函數(shù):(setvar“AutoCAD系統(tǒng)變量名”系統(tǒng)變量值)說(shuō)明:設(shè)置AutoCAD系統(tǒng)變量值。,AutoCAD系統(tǒng)變量值的類(lèi)型:整數(shù)、實(shí)數(shù)、字符串、二維點(diǎn)、三維點(diǎn)。,例:(if(<(getvar“filletrad”)1)(setvar“filletrad”1)),例:(if(<(getvar“isolines”)8)(setvar“isolines”8)),二、顯示控制,2.菜單查詢和控制函數(shù):menucmd格式:(menucmdstring)說(shuō)明:控制圖形窗口的菜單顯示,包括顯示、修改和查詢當(dāng)前的子菜單。,指定菜單區(qū)域或菜單項(xiàng),指定在菜單區(qū)域或菜單項(xiàng)上執(zhí)行的操作,例:(setqs(menucmd"P11.3=?"));;;Getsthestatusofthemenuitem(if(=s“”);;;Ifthestatusisanemptystring,(menucmd"P11.3=~");;;disablethemenuitem),1.文本輸出函數(shù):prompt、princ、print,3.控制圖形和文本窗口的函數(shù)graphscr函數(shù):顯示圖形窗口。textscr函數(shù):顯示文本窗口。,格式:(redraw[ename[mode]])參數(shù):ename——實(shí)體名;mode——顯示模式,例:(redraw(entlast)3),redraw函數(shù):圖形對(duì)象重繪函數(shù)。,顯示模式參數(shù):重繪實(shí)體:1消隱實(shí)體:2亮顯實(shí)體:3不亮顯實(shí)體:4,三、獲取用戶輸入,例:(setqp(00))(getcornerp"inputacorner:"),例:(initget1"YesNo")(setqx(getkword"Areyousure?(YesorNo)"))(if(="Yes"x)(princ"\nUserpressYes")(princ"\nUserpressno")),例:(initget6)(setqr(getreal"輸入半徑")(command"circle""0,0"r),例:(getpoint(00)"inputotherpt"),四、幾何工具,1.angle函數(shù):計(jì)算直線與x軸的夾角(弧度)。,2.distance函數(shù):計(jì)算2點(diǎn)間的距離。,3.polar函數(shù):依靠極坐標(biāo)獲得1個(gè)點(diǎn)。,4.insert函數(shù):計(jì)算2條直線的交點(diǎn)。,例:(setqpt1(3.06.00.0))(setqpt2(5.02.00.0))(setqbase(1.07.00.0))(setqrads(anglept1pt2))(setqlen(distancept1pt2))(setqendpt(polarbaseradslen)),5.osnap函數(shù):對(duì)象捕捉函數(shù)。,例:(setqpt2(osnappt1“midp”),捕捉靠近pt1對(duì)象的中點(diǎn),例:(setqpt2(osnappt1"_end,_int")),捕捉靠近pt1對(duì)象的端點(diǎn)或交點(diǎn),6.aperture系統(tǒng)變量確定在使用對(duì)象捕捉時(shí),選擇點(diǎn)與對(duì)象允許的接近程度。,五、數(shù)據(jù)轉(zhuǎn)換,1.rots函數(shù):將實(shí)數(shù)轉(zhuǎn)換為字符串。,實(shí)數(shù)的單位由lunits系統(tǒng)變量控制實(shí)數(shù)的精度由luprec系統(tǒng)變量控制結(jié)果字符中如何顯示前面和后面的0由尺寸變量dimzin控制,例:(setqx17.5)(setqstr"\nValueformattedas")(setqfmtval(rtosx14));模式1表示科學(xué)計(jì)數(shù)法(princ(strcatstrfmtval))(setqfmtval(rtosx24));模式2表示10進(jìn)制表示(princ(strcatstrfmtval))(setqfmtval(rtosx34));模式3表示工程表示(princ(strcatstrfmtval))(setqfmtval(rtosx44));模式4表示建筑表示(princ(strcatstrfmtval))(setqfmtval(rtosx54));模式5表示分?jǐn)?shù)表示(princ(strcatstrfmtval)),格式:(rtosnumber[mode[precision]]),2.Distof函數(shù):將字符串轉(zhuǎn)換為實(shí)數(shù)。,格式:(Distofstring[mode]),例:(distof"1.7500E+01"1);模式1表示科學(xué)計(jì)數(shù)法1.7500E+01(distof"17.50"2);模式2表示10進(jìn)制表示17.50(distof"1‘-5.50\""3);模式3表示工程表示1-5.5"(distof"1‘-51/2\""4);模式4表示建筑表示1-51/2"(distof"171/2"5);模式5表示分?jǐn)?shù)表示,注意反斜杠\的作用,3.angtos函數(shù):將角度轉(zhuǎn)換為字符串。,例:(setqang3.14159str2"\nAngleformattedas")(setqfmtval(angtosang00));模式0表示角度(princ(strcatstr2fmtval))(setqfmtval(angtosang14));模式1表示度/分/秒形式表示角度(princ(strcatstr2fmtval))(setqfmtval(angtosang24));模式2表示梯度表示法(princ(strcatstr2fmtval))(setqfmtval(angtosang34));模式3表示弧度(princ(strcatstr2fmtval))(setqfmtval(angtosang42));模式4表示測(cè)量員表示方式(princ(strcatstr2fmtval)),格式:(angtosangle[unit[precision]]),4.angtof函數(shù):將字符串轉(zhuǎn)換為角度。,格式:(angtofstring[units]),例:(setqa(angtof"180"0));模式0角度表示法(setqb(angtof"180d00\""1));模式1表示度分秒表示法(setqc(angtof"200.0000g"2));模式2表示梯度表示法(setqd(angtof"3.14159r"3));模式3表示弧度表示法(setqe(angtof"W"4));模式4表示測(cè)量員表示法,都返回3.14159,例:將角度值從弧度轉(zhuǎn)換為角度:先用angtos函數(shù)獲得角度的字符串,然后用atof函數(shù)將字符串轉(zhuǎn)換為實(shí)數(shù)。(setqpoint1(11)point2(12))(setqrad(anglepoint1point2))(setqdegree(atof(angtosrad02))),六、坐標(biāo)系轉(zhuǎn)換,(transptfromto[disp]),說(shuō)明:pt:Alistofthreerealsthatcanbeinterpretedaseithera3Dpointora3Ddisplacement(vector).,from:Anintegercode,entityname,or3Dextrusionvectoridentifyingthecoordinatesysteminwhichptisexpressed.Theintegercodecanbeoneofthefollowing:0World(WCS)1User(currentUCS)2Ifusedwithcode0or1,thisindicatestheDisplayCoordinateSystem(DCS)ofthecurrentviewport.Whenusedwithcode3,itindicatestheDCSofthecurrentmodelspaceviewport.3PaperspaceDCS(usedonlywithcode2),to:Anintegercode,entityname,or3Dextrusionvectoridentifyingthecoordinatesystemofthereturnedpoint.Seethefromargumentforalistofvalidintegercodes.,例:用getpoint函數(shù)獲取點(diǎn)后,將該點(diǎn)轉(zhuǎn)換為世界坐標(biāo)系下的點(diǎn)。(setqpnt(getpoint“輸入點(diǎn):”))(transpnt10),一、DCL文件結(jié)構(gòu),二、DCL語(yǔ)法,1.定義控件,格式:name:item1[:item2:item3…]{attribute=value;…},說(shuō)明:每個(gè)item都是預(yù)先定義的控件。新定義的控件繼承了所有控件(item1…)的屬性;大括號(hào)的屬性定義補(bǔ)充或替換繼承的定義;如果多個(gè)item指定相同的屬性,則使用第1個(gè)遇到的屬性;,2.引用控件,格式:name;,或:name{attribute=value;…},例:spacer;ok_cancel;,3.屬性和屬性值,格式:attribute=value;,attribute:屬性value:屬性值;:賦值語(yǔ)句結(jié)束標(biāo)志,4.注釋?zhuān)篋CL文件中前帶//的語(yǔ)句是注釋?zhuān)?/到行尾的內(nèi)容被忽略。也可使用/*注釋文字*/的整段注釋,三、控件及其屬性,1.加框列(boxed_column)和加框行(boxed_row)屬性:標(biāo)題,如果標(biāo)題為空,加框列和行內(nèi)的控件將被無(wú)標(biāo)題的線包圍。,例::boxed_column{label=“Insulation:”;……},2.加框單選列(boxed_radio_column)和加框行(boxed_radio_row)屬性:標(biāo)題。值:用雙引號(hào)括起來(lái)的表示單選按鈕關(guān)鍵字的字符串,其值為1。,3.button屬性:label、is_default、is_cancel。說(shuō)明:如果設(shè)置為true,則用戶按回車(chē)鍵的結(jié)果與點(diǎn)擊該按鈕一樣;如果設(shè)置為true,則用戶按Esc鍵的響應(yīng)與點(diǎn)擊該按鈕一樣。,4.Edit_box屬性:label、edit_width、edit_limit、value、allow_accept。說(shuō)明:edit_width是以字符為單位的edit_box控件之寬度;edit_limit是規(guī)定用戶能夠在edit_box控件中輸入的字符數(shù);value屬性值為用引號(hào)括起來(lái)的字符,對(duì)話框可見(jiàn)時(shí)出現(xiàn)在edit_box中;allow_accept設(shè)置為true時(shí),用戶按回車(chē)鍵,相當(dāng)于鼠標(biāo)選擇edit_box。,5.image_button屬性:color、aspect_ratio。說(shuō)明:color是背景色,0~7或black、red、yellow、green、cyan、blue、magenta、white;aspect_ratio是圖像控件的寬和高之比。,例::edit_box{key=“l(fā)yr_ebox”;value=“0”;edit_width=31;edit_limit=31;},例::image{key=“mfsld”;color=0;aspect_ratio=0.7;},6.list_box屬性:label、multiple_select、list、tabs、value、aspect_ratio。說(shuō)明:multiple_select設(shè)置為true時(shí),允許用戶在list_box中選擇多行文字;list屬性規(guī)定列表框中顯示文本的初始設(shè)置,每行文字用轉(zhuǎn)義字符\n分開(kāi),字符串中可包含制表符,允許特殊的字符串格式化;tab屬性是一個(gè)包含數(shù)值的字符串,規(guī)定list_box中的制表位置;value屬性是引號(hào)括起來(lái)的字符串,包含整數(shù),以規(guī)定哪一行在初始化中被選中。,例::list_box{key=“vpdes”;value=“”;width=60;height=10;tab=“51726”},6.popup_list屬性:label、edit_width、list、tabs、value。,7.radio_button屬性:label、value。說(shuō)明:value為引號(hào)括起來(lái)的整數(shù),“0”或“1”,“1”表示單選按鈕被選中。,8.toggle_button屬性:label、value。說(shuō)明:value為引號(hào)括起來(lái)的整數(shù),“0”或“1”,“1”表示復(fù)選按鈕被選中。,四、布局和尺寸屬性,width(寬度)height(高度)alignment(對(duì)齊)children_alignment(子控件對(duì)齊)fixed_width(固定寬度)fixed_height(固定高度)children_fixed_width(子控件固定寬度)children_fixed_height(子控件固定高度),四、布局和尺寸屬性,五、功能屬性,Is_enabled:true或false,指定控件是否可選。Is_tab_stop:按Tab鍵可逐個(gè)通過(guò)對(duì)話框上is_tab_stop=true的控件。mnemonic:設(shè)置一個(gè)由mnemonic值表示的字符,當(dāng)按該字符時(shí),聚焦到該空間,mnemonic字符必須大寫(xiě)且須是控件標(biāo)題的大寫(xiě)字符之一。,例::edit_box{label=“A–TopVertOpng”;key=“l(fā)yr_ebox”;value=“0”;edit_width=31;edit_limit=31;mnemonic=“A”;},六、關(guān)鍵字key屬性:應(yīng)用程序與對(duì)話框中控件聯(lián)系的途徑。說(shuō)明:每個(gè)激活的控件必須有一個(gè)關(guān)鍵字值,并且對(duì)于一個(gè)對(duì)話框是唯一的,關(guān)鍵字的值是引號(hào)括起來(lái)的字符串,區(qū)分大小寫(xiě)。關(guān)鍵字前綴命名方案:,一、AutoLISP程序控制DCL對(duì)話框的方法,步驟:(1)用load_dialog函數(shù)將DCL文件加載到內(nèi)存中;(2)調(diào)用new_dialog函數(shù),將對(duì)話框名和DCL標(biāo)識(shí)碼作為參數(shù)傳遞給該函數(shù);(3)通過(guò)設(shè)置控件值、列表和圖像初始化對(duì)話框;(4)調(diào)用start_dialog將對(duì)話框的控制傳遞給AutoCAD并顯示出來(lái);(5)調(diào)用unload_dialog,在用戶響應(yīng)后從內(nèi)存中刪除對(duì)話框。,hello:dialog{label="SampleDialogBox";:text{label="Hello,world";}ok_only;},例:hello對(duì)話框的控制方法,用戶單擊“確定”按鈕后,AutoCAD將ok_only控件指定動(dòng)作done_dialog的調(diào)用傳遞給AutoLISP應(yīng)用程序,并關(guān)閉對(duì)話框。,二、動(dòng)作表達(dá)式和回調(diào),action_tile函數(shù):將AutoLISP表達(dá)式與控件相關(guān)聯(lián),從而定義對(duì)話框中控件被選定時(shí)執(zhí)行的操作。格式:(action_tilekeyaction-expression),get_attr函數(shù):檢索DCL文件中用戶定義的屬性。,get_tile函數(shù):獲得控件的當(dāng)前運(yùn)行值(基于用戶對(duì)控件的輸入)。,注意:定義動(dòng)作表達(dá)式必須在調(diào)用new_dialog之后,調(diào)用start_dialog之前。用戶如何選定控件或修改控件內(nèi)容的信息,將作為回調(diào)返回給動(dòng)作表達(dá)式,多數(shù)情況下,對(duì)話框每個(gè)被激活的控件都將產(chǎn)生一個(gè)回調(diào)。定義回調(diào)的動(dòng)作表達(dá)表達(dá)式通常被當(dāng)作回調(diào)函數(shù)引用。該函數(shù)檢查關(guān)聯(lián)控件的合法性,并更新對(duì)話框中關(guān)于控件值的信息。只有OK按鈕(或與之等效的控件)可檢查控件的值,以永久保存用戶最終選定的設(shè)置。也就是說(shuō),應(yīng)該在OK按鈕的回調(diào)中更新與控件值相關(guān)聯(lián)的變量,而不是在單個(gè)空間的回調(diào)中更新,否則將無(wú)法通過(guò)Cancel按鈕來(lái)取消變量的值。如果OK按鈕的回調(diào)檢查到錯(cuò)誤,則不應(yīng)退出對(duì)話框,而應(yīng)顯示錯(cuò)誤信息,并將焦點(diǎn)返回到錯(cuò)誤控件處。,1.動(dòng)作表達(dá)式,動(dòng)作表達(dá)式變量表,例:(action_tile“edit1”“(setqns$value)”),$value包含用戶輸入的字符串,動(dòng)作表達(dá)式將其存入變量ns中,2.回調(diào)原因:指明動(dòng)作發(fā)生的原因,并返回$reason變量中。,回調(diào)原因代碼,三、控件處理,1.初始化控件和回調(diào)時(shí)改變控件的模式,使控件成為對(duì)話框的初始化鍵盤(pán)焦點(diǎn)。禁用或啟用控件。如果控件是編輯框或圖像,則高亮顯示其內(nèi)容。,set_tile函數(shù):設(shè)置控件的值,格式:(set_tilekeyvalue)mode_tile函數(shù):設(shè)置控件模式,格式:(mode_tilekeymode),key:指定控件的字符串value:賦予控件的新值mode:控件控件模式代碼0啟用控件1禁用控件2將焦點(diǎn)設(shè)置到控件上3選擇編輯框內(nèi)容4圖像亮顯開(kāi)關(guān),例:,注意:當(dāng)調(diào)用mode_tile來(lái)禁用帶有當(dāng)前焦點(diǎn)的控件時(shí),必須再次調(diào)用mode_tile將焦點(diǎn)設(shè)置到另一控件上。,2.單選按鈕的處理,單選按鈕出現(xiàn)在單選控件組中,每個(gè)單選按鈕以“1”表示開(kāi),“0”表示關(guān)。單選控件組的值是當(dāng)前選定按鈕的key屬性,又可編程對(duì)話框(PDB)功能模塊管理一個(gè)控件組中的單選按鈕組的值,并確保同一時(shí)刻只能有一個(gè)單選按鈕被打開(kāi)??蔀槊總€(gè)單選按鈕指定一個(gè)動(dòng)作,但更為有效的辦法是為整個(gè)單選按鈕組指定一個(gè)動(dòng)作,然后通過(guò)測(cè)試單選按鈕組的值來(lái)確定所選單選按鈕及相關(guān)聯(lián)的動(dòng)作。,例:,3.滑塊的處理,當(dāng)處理滑塊的動(dòng)作和回調(diào)時(shí),應(yīng)用程序應(yīng)檢查在回調(diào)過(guò)程中收到的原因代碼。每當(dāng)?shù)竭_(dá)滑塊的增量邊界時(shí),都要發(fā)生一個(gè)回調(diào)。,4.編輯框的處理,編輯框中的字符總是可見(jiàn)的,因此無(wú)須處理中間代碼;當(dāng)編輯框上的焦點(diǎn)轉(zhuǎn)移時(shí),編輯框只需返回回調(diào)代碼。,滑塊和編輯框的處理示例程序,- 1.請(qǐng)仔細(xì)閱讀文檔,確保文檔完整性,對(duì)于不預(yù)覽、不比對(duì)內(nèi)容而直接下載帶來(lái)的問(wèn)題本站不予受理。
- 2.下載的文檔,不會(huì)出現(xiàn)我們的網(wǎng)址水印。
- 3、該文檔所得收入(下載+內(nèi)容+預(yù)覽)歸上傳者、原創(chuàng)作者;如果您是本文檔原作者,請(qǐng)點(diǎn)此認(rèn)領(lǐng)!既往收益都?xì)w您。
下載文檔到電腦,查找使用更方便
14.9 積分
下載 |
- 配套講稿:
如PPT文件的首頁(yè)顯示word圖標(biāo),表示該P(yáng)PT已包含配套word講稿。雙擊word圖標(biāo)可打開(kāi)word文檔。
- 特殊限制:
部分文檔作品中含有的國(guó)旗、國(guó)徽等圖片,僅作為作品整體效果示例展示,禁止商用。設(shè)計(jì)者僅對(duì)作品中獨(dú)創(chuàng)性部分享有著作權(quán)。
- 關(guān) 鍵 詞:
- AutoCAD 軟件 二次開(kāi)發(fā)
鏈接地址:http://www.820124.com/p-3390131.html