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