您好,欢迎访问三七文档
AutoCAD在测绘中的应用2020/5/211第10章AutoLISP语言入门AutoLISP语言概述AutoLISP数据类型AutoLISP程序结构AutoLISP内部函数函数定义及装载AutoLISP程序调试与编程实例AutoCAD在测绘中的应用2020/5/21210.1.1.AutoLISP语言简介LISP(listprocessinglanguage)语言是一种计算机的表处理语言,是在人工智能学科领域中广泛采用的一种程序设计语言。美国AutoDesk公司在AutoCAD内部嵌入AutoLISP的目的是使用户充分利用AutoCAD进行二次开发:实现直接增加和修改AutoCAD命令,随意扩大图形编辑功能,建立图形库和数据库并对当前图形进行直接访问和修改等。10.1AutoLISP语言概述AutoCAD在测绘中的应用2020/5/213AutoCAD虽然为我们提供了丰富的绘图和编辑命令,但是这些命令并不是针对测量专业而设置的。有些测量方面常用的功能AutoCAD并不具备,但可以利用LISP语言对AutoCAD作二次开发,开发出适应测量专业特点的新命令。例如在地形测量中加固陡坎、末加固陡坎、铁路、电力线路,围墙,界址线等等地貌符号和地物符号的绘制,AutoCAD没有提供相应的绘图命令,为此,我们都可以编制相应的LISP程序来自动处理完成。编制若干个LISP程序,每一个程序完成一个相应的功能,把这些程序嵌入AutoCAD内部,调用AutoCAD时一同装入内存,我们就可以象调用其它AutoCAD命令一样,随意调用,方便、灵活地完成各种编辑工作。AutoCAD在测绘中的应用2020/5/21410.1.2.AutoLISP的特点(1)AutoLISP语言是在普通的LISP语言基础上,又扩充了许多适用于CAD应用的功能而形成的一种程序设计语言。它是一种解释性求值语言,速度较慢,难以保密,可用任何文字编辑软件编辑,用纯文本的格式保存。(2)AutoLISP语言中的一切成分都是以函数形式给出的,它没有语句概念或其他语法结构。执行AutoLISP程序就是执行一些函数,再调用其它函数。(3)AutoLISP把数据和程序统一表达为表结构,故可把程序当作数据来处理,也可把数据当作程序来执行。AutoCAD在测绘中的应用2020/5/215(4)AutoLISP语言中程序运行过程就是对函数求值的过程,是在对函数求值的过程中实现函数的功能。(5)AutoLISP语言的主要控制结构是采用递归方式。递归方式的使用,使得程序设计简单易懂。AutoCAD在测绘中的应用2020/5/21610.2AutoLISP数据类型AutoLISP主要有如下数据类型:整数(INT)实型数(REAL)符号原子(SYM)字符串(STR)表(及用户定义的函数)(LIST)文件描述符(FILE)AutoLISP的内部函数(SUBR)AutoCAD的选择集(PICKSET)AutoCAD的实体名(ENAME)函数分页表(PAGETB)AutoCAD在测绘中的应用2020/5/21710.2.1整数整数是由0,1,2,…,9,+,-字符组成,不许出现其它字符,+号可有可无。例如:+256,103,-15,0。10.2.2实型数实型数是用双精度的浮点数表示并且有至少14位有效精度,即整数后跟小数。※如果实数的绝对值小于1,小数点前必须加0,不要直接以小数点开头。否则,计算机误认为是点对而出错。例如,“.4”是错误的表示,“0.4”才是正确的写法。实型数也可以用科学计数法表示,即数字后可有一个可选择的“e”或“E”,后跟数的指数。例如:0.12E9表示0.12×109。AutoCAD在测绘中的应用2020/5/21810.2.3符号原子符号原子可以包含除以下字符以外的任何可打印字符:()用作表的定义;·用作点对;也是一种表。'用作QUOTE函数的简写;”用作字符串常数的定界符;;用作程序的注释标志。符号原子的长度没有限制,但尽量不要超过6个字符,否则要占用额外的内存,降低运行速度。在AutoLISP中,符号的大小写是等效的。例如,ABCD,Abcd,abcd,AbcD都表示一个符号原子。AutoCAD在测绘中的应用2020/5/219AutoLISP中的任何符号都是有值的,即符号都要赋以一定的数值,或者说符号总是约束在一定值上。一般用赋值函数setq进行赋值。例如:(setqX210.0)意思是将210.0赋给x,这时x的当前约束值为210.0,若符号在使用前如没有赋以任何值,则该符号的值为nil(空),它不占用内存空间。AutoCAD在测绘中的应用2020/5/211010.2.4字符串字符串是由包括在一对双引号内的一组字符组成的,如“AB”、“CAD”、“北京”等。字符串包含任何可打印的字符。字符串中字母的大小写及空格都是有意义的。字符串的最大长度为100个字符若字符串中没有任何字符,则为空串“”。AutoCAD在测绘中的应用2020/5/211110.2.5表AutoLISP广泛地使用表。表提供了在一对符号中存储大量相关数值的有效方法。例如点的表示,二维点以表(XY)表示,第一个数值是点的X坐标,第二个数值是点的Y坐标。三维点以表(XYZ)表示,第一个数值是点的X坐标,第二个数值是点的Y坐标,第三个数值是点的Z坐标。例如(setqa6.0)也是一个表,表中有三个元素,第一个元素setq为一函数名,第二个元素为一变量,第三个元素为一实数。AutoCAD在测绘中的应用2020/5/2112在AutoLISP语言中,表有如下特点:(1)表是指放在一对相匹配的左、右括号中的一个或多个元素的有序集合。(2)表中的每一个元素可以是任何类型的表达式,即可以是数字、符号、字符串,也可以是表。(3)元素与元素之间要用空格隔开,注意元素与括弧之间可不用空格。如:(15(ab)cd),在此例中,表内有4个元素,其中第二个元素是表。(4)表可以是任意嵌套的,上例中即嵌套了一个表。表可以嵌套很多层,从外层向里依次称为0层,1层,2层……AutoCAD在测绘中的应用2020/5/2113(5)表中的元素是有顺序的,为便于对表中元素进行存取,每个元素都有一个序号。从左向右,第一个元素序号为0,第2个元素序号是1,……,第i个元素序号是i-1。(6)表的大小为表的长度,即表中顶层元素的个数。没有任何元素的表称为空表。空表用()或nil表示。在AutoLISP中,nil是一个特殊的符号原子,它既是原子又是表。(7)表有两种基本类型:标准表和引用表。标准表:第一个元素的值必须是一个合法的已经存在的AutoLisp函数定义,后跟调用该函数的参数。引用表:是在表的前面冠以引用符号('或Quote)对该表不求值。注:“'”只能用在程序中间,不能在开头AutoCAD在测绘中的应用2020/5/2114Command:(setqx20)20Command:(setqY24)24Command:!x20;查询x的值Command:!y24Command:(setq!a20)20Command:!anilCommand:!!A20Command:(Quote(setqx20))(setqx20)Command:!xnilAutoCAD在测绘中的应用2020/5/2115(8)文件描述符文件描述是AutoLISP赋予被打开文件的标识号。当AutoLISP函数需要访问一个文件时(读该文件或者写该文件),首先通过该文件描述符去识别并建立联系。下面的例子打开文件“dc0906.dat”,使它可被其它函数读取,并把该文件描述符的数值赋予符号fl。(setqfl(openE:\\dc0906.datW))AutoCAD在测绘中的应用2020/5/21161、符号:用作变量、函数的名字。2、命名规则:不能只含数字,除下列字符以外的任何可打印字符组成:().';“”3、符号长度无限制,但一般不超过6。4、变量的数据类型:不需要事先进行类型说明,变量被赋予值的类型就为变量的类型。5、不能使用内部函数名和关键字作为变量名。6、变量赋值:(setq变量1值1[变量2值2...])7、显示变量的值:!变量名(同时将值传递给autocad)。10.2.6变量AutoCAD在测绘中的应用2020/5/2117•nil:变量没有赋值,尚无定义。将nil赋给某一有定义的变量,其结果是取消该变量的定义并释放其所占存储空间。引用尚未赋值的变量是错误的。•nil作为逻辑变量的值,表示不成立。•T:逻辑成立。•Pause:暂停,等待用户输入。•Pi:∏。10.2.7预定义的符号AutoCAD在测绘中的应用2020/5/211810.3AutoLISP的程序结构1.表达式(1)表达式含义:AutoLISP处理的对象是符号表达式(简称表达式)。它相当于其它编程语言中的程序语句。(2)表达式的构成:表达式由原子或表构成。多数情况下以表的形式存在,例如:(函数名[变元]…)(3)表达式前缀表示法大多数计算机语言采用“中缀表示法”来表示程序语句,如在C语言中,给变量X赋值为210.0,写成如下语句:X=210.0在该表示法中,运算符“=”放在两个操作数“X”和“210.0”中间。这种表示法是大家都熟悉的。AutoCAD在测绘中的应用2020/5/2119在AutoLISP语言中,采用的是“前缀表示法”,即把运算符放在操作数之前,而不是放在它们的中间,并把运算符(即函数名)和操作数(即调用函数的参数)用圆括号括起来,以表的形式表示。如上例,用AutoLISP表示:(setqX210.0)运算符(setq)放在操作数(X210.0)之前。再看下面的例子:X=(A+B)*C这是一个“中缀表示法”表示的一个表达式,若用AutoLISP表示则为:(setqX(*(+AB)C))其中“+”、“*”号在AutoLISP中仍用作加法和乘法函数的名字。AutoCAD在测绘中的应用2020/5/2120(4)表达式的求值规则•整型数、实型数和字符串以其本身的值作为求值结果。•符号以其当前的约束值作为求值结果。•表根据其第一个元素来进行求值。(+(*23)(/63))返回:8(fxabc)返回:error:nofunctiondefinition:fx(5abc)返回:error:badfunction:5(setqp(321))返回:error:badfunction:3AutoCAD在测绘中的应用2020/5/21212.程序结构组成(1)一个完整的AutoLISP程序往往是由一系列按顺序排列的表达式组成。例如:(defunplus(xy)(+(*xy)x))(setqa2.0)(setqb4.0)(setqc(plusab))这个简单的AutoLISP程序由4个表达式(即表)组成。第一个表给出了X*Y+X的函数定义,第二、三表分别给变量A、B赋值,最后一个表是对定义的PLUS函数的调用。调用时输入(plusab)即可AutoCAD在测绘中的应用2020/5/2122(2)在AutoLISP程序中,一个表达式可以分在多行中写,也可以一行中写几个。一行由“回车”结束。如前所述,原子之间多个空格的作用和一个空格的作用相同,都起着分隔符的作用。如果不考虑打印或印刷限制的话,可以利用多个空格使程序的结构直观,便于阅读。例如已知函数:)0(0)0(2)0(1)(时当时当时当xxxxfAutoCAD在测绘中的应用2020/5/2123用AutoLISP可以定义如下:(defunfun(x)(cond((x0)1)((=x0)2)((x0)0)))这种书写虽然是合法,但阅读起来很困难,且不易于检查左右括号是否匹配。因此可以写为:(defunfun(x)(cond((x0)1)((=x0)2)((x0)0))))0(0)0(2)0(1)(时当时当时当xxxxf(cond(条件式1表达式11
本文标题:AUTOLISP
链接地址:https://www.777doc.com/doc-5498031 .html