《AutoLISP程序语言设计.ppt》由会员分享,可在线阅读,更多相关《AutoLISP程序语言设计.ppt(65页珍藏版)》请在课桌文档上搜索。
1、AutoLISP平程序语言设计,AutoLISP程序语言概述AutoLISP数据类型AutoLISP程序结构AutoLISP内部函数函数定义及装载AutoLISP程序调试与编程实例,1.AutoLISP语言简介 LISP(list processing language)语言是一种计算机的表处理语言,是在人工智能学科领域中广泛采用的一种程序设计语言。(Lisp 语言最早是在 20 世纪 50 年代末由麻省理工学院(MIT)为研究人工智能而开发的。)美国AutoDesk公司在AutoCAD内部嵌入AutoLISP的目的是使用户充分利用AutoCAD进行二次开发:实现直接增加和修改AutoCAD命
2、令,随意扩大图形编辑功能,建立图形库和数据库并对当前图形进行直接访问和修改等。,5.1 AutoLISP程序语言概述,2.AutoLISP的特点(1)AutoLISP语言是在普通的LISP语言基础上,又扩充了许多适用于CAD应用的功能而形成的一种程序设计语言。它是一种解释性求值语言,速度较慢,难以保密,可用任何文字编辑软件编辑,用纯文本的格式保存。(2)AutoLISP语言中的一切成分都是以函数形式给出的,它没有语句概念或其他语法结构。执行AutoLISP程序就是执行一些函数,再调用其它函数。(3)AutoLISP把数据和程序统一表达为表结构,故可把程序当作数据来处理,也可把数据当作程序来执行
3、。(4)AutoLISP语言中程序运行过程就是对函数求值的过程,是在对函数求值的过程中实现函数的功能。(5)AutoLISP语言的主要控制结构是采用递归方式。递归方式的使用,使得程序设计简单易懂。,5.2 AutoLISP数据类型,AutoLISP主要有如下数据类型:整数(INT)实型数(REAL)符号原子(SYM)字符串(STR)表(及用户定义的函数)(LIST)文件描述符(FILE)AutoLISP的内部函数(SUBR)AutoCAD的选择集(PICKSET)AutoCAD的实体名(ENAME)函数分页表(PAGETB),5.2.1 整数,整数是由0,1,2,9,+,-字符组成,不许出现其
4、它字符,+号可有可无。例如:+256,103,-15,0。,5.2.2 实型数 实型数是用双精度的浮点数表示并且有至少14位有效精度,即整数后跟小数。如果实数的绝对值小于1,小数点前必须加0,不要直接以小数点开头。否则,计算机误认为是点对而出错。例如,“.4”是错误的表示,“0.4”才是正确的写法。实型数也可以用科学计数法表示,即数字后可有一个可选择的“e”或“E”,后跟数的指数。例如:0.12E9表示0.12109。,5.2.3 符号原子符号原子可以包含除以下字符以外的任何可打印字符:()用作表的定义;用作点对;也是一种表。用作QUOTE函数的简写;”用作字符串常数的定界符;用作程序的注释标
5、志。符号原子的长度没有限制,但尽量不要超过6个字符,否则要占用额外的内存,降低运行速度。在AutoLISP中,符号的大小写是等效的。例如,ABCD,Abcd,abcd,AbcD都表示一个符号原子。AutoLISP中的任何符号都是有值的,即符号都要赋以一定的数值,或者说符号总是约束在一定值上。一般用赋值函数setq进行赋值。例如:(setq X 25.0)意思是将25.0赋给x,这时x的当前约束值为25.0一个符号在使用前如没有赋以任何值,则该符号的值为nil(空),它不占用内存空间。,5.2.4 字符串字符串是由包括在一对双引号内的一组字符组成的。字符串包含任何可打印的字符。字符串中字母的大小
6、写及空格都是有意义的。字符串的最大长度为100个字符若字符串中没有任何字符,则为空串“”。字符串中可以包含ASC表中的任何字符,通用的表示格式为“nnn”,其中nnn是其字符的八进制ASC码。例如,字符串“ABCD”也可表示为“101102103104”。由于反斜杠已作为前导的标识字符,在字符串中有特殊作用,如果字符串中要包含它,则必须用两个相邻的反斜杠来表示:“”,当然,反斜杠也可表示为“114”。由于双引号已用作字符串的定界符,若需在字符串中包含双引号,则可用“042”表示。,除可用“nnn”的形式表示ASC表中的控制字符外,在AutoLISP中,对于常用的控制字符有特定的简单的表示形式,
7、如下表所示。,常用的控制字符,必须注意,其中的字符e,n,r,t 必须小写。例如,下面的表达式执行时都将提示在新的一行上显示:(Prompt“nEnter first point:”)(Prompt“012Enter first point:”)字符串常用于磁盘文件名,标识符的打印名等。,5.2.5 表 AutoLISP广泛地使用表。表提供了在一对符号中存储大量相关数值的有效方法。例如点的表示,二维点以表(X Y)表示,第一个数值是点的X坐标,第二个数值是点的Y坐标。三维点以表(X Y Z)表示,第一个数值是点的X坐标,第二个数值是点的Y坐标,第三个数值是点的Z坐标。例如(setq a 6.0
8、)也是一个表,表中有三个元素,第一个元素setq为一函数名,第二个元素为一变量,第三个元素为一实数。,在AutoLISP语言中,表有如下特点:(1)表是指放在一对相匹配的左、右括号中的一个或多个元素的有序集合。(2)表中的每一个元素可以是任何类型的表达式,即可以是数字、符号、字符串,也可以是表。(3)元素与元素之间要用空格隔开,注意元素与括弧之间可不用空格。如:(15(a b)c d),在此例中,表内有4个元素,其中第二个元素是表。(4)表可以是任意嵌套的,上例中即嵌套了一个表。表可以嵌套很多层,从外层向里依次称为0层,1层,2层(5)表中的元素是有顺序的,为便于对表中元素进行存取,每个元素都
9、有一个符号。从左向右,第一个元素序号为0,第i个元素序号是i-1。(6)表的大小为表的长度,即表中顶层元素的个数。没有任何元素的表称为空表。空表用()或nil表示。在AutoLISP中,nil是一个特殊的符号原子,它既是原子又是表。(7)表有两种基本类型:标准表和引用表。标准表:第一个元素的值必须是一个合法的已经存在的AutoLisp函数定义,后跟调用该函数的参数。引用表:是在表的前面冠以引用符号(或Quote)对该表不求值。,命令:(setq x 20)20命令:(setq Y 24)24命令:!x;查询x的值20命令:!y24命令:(setq!a 20)20命令:!anil命令:!A20命
10、令:(setq x 20)命令:!xnil,6.文件描述符 文件描述是AutoLISP赋予被打开文件的标识号。当AutoLISP函数需要访问一个文件时(读该文件或者写该文件),首先通过该文件描述符去识别并建立联系。下面的例子打开文件“myfile.dat”,使它可被其它函数读取,并把该文件描述符的数值赋予符号fl。(setq fl(open D:usermyfile.dat W),符号:用作变量、函数的名字。命名规则:不能只含数字,除下列字符以外的任何可打印字符组成:().;“”符号长度无限制,但一般不超过6。变量的数据类型:不需要事先进行类型说明,变量被赋予值的类型就为变量的类型。不能使用内
11、部函数名和关键字作为变量名。变量赋值:(setq 变量1 值1 变量2 值2.)显示变量的值:!变量名(同时将值传递给autocad)。,5.2.6 变量,nil:变量没有赋值,尚无定义。将nil赋给某一有定义的变量,其结果是取消该变量的定义并释放其所占存储空间。引用尚未赋值的变量是错误的。nil作为逻辑变量的值,表示不成立。T:逻辑成立。Pause:暂停,等待用户输入。Pi:。,5.2.7 预定义的符号,5.3 AutoLISP的程序结构1.表达式(1)表达式含义:AutoLISP处理的对象是符号表达式(简称表达式)。它相当于其它编程语言中的程序语句。(2)表达式的构成:表达式由原子或表构成
12、。多数情况下以表的形式存在,例如:(函数名 变元)(3)表达式前缀表示法 大多数计算机语言采用“中缀表示法”来表示程序语句,如在C语言中,给变量X赋值为25.,写成如下语句:25.在该表示法中,运算符“=”放在两个操作数“X”和“25.0”中间。这种表示法是大家都熟悉的。在AutoLISP语言中,采用的是“前缀表示法”,即把运算符放在操作数之前,而不是放在它们的中间,并把运算符(即函数名)和操作数(即调用函数的参数)用圆括号括起来,以表的形式表示。如上例,用AutoLISP表示:(setq X 25.0)运算符(setq)放在操作数(X 25.0)之前。,再看下面的例子:X=(A+B)*C 这
13、是一个“中缀表示法”表示的一个表达式,若用AutoLISP表示则为:(setq X(*(+A B)C)其中“+”、“*”号在AutoLISP中仍用作加法和乘法函数的名字。(4)表达式的求值规则 整型数、实型数和字符串以其本身的值作为求值结果。符号以其当前的约束值作为求值结果。表根据其第一个元素来进行求值。(+(*2 3)(/6 3)返回:8(fx a b c)返回:error:no function definition:fx(5 a b c)返回:error:bad function:5(setq p(3 2 1)返回:error:bad function:3,2.程序结构组成(1)一个完整
14、的AutoLISP程序往往是由一系列按顺序排列的表达式组成。例如:(defun plus(x y)(+(*x y)x)(setq a 2.)(setq b 4.0)(setq c(plus a b)这个简单的AutoLISP程序由4个表达式(即表)组成。第一个表给出了X*Y+X的函数定义,第二、三表分别给变量A、B赋值,最后一个表是对定义的PLUS函数的调用。,(2)在AutoLISP程序中,一个表达式可以分在多行中写,也可以一行中写几个。一行由“回车”结束。如前所述,原子之间多个空格的作用和一个空格的作用相同,都起着分隔符的作用。如果不考虑打印或印刷限制的话,可以利用多个空格使程序的结构直观
15、,便于阅读。例如已知函数:,用AutoLISP可以定义如下:(defun fun(x)(cond(x 0)1)(=x 0)2)(x 0)1)(=x 0)2)(x 0)0),(3)在AutoLISP程序中可以用注释。注释的作用是对程序作解释。例如,题目的名称、算法及使用方法,各函数的功能及调用参数的数据类型,长表达式的开始、结束标记等。注释以一个分号“;”开始,并在一行的末尾结束。注释可以出现在程序的任何地方。注释应该尽量的多,它并不减慢程序运行,但以后阅读程序或修改代码时,却能节省大量的时间。,;This program prints the ASCs(30-90)to the screen.
16、;usage;Command:pras(defun c:pras(/as)(setq as 30);set AS to the first ASC(while(=as 90);loop(princ(chr as);print to screen(terpri);new line(setq as(+as 1);set AS to the next ASC);end of WHILE),(4)AutoLISP程序一般是以后缀“.LSP”的ASC码文本文件的形式存盘的,然后再调入内存求值。,5.4 AutoLISP内部函数基本函数图形处理函数程序结构控制函数文件管理与I/O函数,1.基本函数(1)数
17、值计算函数(2)逻辑运算函数(3)数据类型转换函数(4)字符串处理函数(5)表处理函数,(1)数值计算函数 1)(+)功能:求表中所有整数或实数的和。示例:Command:(+1.2 3.1 3.8)8.1 2)(-)功能:求表中第一个数减去后面所有数的差,当表中只有一个数时,返回这个数的相反数。示例:Command:(-8.1 5)3.1 Command:(-0.25)-0.25 3)(*)功能:求表中所有数的积,示例:Command:(*2 5)10 4)(/)功能:求表中第一个数除以后面所有数的商。示例:Command:(/10 5 2.0)1.0 5)(1+)功能:求一个整数或实数加1
18、的和。示例:Command:(1+2.7)3.7,6)(1-)功能:求一个整数或实数减1的差。示例:Command:(1-2.7)1.7 7)(abs)功能:求一个整数或实数的绝对值。示例:Command:(abs-3.14)3.14 8)(sin)功能:求一个用弧度表示的角度的正弦值。示例:Command:(sin 0)0.0 9)(cos)功能:求一个用弧度表示的角度的余弦值。示例:Command:(cos 0.0)1.0 10)(atan)功能:求数1/数2或数1的反正切值。当数2为零时,函数值为/2。示例:Command:(atan 0.707 0.707)0.7854 Command
19、:(atan 1.0 0)1.5708,11)(sqrt)功能:求一个整数或实数的平方根。示例:Command:(sqrt 256)16.0 12)(min)功能:求表中所有整数或实数的最小值。示例:Command:(min 1.44-1.2-2.1-3.6)-3.6 13)(max)功能:求表中所有整数或实数的最大值。示例:Command:(max-2.5 2.1 3.4)3.4 14)(expt)功能:求底数的幂次方。示例:Command:(expt 2.0 3)8.0 15)(log)功能:求一个数的自然对数。示例:Command:(log 2)0.693147 16)(gcd)功能:求
20、数1和数2两个整数的最大公约数。示例:Command:(gcd 144 16)16 17)(rem)功能:求数1除以数2的余数。示例:Command:(rem 162 38)10,(2)逻辑运算函数 1)(=)功能:判断是否相等,相等为T,否则为nil。示例:Command:(=28 28.0)T 2)(/=)功能:判断各原子是否不等,不等为T,否则为nil。示例:Command:(/=April May)T Command:(/=20 20)nil 3)()功能:判断左边的原子是否依次大于右边的原子,大于则为T,否则为 nil。示例:Command:(7 2 1)T Command:(2 6
21、 0)nil 4)()功能:判断左边的原子是否依次小于右边的原子,小于则为T,否则为 nil。示例:Command:(1 1 2)nil Command:(1 2 7)T,(setq c(=28 28.0)(if(=c T)(setq d 1)(setq d 0);d值?,(if(=28 28.0)(setq d 1)(setq d 0),5)(=)功能:判断左边的原子是否依次大于或等于右边的原子,大于或等于则为T,否则为nil。示例:Command:(=2 1 1)T Command:(=2 1 2)nil 6)()功能:判断左边的原子是否依次小于或等于右边的原子,小于或等于则为T,否则为n
22、il。示例:Command:(=7 8 8)T Command:(=1 3 2)nil 7)(and)功能:对所列的表达式进行逻辑“与”运算,有一个表达式结果为(nil)即为nil,否则为T。示例:Command:(setq a T)T Command:(setq b nil)nil Command:(and a b)nil 8)(or)功能:对所列有的表达式进行逻辑“或”运算,当所有表达式都为(nil)即为nil,否则为T。示例:Command:(setq c nil)nil Command:(setq b nil)nil Command:(or b c)nil,9)(not)功能:对所列项
23、求反,当该项值为nil时则为T,否则为nil。示例:Command:(setq b nil)nil Command:(not b)T 10)(atom)功能:判断所列项是否为原子,当该项为表时,则为nil,否则为T。示例:Command:(atom c)T Command:(setq a(1.2 5.0)(1.2 5.0)Command:(atom a)nil 11)(boundp)功能:判断所列的原子是否有非nil值,若有则为T,否则为nil。示例:Command:(setq c nil)nil Command:(boundp c)nil Command:(setq a T)T Comman
24、d:(boundp a)T,12)(listp)功能:判断所列项是否为一个表,是则为T,否则为nil。示例:Command:(listp(a b c)T Command:(listp a)nil 13)(minusp)功能:判断所列项是否为负数,是则为T,否则为nil。示例:Command:(minusp-3.2)T Command:(minusp 8.32)nil 14)(numberp)功能:判断所列项是否为整型或实型数,是则为T,否则为nil。示例:Command:(numberp-3.26)T Command:(numberp Endpoint)nil 15)(null)功能:判断所列
25、项的值是否为nil,是则为T,否则为nil。示例:Command:(setq a T)T Command:(setq b nil)nil Command:(null b)T Command:(null a)nil,16)(member)功能:在表中求得从出现位置的内容,若不含有的内容,则为nil。示例:Command:(member a(d b a c e)(a c e)Command:(member ac(d b a c e)nil 17)(zerop)功能:判断所列项的内容是否为零,是则为T,否则为nil。示例:Command:(zerop 0)T Command:(setq a 1)Co
26、mmand:(zerop a)nil 18)(eq)功能:判断和是否完全相同,是则为T,否则为nil。示例:Command:(setq c a)Command:(eq c a)T Command:(eq(setq a(1 2)(setq b(1 2)nil 19)(equal)功能:判断两表达式的值是否相等,是则为T,否则为nil。示例:Command:(equal(setq a(1 2)(setq b(1 2)T,(3)数据类型转换函数 1)(type)功能:判断所列项的数据类型,其值为下列类型之一。INT(整型数)REAL(实型数)SYM(符号)STR(字符串)LIST(表)SUBR(内部
27、函数)FILE(文件描述符)示例:Command:(type(set a 25)LIST Command:(type*)SUBR Command:(type(setq f(open jq.txt r)FILE 2)(fix)功能:将实型数去掉小数部分化为整型数。示例:Command:(fix 2.13)2 3)(flaot)功能:将整型数化为实型数。示例:Command:(flaot 2)2.0 4)(itoa)功能:将整型数化为字符串。示例:Command:(itoa 28)28,5)(atoi)功能:将字符串化为整型数。示例:Command:(atoi 415)415 6)(atof)功能
28、:将字符串化为实型数。示例:Command:(atof 5)5.0 7)(rtos)功能:按着AutoCAD系统变量LUNITS和LUPREC定义的记数方式和精度将数转化为字符串。示例:设LUNITS=2(十进制),LUPREC=4 Command:(rtos 3.7)3.7000 8)(angtos)功能:按着AutoCAD系统变量LUNITS和LUPREC定义的记数方式和精度将弧度数转化为字符串。示例:设LUNITS=0(度),LUPREC=4 Command:(angtos 3.14)180 9)(ascii)功能:求出字符串第一个字符的ASCII值。示例:Command:(ascii
29、Access)65 10)(chr)功能:求出整型数所代表的ASCII字符。示例:Command:(chr 65)A,(4)字符串处理函数 1)(strcat)功能:将所列的字符串合并为一个字符串。示例:Command:(strcat C A D)CAD 2)(strlen)功能:求出字符串的长度。示例:Command:(strlen AutoCAD)7 3)(substr)功能:按要求求出字符串的一个子串。示例:Command:(substr AutoCAD 5 3)CAD,(5)表处理函数 1)(list)功能:用所列表达式组成一个表。示例:Command:(list C A D)(C A
30、 D)Command:(list 1.2 2.3)(1.20 2.30)2)(append)功能:将所列的合并成一个新表。示例:Command:(append(C)(A)(D)(C A D)3)(cons)功能:将新元素加到表的开头,形成一个新表。示例:Command:(cons C(A D)(C A D)Command:(cons(A C)(A D)(A C)A D)4)(subst)功能:用新元素替换表中的旧元素。示例:Command:(subst M D(C A D)(C A M)5)(assoc)功能:在关联表中求出指定关键字的子表。示例:Command:(setq alst(new
31、550)(old 162)(new 550)(old 162)Command:(assoc new alst)(new 550),6)(last)功能:求出表的最后一个元素。示例:Command:(last(Auto CAD)CAD Command:(last(Auto(CAD 14)(CAD 14)7)(car)功能:求出表的第一个元素。示例:Command:(car(Auto(CAD 14)Auto 8)(cdr)功能:求出表中去掉第一元素后的剩余表。示例:Command:(cdr(Auto(CAD 14)hz)(CAD 14)hz)若已知一点pt:(setq pt(list 2.0 3.
32、0 5.0),则可用三个函数分别得到该点的x、y、z分量值。Command:(car pt);返回点变量pt的x分量2.0。Command:(cadr pt);返回点变量pt的y分量3.0。Command:(caddr pt);返回点变量pt的z分量5.0。9)(nth)功能:求出表中第n个元素(表的第一个元素的序号为0)。示例:Command:(nth 2(Auto(CAD 14)hz)hz 10)(reverse)功能:求出表的倒置表。示例:Command:(reverse(CAD 14)hz)(hz(CAD 14),11)(length)功能:求出表中顶层元素的个数。示例:Command
33、:(length(Auto(CAD 14)hz)3 12)(foreach)功能:将表中元素逐一赋给变量并求表达式的值。示例:Command:(foreach x(1.0 2.0 3.0)(print x)1.0 2.0 3.0 3.0 13)(mapcar)功能:将表中的各元素按函数的要求进行处理。示例:Command:(mapcar*(1 2 3)(2 3 4)(2 6 12)14)(apply)功能:按指定函数对表进行处理。示例:Command:(apply*(1 2 3)6 15)(quote)或()功能:给出没有计算的表达式,也称为禁止求值函数。示例:Command:(quote a
34、)A Command:(setq a 1)(setq a 1),2.图形处理函数(1)交互输入函数(2)求值函数(3)AutoCAD命令函数,(1)交互输入函数 1)(getangle)功能:用相对基点拖动指定点或直接输入的方法确定一个角度,该角度为相对角度,零度角总为x轴正向,角度增加的方向由系统变量ANGDIR定义。示例:Command:(setq a(getangle Enter angle:)Enter angle:90 1.5708 Command:(setq a(getangle(0 0)Enter angle:)Enter angle:(拾取(0,1)点)1.5708 2)(ge
35、tdist)功能:用相对基点拖动指定点或直接输入的方法确定一段距离。示例:Command:(setq d(getdist Enter distance)Enter distance:10 10.0 Command:(setq d(getdist(0 0)Enter distance)Enter distance:(拾取(2,2)点)2.82843 3)(getpoint)功能:用相对基点拖动指定点或直接输入的方法确定一点。示例:Command:(setq P(getpoint Enter point)Enter point:(拾取(2,2)点)(2.0 2.0 0.0),4)(getint)功
36、能:输入一个整数。示例:Command:(setq n(getint Number of items:)Number of items:5 5 5)(getreal)功能:输入一个实数。示例:Command:(setq x(getreal scale factor:)scale factor:2.5 2.5 6)(getstring)功能:输入一个字符串,当Cr为nil时,字符串不能含有空格。示例:Command:(setq s(getstring nil ATTRIBUTE NAME:)ATTRIBUTE NAME:city city Command:(setq s(getstring T
37、CITY:)CITY:Beiging China Beiging China 7)(getcorner)功能:输入与基点构成矩形对角线上的另一点。示例:Command:(setq s(getcorner(10 10)Enter a point:)Enter a point:(拾取(8,6)点)(8.0 6.0 0.0),8)(getorient)功能:用相对基点拖动指定点或直接输入的方法确定一个角度,该角度为绝对角度,零度角和角度增加方向分别由ANGBASE和ANGDIR定义。示例:设ANGBASE=90(y轴正向为角度起始方向),ANGDIR=1(顺时针)Command:(setq a(ge
38、torient Enter angle:)Enter angle:45 0.7853989)(initget)功能:用规定的数据范围和规定的上述get*函数可接受的关键字来对get*函数的各种输入自动进行检查。其中位值为表中所列的整数或它们的和。,位值的含义,示例:自动检查输入项数是否为正整数。;Define number of items in array(defun c:test()(setq n 0)(while(=n 1)(initget(+1 2 4)(setq n(getint nNumber of items:)(if(=n 1)(prompt nNumber of items
39、must be greater than 1),10)(getkword 功能:用来接受用户输入的关键字,并以字符串的形式返回。有效的关键字集必须预先在initget函数中进行定义。如果输入的不是关键字,AutoCAD将要求重新输入。示例:接受用户对提问用Yes(Y)或No(N)来进行回答。;Are objects to be rotated?(initget Yes No)(setq yn(getkword nRotate objects as they are copied?:)(if(=nul yn)(setq yn Y),(2)求值函数 1)(distance)功能:求两点之间的距离。
40、示例:Command:(distance(1.0 2.0)(2.0 1.0)1.41421 2)(angle)功能:求点1至点2直线确立的角度(弧度)。示例:Command:(angle(1.0 2.0)(2.0 1.0)5.49779 3)(polar)功能:求距基点的距离为d,方向为a的点。示例:Command:(polar(1.0 1.0)0.785398 1.414214)(2.0 2.0)4)(eval)功能:求表达式的二次求值结果。示例:Command:(setq x(+1 3)Command:(princ x)(+1 3)Command:(eval x)4,(3)AutoCAD命
41、令函数(Command 命令名)功能:在AutoLISP程序中调用并执行AutoCAD命令。这是一个非常有用的函数,它提供了AutoLISP与AutoCAD之间的内部接口,使得AutoLISP程序可以具有AutoCAD的图形功能,是开发应用系统时最常使用的工具。其中命令名可以取除PLOT、PRPLOT、SKETCH、SCRIPT、DTEXT命令之外的所有命令,则是AutoCAD命令执行过程中需要的各种数据,可以是字符串、实型数、整型数或点,如点的坐标、距离或位移、角度、选项关键字、子命令名、文本等,参数的书写格式是:参数=AutoCAD的键盘输入值 对于整数和实型数,可以省略双引号;对于点的坐
42、标,还可以用表的形式来表示;回车键可以用来表示,两个双引号间不要有空格;而一个空字符串,则表示在键盘打入一个空格。示例:(Command LINE(2.0 3.0)(5.0 6.0)在Command函数中,不能使用get*函数来互式输入参数,但可以将get*函数放在相应的Command函数之前使用。示例:(setq P1(2.0 3.0)(setq P2(getpoint Enter a point:)(Command LINE P1 P2),3.程序结构控制函数(1)(progn)功能:可按顺序计算到的值,并返回最后一个表达式的值。示例:当X的值大于等于0时,计算y=3x+6和Z=x2+2x
43、的值。(if(=x 0)(progn(setq y(+(*3 x)6)(setq Z(+(*x x)(*x 2)(2)(if)功能:可根据条件计算表达式。当不是nil时,就计算,否则就计算,并返回所计算的表达式值。当不存在且为nil时,将返回nil。它相当于其它高级语言中的IFTHENELSE语句,可实现选择分支结构。注意if函数要求表达式为一个变元,因此,在需要计算多个时,可使用progn函数来进行扩展,以实现块if分支选择结构,示例见progn函数。示例:(if(=x 0)(setq y 1)(setq y-1),(3)(cond()()()功能:按顺序计算每一个子表的,若不为nil,则计
44、算子表中的所有,并返回最后一个的值。如果对所有的计算均为nil,则函数的返回值为nil。cond函数常用来构造多分支选择结构,以在不同的条件下,获得不同的值。示例:(cond(x 0)(setq y 1)(=x 0)(setq y 0)(x 0)(setq y-1),(4)(repeat)功能:可按照的要求重复计算后面的一系列,并返回最后的计算结果。repeat函数常用来构造已知重复次数的迭代结构。示例:求s=12+22+32+42+1002(setq s 0)(setq n 1)(repeat 100(setq s(+s(*n n)(setq n(+n 1)(print s),(5)(whi
45、le)功能:若不为nil,则计算后面的一系列,然后再判断,这样循环下去,直到为nil才终止,并返回最后一次计算的最后一个的值。如果一开始即为nil,则它们返回值也为nil。while函数常用来构造循环和多重循环结构。示例:求s=1*2*100(setq s 1)(setq n 1)(while(=n 100)(setq s(*s n)(setq n(+n 1)(print s),4.文件管理与I/O函数(1)(load)功能:用来装入一个类型为LSP的AutoLISP程序文件,并计算文件中的所有值。可以不带类型名.LSP,并可以包括驱动器名和目录名前缀。如果装入成功,load函数将返回文件中最
46、后定义的函数名或表达式的值,否则返回文件名或出错信息。示例:装入构造常用三维形体的3D.LSP程序文件。Command:(load 3D)c:3D 返回该文件中最后定义的一个函数名,表示3d.lsp装入成功。,(2)(open)功能:用来打开一个ASCII文件,以便AutoLISP的I/O函数对其进行存取,它返回文件描述符,以供其它I/O函数使用,因此需要在打开文件的同时,将文件描述符赋给一个变量。可以包括盘符和目录名,并需要带上文件类型名。是用小写字母表示的r(表示读)或w(表示写或重写)或a(表示添加)。如果不存在,且为w或a将产生并打开一个新文件。如果不存在,且为r将返回nil。Auto
47、LISP允许同时打开16个文件。示例:(setq f1(open old.TXT r)(setq f2(open new.TXT w)(setq f3(open A:userCAD1.TXT a)注意:为添加数据而打开的文件,其文件尾部不能含有CTRL-C文件结束符(ASCII码值为26),否则,当对文件进行读操作时,会在文件结束符位置返回而使添加的数据不能读出。,(3)(close)功能:用来关闭一个用open函数打开的文件,其中是在打开文件时得到的。写入文件的内容,只有在文件关闭后,才能被保存起来。示例:(close f1)(4)(read-char)功能:用来从键盘输入缓冲区中或从表示的
48、已打开文件中读入一个字符,并返回该字符的ASCII值。若没有指定文件描述符且键盘输入缓冲区为空,则(read-char)将等待用户键入一个字符或一些字符,并按回车键结束。read-char将按输入次序逐个返回各字符的ASCII值(调用一次返回一个)。示例:(read-char f)或(read-char)(read-char)从键盘输入ABC 返回:65(read-char)返回:66(read-char)返回:67(read-char)Enter后返回ASC字符码10,(5)(read-line)功能:用来键盘输入缓冲区或从表示的已打开文件中,依序读取一行字符串,当读取结束后返回nil。同r
49、ead-char一样,read-line也可以在键盘输入缓冲区为空时,等待用户输入一些数据(最后要用回车键结束),read-line最后将返回这个字符串。示例:(read-line f)或(read-line)若用户键入“CAD”并回车后,read-line将直接返回“CAD”字符串。(read 字符串)功能:返回由一个字符串取得的第一个列表或元素。示例:(read Autolisp DCL)返回:Autolisp(read(1 2 3)(4 0)返回:(1 2 3)(read 1.23)返回:1.23(read 10 20)返回:10(6)(write-char)功能:用来将由所代表的字符写
50、到屏幕上或由表示的已打开文件中,并返回该字符的ASCII值。示例:写字符C到屏幕或文件f中。(write-char 67)(write-char 67 f),(7)(write-line)功能:用来将写到屏幕上或表示的打开文件中,并返回该字符串。示例:将字符串“AutoCAD R14.0”写到屏幕或文件f中。(write-line AutoCAD R14.0)(write-line AutoCAD R14.0f)(8)(prompt)功能:用来在命令通讯区显示,并返回nil。示例:(prompt Please wait Loading 3D object.)(9)(prin1)功能:用来在屏幕