1、lLISP(List Processing Language):语言是人工智能学科领域中广泛应用的程序语言是一种表处理程序,以符号表达式的形式表示程序和数据。lAutoLISP语言是嵌入在AutoCAD内的LISP语言采用LISP的语法和约定并具有自己的特性l可调用AutoCAD的绘图命令l可对图形数据库直接访问、修改l可对屏幕图形实时修改、交互设计、参数化设计l综合了LISP语言的特性和AutoCAD强大的图形编辑功能的特点l是一种人工智能绘图语言包括整型数、实型数、符号、字符串、彪、文件描述符、子程序(内部函数)、AutoCAD的选择集、实名体、函数分页表、外部子程序等(1)整型数:由 0
2、,1,2,9,+,-组成对于PC-DOS/MS-DOS系统,为16位带符号数值,-32768+32768对于32位机,为32位带符号数,-2147483648+2147483647AutoLISP和AutoCAD间整数的传输只能16位(2)实型数:用双精度浮点数表示,14位有效精度小于1的小数,必须“0.*”来表示,不可省略0也可用科学计数法表示,如0.12e9(3)符号原子:任何可打印的字符,除了下表中的符号()表的定义.点对,Quote函数的简写“字符串常数的定界符;用作程序的注释标志l符号原子简称符号,例如!A12,ABC,X831,AutoLISP中大小写等效l空格起分隔符号原子的作用
3、。另外终止或分隔原子符号的还有:(),“;l符号长度没有限制,但为了节省空间,尽量不用超过6个字符的符号名l“约束”是一对符号和值将一个值赋给符号,就说符号约束到那个值,不需要提前定义类型,例如l(setq X 25)X为整型,l(setq X“25”)X为字符串 (同一程序中出现,并没错)任何符号都有“符号名”和“符号约束”(值),若一个符号从未被赋值,则为nil。两个特殊的符号原子是T和nil,预先值是T和nil。一个符号可以是全局约束,也可以是局部约束查看符号的当前约束值,可用Command:!X程序中定义的符号名不能与系统定义的函数和符号名相同,例如linel(4)字符串:由双引号括起
4、来的字符序列,如“this is first point”字符的个数为字符的长度(最大长度100)。若“”,称为空串。字符串的通用格式“nnn”(ASCII编码),由于有特定的含义,字符串中用到,可用 或 114。常用的控制字符有特定的简单表示形式,见表4-2。其中e,n,r,t中的字母必须小写。字符串常用于磁盘文件名、标识符的打印名等如(prompt“n Enter first point:”)l(5)表提供在一个符号中存储大量数值的方法。例如l二维点用(x y)表示l三维点用(x y z)表示l(setq a 6)中有3个元素表的大小l用长度度量,长度指表中顶层元素个数l如;(setq a
5、(+(d 2)的长度是3,其中(+(d 2)是一个表不是符号。表的两种基本类型:标准表和引用表l标准表从左括号“(”开始,到配对右括号“)”结束。标准表的第一个元素必须是函数。l引用表在左括号前加一撇“(”,表示此表不求值。l(6)文件描述符是被打开文件的标识号当函数访问文件时,是通过该文件描述符去识别文件并建立联系例如“myfile.dat”文件,执行下列命令:l(setq f1(open“myfile.dat”“w”)l 该文件描述符的数值赋予符号f1。l(7)实体名是赋予图形实体的数字标号是该图形文件的指针,通过它可以找到该实体的数据库记录和屏幕对象。例如;(setq aaa(entla
6、st)l把图形最后一个实体的实体名赋予符号aaa.l(8)选择集一个或多个实体的集合可以交互地向选择集增加或减少对象。例如:(setq ssprev(ssget“p”)l将选择的对象赋予符号ssprev l(9)子程序和外部子程序子程序是AutoLISP的函数,可以用defun函数重新定义外部子程序是由ADS应用程序定义的子程序l前缀表示法:和中缀表示法不同,运算符在操作数之前。(setq x 25.0)x=25.0(setq x(*(+a b)c)x=(a+b)*cl程序结构组成表达式是语法上合理的程序。完整的程序,往往是由一系列按顺序排列的表达是组成l程序注释注释以分号“;”开始,在一行的
7、末尾结束注释可以出现在程序的任何地方。lX*Y+X 表示为 (defun plus(x y)(+(*x y)x)(setq a 2.0)(setq b 4.0)(plus a b)最后显示 plus 等于 10.0l例如函数f(x)=程序为:1 (x0)2 (x=0)0 (x x 0)1)(=x 0)2)(x 0)0)1.基本函数(1)数值计算函数 1)(+数数)求和 2)(数数)求差 3)(*数数)求积 4)(/数数)求商 5)(1+数)加1 6)(1数)减1 7)(abs数)求绝对值 8)(sin数)求正弦值 9)(cos数)求余弦值 10)(atan数1数2)求反正切值 11)(sqrt
8、 数)求平方根 12)(min 数1数2)求最小值 13)(max 数1数2)求最大值 14)(expt 底数幂)求幂 15)(log数)求自然对数 16)(gcd数1数2)求最大公约数 17)(rem数1数2)求余数1)(=)相等为T,不等为nil2)(/=)相等为nil,不等为T3)()大于为T,否则为nil4)()小于为T,否则为nil5)(=)大于等于T,否则为nil6)(=)小于等于T,否则为nil7)(and )逻辑与运算8)(or )逻辑或运算9)(not)逻辑非运算10)(atom)判断列项是符号为T11)(bound)判符号有非nil值为T12)(listp)判项为表为T13
9、)(minusp )判项为负数为T14)(mumberp )判项为整数或实数为T15)(null )判项的值为nil为T16)(memder )表中找表达式 出现位置后的内容17)(zerop )判项为零为T18)(eq )判完全相同19)(equal )判值相同1)(type )INT,REAL,SYM,STR,LIST,SUBR,FILE类2)(fix )实型数转化整型数3)(flaot )整型数转化实型数4)(itoa )整型数转化字符串5)(atoi )字符串转化整型数6)(atof )字符串转化实型数7)(rtos )按LUNITS和LUPREC将数转化字符串8)(angtos)按L
10、UNITS和LUPREC将弧度数转化字符串9)(askii )求字符串第一个字符的ASKII值10)(chr )求整型数的ASKII字符1)(strcat )将几个字符串合并为一个字符串2)(strlen )求字符串的长度3)(substr )求字符串的一部分组成的子字符串1)(list )将所列表达式合并为表。2)(append )将所列表合并为新表。3)(cons )将新元素加到表头4)(subst )新元素替换表中的旧元素5)(assoc )关联表找关键字6)(last )求表中的最后一个元素7)(car )求表中的第一个元素8)(cad )求去掉第一个元素后的表。9)(nth )求表中
11、的第n个元素。10)(reverse)求表的位置倒置表。11)(length )求表中元素的个数。12)(foreach )将表中元素逐一赋给变量并求表达式的值。13)(mapcar )将表中的元素按函数的要求进行处理。14)(apply )按函数要求对表处理15)(quote )或()不求值函数(1)交互输入函数1)(getangle)相对X角度2)(getdist )相对距离3)(getpoint )相对点4)(getint)输入一个整数5)(getreal)输入一个实数6)(getstring )输入一个字符串7)(getcorner )输入与基点构成矩形对角线的另一点8)(getori
12、ent )指定以 ANGBASE指定的起始角和 ANGGDIR定义方向的绝对角度。9)(initget )用规定的数据范围和规定的意义对函数的各种输入进行检查10)(getkword)接受用户输入的关键字,以字串形式返回。1)(distance )求两点之间距离2)(angle )求两点连线与X角度3)(polar )求距基点的角度为a、距离为d的点。4)(eval )求表达式的二次求值结果 (Command “命令名”)在AutoLISP中调用AutoCAD命令。命令名可以用除下列命令之外的所有命令:PLOT,PRPLOT,SKETCH,SCRIPT,DTEXT。参数的格式:参数=“键盘输入
13、值”整数和实数,可以省略双引号。点坐标,可以用表的形式表示。回车可以用“”表示 空字符串“”,表示打入一个空格。(1)(progn )按顺序计算表达式值(2)(if )按条件计算表达式值(3)(cond()按顺序计算 ()条件式 ()(4)(repeat )按照重复次数的要求计算后面一系列(5)(while )若 不为nil,则计算后面一系列 (load )装入lisp文件(open )打开ASCII文件如(setq f1(open“c:usercad1.txt”“a”))(close )关闭打开的文件(read-char)打开文件中读字符(read-line)打开文件中读字符串l(6)(wr
14、ite-char )写文件l(7)(write-line )写字串l(8)(prompt)显示提示符l(9)(prinl )打印l(10)(print )换行打印l(11)(princ )换行打印、处理控制字符1.自定义函数:(1)定义用户函数 DEFUN 格式:(defun )(2)调用函数 和系统内部函数调用一样,通过标准表。函数定义体中用到2种变量:全局变量和局部变量。例如 (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为全局变量。用defun向AutoCAD增加新命
15、令应遵守规则:函数具有“C:XXX”的名字,必须用空变元表来定义函数,但允许有局部变量符号。用多义线画正方形的函数:(defun c:PSQUARE(/pt1 pt2 pt3 pt4 len)(setq pt1(getpoint“Lower lift 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”)当
16、AutoLISP库要在启动AutoCAD时自动装载。应使acad.lsp在库路径中出现或者在.mnl文件中装载,这类文件包括.mnu,mnx和mnl文件。当前目录:包含当前绘图文件的目录;AutoCAD环境变量所命名的目录;包含AutoCAD程序文件的目录。Acad.lsp和*.mnl可以直接定义所需的AutoLISP函数,或者使用load命令装载。格式:(load)文件中没有自定义函数时,返回最后一个标准表的求值结果;文件中只有自定义的时,返回最后一个用户名;文件中既有用户自定义函数,又有其他程序时,自定义函数只装入内存,但不执行。1.AutoLISP语言的主要功能是什么?2.简述LISP语言的几种数据类型。3.预习实验三。l AutoLISP的程序结构lAutoLISP的数据类型lAutoLISP的函数lAutoLISP的编程方法