




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、第第 3 章章 程序的流程控制和程序的流程控制和AutoLISP文件文件 3.1 程序的流程控制程序的流程控制AutoLISP程序的流程通過流程控制函數(shù)控制。程序的流程通過流程控制函數(shù)控制。3.1.1 分支結(jié)構(gòu)分支結(jié)構(gòu)1. (cond (測試表達(dá)式測試表達(dá)式1 結(jié)果表達(dá)式結(jié)果表達(dá)式1) (測試表達(dá)式測試表達(dá)式2 結(jié)果表達(dá)結(jié)果表達(dá)式式2) ) 該函數(shù)從第一個(gè)子表起,計(jì)算每一個(gè)子表的測試表達(dá)式,該函數(shù)從第一個(gè)子表起,計(jì)算每一個(gè)子表的測試表達(dá)式,直至有一個(gè)子表的測試表達(dá)式成立為止,然后計(jì)算該子表的直至有一個(gè)子表的測試表達(dá)式成立為止,然后計(jì)算該子表的結(jié)果表達(dá)式,并返回這個(gè)結(jié)果表達(dá)式的值。結(jié)果表達(dá)式,并
2、返回這個(gè)結(jié)果表達(dá)式的值。 例如,當(dāng)例如,當(dāng) i 小于等于小于等于1時(shí),時(shí),n=1;小于等于;小于等于2時(shí),時(shí),n=4;小于;小于等于等于3時(shí),時(shí),n=10;其它情況下;其它情況下n=100。用。用cond函數(shù)實(shí)現(xiàn)變量函數(shù)實(shí)現(xiàn)變量n和和i 之間以上關(guān)系的源代碼如下:之間以上關(guān)系的源代碼如下:測試表達(dá)式測試表達(dá)式1結(jié)果表達(dá)式結(jié)果表達(dá)式1測試表達(dá)式測試表達(dá)式2結(jié)果表達(dá)式結(jié)果表達(dá)式2測試表達(dá)式測試表達(dá)式n結(jié)果表達(dá)式結(jié)果表達(dá)式n成立成立成立成立成立成立不成立不成立不成立不成立不成立不成立測試表達(dá)式測試表達(dá)式1結(jié)果表達(dá)式結(jié)果表達(dá)式1測試表達(dá)式測試表達(dá)式2結(jié)果表達(dá)式結(jié)果表達(dá)式2測試表達(dá)式測試表達(dá)式n結(jié)果表達(dá)
3、式結(jié)果表達(dá)式n成立成立成立成立成立成立不成立不成立不成立不成立不成立不成立T(其余)(其余)結(jié)果表達(dá)式結(jié)果表達(dá)式 (setq n(cond (= i 1) 1) (= i 2) 4) (= i 3) 10) (t 100) ) ) 說明:該函數(shù)類似于C語言的switch語句, 最后一個(gè)測試表達(dá)式“t(或T)”相當(dāng)于C語言的“default”,指其余的情況,例如i 等于5時(shí),n等于100,也可以缺少這個(gè)測試表達(dá)式。與C語言switch語句不同的是,若某一測試表達(dá)式成立,即返回相應(yīng)結(jié)果表達(dá)式的值,不再向下測試。例如,上述表達(dá)式中,若i 等于0,已滿足第一個(gè)測試表達(dá)式( a 1) (setq b 2
4、) ) 該表達(dá)式的含義是;如果a 大于 1,則b等于2,否則不作任何計(jì)算,求值結(jié)束。(if ( a 1) (setq b 2) (setq b 3) ) 該表達(dá)式的含義是;如果a 大于 1,則b等于2,否則b等于3,求值結(jié)束。注意:該函數(shù)最多只有3個(gè)變元,即測試條件表達(dá)式、表達(dá)式1和表達(dá)式2。先分析下列程序代碼:測試條件測試條件表達(dá)式表達(dá)式表達(dá)式表達(dá)式1成立成立表達(dá)式表達(dá)式2測試條件測試條件表達(dá)式表達(dá)式表達(dá)式表達(dá)式1成立成立不成立不成立(if ( a 1) (setq b 2) (print ( b a) (setq b 4) (print b) 該程序段的本意是,若條件成立,該程序段的本意是
5、,若條件成立,b等于等于2,然后打印,然后打印a與與b之之和,否則和,否則b等于等于4,然后打印,然后打印b。但是在執(zhí)行該程序段時(shí),首先檢。但是在執(zhí)行該程序段時(shí),首先檢查查if函數(shù)變元的數(shù)量,第函數(shù)變元的數(shù)量,第1個(gè)變元是測試條件表達(dá)式,它對應(yīng)表達(dá)個(gè)變元是測試條件表達(dá)式,它對應(yīng)表達(dá)式式( a 1),第,第2個(gè)變元是條件成立時(shí)執(zhí)行的表達(dá)式,它對應(yīng)表達(dá)個(gè)變元是條件成立時(shí)執(zhí)行的表達(dá)式,它對應(yīng)表達(dá)式式(setq b 2),第,第3個(gè)變元是條件不成立時(shí)執(zhí)行的表達(dá)式,它對應(yīng)個(gè)變元是條件不成立時(shí)執(zhí)行的表達(dá)式,它對應(yīng)表達(dá)式表達(dá)式(print ( b a) ,那么后面的兩個(gè)表達(dá)式就是多余的變元,那么后面的兩個(gè)表
6、達(dá)式就是多余的變元,因此顯示,因此顯示“too many arguments(變元太多)(變元太多)”的出錯(cuò)信息。的出錯(cuò)信息。若將該程序段改寫為以下代碼:若將該程序段改寫為以下代碼:(if ( a 1) (setq b 2) (print ( b a) ) (setq b 4) (print b) ) 用括號將條件成立或不成立的多個(gè)表達(dá)式括起,雖然變元的數(shù)量改為3個(gè),但會出現(xiàn)“error: bad function: 2”的出錯(cuò)信息。原因是在計(jì)算條件成立的表達(dá)式時(shí),首先計(jì)算內(nèi)層表(setq b 2),將其返回值“2”作為外層表的函數(shù)名,顯然這是一個(gè)壞的函數(shù)名。利用progn函數(shù)可以很好地解決了
7、本程序段存在的問題。3. (prong 表達(dá)式.) 該函數(shù)將n個(gè)表達(dá)式組合起來,作為if函數(shù)的一個(gè)表達(dá)式。在執(zhí)行時(shí),按順序計(jì)算n個(gè)表達(dá)式,返回最后一個(gè)表達(dá)式的計(jì)算結(jié)果。例如:(if ( a 1) (progn (setq b 2) (print ( b a) ) (progn (setq b 4) (print b) ) 該程序段的執(zhí)行過程是,若條件成立,b等于2,然后打印a與b之和,返回a與b之和;若條件不成立,b等于4,然后打印4,返回4。 3.1.2 循環(huán)結(jié)構(gòu)1. (repeat 整數(shù)n 表達(dá)式 ) 重復(fù)執(zhí)行n次,對所有的表達(dá)式求值,返回最后一個(gè)表達(dá)式的計(jì)算結(jié)果。例如:(setq a 1
8、 b 100)(repeat 10 (setq a(+1 a) 其它表達(dá)式 (setq b(+ 10 b)執(zhí)行結(jié)果:a等于11,b等于200,返回值為200。2. (while 測試式 表達(dá)式 ) 若測試結(jié)果不為nil,執(zhí)行各表達(dá)式, 直至測試結(jié)果為nil。例如:(setq i 1 a 10)(while (= i 10) (setq a(+ a 10) 其它表達(dá)式 (setq i (1+ i )執(zhí)行結(jié)果:i等于11,a等于110,返回值為11。 例如,定義求解百錢買百雞的函數(shù)。題目是若母雞每只例如,定義求解百錢買百雞的函數(shù)。題目是若母雞每只3個(gè)錢個(gè)錢,公雞每只,公雞每只2個(gè)錢,小雞每只個(gè)錢,
9、小雞每只0.5個(gè)錢。用個(gè)錢。用100個(gè)錢買個(gè)錢買100只雞,有只雞,有幾個(gè)答案,每個(gè)答案各有幾只母雞、公雞和小雞(不包括幾個(gè)答案,每個(gè)答案各有幾只母雞、公雞和小雞(不包括0只)只),打印所求的結(jié)果。,打印所求的結(jié)果。 該例沒有合適的計(jì)算公式,只能利用枚舉,試出合適的結(jié)果該例沒有合適的計(jì)算公式,只能利用枚舉,試出合適的結(jié)果。首先分析。首先分析母雞數(shù)量的范圍,如果母雞母雞數(shù)量的范圍,如果母雞等于等于2020,剩余,剩余4040個(gè)錢個(gè)錢。用。用剩下的錢剩下的錢至少至少買買1 1只公雞之后,只公雞之后,可以買可以買7676只只小雞小雞,但雞的總數(shù)為,但雞的總數(shù)為9797(小于(小于100100),),
10、所以所以母雞的數(shù)量應(yīng)小于母雞的數(shù)量應(yīng)小于2020。同樣,。同樣,買了至少買了至少1 1只只母雞和母雞和3232只公雞之后,只公雞之后,剩余的剩余的3333個(gè)個(gè)錢最多買錢最多買6666小雞小雞,雞的總數(shù)為,雞的總數(shù)為9999(小于(小于100100),),所以所以公雞的數(shù)量應(yīng)小于公雞的數(shù)量應(yīng)小于3232。小雞的數(shù)量只能是小雞的數(shù)量只能是100100減去母雞與公雞之和減去母雞與公雞之和。當(dāng)公雞的數(shù)量和。當(dāng)公雞的數(shù)量和錢數(shù)都等于錢數(shù)都等于100100時(shí),打時(shí),打印這組解。印這組解?!纠?-13-1】解百錢買百雞程序解百錢買百雞程序(defun chicken( / hen cock chick c
11、ost)(defun chicken( / hen cock chick cost) (setq hen 1) (setq hen 1) (while ( hen 20) (while ( hen 20);母雞的數(shù)量不超過母雞的數(shù)量不超過2020 (setq cock 1) (setq cock 1) (while ( cock 32) (while ( cock 32);公雞的可能數(shù)量不超過公雞的可能數(shù)量不超過3232 (setq chick (- 100 hen cock) (setq chick (- 100 hen cock);小雞的數(shù)量小雞的數(shù)量 (setq cost (+ (set
12、q cost (+ (* * 3 hen)( 3 hen)(* * 2 cock)( 2 cock)(* * 0.5 chick) 0.5 chick);3 3種雞的錢數(shù)種雞的錢數(shù) (if (= cost 100)(if (= cost 100) (print (list (print (list 母雞母雞= hen = hen 公雞公雞= cock = cock 小雞小雞= chick)= chick) ) ) (setq cock (1+ cock) (setq cock (1+ cock);公雞的數(shù)量加公雞的數(shù)量加1 1 ) ) (setq hen (1+ hen) (setq hen
13、(1+ hen) ;母雞的數(shù)量加;母雞的數(shù)量加1 1 ) )(princ)(princ);靜默退出;靜默退出) )說明: 程序的第3行(setq hen 1)不可缺少,否則第4行(while ( x 0) 1) (= x 0) 2) ( x 0) 1)(= x 0) 2)( x 0) 0) 顯然后者便于程序的閱讀和調(diào)試。顯然后者便于程序的閱讀和調(diào)試。Visual LISP提供了文本格式編排器,可以將隨意書寫的程序更提供了文本格式編排器,可以將隨意書寫的程序更新為縮進(jìn)格式的程序。新為縮進(jìn)格式的程序。 3.3.2 程序中的注釋程序中的注釋 注釋可增加程序的可讀性,不僅便于對程序的閱讀和調(diào)試,注釋可
14、增加程序的可讀性,不僅便于對程序的閱讀和調(diào)試,也便于對程序的維護(hù)、移植和擴(kuò)充。也便于對程序的維護(hù)、移植和擴(kuò)充。注釋的形式可以是整行、整段或行間注釋。注釋的形式可以是整行、整段或行間注釋。整行或后半行注釋以分號整行或后半行注釋以分號“;”開頭,至行尾為注釋部分。例如開頭,至行尾為注釋部分。例如:(setq area (* pi r r) ; 計(jì)算圓的面積計(jì)算圓的面積整段或行間注釋以整段或行間注釋以“;|”開頭,以開頭,以“|;”結(jié)尾,之間可以短到幾結(jié)尾,之間可以短到幾個(gè)字符,長到若干行。例如,行間注釋:個(gè)字符,長到若干行。例如,行間注釋:(setq tmode ;|此處添加注釋此處添加注釋|;
15、(getvar tilemode)下面是整段的注釋:下面是整段的注釋:(setvar orthomode 1) ;|注釋起始部分注釋起始部分 連續(xù)注釋連續(xù)注釋, . . . . . . 注釋到此為止注釋到此為止|; (princ nORTHOMODE set On.) 【例3-2】定義打印ASCII碼為33 90的字符的命令。;該程序打印ASCII碼為33 90的字符;在Command:提示下,鍵入pras(defun c:pras(/ as );定義pras為AutoCAD命令,as為局部變元 (setq as 33);設(shè)置as為第一個(gè)ASCII碼33 (while(= as 90) ;wh
16、ile循環(huán)開始 (princ(chr as) ;打印ASCII碼的為as的字符 (terpri) ;換新行 (setq as (1+ as);設(shè)置as為as 的下一個(gè)ASCII碼 ) ;while循環(huán)結(jié)束);命令定義結(jié)束3.2.3 在在AutoCAD環(huán)境下加載環(huán)境下加載AutoLISP文件文件 (1)命令行方式)命令行方式 加載加載AutoLISPAutoLISP文件用文件用loadload函數(shù),調(diào)用函數(shù),調(diào)用loadload函數(shù)的格式函數(shù)的格式如下:如下: CommandCommand:( (loadload 驅(qū)動器驅(qū)動器:路徑路徑文件名文件名 出錯(cuò)信息出錯(cuò)信息) 若若加載成功,加載成功,返
17、回被返回被加載加載lisplisp文件的文件的最后一個(gè)表達(dá)式的結(jié)果最后一個(gè)表達(dá)式的結(jié)果,若最后一個(gè)表達(dá)式是函數(shù),若最后一個(gè)表達(dá)式是函數(shù)的的定義,則返回該函數(shù)名。若定義,則返回該函數(shù)名。若加載加載失敗,失敗,返回返回用戶定義的用戶定義的出錯(cuò)信息,若出錯(cuò)信息,若用戶用戶沒有沒有定義定義出錯(cuò)信息,出錯(cuò)信息,則返回則返回加載失敗的加載失敗的信息。信息。 例如,文件例如,文件fi1e1.lspfi1e1.lsp最后一個(gè)表達(dá)式是定義函數(shù)最后一個(gè)表達(dá)式是定義函數(shù)func1func1,它的,它的路徑是路徑是d:user1d:user1。加載該文件的表達(dá)式如下:。加載該文件的表達(dá)式如下:CommandComma
18、nd:(load d: user1 fi1e1 (load d: user1 fi1e1 沒有找到這個(gè)文沒有找到這個(gè)文件!件! ) )若加載成功,返回函數(shù)名若加載成功,返回函數(shù)名func1func1,否則返回,否則返回 沒有找到這個(gè)文件沒有找到這個(gè)文件! 這個(gè)信息。這個(gè)信息。如果調(diào)用該函數(shù)時(shí)省略了如果調(diào)用該函數(shù)時(shí)省略了“出錯(cuò)信息出錯(cuò)信息”,例如:,例如:CommandCommand:(load d:/ user1/fi1e1)(load d:/ user1/fi1e1) 若加載成功,返回函數(shù)名若加載成功,返回函數(shù)名func1func1,否則返回,否則返回; ; error: LOAD erro
19、r: LOAD failed: d: user1 fi1e1.failed: d: user1 fi1e1. (2)對話框方式 選擇下拉菜單ToolsLoad Application 項(xiàng),或者選擇下拉菜單ToolsAutoLISPLoad項(xiàng),或者在“Command:”提示下鍵入appload,通過隨后彈出的“Load/Unload Applications”對話框加載AutoLISP文件。 3. 3. 自動加載自動加載 AutoCADAutoCAD在啟動時(shí),可在啟動時(shí),可以以自動自動加載加載acad.lspacad.lsp、acad2006.lspacad2006.lsp、acaddoc.ls
20、pacaddoc.lsp和和acad2006doc.lspacad2006doc.lsp四四個(gè)個(gè)lisplisp文件。文件。用戶可以創(chuàng)建和維護(hù)這些文件,其中用戶可以創(chuàng)建和維護(hù)這些文件,其中acad.lspacad.lsp和和acaddoc.lspacaddoc.lsp只能由用戶來創(chuàng)建。只能由用戶來創(chuàng)建。AutoCADAutoCAD在加載過程中不報(bào)告是否找到或是否加載相在加載過程中不報(bào)告是否找到或是否加載相關(guān)文件的信息。關(guān)文件的信息。AutoCADAutoCAD在加載菜單時(shí),在加載菜單時(shí),自動自動加載了加載了與菜單文件同名的擴(kuò)展名為與菜單文件同名的擴(kuò)展名為.mnl.mnl的的lisplisp文件
21、。文件。 4. 4. 間接自動加載間接自動加載 如果把調(diào)用如果把調(diào)用autoloadautoload函數(shù)的表達(dá)式寫在自動加載函數(shù)的表達(dá)式寫在自動加載的的acad2006doc.lspacad2006doc.lsp等文件內(nèi),等文件內(nèi),在在AutoCADAutoCAD啟動時(shí),隨啟動時(shí),隨著著acad2006doc.lspacad2006doc.lsp等文件的等文件的自動加載,被調(diào)用的自動加載,被調(diào)用的autoloadautoload函數(shù)還可以加載一些函數(shù)還可以加載一些lisplisp文件。調(diào)用文件。調(diào)用autoloadautoload函數(shù)的格式如下:函數(shù)的格式如下:CommandCommand:(
22、 (autoloadautoload lisplisp文件名文件名 命令表命令表) ) 該函數(shù)要求該函數(shù)要求lisplisp文件必須在文件必須在AutoCADAutoCAD支持的文件搜支持的文件搜索路徑下,命令表列出了在該索路徑下,命令表列出了在該lisplisp文件中定義的部份文件中定義的部份的的AutoCADAutoCAD命令名。無論是否加載成功,該函數(shù)均返命令名。無論是否加載成功,該函數(shù)均返回回nilnil。 autoload autoload函數(shù)與函數(shù)與loadload函數(shù)的不同之處是,執(zhí)行完調(diào)用該函函數(shù)的不同之處是,執(zhí)行完調(diào)用該函數(shù)的表達(dá)式之后,數(shù)的表達(dá)式之后,AutoCADAuto
23、CAD只是記錄了被加載的只是記錄了被加載的lisplisp文件名和文件名和相應(yīng)的命令表,而相應(yīng)的命令表,而lisplisp文件本身并沒有被加載。只有等到命令文件本身并沒有被加載。只有等到命令表內(nèi)的任意一個(gè)命令被調(diào)用之后,這個(gè)表內(nèi)的任意一個(gè)命令被調(diào)用之后,這個(gè)lisplisp文件才真正文件才真正被被加載加載,這時(shí)該,這時(shí)該lisplisp文件所定義的全部文件所定義的全部AutoCADAutoCAD命令才處于可以被調(diào)命令才處于可以被調(diào)用狀態(tài)。也就是說,如果某個(gè)用狀態(tài)。也就是說,如果某個(gè)lisplisp文件所定義的命令沒有被調(diào)文件所定義的命令沒有被調(diào)用,那么這個(gè)用,那么這個(gè)lisplisp文件就暫時(shí)不被加載到內(nèi)存,從而節(jié)省了內(nèi)文件就暫時(shí)不被加載到內(nèi)存,從而節(jié)省了內(nèi)存空間。存空間。 例
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 個(gè)人購銷農(nóng)機(jī)合同范本
- 辦證合同范本模板
- 2025年黑龍江貨運(yùn)從業(yè)資格證模擬考試題目
- 2025年固原貨運(yùn)從業(yè)資格證考試試題
- 農(nóng)業(yè)招標(biāo)合同范本
- 供水項(xiàng)目施工合同范本
- 分級銷售合同范本
- 做布料生意合同范本
- 辦公花卉采購合同范本
- 鹿邑牛犢購買合同范本
- 成人重癥患者人工氣道濕化護(hù)理專家共識 解讀
- 關(guān)于進(jìn)一步加強(qiáng)路基路面施工質(zhì)量的通知
- 新版蘇教版六年級數(shù)學(xué)上冊全冊解析
- AQ/T 2080-2023 金屬非金屬地下礦山在用人員定位系統(tǒng)安全檢測檢驗(yàn)規(guī)范(正式版)
- GB/T 36548-2024電化學(xué)儲能電站接入電網(wǎng)測試規(guī)程
- JTT 1499-2024 公路水運(yùn)工程臨時(shí)用電技術(shù)規(guī)程(正式版)
- 2024年甘肅省天水市中考生物·地理試題卷(含答案)
- 壓力變送器的拆卸及安裝 壓力變送器維護(hù)和修理保養(yǎng)
- 2024遼寧大連中遠(yuǎn)海運(yùn)川崎船舶工程限公司招聘73人公開引進(jìn)高層次人才和急需緊缺人才筆試參考題庫(共500題)答案詳解版
- 2024年上海市法院系統(tǒng)輔助文員招聘筆試參考題庫附帶答案詳解
- 企業(yè)復(fù)產(chǎn)復(fù)工方案
評論
0/150
提交評論