AutoLisp语⾔的学习和使⽤(1)
第七节AutoLISP语⾔及其程序设计
LISP(List Processing)是⼀种计算机的表处理语⾔。LISP语⾔是⼈⼯智能领域中⼴泛应⽤的⼀种程序语⾔。
AutoLISP语⾔是⼀种运⾏在AutoCAD环境下的LISP编程语⾔,或称为AutoCAD的⼀种嵌⼊式语⾔。它采⽤了与CommandLISP(⼀种通⽤的LISP语⾔版本)相近的语法及习惯约定,并吸收了LISP语⾔的主要函数,同时增加了针对AutoCAD特点的许多功能,如:可以把AutoLISP和AutoCAD的绘图命令透明地结合起来,使设计和绘图完全融为⼀体。利⽤AutoLISP语⾔编程可以实现对AutoCAD当前图形数据库进⾏直接访问和修改。
在LISP语⾔中,最基本的数据类型是符号表达式。LISP语⾔的特点是程序和数据都采⽤符号表达式的形式,即⼀个LISP程序可以把另⼀个LISP程序作为它的数据进⾏处理。因此使⽤LISP语⾔编程⼗分灵活,看起来是⼀个⼀个的函数调⽤。⽀持递归定义也是Auto LISP语⾔的重要特性。
AutoLISP语⾔是提供给⽤户的主要⼆次开发⼯具之⼀。⽤AutoLISP语⾔编写应⽤程序,可以为AutoCAD增加新的命令或修改AutoCAD,以适应⽤户的特殊需要。AutoCAD软件的开发者——AutoDesk公司许诺,
将保证今后AutoCAD软件对AutoLISP 语⾔的⽀持。掌握使⽤和编制AutoLISP应⽤程序的⽅法和技术将⼤⼤提⾼⽤户的⼯作效率和⼆次开发⽔平,增强AutoCAD的灵活性,并将得到长期、稳定的技术⽀持。
1.1 AutoLISP语⾔的基本知识
1.1.1 AutoLISP语⾔的特性
AutoLISP语⾔是⼀种解释型语⾔,它的特点如下:
1.解释型语⾔
编程语⾔有两种基本类型:解释型和编译型。AutoLISP属于解释型语⾔。在解释型语⾔中,⽤户编写的源程序直接由解释器解释并执⾏。⽽在编译型的语⾔中,源代码⾸先要编译为⼀种中间格式(⽬标⽂件),然后再与所需的库⽂件链接,⽣成机器码可执⾏⽂件。AutoCAD本⾝是⽤编译型语⾔写成的。
解释型语⾔的的主要优点是在执⾏这种语⾔编写的程序之前不需要中间步骤,⽤户可以交互、独⽴于其它部分来试验或验证程序段或程序语句,⽽不需像编译型语⾔那样,每当试验程序时,要全部地编译和链接整个程序。
2.平台和操作系统独⽴
AutoLISP语⾔的另⼀个优点是可移植性。AutoLISP程序可以在运⾏于多种⽀持平台(如Windows、DOS、UNIX和Macintosh 等)上的AutoCAD中执⾏⽽与CPU或操作系统⽆关。
3.AutoCAD的版本独⽴
AutoLISP程序除平台和操作系统独⽴外,AutoLISP的设计还考虑了向下的兼容。这样,任⼀版本AutoCAD编写的AutoLISP程序⼀般不加修改就可以在以后版本的AutoCAD中运⾏。
4.AutoLISP与主流编程语⾔的⽐较
AutoLISP与⽬前使⽤⽐较多的编程语⾔(如C/C++,BASIC等)之间有⼀些明显的差别。具体可体现在下述⼏个⽅⾯:
(1)AutoLISP与其它⼤多数语⾔之间最重要的差别是它⽤表(List)存放数据。AutoLISP 没有数组、联合、结构及记录,所有复杂的数据集均由表来表⽰和处理。
(2)AutoLISP的变量没有明确的类型。LISP变量的类型是在赋值时动态确定的。
(3)AutoLISP不需要预先声明变量或函数。
(4)与C/C++,BASIC等语⾔不⼀样,LISP没有语句、关键词及运算符。它是函数定位的语⾔,其所有运算都是由函数调⽤完成。
1.1.2 AutoLISP语⾔中的数据类型
AutoLISP⽀持下述10种数据类型:
●整型数
●字符串
●符号
●表
●⽂件描述符
●AutoCAD实体名
●AutoCAD选择集
●内部函数(AutoLISP⼦程序)
●外部函数(ADS、ARX函数)
整型数
整型数是⼀种不带⼩数点的数字,它可由0,1,2……,9,+,-共12个字符组成,例如:123,-76,+322等。
实型数
实型数是带有⼩数点的数,它可由0,1,2……,9,+,-,E,e共14个字符组成。实数有两种表⽰⽅法,即⼗进制表⽰法和科学计数表⽰法。例如:
⼗进制表⽰法:12.3,-7.6,+3.22
科学计数表⽰法:6.1E5(610000),-0.12E2(-12),-0.45E-2(-0.0045)
字符串
字符串(字符串常数)由⼀对双引号(”)括起来的字符序列组成。这对双引号是字符串的定界符。
字符串常数最⼤长度为132个字符,但表⽰字符串的符号名所约束的值可以是任意长度,因⽽可以利⽤“STRCAT“(字符串拼接)函数⽆限制地增加其长度。
字符串中,同⼀字母的⼤⼩写认为是不同的字符,空格是⼀个有意义的字符。
字符串的长度是指字符串⼀对双引号之间的字符个数(不包括⼀对双引号)。如果字符串的定界符之间⽆任何字符(即””)称为空串,其长度为零。
字符串中可以包含ASCII码中任⼀字符,通⽤的表⽰形式为“\nnn“,nnn为⼋进制形式的ASCII码。例如:“\101\102 \103”表
⽰“ABC”,两者的作⽤完全相同。由于反斜杠“\”已作为字符串中的前导转义符,因⽽当字符串中要使⽤反斜杠时,必须加转义符,即⽤双反斜杠“\\”表⽰字符串中⼀个反斜杠“\”,也可以⽤反斜杠的ASCII码表⽰(即“\114”)。同样,由于双引号已作为字符串的定界符使⽤,因⽽字符串中的双引号可以⽤“\””或“\042”表⽰。对于⼀些常⽤的控制字符,其ASCII代码见下表。
字符代码表
例如:下⾯的表达式表⽰在显⽰提⽰内容前先进⾏换⾏,然后再显⽰字符串内容。
(p rompt “\nEnter filename:”)
或
(prompt “\012Enter filename:”)
⼆者效果完全相同。
符号
AutoLISP中符号⽤于存储数据,因此“符号”和“变量”这两个词含义相同,可以互相交换使⽤。
符号名可以由除下列6个字符外的任何可以打印的长度不限的字符序列来组成:
“(”、“)“、“,”、“’”、“””、“;”,当这6个字符中的任⼀字符在符号名中出现时,将终⽌符号名。不允许使⽤数字符号作为第⼀个
下列为合法的符号名:
ABC,!A,&AB,A3
下列为不合法的符号名:
(A),A.B,3A
在AutoLISP中符号名的⼤⼩写是等价的。LISP中“约束”是指对⼀对符号和值,当把⼀个值赋给⼀个符号时,也即把这个符号约束为那个值。
例如:
(setq a 6)
“!a”将显⽰6,表⽰a是⼀个整数,其值为6。
(setq a 6.0)
“!a”将显⽰6.0,表⽰a是⼀个实数,其值为6.0。
(setq a “6.0”)
“!a”将显⽰6,表⽰a是⼀个字符串,其值为“6.0”。
符号
表是指在⼀对相匹配的左右圆括号之间的元素的有序集合。表中的每⼀项称为表的元素,表中的元素可以是整数、实数、字符串和符号,也可以是另⼀个表。
为了处理图形中点的坐标,AutoLISP对⼆维和三维点的坐标按如下规则表⽰:
⼆维点:以分别代表x,y坐标的两个实数所构成的表(x,y)的形式表⽰,如:(3.21 7.58)三维点:以分别代表x,y,z坐标的三个实数所构成的表(x,y,z)的形式表⽰,如:(3.21 7.58 4.68)。
表的⼤⼩⽤其长度来度量。长度是表中顶层元素的个数。
例如:
(setq a 6) 表的长度为3
(setq a (+ c (/ d 2) ) ) 表的长度为3
表有两种基本类型:标准表和引⽤表。标准表是从左括号开始到配对的右括号结束。表中的第⼀个元素(0号元素)必须是⼀个合法的已存在的AutoLISP函数。引⽤表是在左括号前加⼀撇号,表⽰不对此表作求值处理。
⽂件描述符
当AutoLISP打开⼀个⽂件时,系统将给该⽂件赋⼀个数字标号,在以后要访问该⽂件时(读或写⽂件),可利⽤该⽂件描述符对指定的⽂件进⾏操作。
例如:
打开⼀个名为:“myfile.dat”的⽂件,把打开⽂件时的⽂件描述符赋给符号f,再把“This is a sample under AutoLISP.”写⼊该⽂件。
(setq f (open “c:\\myfile.dat” “w”) )
(print “This is a sample under AutoLISP.” f)
实体名
实体名是AutoCAD系统在绘图过程中赋予所绘实体的⼀个数字标号。实际是指向⼀个AutoCAD系统内部的数据⽂件的⼀个指针。
(setq elast (entlast) )
注:entlast 是获取数据库中最新图元的名称。
选择集
选择集⼀个或多个实体的集合。它类似AutoCAD的实体选择过程。在AutoLISP程序中也可以构造⼀个选择集,并把它赋予⼀个符号供其它函数使⽤。
例如:
(setq ss (ssget “p”))
⼦程序和外部⼦程序
由AutoLISP提供的函数称为⼦程序(内部函数),外部⼦程序是由ADSRX或ARX应⽤程序定义的⼦程序。
1.1.3 程序结构
C,VC,VB等采⽤“中缀表⽰法”
例如:
X=3.4
AutoLISP采⽤的是“前缀表⽰法“
例如:
(setq x 3.4)
表达式X=(A+B)*C在AutoLISP中表⽰为:
(setq X (* ( + A B) C) )
(setq a 2.3 )(setq b 6.7)(+ a b )
(defun C:ff(/)
(setq a 2.3 )
(setq b 6.7)
(setq c (+ a b ) )
)
basic语言if语句1.1.4 求值、表达式及变量
求值
每个LISP程序的核⼼是⼀个求值器。求值器读⼊⽤户的输⼊⾏(⼀个符号表达式),对
其进⾏计算,然后返回计算结果。
AutoLISP的求值过程如下:
(1)整形数、实型数、字符串对、⽂件指针和⼦程序以它们本⾝的值作为结果。
(2)符号以它们当前的约束值作为计算结果。
(3)表根据其第⼀个元素的类型来进⾏求值。
表达式
所有AutoLISP表达式均为下述形式:
(function_name [arguments]……)
左边以左括号“(”开始,其后由函数名和函数的参数组成,最后以右括号“)”结束。每个表达式都有⼀个返回值。表达式的参数可以是⼀个表达式,它的返回值将被外层表达式使⽤。
变量
AutoLISP的变量有四种类型:整型数、实型数、字符串和表。变量的类型根据所赋的值⾃动确定,并⼀直保持到下⼀次再赋值为⽌。
AutoLISP⽤setq函数给变量赋值,格式如下:
(setq 变量名值)
其中参数“值”可以是⼀个表达式,执⾏结果返回变量的值。
例如:
(setq x 5) x=5 整型数
(setq x 5.0) x=5.0 实型数
(setq x “Hello”) x=”hello”字符串
(setq x ‘(3.7 6.5) ) x=(3.7 6.5) 表
当要⽤变量来响应AutoCAD提⽰时,只需在变量名前加⼀个“!”即可。
例如:
command:
(setq p1 ‘(100 100) )
(setq p2 ‘(200 200) )
(command “line” p1 p2)
函数:
(defun C:aa1(/)
(setq p1 '(100 100))
(setq p2 '(200 200))
(command "line" p1 p2)
)
或者:
command:line
From point:!p1
1.2 赋值与数值计算函数
1. 赋值函数 (set 符号表达式)与(setq 符号1 表达式1……)
(setq a 3.0)
(setq a 3.0 b 15)
(setq L ‘(a b))
区别:
set函数对第⼀个变元(符号)进⾏计算,并可将⼀个新值间接赋给另⼀个符号,⽽setq 则不然。
(setq a ‘b)将变量名b赋给变量a
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论