AutoLISP程序语言设计_第1页
AutoLISP程序语言设计_第2页
AutoLISP程序语言设计_第3页
AutoLISP程序语言设计_第4页
AutoLISP程序语言设计_第5页
已阅读5页,还剩60页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、AutoLISP平程序语言设计1AutoLISP程序语言概述AutoLISP数据类型AutoLISP程序结构AutoLISP内部函数函数定义及装载AutoLISP程序调试与编程实例21. AutoLISP语言简介 LISP(list processing language)语言是一种计算机的表处理语言,是在人工智能学科领域中广泛采用的一种程序设计语言。(Lisp 语言最早是在 20 世纪 50 年代末由麻省理工学院(MIT)为研究人工智能而开发的。) 美国AutoDesk公司在AutoCAD内部嵌入AutoLISP的目的是使用户充分利用AutoCAD进行二次开发:实现直接增加和修改AutoCA

2、D命令,随意扩大图形编辑功能,建立图形库和数据库并对当前图形进行直接访问和修改等。5.1 AutoLISP程序语言概述32. AutoLISP的特点(1)AutoLISP语言是在普通的LISP语言基础上,又扩充了许多适用于CAD应用的功能而形成的一种程序设计语言。它是一种解释性求值语言,速度较慢,难以保密,可用任何文字编辑软件编辑,用纯文本的格式保存。(2)AutoLISP语言中的一切成分都是以函数形式给出的,它没有语句概念或其他语法结构。执行AutoLISP程序就是执行一些函数,再调用其它函数。(3)AutoLISP把数据和程序统一表达为表结构,故可把程序当作数据来处理,也可把数据当作程序来

3、执行。(4)AutoLISP语言中程序运行过程就是对函数求值的过程,是在对函数求值的过程中实现函数的功能。(5)AutoLISP语言的主要控制结构是采用递归方式。递归方式的使用,使得程序设计简单易懂。 45.2 AutoLISP数据类型 AutoLISP主要有如下数据类型:整数 (INT)实型数 (REAL)符号原子 (SYM)字符串 (STR)表(及用户定义的函数) (LIST)文件描述符 (FILE)AutoLISP的内部函数 (SUBR)AutoCAD的选择集 (PICKSET)AutoCAD的实体名 (ENAME)函数分页表 (PAGETB)55.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。65.2.3 符号原子符号原子可以包含除以下字符以外的任何可打印字符: ( ) 用作表的定义; 用作点对;也是一种表。 用作QUOTE函数的简写; ”

5、用作字符串常数的定界符; ; 用作程序的注释标志。符号原子的长度没有限制,但尽量不要超过6个字符,否则要占用额外的内存,降低运行速度。在AutoLISP中,符号的大小写是等效的。例如,ABCD,Abcd,abcd,AbcD都表示一个符号原子。 AutoLISP中的任何符号都是有值的,即符号都要赋以一定的数值,或者说符号总是约束在一定值上。一般用赋值函数setq进行赋值。例如:(setq X 25.0) 意思是将25.0赋给x,这时x的当前约束值为25.0一个符号在使用前如没有赋以任何值,则该符号的值为nil(空),它不占用内存空间。75.2.4 字符串字符串是由包括在一对双引号内的一组字符组成

6、的。字符串包含任何可打印的字符。字符串中字母的大小写及空格都是有意义的。字符串的最大长度为100个字符若字符串中没有任何字符,则为空串“”。 字符串中可以包含ASC表中的任何字符,通用的表示格式为“nnn”,其中nnn是其字符的八进制ASC码。例如,字符串“ABCD”也可表示为“101102103104”。由于反斜杠已作为前导的标识字符,在字符串中有特殊作用,如果字符串中要包含它,则必须用两个相邻的反斜杠来表示:“”,当然,反斜杠也可表示为“114”。由于双引号已用作字符串的定界符,若需在字符串中包含双引号,则可用“042”表示。 8 除可用“nnn”的形式表示ASC表中的控制字符外,在Aut

7、oLISP中,对于常用的控制字符有特定的简单的表示形式,如下表所示。 常用的控制字符 必须注意,其中的字符e,n,r,t 必须小写。例如,下面的表达式执行时都将提示在新的一行上显示: (Prompt“nEnter first point:”) (Prompt“012Enter first point:”) 字符串常用于磁盘文件名,标识符的打印名等。95.2.5 表 AutoLISP广泛地使用表。表提供了在一对符号中存储大量相关数值的有效方法。 例如点的表示,二维点以表(X Y)表示,第一个数值是点的X坐标,第二个数值是点的Y坐标。三维点以表(X Y Z)表示,第一个数值是点的X坐标,第二个数值

8、是点的Y坐标,第三个数值是点的Z坐标。 例如(setq a 6.0)也是一个表,表中有三个元素,第一个元素setq为一函数名,第二个元素为一变量,第三个元素为一实数。10 在AutoLISP语言中,表有如下特点:(1)表是指放在一对相匹配的左、右括号中的一个或多个元素的有序集合。(2)表中的每一个元素可以是任何类型的表达式,即可以是数字、符号、字符串,也可以是表。(3)元素与元素之间要用空格隔开,注意元素与括弧之间可不用空格。如:(15(a b)c d),在此例中,表内有4个元素,其中第二个元素是表。(4)表可以是任意嵌套的,上例中即嵌套了一个表。表可以嵌套很多层,从外层向里依次称为0层,1层

9、,2层(5)表中的元素是有顺序的,为便于对表中元素进行存取,每个元素都有一个符号。从左向右,第一个元素序号为0,第i个元素序号是i-1。(6)表的大小为表的长度,即表中顶层元素的个数。没有任何元素的表称为空表。空表用()或nil表示。在AutoLISP中,nil是一个特殊的符号原子,它既是原子又是表。(7)表有两种基本类型:标准表和引用表。标准表:第一个元素的值必须是一个合法的已经存在的AutoLisp函数定义,后跟调用该函数的参数。引用表:是在表的前面冠以引用符号(或Quote)对该表不求值。11命令: (setq x 20)20命令: (setq Y 24)24命令: !x ;查询x的值2

10、0命令: !y24命令: (setq !a 20)20命令: !anil命令: !A20命令: (setq x 20)命令:!xnil126.文件描述符 文件描述是AutoLISP赋予被打开文件的标识号。当AutoLISP函数需要访问一个文件时(读该文件或者写该文件),首先通过该文件描述符去识别并建立联系。下面的例子打开文件“my”,使它可被其它函数读取,并把该文件描述符的数值赋予符号fl。 (setq fl (open D:usermy W )13 符号:用作变量、函数的名字。 命名规则:不能只含数字,除下列字符以外的任何可打印字符组成:() . ; “ ” 符号长度无限制,但一般不超过6。

11、 变量的数据类型:不需要事先进行类型说明,变量被赋予值的类型就为变量的类型。 不能使用内部函数名和关键字作为变量名。 变量赋值:(setq 变量1 值1 变量2 值2.) 显示变量的值:!变量名(同时将值传递给autocad)。5.2.6 变量14nil:变量没有赋值,尚无定义。 将nil赋给某一有定义的变量,其结果是取消该变量的定义并释放其所占存储空间。 引用尚未赋值的变量是错误的。nil作为逻辑变量的值,表示不成立。T:逻辑成立。Pause:暂停,等待用户输入。Pi:。 5.2.7 预定义的符号155.3 AutoLISP的程序结构1. 表达式 (1)表达式含义:AutoLISP处理的对象

12、是符号表达式(简称表达式)。它相当于其它编程语言中的程序语句。 (2)表达式的构成:表达式由原子或表构成。多数情况下以表的形式存在,例如:(函数名 变元) (3)表达式前缀表示法 大多数计算机语言采用“中缀表示法”来表示程序语句,如在C语言中,给变量X赋值为25.,写成如下语句: 25. 在该表示法中,运算符“=”放在两个操作数“X”和“25.0”中间。这种表示法是大家都熟悉的。在AutoLISP语言中,采用的是“前缀表示法”,即把运算符放在操作数之前,而不是放在它们的中间,并把运算符(即函数名)和操作数(即调用函数的参数)用圆括号括起来,以表的形式表示。如上例,用AutoLISP表示: (s

13、etq X 25.0) 运算符(setq)放在操作数(X 25.0)之前。16再看下面的例子: X=(A+B)*C 这是一个“中缀表示法”表示的一个表达式,若用AutoLISP表示则为: (setq X ( * (+ A B)C) 其中“+”、“*”号在AutoLISP中仍用作加法和乘法函数的名字。 (4)表达式的求值规则 整型数、实型数和字符串以其本身的值作为求值结果。 符号以其当前的约束值作为求值结果。 表根据其第一个元素来进行求值。(+ ( * 2 3) ( / 6 3) 返回:8( fx a b c) 返回:error: no function definition: fx( 5 a

14、b c) 返回:error: bad function: 5( setq p (3 2 1) 返回:error: bad function: 3172.程序结构组成 (1)一个完整的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函数的调用。18(2)在AutoLISP程序中,一

15、个表达式可以分在多行中写,也可以一行中写几个。一行由“回车”结束。如前所述,原子之间多个空格的作用和一个空格的作用相同,都起着分隔符的作用。如果不考虑打印或印刷限制的话,可以利用多个空格使程序的结构直观,便于阅读。例如已知函数: 用AutoLISP可以定义如下:(defun fun(x)(cond( x 0)1)(= x 0)2)( x 0)1) (= x 0)2) ( x 0)0) ) )19(3)在AutoLISP程序中可以用注释。 注释的作用是对程序作解释。例如,题目的名称、算法及使用方法,各函数的功能及调用参数的数据类型,长表达式的开始、结束标记等。注释以一个分号“;”开始,并在一行的

16、末尾结束。注释可以出现在程序的任何地方。注释应该尽量的多,它并不减慢程序运行,但以后阅读程序或修改代码时,却能节省大量的时间。 ;This program prints the ASCs(30-90)to the screen. ;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 n

17、ext ASC ) ;end of WHILE )(4)AutoLISP程序一般是以后缀“.LSP”的ASC码文本文件的形式存盘的,然后再调入内存求值。 205.4 AutoLISP内部函数基本函数图形处理函数程序结构控制函数文件管理与I/O函数211.基本函数 (1)数值计算函数(2)逻辑运算函数(3)数据类型转换函数(4)字符串处理函数(5)表处理函数22(1)数值计算函数 1)(+ ) 功能:求表中所有整数或实数的和。示例: Command:(+ 1.2 3.1 3.8) 8.1 2)(- ) 功能:求表中第一个数减去后面所有数的差,当表中只有一个数时,返回这个数的相反数。示例: Com

18、mand:(- 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的和。示例: Command:(1+ 2.7) 3.723 6)(1- ) 功能:求一个整数或实数减1的差。示例: Command:(1- 2.7) 1.7 7)(abs ) 功能:求一个整数或实数的绝对值。示例: Command:(abs -3.14) 3.14 8)(sin

19、 ) 功能:求一个用弧度表示的角度的正弦值。示例: 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:(atan 1.0 0) 1.570824 11)(sqrt ) 功能:求一个整数或实数的平方根。示例: Command:(sqrt 256) 16.0 12)(min ) 功能:求表中所有整数或实数的最小值。示例: C

20、ommand:(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 ) 功能:求数1和数2两个整数的最大公约数。示例: Command:(gcd 144 16) 16 17)(rem ) 功能:求数1除以数2的余数。示例: Command:(r

21、em 162 38) 1025 (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 0) nil 4)( ) 功能:判断左边的原子是否依次小于右边的原子,小于则为T,否则为 nil。示例: Co

22、mmand:( 1 1 2) nil Command:(= ) 功能:判断左边的原子是否依次大于或等于右边的原子,大于或等于则为T,否则为nil。示例: Command:(= 2 1 1) T Command:(= 2 1 2) nil 6)( = ) 功能:判断左边的原子是否依次小于或等于右边的原子,小于或等于则为T,否则为nil。示例: Command:(= 7 8 8) T Command:(= 1 3 2) nil 7)(and ) 功能:对所列的表达式进行逻辑“与”运算,有一个表达式结果为(nil)即为nil,否则为T。示例: Command:(setq a T) T Command

23、:(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 27 9)(not ) 功能:对所列项求反,当该项值为nil时则为T,否则为nil。示例: Command:(setq b nil) nil Command:(not b) T 10)(atom ) 功能:判断所列项是否为原子,当该项为表时,则为nil,否则为T。

24、示例: 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 Command:(boundp a) T 28 12)(listp ) 功能:判断所列项是否为一个表,是则为T,否则为nil。示例: Command:(listp (a b c) T Command:(l

25、istp 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 ) 功能:判断所列项的值是否为nil,是则为T,否则为nil。示例: Command:(setq a T) T Command:(setq b nil) nil

26、Command:(null b) T Command:(null a) nil29 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) Command:(zerop a) nil 18)(eq ) 功能:判断和是否完全相同,是则为T,否则为ni

27、l。示例: 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) T30(3)数据类型转换函数 1)(type ) 功能:判断所列项的数据类型,其值为下列类型之一。 INT(整型数) REAL(实型数) SYM(符号) STR(字符串) LIST(表) SUBR(内部函数) FILE(文件描述符) 示例: Command:

28、(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) 2831 5)(atoi ) 功能:将字符串化为整型数。示例: Command:(atoi 415) 415 6)(atof ) 功能

29、:将字符串化为实型数。示例: 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值。示例: Comm

30、and:(ascii Access) 65 10)(chr ) 功能:求出整型数所代表的ASCII字符。示例: Command:(chr 65) A32(4)字符串处理函数 1)(strcat ) 功能:将所列的字符串合并为一个字符串。示例: Command:(strcat C A D) CAD 2)(strlen ) 功能:求出字符串的长度。示例: Command:(strlen AutoCAD) 7 3)(substr ) 功能:按要求求出字符串的一个子串。示例: Command:(substr AutoCAD 5 3) CAD33(5)表处理函数 1)(list ) 功能:用所列表达式组

31、成一个表。示例: Command:(list C A D) (C A 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)

32、(C A M) 5)(assoc ) 功能:在关联表中求出指定关键字的子表。示例: Command:(setq alst (new 550) (old 162) (new 550)(old 162) Command:(assoc new alst) (new 550)34 6)(last ) 功能:求出表的最后一个元素。示例: Command:(last (Auto CAD) CAD Command:(last (Auto(CAD 14) (CAD 14) 7)(car ) 功能:求出表的第一个元素。示例: Command:(car (Auto (CAD 14) Auto 8)(cdr ) 功

33、能:求出表中去掉第一元素后的剩余表。示例: Command:(cdr (Auto (CAD 14)hz) (CAD 14)hz) 若已知一点pt:(setq pt(list 2.0 3.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)

34、hz 10)(reverse ) 功能:求出表的倒置表。示例: Command:(reverse (CAD 14) hz) (hz(CAD 14)35 11)(length ) 功能:求出表中顶层元素的个数。示例: Command:(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 * (

35、1 2 3) (2 3 4) (2 6 12) 14)(apply ) 功能:按指定函数对表进行处理。示例: Command:(apply * (1 2 3) 6 15)(quote )或() 功能:给出没有计算的表达式,也称为禁止求值函数。示例: Command:(quote a) A Command:(setq a 1) (setq a 1) 36 2.图形处理函数 (1)交互输入函数 (2)求值函数 (3)AutoCAD命令函数37 (1)交互输入函数 1)(getangle ) 功能:用相对基点拖动指定点或直接输入的方法确定一个角度,该角度为相对角度,零度角总为x轴正向,角度增加的方向

36、由系统变量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)(getdist ) 功能:用相对基点拖动指定点或直接输入的方法确定一段距离。示例: Command:(setq d(getdist Enter distance) Enter distance:10 10.0 Command:(setq d(getdist (0 0)Enter dis

37、tance) Enter distance:(拾取(2,2)点) 2.82843 3)(getpoint ) 功能:用相对基点拖动指定点或直接输入的方法确定一点。示例: Command:(setq P (getpoint Enter point) Enter point:(拾取(2,2)点) (2.0 2.0 0.0)38 4)(getint ) 功能:输入一个整数。示例: Command:(setq n (getint Number of items:) Number of items:5 5 5)(getreal ) 功能:输入一个实数。示例: Command:(setq x (getre

38、al 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 CITY:) CITY:Beiging China Beiging China 7)(getcorner ) 功能:输入与基点构成矩形对角线上的另一点。示例: Command:(setq s(getcorner (10

39、10) Enter a point:) Enter a point:(拾取(8,6)点) (8.0 6.0 0.0)398)(getorient ) 功能:用相对基点拖动指定点或直接输入的方法确定一个角度,该角度为绝对角度,零度角和角度增加方向分别由ANGBASE和ANGDIR定义。示例: 设ANGBASE=90(y轴正向为角度起始方向),ANGDIR=1(顺时针) Command:(setq a(getorient Enter angle:) Enter angle:45 0.7853989)(initget )功能:用规定的数据范围和规定的上述get*函数可接受的关键字来对get*函数的各

40、种输入自动进行检查。其中位值为表中所列的整数或它们的和。 位值的含义整数意 义1不接受空串2不接受零值4不接受负值8不检查绘图界限16返回三维点示例:自动检查输入项数是否为正整数。 ;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 must be greater than 1) ) )40 10)(getkword 功

41、能:用来接受用户输入的关键字,并以字符串的形式返回。有效的关键字集必须预先在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)41(2)求值函数 1)(distance ) 功能:求两点之间的距离。示例: Command:(distance (1.0 2

42、.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) 442 (3)AutoCAD

43、命令函数 (Command 命令名) 功能:在AutoLISP程序中调用并执行AutoCAD命令。这是一个非常有用的函数,它提供了AutoLISP与AutoCAD之间的内部接口,使得AutoLISP程序可以具有AutoCAD的图形功能,是开发应用系统时最常使用的工具。 其中命令名可以取除PLOT、PRPLOT、SKETCH、SCRIPT、DTEXT命令之外的所有命令,则是AutoCAD命令执行过程中需要的各种数据,可以是字符串、实型数、整型数或点,如点的坐标、距离或位移、角度、选项关键字、子命令名、文本等,参数的书写格式是: 参数=AutoCAD的键盘输入值 对于整数和实型数,可以省略双引号;

44、对于点的坐标,还可以用表的形式来表示;回车键可以用来表示,两个双引号间不要有空格;而一个空字符串 ,则表示在键盘打入一个空格。示例: (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 )433.程序结构控制函数 (1)(progn ) 功能:可按顺序计算到的值,并返回最后一个表达式的值。示例: 当X的值大

45、于等于0时,计算y=3x+6和Z=x2+2x的值。 (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

46、-1) )44(3)(cond ( ) ( ) ( ) 功能:按顺序计算每一个子表的,若不为nil,则计算子表中的所有,并返回最后一个的值。如果对所有的计算均为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) (

47、setq n 1) (repeat 100 (setq s(+ s(* n n) (setq n(+ n 1) ) (print s)45(5)(while ) 功能:若不为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)464.文件管理与I/O函数 (1)(

48、load) 功能:用来装入一个类型为LSP的AutoLISP程序文件,并计算文件中的所有值。可以不带类型名.LSP,并可以包括驱动器名和目录名前缀。 如果装入成功,load函数将返回文件中最后定义的函数名或表达式的值,否则返回文件名或出错信息。 示例:装入构造常用三维形体的3D.LSP程序文件。 Command:(load 3D) c:3D 返回该文件中最后定义的一个函数名,表示3d.lsp装入成功。47 (2)(open) 功能:用来打开一个ASCII文件,以便AutoLISP的I/O函数对其进行存取,它返回文件描述符,以供其它I/O函数使用,因此需要在打开文件的同时,将文件描述符赋给一个变

49、量。 可以包括盘符和目录名,并需要带上文件类型名。 是用小写字母表示的r(表示读)或w(表示写或重写)或a(表示添加)。 如果不存在,且为w或a将产生并打开一个新文件。 如果不存在,且为r将返回nil。 AutoLISP允许同时打开16个文件。示例: (setq f1(open old.TXT r) (setq f2(open new.TXT w) (setq f3(open A:userCAD1.TXT a) 注意:为添加数据而打开的文件,其文件尾部不能含有CTRL-C文件结束符(ASCII码值为26),否则,当对文件进行读操作时,会在文件结束符位置返回而使添加的数据不能读出。48 (3)(

50、close) 功能:用来关闭一个用open函数打开的文件,其中是在打开文件时得到的。写入文件的内容,只有在文件关闭后,才能被保存起来。示例: (close f1) (4)(read-char) 功能:用来从键盘输入缓冲区中或从表示的已打开文件中读入一个字符,并返回该字符的ASCII值。 若没有指定文件描述符且键盘输入缓冲区为空,则(read-char)将等待用户键入一个字符或一些字符,并按回车键结束。read-char将按输入次序逐个返回各字符的ASCII值(调用一次返回一个)。示例: (read-char f)或(read-char) (read-char) 从键盘输入ABC 返回:65 (

51、read-char) 返回:66 (read-char) 返回:67 (read-char) Enter后返回ASC字符码1049 (5)(read-line) 功能:用来键盘输入缓冲区或从表示的已打开文件中,依序读取一行字符串,当读取结束后返回nil。同read-char一样,read-line也可以在键盘输入缓冲区为空时,等待用户输入一些数据(最后要用回车键结束),read-line最后将返回这个字符串。 示例:(read-line f)或(read-line) 若用户键入“CAD”并回车后,read-line将直接返回“CAD”字符串。 (read 字符串) 功能:返回由一个字符串取得的

52、第一个列表或元素。 示例:(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) 功能:用来将由所代表的字符写到屏幕上或由表示的已打开文件中,并返回该字符的ASCII值。 示例:写字符C到屏幕或文件f中。 (write-char 67) (write-char 67 f)50 (7)(write-line) 功能:用来将写到屏幕上或表示的打开文件中,并返回该字符串。 示例:将字符串“AutoCAD R14.

53、0”写到屏幕或文件f中。 (write-line AutoCAD R14.0) (write-line AutoCAD R14.0f) (8)(prompt) 功能:用来在命令通讯区显示,并返回nil。示例: (prompt Please wait Loading 3D object.) (9)(prin1) 功能:用来在屏幕当前光标位置打印,如果含有一个为写而打开的文件描述符,则将写入该文件。 如果为字符串,则打印时字符串带双引号。如果含有控制字符,prin1将不做处理。打印后的光标停在最后一个字符的下一个位置上。示例: (prin1 CAD) ;屏幕打印CAD (prin1 OK!) ;屏

54、幕打印“OK!” (prin1 Line f) ;将“Line”写入文件 (prin1 CADnR14.0) ;屏幕打印“CADnR14.0”51 (10)(print) 功能:与prin1函数相比,print函数在打印之前要先换行,并在新行的第一列位置开始打印,打印后还需要附加一个空格来结束。其它功能与prin1函数相同。 (11)(princ) 功能:与prin1函数相比,princ函数不仅从屏幕当前光标位置开始打印,而且能处理控制字符,其它功能与prin1函数相同。示例: (princ CADnR14.0);屏幕打印并换行 CAD R14.0525.5 函数定义及装载 1.自定义函数 A

55、utoLISP程序是由一系列有序排列的标准表构成的。标准表的第一个元素是函数名,AutoLISP程序执行过程是通过调用AutoLISP函数来实现的。AutoLISP提供了用户自己定义函数的功能,这就为用户进行专业CAD的开发提供了有利条件。 用户自定义函数的过程包括函数定义和函数调用两部分。53(1)定义用户函数DEFUN 格式: (defun ) 为所定义的函数的名称,必须为符号原子。 是所定义的函数的参数,它包括两部分,即形参和局部变量,两部分用“/”隔开。“/”与前后参数之间必须有空格。由于形参和局部变量均可缺少,故有四种情况: 1)二者均有:( / )。 2)只有形参:( )。 3)只

56、有局部变量:(/ )。 4)二者均缺省为空表:( )。 为函数定义的内容,由一系列有序排列的标准表组成。 如前所述,当用户函数用Load函数调入内存时,该用户函数并不执行,只是产生一个函数的定义,返回该函数名,只有调用该函数时才执行函数内容,并返回该函数的值。54 (2)函数的调用 用户函数的调用形式和系统内部函数调用一样,也是通过一个标准表,表的第一个元素为用户函数名,其它元素为实参。注意局部变量在函数调用时是不使用的。用户函数调用时用实参代替形参,且参数的位置及数目应严格对应。 函数定义体中用到两种变量:全局变量和局部变量。 全局变量:对于某一个函数,凡是没有出现在参数表中(无论在“/”之

57、前或之后)的变量都是全局变量。(函数调用后,仍保留其当前的约束值。只要该变量不重新赋值或不退出AutoCAD,全局变量的值一直保存在内存中,且任何表达式均可使用它。) 局部变量是指出现在参数表中的变量,它包括参数表中的形参和局部变量两部分,也就是说参数表中所列出的所有形参和局部变量都是该自定义函数的局部变量。(其约束值只局限于函数的内部,而在该函数外部是无效的)。55例: (defun jc(x y / a b) (setq a(+ x 15.0)b(+ y 10.0) (setq z(* a 2.0 b) ) jc函数中x、y、a、b为局部变量,z为全局变量。当调用该函数时: (jc 8 1

58、2) x、y、a、b的当前约束值分别为8、12、23.0、22.0,在jc函数调用过程中是有效的。如果在调用前局部变量未被赋值,当jc函数调用时,其当前约束值为nil。而全局变量z的值在jc函数调用后约束值保持不变,可供其它表达式使用。56设置变量的原则:尽量设置为局部变量,最大限度地减少全局变量的数目。其原因有二:自定义函数很多时,若大量采用全局变量时,很容易相互冲突,即相同符号的变量约束值,后面要冲掉前面的。为防止变量发生冲突,尽可能把这些变量定义为局部变量,避免相互影响,不同函数中局部变量可同名而互不干涉。全局变量永久占用内存空间,而局部变量占用的是内存“栈”的临时空间,函数调用后释放。

59、当程序很复杂,变量很多,若都使用全局变量,容易造成内存空间超界。572.增加AutoCAD命令的函数 可以用defun定义函数向AutoCAD增加新的命令。定义这些函数必须遵循下列规则: (1)函数必须具有形如“C:”的名字,字符使用大小写均可。“C:”作为名字的一部分必须存在,而“”则是用户选择的命令名。如果AutoCAD的内部命令已用UNDEFINE命令解除定义,“C:”函数可以和内部命令同名。这里的“C:”是表示命令行函数的前缀,并非指磁盘驱动器。 (2)必须用空变元表来定义函数,但允许有局部变量符号。 下面定义的是一个用多义线画正方形的函数: (defun C:PSQUARE(/ pt

60、1 pt2 pt3 pt4 len) (setq pt1(getpoint Lower left corner:) (setq len(getdist pt1 Length of one side:) (setq pt2(polar pt1 0.0 len) (setq pt3(polar pt2(/ pi 2.0)len) (setq pt4(polar pt3 pi len) (command pline pt1 pt2 pt3 pt4 C) ) 像这样的定义函数,在用load函数装载(load PSQUARE)后,就可以在Command:提示行只输入函数名的“PSQUARE”部分。58A

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论