AutoLISP繪圖程序設(shè)計(jì)課件_第1頁(yè)
AutoLISP繪圖程序設(shè)計(jì)課件_第2頁(yè)
AutoLISP繪圖程序設(shè)計(jì)課件_第3頁(yè)
AutoLISP繪圖程序設(shè)計(jì)課件_第4頁(yè)
AutoLISP繪圖程序設(shè)計(jì)課件_第5頁(yè)
已閱讀5頁(yè),還剩80頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第三章AutoLISP繪圖程序設(shè)計(jì)

主要內(nèi)容1.AutoLISP特點(diǎn)2.AutoLISP函數(shù)的用法3.AutoLISP程序結(jié)構(gòu)4.AutoLISP程序執(zhí)行方式6/4/20231§3.1AutoLISP概述

一、AutoLISP介紹

1.AutoLISP的作用(1)AutoLISP是一種表語(yǔ)言,是常用的AutoCAD二次開(kāi)發(fā)手段。

所謂二次開(kāi)發(fā):是指以AutoCAD軟件為平臺(tái),加入自己所需要的功能。開(kāi)發(fā)過(guò)程,就是編程的過(guò)程。二次開(kāi)發(fā)所支持的語(yǔ)言有VB、C++,大型的二次開(kāi)發(fā),以C++為主,而小型二次開(kāi)發(fā),一般以AutoLISP為主。6/4/20232(2)必須在AutoCAD環(huán)境下運(yùn)行(內(nèi)嵌);(3)AutoLISP可以編寫(xiě)程序,調(diào)用AutoCAD的許多命令;舉例:在水平方向畫(huà)n個(gè)大小相等的圓。;;調(diào)用AutoCAD命令畫(huà)圓(defunC:HY()(setqP0(getpoint"第一圓心坐標(biāo):"))(setqR(getreal"半徑:"))(setqL(getreal"圓心間距離:"))(setqa1)(setqn(getint"\n圓的個(gè)數(shù):"))(while(<=an)(command"circle"P0R)(setqP0(polarP00L))(setqa(1+a))))6/4/20233(4)AutoLISP語(yǔ)言中使用大量的函數(shù)(有200多個(gè)函數(shù)),進(jìn)行各種運(yùn)算;(5)AutoLISP編寫(xiě)的程序特點(diǎn)(學(xué)習(xí)中注意):以表形式描述數(shù)據(jù)處理過(guò)程,程序執(zhí)行過(guò)程就是函數(shù)求值過(guò)程;每段程序都是一個(gè)函數(shù);具有交互處理功能,邊解釋邊執(zhí)行;采用模塊化設(shè)計(jì)方法。6/4/202342.AutoLISP的數(shù)據(jù)類(lèi)型

(1)整型數(shù)(INT):是由0、1、2…9、+、-組成的。(2)實(shí)型數(shù)(REAL):如0.4(0不能少)、-1.23、0.526E9(0.526×109)。(3)符號(hào)(SYM):除(、)、*、‘、”、;之外的字符序列,并且不能全部是數(shù)字。符號(hào)常用著變量,如:Command:(setqX12);整型數(shù)Command:(setqX12.0);實(shí)型數(shù)Command:(setqX“12”);字符串6/4/20235(4)字符串(STR):如:“ABC”、“abc”、“457”等。(5)表(LIST):帶有一對(duì)括號(hào)、有若干元素組成。(元素1元素2…元素n)如:(24f)

元素的個(gè)數(shù)叫表的長(zhǎng)度。

元素也可以是表,如(45(36)7),這叫嵌套。

元素之間必須用“空格”隔開(kāi)。

表的定義方式:(LIST56);’(56);還可以用defun定義(后面講)。

6/4/20236例:(setqP(list12.36-26.58))結(jié)果是:(12.36-26.58)例:(setqP'(12.36-26.58))結(jié)果是:(12.36-26.58)提示:(1)表的嵌套時(shí)一定要注意括號(hào)“(”、“)”匹配。(2)西文狀態(tài)下輸入!??!6/4/20237(6)文件描述符(7)AutoLISP內(nèi)部函數(shù)(8)AutoCAD的選擇集(9)AutoCAD的實(shí)體名上述數(shù)據(jù)類(lèi)型中,前四種稱(chēng)原子,原子包括數(shù)值原子(整型數(shù)、實(shí)型數(shù)),符號(hào)原子和字符串原子。AutoLISP基本數(shù)據(jù)類(lèi)型是原子和表,重點(diǎn)介紹前五種數(shù)據(jù)類(lèi)型。6/4/20238二、幾個(gè)基本概念1.常數(shù)PI——數(shù)學(xué)中的π(3.1415929…)T——邏輯真,即成立。NIL——邏輯假,即不成立。還代表空,即無(wú)值。

注意:(1)大小寫(xiě)等效;(2)它們不能作為變量。2.原子是程序處理中最小的數(shù)據(jù)單元。3.表達(dá)式原子和表的統(tǒng)稱(chēng)。如:(setqP'(12.36-26.58))6/4/202394.點(diǎn)是表的一種形式,也叫點(diǎn)表。有三種獲得點(diǎn)的方式:(1)用'表示'(120.35253.24)(2)list函數(shù)定義點(diǎn)(setqX12.36Y-26.58)(setqM(listXY))結(jié)果是:M=(12.36-26.58)(setqM'(XY))結(jié)果是:(XY)(3)由getpoint函數(shù)得到點(diǎn)其格式:(getpoint“\n輸入一點(diǎn):”)

6/4/202310三、AutoLISP程序結(jié)構(gòu)1.舉例例(1)

;;在屏幕上顯示ASCII碼為(65-90)的字符(defunC:zm(/as);自定義命令(setqas65n100)(while(<=as90)(command"text"(listn100)15""(chras))(setqas(+as1)n(+n20))))6/4/202311例(2);;繪制正多邊形程序(defunc:dbx()(setqn(getint"\n輸入多邊形邊數(shù):"))(setqL(getreal"\n輸入多邊形邊長(zhǎng):"))(setqP1(getpoint"\n輸入多邊形第一個(gè)角點(diǎn)坐標(biāo):"))(setqP2(polarP10L))(command"polygon"n"e"p1p2))6/4/202312例(3)(defunyuan();;畫(huà)圓函數(shù)(setqr(getreal"\n半徑:"))(setqp(getpoint"\n圓心:"))(command"circle"pr))6/4/202313例(4)(defunld()(setqp1(getpoint"\np1:")p2(getpoint"\np2:"));;;輸入兩點(diǎn)(setqd(distancep1p2));求距離(setqang(anglep1p2));求方位角(printd)(printang)(command"line"p1p2"");畫(huà)直線)6/4/2023142.結(jié)構(gòu)

(1)注釋行以;開(kāi)始,可在程序頭或句尾,增加程序可讀性。也可以不要。(2)除字符串外,字母大小寫(xiě)等效。(3)表與表之間可以有空格,也可沒(méi)有,建議有,這樣清楚。如:(distance'(34)'(5632))或(distance'(34)'(5632))(4)函數(shù)名后至少要有一個(gè)空格,函數(shù)名與表之間可有可無(wú)。6/4/2023153.特點(diǎn)

(1)所謂語(yǔ)句都是以表形式出現(xiàn)。(2)一切成分都是以函數(shù)的形式給出。(3)程序執(zhí)行過(guò)程就是求函數(shù)值的過(guò)程。四、AutoLISP程序執(zhí)行方式有三種方式:行方式、源文件方式、編譯文件方式。1.行方式就是在AutoCAD的“command:”提示符下,輸入表后回車(chē)。如:command:(+156.3)↙command:(setqa10)(setqb(+a5))↙

6/4/2023162.源文件方式用寫(xiě)字板或記事本把AutoLISP程序保存起來(lái)(后綴為.LSP)。然后用“LOAD”命令裝載并調(diào)用。例如:(1)把下列程序保存到“e:\zm.lsp”;;在屏幕上顯示ASCII碼為(65-90)的字符(defunC:zm(/as);自定義命令(setqas65n100)(while(<=as90)(command"text"(listn100)15""(chras))(setqas(+as1)n(+n20))))6/4/202317

(2)用“l(fā)oad”裝載即在命令行上輸入(load“e:\zm.lsp”)(3)在命令行上輸入zm3.編譯文件方式(重點(diǎn)掌握)(1)VisualLISP的啟動(dòng)、界面和退出(2)VisualLISP控制臺(tái)(3)VisualLISP創(chuàng)建LISP程序(4)VisualLISP中運(yùn)行LISP程序提示:建議在VisualLISP中創(chuàng)建和運(yùn)行LISP程序舉例:6/4/202318§3.2基本函數(shù)一、算數(shù)運(yùn)算函數(shù)

1.加運(yùn)算格式:(+num1num2num3...)

Command:(+25)返回:7Command:(+2.030.04.050.0)返回:86.0Command:(+230450.0)返回:86.0注意:“+”與“num1”及各數(shù)之間必須要有空格,后面的函數(shù)格式都是如此。6/4/2023192.減運(yùn)算格式:(-num1num2num3...)“減”函數(shù)(-)從第一個(gè)數(shù)中減去后面所有數(shù)的和,即[num1-(num2+num3+...)]。如:Command:(-2814)返回:14Command:(-25711)返回:7Command:(-502010.0)返回:20.0Command:(-20.030.0)返回:-10.06/4/202320

3.乘運(yùn)算格式:(*num1num2num3...)

4.除運(yùn)算格式:(/num1num2num3...)“除”函數(shù)以第一個(gè)數(shù)除以其他所有運(yùn)算數(shù)的積,即[num1/(num2*num3*...)]。例如:(*2532.0)返回:60.0(*253)返回:30(/32)(Setqa(/3.02))返回:1.56/4/2023215.增量格式:(1+number)注意:1和“+”之間不能空格,+與number之間必須要空格。6.減量格式:(1-number)注意:1和“-”之間不能空格,-與number之間必須要空格。例如:(setqb(1+-12.5))(setqc(1--16.4))6/4/202322舉例:1.求a,b,c三個(gè)數(shù)的平方和。2.根據(jù)前后視讀數(shù),求兩點(diǎn)間高差。3.求閉合水準(zhǔn)線路的高差閉合差。6/4/202323參考答案1:(setqa(getreal"輸入第一個(gè)數(shù)a:"))(setqb(getreal"輸入第二個(gè)數(shù)b:"))(setqc(getreal"輸入第三個(gè)數(shù)c:"))(setqs(+(*aa)(*bb)(*cc)))參考答案2:(setqa(getreal"輸入后視讀數(shù)a:"))(setqb(getreal"輸入前視讀數(shù)b:"))(setqh(-ab))6/4/202324參考答案3:(setqn(getint"輸入高差個(gè)數(shù):"))(setqfh0.0)(repeatn(setqh(getreal"\n依次輸入高差:"))(setqfh(+fhh)))6/4/202325二、標(biāo)準(zhǔn)函數(shù)

1.絕對(duì)值(abs)、平方根(sqrt)、正弦(sin)、余弦(cos)、反正切(atan)

以上函數(shù)格式:(函數(shù)名<數(shù)或表達(dá)式>)2.冪函數(shù)(expt)、(exp)格式:(expt底數(shù)冪)格式:(exp底數(shù)<數(shù)或表達(dá)式>)

注意:以上各函數(shù)返回的數(shù)值類(lèi)型。3.舉例6/4/202326舉例:用AutoLISP表示下列公式:(1)計(jì)算三角高程的表達(dá)式

(2)計(jì)算坐標(biāo)增量的表達(dá)式(3)將度化成弧度單位6/4/202327參考答案:(1)(setqHA(getreal"輸入HA:"))(setqL(getreal"輸入L:"))(setqAF(getreal"輸入AF:"))(setqi(getreal"輸入i:"))(setqv(getreal"輸入v:"))(setqHB1(+HA(-iv)))(setqHB2(*L(sinaf)))(setqHB(+HB1HB2))6/4/202328參考答案:(3)(setqaf(getreal“輸入af:”));af是整度數(shù)(setqaf(/180(*piaf)))如何將度分秒化成弧度?6/4/202329三、賦值函數(shù)

賦值函數(shù)有兩個(gè):setq和set1.setq

格式:(setq變量1表達(dá)式1變量2表達(dá)式2…)賦給變量的值可以是任何表達(dá)式(數(shù)值、字符串、字母)。注意:不要用AutoLISP的函數(shù)名和常數(shù)當(dāng)作變量。舉例:(1)(setqa32b33.26c"yes")(2)(setqa(sin(/pi4)))(3)(setqx34.3y5.23p(listxy))(4)(setqpt(getpoint"\n輸入一點(diǎn):"))6/4/2023302.set與setq不同之處,是set為符號(hào)賦值,setq為變量賦值。如:(set‘a(chǎn)9)結(jié)果a為9此函數(shù)非常有用,和其它函數(shù)配合使用,可以得到一維數(shù)組。舉例:(1)(set(read(getstring"\n輸入點(diǎn)名:"))(getpoint"\n輸入點(diǎn)坐標(biāo):"))(2)(set(read(getstring"\n輸入變量名:"))(getreal"\n輸入變量值:"))6/4/202331四、字符串處理函數(shù)1.strcat格式:(strcat串1串2...)把“串1”、“串2”、…等連成一個(gè)新的字符串。如:(strcat"a""bout")返回"about"(strcat"a""b""c")返回"abc"(strcat"a""""c")返回"ac“2.strlen格式:(strcat字符串)此函數(shù)求“字符串”長(zhǎng)度。如:(strlen"one""two""three")返回11

6/4/2023323.substr格式:(substr字符串起點(diǎn)長(zhǎng)度)此函數(shù)將返回“字符串”的子字符串。子串的起始位置是以“起點(diǎn)”確定,子串長(zhǎng)度由“長(zhǎng)度”指定。如果“長(zhǎng)度”沒(méi)有設(shè)定,則子串將從“起點(diǎn)”到最后?!捌瘘c(diǎn)”和“長(zhǎng)度”均須為正整型數(shù)。如:(substr"abcde"2)返回"bcde"(substr"abcde"32)返回"cd"6/4/202333五、類(lèi)型轉(zhuǎn)換函數(shù)1.fix格式:(fixnumber)此函數(shù)將number變?yōu)檎蛿?shù)。如果number是實(shí)型數(shù),則舍去小數(shù)部分。如:(fix3)返回3(fix3.7)返回36/4/2023342.float格式:(floatnumber)此函數(shù)將number變?yōu)閷?shí)型數(shù)。如:(float3)返回3.0(float3.75)返回3.753.atoi格式:(atoi字符串)此函數(shù)可用來(lái)將字符串轉(zhuǎn)換成整型數(shù)。如:(atoi"97")返回976/4/2023354.atof格式:(atof字符串)此函數(shù)可用來(lái)將字符串轉(zhuǎn)換成實(shí)型數(shù)。如:(atof"67.9")返回67.9(atof“97”)返回97.05.itoa格式:(itoa整型數(shù))此函數(shù)將整型數(shù)轉(zhuǎn)換成字符串。如:(itoa56)返回“56”6/4/2023366.rtosrtos函數(shù)將按給定的方式和精度把數(shù)轉(zhuǎn)換為字符串。格式:(rtos數(shù)方式精度)方式:有五種,其代碼分別是1、2、3、4、5(只要掌握2)。精度:是制小數(shù)位數(shù)。例如:(setqA(rtos5.7892524))返回"5.7893"(setqA(rtos45.2321))返回"45.2"6/4/2023377.(angtos角度[模式[精度]])把弧度轉(zhuǎn)換為度(取整度)注意:(1)角度以弧度表示;(2)模式是0~4的整數(shù);(0十進(jìn)制;1度分秒;2梯度;3弧度;4測(cè)量單位)(3)精度是一整數(shù),表示十進(jìn)制數(shù)小數(shù)位;(4)角度為負(fù)時(shí),angtos自動(dòng)將其還原成0~2之間的正值。例:(angtos0.785398)(atof(angtos0.52802))與angtos互補(bǔ)的函數(shù)(angtof"32")6/4/2023388.chr格式:(chrinteger)此函數(shù)是將integer中的ASCII碼轉(zhuǎn)換成單一的對(duì)應(yīng)字符串。如:(chr97)返回"a"(chr65)返回“A"(chr66)返回"B“9.ascii格式:(ascii字符串)此函數(shù)是將字符串轉(zhuǎn)換成ASCII。如:(ascii“A”)返回656/4/20233910.read格式:(read字符串)此函數(shù)將返回字符串的第一個(gè)表或原子。如:(read"(1245)(15.3628.478)")返回(1245)(read"48.6534.8")返回48.6511.Cvunit格式:(Cvunit數(shù)值舊單位新單位)(cvunit2.3"minute“"second")返回138.0(cvunit1"meter^3”"inch^3")返回61023.76/4/202340舉例1:;;;得到一組點(diǎn),如:P1、P2、等等(defunc:pt()(setqn(getint“\n輸入n值:"))(setqm1)(repeatn(set(read(getstring"\n輸入點(diǎn)名:"))(getpoint"\n輸入點(diǎn)坐標(biāo):"))(setqm(1+m))))6/4/202341舉例2:將度分秒化為弧度;把度分秒化成弧度(defunhd()(setqa(getstring"\nA:"));輸入角度(按6.3628形式輸入)(cond((=(strlena)6);;(strlena)求a的長(zhǎng)度(setqad(substra11));;以字符串形式保存角的度數(shù)(setqam(substra32));;以字符串形式保存角的分?jǐn)?shù)(setqas(substra52));;以字符串形式保存角的秒數(shù))((=(strlena)7)(setqad(substra12))(setqam(substra42))(setqas(substra62)))6/4/202342((=(strlena)8)(setqad(substra13))(setqam(substra52))(setqas(substra72))))(setqa1(atofad));;把a(bǔ)d轉(zhuǎn)換為實(shí)數(shù)(setqa2(atofam));;把a(bǔ)m轉(zhuǎn)換為實(shí)數(shù)(setqa3(atofas));;把a(bǔ)s轉(zhuǎn)換為實(shí)數(shù)(setqar(+a1(/a260)(/a33600)))(setqard(/(*arpi)180))(princard)(princ))6/4/202343六、求值函數(shù)1.距離(distance)格式:(distance點(diǎn)1點(diǎn)2)求出兩點(diǎn)之間的距離,結(jié)果是實(shí)型數(shù)。如:(distance’(12)’(73))返回:6.082763(distance’(1.02.53.0)’())返回:8.99389(空間距離)6/4/2023442.angle函數(shù)是求點(diǎn)1到點(diǎn)2的方向與X軸正向的夾角(α),如圖,單位是弧度。格式:(angle點(diǎn)1點(diǎn)2)(angle‘(51)‘(21))返回:3.141593α6/4/2023453.polar函數(shù)

polar函數(shù)以一個(gè)給定角度和一個(gè)與給定點(diǎn)的距離來(lái)定義一個(gè)新點(diǎn),如下圖所示。其中角用弧度表示,并以逆時(shí)針?lè)较驕y(cè)量為正。polar函數(shù)的格式:(polar點(diǎn)角度距離)(setqpt2(polar‘(2.03.0)pi100))返回:(-98.03.0)(setqp2(polar'(100100)(/pi2)50))返回:(100.0150.0)6/4/2023464.eval格式:(eval表達(dá)式)此函數(shù)求出表達(dá)式結(jié)果。如:(setqa56b45.3)(evala)(evalb)提示:eval和strcat、read、setq等函數(shù)配合用,可以建立一個(gè)一維數(shù)組。例如:建立一維數(shù)組xi(i=1,2,…,n)。6/4/202347(setqn(getint"\n輸入一個(gè)整數(shù):"))(setqi0s0)(repeatn(setqi(1+i))(set(read(strcat"x"(itoai)))(getreal"\n輸入一個(gè)實(shí)數(shù):"))(setqs(+s(eval(read(strcat"x"(itoai)))))))此程序運(yùn)行結(jié)果可以得到:x1,x2,…xn。S=x1+x2+…+xn。6/4/202348七、表處理函數(shù)1.list函數(shù)2.car函數(shù)格式:(car表)返回一個(gè)列表中的第一個(gè)元素的數(shù)值(X元素)。如果該列表中沒(méi)有任何元素,則返回空值nil。3.cadr函數(shù)返回一個(gè)列表的第二個(gè)元素(Y元素)。4.last函數(shù)返回一個(gè)列表的最后一個(gè)元素。5.(nth<n>表)返回表中第n個(gè)元素(n從0算起)。6/4/2023491.(setqp(getpoint“\n輸入一點(diǎn):”))(setqx(carp)y(cadrp))舉例:2.(setqp'(GPS13456.78623415.67434.567))(setqdh(carp)x(cadrp)y(nth2p)z(lastp))6/4/202350八、Command函數(shù)

Command函數(shù)是AutoLISP中唯一調(diào)用AutoCAD命令實(shí)現(xiàn)繪圖的途徑,非常重要。1.作用:使用Command函數(shù)(唯一)可調(diào)用AutoCAD命令。2.格式:(Command“AutoCAD命令及其選項(xiàng)”)

如:(setqp1'(100.453100.567)p2'(200.254201.587))(command"line"p1p2"")6/4/2023513.注意事項(xiàng)(1)Command函數(shù)不能調(diào)用AutoLISP的輸入函數(shù),如getpoint、getangle、getstring、getint等。(2)AutoCAD命令名稱(chēng)和選項(xiàng)必需放在雙引號(hào)中,并要求雙引號(hào)中不能有空格。(3)不帶“AutoCAD命令及其選項(xiàng)”,即(command),等效ESC鍵(中止)。(4)幾個(gè)命令和數(shù)據(jù)可以寫(xiě)在一個(gè)command函數(shù)中,也可分開(kāi)寫(xiě)在兩個(gè)或兩個(gè)以上的command函數(shù)中。如:(Command“l(fā)ine”p1p2p3p4“”)和(Command“Pline”p1p2)(Commandp3p4“”)等效。6/4/202352(5)文字注記時(shí),字符串也要用“”括起來(lái)。如:(Command“Text”‘(100100)5“”“AutoLISP”)(6)調(diào)用對(duì)話(huà)框命令時(shí),不顯示對(duì)話(huà)框,以提示方式執(zhí)行。如:新建“控制點(diǎn)”圖層,設(shè)置圖層為紅色。(command"layer""m""控制點(diǎn)""c"1"""")6/4/202353舉例:畫(huà)一個(gè)邊長(zhǎng)為L(zhǎng),中心點(diǎn)坐標(biāo)為P的正三角形,要求底邊水平。

(setqL(getreal"\n輸入邊長(zhǎng):"))(setqP(getpoint"\n輸入中心:"))(setqr(*0.288675134L));求內(nèi)切圓半徑12r*r=L*L(command"polygon"3P"c"R)6/4/202354§3.3自定義命令和自定義函數(shù)

一、自定義函數(shù)(defun)

用函數(shù)(defun)可以定義用戶(hù)自己的函數(shù),叫自定義函數(shù)。自定義函數(shù)象AutoLISP函數(shù)一樣可以被調(diào)用,比如說(shuō),把常用的符號(hào)定義成自定義函數(shù),實(shí)際用時(shí),帶入具體參數(shù)就可以得到圖形,不別再繪制。6/4/2023551.自定義函數(shù)格式(defun函數(shù)名變?cè)肀磉_(dá)式1表達(dá)式2┇)例:用自定義函數(shù)方式編寫(xiě)一個(gè)程序,繪制正三角形。(defunsjx()(setqL(getreal"\n輸入邊長(zhǎng):"))(setqP(getpoint"\n輸入中心:"))(setqr(*0.288675134L));求內(nèi)切圓半徑12r*r=L*L(command"polygon"3P"c"R))6/4/2023562.注意

(1)函數(shù)名是用戶(hù)自己設(shè)定的,不能與AutoLISP內(nèi)部函數(shù)名、變量名相同;(2)變?cè)淼男问接兴姆N:(參數(shù)1參數(shù)2…),如上例。變?cè)頌榇诵问綍r(shí),調(diào)用要帶參數(shù)。(),無(wú)參形式。調(diào)用時(shí)不帶參數(shù)。(參數(shù)1參數(shù)2…/局部變量1局部變量2…)。變?cè)頌榇诵问綍r(shí),調(diào)用要帶參數(shù)。(/局部變量1局部變量2…)。調(diào)用時(shí)不帶參數(shù)。/與參數(shù)、局部變量之間必須有空格。

6/4/202357(3)表達(dá)式是函數(shù)的定義體,完成計(jì)算和繪圖。(4)自定義函數(shù)的作用:defun函數(shù)用于在AutoLISP程序中定義一個(gè)函數(shù)。它就象其它標(biāo)準(zhǔn)函數(shù)一樣,可以為我所用。使用時(shí),通過(guò)不同的參數(shù),可以繪制不同的圖形。調(diào)用自定義函數(shù)舉例:;度化弧度自定義函數(shù)(defunhd(af)(setqhhd(/(*afpi)180)))6/4/202358(defunhsjx()(setqL(getreal"\n輸入邊長(zhǎng):"))(setqP(getpoint"\n輸入中心:"))(setqr(*0.288675134L))

;求內(nèi)切圓半徑(setqp1(polarP(hd210)(*2r)));調(diào)用自定義函數(shù)(setqp2(polarp1(hd0)L));調(diào)用自定義函數(shù)(setqp3(polarp1(hd60)L));調(diào)用自定義函數(shù)(command"line"p1p2p3"c"))6/4/202359二、自定義命令

自定義命令的作用是用defun函數(shù)為AutoCAD增加各種新命令。

1.格式(defunC:×××()<表達(dá)式1><表達(dá)式2>┇)或(defunC:×××(/<局部變量1><局部變量2>…)<表達(dá)式1><表達(dá)式2>┇)6/4/2023602.注意事項(xiàng)(1)自定義命令格式中×××是命令名稱(chēng);必須有C:(大小寫(xiě)等效);×××與C:之間不能有空格。(2)×××不能和內(nèi)部或外部函數(shù)名相同;也不能和其它命令同名。(3)注意與自定函數(shù)的區(qū)別。3.自定義命令調(diào)用加載(load)程序后,在命令行上輸入自定義命令名×××。6/4/202361例.編寫(xiě)計(jì)算三角高程的AutoLISP程序。程序清單如下:;計(jì)算三角高程(defunc:sjgc()(hd);調(diào)用自定義函數(shù)hd(setqL(getreal”\n斜邊邊長(zhǎng):”))(setqi(getreal”\n儀器高:”))(setqv(getreal”\n覘標(biāo)高:”))(setqh1(*L(sinard)))(setqh2(-iv))(setqh(+h1h2)))6/4/202362;把度分秒化成弧度(defunhd()(setqa(getstring"\nA:"));輸入角度(按6.3628形式輸入)(cond((=(strlena)6)(setqad(substra11))(setqam(substra32))(setqas(substra52)))((=(strlena)7)(setqad(substra12))(setqam(substra42))(setqas(substra62)))((=(strlena)8)(setqad(substra13))(setqam(substra52))(setqas(substra72))))(setqa1(atofad))(setqa2(atofam))(setqa3(atofas))(setqar(+a1(/a260)(/a33600)))(setqard(/(*arpi)180))(princard)(princ))6/4/202363§3.4程序結(jié)構(gòu)函數(shù)

程序結(jié)構(gòu)函數(shù)用于控制程序的進(jìn)程,把它叫程序結(jié)構(gòu)函數(shù)。包括:關(guān)系函數(shù)、邏輯函數(shù)、謂詞函數(shù)、條件函數(shù)、循環(huán)函數(shù)。一、關(guān)系函數(shù)

1.等于

格式:(=atom1atom2...)等于函數(shù)(=)判斷數(shù)是否相等。如果相等則條件為真,返回值為T(mén)(真值)。同樣,如果不相等,則條件為假,返回值為nil(假值)。

6/4/202364

2.不等于格式:(/=atom1atom2...)不等于函數(shù)(/=)判斷數(shù)是否不相等。如果不相等,則條件為真,返回值為T(mén)。3.小于格式:(<atom1atom2...)小于函數(shù)(<)判斷前一個(gè)數(shù)(atom1)是否小于后面的作數(shù)(atom2),如果小于,則條件為真,返回值為T(mén),否則返回nil。6/4/202365

4.小于等于格式:(<=atom1atom2....)小于等于函數(shù)(<=)判斷第一個(gè)數(shù)是否小于或等于第個(gè)數(shù)(atom2),如果小于或等于,則條件為真,返回值為T(mén),否則返回nil。5.大于格式:(>atom1atom2...)大于函數(shù)判斷第一個(gè)數(shù)是否大于第二個(gè)數(shù),如果大于,則條件為真,返回值為T(mén),否則返回nil。6.大于等于格式:(>=atom1atom2...)6/4/202366二、邏輯函數(shù)

1.邏輯“與”格式:(and表達(dá)式1…)這個(gè)函數(shù)求出表達(dá)式之間的“與”運(yùn)算值,即當(dāng)所有表達(dá)式值同時(shí)為T(mén)時(shí),函數(shù)結(jié)果為T(mén),如果其中任何一個(gè)表達(dá)式值為nil,函數(shù)結(jié)果為nil。例如:(setqa10b20)(and(>a5)(<a15))結(jié)果為T(mén)(and(>b5)(<b15))結(jié)果為nil6/4/202367

2.邏輯“或”格式:(or表達(dá)式1…)這個(gè)函數(shù)求出表達(dá)式之間的“或”運(yùn)算值,即當(dāng)所有表達(dá)式值同時(shí)為nil時(shí),函數(shù)結(jié)果為nil,如果其中任何一個(gè)表達(dá)式值為T(mén),函數(shù)結(jié)果為T(mén)。例如:(setqa10b20)(or(<a5)(>a15))結(jié)果為nil(or(<b5)(>b15))結(jié)果為T(mén)6/4/2023683.邏輯“非”格式:(not數(shù)或表達(dá)式)這個(gè)函數(shù)求出表達(dá)式之間的“非”運(yùn)算值,即當(dāng)“數(shù)或表達(dá)式”值為nil時(shí),函數(shù)結(jié)果為T(mén),否則函數(shù)結(jié)果為NIL。例如:(setqa10b20cnil)(nota)結(jié)果為nil(notc)結(jié)果為T(mén)(not(or(<a5)(>a15)))結(jié)果為T(mén)(not(or(<b5)(>b15)))結(jié)果為nil6/4/202369三、數(shù)據(jù)謂詞函數(shù)和等值謂詞函數(shù)(自學(xué))四、條件函數(shù)和順序處理函數(shù)

1.If函數(shù)格式:(If<測(cè)試式><式1><式2>)6/4/202370舉例:(1)(If(=13)“YES”“NO”)結(jié)果為“NO”(2)(setqa15)(If(and(>=a10)(<=a18))(setqd3)(setqc10))結(jié)果D為3。6/4/2023712.cond函數(shù)格式:(cond<測(cè)試式1><結(jié)果1><測(cè)試式2><結(jié)果2>┇<測(cè)試式n><結(jié)果n>)<測(cè)試式i>是邏輯表達(dá)式,<結(jié)果i>為一個(gè)或多個(gè)表達(dá)式。執(zhí)行過(guò)程見(jiàn)圖。6/4/202372舉例:(setqd0.3)(cond((and(>=d0.2)(<=d0.4))(setqc10))((and(>=d0.5)(<=d1.0))(setqc9.0))((<d0.6)(setqc9.0)))運(yùn)行結(jié)果為C=10。6/4/2023733.progn函數(shù)progn函數(shù)通常和If函數(shù)一道用,來(lái)控制計(jì)算順序。格式:(prong表達(dá)式1…)舉例:(setqa15b15.0)

(if(=ab)(princ“大家好!”)(setqa(+a1)b(+b1))

)運(yùn)行結(jié)果是:大家好!a=15,b=15.0(setqa15b15.0)

(if(=ab)

(progn(princ“大家好!”)(setqa(+a1)b(+b1))

)

)運(yùn)行結(jié)果是:大家好!a=16,b=16.06/4/202374五、循環(huán)函數(shù)

有兩個(gè)循環(huán)函數(shù):repeat、while。

1.Repeat函數(shù)格式:(Repeat數(shù)表達(dá)式1…)數(shù):必須是正整數(shù)。

表達(dá)式:是循環(huán)體,循環(huán)次數(shù)由數(shù)來(lái)決定。最后返回表達(dá)式的值。舉例:(setqa10b100)(repeat4(setqa(+a10))(setqb(+b100)))6/4/2023752.while函數(shù)格式:(while<測(cè)試式>表達(dá)式1…)

執(zhí)行過(guò)程:先計(jì)算<測(cè)試式>,若為T(mén),則計(jì)算后面若干個(gè)表達(dá)式(循環(huán)體);若為NIL,則退出循環(huán)體。舉例:按要求畫(huà)下列圖形。

6/4/202376(defunC:HY()(setqP0(getpoint"圓心1:"))(setqR(getreal"半徑:"))(setqL(g

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論