




已阅读5页,还剩62页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
AutoLISP平程序语言设计,AutoLISP程序语言概述AutoLISP数据类型AutoLISP程序结构AutoLISP内部函数函数定义及装载AutoLISP程序调试与编程实例,1.AutoLISP语言简介LISP(listprocessinglanguage)语言是一种计算机的表处理语言,是在人工智能学科领域中广泛采用的一种程序设计语言。(Lisp语言最早是在20世纪50年代末由麻省理工学院(MIT)为研究人工智能而开发的。)美国AutoDesk公司在AutoCAD内部嵌入AutoLISP的目的是使用户充分利用AutoCAD进行二次开发:实现直接增加和修改AutoCAD命令,随意扩大图形编辑功能,建立图形库和数据库并对当前图形进行直接访问和修改等。,5.1AutoLISP程序语言概述,2.AutoLISP的特点(1)AutoLISP语言是在普通的LISP语言基础上,又扩充了许多适用于CAD应用的功能而形成的一种程序设计语言。它是一种解释性求值语言,速度较慢,难以保密,可用任何文字编辑软件编辑,用纯文本的格式保存。(2)AutoLISP语言中的一切成分都是以函数形式给出的,它没有语句概念或其他语法结构。执行AutoLISP程序就是执行一些函数,再调用其它函数。(3)AutoLISP把数据和程序统一表达为表结构,故可把程序当作数据来处理,也可把数据当作程序来执行。(4)AutoLISP语言中程序运行过程就是对函数求值的过程,是在对函数求值的过程中实现函数的功能。(5)AutoLISP语言的主要控制结构是采用递归方式。递归方式的使用,使得程序设计简单易懂。,5.2AutoLISP数据类型,AutoLISP主要有如下数据类型:整数(INT)实型数(REAL)符号原子(SYM)字符串(STR)表(及用户定义的函数)(LIST)文件描述符(FILE)AutoLISP的内部函数(SUBR)AutoCAD的选择集(PICKSET)AutoCAD的实体名(ENAME)函数分页表(PAGETB),5.2.1整数,整数是由0,1,2,9,+,-字符组成,不许出现其它字符,+号可有可无。例如:+256,103,-15,0。,5.2.2实型数实型数是用双精度的浮点数表示并且有至少14位有效精度,即整数后跟小数。如果实数的绝对值小于1,小数点前必须加0,不要直接以小数点开头。否则,计算机误认为是点对而出错。例如,“.4”是错误的表示,“0.4”才是正确的写法。实型数也可以用科学计数法表示,即数字后可有一个可选择的“e”或“E”,后跟数的指数。例如:0.12E9表示0.12109。,5.2.3符号原子符号原子可以包含除以下字符以外的任何可打印字符:()用作表的定义;用作点对;也是一种表。用作QUOTE函数的简写;”用作字符串常数的定界符;用作程序的注释标志。符号原子的长度没有限制,但尽量不要超过6个字符,否则要占用额外的内存,降低运行速度。在AutoLISP中,符号的大小写是等效的。例如,ABCD,Abcd,abcd,AbcD都表示一个符号原子。AutoLISP中的任何符号都是有值的,即符号都要赋以一定的数值,或者说符号总是约束在一定值上。一般用赋值函数setq进行赋值。例如:(setqX25.0)意思是将25.0赋给x,这时x的当前约束值为25.0一个符号在使用前如没有赋以任何值,则该符号的值为nil(空),它不占用内存空间。,5.2.4字符串字符串是由包括在一对双引号内的一组字符组成的。字符串包含任何可打印的字符。字符串中字母的大小写及空格都是有意义的。字符串的最大长度为100个字符若字符串中没有任何字符,则为空串“”。字符串中可以包含ASC表中的任何字符,通用的表示格式为“nnn”,其中nnn是其字符的八进制ASC码。例如,字符串“ABCD”也可表示为“101102103104”。由于反斜杠已作为前导的标识字符,在字符串中有特殊作用,如果字符串中要包含它,则必须用两个相邻的反斜杠来表示:“”,当然,反斜杠也可表示为“114”。由于双引号已用作字符串的定界符,若需在字符串中包含双引号,则可用“042”表示。,除可用“nnn”的形式表示ASC表中的控制字符外,在AutoLISP中,对于常用的控制字符有特定的简单的表示形式,如下表所示。,常用的控制字符,必须注意,其中的字符e,n,r,t必须小写。例如,下面的表达式执行时都将提示在新的一行上显示:(Prompt“nEnterfirstpoint:”)(Prompt“012Enterfirstpoint:”)字符串常用于磁盘文件名,标识符的打印名等。,5.2.5表AutoLISP广泛地使用表。表提供了在一对符号中存储大量相关数值的有效方法。例如点的表示,二维点以表(XY)表示,第一个数值是点的X坐标,第二个数值是点的Y坐标。三维点以表(XYZ)表示,第一个数值是点的X坐标,第二个数值是点的Y坐标,第三个数值是点的Z坐标。例如(setqa6.0)也是一个表,表中有三个元素,第一个元素setq为一函数名,第二个元素为一变量,第三个元素为一实数。,在AutoLISP语言中,表有如下特点:(1)表是指放在一对相匹配的左、右括号中的一个或多个元素的有序集合。(2)表中的每一个元素可以是任何类型的表达式,即可以是数字、符号、字符串,也可以是表。(3)元素与元素之间要用空格隔开,注意元素与括弧之间可不用空格。如:(15(ab)cd),在此例中,表内有4个元素,其中第二个元素是表。(4)表可以是任意嵌套的,上例中即嵌套了一个表。表可以嵌套很多层,从外层向里依次称为0层,1层,2层(5)表中的元素是有顺序的,为便于对表中元素进行存取,每个元素都有一个符号。从左向右,第一个元素序号为0,第i个元素序号是i-1。(6)表的大小为表的长度,即表中顶层元素的个数。没有任何元素的表称为空表。空表用()或nil表示。在AutoLISP中,nil是一个特殊的符号原子,它既是原子又是表。(7)表有两种基本类型:标准表和引用表。标准表:第一个元素的值必须是一个合法的已经存在的AutoLisp函数定义,后跟调用该函数的参数。引用表:是在表的前面冠以引用符号(或Quote)对该表不求值。,命令:(setqx20)20命令:(setqY24)24命令:!x;查询x的值20命令:!y24命令:(setq!a20)20命令:!anil命令:!A20命令:(setqx20)命令:!xnil,6.文件描述符文件描述是AutoLISP赋予被打开文件的标识号。当AutoLISP函数需要访问一个文件时(读该文件或者写该文件),首先通过该文件描述符去识别并建立联系。下面的例子打开文件“myfile.dat”,使它可被其它函数读取,并把该文件描述符的数值赋予符号fl。(setqfl(openD:usermyfile.datW),符号:用作变量、函数的名字。命名规则:不能只含数字,除下列字符以外的任何可打印字符组成:().;“”符号长度无限制,但一般不超过6。变量的数据类型:不需要事先进行类型说明,变量被赋予值的类型就为变量的类型。不能使用内部函数名和关键字作为变量名。变量赋值:(setq变量1值1变量2值2.)显示变量的值:!变量名(同时将值传递给autocad)。,5.2.6变量,nil:变量没有赋值,尚无定义。将nil赋给某一有定义的变量,其结果是取消该变量的定义并释放其所占存储空间。引用尚未赋值的变量是错误的。nil作为逻辑变量的值,表示不成立。T:逻辑成立。Pause:暂停,等待用户输入。Pi:。,5.2.7预定义的符号,5.3AutoLISP的程序结构1.表达式(1)表达式含义:AutoLISP处理的对象是符号表达式(简称表达式)。它相当于其它编程语言中的程序语句。(2)表达式的构成:表达式由原子或表构成。多数情况下以表的形式存在,例如:(函数名变元)(3)表达式前缀表示法大多数计算机语言采用“中缀表示法”来表示程序语句,如在C语言中,给变量X赋值为25.,写成如下语句:25.在该表示法中,运算符“=”放在两个操作数“X”和“25.0”中间。这种表示法是大家都熟悉的。在AutoLISP语言中,采用的是“前缀表示法”,即把运算符放在操作数之前,而不是放在它们的中间,并把运算符(即函数名)和操作数(即调用函数的参数)用圆括号括起来,以表的形式表示。如上例,用AutoLISP表示:(setqX25.0)运算符(setq)放在操作数(X25.0)之前。,再看下面的例子:X=(A+B)*C这是一个“中缀表示法”表示的一个表达式,若用AutoLISP表示则为:(setqX(*(+AB)C)其中“+”、“*”号在AutoLISP中仍用作加法和乘法函数的名字。(4)表达式的求值规则整型数、实型数和字符串以其本身的值作为求值结果。符号以其当前的约束值作为求值结果。表根据其第一个元素来进行求值。(+(*23)(/63)返回:8(fxabc)返回:error:nofunctiondefinition:fx(5abc)返回:error:badfunction:5(setqp(321)返回:error:badfunction:3,2.程序结构组成(1)一个完整的AutoLISP程序往往是由一系列按顺序排列的表达式组成。例如:(defunplus(xy)(+(*xy)x)(setqa2.)(setqb4.0)(setqc(plusab)这个简单的AutoLISP程序由4个表达式(即表)组成。第一个表给出了X*Y+X的函数定义,第二、三表分别给变量A、B赋值,最后一个表是对定义的PLUS函数的调用。,(2)在AutoLISP程序中,一个表达式可以分在多行中写,也可以一行中写几个。一行由“回车”结束。如前所述,原子之间多个空格的作用和一个空格的作用相同,都起着分隔符的作用。如果不考虑打印或印刷限制的话,可以利用多个空格使程序的结构直观,便于阅读。例如已知函数:,用AutoLISP可以定义如下:(defunfun(x)(cond(x0)1)(=x0)2)(x0)1)(=x0)2)(721)TCommand:(260)nil4)()功能:判断左边的原子是否依次小于右边的原子,小于则为T,否则为nil。示例:Command:(=211)TCommand:(=212)nil6)()功能:判断左边的原子是否依次小于或等于右边的原子,小于或等于则为T,否则为nil。示例:Command:(=788)TCommand:(=132)nil7)(and)功能:对所列的表达式进行逻辑“与”运算,有一个表达式结果为(nil)即为nil,否则为T。示例:Command:(setqaT)TCommand:(setqbnil)nilCommand:(andab)nil8)(or)功能:对所列有的表达式进行逻辑“或”运算,当所有表达式都为(nil)即为nil,否则为T。示例:Command:(setqcnil)nilCommand:(setqbnil)nilCommand:(orbc)nil,9)(not)功能:对所列项求反,当该项值为nil时则为T,否则为nil。示例:Command:(setqbnil)nilCommand:(notb)T10)(atom)功能:判断所列项是否为原子,当该项为表时,则为nil,否则为T。示例:Command:(atomc)TCommand:(setqa(1.25.0)(1.25.0)Command:(atoma)nil11)(boundp)功能:判断所列的原子是否有非nil值,若有则为T,否则为nil。示例:Command:(setqcnil)nilCommand:(boundpc)nilCommand:(setqaT)TCommand:(boundpa)T,12)(listp)功能:判断所列项是否为一个表,是则为T,否则为nil。示例:Command:(listp(abc)TCommand:(listpa)nil13)(minusp)功能:判断所列项是否为负数,是则为T,否则为nil。示例:Command:(minusp-3.2)TCommand:(minusp8.32)nil14)(numberp)功能:判断所列项是否为整型或实型数,是则为T,否则为nil。示例:Command:(numberp-3.26)TCommand:(numberpEndpoint)nil15)(null)功能:判断所列项的值是否为nil,是则为T,否则为nil。示例:Command:(setqaT)TCommand:(setqbnil)nilCommand:(nullb)TCommand:(nulla)nil,16)(member)功能:在表中求得从出现位置的内容,若不含有的内容,则为nil。示例:Command:(membera(dbace)(ace)Command:(memberac(dbace)nil17)(zerop)功能:判断所列项的内容是否为零,是则为T,否则为nil。示例:Command:(zerop0)TCommand:(setqa1)Command:(zeropa)nil18)(eq)功能:判断和是否完全相同,是则为T,否则为nil。示例:Command:(setqca)Command:(eqca)TCommand:(eq(setqa(12)(setqb(12)nil19)(equal)功能:判断两表达式的值是否相等,是则为T,否则为nil。示例:Command:(equal(setqa(12)(setqb(12)T,(3)数据类型转换函数1)(type)功能:判断所列项的数据类型,其值为下列类型之一。INT(整型数)REAL(实型数)SYM(符号)STR(字符串)LIST(表)SUBR(内部函数)FILE(文件描述符)示例:Command:(type(seta25)LISTCommand:(type*)SUBRCommand:(type(setqf(openjq.txtr)FILE2)(fix)功能:将实型数去掉小数部分化为整型数。示例:Command:(fix2.13)23)(flaot)功能:将整型数化为实型数。示例:Command:(flaot2)2.04)(itoa)功能:将整型数化为字符串。示例:Command:(itoa28)28,5)(atoi)功能:将字符串化为整型数。示例:Command:(atoi415)4156)(atof)功能:将字符串化为实型数。示例:Command:(atof5)5.07)(rtos)功能:按着AutoCAD系统变量LUNITS和LUPREC定义的记数方式和精度将数转化为字符串。示例:设LUNITS=2(十进制),LUPREC=4Command:(rtos3.7)3.70008)(angtos)功能:按着AutoCAD系统变量LUNITS和LUPREC定义的记数方式和精度将弧度数转化为字符串。示例:设LUNITS=0(度),LUPREC=4Command:(angtos3.14)1809)(ascii)功能:求出字符串第一个字符的ASCII值。示例:Command:(asciiAccess)6510)(chr)功能:求出整型数所代表的ASCII字符。示例:Command:(chr65)A,(4)字符串处理函数1)(strcat)功能:将所列的字符串合并为一个字符串。示例:Command:(strcatCAD)CAD2)(strlen)功能:求出字符串的长度。示例:Command:(strlenAutoCAD)73)(substr)功能:按要求求出字符串的一个子串。示例:Command:(substrAutoCAD53)CAD,2019/12/13,34,可编辑,(5)表处理函数1)(list)功能:用所列表达式组成一个表。示例:Command:(listCAD)(CAD)Command:(list1.22.3)(1.202.30)2)(append)功能:将所列的合并成一个新表。示例:Command:(append(C)(A)(D)(CAD)3)(cons)功能:将新元素加到表的开头,形成一个新表。示例:Command:(consC(AD)(CAD)Command:(cons(AC)(AD)(AC)AD)4)(subst)功能:用新元素替换表中的旧元素。示例:Command:(substMD(CAD)(CAM)5)(assoc)功能:在关联表中求出指定关键字的子表。示例:Command:(setqalst(new550)(old162)(new550)(old162)Command:(assocnewalst)(new550),6)(last)功能:求出表的最后一个元素。示例:Command:(last(AutoCAD)CADCommand:(last(Auto(CAD14)(CAD14)7)(car)功能:求出表的第一个元素。示例:Command:(car(Auto(CAD14)Auto8)(cdr)功能:求出表中去掉第一元素后的剩余表。示例:Command:(cdr(Auto(CAD14)hz)(CAD14)hz)若已知一点pt:(setqpt(list2.03.05.0),则可用三个函数分别得到该点的x、y、z分量值。Command:(carpt);返回点变量pt的x分量2.0。Command:(cadrpt);返回点变量pt的y分量3.0。Command:(caddrpt);返回点变量pt的z分量5.0。9)(nth)功能:求出表中第n个元素(表的第一个元素的序号为0)。示例:Command:(nth2(Auto(CAD14)hz)hz10)(reverse)功能:求出表的倒置表。示例:Command:(reverse(CAD14)hz)(hz(CAD14),11)(length)功能:求出表中顶层元素的个数。示例:Command:(length(Auto(CAD14)hz)312)(foreach)功能:将表中元素逐一赋给变量并求表达式的值。示例:Command:(foreachx(1.02.03.0)(printx)1.02.03.03.013)(mapcar)功能:将表中的各元素按函数的要求进行处理。示例:Command:(mapcar*(123)(234)(2612)14)(apply)功能:按指定函数对表进行处理。示例:Command:(apply*(123)615)(quote)或()功能:给出没有计算的表达式,也称为禁止求值函数。示例:Command:(quotea)ACommand:(setqa1)(setqa1),2.图形处理函数(1)交互输入函数(2)求值函数(3)AutoCAD命令函数,(1)交互输入函数1)(getangle)功能:用相对基点拖动指定点或直接输入的方法确定一个角度,该角度为相对角度,零度角总为x轴正向,角度增加的方向由系统变量ANGDIR定义。示例:Command:(setqa(getangleEnterangle:)Enterangle:901.5708Command:(setqa(getangle(00)Enterangle:)Enterangle:(拾取(0,1)点)1.57082)(getdist)功能:用相对基点拖动指定点或直接输入的方法确定一段距离。示例:Command:(setqd(getdistEnterdistance)Enterdistance:1010.0Command:(setqd(getdist(00)Enterdistance)Enterdistance:(拾取(2,2)点)2.828433)(getpoint)功能:用相对基点拖动指定点或直接输入的方法确定一点。示例:Command:(setqP(getpointEnterpoint)Enterpoint:(拾取(2,2)点)(2.02.00.0),4)(getint)功能:输入一个整数。示例:Command:(setqn(getintNumberofitems:)Numberofitems:555)(getreal)功能:输入一个实数。示例:Command:(setqx(getrealscalefactor:)scalefactor:2.52.56)(getstring)功能:输入一个字符串,当Cr为nil时,字符串不能含有空格。示例:Command:(setqs(getstringnilATTRIBUTENAME:)ATTRIBUTENAME:citycityCommand:(setqs(getstringTCITY:)CITY:BeigingChinaBeigingChina7)(getcorner)功能:输入与基点构成矩形对角线上的另一点。示例:Command:(setqs(getcorner(1010)Enterapoint:)Enterapoint:(拾取(8,6)点)(8.06.00.0),8)(getorient)功能:用相对基点拖动指定点或直接输入的方法确定一个角度,该角度为绝对角度,零度角和角度增加方向分别由ANGBASE和ANGDIR定义。示例:设ANGBASE=90(y轴正向为角度起始方向),ANGDIR=1(顺时针)Command:(setqa(getorientEnterangle:)Enterangle:450.7853989)(initget)功能:用规定的数据范围和规定的上述get*函数可接受的关键字来对get*函数的各种输入自动进行检查。其中位值为表中所列的整数或它们的和。,位值的含义,示例:自动检查输入项数是否为正整数。;Definenumberofitemsinarray(defunc:test()(setqn0)(while(=x0)(progn(setqy(+(*3x)6)(setqZ(+(*xx)(*x2)(2)(if)功能:可根据条件计算表达式。当不是nil时,就计算,否则就计算,并返回所计算的表达式值。当不存在且为nil时,将返回nil。它相当于其它高级语言中的IFTHENELSE语句,可实现选择分支结构。注意if函数要求表达式为一个变元,因此,在需要计算多个时,可使用progn函数来进行扩展,以实现块if分支选择结构,示例见progn函数。示例:(if(=x0)(setqy1)(setqy-1),(3)(cond()()()功能:按顺序计算每一个子表的,若不为nil,则计算子表中的所有,并返回最后一个的值。如果对所有的计算均为nil,则函数的返回值为nil。cond函数常用来构造多分支选择结构,以在不同的条件下,获得不同的值。示例:(cond(x0)(setqy1)(=x0)(setqy0)(x0)(setqy-1),(4)(repeat)功能:可按照的要求重复计算后面的一系列,并返回最后的计算结果。repeat函数常用来构造已知重复次数的迭代结构。示例:求s=12+22+32+42+1002(setqs0)(setqn1)(repeat100(setqs(+s(*nn)(setqn(+n1)(prints),(5)(while)功能:若不为nil,则计算后面的一系列,然后再判断,这样循环下去,直到为nil才终止,并返回最后一次计算的最后一个的值。如果一开始即为nil,则它们返回值也为nil。while函数常用来构造循环和多重循环结构。示例:求s=1*2*100(setqs1)(setqn1)(while(=n100)(setqs(*sn)(setqn(+n1)(prints),4.文件管理与I/O函数(1)(load)功能:用来装入一个类型为LSP的AutoLISP程序文件,并计算文件中的所有值。可以不带类型名.LSP,并可以包括驱动器名和目录名前缀。如果装入成功,load函数将返回文件中最后定义的函数名或表达式的值,否则返回文件名或出错信息。示例:装入构造常用三维形体的3D.LSP程序文件。Command:(load3D)c:3D返回该文件中最后定义的一个函数名,表示3d.lsp装入成功。,(2)(open)功能:用来打开一个ASCII文件,以便AutoLISP的I/O函数对其进行存取,它返回文件描述符,以供其它I/O函数使用,因此需要在打开文件的同时,将文件描述符赋给一个变量。可以包括盘符和目录名,并需要带上文件类型名。是用小写字母表示的r(表示读)或w(表示写或重写)或a(表示添加)。如果不存在,且为w或a将产生并打开一个新文件。如果不存在,且为r将返回nil。AutoLISP允许同时打开16个文件。示例:(setqf1(openold.TXTr)(setqf2(opennew.TXTw)(setqf3(openA:userCAD1.TXTa)注意:为添加数据而打开的文件,其文件尾部不能含有CTRL-C文件结束符(ASCII码值为26),否则,当对文件进行读操作时,会在文件结束符位置返回而使添加的数据不能读出。,(3)(close)功能:用来关闭一个用open函数打开的文件,其中是在打开文件时得到的。写入文件的内容,只有在文件关闭后,才能被保存起来。示例:(closef1)(4)(read-char)功能:用来从键盘输入缓冲区中或从表示的已打开文件中读入一个字符,并返回该字符的ASCII值。若没有指定文件描述符且键盘输入缓冲区为空,则(read-char)将等待用户键入一个字符或一些字符,并按回车键结束。read-char将按输入次序逐个返回各字符的ASCII值(调用一次返回一个)。示例:(read-charf)或(read-char)(read-char)从键盘输入ABC返回:65(read-char)返回:66(read-char)返回:67(read-char)Enter后返回ASC字符码10,(5)(read-line)功能:用来键盘输入缓冲区或从表示的已打开文件中,依序读取一行字符串,当读取结束后返回nil。同read-char一样,read-line也可以在键盘输入缓冲区为空时,等待用户输入一些数据(最后要用回车键结束),read-line最后将返回这个字符串。示例:(read-linef)或(read-line)若用户键入“CAD”并回车后,read-line将直接返回“CAD”字符串。(read字符串)功能:返回由一个字符串取得的第一个列表或元素。示例:(readAutolispDCL)返回:Autolisp(read(123)(40)返回:(123)(read1.23)返回:1.23(read1020)返回:10(6)(write-char)功能:用来将由所代表的字符写到屏幕上或由表示的已打开文件中,并返回该字符的ASCII值。示例:写字符C到屏幕或文件f中。(write-char67)(write-char67f),(7)(write-line)功能:用来将写到屏幕上或表示的打开文件中,并返回该字符串。示例:将字符串“AutoCADR14.0”写到屏幕或文件f中。(write-lineAutoCADR14.0)(write-lineAutoCADR14.0f)(8)(prompt)功能:用来在命令通讯区显示,并返回nil。示例:(promptPleasewaitLoading3Dobject.)(9)(prin1)功能:用来在屏幕当前光标位置打印,如果含有一个为写而打开的文件描述符,则将写入该文件。如果为字符串,则打印时字符串带双引号。如果含有控制字符,prin1将不做处理。打印后的光标停在最后一个字符的下一个位置上。示例:(prin1CAD);屏幕打印CAD(prin1OK!);屏幕打印“OK!”(prin1Linef);将“Line”写入文件(prin1CADnR14.0);屏幕打印“CADnR14.0”,(10)(print)功能:与prin1函数相比,print函数在打印之前要先换行,并在新行的第一列位置开始打印,打印后还需要附加一个空格来结束。其它功能与prin1函数相同。(11)(princ)功能:与prin1函数相比,princ函数不仅从屏幕当前光标位置开始打印,而且能处理控制字符,其它功能与prin1函数相同。示例:(princCADnR14.0);屏幕打印并换行CADR14.0,5.5函数定义及装载1.自定义函数AutoLISP程序是由一系列有序排列的标准表构成的。标准表的第一个元素是函数名,AutoLISP程序执行过程是通过调用AutoLISP函数来实现的。AutoLISP提供了用户自己定义函数的功能,这就为用户进行专业CAD的开发提供了有利条件。用户自定义函数的过程包括函数定义和函数调用两部分。,(1)定义用户函数DEFUN格式:(defun)为所定义的函数的名称,必须为符号原子。是所定义的函数的参数,它包括两部分,即形参和局部变量,两部分用“/”隔开。“/”与前后参数之间必须有空格。由于形参和局部变量均可缺少,故有四种情况:1)二者均有:(/)。2)只有形参:()。3)只有局部变量:(/)。4)二者均缺省为空表:()。为函数定义的内容,由一系列有序排列的标准表组成。如前所述,当用户函数用Load函数调入内存时,该用户函数并不执行,只是产生一个函数的定义,返回该函数名,只有调用该函数时才执行函数内容,并返回该函数的值。,(2)函数的调用用户函数的调用形式和系统内部函数调用一样,也是通过一个标准表,表的第一个元素为用户函数名,其它元素为实参。注意局部变量在函数调用时是不使用的。用户函数调用时用实参代替形参,且参数的位置及数目应严格对应。函数定义体中用到两种变量:全局变量和局部变量。全局变量:对于某一个函数,凡是没有出现在参数表中(无论在“/”之前或之后)的变量都是全局变量。(函数调用后,仍保留其当前的约束值。只要该变量不重新赋值或不退出AutoCAD,全局变量的值一直保存在内存中,且任何表达式均可使用它。)局部变量是指出现在参数表中的变量,它包括参数表中的形参和局部变量两部分,也就是说参数表中所列出的所有形参和局部变量都是该自定义函数的局部变量。(其约束值只局限于函数的内部,而在该函数外部是无效的)。,例:(defunjc(xy/ab)(setqa(+x15.0)b(+y10.0)(setqz(*a2.0b)jc函数中x、y、a、b为局部变量,z为全局变量。当调用该函数时:(jc812)x、y、a、b的当前约束值分别为8、12、23.0、22.0,在jc函数调用过程中是有效的。如果在调用前局部变量未被赋值,当jc函数调用时,其当前约束值为nil。而全局变量z的值在jc函数调用后约束值保持不变,可供其它表达式使用。,设置变量的原则:尽量设置为局部变量,最大限度地减少全局变量的数目。其原因有二:自定义函数很多时,若大量采用全局变量时,很容易相互冲突,即相同符号的变量约束值,后面要冲掉前面的。为防止变量发生冲突,尽可能把这些变量定义为局部变量,避免相互影响,不同函数中局部变量可同名而互不干涉。全局变量永久占用内存空间,而局部变量占用的是内存“栈”的临时空间,函数调用后释放。当程序很复杂,变量很多,若都使用全局变量,容易造成内存空间超界。,2.增加AutoCAD命令的函数可以用defun定义函数向AutoCAD增加新的命令。定义这些函数必须遵循下列规则:(1)函数必须具有形如“C:”的名字,字符使用大小写均可。“C:”作为名字的一部分必须存在,而“”则是用户选择的命令名。如果AutoCAD的内部命令已用UNDEFINE命令解除定义,“C:”函数可以和内部命令同名。这里的“C:”是表示命令行函数的前缀,并非指磁盘驱动器。(2)必须用空变元表来定义函数,但允许有局部变量符号。下面定义的是一个用多义线画正方形的函数:(defunC:PSQUARE(/pt1pt2pt3pt4len)(setqpt1(getpointLowerleftcorner:)(setqlen(getdistpt1Lengthofoneside:)(setqpt2(polarpt10.0len)(setqpt3(polarpt2(/pi2.0)len)(setqpt4(polarpt3pilen)(commandplinept1pt2pt3pt4C)像这样的定义函数,在用load函数装载(loadPSQUARE)后,就可以在Command:提示行只输入函数名的“PSQUARE”部分。,AutoLISP文件装入内存后运行,根据文件内容不同分为三种情况:(1)文件中无用户自定义函数时,系统装入文件并自动执行程序,返回最后一个标准表的求值结果。例如:(*90(/pi180.0)返回1.5708(2)文件只由自定义函数组成,文件装入后返回最后一个用户函数名,自定义函数的执行,必须通过调用函数来实现。例如定义一个将角度转换为弧度的函数(文件名为dtor.lsp):(defundtor(a);自定义函数名为dtor,a为参数,单位为度(setqa(*a(/pi180.0);将角
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 水平三跑《接力跑》教学设计08
- 2025年火电运行值班员中级面试实战演练与答案解析
- 电力基本知识培训课件教学
- 2025年医生求职面试技巧与模拟题集锦
- 电力业务知识培训课件
- 2025年特岗教师招聘面试实战模拟题集萃小学英语教育心理学等
- 2025年人力资源和社会保障局公务员招录考试指南
- 2025年售前技术支持工程师中级面试技巧与模拟题
- 电仪岗位安全知识培训课件
- 血液透析护理服务规范
- 2024年陕西省中考物理试卷真题(含答案)
- DZ∕T0312-2018 非金属矿行业绿色矿山建设规范(正式版)
- (高清版)JTGT 3832-01-2022 公路桥梁钢结构工程预算定额
- 基于学习科学的小初衔接英语教学新路径
- 外科学 泌尿系统损伤
- 齐鲁名家 谈方论药智慧树知到期末考试答案2024年
- 八年级英语下学期阅读理解20篇
- (高清版)DZT 0227-2010 地质岩心钻探规程
- 专家委员会组建方案
- 柠檬酸在提高尿素呼气试验诊断幽门螺杆菌感染准确性中作用护理课件
- 急诊科急诊超声检查在腹部外伤中的应用培训
评论
0/150
提交评论