lisp函數(shù)大全詳解
AutoLISP提供了大量的預(yù)定義函數(shù)。若將函數(shù)名(大小寫都可)作為表中的第一個元素函數(shù)變元(若有的話)作為表中后面的元素,就可以調(diào)用那個函數(shù)。本章按字母順序列出AutoLISP所有基本函數(shù)。用戶會發(fā)現(xiàn)其中許多函數(shù)都是標(biāo)準(zhǔn)函數(shù),可在LISP程序設(shè)計語言中找到。還有一些函數(shù)是由 AutoCAD提供的且專用于交互圖形環(huán)境。
1 FLATLAND 系統(tǒng)變量--與老版本的兼容性
AutoLISP版本10支持AutoCAD的最新增強型三維圖形功能,則時繼續(xù)保證與AutoCAD 老版本的兼容性。FLATLAND系統(tǒng)變量就是用來控制該兼容性的。當(dāng)FLATLAND為零時,實現(xiàn)新三維功能;否則各函數(shù)操作與AutoLISP版本9的一樣。FLATLANDR的設(shè)置作用于下列
AutoLISP函數(shù):
DISTANCE GRREAD POLAR
ENTGET INITGET TBLNEXT
GETDIST INTERS TBLSEARCH
GETPOINT OSNAP
在各函數(shù)說明中,已注明FLATLAND對上述函數(shù)起作用的方式。
2 ( + 《數(shù)》 《數(shù)》 。。。)
這個函數(shù)返回所有《數(shù)》的總和。其中的《數(shù)》可以是整型或?qū)嵭偷?。如果所有的《?shù)》都是整數(shù),其結(jié)果也是整數(shù);如果其中有一個是實型的,那么其它整型數(shù)將轉(zhuǎn)換為實型
數(shù)結(jié)果將是實型數(shù)。例如:
?。? 1 2) returns 3
(+ 1 2 3 4.5) returns 10.5
?。? 1 2 3 4.0) returns 10.0
3 ( - 《數(shù)》 《數(shù)》 。。。)
這個函數(shù)把第一個《數(shù)》減去第二個《數(shù)》,返回它們的差。如果給定的《數(shù)》多于兩個,那么將第一個《數(shù)》減去其后所有數(shù)之和,并返回最后的結(jié)果。如果只給了一個《數(shù)》,即返回零減這個《數(shù)》的結(jié)果。此函數(shù)中的《數(shù)》可以是實型或整型,按標(biāo)準(zhǔn)規(guī)則進(jìn)行類型轉(zhuǎn)換。
例如:
(- 50 40) returns 10
?。? 50 40.0 2) returns 8.0
?。? 50 40.0 2.5) returns 7.5
?。? 8) returns -8
4 (* 《數(shù)》 《數(shù)》。。。)
這個函數(shù)返回所有《數(shù)》的乘積。其中《數(shù)》可以是實型或整型。按標(biāo)準(zhǔn)規(guī)則進(jìn)行類型轉(zhuǎn)換
例如:
?。? 2 3) returns 6
(* 2 3 4.0) returns 24.0
?。? 3 -4.5) returns -13.5
5 (/ 《數(shù)》 《數(shù)》。。。)
這個函數(shù)將第一個《數(shù)》除以第二個《數(shù)》,返回其商。如果給出的《數(shù)》多于兩個,則把第一個《數(shù)》除以其它所有《數(shù)》的乘積,并返回最后的商。此函數(shù)中的《數(shù)》可以是實型或整型,類型的轉(zhuǎn)換按標(biāo)準(zhǔn)規(guī)則進(jìn)行。例如:
?。? 100 2) returns 50
?。? 100 2.0) returns 50.0
?。? 100 20.0 2) returns 2.5
?。? 135 360) returns 0
?。? 135 360.0) returns 0.375
6 (= 《原子》 《原子》。。。)
這是“等于”關(guān)系函數(shù)。如果所有指定的《原子》在數(shù)值上是相等的,則返回T;否則返回空(nil)。這個函數(shù)適用于數(shù)和字符串。例如:
?。? 4 4.0) returns T
?。? 20 388) returns nil
?。? 2.4 2.4 2.4) returns T
?。? 499 499 500) returns nil
?。? “me” “me”) returns T
?。? “me” “you”) returns nil
7 (/= 《原子1》 《原子2》。..)
這是一個“不等于”關(guān)系函數(shù)。如果《原子1》數(shù)值上不等于《原子2》,則返回T;否則返回nil,如果提供的《變元》多于兩個,則函數(shù)無定義。例如:
?。?= 10 20) returns T
(/= “you” “you”) returns nil
?。?= 5.43 5.44) returns T
8 (《 《原子》 《原子》。。。)
這是一個“小于”關(guān)系函數(shù)。如果第一個《原子》值小于第二個,則返回T;否則返回nil,如果所給的《原子》多于兩個,那么當(dāng)每個《原子》都小于其右邊的《原子》時,則返回T.
例如:
?。ā?10 20) returns T
?。ā?“b” “c”) returns T
?。ā?357 33.2) returns nil
(《 2 3 88) returns T
?。ā?2 3 4 4) returns nil
9 (《= 《原子》 《原子》。。。)
這是一個“小于或等于”關(guān)系函數(shù)。如果第一個《原子》值大于或等于第二個原子,則返回T;否則返回nil.如果所給的《原子》多于兩個,則當(dāng)每一個《原子》都小于或等于其右邊的《原子》時,才返回T.例如:
?。ā? 10 20) returns T
?。ā? “b” “b”) returns T
?。ā? 357 33.2) returns nil
(《= 2 9 9) returns T
?。ā? 2 9 4 5) returns nil
10 (》 《原子》 《原子》。。。)
這是一個“大于”關(guān)系函數(shù)。如果第一個《原子》值大于第二個,則返回T;否則返回nil,若所給定的《原子》多于兩個,當(dāng)每個《原子》都大于其右邊的《原子》時,則返回T. 例如:
?。ā?120 17) returns T
?。ā?“c” “b”) returns T
?。ā?3.5 1792) returns nil
?。ā?77 4 2) returns T
?。ā?77 4 4) returns nil
#e#
11 (》= 《原子》 《原子》。。。)
這是一個“大于或等于”關(guān)系函數(shù)。如果第一個《原子》值大于或等于第二個,則返回T,否則返回nil.如果給出的《原子》多于兩個,當(dāng)每一個《原子》都大于或等于其右邊的《原子》時才返回T. 例如:
?。ā? 120 17) returns T
?。ā? “c” “c”) returns T
(》= 3.5 1792) returns nil
?。ā? 77 4 4) returns T
?。ā? 77 4 9) returns nil
12 (~ 《數(shù)》)
這個函數(shù)返回《數(shù)》的按位非(NOT),即補碼?!稊?shù)》必須為整數(shù)。例如:
?。▇ 3) returns -4
(~ 100) returns -101
?。▇ -4) returns 3
13 (1+ 《數(shù)》)
這個函數(shù)返回《數(shù)》加1(增量)的結(jié)果。 《數(shù)》可以是實數(shù)或整數(shù)。 例如:
?。?+ 5) returns 6
?。?+ -17.5) returns -16.5
14 (1- 《數(shù)》)
這個函數(shù)返回《數(shù)》加1(增量)的結(jié)果。 《數(shù)》可以是實型或整型數(shù)。 例如:
?。?- 5) returns 4
?。?- -17.5) returns -18.5
15 (abs 《數(shù)》)
這個函數(shù)返回《數(shù)》的絕對值。 《數(shù)》可以是實型數(shù)或整型的。 例如:
?。╝bs 100) returns 100
?。╝bs -100) returns 100
(abs -99.25) returns 99.25
16 (and 《表達(dá)式》。。。)
這個函數(shù)返回所列出的表達(dá)式的邏輯“與”(AND)。 如果其中任何一個表達(dá)式的結(jié)果等于nil,則停止求值并返回《nil》;否則返回T. 例如,對于下面給定的賦值:
(setq a 103)
(setq b nil)
(setq c “string”)
那么
(and 1.4 a c) returns T
(and 1.4 a b c) returns nil
17 (angle 《點1》 《點2》)
這個函數(shù)返回從UCS坐標(biāo)系統(tǒng)點《pt1》到UCS坐標(biāo)系統(tǒng)《pt2》的一直線的角度,該角度從當(dāng)前作圖平面的X軸開始反時針方向計算(以弧度為單位)。 如果提供了三維點,則將其投影至當(dāng)前作圖平面。 例如:
(angle ‘(1.0 1.0) ’(1.0 4.0)) return 1.5708
?。╝ngle ‘(5.0 1.33) ’(2.4 1.33)) return 3.14159
18 (angtos 《角》 [ 《方式》 [ 《精度》 ] ] )
這個函數(shù)處理《角》(實型數(shù),單位為弧度),返回一個對應(yīng)于《角》的字符串。該字符串是根據(jù)所設(shè)置的《方式》、《精度》及AutoCAD DIMZIN變量,對《角》編輯后所得。 其中《方式》變元是一個整型數(shù),它指示完成什么類型的編輯,如下所示:
ANGTOS方式 編輯格式
-----------------------------------------
0 度
1 度/分/秒
2 梯度
3 弧度
4 測地單位
其中《精度》變元是一個整型數(shù),它選擇所需要的十進(jìn)制精度的小數(shù)位數(shù)。 《方式》和《精度》與AutoCAD系統(tǒng)變量AUNITS和AUPREC相對應(yīng),如果沒有指明《方式》和《精度》,則使用AUNITS和AUPREC的當(dāng)前值。
例如,已知DIMZIN=0和下面的賦值:
?。╯etq pt1 ‘(5.0 1.33))
?。╯etq pt2 ’(2.4 1.33))
?。╯etq a (angle pt1 pt2))
那么,
(angtos a 0 0) returns “180”
?。╝ngtos a 0 4) returns “180.0000”
?。╝ngtos a 1 4) returns “180d0‘0” “
(angtos a 3 4) returns ”3.1416r“
?。╝ngtos a 4 2) returns ”W“
ANGTOS可接受一負(fù)《角》變元,但總是先將其化為相當(dāng)?shù)恼担ㄔ? ~ 2π弧度間),然后再執(zhí)行指定的變換。 例如:
(angtos 0.785398 0 4) returns ”45.0000“
?。╝ngtos -0.785398 0 4) returns ”315.0000“
19 (append 《表達(dá)式》。。。)
這個函數(shù)將所有的表( 《表達(dá)式》 )放置在一起,作為一個表。 例如:
?。╝ppend ’(a b) ‘(c d)) returns (a b c d)
(append ’((a)(b)) ‘((c)(d))) returns ((a)(b)(c)(d))
APPEND需要的變元必須是表。
20 (apply 《函數(shù)》 《表》)
它執(zhí)行由《函數(shù)》給定的函數(shù),《表》指定了函數(shù)的變元。 例如:
(apply ’+ ‘(1 2 3)) return 6
?。╝pply ’strcat ‘(”a“ ”b“ ”c“)) return ”abc“
APPLY既可用于內(nèi)部函數(shù)(子程序),也可用于用戶定義的函數(shù)(即那些用DEFUN或者LAMBDA產(chǎn)生的函數(shù))。
21 (ascii 《字符串》 )
這個函數(shù)返回《字符串》中第一個字符的ASCII字符碼(整數(shù))。它和BASIC語言中的ASC函數(shù)相似。 例如:
?。╝scii ”A“) return 65
?。╝scii ”a“) return 97
(ascii ”BIG“) return 66
22 (assoc 《項》 《關(guān)聯(lián)表》 )
這個函數(shù)在《關(guān)聯(lián)表中》以《項》作為關(guān)鍵字進(jìn)行搜索,返回《關(guān)聯(lián)表》中對應(yīng)元素的值。如果在關(guān)聯(lián)表中找不到作為關(guān)鍵字的《項》,ASSOC返回nil. 例如,假設(shè)表”al“定義為:
?。ǎ?name box) (width 3) (size 4.7263) (depth 5) )
那么,
?。╝ssoc ’size a1) returns (size 4.7263)
(assoc ‘weight a1) returns nil
關(guān)聯(lián)表常用于儲存數(shù)據(jù),這些數(shù)據(jù)可通過”關(guān)鍵字“存取。它和程序設(shè)計語言的數(shù)組或結(jié)構(gòu)相似。本章后面描述的SUBST函數(shù)提供了一種方便的方法可把關(guān)聯(lián)表中與關(guān)鍵字關(guān)聯(lián)的值進(jìn)行替換。
23 (atan 《數(shù)1》 [《數(shù)2》] )
如果沒有給出《數(shù)2》,ATAN將返回《數(shù)1》的反正切值,其單位為弧度?!稊?shù)1》可以為負(fù)值;返回的角度的范圍為:-pi 到 +pi弧度。 例如:
?。╝tan 0.5) returns 0.463648
?。╝tan 1.0) returns 0.785398
?。╝tan -1.0) returns -0.785398
(angtos (atan -1.0) 0 4) returns ”315.0000“
如果給出《數(shù)1》和《數(shù)2》,則返回《數(shù)1》/《數(shù)2》的反正切值,其單位為弧度。如果《數(shù)2》為零,即返回的角度值為1.570796弧度(90度或-90度),這取決于《數(shù)1》是正數(shù)還是負(fù)數(shù)。例如:
?。╝tan 2.0 3.0) returns 0.588003
(angtos (atan 2.0 3.0) 0 4) returns ”33.6901“
?。╝tan 2.0 -3.0) returns 2.55359
?。╝ngtos (atan 2.0 -3.0) 0 4) returns ”146.3099“
?。╝tan -2.0 3.0) returns -0.588003
?。╝tan -2.0 -3.0) returns -2.55359
(atan 1.0 0.0) returns 1.5708
?。╝ngtos (atan 1.0 0.0) 0 4) returns ”90.0000“
?。╝tan -0.5 0.0) returns -1.5708
?。╝ngtos (atan -0.5 0.0) 0 2) returns ”270.00“
24 (atof 《字符串》 )
這個函數(shù)將字符串換為實型數(shù)。 并返回此值。 例如:
?。╝tof ”97.1“) returns 97.1
?。╝tof ”3“) returns 3.0
25 (atoi 《字符串》 )
這個函數(shù)將字符串轉(zhuǎn)換為整數(shù),并返回此值。 例如:
?。╝toi ”97“) returns 97
(atoi ”3“) returns 3
?。╝toi ”3.9“) returns 3
26 (atom 《項》 )
如果《項》是一個表,此函數(shù)返回nil;否則返回T. 任何不是表的東西都被認(rèn)為是一個原子(atom)。 例如,對于以下的賦值:
?。╯etq a ’(x y z))
?。╯etq b ‘a(chǎn))
那么,
?。╝tom ’a) returns T
(atom a) returns nil
?。╝tom ‘b) returns T
?。╝tom b) returns T
?。╝tom ’(a b c)) returns nil
有些LISP對ATOM的解釋有差異,因此在使用互相移植的程序時要加以注意。
27 (Boole 《函數(shù)》 《整型1》 《整型2》 )
這是一個通用的位方式boolean函數(shù)。其中《func》是一個0到15之間的整數(shù),它表示16種可能的雙變量Boolean函數(shù)中的一種。后面的整型變元根據(jù)這個函數(shù)和下列的真值表進(jìn)行方式(即邏輯)組合:
《整數(shù)1》 《整數(shù)2》 《func》位
-----------------------------------------------------
0 0 8
0 1 4
1 0 2
1 1 1
《整數(shù)1》的每一位和《整數(shù)2》的相應(yīng)位配對,選擇真值表中的一水平行。其結(jié)果位是0或1,將取決于對應(yīng)真值表中這一行中《func》位的設(shè)置情況。如果《func》中位的設(shè)置適當(dāng),結(jié)果位就為1,否則結(jié)果位為0.
《func》的一些值等效于標(biāo)準(zhǔn)的Boolean操作:AND, OR , XOR和NOT,如下所示:
func 操作 結(jié)果位為1時的條件
--------------------------------------------------------
1 AND 兩個輸入位都為1
6 XOR 只有其中一個輸入位為1
7 OR 有一個或兩個輸入位為1
8 NOT 兩個輸入位都為0(即補碼)
例如:
?。˙oole 1 12 5)
指定了數(shù)12和5的邏輯”與“(AND)。其結(jié)果為4.同樣:
(Boole 6 6 5)
指定了數(shù)6和5的邏輯”異或“(XOR),返回結(jié)果為3
可以使用《func》的其他值來完成其它的Boolean操作,這些操作可能沒有標(biāo)準(zhǔn)名稱。例如,如果《func》為4,那么當(dāng)《整數(shù)2》中的位是1而《整數(shù)1》中的相應(yīng)位是零時,其結(jié)果位才為
1. 因此:
(Boole 4 3 14)
將返回結(jié)果12.
28 (boundp 《原子》 )
如果《原子》有一個值約束它(不管值的范圍),那么此函數(shù)返回T;若沒有值約束《原子》
(或受nil約束),則返回nil. 例如,對于下列賦值:
?。╯etq a 2)
(setq b nil)
那么:
?。╞oundp ‘a(chǎn)) returns T
?。╞oundp ’b) returns nil
29 caar, cadr, cddr, cadar等等
AutoLISP支持CAR和CDR的連接,其深度可達(dá)四級。 例如,已知賦值:
(setq x ‘((a b) c d))
那么:
?。╟aar x) is equivalent to (car (car x)) returning a
?。╟dar x) is equivalent to (cdr (car x)) returning (b)
(cadar x) is equivalent to (car (cdr (car x))) returning b
(cadr x) is equivalent to (car (cdr x)) returning c
?。╟ddr x) is equivalent to (cdr (cdr x)) returning (d)
?。╟addr x) is equivalent to (car (cdr (cdr x))) returning d
在AutoLISP中常使用CADR來取得二維點或三維點的Y坐標(biāo)(即由兩個或三個實數(shù)組成的表中第二個元素)。 同樣,使用CADDR可取得三維點的Z坐標(biāo)。 例如,已知賦值:
?。╯etq pt2 ’(5.25 1.0)) (a 2D point)
?。╯etq pt3 ‘(5.25 1.0 3.0)) (a 3D point)
那么:
?。╟ar pt2) returns 5.25
?。╟adr pt2) returns 1.0
(caddr pt2) returns nil
?。╟ar pt3) returns 5.25
?。╟adr pt3) returns 1.0
?。╟addr pt3) returns 3.0
30 (car 《表》 )
這個函數(shù)返回《表》的第一個元素。如果《表》是空的,則返回nil. 例如:
(car ’(a b c)) returns a
?。╟ar ‘((a b) c)) returns (a b)
?。╟ar ’( )) returns nil
31 (cdr 《表》 )
這個函數(shù)返回除《表》中第一個元素以外的所有元素的表。 如果《表》是空的,則返回nil.
例如:
?。╟dr ‘(a b c)) returns (b c)
?。╟dr ’((a b) c)) returns (c)
?。╟dr ‘()) returns nil
如果《表》變元是一個點對,即一對中間用點隔開的元素表(見下面的CONS),CDR則返回沒有表括號的第二個元素。 例如:
?。╟dr ’(a 。 b)) returns b
(cdr ‘(1 。 ”TEXT“)) returns ”TEXT“
32 (chr 《表》 )
這個函數(shù)把代表ASCII碼的整型數(shù)轉(zhuǎn)換為只有一個字符的字符串,并返回此結(jié)果(類似于BASIC中的CHR$函數(shù))。 例如:
?。╟hr 65) returns ”A“
(chr 66) returns ”B“
?。╟hr 97) returns ”a“
33 (close 《文件描述符》 )
這個函數(shù)關(guān)閉指定的文件,返回nil. 其中《文件描述符》是從調(diào)用OPEN函數(shù)得到的。 在CLOSE函數(shù)執(zhí)行之后,此文件描述符就不再有效。
例如,假設(shè)X是一個有效的打開文件的描述符。
?。╟lose x)
將關(guān)閉與X相關(guān)聯(lián)的文件,返回nil.
34 (command 《變元》。。。)
這個函數(shù)在AutoLISP內(nèi)部執(zhí)行AutoCAD命令,它總是返回nil. 其中《變元》代表AutoCAD
的命令及其子命令;對每一個變元都作處理,然后作為對相應(yīng)提示的響應(yīng)送給AutoCAD.命令名和選擇項作為字符串傳送,二維點作為兩個實數(shù)的表傳送,三維點作為三個實數(shù)的表傳送。只有當(dāng)AutoCAD發(fā)出”Command:“提示時,命令名才被AutoCAD識別。例如:
(setq pt1 ’(1.45 3.23))
?。╯etq pt2 (getpoint ”Enter a point: “))
?。╟ommand ”line“ pt1 pt2)
(command ”“)
假設(shè)AutoCAD的”Command:“提示已出現(xiàn),那么以上的表達(dá)式將為點”pt1“置值,提示用戶輸入點”pt2“,執(zhí)行AutoCAD的LINE命令,用兩點作為此命令的輸入.COMMAND的變元可以是字符串,實數(shù),整數(shù)或點,這要看AutoCAD命令執(zhí)行時需要什么。一個空字符串(”“)等效于在鍵盤上打一個空格。調(diào)用COMMAND而不加任何變元等效于在鍵盤上按CTRL-C鍵,它將取消AutoCAD的大多數(shù)命令。
如果AutoCAD系統(tǒng)變量CMDECHO(可通過SETVAR和GETVAR存?。┍恢脼榱?,那么從COMMAND函數(shù)中執(zhí)行的命令將不會在屏幕上顯示.COMMAND函數(shù)是在AutoLISP中調(diào)用AutoCAD命令的一種基本方法。
在COMMAND函數(shù)內(nèi)不能使用GETxxx用戶輸入函數(shù)(GETANGLE,GETSTRING,GETINT,GETPOINT等)。如果試圖用GETxxx函數(shù),則會顯示出錯信息:”error: AutoCAD rejected function“
?。鄢鲥e:AutoCAD拒絕執(zhí)行函數(shù)],并中止函數(shù)的執(zhí)行。如果需要提示,則應(yīng)提前發(fā)出GETxxx函
數(shù),如上例所示,或把它們放在幾個連續(xù)的COMMAND函數(shù)調(diào)用中間。
AutoCAD的DTEXT和SKETCH命令均能直接從鍵盤和數(shù)字化儀讀入,因此不能和AutoLISP的COMMAND函數(shù)一起使用。同樣,COMMAND函數(shù)不能用于執(zhí)行PLOT,PRPLOT或SCRIPT命令。
為用戶輸入暫停
如果在執(zhí)行AutoCAD命令過程中,預(yù)定義符號PAUSE是作為COMMAND函數(shù)的一個變元出現(xiàn)時,則會暫停COMMAND函數(shù)的進(jìn)程,等待用戶直接輸入或拖曳輸入。這類似于在菜單中具有
暫停功能的反斜杠。
若在暫停COMMAND函數(shù)時使用一條透明命令,COMMAND函數(shù)繼續(xù)暫停。這樣,當(dāng)暫停COMMAND
時用戶可隨心所欲地Z00M(縮放目標(biāo))或PAN(平移圖紙)。當(dāng)AutoCAD接收到有效輸入且不是
透明命令時,則返回COMMAND進(jìn)程并繼續(xù)往下執(zhí)行。 例如
(Command ”circle“ ”5,5“ pause ”line“ ”5,5“ ”7,5“ ”“)
先執(zhí)行circle命令,置圓心為(5,5),然后暫停以便屏幕上拖曳圓的半徑。當(dāng)拾取了所要
的點(或鍵入所要的半徑值)后,函數(shù)繼續(xù)執(zhí)行,畫一條從5,5到7,5的直線。
AutoLISP的PAUSE不能暫停菜單輸入。如果在COMMAND函數(shù)暫停時,激活了一個菜單項,
那么菜單項中的輸入值會滿足PAUSE的要求。如果還要暫停菜單項,則必須在菜單項中用一
個反斜杠。一旦發(fā)現(xiàn)了有效輸入,AutoCAD將會繼續(xù)執(zhí)行COMMAND函數(shù)和菜單項。
注意:
1. PAUSE符號當(dāng)前是由一個反斜杠組成的字串。用戶可直接使用一個反斜杠而不用
PAUSE符號;但若用一個菜單項調(diào)用COMMAND函數(shù),則反斜杠不會暫停COMMAND函數(shù),而暫停正在讀入的菜單項。 同樣,暫停機制在AutoLISP的將來版本中可能會有一個不同的觸發(fā)值。 因此我們建議使用PAUSE符號,而不宜顯式使用反斜杠。
2. 當(dāng)一條命令正在等待輸入正文串或?qū)傩灾禃r出現(xiàn)了PAUSE,那么只有在系統(tǒng)變量TEXTEVAL不為零時,AutoCAD才為輸入暫停。否則,認(rèn)為PAUSE符號(一個反斜杠)的值等效于正文輸入,且不為輸入暫停。
3. 當(dāng)COMMAND函數(shù)進(jìn)程被暫停時,該函數(shù)仍處于”激活“態(tài),所以用戶此時不可鍵入
另一個AutoLISP表達(dá)式進(jìn)行求值。
35 (cond ( 《測試1》 《結(jié)果1》 ) 。。。)
這個函數(shù)接受任意數(shù)目的表作為變元。它計算每一個表的第一項(按提供的表的順序),直到有一項的返回值不為nil為止。然后它計算測試成功的那個子表中后面的那些表達(dá)式,返回子表中最后那個表達(dá)式的值。如果子表中只有一個表達(dá)式(即沒有《結(jié)果》項);則返回
《測試》表達(dá)式的值.COND是AutoLISP中最基本的條件函數(shù)。
例如,下列的函數(shù)使用COND完成絕對值的計算:
?。╟ond ( (minusp a) (- a) )
?。?t a )
?。?/p>
如果”a“的值為-10,它將會返回10.如上所示,COND可以作為”Case“類型的函數(shù)。它常常用T作為缺省的《測試》表達(dá)式。下面是另一個簡單的例子。在符號S中用戶響應(yīng)的字符串是已知的,該函數(shù)測試用戶的響應(yīng),若用戶響應(yīng)是Y或y,則返回1;若響應(yīng)是N或n,則返回0;否則返回nil.
?。╟ond (( = s ”Y“) 1)
?。ǎ?= s ”y“) 1)
?。ǎ?= s ”N“) 0)
?。ǎ?= s ”n“) 0)
(t nil)
?。?/p>
36 (Cons 《新的第一個元素》 《表》 )
這是一個基本的表構(gòu)造函數(shù)。它將一個元素《新的第一個元素》加入《表》的開頭,并返回
加入之后的表。 例如:
?。╟ons ‘a(chǎn) ’(b c d)) returns (a b c d)
?。╟ons ‘(a) ’(b c d)) returns ((a) b c d)
注意,第一個元素可以是原子或是表。
CONS也可在《表》的變元位置上接受一個原子,用以構(gòu)造前面講過的點對表,即中間用點隔開的一對元素的結(jié)構(gòu)。當(dāng)顯示這種結(jié)構(gòu)時,AutoLISP在第一個和第二個元素之間打印出一個點。這種結(jié)構(gòu)占的存儲空間比普通表小,使用CDR函數(shù)可返回第二個原子。 如:
?。╟ons ‘a(chǎn) 2) returns (a 。 2)
?。╟ar (cons ’a 2)) returns a
?。╟dr (cons ‘a(chǎn) 2)) returns 2
點對表是一種特殊的表,某些只處理常規(guī)表的函數(shù)不能把它當(dāng)作變元接受。
72 (log 《數(shù)》 )
這個函數(shù)返回《數(shù)》的自然對數(shù),其結(jié)果為實數(shù),例如:
?。╨og 4.5) returns 1.50408
?。╨og 1.22) returns 0.198851
73 (logand 《數(shù)》 《數(shù)》。。。 )
這個函數(shù)返回表中一系列《數(shù)》的按位方式的邏輯”與“結(jié)果。其中《數(shù)》必須是整數(shù),結(jié)果
也是一個整數(shù)。 例如:
(logand 7 15 3) returns 3
?。╨ogand 2 3 15) returns 2
(logand 8 3 4) returns 0
74 (logior 《數(shù)》 《數(shù)》。。。 )
這個函數(shù)返回表中一系列《數(shù)》的按位方式的邏輯”或“結(jié)果。其中《數(shù)》必須為整數(shù),其結(jié)
果也是整數(shù)。 例如:
(logior 1 2 4 ) returns 7
?。╨ogior 9 3 ) returns 11
75 (lsh 《數(shù)1》 《位數(shù)》 )
這個函數(shù)返回《數(shù)1》被《位數(shù)》變換后的邏輯位值?!稊?shù)1》和《位數(shù)》必須是整數(shù),其結(jié)果也
是整數(shù)。
如果《位數(shù)》為正,《數(shù)1》就變換至左位;如果為負(fù),則變換至右位。在這兩種情況下,移入位為”零“,移出位丟棄。如果有位”1“移入或移出了整數(shù)的最高位(在DOS機上是第十六位,在32位工作站上是第32位),整數(shù)的符號就會改變。
例如:
?。╨sh 2 1) returns 4
(lsh 2 -1) returns 1
?。╨sh 40 2) returns 160
(lsh 16384 1) returns -32768 on DOS machines
?。╨sh 16384 -1) returns 32768 on 32-bit workstations
76 (mapcar 《函數(shù)》 《表1》。。。 《表n》 )
MAPCAR返回《函數(shù)》的執(zhí)行結(jié)果,它分別把《表1》到《表n》的每個元素作為《函數(shù)》的變元。
《函數(shù)》后面的表的數(shù)目必須要與《函數(shù)》所需要的變元數(shù)目相匹配。 例如:
?。╯etq a 10 b 20 c 30)
(mapcar ’1+ (list a b c)) returns (11 21 31)
這等效于:
?。?+ a)
(1+ b)
?。?+ c)
只是MAPCAR返回的結(jié)果為一個表。同理:
?。╩apcar ‘+ ’(10 20 30) ‘(4 3 2)) returns (14 23 32)
和下列寫法等效:
?。? 10 4)
?。? 20 3)
?。? 30 2)
LAMBDA函數(shù)可以指定一個”無名“函數(shù),此”無名“函數(shù)可由MAPCAR執(zhí)行。當(dāng)有些函數(shù)變元是
常數(shù)時或用其它手段提供時,這種方法便顯得非常有用。 例如:
?。╩apcar ’(lambda (x) (+ x 3)) ‘(10 20 30)) returns (13 23 33)
和:
?。╩apcar ’(lambda (x y z)
?。? x (- y z))
)
‘(5 6) ’(20 30) ‘(14 5.0)
?。?returns (30 150.0)
77 (max 《數(shù)》 《數(shù)》。。。 )
這個函數(shù)返回所給《數(shù)》中最大的數(shù)。每一個《數(shù)》必須是實數(shù)或整數(shù)。 例如:
(max 4.07 -144) returns 4.07
?。╩ax -88 19 5 2) returns 19
78 (member 《表達(dá)式》 《表》 )
這個函數(shù)搜索表中的《表達(dá)式》,返回《表》中從第一次《表達(dá)式》出現(xiàn)到最后所剩的內(nèi)容。
如果在《表》中沒有出現(xiàn)過《表達(dá)式》,MEMBER將返回nil. 例如:
(member ’c ‘(a b c d e)) returns (c d e)
?。╩ember ’q ‘(a b c d e)) returns nil
79 (menucmd 《串》 )
MENUCMD函數(shù)為LISP程序提供一種手段,以實現(xiàn)在AutoCAD菜單中各子菜單之間的轉(zhuǎn)換。
這樣,LISP程序可和相關(guān)的菜單文件一起運行,并在需要用戶輸入時顯示出適當(dāng)?shù)目晒┻x擇的子菜單.MENUCMD總是返回nil.《串》變元的形式是:
類 = 子菜單
其中
類代表某一指定的菜單類名,有效的菜單類名有:
S 表示屏幕菜單(SCREEN)
B 表示按鈕菜單(BUTTONS)
I 表示圖標(biāo)菜單(ICON)
P1-P10 表示下拉式菜單(POP),從1到10
T1-T4 表示圖形輸入板菜單(TABLET),從1到4
A1 表示輔助菜單(AUX 1)
子菜單代表指定要激活的子菜單名。它可以是當(dāng)前(已裝入的)菜單文件中任一子菜單名(不帶”* *“前綴)或是主菜單類名。
詳見AutoCAD參考手冊的附錄B.注意,這里不需要菜單文件中子菜單名所用的前綴符$.
例如: (menucmd ”S=OSNAP“)
使屏幕上出現(xiàn)OSNAP子菜單(假設(shè)在當(dāng)前菜單文件中有這個子菜單)。同樣,
?。╩enucmd ”B=MY-BUTTONS“)
將子菜單MY-BUTTONS賦給按鈕菜單。
對于圖標(biāo)菜單和下拉式菜單,”*“是一個有效的子菜單名,它使當(dāng)前已具有指定菜單類
別的子菜單在屏幕上顯示。如序列:
(menucmd ”P1=NUMERIC“)
?。╩enucmd ”P1=*“)
先向下拉式菜單1指定子菜單NUMERIC,然后在屏幕上顯示該子菜單。
80 (min 《數(shù)》 《數(shù)》。。。 )
這個函數(shù)返回所有《數(shù)》中最小值的數(shù)。每一個《數(shù)》可以是實型或整型。 例如:
?。╩in 683 -10.0) returns -10.0
?。╩in 73 2 48 5) returns 2
81 (minusp 《項》 )
如果《項》為實數(shù)或整數(shù),且為負(fù)值,那么此函數(shù)返回T;否則返回nil.對于其它類型的《項》
沒有定義。 例如:
?。╩inusp -1) returns T
?。╩inusp -4.293) returns T
?。╩inusp 830.2) returns nil
82 (not 《項》 )
如果《項》的計算值為nil時,此函數(shù)返回T;否則返回nil.特別地在和一些控制函數(shù)連用
時,NULL函數(shù)常用于表,而NOT用于其它數(shù)據(jù)類型。 例如,對于下列賦值:
?。╯etq a 123)
?。╯etq b ”string“)
?。╯etq c nil)
則有:
(not a) returns nil
(not b) returns nil
?。╪ot c) returns T
(not ’()) returns T
83 (nth 《n》 《表》 )
這個函數(shù)返回《表》中的第n個元素,其中《n》是返回的元素序號(零表示第一個元素)。如果《n》大于《表》的最高元素序號,則返回nil.例如:
?。╪th 3 ‘(a b c d e)) returns d
(nth 0 ’(a b c d e)) returns a
?。╪th 5 ‘(a b c d e)) returns nil
84 (null 《項》 )
如果《項》的約束值是nil,此函數(shù)返回T;否則返回nil.例如,對于下列賦值:
?。╯etq a 123)
?。╯etq b ”string“)
(setq c nil)
則有:
?。╪ull a) returns nil
?。╪ull b) returns nil
?。╪ull c) returns T
?。╪ull ’()) returns T
85 (numberp 《項》 )
如果《項》是一個實數(shù)或整數(shù),此函數(shù)返回T;否則返回nil.例如,對于下列賦值:
(setq a 123)
?。╯etq b ‘a(chǎn))
則有:
(numberp 4) returns T
?。╪umberp 3.8348) returns T
?。╪umberp ”Howdy“) returns nil
?。╪umberp ’a) returns nil
?。╪umberp a) returns T
(numberp b) returns nil
?。╪umberp (eval b)) returns T
86 (open 《文件名》 《方式》 )
這個函數(shù)打開一個文件,以便AutoLISP的I/O函數(shù)進(jìn)行存取。它返回文件描述符,這個描述符由其它的I/O函數(shù)所使用;因此,它必須要用SETQ賦給一個變量。例如:
(setq a (open ”file.ext“ ”r“) )
《文件名》是一個字符串,它指定了要打開的文件名和擴展名?!斗绞健窞樽x/寫標(biāo)志,它必須是由單個小寫字母組成的字符串。下表是對有效方式字符的說明:
OPEN方式 說明
---------------------------------------------------------------------------
”r“(讀) 為”讀“打開文件。如果《文件名》不存在,則返回nil.
”w“(寫) 為”寫打開文件。如果《文件名》不存在,則建立一個新文件,并打開該文件。如果《文件名》存在,則覆蓋它的現(xiàn)存數(shù)據(jù)。
“a”(添寫) 為“添寫”打開文件。如果《文件名》不存在,則建立一個新文件,并打開該文件。如果《文件名》存在,則打開該文件,并指向現(xiàn)存數(shù)據(jù)的尾部,這樣,用戶寫入文件的所有新數(shù)據(jù)都將附加到現(xiàn)存數(shù)據(jù)的后面。在DOS中,某些程序的文本編輯在寫入文本文件時會在文本尾部加上一個文件結(jié)束標(biāo)記(CTRL-Z,十進(jìn)制的ASCII碼26)。在讀文本文件時,當(dāng)碰到CTRL-Z標(biāo)記,DOS便返回文件
結(jié)束狀態(tài),即使在結(jié)束標(biāo)記后面可能還有數(shù)據(jù)。如果您想用OPEN的“a”方式在由其他程序產(chǎn)生的文件后面附加數(shù)據(jù),則必須保
證這些程序沒有在其文本文件尾部插入CTRL-Z標(biāo)記。
假設(shè)在下例中的文件名都不存在,那么:
?。╯etq f (open “new.tst” “w”)) returns 《file #nnn》
?。╯etq f (open “nosuch.fil” “r”)) returns nil
(setq f (open “l(fā)ogfile” “a”)) returns 《file #nnn》
《文件名》可包括目錄名前綴,如“/test/func3”。在MS-DOS/PC-DOS系統(tǒng)上允許使用驅(qū)動器字母,并可用反斜杠代替斜杠(但要記住,在字符串中必須要用“\\”才能得到一個反斜杠)。
例如:
?。╯etq f (open “/x/new.tst” “w”)) returns 《file #nnn》
(setq f (open “nosuch.fil” “r”)) returns nil
87 (or 《表達(dá)式》。。。 )
這個函數(shù)返回一系列表達(dá)式的邏輯或(OR).OR對表達(dá)式從左向右進(jìn)行求值,尋找一個非nil的表達(dá)式。如果找到了一個非nil表達(dá)式,則停止繼續(xù)求值,并返回T.如果所有的表達(dá)式
的計算值都為nil,則OR返回nil.例如:
(or nil 45 ‘()) returns T
?。╫r nil ’() ) returns nil
88 (osnap 《點》 《方式串》 )
這個函數(shù)返回一個點,這個點是對《點》施加了由《方式串》所描述的目標(biāo)捕捉方式而得的結(jié)果?!斗绞酱肥怯梢粋€或多個有效的目標(biāo)標(biāo)識符組成的字符串,如“midpoint”,“center”
等等,它們之間用逗號隔開。例如:
?。╯etq pt2 (osnap pt1 “midp”))
?。╯etq pt2 (osnap pt1 “midp,endp,center”))
如果《點》變元是一個二維點(由兩個實數(shù)組成的表),則返回一個二維點。如果《點》變元
是三維點(由三個實數(shù)組成的表),則返回一個三維點。如果對已知《點》找不到與指定《方式串》匹配的目標(biāo)捕捉點,則返回nil.
這個函數(shù)的操作取決于當(dāng)前三維視圖的FLATLAND系統(tǒng)變量的設(shè)置狀況。詳見AutoCAD參
考手冊第八章及附錄D.
89 pi
這不是一個函數(shù),而是常數(shù)π。它的值大約是3.1415926.
90 (polar 《點》 《角》 《距離》 )
這個函數(shù)返回一個UCS坐標(biāo)系統(tǒng)的點,該點角度為《角》,與UCS坐標(biāo)系統(tǒng)點《pt》相距《距離》?!督恰芬曰《缺硎?,是以x軸開始逆時針方向計算的。《pt》有可能是三維點,但《角》總是相對
于當(dāng)前構(gòu)造平面而言。若系統(tǒng)變量FLATLAND為零,就返回一個三維點;否則返回一個二維點。
例如(假設(shè)FLATLAND為零):
?。╬olar ‘(1.0 1.035) 0.785398 1.414214) 返回 (2.0 2.0 3.5)
91 (prin1 《表達(dá)式》 [ 《文件描述符》 ] )
這個函數(shù)在屏幕上打印《表達(dá)式》,并返回《表達(dá)式》?!侗磉_(dá)式》可以是任何表達(dá)式,也可以不是字符串。如果指定了《文件描述符》,(并且是一個為寫而打開的文件描述符),那么《表達(dá)式》按照它在屏幕上顯示的格式寫入那個文件。只有被指定的《表達(dá)式》才會打印;其中不包括換行符和空格。例如,對于下列賦值:
(setq a 123)
?。╯etq b ’(a))
則有:
(prin1 ‘a(chǎn)’) 打印 a 并返回 a
?。╬rin1 a) 打印 123 并返回 123
?。╬rin1 b) 打印 (a) 并返回 (a)
(prin1 “Hello”) 打印 “Hello” 并返回 “Hello”
以上每個例子都在屏幕上打印,因為沒有指定《文件描述符》。假設(shè)f是一個為寫而打開的有效文件描述符,則:
?。╬rin1 “Hello” f)
將把“Hello”寫到指定的文件中,并返回“Hello”。
如果《表達(dá)式》是一個含有控制字符的字符串,那么PRIN1將用“\”開頭按下列方式編輯這
些字符:
\e 代表ESC
\u 代表換行
\r 代表回車
\t 代表tab
\nnn 代表八進(jìn)制碼為nnn的字符。
這樣:
?。╬rin1 (chr 2) ) 打印 “\002” 返回 “\002”
?。╬rin1 (chr 10) ) 打印 “\n” 返回 “\n”
如果PRIN1沒有變元,則返回名為空串的一個符號。如果把沒有變元的PRIN1用在用戶定義函數(shù)中最后的一個表達(dá)式,那么當(dāng)函數(shù)結(jié)束只打印出一個空行,用這種方法可“悄悄”退出
函數(shù)。例如,已知:
?。╠efun C:SETUP()
(setvar “l(fā)units” 4)
?。╯etvar “blipmode” 0)
?。╬rin1)
)
那么:
Command:SETUP
將執(zhí)行用戶定義的命令和要求的SETVAR函數(shù),然后不打印信息而返回提示“Command:”。
92 (princ 《表達(dá)式》 [ 《文件描述符》 ] )
這個函數(shù)和PRIN1基本相同,它和PRIN1的區(qū)別是它能實現(xiàn)《表達(dá)式》中控制字符的作用。
一般來說,PRIN1打印的表達(dá)式的方法和LOAD相兼容,而PRINC打印的表達(dá)式可以由象READ-
LINE這樣的函數(shù)讀出。
93 (print 《表達(dá)式》 [ 《文件描述符》 ] )
這個函數(shù)除了在打印《表達(dá)式》之前先換行和在打印《表達(dá)式》之后打印空格之外,其它和
PRIN1相同。
94 (progn 《表達(dá)式》。。。 )
這個函數(shù)按順序計算每一個《表達(dá)式》,返回最后表達(dá)式的求值結(jié)果??梢栽谥荒苡靡粋€表達(dá)式的地方,用PROGN來完成多個表達(dá)式的計算。例如:
?。╥f (= a b) (progn
(setq a (+ a 10))
?。╯etq b (- b 10))
?。?/p>
?。?/p>
一般情況下,IF函數(shù)在測試表達(dá)式的計算值不為nil時,只計算前面一個表達(dá)式,在這個例子中,我們用PROGN可計算兩個表達(dá)式。
95 (prompt 《信息》 )
這個函數(shù)將《信息》顯示在用戶的屏幕提示區(qū),并返回nil.《信息》是一個字符串。在AutoCAD的雙屏幕配置中,PROMPT在兩個屏幕上都顯示《信息》,因此它比PRINC更可取。例如:
?。╬rompt “New value: ”)
將在屏幕上顯示“New value: ”,并返回nil.
96 (quote 《表達(dá)式》 )
它返回沒有計算的《表達(dá)式》。此函數(shù)還可以簡寫為:
表達(dá)式
例如:
(quote a) returns A
?。╭uote cat) returns CAT
?。╭uote (a b)) returns (A B)
‘a(chǎn) returns A
’cat returns CAT
‘(a b) returns (A B)
?。▽τ诤笕齻€例子,如果在命令提示符下直接從鍵盤輸入它們,那么將不會執(zhí)行它們。記住,這樣的輸入必須以“(”或“!”開頭,以表明這是一個LISP表達(dá)式)。
97 (read 《字符串》 )
這個函數(shù)返回從《字符串》中取得的第一個表或原子?!蹲址凡荒芎锌崭?。例如:
?。╮ead “hello”) returns HELLO
(read “hi”) returns HI
?。╮ead “(a)”) returns (A)
98 (read-char [ 《文件描述符》 ] )
這個函數(shù)從鍵盤輸入緩沖區(qū)或從《文件描述符》表示的打開文件中讀入一個字符。它返回一個整數(shù),這個數(shù)是讀入字符的ASCII碼值。
如果沒有指定《文件描述符》,并且在鍵盤輸入緩沖區(qū)中沒有字符,那么READ-CHAR等待用戶鍵入一些數(shù)據(jù)(最后打回車)。例如,假設(shè)鍵盤的輸入緩沖區(qū)是空的:
?。╮ead-char)
將等待用戶輸入。如果用戶鍵入了“ABC”并打了RETURN,那么READ-CHAR將返回65(即為字母“A”的ASCII碼)。對READ-CHAR的以后三次調(diào)用將分別返回66,67和10(即為換行符)。如果
再一次調(diào)用READ-CHAR,它又將等待輸入。
AutoCAD與AutoLISP能在數(shù)種操作系統(tǒng)版本下運行。這些系統(tǒng)采用不同的約定來表示ASC
II文本文件中的行結(jié)束符。例如,UNIX用單個換行符(LF,即ASCII碼10),而MS-DOS,PC-DOS使用兩個字符(CR/LF,即ASCII碼13和10)來完成同一任務(wù)。為了便于開發(fā)AutoLISP程序,使它
們能在所有支持的操作系統(tǒng)下以可移植方式工作,READ-CHAR接受全部上述約定,只要發(fā)現(xiàn)
一個行結(jié)束符(或字符串),就返回單個換行符(ASCII代碼10)。
99 (read-line [ 《文件描述符》 ] )
這個函數(shù)從鍵盤或從由《文件描述符》表示的打開文件中讀入一個字符串。如果遇到了文件結(jié)束符,READ-LINE將返回nil;否則它返回所讀的字符串。例如,假設(shè)f是有效的打開文件
指針,那么:
?。╮ead-line f)
將返回這個文件中的下一個輸入行;若讀到文件尾,則返回nil.
100 (redraw [ 《實體名》 [《方式》] ] )
本函數(shù)的作用取決于給出變元的個數(shù)。如果本函數(shù)的調(diào)用中沒給出變元:
?。╮edraw)
那么將重畫當(dāng)前視圖,就如AutoCAD的REDRAW命令一樣。如果在調(diào)用中給出一個實體名變元:
?。╮edraw 《ename》 )
那么將重畫選中的實體。在使用GRCLEAR清除屏幕后,使用本函數(shù)可在屏幕上標(biāo)識出所需的實體,這是很有用的。有關(guān)實體名的說明參見本手冊第五章。
如果在REDRAW調(diào)用中給出兩個變元,那么就完全控制了實體的重畫效應(yīng)。
?。╮edraw 《ename》 《mode》 )
這里《實體名》是要重畫的實體名,《方式》是一個整數(shù),具有下列值之一:
重畫方式 作用
----------------------------------------------------------------
1 在屏幕上重畫實體
2 不畫實體(隱去)
3 加亮實體(若顯示器具有加亮顯示的功能)
4 不加亮實體(若顯示器具有去除加亮顯示的功能)
若《實體名》代表一個復(fù)雜實體(多義線或具有屬性的塊)的頭實體(即主實體)時,則當(dāng)《
方式》變元為正值,將處理主實體及其所有的子實體。當(dāng)《方式》變元為負(fù)值,REDRAW將只對頭
實體進(jìn)行操作.
評論