lisp函数知识大全

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,则停止求值并返回;否则返回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坐标系统点到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函数.其中是一个0到15之间的整数,它表示16种
可能的双变量Boolean函数中的一种.后面的整型变元根据这个函数和下列的真值表进行
方式(即逻辑)组合:
     <整数1>        <整数2>      
   -----------------------------------------------------
       0              0              8
       0              1              4
       1              0              2
       1              1              1
<整数1>的每一位和<整数2>的相应位配对,选择真值表中的一水平行.其结果位是0或1,
将取决于对应真值表中这一行中位的设置情况.如果中位的设置适当,结果
位就为1,否则结果位为0.
      的一些值等效于标准的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
   可以使用的其他值来完成其它的Boolean操作,这些操作可能没有标准名称.例
如,如果为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个元素,其中是返回的元素序号(零表示第一个元素).如
大于<表>的最高元素序号,则返回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,十进制的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将只对头
实体进行操作.

你可能感兴趣的:(学习,CAD)