实用文案
标准文档
AUTOLISP函数参考1(10版本)
以下为十年前纯手工录入的函数参考手册,以分享给爱好LISP这方面的朋友参
考!
AutoLISP提供了大量的预定义函数。若将函数名(大小写都可)作为表中的第
一个元素函数变元(若有的话)作为表中后面的元素,就可以调用那个函数。本
章按字母顺序列出AutoLISP所有基本函数。用户会发现其中许多函数都是标准
函数,可在LISP程序设计语言中找到。还有一些函数是由AutoCAD提供的且
专用于交互图形环境。
1FLATLAND系统变量--与老版本的兼容性
AutoLISP版本10支持AutoCAD的最新增强型三维图形功能,则时继续保
证与AutoCAD
老版本的兼容性。FLATLAND系统变量就是用来控制该兼容性的。当FLATLAND
为零时,实
现新三维功能;否则各函数操作与AutoLISP版本9的一样。FLATLANDR的设
置作用于下列
AutoLISP函数:
DISTANCEGRREADPOLAR
ENTGETINITGETTBLNEXT
GETDISTINTERSTBLSEARCH
GETPOINTOSNAP
在各函数说明中,已注明FLATLAND对上述函数起作用的方式。
实用文案
标准文档
2(+<数><数>...)
这个函数返回所有<数>的总和。其中的<数>可以是整型或实型的。如果所
有的<数>
都是整数,其结果也是整数;如果其中有一个是实型的,那么其它整型数将转换
为实型
数结果将是实型数。例如:
(+12)returns3
(+1234.5)returns10.5
(+1234.0)returns10.0
3(-<数><数>...)
这个函数把第一个<数>减去第二个<数>,返回它们的差。如果给定的<数>
多于两个,
那么将第一个<数>减去其后所有数之和,并返回最后的结果。如果只给了一个
<数>,即返
回零减这个<数>的结果。此函数中的<数>可以是实型或整型,按标准规则进行
类型转换。
例如:
(-5040)returns10
(-5040.02)returns8.0
(-5040.02.5)returns7.5
(-8)returns-8
实用文案
标准文档
4(*<数><数>...)
这个函数返回所有<数>的乘积.其中<数>可以是实型或整型.按标准规则进行
类型转换
例如:
(*23)returns6
(*234.0)returns24.0
(*3-4.5)returns-13.5
5(/<数><数>...)
这个函数将第一个<数>除以第二个<数>,返回其商.如果给出的<数>多于两
个,则把第
一个<数>除以其它所有<数>的乘积,并返回最后的商.此函数中的<数>可以是
实型或整型,
类型的转换按标准规则进行.例如:
(/1002)returns50
(/1002.0)returns50.0
(/10020.02)returns2.5
(/135360)returns0
(/135360.0)returns0.375
6(=<原子><原子>...)
这是"等于"关系函数.如果所有指定的<原子>在数值上是相等的,则返回T;否
则返回
实用文案
标准文档
空(nil).这个函数适用于数和字符串.例如:
(=44.0)returnsT
(=20388)returnsnil
(=2.42.42.4)returnsT
(=499499500)returnsnil
(="me""me")returnsT
(="me""you")returnsnil
7(/=<原子1><原子2>...)
这是一个"不等于"关系函数.如果<原子1>数值上不等于<原子2>,则返回T;
否则返回
nil.如果提供的<变元>多于两个,则函数无定义.例如:
(/=1020)returnsT
(/="you""you")returnsnil
(/=5.435.44)returnsT
8(<<原子><原子>...)
这是一个"小于"关系函数.如果第一个<原子>值小于第二个,则返回T;否则返
回nil.
如果所给的<原子>多于两个,那么当每个<原子>都小于其右边的<原子>时,则
返回T.
例如:
(<1020)returnsT
实用文案
标准文档
(<"b""c")returnsT
(<35733.2)returnsnil
(<2388)returnsT
(<2344)returnsnil
9(<=<原子><原子>...)
这是一个"小于或等于"关系函数.如果第一个<原子>值大于或等于第二个原
子,则返
回T;否则返回nil.如果所给的<原子>多于两个,则当每一个<原子>都小于或等
于其右边
的<原子>时,才返回T.例如:
(<=1020)returnsT
(<="b""b")returnsT
(<=35733.2)returnsnil
(<=299)returnsT
(<=2945)returnsnil
10(><原子><原子>...)
这是一个"大于"关系函数.如果第一个<原子>值大于第二个,则返回T;否则返
回nil.
若所给定的<原子>多于两个,当每个<原子>都大于其右边的<原子>时,则返回
T.例如:
(>12017)returnsT
实用文案
标准文档
(>"c""b")returnsT
(>3.51792)returnsnil
(>7742)returnsT
(>7744)returnsnil
11(>=<原子><原子>...)
这是一个"大于或等于"关系函数.如果第一个<原子>值大于或等于第二个,则
返回T;
否则返回nil.如果给出的<原子>多于两个,当每一个<原子>都大于或等于其右
边的<原子>
时才返回T.例如:
(>=12017)returnsT
(>="c""c")returnsT
(>=3.51792)returnsnil
(>=7744)returnsT
(>=7749)returnsnil
12(~<数>)
这个函数返回<数>的按位非(NOT),即补码.<数>必须为整数.例如:
(~3)returns-4
(~100)returns-101
(~-4)returns3
实用文案
标准文档
13(1+<数>)
这个函数返回<数>加1(增量)的结果.<数>可以是实数或整数.例如:
(1+5)returns6
(1+-17.5)returns-16.5
14(1-<数>)
这个函数返回<数>加1(增量)的结果.<数>可以是实型或整型数.例如:
(1-5)returns4
(1--17.5)returns-18.5
15(abs<数>)
这个函数返回<数>的绝对值.<数>可以是实型数或整型的.例如:
(abs100)returns100
(abs-100)returns100
(abs-99.25)returns99.25
16(and<表达式>...)
这个函数返回所列出的表达式的逻辑"与"(AND).如果其中任何一个表达式
的结果等
于nil,则停止求值并返回
(tqa103)
(tqbnil)
(tqc"string")
那么
实用文案
标准文档
(and1.4ac)returnsT
(and1.4abc)returnsnil
17(angle<点1><点2>)
这个函数返回从UCS坐标系统点
角度,该角度从
当前作图平面的X轴开始反时针方向计算(以弧度为单位).如果提供了三维点,
则将其投
影至当前作图平面.例如:
(angle'(1.01.0)'(1.04.0))return1.5708
(angle'(5.01.33)'(2.41.33))return3.14159
18(angtos<角>[<方式>[<精度>]])
这个函数处理<角>(实型数,单位为弧度),返回一个对应于<角>的字符串.该字
符串是
根据所设置的<方式>、<精度>及AutoCADDIMZIN变量,对<角>编辑后所得.
其中<方式>变
元是一个整型数,它指示完成什么类型的编辑,如下所示:
ANGTOS方式编辑格式
-----------------------------------------
0度
1度/分/秒
2梯度
实用文案
标准文档
3弧度
4测地单位
其中<精度>变元是一个整型数,它选择所需要的十进制精度的小数位数.<方式>
和<精度>
与AutoCAD系统变量AUNITS和AUPREC相对应,如果没有指明<方式>和<
精度>,则使用AUNITS
和AUPREC的当前值.
例如,已知DIMZIN=0和下面的赋值:
(tqpt1'(5.01.33))
(tqpt2'(2.41.33))
(tqa(anglept1pt2))
那么,
(angtosa00)returns"180"
(angtosa04)returns"180.0000"
(angtosa14)returns"180d0'0""
(angtosa34)returns"3.1416r"
(angtosa42)returns"W"
ANGTOS可接受一负<角>变元,但总是先将其化为相当的正值(在0~2π
弧度间),
然后再执行指定的变换.例如:
(angtos0.78539804)returns"45.0000"
(angtos-0.78539804)returns"315.0000"
实用文案
标准文档
19(append<表达式>...)
这个函数将所有的表(<表达式>)放置在一起,作为一个表.例如:
(append'(ab)'(cd))returns(abcd)
(append'((a)(b))'((c)(d)))returns((a)(b)(c)(d))
APPEND需要的变元必须是表.
20(apply<函数><表>)
它执行由<函数>给定的函数,<表>指定了函数的变元.例如:
(apply'+'(123))return6
(apply'strcat'("a""b""c"))return"abc"
APPLY既可用于内部函数(子程序),也可用于用户定义的函数(即那些用
DEFUN或者
LAMBDA产生的函数).
21(ascii<字符串>)
这个函数返回<字符串>中第一个字符的ASCII字符码(整数).它和BASIC语言
中的ASC函
数相似.例如:
(ascii"A")return65
(ascii"a")return97
(ascii"BIG")return66
22(assoc<项><关联表>)
这个函数在<关联表中>以<项>作为关键字进行搜索,返回<关联表>中对应
实用文案
标准文档
元素的值.如
果在关联表中找不到作为关键字的<项>,ASSOC返回nil.例如,假设表"al"定义
为:
((namebox)(width3)(size4.7263)(depth5))
那么,
(assoc'sizea1)returns(size4.7263)
(assoc'weighta1)returnsnil
关联表常用于储存数据,这些数据可通过"关键字"存取.它和程序设计语言的数组
或结构
相似.本章后面描述的SUBST函数提供了一种方便的方法可把关联表中与关键字
关联的值
进行替换.
23(atan<数1>[<数2>])
如果没有给出<数2>,ATAN将返回<数1>的反正切值,其单位为弧度.<数1>
可以为负值;
返回的角度的范围为:-pi到+pi弧度.例如:
(atan0.5)returns0.463648
(atan1.0)returns0.785398
(atan-1.0)returns-0.785398
(angtos(atan-1.0)04)returns"315.0000"
如果给出<数1>和<数2>,则返回<数1>/<数2>的反正切值,其单位为弧度.如
果<数2>为零,
实用文案
标准文档
即返回的角度值为1.570796弧度(90度或-90度),这取决于<数1>是正数还是
负数.例如:
(atan2.03.0)returns0.588003
(angtos(atan2.03.0)04)returns"33.6901"
(atan2.0-3.0)returns2.55359
(angtos(atan2.0-3.0)04)returns"146.3099"
(atan-2.03.0)returns-0.588003
(atan-2.0-3.0)returns-2.55359
(atan1.00.0)returns1.5708
(angtos(atan1.00.0)04)returns"90.0000"
(atan-0.50.0)returns-1.5708
(angtos(atan-0.50.0)02)returns"270.00"
24(atof<字符串>)
这个函数将字符串换为实型数.并返回此值.例如:
(atof"97.1")returns97.1
(atof"3")returns3.0
25(atoi<字符串>)
这个函数将字符串转换为整数,并返回此值.例如:
(atoi"97")returns97
(atoi"3")returns3
(atoi"3.9")returns3
实用文案
标准文档
26(atom<项>)
如果<项>是一个表,此函数返回nil;否则返回T.任何不是表的东西都被认为
是一个原
子(atom).例如,对于以下的赋值:
(tqa'(xyz))
(tqb'a)
那么,
(atom'a)returnsT
(atoma)returnsnil
(atom'b)returnsT
(atomb)returnsT
(atom'(abc))returnsnil
有些LISP对ATOM的解释有差异,因此在使用互相移植的程序时要加以注意.
27(Boole<函数><整型1><整型2>)
这是一个通用的位方式boolean函数.其中
它表示16种
可能的双变量Boolean函数中的一种.后面的整型变元根据这个函数和下列的真
值表进行
方式(即逻辑)组合:
<整数1><整数2>
-----------------------------------------------------
008
实用文案
标准文档
014
102
111
<整数1>的每一位和<整数2>的相应位配对,选择真值表中的一水平行.其结果
位是0或1,
将取决于对应真值表中这一行中
适当,结果
位就为1,否则结果位为0.
下所示:
func操作结果位为1时的条件
--------------------------------------------------------
1AND两个输入位都为1
6XOR只有其中一个输入位为1
7OR有一个或两个输入位为1
8NOT两个输入位都为0(即补码)
例如:
(Boole1125)
指定了数12和5的逻辑"与"(AND).其结果为4.同样:
(Boole665)
指定了数6和5的逻辑"异或"(XOR),返回结果为3
可以使用
实用文案
标准文档
准名称.例
如,如果
其结果位才为
1.因此:
(Boole4314)
将返回结果12.
28(boundp<原子>)
如果<原子>有一个值约束它(不管值的范围),那么此函数返回T;若没有值约束
<原子>
(或受nil约束),则返回nil.例如,对于下列赋值:
(tqa2)
(tqbnil)
那么:
(boundp'a)returnsT
(boundp'b)returnsnil
29caar,cadr,cddr,cadar等等
AutoLISP支持CAR和CDR的连接,其深度可达四级.例如,已知赋值:
(tqx'((ab)cd))
那么:
(caarx)iquivalentto(car(carx))returninga
(cdarx)iquivalentto(cdr(carx))returning(b)
实用文案
标准文档
(cadarx)iquivalentto(car(cdr(carx)))returningb
(cadrx)iquivalentto(car(cdrx))returningc
(cddrx)iquivalentto(cdr(cdrx))returning(d)
(caddrx)iquivalentto(car(cdr(cdrx)))returningd
在AutoLISP中常使用CADR来取得二维点或三维点的Y坐标(即由两个或三
个实数组成
的表中第二个元素).同样,使用CADDR可取得三维点的Z坐标.例如,已知赋值:
(tqpt2'(5.251.0))(a2Dpoint)
(tqpt3'(5.251.03.0))(a3Dpoint)
那么:
(carpt2)returns5.25
(cadrpt2)returns1.0
(caddrpt2)returnsnil
(carpt3)returns5.25
(cadrpt3)returns1.0
(caddrpt3)returns3.0
30(car<表>)
这个函数返回<表>的第一个元素.如果<表>是空的,则返回nil.例如:
(car'(abc))returnsa
(car'((ab)c))returns(ab)
(car'())returnsnil
实用文案
标准文档
31(cdr<表>)
这个函数返回除<表>中第一个元素以外的所有元素的表.如果<表>是空的,则
返回nil.
例如:
(cdr'(abc))returns(bc)
(cdr'((ab)c))returns(c)
(cdr'())returnsnil
如果<表>变元是一个点对,即一对中间用点隔开的元素表(见下面的
CONS),CDR则返回没
有表括号的第二个元素.例如:
(cdr'(a.b))returnsb
(cdr'(1."TEXT"))returns"TEXT"
32(chr<表>)
这个函数把代表ASCII码的整型数转换为只有一个字符的字符串,并返回此结果
(类似于
BASIC中的CHR$函数).例如:
(chr65)returns"A"
(chr66)returns"B"
(chr97)returns"a"
33(clo<文件描述符>)
这个函数关闭指定的文件,返回nil.其中<文件描述符>是从调用OPEN函数得
实用文案
标准文档
到的.在
CLOSE函数执行之后,此文件描述符就不再有效.
例如,假设X是一个有效的打开文件的描述符.
(clox)
将关闭与X相关联的文件,返回nil.
34(command<变元>...)
这个函数在AutoLISP内部执行AutoCAD命令,它总是返回nil.其中<变元>代
表AutoCAD
的命令及其子命令;对每一个变元都作处理,然后作为对相应提示的响应送给
AutoCAD.命
令名和选择项作为字符串传送,二维点作为两个实数的表传送,三维点作为三个实
数的表
传送.只有当AutoCAD发出"Command:"提示时,命令名才被AutoCAD识别.
例如:
(tqpt1'(1.453.23))
(tqpt2(getpoint"Enterapoint:"))
(command"line"pt1pt2)
(command"")
假设AutoCAD的"Command:"提示已出现,那么以上的表达式将为点"pt1"置值,
提示用户输
入点"pt2",执行AutoCAD的LINE命令,用两点作为此命令的输入MAND
的变元可以是字
实用文案
标准文档
符串,实数,整数或点,这要看AutoCAD命令执行时需要什么.一个空字符串("")等
效于在
键盘上打一个空格.调用COMMAND而不加任何变元等效于在键盘上按
CTRL-C键,它将取消
AutoCAD的大多数命令.
如果AutoCAD系统变量CMDECHO(可通过SETVAR和GETVAR存取)被置为
零,那么从COMMAND
函数中执行的命令将不会在屏幕上显示MAND函数是在AutoLISP中调
用AutoCAD命令的
一种基本方法.
在COMMAND函数内不能使用GETxxx用户输入函数
(GETANGLE,GETSTRING,GETINT,GETPOINT
等).如果试图用GETxxx函数,则会显示出错信息:"error:AutoCADrejected
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"pau"line""5,5""7,5""")
先执行circle命令,置圆心为(5,5),然后暂停以便屏幕上拖曳圆的半径.当拾取了所
要
的点(或键入所要的半径值)后,函数继续执行,画一条从5,5到7,5的直线.
AutoLISP的PAUSE不能暂停菜单输入.如果在COMMAND函数暂停时,激活了
一个菜单项,
那么菜单项中的输入值会满足PAUSE的要求.如果还要暂停菜单项,则必须在菜
单项中用一
个反斜杠.一旦发现了有效输入,AutoCAD将会继续执行COMMAND函数和菜
单项.
注意:
符号当前是由一个反斜杠组成的字串.用户可直接使用一个反斜
实用文案
标准文档
杠而不用
PAUSE符号;但若用一个菜单项调用COMMAND函数,则反斜杠不会暂停
COMMAND函
数,而暂停正在读入的菜单项.同样,暂停机制在AutoLISP的将来版本中可能会
有一个不同的触发值.因此我们建议使用PAUSE符号,而不宜显式使用反斜杠.
2.当一条命令正在等待输入正文串或属性值时出现了PAUSE,那么只有在
系统变量
TEXTEVAL不为零时,AutoCAD才为输入暂停.否则,认为PAUSE符号(一个反斜
杠)
的值等效于正文输入,且不为输入暂停.
3.当COMMAND函数进程被暂停时,该函数仍处于"激活"态,所以用户此
时不可键入
另一个AutoLISP表达式进行求值.
35(cond(<测试1><结果1>)...)
这个函数接受任意数目的表作为变元.它计算每一个表的第一项(按提供的表
的顺序),
直到有一项的返回值不为nil为止.然后它计算测试成功的那个子表中后面的那
些表达式,
返回子表中最后那个表达式的值.如果子表中只有一个表达式(即没有<结果>项);
则返回
<测试>表达式的值.COND是AutoLISP中最基本的条件函数.
例如,下列的函数使用COND完成绝对值的计算:
实用文案
标准文档
(cond((minuspa)(-a))
(ta)
)
如果"a"的值为-10,它将会返回10.如上所示,COND可以作为"Ca"类型的函数.
它常常
用T作为缺省的<测试>表达式.下面是另一个简单的例子.在符号S中用户响应
的字符串是
已知的,该函数测试用户的响应,若用户响应是Y或y,则返回1;若响应是N或n,
则返回0;否
则返回nil.
(cond((=s"Y")1)
((=s"y")1)
((=s"N")0)
((=s"n")0)
(tnil)
)
36(Cons<新的第一个元素><表>)
这是一个基本的表构造函数.它将一个元素<新的第一个元素>加入<表>的开
头,并返回
加入之后的表.例如:
(cons'a'(bcd))returns(abcd)
(cons'(a)'(bcd))returns((a)bcd)
实用文案
标准文档
注意,第一个元素可以是原子或是表.
CONS也可在<表>的变元位置上接受一个原子,用以构造前面讲过的点对表,
即中间用
点隔开的一对元素的结构.当显示这种结构时,AutoLISP在第一个和第二个元素
之间打印
出一个点.这种结构占的存储空间比普通表小,使用CDR函数可返回第二个原子.
如:
(cons'a2)returns(a.2)
(car(cons'a2))returnsa
(cdr(cons'a2))returns2
点对表是一种特殊的表,某些只处理常规表的函数不能把它当作变元接受.
AUTOLISP函数参考2(10版本)
37(cos<角度>)
这个函数返回<角度>的余弦值,这里的<角度>以弧度表示.例如:
(cos0.0)returns1.0
(cospi)returns-1.0
38(defun<符号><变元表><表达式>...)
DEFUN以<符号>作为函数名定义一个函数(注意,函数名是自动用引号引起
来,不需要显
式引起来).在函数名之后是一个变元表(也可为空表),表中可以任选地跟一个斜
杠(/)
实用文案
标准文档
和函数的一个或多个局部符号名.在斜杠和第一个局部符号、最后一个变元(如果
有的话
)之间至少用一个空格隔开.如果没有变元或局部符号,那么在函数名后必须有一
对空括号.
例如:
(defunmyfunc(xy)...)(函数有两个变元)
(defunmyfunc(/ab)...)(函数有两个局部符号)
(defunmyfunc(x/temp)...)(一个变元和一个局部符号)
(defunmyfunc()...)(没有变元和局部符号)
在变元表和局部符号后面是一个或多个表达式,它们在函数执行时进行计算.
DEFUN函数本身返回被定义的函数名称.当这个函数被调用时,将计算它的变
元,变元由
变元变量约束.局部变量可以用于函数的内部,而不改变它们在外部的同名变量值.
函数将
返回最后表达式的计算结果.所有前面的表达式只有辅助效果.DEFUN函数本身
返回所定义
的函数名.例如:
(defunadd10(x)
(+10x)
)returnadd10
(add105)return15
(add10-7.4)return2.6
实用文案
标准文档
和
(defundots(xy/temp)
(tqtemp(strcatx"..."))
(strcattempy)
)returnsdots
(dots"a""b")returns"a...b"
(dots"from""to")returns"from...to"
不准将内部函数名或内部符号名当作<符号>使用,因为这样做会使得内部函
数不可调用
函数库和自动装入
函数定义可以存储在文件中,再用AutoLISP的LOAD函数装入,这将在本章后
面讲述,如果
文件存在,AutoLISP将在每次进入AutoCAD图形编辑时自动把此文
件装入;利用这
个特性可以建立一个用户函数库,保证每次使用时它们总是存在.
任何".lsp"库文件也可包括除DEFUN函数以外的表达式.会由于装入一个文件
会引起对
这些表达式的求值,因此一旦文件装入,用户在文件中的函数调用自动执行.但
是,
的装入是在AutoCAD图形编辑程序完全启动之前完成的,所以在文件
中(在DEFUN外
实用文案
标准文档
)不准使用COMMAND函数.为了使用户的""文件在装入时能自动执行
一命令系列,该
文件应包含有特殊函数名"S::STARTUP"的DEFUN定义).详见后.
C:XXX函数---增加AutoCAD增加新的命令,这些命令是用定义的函数完成的.
若要能象
AutoCAD命令一样使用,这些函数必须要遵守下列规则:
1.函数名的形式必须为"C:XXX",这里所有的字母都是大写的."C:"部分必须
总是
出现在名称中;"XXX"部分可以是你选择的命令名,只要它不和AutoCAD的
内部命令
或外部命令的名称重复就可以.
2.函数的定义必须带空变元表(但允许有局部符号).
例如,下面定义的一个函数是用多义线画一个正方形:
(defunC:PSQUARE(/pt1pt2pt3pt4len)
(tqpt1(getpoint"Lowerleftcorner:"))
(tqlen(getdistpt1"Lengthofoneside:"))
(tqpt2(polarpt10.0len))
(tqpt3(polarpt2(/pi2.0)len))
(tqpt4(polarpt3pilen))
(command"PLINE"pt1pt2pt3pt4"c")
)
实用文案
标准文档
以这种方法定义的函数只需在出现AutoCAD的"Command:"提示符时通过
输入函数名的
"XXX"部分就能调用.如"XXX"不是一个已知的AutoCAD命令,AutoCAD就试图
调用AutoLISP函
数,并且不带任何参数.对于例子C:PSQUARE函数,对话将如形式:
Command:PSQUARE
LowerleftCorner:(输入一点)
Lengthofoneside:(输入一条边的长度)
然后这函数就调用AutoCAD的PLINE命令,并回答它的输入提示,画出所要
的正方形.
用这种方法为AutoCAD增加命令是AutoLISP特有的一个高级功能.一旦定
义了新的
命令,它可以使用AutoLISP提供的所有功能.实际调用新命令时不需要用户用括
号将命令
名括起来,因此,使用这种由AutoLISP实现的命令和其它AutoCAD的内部命令
没有什么两样.
S::XXXX函数---自动执行
在编辑期间,某些情况下可以自动调用用户定义的,且以"S::"开头命名的函数.
应把
函数名前缀"S::"看做是"保留的".为了避免与无关函数发生冲突,除了这些特殊函
数以外,
禁止使用前缀.
实用文案
标准文档
目前,"S::STARTUP"是唯一能自动执行的函数.一旦它被定义,在AutoCAD绘
图编辑进
入产生新图或编辑一旧图时,就自动调用S::STARTUP函数(无变元).因此,在
""文
件中.用户可以加入"S::STARTUP"的DEFUN定义,以便在开始编辑时先执行所希
望的设置操
作.
例如,假设用户想用自己的命令形式来替换AutoCAD的标准命令QUIT及
END,为此,可以
用包括下列内容的""文件:
(defunC:QUIT()
...yourdefinition...
)
(defunC:END()
...yourdefinition...
)
(defunS::STARTUP()
(command"undefine""quit")
(command"undefine""end")
)
39(distance<点1><点2>)
这个函数返回三维点<点1>和<点2>之间的距离.例如:
实用文案
标准文档
(distance'(1.02.53.0)'(7.72.53.0))returns6.7
(distance'(1.02.00.5)'(3.04.00.5))returns2.82843
如果系统变量TLATLAND不等于零,则DISTANCE要求二维点(忽略所给定的
三维点的Z坐标
),同时返回投影在当前作图平面上的两点间的二维距离.如FLATLAND为零,而所
给定的点中
有一个或两个点是二维点,则作用与前同.
40(eq<表达式1><表达式2>)
这个函数确定<表达式1>和<表达式2>是否完全一样;就是说,它们是否受同
样的目标约
束(例如,用SETQ).如果两个表达式完全一样,EQ返回T;否则返回nil.它的典型应
用是检测
两个表实际上是否相同.例如,对于下列的赋值:
(tqf1'(abc))
(tqf2'(abc))
(tqf3f2)
那么:
(eqf1f3)returnsnil(f1andf3arenotthesamelist!)
(eqf3f2)returnsT(f3andf2areexactlythesamelist)
参阅下面的EQUAL函数.
实用文案
标准文档
41(equal<表达式1><表达式2>[<误差量>])
这个函数确定<表达式1>和<表达式2>是否相等;就是说它们的计算结果是
否相同.例如
对于下列的赋值:
(tqf1'(abc))
(tqf2'(abc))
(tqf3f2)
那么:
(equalf1f3)返回T(f1和f3的计算值相等)
(equalf3f2)返回T(f3和f2是完全相同的表)
注意,两个表对EQUAL成立,对EQ不一定成立;两个原子对EQUAL成立,对EQ
也一定成立.另
外,两个表或原子对于EQ成立,对于EQUAL也一定成立的.
在比较两实数(或是由实数组成的两个表,如同表示点的表)时,很重要的一点是应
明确:
用不同的方法计算两个"相同"的数,其结果可能有些微差别.任选项数字变元<误
差量>,用
来使用户指定<表达式1>及<表达式2>间最大差值,在此差值内仍可认为两表
达式是相等的.
如已知:
(tqa1.123456)
(tqb1.123457)
实用文案
标准文档
那么:
(equalab)wouldreturnnil
(equalab0.000001)wouldreturnT
42(eval<表达式>)
本函数返回<表达式>的计算结果,其中<表达式>是LISP表达式.例如,对于以
下赋值:
(tqa123)
(tqb'a)
则有:
(eval4.0)returns4.0
(eval(abs-10))returns10
(evala)returns123
(evalb)returns123
43(exp<数>)
这个函数返回e的<数>次方(自然对数的逆).它返回的结果是实数.例如:
(exp1.0)returns2.71828
(exp2.2)returns9.02501
(exp-0.4)returns0.67032
44(expt<底数><幂>)
这个函数返回<底数>的<幂>次方.如果两个变元都是整数,其结果也是整数;
否则,结果
实用文案
标准文档
为实数.例如:
(expt24)returns16
(expt3.02.0)returns9.0
45(findfile<文件名>)
这个函数允许用户程序在AutoCAD库路径上查找指定的文件.AutoCAD库
路径按先后顺序
由下列目录组成:当前目录、包括当前绘图文件的目录、由ACAD系统环境变量
命名的目录
(如果有的话)、以及包含AutoCAD程序文件的目录.
FINDFILE不能事先假定文件的类型和<文件名>的扩展名,因此用户必须加以
说明.如果
文件名不带路径(即没有驱动器/目录前缀),AutoCAD就对其进行搜索并且返回
全名,如果找
不到该文件,就返回空(nil).如给出驱动器/目录前缀时,AutoCAD仅在此目录中查
找(不再
沿库路径搜索).FINDFILE返回的全名适合于OPEN函数的使用(下例中我们用
"/"作为目录前
缀分隔符;在PC-DOS/MS-DOS系统上用"/"或者""作分隔符均可).
例如,假设
.当前目录是"/acad/"并有文件""
.正在编辑"/acad/drawings"目录中的一图形文件
.系统环境变量ACAD设置为"/acad/support"
实用文案
标准文档
.""文件仅存在于"acad/support"目录中
.库搜索路径上均无"nosuch"文件
那么:
(findfile"")将返回"acad/"
(findfile"")将返回"acad/support/"
(findfile"nosuch")将返回nil
46(fix<数>)
这个函数返回<数>转换为整数的结果.<数>可以是整型或实型.如果是实数,
就舍去小数
部分,截尾至最近的整型数.例如:
(fix3)returns3
(fix3.7)returns3
47(float<数>)
这个函数返回<数>转换为实型数的结果.<数>可以是整型或实型的.例如:
(float3)returns3.0
(float3.75)returns3.75
48(foreach<名称><表><表达式>...)
这个函数扫过整个<表>,将表中每个元素依次赋给<名称>,对于表中的每一个
元素计算
每一个<表达式>的值.可以指定任意个<表达式>.FOREACH返回最后<表达式>
的计算结果.
实用文案
标准文档
例如:
(foreachn'(abc)(princn))
和
(printa)
(printb)
(printc)
等价,只是FOREACH只返回最后表达式的计算结果.
49(gcd<数1><数2>)
这个函数返回<数1>和<数2>的最大公约数.<数1>和<数2>必须都是整数.
例如:
(gcd8157)returns3
(gcd1220)returns4
50(getangle[<点>][<提示>])
这个函数为用户输入一个角度而暂停.<提示>是一个任选的字符串,它作为提
示符显示,
<点>是一个任选的二维基点(当前UCS坐标系统).返回的角度(以弧度表示)是相
对于当前构
造平面(即当前UCS坐标系统的XY平面,且在当前的Z向层高上).用户可以用
AutoCAD的当前
角度单位格式键入一个数来指定一个角度.注意,虽然当前的角度单位格式可能是
度、弧度
实用文案
标准文档
或其它单位,但这个函数总是返回的弧度值.
用户还可以在图形屏幕上指定两个二维点,向AutoLISP"显示"这角
度.AutoCAD会从第一
点到当前光标位置画一条皮筋线,以辅助用户观察这个角度.若指定了
GETANGLE任选的<点>
变元,它就被用作为这两点的第一点,让用户只要指定另一点就能向AutoLIST"显
示"这个角
度(用户可以给定一个三维基点,但这可能引起混乱,因为通常是在当前作图平面
上测量角
度).
下面是一些调用GETANGLE的例子:
(tqang(getangle))
(tqang(getangle'(1.03.5)))
(tqang(getangle"whichway?"))
(tqang(getangle'(1.03.5)"whichway?"))
不能输入另一个LISP表达式来响应GETANGLE的请求.如果这样做,则会显示
信息"Can't
reenterAutoLIST"(不能再次输入AutoLISP).参见GETORIENT和INITGET.
51(getcorner<点>[<提示>])
和GETPOINT函数一样,GETCORNER函数返回一个点(当前UCS坐标系统).
但GETCORNER要求
输入一个<基点>变元,并要求用户在屏幕上移动光标,从<基点>位置画一个矩形.
实用文案
标准文档
详见GETPO
INT和INITGET.
基点以当前UCS坐标系统表示,若用户给出一个三维基点,将忽略其Z坐标;总
以当前Z向
高度作为Z坐标.
不能输入另一个LISP表达式来响应GETCORNER的请求.
52(getdist[<点>][<提示>])
这个函数为用户输入一个距离值而暂停.<提示>是一个任选的字符串,它作为
提示符显
示,<点>是任选的二维或三维基点(当前UCS坐标系统).用户可以用AutoCAD当
前的距离单位
格式输入一个数来指定距离.注意,虽然当前距离单位格式可以是英尺和英寸(建
筑上用),
但是这个函数返回的距离值总是实数.
用户还可以指定两个点,AutoCAD将返回点间距离值.AutoCAD在第一点和当
前光标位置之
间画一条皮筋线,以辅助用户观察这个距离.若指定了GETDIST的任选的<点>变
元,它就被用
作为两点中的第一点.
当采用两点输入方式时,GETDIST测试系统变量FLATLAND和INITGET函数的"
三维点"标志,
以便确定如何计算距离.若FLATLAND为零,返回点间三维距离.若FLATLAND不
实用文案
标准文档
为零时,仅在IN
ITGET的"三维点"标志被设置时才返回三维距离;否则以二维点对待.
下面GETDIST用法举例:
(tqdist(getdist))
(tqdist(getdist'(1.03.5)))
(tqdist(getdist"Howfar"))
(tqdist(getdist'(1.03.5)"Howfar?"))
不能输入另一个LISP表达式来响应GETDIST的请求.参见INITGET.
53(getenv<变量名>)
这个函数返回赋给系统环境变量的字串.<变量名>变元是要读出的环境变量
名的字符
串.若不存在此变量,则返回空(nil).
例如,若系统环境变量ACAD设置成"/acad/support/",同时不存在NOSUCH
变量,那么,
(getenv"ACAD")将返回"/acad/support/"
(getenv"NOSUCH")将返回nil
注:在基于UNIX的系统中,对大、小写字母是有区别的,因此"ACAD"及"acad"
将作为两
个不同的环境变量.
54(getint[<提示>])
这个函数为用户输入一个整数而暂停,并返回这个整数.数值范围为-32768~
实用文案
标准文档
+32767.
<提示>是一个任选的字符串,作为提示符显示.例如:
(tqnum(getint))
(tqnum(getint"Enteranumber:"))
不能输入另一个LISP表达式来响应GETINT的请求.参见INITGET.
55(getkword[<提示>])
GETKWORD函数要求用户输入一个关键字.在调用GETKWORD之前须先用
INITGET函数(见下
述)设置一个有效的关键字表.GETKWORD把与用户输入相匹配的关键字作为字
符串返回.如
果输入的不是关键字表中已存在的关键字,那么AutoCAD会要求重新输入.若是
空输入,则函
数返回nil(如果允许空输入的话).如果没有建立关键字表,也返回nil.例如:
(initget1"YesNo")
(tqx(getkword"areyousure?(YesorNo)"))
将提示用户,并根据用户的响应置符号x为Yes或No.如果用户的响应不能与
任一关键字
匹配,或用户给出的是空响应,那么AutoCAD会要求用户重新输入.
不能输入另一个LISP表达式来响应GETKWORD的要求.参见INITGET.
56(getorient[<点>][<提示>])
在AutoLISP中,角度总是用弧度制表示,零度基准方向一般是向右(东方),角度
实用文案
标准文档
增加方向
一般是逆时针方向.如果用户使用UNITS命令或ANGBASE、ANGDIR系统变量
选择了不同的零
度基准和角度增加的方向,那么有时可能需要一些转换.
GETORIENT类似于GETANGLE函数,但零度基准方向和角度增大方向对这两
个函数的作用
方式不同.在需要知道旋转大小(相对角度)的情况下应使用GETANGLE;而在需要
取得方位(
绝对角度)的情况下应使用GETORIENT.
假设,现使用AutoCAD的UNITS命令选中了零度基准为90°(朝北),并按顺时
针方向增大
角度.下面的表格表示对用户输入的不同的角度,GETANGLE和GETORIENT将
返回什么弧度值.
Input(度)GETANGLEGETORIENT
--------------------------------------------------------------------
00.0000001.570796
-901.5707963.141593
1803.1415934.712389
904.7123890.000000
如表中所列,GETANGLE考虑角度增加方向;而不考虑零度基准.所以,用户可用
GETANGLE
实用文案
标准文档
获得块插入的旋转量,因为输入0角度总是导致输出00弧度.另一方
面,GETORIENT既考虑零
度基准,也考虑角度增加方向,用它可以正文项获得基准线角度.例如,上述UNITS
设置中,水
平向正文的基准线方位角为90度.
同GETANGLE一样,返回角度以弧度表示,对应于当前作图平面.
不能输入另一个LISP表达式来响应GETORIENT的请求.参见GETANGLE和
INITGET.
57(getpoint[<点>][<提示>])
这个函数为用户输入一个点而暂停.<点>是一个任选的二维或三维基点(当前
UCS坐标系
统),<提示>是一个作为提示符显示的任选字符串.用户可以用当前单位格式键入
一个坐标
点来指定一点.如果有基点变元<点>,那么AutoCAD就会从该点向当前的光标
位置画一条皮
筋线.
(tqp(getpoint))
(tqp(getpoint"Where?"))
(tqp(getpoint'(1.52.0)"Secondpoint:"))
返回点以UCS坐标系统表示,若系统变量FLATLAAND为零,GETPOINT返回
一个三维点.否则
返回二维点,此时若使用INITGET函数设置三维点的控制标志,则可使
实用文案
标准文档
GETPOINT返回一个三
维点.不能输入另一个LISP表达式来响应GETPOINT的请求.参见GETCORNER
和INITGET.
58(getreal[<提示>])
这个函数为用户输入一个实数而暂停,并返回这个实数.<提示>是一个作为提
示符显示
的任选字符串.例如:
(tqval(getreal))
(tqval(getreal"Scalefactor:"))
不能输入另一个LISP表达式来响应GETREAL的请求.参见INITGET.
59(getstring[
GETSTRING为用户输入一字符串而暂停.并返回那个字符串.如果字符串长度
超过132个
字符,则只返回前面的132个字符.如果提供了
串中可包含
空格(因此必须要用RETURN来终止).否则,输入的字符串可用空格键或RETURN
来终止.<提示
>是一个任选的字符串,它作为提示符显示.例如:
(tqs(getstring))
(tqs(getstring"what'syourfirstname?"))
(tqs(getstring"What'syourfullname?"))
实用文案
标准文档
如果用户的输入必须是若干任选关键字之一,则可用上述的GETKWORD函数
替代.
不能输入另一个LISP表达式来响应GETSTRING的请求.
60(getvar<变量名>)
这个函数用于提取AutoCAD系统变量的值.变量名并须用双引号引起来.例如,
假定最后
一次指定的圆角半径为0.25个单位,那么:
(getvar"FILLETRAD")wouldreturn0.25
如果用GETVAR提取AutoCAD未知的一个系统变量,则会返回nil.当前
AutoCAD的系统变量
一览表可以在<
61(graphscr)
GRAPHSCR函数在单屏幕系统上把正文屏幕转换为图形屏幕(类似于
AutoCAD的"FLIPSCR
EEN"功能键).GRAPHSCR总是返回nil.参见TEXTSCR函数.
62(if<测试表达式>
这个函数根据条件计算表达式.如果<测试表达式>不是nil,那么就计算
表达式>;
否则计算
的表达式的
值;如果
实用文案
标准文档
(if(=13)"YES!!""no.")returns"no."
(if(=2(+11)"YES!!")returns"YES!!"
(if(=2(+34)"YES!!")returnsnil
63(initget[<字位>][<串>])
本函数为其后使用的GET族(GETxxx)函数(除GETSTRING和GETVAR外)建
立各种任选项.
INITGET函数总是返回nil.任选的<字位>变元(是整数)可取下列值:
INITGET字位值意义
---------------------------------------------------------------
1不接受空串
2不接受零值
4不接受负值
8不检查图形范围,既使LIMCHECK系统变量处于开态
16返回三维点,而不是二维点
32用虚线画皮筋线或框
字位值可以任何组合方式累加成一个0到63之间的整数(以后的AutoLISP版
本将会使用
新的INITGET控制字位,所以用户应避免指定此处未说明的字位).如果系统变量
FLATLAND为
零,就假定"三维点"标志已设置.
如果用户的输入不符合指定的一个或几个条件(如在不允许零值的情况下输入
实用文案
标准文档
了零),Au
toCAD会显示信息,要求用户重新输入.例如:
(initget(+124))
(tqage(getint"Howoldareyou?"))
将取得用户的年龄,如果用户输入空值、负数或零,系统会自动要求重新输入.
如果没有
说明<字位>变元,则认为其值是零(无条件).特殊控制值与GET族函数的关系如
下表所示:
INITGET控制值可以使用
-----------------------------------------------------
函数非空非零非负无限制三维点使用虚线
GETINT***
GETREAL***
GETDIST*****
GETANGLE***
GETORIENT***
GETPOINT****
GETCORNER****
GETKWORD*
GETSTRING
GETVAR
控制字位值32在用于GETPOINT、GETCORNER、GETDIST、GETANGLE
实用文案
标准文档
和GETORIENT函数,此
时这些GETxxx函数必须给出基点,以便从指定的基点出发用虚线(或加亮的线)
来画皮筋线
或框.如果系统变量POPUPS为零,则表示显示驱动程序不支持高级用户接
口,AutoCAD将忽略
INITGET的该字位值(32).
INITGET的任选<串>变元定义了一个任选的关键字表,用于对其后GETxxx函
数的输入值
进行检查,以便判断用户的输入是否与规定的输入类型相符(如GETPOINT规定
要输入一个点
).如果用户的输入与表中某一个关键字相匹配,则GETxxx函数以字符串形式返回
被匹配的
关键字.用户程序可测试关键字,并为每个关键字执行所需的操作.如果用户输入
不符合规
定的类型,也与任何关键字都不匹配,那么AutoCAD会要求用户重新输入.
关键字表的形式必须是"key1key2key3,ABBREV3...",每个关键字之间要用
空格分隔
也可采用任选的缩写方式.可以用如下两种方法进行关键字的缩写:一是把要缩写
的字母用
大写表示,其余字母用小写字母;二是把缩写字母放在整个关键字(全部用大写字
母)的后面
并用逗号将它们分隔开.第二种方法常用于开发非英语书写的程序,这时可能很难
实用文案
标准文档
或不可能
进行字母大小写转换.无论用哪种方法,缩写字的长度等于用户输入的、能与关键
字正确匹
配的字符数.
例如,下面的几种说明:
"LTYPE,LT"和
"LType"
是等价的,表示可接受用户输入的LTYPE、LTYP、LTY或LT,但输入L是不够
的,LTSCALE和
LTYPEX不匹配.
让我们来看下面一个用户定义的函数:
(defungetnum(/x)
(initget1"piTwo-pi")
(tqx(getreal"pi/Two-pi/
(cond((eqx"pi")pi)
((eqx"Two-pi")(*2.0pi))
(Tx)
)
)
这里的INITGET不允许空输入,并建立起一个由两个关键字pi和Two-pi组成
的表.然后用
GETREAL读取一个实数,发出提示"Pi/Two-pi/<数>:",并把结果读给局部符号.
实用文案
标准文档
如果用户输
入了一个数,那么GETNUM返回那个数.但如果用户输入了关键字pi或P,那么
GETREAL返回关
键字函数测试该值,在本例中则返回pi的值.对关键字Two-pi的处理
方法也相同.
INITGET建立的控制标记和关键字表只对紧跟其后的GETxxx函数起作用,
然后自动清
除,这避免了以后其它函数调用时还要清除这些特定的控制条件.
64(inters<点1><点2><点3><点4>[<在线段上>])
INTERS函数检查两条直线是否相交,如果相交,则返回交点坐标;如果不相交,
则返回nil
.<点1>和<点2>是第一条线段的两个端点,<点3>和<点4>是第二条线段的两
个端点.所有点
均以当前UCS坐标系统表示.如果系统变量FLATLAND为零,并且4个点变元都
是三维,INTERS
检验三维相交;否则INTERS将各线段投影至当前构造平面,同时仅检验二难相交.
如果有任
选的变元<在线段上>,且为nil,则认为直线长度是无限的,那么INTERS将返回两
条直线的交
点,即使这个交点在两条线段的延长线上.如果<在线段上>变元没给出或不为nil,
那么交点
仅当在两条直线上才予返回,否则INTERS返回nil.例如,已知:
实用文案
标准文档
(tqa'(1.01.0)b'(9.09.0))
(tqc'(4.01.0)d'(4.02.0))
那么:
(intersabcd)returnsnil
(intersabcdT)returnsnil
(intersabcdnil)returns(4.04.0)
65(itoa<整数>)
这个函数返回整数转换为字符串的结果.例如:
(itoa33)返回"33"
(itoa-17)返回"-17"
66(lambda<变元><表达式>...)
LAMBDA定义一个"无名"函数.当用defun定义一个新函数不合算时就可以
用这个函数.把
无名函数放置在使用的地方,这样使得程序员的意图更加明显.LABMDA返回它
的最后表达式
的值,它常与APPLY和/或MAPCAR一起使用来执行表中的函数.例如:
(apply'(lambda(xyz)
(*x(-yz))
)
'(52014)
)returns30
实用文案
标准文档
和:
(tqcounter0)
(mapcar'(lambda(x)
(tqcounter(1+counter))
(*x5)
)
'(24-610.2)
)returns(1020-3051.0)
67(last<表>)
这个函数返回<表>中的最后一个元素.<表>必须不是nil.例如:
(last'(abcde))return
(last'(abc(de)))returns(de)
如上所示,LAST可能返回一个原子或一个表.
乍看,用LAST来取得一个点的Y坐标似乎是一种理想的方法.对二维点(由两
个实数组
成的表),LAST确能这样做;但对三维点,LAST返回的是Z坐标.为了使函数在
二维或三
维点的情况上都能正常运行,我们建议使用CADR来取得Y坐标,使用
CADDR来取得Z坐
标.
实用文案
标准文档
68(length<表>)
这个函数返回一个整数,该整数指明<表>中元素的数目.例如:
(length'(abcd))returns4
(length'(ab(cd)))returns3
(length'())returns0
69(list<表达式>...)
这个函数将任意数目的<表达式>串连在一起,返回它们组成的表.例如:
(list'a'b'c)returns(abc)
(list'a'(bc)'d)returns(a(bc)d)
(list3.96.7)returns(3.96.7)
在AutoLISP中,常用该函数定义二维点或三维点(两个实数或三个实数构成的
表).
70(listp<项>)
如果<项>是一个表,这个函数就返回T;否则返回nil.例如:
(listp'(abc))returnsT
(listp'a)returnsnil
(listp4.343)returnsnil
71(load<文件名>[<失败时>])
这个函数装入一个由AutoLISP表达式构成的文件,并计算这些表达式.<文件
名>是一个
代表文件名称的字符串,它不必有扩展名(AutoLISP假定扩展名为.lsp).<文件名>
实用文案
标准文档
可以包括
目录名前缀.如"/function/test1".在MS-DOS/PC-DOS系统上允许使用驱动器
字母,并可用
反斜杠来代替斜杠.
若<文件名>字符串中无目录前缀,LOAD就采用类似FINDFILE函数所用的方
式,沿AutoCAD
库路径搜索指定文件.如在路径上找到相应文件,LOAD就将它装入.
如果操作成功,LOAD返回文件中最后一个表达式的值,通常这是文件中最后定
义的那个
函数名.LOAD操作失败时,一般产生一个AutoLISP错误信息,但是,如果给定了<
失败时>变元
,LOAD返回该变元值以替代错误信息.这样,在AutoLISP应用中,可在调用LOAD
失败时能够采
取不同的行动.当然,用户应确信<失败时>变元与文件中最后一个表达式的值是
不一样的;
否则LOAD返回值的意义就不明确了.
例如,假设文件"/fred/"含有:
(defunMY-FUNC1(x)
...函数体...
)
(defunMY-FUNC2(x)
...函数体...
实用文案
标准文档
)
并且不存在""文件,那么
(load"/fred/test1")返回MY-FUNC2
(load"/fred/test1""bad")返回MY-FUNC2
(load"test2""bad")返回"bad"
(load"test2")产生一个AutoLISP错误
在别的AutoLISP函数中可以调用LOAD函数,甚至它还可被正在装入的文件递
归调用.
每次AutoCAD图形编辑程序启动时,若文件存在,AutoLISP就装入这
个文件.可以
将函数定义放置于这个文件中,每次开始编辑图形时,它们就被自动地定义.若想
在启动图
形编辑程序时,能够自动执行一串AutoCAD命令或AutoLISP函数,用户可在
""文件
中设置特殊函数"S::STARTUP"的DEFUN定义:如果这个函数存在,AutoCAD在
开始编辑时就自
动执行此函数(见DEFUN举例说明).
AUTOLISP函数参考3(10版本)
72(log<数>)
这个函数返回<数>的自然对数,其结果为实数,例如:
实用文案
标准文档
(log4.5)returns1.50408
(log1.22)returns0.198851
73(logand<数><数>...)
这个函数返回表中一系列<数>的按位方式的逻辑"与"结果.其中<数>必须是
整数,结果
也是一个整数.例如:
(logand7153)returns3
(logand2315)returns2
(logand834)returns0
74(logior<数><数>...)
这个函数返回表中一系列<数>的按位方式的逻辑"或"结果.其中<数>必须为
整数,其结
果也是整数.例如:
(logior124)returns7
(logior93)returns11
75(lsh<数1><位数>)
这个函数返回<数1>被<位数>变换后的逻辑位值.<数1>和<位数>必须是
整数,其结果也
是整数.
如果<位数>为正,<数1>就变换至左位;如果为负,则变换至右位.在这两种情
况下,移入
实用文案
标准文档
位为"零",移出位丢弃.如果有位"1"移入或移出了整数的最高位(在DOS机上是第
十六位,在
32位工作站上是第32位),整数的符号就会改变.
例如:
(lsh21)returns4
(lsh2-1)returns1
(lsh402)returns160
(lsh163841)returns-32768onDOSmachines
(lsh16384-1)returns32768on32-bitworkstations
76(mapcar<函数><表1>...<表n>)
MAPCAR返回<函数>的执行结果,它分别把<表1>到<表n>的每个元素作
为<函数>的变元.
<函数>后面的表的数目必须要与<函数>所需要的变元数目相匹配.例如:
(tqa10b20c30)
(mapcar'1+(listabc))returns(112131)
这等效于:
(1+a)
(1+b)
(1+c)
只是MAPCAR返回的结果为一个表.同理:
(mapcar'+'(102030)'(432))returns(142332)
和下列写法等效:
实用文案
标准文档
(+104)
(+203)
(+302)
LAMBDA函数可以指定一个"无名"函数,此"无名"函数可由MAPCAR执行.当有
些函数变元是
常数时或用其它手段提供时,这种方法便显得非常有用.例如:
(mapcar'(lambda(x)(+x3))'(102030))returns(132333)
和:
(mapcar'(lambda(xyz)
(*x(-yz))
)
'(56)'(2030)'(145.0)
)returns(30150.0)
77(max<数><数>...)
这个函数返回所给<数>中最大的数.每一个<数>必须是实数或整数.例如:
(max4.07-144)returns4.07
(max-881952)returns19
78(member<表达式><表>)
这个函数搜索表中的<表达式>,返回<表>中从第一次<表达式>出现到最后
所剩的内容.
如果在<表>中没有出现过<表达式>,MEMBER将返回nil.例如:
实用文案
标准文档
(member'c'(abcde))returns(cde)
(member'q'(abcde))returnsnil
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表示辅助菜单(AUX1)
子菜单代表指定要激活的子菜单名.它可以是当前(已装入的)菜单文件中任
一子菜
单名(不带"**"前缀)或是主菜单类名.
实用文案
标准文档
详见AutoCAD参考手册的附录B.注意,这里不需要菜单文件中子菜单名所用
的前缀符$.
例如:(menucmd"S=OSNAP")
使屏幕上出现OSNAP子菜单(假设在当前菜单文件中有这个子菜单).同样,
(menucmd"B=MY-BUTTONS")
将子菜单MY-BUTTONS赋给按钮菜单.
对于图标菜单和下拉式菜单,"*"是一个有效的子菜单名,它使当前已具有指定
菜单类
别的子菜单在屏幕上显示.如序列:
(menucmd"P1=NUMERIC")
(menucmd"P1=*")
先向下拉式菜单1指定子菜单NUMERIC,然后在屏幕上显示该子菜单.
80(min<数><数>...)
这个函数返回所有<数>中最小值的数.每一个<数>可以是实型或整型.例如:
(min683-10.0)returns-10.0
(min732485)returns2
81(minusp<项>)
如果<项>为实数或整数,且为负值,那么此函数返回T;否则返回nil.对于其它类
型的<项>
没有定义.例如:
实用文案
标准文档
(minusp-1)returnsT
(minusp-4.293)returnsT
(minusp830.2)returnsnil
82(not<项>)
如果<项>的计算值为nil时,此函数返回T;否则返回nil.特别地在和一些控制
函数连用
时,NULL函数常用于表,而NOT用于其它数据类型.例如,对于下列赋值:
(tqa123)
(tqb"string")
(tqcnil)
则有:
(nota)returnsnil
(notb)returnsnil
(notc)returnsT
(not'())returnsT
83(nth
这个函数返回<表>中的第n个元素,其中
个元素).如
果
(nth3'(abcde))returnsd
实用文案
标准文档
(nth0'(abcde))returnsa
(nth5'(abcde))returnsnil
84(null<项>)
如果<项>的约束值是nil,此函数返回T;否则返回nil.例如,对于下列赋值:
(tqa123)
(tqb"string")
(tqcnil)
则有:
(nulla)returnsnil
(nullb)returnsnil
(nullc)returnsT
(null'())returnsT
85(numberp<项>)
如果<项>是一个实数或整数,此函数返回T;否则返回nil.例如,对于下列赋值:
(tqa123)
(tqb'a)
则有:
(numberp4)returnsT
(numberp3.8348)returnsT
(numberp"Howdy")returnsnil
(numberp'a)returnsnil
实用文案
标准文档
(numberpa)returnsT
(numberpb)returnsnil
(numberp(evalb))returnsT
86(open<文件名><方式>)
这个函数打开一个文件,以便AutoLISP的I/O函数进行存取.它返回文件描述
符,这个描
述符由其它的I/O函数所使用;因此,它必须要用SETQ赋给一个变量.例如:
(tqa(open"""r"))
<文件名>是一个字符串,它指定了要打开的文件名和扩展名.<方式>为读/写
标志,它必
须是由单个小写字母组成的字符串.下表是对有效方式字符的说明:
OPEN方式说明
---------------------------------------------------------------------------
"r"(读)为"读"打开文件.如果<文件名>不存在,则返回nil.
"w"(写)为"写打开文件.如果<文件名>不存在,则建立一个新文件,
并打开该文件.如果<文件名>存在,则覆盖它的现存数据.
"a"(添写)为"添写"打开文件.如果<文件名>不存在,则建立一个新文
件,
并打开该文件.如果<文件名>存在,则打开该文件,并指向现存
数据的尾部,这样,用户写入文件的所有新数据都将附加到现
存数据的后面.在DOS中,某些程序的文本编辑在写入文本文件
实用文案
标准文档
时会在文本尾部加上一个文件结束标记(CTRL-Z,十进制的ASC
II码26).在读文本文件时,当碰到CTRL-Z标记,DOS便返回文件
结束状态,即使在结束标记后面可能还有数据.如果您想用OPE
N的"a"方式在由其他程序产生的文件后面附加数据,则必须保
证这些程序没有在其文本文件尾部插入CTRL-Z标记.
假设在下例中的文件名都不存在,那么:
(tqf(open"""w"))returns
(tqf(open"""r"))returnsnil
(tqf(open"logfile""a"))returns
<文件名>可包括目录名前缀,如"/test/func3".在MS-DOS/PC-DOS系统上
允许使用驱动
器字母,并可用反斜杠代替斜杠(但要记住,在字符串中必须要用""才能得到一个
反斜杠)
.例如:
(tqf(open"/x/""w"))returns
(tqf(open"""r"))returnsnil
87(or<表达式>...)
这个函数返回一系列表达式的逻辑或(OR).OR对表达式从左向右进行求值,寻
找一个非
nil的表达式.如果找到了一个非nil表达式,则停止继续求值,并返回T.如果所有的
表达式
实用文案
标准文档
的计算值都为nil,则OR返回nil.例如:
(ornil45'())returnsT
(ornil'())returnsnil
88(osnap<点><方式串>)
这个函数返回一个点,这个点是对<点>施加了由<方式串>所描述的目标捕捉
方式而得的
结果.<方式串>是由一个或多个有效的目标标识符组成的字符串,如
"midpoint","center"
等等,它们之间用逗号隔开.例如:
(tqpt2(osnappt1"midp"))
(tqpt2(osnappt1"midp,endp,center"))
如果<点>变元是一个二维点(由两个实数组成的表),则返回一个二维点.如果<
点>变元
是三维点(由三个实数组成的表),则返回一个三维点.如果对已知<点>找不到与
指定<方式
串>匹配的目标捕捉点,则返回nil.
这个函数的操作取决于当前三维视图的FLATLAND系统变量的设置状况.详
见AutoCAD参
考手册第八章及附录D.
89pi
这不是一个函数,而是常数π.它的值大约是3.1415926.
实用文案
标准文档
90(polar<点><角><距离>)
这个函数返回一个UCS坐标系统的点,该点角度为<角>,与UCS坐标系统点
>.<角>以弧度表示,是以x轴开始逆时针方向计算的.
角>总是相对
于当前构造平面而言.若系统变量FLATLAND为零,就返回一个三维点;否则返回
一个二维点.
例如(假设FLATLAND为零):
(polar'(1.01.035)0.7853981.414214)返回(2.02.03.5)
91(prin1<表达式>[<文件描述符>])
这个函数在屏幕上打印<表达式>,并返回<表达式>.<表达式>可以是任何表
达式,也可以
不是字符串.如果指定了<文件描述符>,(并且是一个为写而打开的文件描述符),
那么<表达
式>按照它在屏幕上显示的格式写入那个文件.只有被指定的<表达式>才会打印;
其中不包
括换行符和空格.例如,对于下列赋值:
(tqa123)
(tqb'(a))
则有:
(prin1'a')打印a并返回a
(prin1a)打印123并返回123
实用文案
标准文档
(prin1b)打印(a)并返回(a)
(prin1"Hello")打印"Hello"并返回"Hello"
以上每个例子都在屏幕上打印,因为没有指定<文件描述符>.假设f是一个为
写而打开的
有效文件描述符,则:
(prin1"Hello"f)
将把"Hello"写到指定的文件中,并返回"Hello".
如果<表达式>是一个含有控制字符的字符串,那么PRIN1将用""开头按下列
方式编辑这
些字符:
e代表ESC
u代表换行
r代表回车
t代表tab
nnn代表八进制码为nnn的字符.
这样:
(prin1(chr2))打印"002"返回"002"
(prin1(chr10))打印"n"返回"n"
如果PRIN1没有变元,则返回名为空串的一个符号.如果把没有变元的PRIN1
用在用户定
义函数中最后的一个表达式,那么当函数结束只打印出一个空行,用这种方法可"
悄悄"退出
实用文案
标准文档
函数.例如,已知:
(defunC:SETUP()
(tvar"lunits"4)
(tvar"blipmode"0)
(prin1)
)
那么:
Command:SETUP
将执行用户定义的命令和要求的SETVAR函数,然后不打印信息而返回提示
"Command:".
92(princ<表达式>[<文件描述符>])
这个函数和PRIN1基本相同,它和PRIN1的区别是它能实现<表达式>中控制
字符的作用.
一般来说,PRIN1打印的表达式的方法和LOAD相兼容,而PRINC打印的表达式
可以由象READ-
LINE这样的函数读出.
93(print<表达式>[<文件描述符>])
这个函数除了在打印<表达式>之前先换行和在打印<表达式>之后打印空格
之外,其它和
PRIN1相同.
实用文案
标准文档
94(progn<表达式>...)
这个函数按顺序计算每一个<表达式>,返回最后表达式的求值结果.可以在只
能用一个
表达式的地方,用PROGN来完成多个表达式的计算.例如:
(if(=ab)(progn
(tqa(+a10))
(tqb(-b10))
)
)
一般情况下,IF函数在测试表达式的计算值不为nil时,只计算前面一个表达式,在
这个例
子中,我们用PROGN可计算两个表达式.
95(prompt<信息>)
这个函数将<信息>显示在用户的屏幕提示区,并返回nil.<信息>是一个字符
串.在AutoC
AD的双屏幕配置中,PROMPT在两个屏幕上都显示<信息>,因此它比PRINC更
可取.例如:
(prompt"Newvalue:")
将在屏幕上显示"Newvalue:",并返回nil.
96(quote<表达式>)
它返回没有计算的<表达式>.此函数还可以简写为:
实用文案
标准文档
表达式
例如:
(quotea)returnsA
(quotecat)returnsCAT
(quote(ab))returns(AB)
'areturnsA
'catreturnsCAT
'(ab)returns(AB)
(对于后三个例子,如果在命令提示符下直接从键盘输入它们,那么将不会执行
它们.记
住,这样的输入必须以"("或"!"开头,以表明这是一个LISP表达式).
97(read<字符串>)
这个函数返回从<字符串>中取得的第一个表或原子.<字符串>不能含有空格.
例如:
(read"hello")returnsHELLO
(read"hi")returnsHI
(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-linef)
将返回这个文件中的下一个输入行;若读到文件尾,则返回nil.
100(redraw[<实体名>[<方式>]])
本函数的作用取决于给出变元的个数.如果本函数的调用中没给出变元:
(redraw)
那么将重画当前视图,就如AutoCAD的REDRAW命令一样.如果在调用中给出
一个实体名变元:
(redraw
那么将重画选中的实体.在使用GRCLEAR清除屏幕后,使用本函数可在屏幕上标
识出所需的
实体,这是很有用的.有关实体名的说明参见本手册第五章.
如果在REDRAW调用中给出两个变元,那么就完全控制了实体的重画效应.
(redraw
这里<实体名>是要重画的实体名,<方式>是一个整数,具有下列值之一:
重画方式作用
----------------------------------------------------------------
1在屏幕上重画实体
2不画实体(隐去)
实用文案
标准文档
3加亮实体(若显示器具有加亮显示的功能)
4不加亮实体(若显示器具有去除加亮显示的功能)
若<实体名>代表一个复杂实体(多义线或具有属性的块)的头实体(即主实体)
时,则当<
方式>变元为正值,将处理主实体及其所有的子实体.当<方式>变元为负
值,REDRAW将只对头
实体进行操作.
101(rem<数1><数2>...)
这个函数将<数1>除以<数2>,返回其余数.(即:<数1>mod<数2>).rem可
以用于实数和整
数,按标准规则进行类型转换.例如:
(rem4212)returns6
(rem12.016)returns12.0
(rem603)returns0
102(repeat<数><表达式>...)
在这个函数中,<数>表示任意一个正整数.这个函数将每一个<表达式>计算<
数>次,返回
最后表达式的计算结果.例如,对于下列的赋值:
(tqa10)
(tqb100)
则有:
实用文案
标准文档
(repeat4
(tqa(+a10))
(tqb(+b10))
)returns140
103(rever<表>)
该函数返回元素被倒置后的<表>.例如:
(rever'((a)bc))returns(CB(A))
104(rtos<数>[<方式>[<精度>]])
这个函数返回一个字符串,这是一个根据<方式>和<精度>设置而加以编辑的
数型(为实
数)字符串.<方式>和<精度>都是整数,它们可用来选定线性单位方式和精度.所
支持的<方
式>值列表如下:
RTOS方式编辑格式
-----------------------------------------------
1科学计数法
2十进制
3工程(英尺和小数的英寸)
4建筑(英尺和分数的英寸)
5任意的分数单位
实用文案
标准文档
变元<方式>和<精度>分别与AutoCAD的系统变量LUNITS和LUPREC对
应.如果没给出,则
使用LUNITS和LUPREC的当前设置值.下面是RTOS的一些例子,已知
DIMZIN=0:
(rtos17.514)returns"1.7500E+01"
(rtos17.522)returns"17.50"
(rtos17.532)returns"1'-5.50"
(rtos17.542)returns"1'-51/2"
(rtos17.552)returns"171/2"
105(t<符号><表达式>)
它将<符号>的值(这里<符号>是一个引起来的符号名)置为<表达式>.这个函
数返回<表
达式>的计算结果.例如:
(t'a5.0)返回5.0并设置符号A
(t(quoteb)'a)返回A并设置符号B
如果t后的<符号>没有引起来,则会把一个新值间接赋给另一个符号.例如,在
上例中:
(tb640)返回640
将把值640赋给符号A(因为它正是符号B所包含的).参见下面的SETQ.
106(tq<符号1><表达式1>[<符号2><表达式2>]...)
这个函数将<符号1>的值置为<表达式1>,将<符号2>的值置为<表达式2>,
实用文案
标准文档
如此进行下去.
这是AutoLISP中的基本赋值函数.例如:
(tqa5.0)returns5.0
它将符号A置为5.0.每当用到A时,它的值都为实型数5.0.另一些例子如下:
(tqb123c4.7)returns4.7
(tqs"it")returns"it"
(tqx'(ab))returns(AB)
SET和SETQ函数用于建立和修改全局符号,也可在DEFUN函数体中用于给
函数变元赋值或
给局部符号(在DEFUN中被说明的)赋值.例如:
(tqglo1123);建立一个全局符号
(defundemo(arg1arg2/loc1loc2)
(tqarg1234);局部赋值
(tqloc1345);局部赋值
(tqglo1456);对全局符号赋值
(tqglo2567);建立全局符号
全局符号可用在各种表达式中,也可被各种函数访问或修改.局部符号和函数变
元只在
定义它们的函数(或被此函数调用的函数)中被求值时才有意义.注意,函数变元可
用作局部
符号;在函数中可以改变其值,但退出函数后这种改变不再有效.
SET和SETQ可把新值赋给AutoLISP的内部符号和函数名,而取消原来的赋
实用文案
标准文档
值或使它们
不能被存取.一些用户竟然试图这样做:
(tqangle(...));错!
(tqlength(...));错!
(tqmax(...));错!
(tqt(...));错!
(tqpi3.0);错!
为避免出现各种奇怪的错误,用户在选择符号名时必须十分小心,所选的符号
名决不
能和内部的符号或函数名相同!可以在调入任何AutoLISP函数之前对
"Command:"提示
符回答"!ATOMLIST",用来查看所有应避免使用的符号名表.
107(tvar<变量名><值>)
这个函数将AutoCAD系统变量置为给定的<值>,并返回这个值.其中的<变量
名>必须用双
引号起来.例如:
(tvar"FILLETRAD"0.50)returns0.5
它将AutoCAD的圆角半径置为0.5个单位.对于整数型系统变量,给定的<值>
应在-32768
至+32767范围内.
有些AutoCAD命令是在发出提示前读取系统变量的值.如果在执行命令的过
程中使用SET
实用文案
标准文档
VAR来设置一个新值,那么可能要在执行下一条AutoCAD命令时该设置才会起
作用.
在<
统变量一览表.参
看GETVAR函数.
AUTOLISP函数参考4(10版本)
108(sin<角>)
这个函数返回<角>的正弦值,其中<角>为弧度表示.例如:
(sin1.0)returns0.841471
(sin0.0)returns0.0
109(sqrt<数>)
这个函数返回<数>的平方根,它是一个实数.例如:
(sqrt4)returns2.0
(sqrt2.0)returns1.41421
110(strca<字符串>[<哪一种>])
STRCASE根据第二个变元<哪一种>的值把<字符串>变元所指定的串的全部
字符转换为大
写字母或小写字母,并返回其拷贝.如果<哪一种>被省略或值为nil,则把<字符串>
的所有字
符转换为大写字母;如果指定了<哪一种>,且值不为nil,则把字符串的所有字符转
实用文案
标准文档
换为小写
字母.例如:
(strca"sample")returns"SAMPLE"
(strca"sample"T)returns"sample"
111(strcat<串1><串2>...)
这个函数返回一个字符串,这个字符串是字符串<串1>,<串2>等的连续结果.
例如:
(strcat"a""bout")returns"about"
(strcat"a""b""c")returns"abc"
(strcat"a""""c")returns"ac"
112(strlen<字符串>)
这个函数返回<字符串>的长度,它为一个整数.例如:
(strlen"abcd")returns4
(strlen"ab")returns2
(strlen"")returns0
113(subst<新项><旧项><表>)
这个函数从<表>中搜寻<旧项>,用<新项>替代每次出现的<旧项>,并返回替
换后的表.
如果<表>中没找到<旧项>,SUBST将返回未经更改的<表>.例如,已知:
(tqsample'(ab(cd)b))
那么:
实用文案
标准文档
(subst'qq'bsample)returns(AQQ(CD)QQ)
(subst'qq'zsample)returns(AB(CD)B
(subst'qq'(cd)sample)returns(ABQQB)
(subst'(qqrr)'(cd)sample)returns(AB(QQRR)B)
(subst'(qqrr)'zsample)returns(AB(CD)B)
当SUBST和ASSOC一起使用时,它提供一种很好的手段.这种手段能方便地替
换与关联表
中的一个关键字相关的值.例如对于下列赋值:
(tqwho'((firstjohn)(midq)(lastpublic)))
那么:
(tqold(assoc'firstwho))returns(FIRSTJOHN)
(tqnew'(firstj))returns(FIRSTJ)
(substnewoldwho)returns((FIRSTJ)(MIDQ)(LASTPUBLIC))
114(substr<字符串><起点>[<长度>])
这个函数返回<字符串>的一个子串,这个子串从<字符串>的<起点>字符位
置开始,连续
<长度>个字符.如果没有指定<长度>,子串就延续到<字符串>的末尾.<起
点>(和<长度>,如
果有的话)必须是正整数.<字符串>的第一个字符为第一位.例如:
(substr"abcde"2)returns"bcde"
(substr"abcde"21)returns"b"
(substr"abcde"32)returns"cd"
实用文案
标准文档
115(terpri)
这个函数在屏幕上打印一换行符.它返回空.TERPRI不用于文件的I/O操作.若
要将换行
符写入文件中,可用PRINT或PRINC.
116(textscr)
TEXTSCR函数用于在单屏幕系统上把图形屏幕转换到文本屏幕(如AutoCAD
的"FLIPSCREE
N"功能键).TEXTSCR总是返回nil.参阅GRAPHSCR函数.
117(trace<函数>...)
这个函数是一个调试辅助工具.它为指定的<函数>设置跟踪标志,并返回函数
的名称.
以后每次计算<函数>时,将出现一个跟踪显示,它表示函数的入口(按调用深度缩
排打印在
屏幕上),并且打印函数的结果.例如:
(tracemy-func)returnsMY-FUNC
并为函数MY-FUNC设置跟踪标志.参看UNTRACE.
118(trans<点><从><到>[<位移>])
这个函数将点(或位移)从一个坐标系统转换到另一坐标系统.<点>变元是由说
明三维
点或三维位移(矢量)的三个实数组成的表.<从>是一代码,它表明<点>的坐标系
统,而<到>
实用文案
标准文档
是指定返回点所希望的坐标系统的代码.如果任选项<位移>变元存在,并且为非
空时,<点>
将作为三维位移处理.
<从>和<到>两变元可能是下列形式之一:
.是一整型数代码,如下表
编码号坐标系
0通用(WCS)
1用户(当前的UCS)
2显示(对于当前视窗的DCS,见下述)
.是由函数ENTNEXT,ENTLAST,ENTSEL及SSNAME(见第五章)返回的一
个实体名.这
使用户能为一特定实体转换坐标系统(ECS).对某些实体,ECS与WCS坐标系统等
效;此时ECS与WCS间换算为一空操作.
.是一个三维延伸矢量(由三实数组成的表).这是另一种有关实体坐标系统
的换
算方法.但是对于ECS与WCS坐标系统等效的实体,此法无效.
TRANS按照<到>所要求的坐标系统,返回一个三维点(或位移).例如,给定某一
UCS坐标系统,它相对WCS中的Z轴反时针旋转90度:
(trans'(1.02.03.0)01)将返回(2.0-1.03.0)
(trans'(1.02.03.0)10)将返回(-2.01.03.0)
实用文案
标准文档
下面将说明TRANS支持的各坐标系统及其使用方法:
.WCS
这是"参考"坐标系统.其它坐标系统均相对它而定义.WCS是唯一不变的坐标
系
统.其主要用途是:相对于WCS测量的值可在与其他坐标系统的变换中保持恒
定.
.UCS
这是用户指定的"工作"坐标系统,以便使编辑任务更容易(在某些情况下,使其
成为可能).所有的点输入(包括从一AutoLISP表达式返回的点,但不包括前面
注有"*"的点)均相对坐标系统进行解释.因此,如果用户想给AutoCAD命令传
送WCS、ECS或DCS的值时,首先得用TRANS将它们换算成UCS坐标系统.
.ECS
由ENTGET(见第五章)返回的点值就是相对此坐标系统测量而得的.这种点在
换
算成与其用途相适应的坐标系统之前几乎是无用的.
例如,用户想从一段文本的插入基点画条线(不使用OSNAP),就应将Text实体
的
插入点的坐标,从Text实体的ECS坐标系统换算成UCS坐标系统:
(trans<文本插入点><文本实体名>1)
同时将结果送给"Frompoint:"提示符.相反,将点送给ENTMOD之前,必须将
该
实用文案
标准文档
点(或位移)值换算成预定的ECS系统.例如,如果用户想用相对于UCS为1,2,3
的
偏移来移动某圆(不用MOVE命令),则必须将位移从UCS坐标系统换算到该圆
的E
CS坐标系统:
(trans'(123)1<圆的实体名>1)
然后将计算的位移结果与圆的中心点相加.
.DCS
显示坐标系统是图像被显示前需要转换成的坐标系统.其原点是TARGET点,
其Z
轴是视图方向.用户总是处于DCS的"平面视图"(即当用户从某一视窗观察一
视
图时,其Y轴向上,X轴指向右方).它用来确定如何将一物体呈现在用户面前.
例如,用户输入一点,同时想找出看起来离该点最近的一条线的端点.为此必须
将用户输入的点从UCS坐标系统换算到DCS坐标系统:
(trans<用户点>12)
同时将线的每一个端点从该线的ECS坐标系统换算到DCS坐标系统:
(trans<端点><线的实体名>2)
这样便可以计算用户点与线的每一个端点的距离(忽略Z分量),从而确定那一
个
端点看起来距用户点更近些.
实用文案
标准文档
TRANS也能用一适当的值"填补"Z分量来转换二维点.所使用的Z分量取决于
指定的"从"
坐标系统,以及是否应将其值作为一点或位移进行换算."填补"Z分量的规则确定
如下:
从点位移
-----------------------------------------------------------------
WCS0.00.0
UCS当前的Z向高度0.0
ECS0.00.0
DCS投影至当前构造平面0.0
(UCSXY平面+Z向高度)
119(type<项>)
这个函数返回<项>的类型(TYPE),这里的类型是下列类型之一(作为一个原
子):
REAL浮点数
FILE文件描述符
STR字符串
INT整数
SYM符号
LIST表(及用户函数)
SUBRAutoLISP的内部函数
实用文案
标准文档
PICKSETAutoCAD的选择集
ENAMEAutoCAD的实体名
PAGETB函数分页表
例如,已知下列赋值:
(tqa123r3.45s"Hello!"x'(abc))
(tqf(open"name""r"))
则有:
(type'a)returnsSYM
(typea)returnsINT
(typef)returnsFILE
(typer)returnsREAL
(types)returnsSTR
(typex)returnsLIST
(type+)returnsSUBR
下面的例子说明如何使用TYPE函数:
(defunisint(a)
(if(=(typea)'INT);istypeinteger?
T;yes,returnT
nil;no,returnnil
)
)
实用文案
标准文档
120(untrace<函数>...)
这个函数清除<函数>的跟踪标志,返回函数名.它被用来解除跟踪调试.例如:
(untracemy-func)返回MY-FUNC
并清除了函数MY-FUNC的跟踪标志.参阅TRACE.
121(ver)
这个函数返回一个表示当前AutoLISP版本号的字符串.它可用于(和EQUAL
一起用)检查
程序的兼容性.字符串的形式如下:
"AutoLISPReleaX.X"
其中X.X是当前版本号.例如:
(ver)可能返回"AutoLISPRelea10.0"
在扩展AutoLISP中,VER返回字符串:
"ExtendedAutoLISPReleaX.X"
因此,测试VER返回的字符串,可分辨出当前是在何种AutoLISP(一般的,还是
扩展的)下
运行.
122(VPORTS)
这个函数返回当前工作的视窗说明表.每一个视窗说明是一个表,它由视窗标号
及视窗
的左下角及右上角的位置所组成.上述两个窗角用0.0至1.0间数值来表示,用(0.0
0.0)
实用文案
标准文档
代表屏幕绘图显示区的左下角,而(1.01.0)代表右上角.
例如,给定单个视窗匹配,VPORTS函数应返回:
((1(0.00.0)(1.01.0))
同样,给定4个分布在屏幕四角的等幅的视窗配置,VPORTS应返回:
((5(0.50.0)(1.00.5))
(2(0.50.5)(1.01.0))
(3(0.00.5)(0.51.0))
(4(0.00.0)(0.50.5)))
表中第一项说明总是当前视窗的说明.上例中标号5的视窗就是当前视窗.
123(while<测试表达式><表达式>...)
这个函数先计算<测试表达式>,如果不为nil,则计算其它的<表达式>,然后再
重新计算
<测试表达式>.这样一直循环到<测试表达式>为nil.然后WHILE返回最后的<
表达式>的最
终计算结果.例如,已知:
(tqa1)
那么:
(while(<=a10)
(some-funca)
(tqa(1+a))
)
在A从1变到10的过程中,将调用用户函数SOME-FUNC十次.然后返回11,它
实用文案
标准文档
是最后一个表
达式的计算结果.
124(write-char<数>[<文件描述符>])
这个函数将一个字符写到屏幕上或写到由<文件描述符>表示的打开文件中.
其中<数>
是要写的字符的ASCII码,也是函数的返回值.例如:
(write-char67)返回67
并把字母C写到屏幕上.假定F是一个打开文件的描述符:
(write-char67f)返回67
并把字母C写到那个文件中.
AutoCAD与AutoLISP能在数种操作系统版本下运行.不同的操作系统在
ASCII文本文件
中使用不同的约定符以表示行结束.例如,UNIX用单个换行符(LF,即ASCII码10),
而MS-DOS
,PC-DOS使用两个字符(CR/LF,即ASCII码13和10)来完成同一任务.为了便于
开发在上述诸
操作系统中,能以可移植方式工作的AutoLISP程序,WRITE-CHAR将换行符
(ASCII码10)转换
成当前操作系统使用的行结束符(或字符串).因此,在PC-DOS/MS-DOS系统中:
(write-char10f)返回10
但是却将字符串CR/LF(ASCII码13及10)写入文件.WRITE-CHAR不能将
实用文案
标准文档
NULL字符(ASCII
码0)写入文件.
125(write-line<字符串>[<文件描述符>])
这个函数将<字符串>写到屏幕上或写到由<文件描述符>表示的打开文件中.
它返回用
通常方式引起来的<字符串>,但写入文件时则省略其引号.例如,假设F是一个有
效的打开
文件的描述符,则有:
(write-line"Test"f)将写出Test并返回"Test"
126(zerop<项>)
如果<项>是实数或整数且其值为零,此函数返回T;否则返回nil.对于其它类型
的<项>
没有定义.例如:
(zerop0)returnsT
(zerop0.0)returnsT
(zerop0.0001)returnsnil
127(*error*<字符串>)
这是一个可由用户定义的出错处理函数.如果该函数不为nil,则每当AutoLISP
错误条
件发生时,它就作为一个函数被自动执行.它只传送一个变元,即说明出错信息的
字符串.
实用文案
标准文档
例如:
(defun*error*(msg)
(princ"error:")
(princmsg)
(terpri)
)
这个函数的功能和AutoLISP的标准出错处理程序完全一样;它打印"error:"
和出错说
明.
-----------------------------------------------------------------------------
实体和设备的访问
有一组AutoLISP函数提供访问AutoCAD实体、图形屏幕的输入设备的功
能.用户可以
选择实体、提取实体的值和修改实体.选择集可以保存在AutoLISP变量中,以便
对实体的
选择集进行操作.这里没有提供用于直接生成实体的函数,因为用户可使用
command函数把
AutoCAD的通常命令传送给AutoLISP来达到这个目的.
1特殊数据类型
在这里用到了两种特殊的AutoLISP数据类型,以实现对AutoCAD实体的访
实用文案
标准文档
问;一种是"实
体名",另一种是"选择集".这两种数据类型只供作用于它们的函数操作,它们的内
部结构
与LISP程序员无关.实体名实际上是文件内部的一个指针,该文件由AutoCAD的
图形编辑程
序保存,从中,AutoLISP可以找到实体数据库记录和它的向量(如果在屏幕上).而
选择集就
是实体名的集合.
只有在图形编辑过程中从AutoCAD得到的实体名和选择集才有效.
另外,与实体有关的函数可以操作和提取实体标号(entityhandles).实体标号
是Auto
CAD赋予实体的固定不变的标志,AutoLISP将它们作为16进制数的字符串形式
看待.
2选择集操作函数
下列函数对选择集进行各种操作.
2.1(ssget[<方式>][<点1>[<点2>]])
可用函数SSGET得到一个选择集.任选项<方式>变元是一个字符串,它指定要
执行实体
选择的类型.它可以是"W","C","L",或"P",分别对应于AutoCAD的窗口
"Window",交叉"cr
ossing",最新的last以及前一个previous实体选择方式.<点1>和<点2>变元
实用文案
标准文档
是两个点表,
它们指定了与选择方式有关的点.指定了一个点而没有指定<方式>变元,就等价
指向单独
一点的实体选择.如果所有的变元都省略了,那么SSGET通过AutoCAD的
"lectobjects:
"的通用机制提示用户,使得用户以交互方式构造选择集.下面是SSGET的一些例
子:
(ssget);请求用户进行一般实体选择
(ssget"P");选择前一次已选择过的实体
(ssget"L");选择最新加入数据库的实体
(ssget'(22));选择通过点2,2的实体
(ssget"W"'(00)'(55));选择在窗口0,0到5,5之内的实体
(ssget"C"'(00)'(11));选择交叉通过0,0到1,1的框中的实体
(ssget"X"<过滤表>);选择和"过滤表"相匹配的实体
只有在使用没有变元的SSGET时,所选择的目标才会加亮.不保留任何有关如
何拾取实
体的信息(另一种情况请参看下面的ENTSEL).选择集会占用AutoCAD的临时文
件缓冲区,所
以AutoLISP可同时打开的文件不能多于6个.如果达到了这个极限,AutoCAD将
拒绝产生任
何新的选择集,并对所有SSGET的调用返回nil值(如果达到6个选择集的极限,
实用文案
标准文档
则在继续使用
SSGET函数之前,必须先执行GC函数).
对于任何用以"Last"回答"Selectobjects:"提示有效的地方,都可向AutoCAD
传送一
个选择集变量.它将选取选择集变量中的所有目标.
SSGET过滤器(ssget"X")
SSGET的"X"方式用于扫描整个图形并建立一个包含符合匹配标准的所有主
实体名的选
择集.例如,可使用这种机制建立一个在已知层上具有已知类型或已知颜色的所有
实体的
选择集.
SSGET的使用形式如下:
(ssget"X"<过滤表>)
这里的<过滤表>是一个关联表,其类型与ENTGET函数(后面要介绍)返回的表
类型相似.
过滤表指明要检查的实体特性及其匹配值.如:
(ssget"X"(list(cons0"CIRCLE")))
将返回一个由图中所有圆组成的选择集(组代码0是实体类型).同样,
(ssget"X"(list(cons8"FLOOR3")))
返回的选择集将包含图层FLOOR3上的所有实体(组代码8是图层名).如果过
滤表指明一
实用文案
标准文档
个以上的点对表,则选择集中的每个实体必须同时满足所有指定的条件.如:
(ssget"X"(list(cons0"CIRCLE")(cons8"FLOOR1")(cons621)))
返回的选择集将包含图层FLOOR1上所有红色(实体的颜色)的圆.
虽然实体过滤表的格式与ENTGET返回的表格式相同,但SSGET"X"只能识别
实体组代码
的一个子集(见下表).SSGET"X"函数会扫描整个图形,并把每个主实体的字段与
指定的过
滤表比较.如果某个实体的特征与过滤表中所有指定的字段都匹配,则把该实体选
入返回
的选择集中;否则,不予选入.如果数据库中没有一个实体与指定的过滤要求匹
配,SSGET就
返回nil.如果过滤表的内容为空或没有过滤表,那么SSGET会选取数据库中所有
的实体.
下面是SSGET"X"可接受的实体组代码:
代码意义
----------------------------------------------------------
0实体类型
2引用块(INSERT)的块名
6线型名
7被正文(Text)和属性定义所用的字型名
8图层名
实用文案
标准文档
38Z向高度(实型)(下次版本更新时略去)
39厚度(实型)
62颜色号(0=BYBLOCK,256=BYLAYER)
66被引用的属性块(INSERT)的标志
2103D延伸向量(三维实数表)
为了测试实数型的组代码,提供的测试值必须为实数.这样,为了匹配Z向高度
为2.0的
实体:
(ssget"X"(list(cons382)))是不正确的,但
(ssget"X"(list(cons382.0)))是正确的.
如果过滤表中包括的实体组代码超出上面表的范围,那么SSGET"X"将返回nil.
这样可
保证使用SSGET"X"的AutoLISP程序在今后增补代码的情况下能继续工作.
2.2(sslength<选择集>)
这个函数返回表示<选择集>中实体数目的一个整数.如果实体个数大于
32767,则该函
数返回一个实数.选择集中决不包含两个相同的实体.
例如:
(tqst(ssget"L"));最后一个实体放入选择集SSET中
(sslengthst);返回1
实用文案
标准文档
2.3(ssname<选择集><索引号>)
这个函数返回<选择集>中第<索引号>个元素的实体名.如果<索引号>是负
数或大于选
择集中最大的元素编号,则返回nil.选择集中的第一个元素的索引号为零.用
SSGET获得的
选择集中的实体名总是主实体名.子实体(块的属性和多义线的顶点)将不会返回
(但ENTN
EXT允许对子实体访问,本章下面要讲到).
例如:
(tqst(ssget));建立一个名为SSET的选择集
(tqent1(ssnamest0));取SSET中的第1个实体的名称
(tqent4(ssnamest3));取SSET中的第4个实体的名称
如果要访问的实体在选择集中排在第32767个之后,则给出的<索引号>变元
必须是一个
实数.例如:
(tqentx(ssnamest50843.0));取SSET中第50844个实体的名
2.4(ssadd[<实体名>[<选择集>]])
如果不带变元调用,SSADD将构造一个没有元素的新选择集.如果调用它时只
有一个实
体名变元,SSADD则构造一个只包含那个实体名的新选择集.如果调用它时有实
体名变元和
选择集变元,它就将所指明的实体加到选择集中.SSADD总是返回新的或经修改
实用文案
标准文档
的集.注意,
当把一个实体加到一个已存在的集中,这并非逻辑上的增添,而是实际上的增添,
并作为与
<选择集>相同的集返回.因此,如果集被赋给其它变量,它也将反映增加的内容.如
果指的
实体已在集中存在,SSADD操作将无效,并且不报告任何出错信息.例如:
(tqe1(entnext));置E1为图中第1个实体的名
(tqss(ssadd));置ss为一个空选择集
(ssadde1ss);返回有实体名E1的选择集ss
(tqe2(entnexte1));置E2为E1之后的实体的名
(ssadde2ss);返回有实体名E2的选择集ss
2.5(ssdel<实体名><选择集>)
SSDEL从<选择集>中删除指定的<实体名>,返回<选择集>的名.注意,实体确
实是从选择
集中删除,返回的新集中没有这个元素,如果实体不在集中,则返回nil.
例如,已知实体名E1是选择集ss的一个元素,而实际名E2不是该集的元素,那
么:
(ssdele1ss)返回删去实体E1的选择集ss
(ssdele2ss)返回nil(不改变选择集ss)
2.6(ssmemb<实体名><选择集>)
这个函数将测试<实体名>是不是<选择集>中的一个元素.如果是,SSMEMB
实用文案
标准文档
返回此实体的
名(<实体名>);否则,返回nil.
例如,已知实体名E1是选择集ss的一个元素,而实际名E2不是,那么:
(ssmembe1ss)返回实体名E1
(ssmembe2ss)返回nil
3实体名称函数
下列函数对实体名执行各种各样的操作.对于任何用"Last"回答"Select
objects:"
提示有效的地方,都可以将一个实体名送给AutoCAD.其结果是选定了指明的那
个实体,就
像用窗口选择它一样.
3.1(entnext[<实体名>])
如果调用时没有变元,这个函数即返回数据库中第一个没有被删除的实体名.如
调用EN
TNEXT时有一个实体名变元<实体名>,它就返回数据库中<实体名>之后的第一
个没有被删除
的实体名.如果数据库中再没有下一个实体,则返回T既可返回主实
体,又可返
回子实体.
由SSGET选择的实体是主实体,而不是块的属性或多义线的顶点.可以通过用
ENTNEXT逐
实用文案
标准文档
个寻找子实体的方法,对这些复杂实体的内部结构进行访问.一旦获得子实体的名,
还可以
用ENTNEXT继续向前查找,直到发现了SETQEND型实体,然后从该实体中抽取
组代码为-2的
元素,从而找出所有这些子实体的主实体名.
例如:
(tqe1(entnext));置E1为图中第一个实体的名
(tqe2(entnexte1));置E2为E1之后的实体的名
3.2(entlast)
这个函数返回数据库中最后那个没有被删除的主实体名.这个函数常被用来获
得最新
实体的名,这最新实体是用COMMAND函数刚加入到数据库中的.若要选择这个
实体,它不必
显示在屏幕上,也不必处于解冻的层上.
例如:
(tqe1(entnext));置E1为图中最后一个实体的名
(tqe2(entnexte1));置E2为nil(或属性或顶点类的子实体名)
如果需要最后一个未被删除的实体名(或是主实体或是子实体),可定义如下的
函数并
调用它,而不再使用ENTLAST函数.
(defunlastent(/ab)
(if(tqa(entlast));得到最后的主实体
实用文案
标准文档
(while(tqb(entnexta));如果有子实体跟随
(tqab);循环反复往下查找
)
)
a;返回最后的主实体/子实体
)
3.3(entl[<提示>])
有时在对实体进行操作时,需要同时选择一个实体并指定选择点.在AutoCAD
中,这种例
子可以在目标捕捉和在BREAK,TRIM和EXTEND命令中找到.ENTSEL函数使得
AutoLISP程序可
以执行这种操作.EMTSEL需要用点选择方式来选择单个实体.它将返回一表,表的
第一个元
素是所选择的实体名,第二个元素是用于选择实体的点的坐标.如果为<提示>指
定了一个
字符串,此字符串将用于询问用户以选择实体;否则,提示将为缺省的"Select
object:".
下列AutoCAD对话过程演示了ENTSEL函数的使用以及它返回的表:
Command:LINE
Frompoint:1,1
Topoint:6,6
Topoint:RETURN
实用文案
标准文档
Command:(tqe(entl"Pleachooanentity:"))
Pleachooanentity:3,3
(
由ENTSEL返回的这种格式的表,可在任何一种目标选择提示下提供给
AutoCAD.通过指
向指定的点,AutoCAD把表作为拾取指定的实体处理.
3.4(handent<实体标号>)
实体名在不同的图形编辑期间是变化的(即同一实体在上次编辑中的名和下次
编辑中
的名是不同的),但实体标号却不会变化,它对于同一实体具有永久的意义,除非其
对应的
实体已不复存在.<实体标号>作为字符串变元传送.HANDENT函数将返回当前
编辑期间使用
的与实体标号对应的实体名.一旦取得实体名,它便可被任何操作实体的函数使用.
例如在
某一编辑过程中:
(handent"5A2")可能返回
同一图形在不同的编辑期间,可能造成该函数对同一实体标号的调用会返回不
同的实体
名,同一实体的名因每次编辑情况而定,而同一实体的标号都始终不会改变.
如果当前图中未使用实体标号或给HANDENT传送一个无效的实体标号,或是
一个当前图
实用文案
标准文档
中各实体尚未用到的实体标号,则函数均返回T函数可以返回已在
当前图形编
辑过程中被删除的实体的名;若需要可继续使用ENTDEL函数将该实体重新恢复
出来.
AUTOLISP函数参考5(10版本)
4实体数据函数
下列函数可让用户检索和修改定义实体的数据,所有函数都用实体名指定要操作
的实体.
4.1(entdel<实体名>)
如果由<实体名>指定的实体在当前图中,它就被删掉,如果在这次编辑中该实
体已被删
除,那么它将被重新恢复出来(从当前图中).退出图形编辑程序时,被删除的实体便
从图中
彻底清除掉了,所以ENTDEL只能在删除实体的那次编辑过程中使实体再恢
复.ENTDEL只对
主实体进行操作.对属性和多义线的顶点是不能脱离其双亲实体而予删除的(可使
用COMM
AND函数执行ATTEDIT或PEDIT命令来达到这一目的).
例如:
(tqe1(entnext));置E1为图中第一个实体的名
本文发布于:2022-12-28 06:09:42,感谢您对本站的认可!
本文链接:http://www.wtabcd.cn/fanwen/fan/90/45101.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |