中科大CAD技术应用课件05 AutoCAD的二次开发-Autolisp程序设计语言_第1页
中科大CAD技术应用课件05 AutoCAD的二次开发-Autolisp程序设计语言_第2页
中科大CAD技术应用课件05 AutoCAD的二次开发-Autolisp程序设计语言_第3页
中科大CAD技术应用课件05 AutoCAD的二次开发-Autolisp程序设计语言_第4页
中科大CAD技术应用课件05 AutoCAD的二次开发-Autolisp程序设计语言_第5页
已阅读5页,还剩115页未读 继续免费阅读

下载本文档

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

文档简介

Lisp(ListProcessingLanguage)为一种表处理语言,是人工智能程序设计的有力工具之一。Autolisp为嵌套在Autocad内部的lisp语言的一个子集,它与Autocad提供的功能有机结合,成为Autocad系统二次开发的重要工具之一,最典型的应用就是参数化绘图。一、概述一、概述Autolisp的运行方式类似于Basic为解释运行方式。

现在Autocad又增加了ADS系统,这是一个以C语言为基础的二次开发环境,Autolisp也可以作为学习ADS系统的参考及基础。1.符号(Symbol)符号为一标识符用于标识某一对象,可用除了“(”,“)”,“·”,“;”,“`”以外任何可打印字符来定义,符号名中的字符大小写等效,如:B,B12*AC12A等均为合法符号名。“()”;用于定义表;“·”用于定义点对;“;”作为注释的标志;“`”为函数quote的简写形式。二、Autolisp的数据类型。二、Autolisp的数据类型。注意:①符号名一般长度不超过6个字符。(理由以后介绍)②任何符号具有两个内容:符号名:标识某一个对象。符号的约束:把一个值赋给符号就说符号被约束到该值。用户通过符号名访问该值,由值的类型来决定数据类型,符号本身无类型,相当于一个容器。给符号赋值通过函数Setq进行,如(Setqx25)、(Setqx“25”)、(Setqx25.0)。若一个符号没有被赋值,其值缺省为nil(空)它不占内存单元。③查看符号的当前值。在系统提示符下进行:command:!符号名④定义符号时,符号名不能与系统保留字重名。2.字符串(STR):由双引号括起来的ASCⅡ码字符序列称为字符串,长度不超过100个字符,如:“ABCDE”字符还可用通用格式表示:\nnnn为某8进制数。nnn为一三位的8进制数,表示某一字符的ASCⅡ码。如:“ABCDE”⇔“\101\102\103\104\105”下面是若干非图形控制字符的转义及通用表示方法:ESC:\e⇒\033换行LF:\n⇒\012回车CR:\r⇒\015制表HT:\t⇒\011反斜杠本身:\⇒\\3.整型数(INT)由正负号及数字0~9组成的32位带符号的数,取值范围–2,147,483,648—2,147,483,647。但Autolisp与Autocad之间传递数据时,被限制在16带符号的整数范围内,即:

–32768~32767之间。4.实数(REAL)为双精度浮点表示,有效数字为14位,对于小数前导0必不可少,如:0.4不能写成.4。可用科学计数法表示数,如0.168E7注意:以上四种数据又叫原子(atom)。5.表及点对(List)

表为放在一对相匹配的左右括号中的一个或多个元素的有序集合,表中元素可以是任何原子或表,各元素之间以空格分隔。

从以上定义可以看出表采用的是递归定义,也就是说表可以嵌套,对于嵌套表,从外层到里层依次称为0层,1层…,()称为空表,也叫定表。

原子与表可以组成各种符号表达式,也称为S-表达式。

表的种类:(1)基本类型:标准表:用于Autolisp函数调用,第一个元素必为函数名,表中其余元素为该函数的参数,如(setgx25)。引用表:作为数据处理用,表中第一个元素不是函数名,如(2.5,3.6)。(2)点对(dottedpair):只有两个元素的表,两元素之间为一个圆点“·”,圆点“·”与元素之间必须以空格分隔。如:(A·B);(X·(B·(Y·Z)))均为合法点对,显然点对也可以多生嵌套。点对常用于构造联结表。6.文件描述符(FILE)文件描述符是Autolisp函数Open以某种方式打开文件以后,返回的代表该文件的一个参数,相当于一个指句该文件的指针,以后对该文件的存取均通过它进行。如:(Setqf1(open“mydata·txt”“r”))此例打开mydata·txt文件,供读取数据,并把文件描述符赋值给f1,f1的可能值为:<file:#36164>。7.子程序(SUBR)Autolisp的函数均为内部子程序,子程序可用函数defun定义,而外部子程序为ADS应用程序。8.Autocad的选择集(PICKSET)选择集是待操作实体的有序集合(selectionsets)利用选择集构造函数SSGET在程序中构造,并由选择集操作函数进行各种操作。如:(SetqS1(SSget“L”))把刚生成的实体放入实体集S1中。9.AutoCAD的实体名(ENAME)赋与图形中实体的数字标号,如LINE等,实质上是实体的类型名,作为数据类型的实体名为一个指针,指向实体在当前图形数据库的存放位置,以便于被Autolisp函数调用而进行各种处理。

如:(SetqEL(entlast))把刚产生的实体名赋给符号EL,其值可能为:<Entityname:60000066>

内存单元均有地址,在该地址中存放数据,一般通过地址访问数据,为直接访问方式。25如:100X三、Autolisp数据存储结构三、Autolisp数据存储结构如一个内存单元装有两部分内容:某一数据的值与另一个内存单元的地址,则这种内存单元称为节点。(Node)如:5025100内存单元也可以存放另一内存单元的地址,也叫指针或链。100如:200PX我们也可以通过指针来访问其所指的地址中的值,为间接访问方式。Autolisp程序的内存由一系列节点组成,每个节点长度为12个字节,可表示为:例子:定义(setqx25)将需要三个节点。地址值10050setq100200200x25前面所提符号名最好不要超过6个字符就因为一个节点中存放数据的部分只分配6个字节。如符号名超过6个字节,将占用二个以上节点,大大浪费存贮空间。1.Autolisp程序没有语句的概念,S一表达式相当于其它语言中的语句。2.Autolisp程序的三要素:四、Autolisp程序结构与求值过程。四、Autolisp程序结构与求值过程。

数据:操作对象,如5、“ABC”、(2.53.6)等。

表达式:完成求值过程,通过S一表达式完成,如(+ab)

函数:实现某种功能,完成某种操作,由S一表达式调用函数实现,如(

cd)简而言之,Autolisp程序的执行过程就是由S一表达式调用函数及其参数进行求值的过程。3.S一表达式采用前缀表示法,而不是通常的中缀表示法,如:(setqx(

(+AB)C))

⇒x=(A+B)

C4.S一表达式的一般形式为:(函数名[<参数1>][<参数2>]…[<参数3>])对表中参数求值有以下几种情况:①参数为整数、实型数、字符串及特殊原子T、nil时,其值为它们本身,对特殊原子PI其值为3.14159。②参数若为符号原子,其求值结果为符号当前的约束值。③若参数为引用表,则必须打上禁止求值的单引号‵此时求值结果为引用表本身。如(Command“line”‘(2.53.6)’(4.87.2)“”)5.运算的优先级别是通过子表来实现的,即求值总是从最里层的表开始,其结果返回作为它父表的参数,这样依次向外层求值,最后以顶层表(0层)的求值结果作为返回结果。6.Autolisp程序的注释以“;”作为开始标志,并在一行行尾结束,注释可以放在程序任何地方,但若位于表达式中部则注释首尾均要用分号分隔。1.程序的编辑Autolisp程序为ASCⅡ码文件,扩展名为~·LSP,可利用任一文本编辑工具进行编写,如DOS环境下的Edit,Windows下的word,WPS等,但文件格式必须选文本格式。五、编辑、装入和运行Autolisp程序五、编辑、装入和运行Autolisp程序2.程序的装入利用Autolisp内部函数load格式为:Command:(load“文件名”)注意:文件名可不带后缀(扩展名)但可含路径。Command:(Load“A:/MYLSP/EXAP”)Command:(Load“A:\\MYLSP\\EXAP”)反斜杠有特殊含义如:EWXAP·LSP程序存在A盘\MYLSP目录下,装入时:3.程序的运行程序必须先装入,再运行,具体有两种情况:(1)若程序为系统定义的库函数,则由于系统已自动装入可直接运行。(2)若程序为用户自定义的函数,在调用load函数装入后,再调用函数以执行它们。设用户自定义函数名为fun有一个参数,在装入后,按以下形式调用;Command:(fun5)函数实参下面介绍两个Autolisp程序的例子及装入、运行过程:例1:exam1·lsp(defunplus(xy)(+(

xy)x))(setqa2.0)(setqb4.0)(plusab)若在系统提示符下运行load函数将自动执行以上程序Command:CloadC:\\Autocad\\exam1”)例2:对下面多值函数求值。f(x)=1x>02x=00x<0(defunfun(x)(cond((>x0)1)((>x0)2)((>x0)0)exam2·lsp):cond):defanCommand:(load“fun”)Command:(funs)1

→结果函数调用一般格式:(函数名[<参数1>][<参数2>][<参数n>])几点约定:

<

>必选项,不可缺省

[

]任选项

省略号,表示与前面相同的参数,数目不限。六、Autolisp基本函数。六、Autolisp基本函数。学习时注意:

不同函数要求的参数个数及类型。

不同函数的功能及求值、情况。

不同函数的返回值及其类型。1.数值计算和标准函数。注意:①数值计算中,如操作数均为整型,则结果也是整型,但只要操作数中有一个为实型则结果为实型。如:(/72)→3(+(/113)3.0)→6.0②Autolisp中所有角度均以弧度表示。ATAN函数的一般格式为(atan<数1>[<数2>]),如果<数2>缺省,则如表中所示返回以弧度表示的<数1>的反正切值,若提供了<数2>,则返回<数1>/<数2>的反正切值。2.赋值与转换函数函数格式功能示例返回值(setq<符号><表达式>)(setq<符号><表达式>)(fix<数>)(float<数>)(atoi<字符串>)(atof<字符串>)(ascii<字符串>)(read<字符串>)(chr<字符串>)(itoa<数>)(ftoa<数>)将表达式的值赋给符号将表达式的值赋给符号的值将数转换成整型数将数转换成实型数字符串转换成整型数字符串转成实型数第一字符转成ASCII码将字符串转换成表或原子将数转为对应ASCII字符整型数据转换成字符串实型数据转换成字符串(setqa5)(set’a5)(fix3.7)(float5)(atoi“127”)(atof“12.5”)(ascii“C”)(read“YES”)(chr67)5535.00000012712.50000067YES“C”下面讨论setq、set、read函数的功能。setq为多重赋值函数

(setqa10b(*a4)c“hello”)②set函数只有两个参数,给符号的值赋值。如:(setqx`y)(setx5)→

给x的值y赋值5。所以,Command:!y→5而Command:!x→y

③read函数的功能是把一个字符串变为原子或表,常与set函数连用,如:(read“AA”)→返回值:原子符号AA(set(read“AA”)12)→给原子符号AA赋值12。④补充两个函数

(itoa整数):把整数转换成字符串。

(ftoa实数):把实数转换成字符串。如(itoa25)→返回值为“25”(ftoa3.6)→返回值为“3.6”3.求值函数和禁止求值函数两次求值函数EVAL(eval<表达式>)该函数的功能:对<表达式>两次求值,第一次对表达式求值,第二次对表达式的值求值,返回第二次求值结果。如:(setqa'(/82))(setqb(evala))→b的值为4(setqx'yy'c)(evalx)→返回值为c(原子符号)

禁止值函数quote(quote<表达式>)⇒'<表达式>该函数功能为禁止对其参数<表达式>求值,使<表达式>本身作为函数参数,如'(2.53.6)表示一个二维点的坐标。如:(setqp1'(2.53.6))p1的值为一个表,表示空间一点。4.关系与逻辑函数。函数格式功能示例返回值(=<原子><原子>)(/=<原子><原子>)(<<原子><原子>)(><原子><原子>)(logand<数><数>

)(~<数>)等于关系函数不等于关系函数小于关系函数大于关系函数小于或等于关系函数小于或等于关系了函数求表达式的逻辑与求逻辑或求表达式的逻辑非位方式逻辑与位方式逻辑或(=44.0)(/=777)(<1020)(>5757)(>=12017)(<=299)(andab);a,b不为nil(logior93)(~3)TnilTnil(>=<原子><原子>)(<=<原子><原子>)(and<表达式>

)(or<表达式>

)(not<表达式>

)(logior<数><数>

)(lsh<数><位数>

)位方式逻辑非按位方式<位数>次位数(orab);a,b为nil(notc);c为nil(logand7153)(lsh21)TTTnilT311-44注意:关系与逻辑函数的返回值只有两个:T(真)nil(假)5.字符处理与表处理函数函数格式功能示例返回值(strcat<串1><串2>)(strlen<字符串>)(substr<串><起点>[<长度>])(list<表达式>)(nth<n><表>)将<串1>,<串2>连接成一个串求<字符串>的长度从<串>中取出某一子串表达式串连在一起组成表将表放在一起组成新表将新元素加入<表>成新表返回表中最后一个元素返回表中第一个元素返回除第一个元素外剩下的表返回表中第n个元素使表中顶层元素倒排(strcat“a”“t”)(strlen“actor”)(substr“abcd”22)(list’(ab)’(cd))(append’(ab)’(cd))(cons’(ab)’(cd))(car’(abcd))(reverse’(a(bc)d))“at”5“bc”((AB)(CD))(append<表达式>)(cons<新首元素><表>)(last<表>)(car<表>)(cdr<表>)(reverse<表>)(cdr’(abcd))(nth3’(abcd))(last’(abcd))(ABCD)((AB)CD)DA(BCD)D(D(BC)A)注意:①CAR和CDR函数可以嵌套使用形成CAAR、CDDR等用于分离表,最多可达4层。如:(CADR'(abc))⇒(CAR(CDR

'(abc))→返回b如:(CADADR'(1(23456)78))→返回3(CADDR'(1(23456)78))→返回7②函数(subst<新项><老项><表>)功能在<表>中搜寻老项,并用<新项>替代老项。如:(setqtab'(ab(cd)))(subst'mm'btab)→返回(amm(cd))(subst'mm'ntab)→返回(ab(cd))因为表中无'n项,所以不替换,返回原表。③(assoc<项><表>)以<项>为关键元素搜寻<表>,返回相应的<表>中的项,若表中无关键元素返回nil,设有tab表如下表:((nameapple)(number5)(weight2)(price4))如执行(assoc'pricetab)返回(price4)(assoc'widthtab)返回nil利用ASSOC和SUBST两个函数可以修改表的结构。例如:(setqwhich'((firstapple)(midpear)(lastgrape)))(setqold(assoc'midwhich))返回(midpear);(setqnew'(midbanana))返回(midbanana);(substnewoldwhich)返回((firstapple)(midbanana)(lastgrape));七、Autolisp的输入输出函数。1.Get族输入函数:以交互方式输入;一般不单独使用,多与setq函数连用。基本格式:(getxxx[<提示>])(1)数值输入函数

整型数输入函数:(getint[<提示>])(setqd(getint“Enteranintegernumber:”))

实型数输入函数:(getreal[<提示>])

距离值输入函数:(getdist[<基点>][<提示>])(setqx(getdist“请输入长度值:”))(setqy(getdist'(2.01.5)“请输入另一点坐标”))若给定<基点>则必须输入另一点坐标,函数返回两点之间距离。(2)点输入函数:(getpoint[<基点>][<提示>])

注意:不是画一个点,而只是输入一个点的坐标,返回值为一个表。例:(setqp1(getpoint“Enterabasepoint:”))(setqp2(getpoint'(5.4)“Enterapoint:”))如:给出基点‘(54),要求用户输入一点坐标,系统会从基点画一条直到当前指定点的橡皮带线,但返回值为以当前UCS表示的点即一个表,如输入(12,24)→返回仍为(1224)(3)角点输入函数:(Getcorner<基点>[<提示>])例:(setqp2(Getcorner‘(100200)“Enterothercornerpoint:”))如输入250,300返回P2值为(250,300)即矩形对角点坐标,且当用户选择角点时,屏幕自动画出一矩形。(4)角度输入函数:(Getangle[<基点>][<提示>]):输入角度,返回弧角值。例:(setqA1(getangle))直接输入角度,返回弧度值赋给A1。(setqA2(getangle‘(100200)“Enterotherpoint:”))要求输入另一点坐标,返回基点与第二点连线与x轴夹角。(setqA3(getangle“Entertwopoint:”))要求输入两点,返回这两点与x轴夹角。(5)输入控制函数(initget[<位值>][<关键字字符串>])为一个输入控制函数,控制紧跟其后那个GET类函数的输入数据的范围。其中<位值>是一个整形数,其控制作用如下:1:不接受空输入(直接回车或按空格键);2:不接受零值;4:不接受负值;8:不检查图形范围;16:返回三维点而不是二维点;32:用虚线画拉伸线或拉伸框。<位值>可以选其中一项,也可以是将几个项加在一起。例如:(initget(+124))或(initget7)<关键字字符串>是多个关键字的集合,关键字之间用空格隔开。若用户输入的字符串与<关键字字符串>中设置的某个字符串相匹配时GET族函数就返回该字符串。例如:(initget4“YesNo”)(setqd(getint“\nEnteranintegerorY/N:”))(6)字符串输入函数:(getstring[<选项>][<提示>])例:(setqC1(getstringT“Enterstring”))

此时输入的字符串中可以包含空格。其中<选项>为T或nil,nil可以缺省。若选项为T,则输入的字符串中可以包含空格;若选项为nil或缺省,则输入的字符串中不可以包含空格。(setqC2(getstring“Enterstring”))

此时输入的字符串不能包含空格,输入中空格自动中止,调试程序中常插入(getstring)起暂停作用。(7)关键字输入函数(Getkword<提示>)

与initget函数配合使用,对用户输入值进行限制。例:(initget“LargeSmall”)(Setqk(getkword“whatdoyouwant(L/S)”))只允许输入“L”或“S”或Large,Small赋给K。2.文件管理与文件输入函数函数格式功能示例返回值(open<文件名><方式>)(close<文件描述符>)(read—char<文件描述符>)(read—line<文件描述符>)以指定方式打开文件关闭已打开文件从打开的文件中读入一字符从打开的文件中读入一行字符(open“f.txt”“r”)(closefl)(read—charfl)(read—linefl)文件描述符该字符的ASCII码字符串注意:Read–lineRead–char函数读入的数据,不管原数据类型是什么均转化为字符串。3.文件输出和屏幕输出函数函数格式示例返回值(princ<表达式>[<文件描述符>])(prinl<表达式>[<文件描述符>])(write—char<数>[<文件描述符>])(write—line<字符串>[<文件描述符>])(princ“Hello”f)(prinl“Hello”f)(print“Hello”f)(write-char65f)Hello,写入f(print<表达式>[<文件描述符>])(prompt<信息>)(terpri)(write-line“Hello”f)(prompt“Hello”)“Hello”,不换行,写入f“Hello”,换行,写入f65,字符A写入fHello,换行,写入fHello,可在双屏幕上显示回车换行信号①PRINC输出字符串时,不输出字符串的定界符双引号,且能输出控制字符。②PRIN1与PRINC基本相同,但输出字符串时包括字符串的定界符双引号,且不能输出控制字符。③PRINT与PRIN1基本相同,但输出前先回车换行。Autolisp可以通过调用Autocad命令实现自动绘图。1.Command函数(Command<命令名><参数>

)八、Autolisp绘图功能八、Autolisp绘图功能使用中注意:(1)只有熟悉Autocad命令的执行过程及参数选择,才能正确使用该函数,例如:画图弧顺时针逆时针问题。(2)<命令名><参数>项都要用字符串形式表示,数字常量可以写成字符串,也可写成数字本身。如“5”或5。(3)点常量可以引用表形式‘(2.53.6)或字符串形式“2.53.6”。(4)Command函数中如参数为空串“”等效于按一次空格键,对line、pline等要求参数不确定的命令,在结束命令调用时必须加“”。(Command)不带任何参数相当于回车。(6)GET类函数不能作为Command函数的参数。(5)一个Command函数中可以调用多条命令,反之一条Autocad命令可由多个Command函数完成。例如:(command“line”p1p2“”“circle”'(1.01.0)3)例1:(Command“pline”“3.3”“@1<10”“a”“r”“0.5”“a”“-225”“10”“L”“@1<10”“”)举例:Directionofchord(10)例2:(Command“pline”“1.1”“w”“2”“”“a”“ce”“2.1”“a”“180”“”)2.绘图求值函数在绘图过程中计算点的位置或求一些几何参数如长度、距离等。(1)求极坐标函数polar(polar<点><角度><距离>)一般不单独使用,返回一个点,即一个表,其中<角度>用弧度表示。例:(setqp1(polar(105)pi10))(2)求相对角度函数ANGLE(angle<点1><点2>)功能:求<点1><点2>连线与当前UCSx轴正向的夹角,该夹角用弧度表示。(setqa1(angle'(00)'(11)))a1→0.785398(3)求两点距离的函数Distance(distance<点1><点2>)(setqS(distance'(22)'(210)))S→8(inters<端点1><端点2><端点3><端点4>[<任选项>])其中:<端点>1~4为确定两直线,如相交返回交点坐标,否则返回nil。(4)求两直线交点坐标的函数INTERS<任选项>:可取T或nil,若为T或缺省则不求两直线段延长线的交点,若取nil则可返回两线段延长线的交点。一般也不单独用。(5)目标捕捉函数Osnap(Osnap<点><目标捕捉方式>)<点>为目标捕捉靶区上的位置。<目标捕捉方式>与Autocad中Osnap命令中相同,如END,NEA等。3.其它绘图相关函数①屏幕转换函数(graphscr):转换为图形屏幕;(textscr):转换为文本屏幕。②清除图形和重画图形函数(grclear):清除当前屏幕图形;(redraw):重画当前屏幕图形。③获取和设置系统变量函数(getvar<系统变量名>)(setvar<系统变量名><值>)1.分支结构(选择结构)(1)if函数:(两分支)(if<测试表达式><表达式1>[<表达式2>])执行过程:先计算测试表达式,若为真,计算<表达式1>返回,若为nil且存在<表达式2>则计算<表达式2>返回,如不存在<表达式2>,返回。九、Autolisp控制结构九、Autolisp控制结构如:(if(=(+53)8)“YES”“NO”)→YES(if(and(>=d10)(<=d18))(setqc3))注意:只要<测试表达式>为非nil即为真。

(if(setqb4)3514)→35为合法(2)cond函数(多分支)(cond(<测试表达式1><结果1>)(<测试表达式2><结果2>)

(<测试表达式n><结果n>))例:编制计算下面分段函数的AutoLISP程序。x<-1-1≤x≤6x>6(defuns(x)(cond((<x-1)x)((and(≥x-1)(≤x6))(sqrt(+1(*xx)))((>x6)(expt2x)));cond);defun(3)顺序控制函数progn(progn<表达式>

)功能;顺序求每一个表达式之值,返回最后一个表达式的值作为结果,可在只能有一个表达式的地方,通过它求多个表达式之值。往往只着重计算过程,而不在意计算返回的结果。常与if函数连用。(if(=k1)(progn(setqa(+k20))(setqb(-k10))):progn):if(4)其它测试函数函数格式功能示例返回值(zerop<项>)(minusp<项>)(numberp<项>)(type<项>)测试<项>是否为零(zerop3)(minusp-3)(numberp3)(type3.5)nil(atom<项>)(listp<项>)(mull<项>)测试<项>是否为负测试<项>是否为数测试<项>的数据类型测试<项>是否为原子测试<项>是否为表及函数测试<项>的值是否为nil(atom'd)(listp'(ab))(nullnil)TTTTTREAL2.循环结构:两大类:循环次数未知循环次数已知(1)White循环(white<测试表达式>表达式

)首先求<测试表达式>之值,若不为nil计算后面的表达式,如此循环。循环体(2)Repeat函数(repeat<次数><表达式>

)循环体按指定次数对循环体<表达式>

求值,以最后一次循环的最后一个<表达式>的求值结果为返回值。(3)Foreach函数(foreach<符号原子><表><标准表>

)循环体把表中每一个顶层元素赋给<符号原子>,然后对循环体中的每一个标准表求值,并以最后一次循环中最后一个标准表的求值为返回值。(foreachcenter'((102010)(15512)(304016))(setqp0(list(carcenter)(cadrcenter)))(setqr(cadrcenter))(command“circle”p0r));foreach例:已知三个圆的圆心为P1(1020),P2(155),P3(3040),半径为R1=10,R2=12,R3=16,用AutoLISP程序绘制这三个圆。1.Defun函数:用于定义自定义函数。(defun<自定义函数名>([<参数表>])<表达式1><表达式2>

<表达式n>);defun十、自定义函数与Autocad新命令十、自定义函数与Autocad新命令([<参数表>])格式:([<形参1>][<形参2>][/<引用变量1><引用变量2>]

可以缺省形参与引用变量,但须保留空表()。

自定义函数必须先装入系统,才能运行。2.局部变量与全局变量出现在参数表中的变量:形参系列,引用变量系列。其作用范围只局限于本函数内部,而在函数外部为无效,存放在栈(stack)中。(2)全局变量凡是没有出现在函数参数表中的变量均为全局变量,只要不退出Autocad系统,就一直保存在内存中,可为任何函数调用,存放在内存的堆(heap)中。(1)局部变量:3.定义Autocad新命令的函数(defunc:<命令名>([/<引用变量1><引用变量2>

])<标准表1><标准表2>

<标准表n>

):defun注意:①C为命令名前缀,不是磁盘名,且命令名后参数表中不允许有形式参数,但允许有引用变量系列或为空表。②定义后,必须先装入再运行,但以Autocad命令形式调用。4.函数的递归定义在调用一个函数的过程中又出现直接或间接调用函数本身,称为函数的递归定义(或递归调用)。在递归调用中,函数变量的取值呈规律性变化,称之为递归变量,经过有限次递归以后,递归变量的值应变得可以满足初值的情况,也称递归出口条件。例:求阶乘的函数n=0n≠0(defunfa(n)(cond((zeropn)1)(T(*n(fa(-n1)))));cond);defun下面讨论一个编程例子:求100~999999之间对称完全平方数。或某一上限(defundoit(/xkll0l1l2c)(setgx(getreal“清输入一个上限”))(setqk10)(while(<=k(sqrtx))(setqc(itoa(*kk))l(strlenc)l1(1+l)l2(/l2)i1l0“T”);setq(white(and(<=il2)(=l0“T”))(if(/=(substrci1)(substrc(-l1i)1))(setql0“f”));if(setqi(1+i)));while(第二个)(if(=l0“T”)(Printc)):if(setqk(1+k))):while第一个):defun1.基本概念(1)实体:(Entity)实体类型名意义生成实体有关命令POINTLINECIRCLEARCTRACESOLID点直线圆圆弧轨迹实体POINTLINECIRCLEARCTRACESOLIDTEXTSHAPE正文形TEXTSHAPE十一、图形数据库编辑函数及应用十一、图形数据库编辑函数及应用实体类型名意义生成实体有关命令3DLINE3DFACEDIMENSIONPOLYLINE三维直线三维平面尺寸标注多义线VERTEXSEQENDINSERTATTDEFATTRIB多义线顶点子图素插入块属性定义块属性3DLINE3DFACEDIM,DIM1PLINE,3DPOLY,POLYGON,ELLIPSE,3DMESH,RULESURF,TABSURF,REVSURF,EDGSURF,DOUGHNUT(或DONUT)同上同上,INSERT,MINSERTINSERT,MINSERT,HATCHATTDEFINSERT注意:除简单实体以外还有一些复杂实体,复杂实体由一个主实体和若干子实体组成。(2)实体名和标号(EntitynameandHandles)

实体名实际上是一个指针,随图形的生成,编辑,实体名编码是不断变化的。

实体标号是实体句柄,用于标识图形数据库中的实体,是一个实体固定不变的标识符。(3)实体选择集为实体的有序集合。2.选择集构造函数SSGET有两种调用方式:(1)直接从图形屏幕上选择实体

其中<方式>:为一字符串指明实体选择方式可以是“W”(window)“C”(crossing)“L”(last)“P”(previous)等。<点1>,<点2>与<方式>有关,也可缺省如选“L”;(ssget[<方式>][<点1>][<点2>])

若缺省<方式>且指定一个点,则表示选定所在实体。

若缺省所有参数,则表示直接通过提示“Seleetobjects:”选择实体(以交互方式)(2)ssget过滤器

也可以设置一个过滤器在图形数据库中搜寻符合某些条件的实体。

(ssget“X”[<过滤表>])其中X为固定参数表明设置过滤器进行搜寻。<过滤表>:设定过滤条件,通常采用DXF文件中组代码与组值的概念定义,以点对方式表示过滤条件。具体格式:((组代码1·组值1)(组代码2·组值2)

组代码含义0267838396266210实体类型名引用块(INSERT)的块名线型名文本(TEXT)、属性和属性定义的字型名图层名Z向高度(实型数)延伸厚度(实型数)颜色号(0=BYBLOCK,256=BYLAYER)被引用的属性块(INSERT)的跟随标志3D延伸向量(三维实型数表)<过滤表>常用组代码例:构造CF层上实体组成的选择集:

(ssget“X”'((8·“CF”))))例:构成一个由OSCAR图层上

温馨提示

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

最新文档

评论

0/150

提交评论