Visual-LISP程序設(shè)計(第2版)第3章程序的流程控制和AutoLISP文件_第1頁
Visual-LISP程序設(shè)計(第2版)第3章程序的流程控制和AutoLISP文件_第2頁
Visual-LISP程序設(shè)計(第2版)第3章程序的流程控制和AutoLISP文件_第3頁
Visual-LISP程序設(shè)計(第2版)第3章程序的流程控制和AutoLISP文件_第4頁
Visual-LISP程序設(shè)計(第2版)第3章程序的流程控制和AutoLISP文件_第5頁
已閱讀5頁,還剩23頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

程序的流程控制和AutoLISP文件2021/6/2713.1程序的流程控制AutoLISP程序的流程通過流程控制函數(shù)控制。3.1.1分支結(jié)構(gòu)1.(cond(測試表達式1結(jié)果表達式1)[(測試表達式2結(jié)果表達式2)]…)

該函數(shù)從第一個子表起,計算每一個子表的測試表達式,直至有一個子表的測試表達式成立為止,然后計算該子表的結(jié)果表達式,并返回這個結(jié)果表達式的值。例如,當(dāng)i小于等于1時,n=1;小于等于2時,n=4;小于等于3時,n=10;其它情況下n=100。用cond函數(shù)實現(xiàn)變量n和i之間以上關(guān)系的源代碼如下:2021/6/272測試表達式1結(jié)果表達式1測試表達式2結(jié)果表達式2測試表達式n結(jié)果表達式n成立成立成立不成立不成立不成立2021/6/273測試表達式1結(jié)果表達式1測試表達式2結(jié)果表達式2測試表達式n結(jié)果表達式n成立成立成立不成立不成立不成立T(其余)結(jié)果表達式2021/6/274(setqn(cond((<=i1)1) ((<=i2)4) ((<=i3)10) (t100) ))

說明:該函數(shù)類似于C語言的switch語句,最后一個測試表達式“t(或T)”相當(dāng)于C語言的“default”,指其余的情況,例如i等于5時,n等于100,也可以缺少這個測試表達式。與C語言switch語句不同的是,若某一測試表達式成立,即返回相應(yīng)結(jié)果表達式的值,不再向下測試。例如,上述表達式中,若i等于0,已滿足第一個測試表達式(<=i1),返回結(jié)果表達式的1,最后結(jié)果是n等于1,運算結(jié)束。2021/6/2752.(if測試條件表達式表達式1[表達式2])若測試條件表達式結(jié)果為真,執(zhí)行表達式1,否則,執(zhí)行表達式2。例如:(if(>a1)(setqb2))

該表達式的含義是;如果a大于1,則b等于2,否則不作任何計算,求值結(jié)束。(if(>a1)(setqb2)(setqb3))

該表達式的含義是;如果a大于1,則b等于2,否則b等于3,求值結(jié)束。注意:該函數(shù)最多只有3個變元,即測試條件表達式、表達式1和表達式2。先分析下列程序代碼:2021/6/276測試條件表達式表達式1成立表達式2測試條件表達式表達式1成立不成立2021/6/277(if(>a1)

(setqb2)(print(+ba))

(setqb4)(printb))

該程序段的本意是,若條件成立,b等于2,然后打印a與b之和,否則b等于4,然后打印b。但是在執(zhí)行該程序段時,首先檢查if函數(shù)變元的數(shù)量,第1個變元是測試條件表達式,它對應(yīng)表達式(>a1),第2個變元是條件成立時執(zhí)行的表達式,它對應(yīng)表達式(setqb2),第3個變元是條件不成立時執(zhí)行的表達式,它對應(yīng)表達式(print(+ba)),那么后面的兩個表達式就是多余的變元,因此顯示“toomanyarguments(變元太多)”的出錯信息。2021/6/278若將該程序段改寫為以下代碼:(if(>a1)

((setqb2)(print(+ba)))

((setqb4)(printb)))

用括號將條件成立或不成立的多個表達式括起,雖然變元的數(shù)量改為3個,但會出現(xiàn)“error:badfunction:2”的出錯信息。原因是在計算條件成立的表達式時,首先計算內(nèi)層表(setqb2),將其返回值“2”作為外層表的函數(shù)名,顯然這是一個壞的函數(shù)名。利用progn函數(shù)可以很好地解決了本程序段存在的問題。2021/6/2793.(prong表達式...)

該函數(shù)將n個表達式組合起來,作為if函數(shù)的一個表達式。在執(zhí)行時,按順序計算n個表達式,返回最后一個表達式的計算結(jié)果。例如:(if(>a1)

(progn(setqb2)(print(+ba)))

(progn(setqb4)(printb)))

該程序段的執(zhí)行過程是,若條件成立,b等于2,然后打印a與b之和,返回a與b之和;若條件不成立,b等于4,然后打印4,返回4。

2021/6/27103.1.2循環(huán)結(jié)構(gòu)1.(repeat整數(shù)n表達式…)

重復(fù)執(zhí)行n次,對所有的表達式求值,返回最后一個表達式的計算結(jié)果。例如:(setqa1b100)(repeat10

(setqa(1+a))

其它表達式…(setqb(+10b)))執(zhí)行結(jié)果:a等于11,b等于200,返回值為200。2021/6/27112.(while測試式表達式…)

若測試結(jié)果不為nil,執(zhí)行各表達式,直至測試結(jié)果為nil。例如:(setqi1a10)(while(<=i10)

(setqa(+a10))

其它表達式…(setqi(1+i))執(zhí)行結(jié)果:i等于11,a等于110,返回值為11。2021/6/2712

例如,定義求解百錢買百雞的函數(shù)。題目是若母雞每只3個錢,公雞每只2個錢,小雞每只0.5個錢。用100個錢買100只雞,有幾個答案,每個答案各有幾只母雞、公雞和小雞(不包括0只),打印所求的結(jié)果。該例沒有合適的計算公式,只能利用枚舉,試出合適的結(jié)果。首先分析母雞數(shù)量的范圍,如果母雞等于20,剩余40個錢。用剩下的錢至少買1只公雞之后,可以買76只小雞,但雞的總數(shù)為97(小于100),所以母雞的數(shù)量應(yīng)小于20。同樣,買了至少1只母雞和32只公雞之后,剩余的33個錢最多買66小雞,雞的總數(shù)為99(小于100),所以公雞的數(shù)量應(yīng)小于32。小雞的數(shù)量只能是100減去母雞與公雞之和。當(dāng)公雞的數(shù)量和錢數(shù)都等于100時,打印這組解。2021/6/2713【例3-1】解百錢買百雞程序(defunchicken(/hencockchickcost)(setqhen1)(while(<hen20);母雞的數(shù)量不超過20(setqcock1)(while(<cock32);公雞的可能數(shù)量不超過32(setqchick(-100hencock));小雞的數(shù)量

(setqcost(+(*3hen)(*2cock)(*0.5chick)));3種雞的錢數(shù)

(if(=cost100)(print(list"母雞="hen"公雞="cock"小雞="chick)))(setqcock(1+cock));公雞的數(shù)量加1)(setqhen(1+hen))

;母雞的數(shù)量加1)(princ);靜默退出)2021/6/2714說明:①程序的第3行(setqhen1)不可缺少,否則第4行(while(<hen20)中的hen將是無定義的。②第5行(setqcock1)若改寫在第3行(setqhen1cock1),雖然沒有語法錯誤,但內(nèi)層循環(huán)cock的值第一次從1增加到32后,就固定為32,出現(xiàn)了算法錯誤。③程序的第12行(setqcock(1+cock))不能只寫成(1+cock),表達式(1+cock)返回cock+1的值,但cock的值不變,這是1+函數(shù)與C語言++運算的不同之處。④第10行(print(list“母雞=”hen“公雞=”cock“小雞=”chick))若寫成(print“母雞=”hen“公雞=”cock“小雞=”chick)是錯誤的,因為print函數(shù)只需一個變元。⑤程序結(jié)束前的(princ)表達式不返回任何值,因為它是該函數(shù)的最后一個表達式,所以該函數(shù)將不返回任何值,這樣就不會干擾print函數(shù)的正常打印信息。2021/6/2715

加載該程序之后,在“Command:”提示下鍵入(chicken),輸出以下結(jié)果:("母雞="2"公雞="30"小雞="68)("母雞="5"公雞="25"小雞="70)("母雞="8"公雞="20"小雞="72)("母雞="11"公雞="15"小雞="74)("母雞="14"公雞="10"小雞="76)("母雞="17"公雞="5"小雞="78)2021/6/27163.2AutoLISP程序文件3.2.1AutoLISP文件的特點

AutoLISP文件的擴展名為.lsp,是由若干個AutoLISP表達式構(gòu)成的。一個LISP文件可定義多個函數(shù)或AutoCAD命令。表達式相當(dāng)于語句。一個表達式可以分寫在若干行上,一行可以寫若干個表達式。連續(xù)的多個空格相當(dāng)于一個空格。以下是一個表達式分寫在若干行上的實例:(defunplus(xy)(+(*xy)x))以下是一行寫若干個表達式的實例:(setqa2.0)(setqb4.0)(+ab)2021/6/2717由于在AutoLISP程序中含有大量的括號,使得程序代碼不易閱讀。解決這個問題的方法就是縮排對齊格式。程序代碼行嵌套的層次越深,越向右縮進。例如,定義下例f(x)函數(shù)。不采用縮進格式書寫,形式如下:(defunfun(x)(cond((>x0)1)((=x0)2)((<x0)0)))2021/6/2718采用縮進格式書寫,形式如下:(defunfun(x)(cond((>x0)1)((=x0)2)((<x0)0)))

顯然后者便于程序的閱讀和調(diào)試。VisualLISP提供了文本格式編排器,可以將隨意書寫的程序更新為縮進格式的程序。

2021/6/27193.3.2程序中的注釋注釋可增加程序的可讀性,不僅便于對程序的閱讀和調(diào)試,也便于對程序的維護、移植和擴充。注釋的形式可以是整行、整段或行間注釋。整行或后半行注釋以分號“;”開頭,至行尾為注釋部分。例如:(setqarea(*pirr));計算圓的面積整段或行間注釋以“;|”開頭,以“|;”結(jié)尾,之間可以短到幾個字符,長到若干行。例如,行間注釋:(setqtmode;|此處添加注釋|;

(getvar"tilemode"))下面是整段的注釋:(setvar"orthomode"1);|注釋起始部分

連續(xù)注釋,......

注釋到此為止|;

(princ"\nORTHOMODEsetOn.")2021/6/2720【例3-2】定義打印ASCII碼為33~90的字符的命令。;該程序打印ASCII碼為33~90的字符;在Command:提示下,鍵入pras(defunc:pras(/as) ;定義pras為AutoCAD命令,as為局部變元

(setqas33) ;設(shè)置as為第一個ASCII碼33(while(<=as90) ;while循環(huán)開始

(princ(chras)) ;打印ASCII碼的為as的字符

(terpri) ;換新行

(setqas(1+as)) ;設(shè)置as為as的下一個ASCII碼

) ;while循環(huán)結(jié)束) ;命令定義結(jié)束2021/6/27213.2.3在AutoCAD環(huán)境下加載AutoLISP文件

(1)命令行方式加載AutoLISP文件用load函數(shù),調(diào)用load函數(shù)的格式如下:

Command:(load"驅(qū)動器:\\路徑\\文件名"["出錯信息"])

若加載成功,返回被加載lisp文件的最后一個表達式的結(jié)果,若最后一個表達式是函數(shù)的定義,則返回該函數(shù)名。若加載失敗,返回用戶定義的出錯信息,若用戶沒有定義出錯信息,則返回加載失敗的信息。

2021/6/2722例如,文件fi1e1.lsp最后一個表達式是定義函數(shù)func1,它的路徑是d:\user1。加載該文件的表達式如下:Command:(load"d:\\user1\\fi1e1""沒有找到這個文件!")若加載成功,返回函數(shù)名func1,否則返回"沒有找到這個文件!"這個信息。如果調(diào)用該函數(shù)時省略了“出錯信息”,例如:Command:(load"d:/user1/fi1e1")

若加載成功,返回函數(shù)名func1,否則返回;error:LOADfailed:"d:\\user1\\fi1e1".

2021/6/2723(2)對話框方式選擇下拉菜單Tools

LoadApplication項,或者選擇下拉菜單Tools

AutoLISP

Load項,或者在“Command:”提示下鍵入appload,通過隨后彈出的“Load/UnloadApplications”對話框加載AutoLISP文件。

2021/6/2724

3.自動加載

AutoCAD在啟動時,可以自動加載acad.lsp、acad2006.lsp、acaddoc.lsp和acad2006doc.lsp四個lisp文件。用戶可以創(chuàng)建和維護這些文件,其中acad.lsp和acaddoc.lsp只能由用戶來創(chuàng)建。AutoCAD在加載過程中不報告是否找到或是否加載相關(guān)文件的信息。AutoCAD在加載菜單時,自動加載了與菜單文件同名的擴展名為.mnl的lisp文件。

2021/6/27254.間接自動加載如果把調(diào)用autoload函數(shù)的表達式寫在自動加載的acad2006doc.lsp等文件內(nèi),在AutoCAD啟動時,隨著acad2006doc.lsp等文件的自動加載,被調(diào)用的autoload函數(shù)還可以加載一些lisp文件。調(diào)用autoload函數(shù)的格式如下:Command:(autoload

lisp文件名命令表)

該函數(shù)要求lisp文件必須在AutoCAD支持的文件搜索路徑下,命令表列出了在該lisp文件中定義的部份的AutoCAD

溫馨提示

  • 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論