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
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,则停止求值并返回
(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坐标系统点
当前作图平面的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函数.其中
可能的双变量Boolean函数中的一种.后面的整型变元根据这个函数和下列的真值表进行
方式(即逻辑)组合:
<整数1> <整数2>
-----------------------------------------------------
0 0 8
0 1 4
1 0 2
1 1 1
<整数1>的每一位和<整数2>的相应位配对,选择真值表中的一水平行.其结果位是0或1,
将取决于对应真值表中这一行中
位就为1,否则结果位为0.
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
可以使用
如,如果
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个元素,其中
果
(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,十进制的ASC
II码26).在读文本文件时,当碰到CTRL-Z标记,DOS便返回文件
结束状态,即使在结束标记后面可能还有数据.如果您想用OPE
N的"a"方式在由其他程序产生的文件后面附加数据,则必须保
证这些程序没有在其文本文件尾部插入CTRL-Z标记.
假设在下例中的文件名都不存在,那么:
(setq f (open "new.tst" "w")) returns
(setq f (open "nosuch.fil" "r")) returns nil
(setq f (open "logfile" "a")) returns
<文件名>可包括目录名前缀,如"/test/func3".在MS-DOS/PC-DOS系统上允许使用驱动
器字母,并可用反斜杠代替斜杠(但要记住,在字符串中必须要用"\\"才能得到一个反斜杠)
. 例如:
(setq f (open "/x/new.tst" "w")) returns
(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坐标系统点
>.<角>以弧度表示,是以x轴开始逆时针方向计算的.
于当前构造平面而言.若系统变量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.<信息>是一个字符串.在AutoC
AD的双屏幕配置中,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
那么将重画选中的实体.在使用GRCLEAR清除屏幕后,使用本函数可在屏幕上标识出所需的
实体,这是很有用的.有关实体名的说明参见本手册第五章.
如果在REDRAW调用中给出两个变元,那么就完全控制了实体的重画效应.
(redraw
这里<实体名>是要重画的实体名,<方式>是一个整数,具有下列值之一:
重画方式 作用
----------------------------------------------------------------
1 在屏幕上重画实体
2 不画实体(隐去)
3 加亮实体(若显示器具有加亮显示的功能)
4 不加亮实体(若显示器具有去除加亮显示的功能)
若<实体名>代表一个复杂实体(多义线或具有属性的块)的头实体(即主实体)时,则当<
方式>变元为正值,将处理主实体及其所有的子实体.当<方式>变元为负值,REDRAW将只对头
实体进行操作.