编程语言及工具
AutoLISP提供了大量的预定义函数。若将函数名(大小写都可)作为表中的第一个元素函数变元(若有的话)作为表中后面的元素,就可以调用那个函数。本章按字母顺序列出AutoLISP所有基本函数。用户会发现其中许多函数都是标准函数,可在LISP程序设计语言中找到。还有一些函数是由 AutoCAD提供的且专用于交互图形环境。
1 FLATLAND 系统变量--与老版本的兼容性
AutoLISP版本10支持AutoCAD的最新增强型三维图形功能,则时继续保证与AutoCAD 老版本的兼容性。FLATLAND系统变量就是用来控制该兼容性的。当FLATLAND为零时,实现新三维功能;否则各函数操作与AutoLISP版本9的一样。FLATLANDR的设置作用于下列
AutoLISP函数:
DISTANCE GRREAD POLAR
ENTGET INITGET TBLNEXT
GETDIST INTERS TBLSEARCH
GETPOINT OSNAP
在各函数说明中,已注明FLATLAND对上述函数起作用的方式。
2 ( + 《数》 《数》 。。。)
这个函数返回所有《数》的总和。其中的《数》可以是整型或实型的。如果所有的《数》都是整数,其结果也是整数;如果其中有一个是实型的,那么其它整型数将转换为实型
数结果将是实型数。例如:
(+ 1 2) returns 3
(+ 1 2 3 4.5) returns 10.5
(+ 1 2 3 4.0) returns 10.0
3 ( - 《数》 《数》 。。。)
这个函数把第一个《数》减去第二个《数》,返回它们的差。如果给定的《数》多于两个,那么将第一个《数》减去其后所有数之和,并返回最后的结果。如果只给了一个《数》,即返回零减这个《数》的结果。此函数中的《数》可以是实型或整型,按标准规则进行类型转换。
例如:
(- 50 40) returns 10
(- 50 40.0 2) returns 8.0
(- 50 40.0 2.5) returns 7.5
(- 8) returns -8
4 (* 《数》 《数》。。。)
这个函数返回所有《数》的乘积。其中《数》可以是实型或整型。按标准规则进行类型转换
例如:
(* 2 3) returns 6
(* 2 3 4.0) returns 24.0
(* 3 -4.5) returns -13.5
5 (/ 《数》 《数》。。。)
这个函数将第一个《数》除以第二个《数》,返回其商。如果给出的《数》多于两个,则把第一个《数》除以其它所有《数》的乘积,并返回最后的商。此函数中的《数》可以是实型或整型,类型的转换按标准规则进行。例如:
(/ 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 (= 《原子》 《原子》。。。)
这是“等于”关系函数。如果所有指定的《原子》在数值上是相等的,则返回T;否则返回空(nil)。这个函数适用于数和字符串。例如:
(= 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》。..)
这是一个“不等于”关系函数。如果《原子1》数值上不等于《原子2》,则返回T;否则返回nil,如果提供的《变元》多于两个,则函数无定义。例如:
(/= 10 20) returns T
(/= “you” “you”) returns nil
(/= 5.43 5.44) returns T
8 (《 《原子》 《原子》。。。)
这是一个“小于”关系函数。如果第一个《原子》值小于第二个,则返回T;否则返回nil,如果所给的《原子》多于两个,那么当每个《原子》都小于其右边的《原子》时,则返回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 (《= 《原子》 《原子》。。。)
这是一个“小于或等于”关系函数。如果第一个《原子》值大于或等于第二个原子,则返回T;否则返回nil.如果所给的《原子》多于两个,则当每一个《原子》都小于或等于其右边的《原子》时,才返回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 (》 《原子》 《原子》。。。)
这是一个“大于”关系函数。如果第一个《原子》值大于第二个,则返回T;否则返回nil,若所给定的《原子》多于两个,当每个《原子》都大于其右边的《原子》时,则返回T. 例如:
(》 120 17) returns T
(》 “c” “b”) returns T
(》 3.5 1792) returns nil
(》 77 4 2) returns T
(》 77 4 4) returns nil
#p##e#
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将只对头
实体进行操作.
全部0条评论
快来发表一下你的评论吧 !