AutoCAD-AutoLISP基本函数.ppt

上传人:sh****n 文档编号:3263992 上传时间:2019-12-10 格式:PPT 页数:65 大小:301.50KB
返回 下载 相关 举报
AutoCAD-AutoLISP基本函数.ppt_第1页
第1页 / 共65页
AutoCAD-AutoLISP基本函数.ppt_第2页
第2页 / 共65页
AutoCAD-AutoLISP基本函数.ppt_第3页
第3页 / 共65页
点击查看更多>>
资源描述
AutoCAD高级培训教程之二AutoCAD应用开发,第三部分AutoLISP基本函数,3AutoLISP基本函数,3.1赋值函数3.2数据类型转换函数3.3数学几何函数3.4关系逻辑函数3.5条件分支函数3.6循环函数3.7表处理函数3.8字符串处理函数3.9交互式数据输入函数3.10打印输出函数3.11Command函数3.12存取AutoCAD系统变量值函数3.13自定义函数和子程序3.14参数化编程实例,AutoLISP提供了大量的函数,每个函数都实现特定的功能。通过调用AutoLISP函数,并对这些函数做适当的组合和编排,就可以编写一个AutoLISP程序,来完成用户的特定的操作。AutoLISP语言是函数的语言,AutoLISP程序是由函数语句组成的。本节将介绍最常用的AutoLISP函数,以便使读者比较快地学习和理解AutoLISP程序设计。详细而全面的函数说明可以参见AutoLISP帮助。,3.1赋值函数,格式:(setq)详见5.2.4。,3.2数据类型转换函数,(floatx)整型转换为实型,x为整型数,返回x的实型数。例如:(float3)返回3.0。(itoax)整型转换为字符串,x为整型数,把x转化为字符串。例如:(itoa53)返回53。(fixx)实型转换为整型,x为实型或整型数,返回x的整型数。取整过程是直接截断x的小数部分,而非四舍五入。例如:(fix3.7)返回3。(rtosnumbermodeprecision)实型格式化函数rtos,该函数把实型数number(也可为整型数)按照指定的模式mode和精度precision转换成字符串。中括号“”内的参数可以不写。参数number可以是整型或实型常量、变量或表达式。,参数mode为线性单位的格式编码,与AutoCAD的线性格式相对应,具体对应关系如表5-4所示。如果没有指定mode的值,将采用系统变量LUNITS的值来指定当前的线性单位格式。表5-4rtos函数中mode的值与线性单位格式的对应关系,参数precision指定数值的显示精度,对于表5-4中前3种格式,该参数用来指定小数点后的小数位数。对于后两种格式,用来设定最小分数的分母。如果没有指定precision的值,将采用系统变量LUPREC来设定当前精度的值。例如:在命令行中输入命令:(setqx17.5)17.5命令:(setqfmtval(rtosx14)1.7500E+01命令:(setqfmtval(rtosx22)17.50命令:(setqfmtval(rtosx32)1-5.5命令:(setqfmtval(rtosx42)1-51/2命令:(setqfmtval(rtosx52)171/2(angtosanglemodeprecision),(angtosanglemodeprecision)角度格式化函数angtos,该函数把以弧度为单位的角度数值angle按照指定的角度格式mode和精度precision转换成字符串,角度值angle的大小在0,2之间。中括号“”内的参数可以不写。参数angle可以是整型或实型常量、变量或表达式。参数mode为角度格式编码,对应的系统变量为ANNITS。Mode的取值为:0十进制角度,1度/分/秒,2百分度,3弧度,4勘测单位角度。参数precision指定转换后小数点之后的小数位数,对应系统变量为AUPREC。例如:在命令行中输入命令:(angtos0.78539804)45.0000命令:(angtos-0.78539804)315.0000命令:(angtos-0.7853984)S45dE,(atoistring)字符串转换为整型,string为字符串。例如:(atoi80)返回80。(atofstring)字符串转换为实型,string为字符串。例如:(atof-1.25)返回-1.25。,3.3数学几何函数,(1)数学函数(+x1x2)加运算,求x1+x2+之和。(-x1x2)减运算,求x1-x2-之差。(*x1x2)乘运算,求x1*x2*之积。(/x1x2)除运算,求x1/x2/之商。(1+x)增量运算,返回x+1。(1-x)减量运算,返回x-1。(absx)绝对值函数,求x的绝对值。(sqrtx)平方根函数,求x的平方根。(exptxp)任意次方函数,求xp的值。,(expp)e的任意次方函数,求ep的值。(logx)自然对数函数,求ln(x)的值。(sinx)正弦函数,求sin(x)的值,其中x为弧度。(cosx)余弦函数,求cos(x)的值,其中x为弧度。(atanxy)反正切函数,求atan(x)或atan(x/y)值,其中x,y为弧度。(remxy)余数函数,求x/y的余数,其中x,y为整型或实型数。(maxx1x2)最大值函数,求出x1,x2,中的最大值。(minx1x2)最小值函数,求出x1,x2,中的最小值。,(2)几何函数,(anglept1pt2)角度计算函数,以弧度为单位返回点pt1和点pt2两点连线与X轴正向之间的夹角,是从当前构造平面的X轴起,按逆时针方向计算的。如果pt1和pt2为三维点,则先将它们投影到当前构造平面上,再计算投影线与X轴正向之间的夹角。例如:在命令行中输入命令:(angle(1.01.0)(1.04.0)1.5708命令:(angle(1.01.02.0)(3.04.05.0)0.982794(distancept1pt2)距离计算函数,返回两点之间的距离,pt1和pt2为两个点的坐标。例如:在命令行中输入命令:(distance(50.044.520.0)(100.0100.080.5)96.1275,(polarptangledist)极坐标函数,求点坐标,已知一点pt,求距离为dist,角度(两点连线与X轴正向之间的夹角)为angle的另一点Q的坐标,其中angle为弧度,如图5-5所示。例如:命令:(polar(5040)0.78550)(85.369475.3413),图5-5Polar函数,(intersp1p2p3p4onseg)求交点函数,返回两直线的交点坐标,其中p1、p2为第一条直线的端点,p3、p4为另一条直线的端点。如果设置了onseg参数且为nil,则认为两条直线是无限长的,对于图5-6中的两种情况都能求出交点。如果省略onseg参数或设置onseg为T(真值),则两条直线段不延长,那么对于图5-6,(a)情况可以求出交点,但(b)情况不能求出交点。例如:(setqa(1.01.0)b(9.09.0)c(4.01.0)d(4.02.0)(intersabcd);返回nil(intersabcdT);返回nil(intersabcdnil);返回(4.04.0),图5-6Inters函数的两种情况,(a)交点在线段内,(b)交点在线段外,3.4关系逻辑函数,(1)关系函数(=x1x2)等于函数,判断参数x1,x2,的值是否都相等。只有当所有参数的值都相等时为真,返回值为T,否则为假,返回值为nil。如果函数仅有一个参数,则返回真。如果没有参数,则提示出错。其中,参数的类型为整型、实型或字符串型。例如:(=10.510.5)返回T,(=Stringstring)返回nil。(/=x1x2)不等于函数,判断参数x1,x2,的值是否不相等。依次比较相邻两个参数的值,如果没有两个相邻参数的值相等则返回T,否则返回nil。如果函数仅有一个参数,则返回T。如果没有参数,则提示出错。例如:(/=Strstr)返回T,(/=Strstrstr)返回nil,(/=str1.0)返回T。,3.4关系逻辑函数,(x1x2)大于函数,判断x1x2是否成立。若每个参数值都大于它右边的参数值,则返回T,否则返回nil。如果函数仅有一个参数,则返回T。如果没有参数,则提示出错。例如:(1213)返回nil,(abdabc)返回T。(=x1x2)大于等于函数,用法同大于函数,只是进行的是大于等于判断。(x1x2)小于函数,判断x1x2是否成立。若每个参数值都小于它右边的参数值,则返回T,否则返回nil。如果函数仅有一个参数,则返回T。如果没有参数,则提示出错。例如:(1213)返回T,(=judge0.0);判别式是否大于0(progn(setqval(sqrtjudge)(setqx1(/(-valb)(*2a)(setqx2(/(-0bval)(*2a)(print(listx1x2)(princ方程的根是复数),)(progn(if(/=b0);a等于0,b不等于0的情况(progn(setqx(/(-0.0c)b)(printx)(princ不是方程)(princ);结束,返回)在AutoCAD中加载该程序后,在命令行中输入(roots124),程序运行后提示“方程的根是复数”;输入(roots12-4),程序返回(1.23607-3.23607),即方程x2+2x-4=0的两个根分别为1.23607,-3.23607。,(cond(testexpr1expr11expr12)(testexpr2expr21expr22)分支函数,参数由表构成,数目任意,每个参数表的第一项是条件表达式,后续各项是要求值的表达式。该函数按照顺序检查各条件是否成立,然后执行第一个条件成立的那一组表达式,并返回该组中最后一个表达式的值。一旦有一个条件已经成立,将不再对后面的条件进行处理。分支函数Cond相当于case类型的函数,下面这段程序处理用户的输入,当用户输入y或Y时,返回T,当用户输入n或N时,返回nil,假设用户输入的字符串已经存储在变量str中,程序如下:(cond(or(=stry)(=strY)T)(or(=strn)(=strN)nil)(Tnil),3.6循环函数,程序的三种控制结构顺序控制、条件控制和循环控制结构,在理论上可以满足任意功能的程序设计。在AutoLISP下,程序控制也是通过函数来实现的,前面已经介绍了顺序控制函数条件控制函数(5.3.5节),下面介绍AutoLISP的循环控制函数。,(whiletestexprexpr1expr2)While函数,先判断条件表达式testexpr,若条件为真,则执行循环体expr1,expr2,即按照顺序执行后续各求值表达式,然后再次判断条件,一直循环执行下去,直到条件是假为止。函数返回最后一个表达式的计算结果。例5-3:计算sum=1+2+3+100。程序可存为Sam5_3.lsp,命令名为Sam5_3。(defunc:Sam5_3()(setqsum0index1)(while(=index100)(setqsum(+sumindex)(setqindex(1+index)(printsum)运算结果显示为5050。,(repeatintexpr1expr2)Repeat函数,对循环体进行指定次数的求值运算。其中,参数int为一整型数据,表示循环重复次数,如果该参数大于0,则依次执行循环体中的表达式expr1,expr2,并返回最后一个表达式的计算结果。否则返回nil。例5-4:计算sum=12+22+102。程序可存为Sam5_4.lsp,命令名为Sam5_4。(defunc:Sam5_4()(setqsum0index1)(repeat10(setqsum(+sum(*indexindex)(setqindex(1+index)(printsum)运算结果显示为385。,3.7表处理函数,表处理函数主要对表进行构造、分离、访问和修改,并以表的形式为返回值(有的以表中的元素为返回值,如car,cdr系列函数)。(quote)引用函数,禁止对表进行求值,直接返回表本身。本函数的作用与表前加单引号完全相同,表前单引号是Quote函数的简写。例如:(setqa(quote(xyz);a=(xyz),相当于(setqa(xyz)(listexpr1expr2)表构造函数,用各表达式的值按照顺序组成一个表,并返回该表。参数个数不限。例如:(list(+10.00.5)12.0(sqrt9.0);返回表(10.512.03.0)(consnew-itemexpr)表构造函数,限两个参数,将一个新元素(new-item,可以是原子,也可以是表)加入到表达式expr(原子或表)的开头,返回两参数形成的表。例如:(consa(bcd)返回(abcd),(cons(a)(bcd)返回(a)bcd)。如果Cons函数的两个参数都是原子,则返回点对。例如:(consa2)返回(A.2),(append)表构造函数,把所有的表按照顺序放在一起,作为一个新表返回。例如:(append(ab)(cd)返回(abcd)。(car)该函数返回的第一个元素,如果是空表,它返回nil。如果是点对,操作是一样的。例如:(setqpoint(11.012.013.0);设置点的坐标(setqx(carpoint);得到点的X坐标,x=11.0(setqt(car(0.LINE);t=0(cdr)该函数返回的除第一个元素外的所有元素组成的新表,对原并没有任何修改。例如:(cdr(abc);返回表(bc)。(cdr(1.Text);返回Text,由car和cdr函数组合而成的函数Car函数和Cdr函数组合,用来提取表中的不同位置的元素或得到表的任意位置的子表,组合深度可达到4级。组合函数的书写采用缩写格式,以c开头,以r结尾,中间是a和d的组合,d表示去掉的第一个元素,a表示提取新表的第一个元素,如:(cadr)函数,表示先去掉的第一个元素形成一个新表,再提取新表的第一个元素,相当于得到了原的第二个元素。Car和Cdr组合函数一般用于提取点的坐标值,如:(setqpoint(11.012.013.0);设置点的坐标(setqx(carpoint);得到点的X坐标,x=11.0(setqy(cadrpoint);得到点的Y坐标,y=12.0(setqz(caddrpoint);得到点的Z坐标,z=13.0Car和Cdr组合函数其他写法可以类推。,(last)该函数返回的最后一个元素,如果为空表,则返回nil。例如:(last(abcde);返回e(setqpoint(11.012.013.0);设置点的坐标(setqz(lastpoint);得到点的Z坐标,z=13.0(nthn)该函数返回的第n个元素,其中参数n是元素的序号(整型数)。表的元素序号从0开始,即0,1,2,3,。如果参数n大于的最高元素序号,则返回nil。例如:(nth4(abcde)返回d。,(assoc)函数以为搜索条件,查找中包含的条目(元素),若找到则返回该条目,否则返回nil。例如:(setqabox(namebos)(length100.0)(width80.0)(height50.0)(setqlentbl(assoclengthabox);相当于lentbl=(LENGTH100.0)(setqatbl(assocsizeabox);相当于atbl=nilAssoc函数一般用来检索实体的数据(DXF组码),在5.4.4实体数据处理一节中将有详细介绍。(length)Length函数返回的长度,为一整型数。例如:(length(abcde)返回5。(reverse)该函数将的元素倒置后返回。例如:(reverse(abc(de)返回(DE)CBA)。,(substnewitemolditem)该函数在表中搜索某旧项,并将表中出现的每一个旧项用新项代替,然后返回修改后所得的表。其中,参数newitem为新项,olditem为旧项。如果在中没有找到olditem,该函数返回没有被修改的表。例如:(setqsample(ab(bc)b);注意,Subst函数把子表当成主表的一个元素来处理(substqqbsample);返回(AQQ(BC)QQ)与Assoc函数连用,Subst函数可以方便地替换关联表中与某关键字相关的值,例如:(setqsample(0.CIRCLE)(8.0)(10100.0120.00.0)(setqold(assoc8sample)(setqnew(8.LAYER1)(substnewoldsample);把sample表中的(8.0)替换为(8.LAYER1),(foreachnameexpr1expr2)该函数将遍历,将中每一个元素依次赋给name,并依次对表达式expr1,expr2,求值,函数将返回最后一个expr表达式的结果。例如:(foreachn(xyz)(princn);等价于(princx)(princy)(princz),返回z,3.8字符串处理函数,(strcatstr1str2)该函数返回一个字符串,它是字符串str1、str2、连接起来的。如果没有参数,则返回空字符串。如:(strcatAutoLISPforAutoCAD)返回AutoLISPforAutoCAD。(strlenstr1str2)该函数返回字符串中字符的个数(不包括双引号),返回值为整数。如果字符串有多个,则返回各字符串的总长度。例如:(strlen);返回0(strlenAutoLISPforAutoCAD);返回18,3.9交互式数据输入函数,交互式数据输入函数是AutoLISP提供的、用户向AutoLISP程序输入数据的接口。这类函数执行时使机器暂停下来,等待用户按提示输入数据。这类函数有时统称为GetXXX函数。(getintmsg)和(getrealmsg)函数执行时系统暂停,等待用户输入数据。参数msg为提示字符串,将出现在命令行中(如果有的话)。Getint函数要求用户输入整数,并返回该整数;Getreal函数可输入实数或整数,但返回实数。提示字符串msg中允许使用控制字符。例如:(setqnum(getint);要求用户输入一个整数,但命令行没有提示,整数将赋给num(setqnum(getintn请输入一个整数:)(setqval(getrealn请输入一个实数:),(getstringcrmsg)函数等待用户输入一个字符串并返回该字符串。如果提供了参数cr并且其值不为nil,则输入的字符串可以包含空格且必须以Enter键结束;否则,输入的字符串以空格或Enter键结束。参数msg为提示字符串,将出现在命令行中(如果有的话)。Getstring函数能接受的字符串的最大长度为132个字符,如果输入超过132个,则仅返回前面132个字符。例如:(setqstr1(getstringTn请输入你的学号:),(getpointptmsg)(getcornerptmsg)(getdistptmsg)这三个函数操作方式相似,参数pt为基点(二维点或三维点),参数msg为提示字符串。Getpoint函数让用户输入一个点并返回该点的坐标值(xyz),如果提供了基点pt,系统会从pt点到当前十字光标画一条橡皮线以提示用户选择点。,Getcorner函数与Getpoint函数类似,也返回点的坐标值,但Getcorner函数必须提供参数pt作为基点,系统会从基点到当前十字光标画一个矩形以提示用户选择点。Getdist函数等待用户输入一个距离(即一个实数)。用户可以通过选择两个点来指定距离,如果提供了基点pt,用户只需输入第二点即可计算出距离值。Getdist函数会从pt点画一条橡皮线以帮助用户确定距离,并总是以实数形式返回距离值。例如:(setqpt1(getpointn请输入第一点的位置:)(setqpt2(getcornerpt1n请输入下一点的位置:)(setqdist(getdistpt2n选择点以确定距离:),(getangleptmsg)该函数等待用户输入一个角度(以度为单位),返回角度的弧度值。参数pt为基点,参数msg为提示信息(字符串)。响应该函数,用户可以直接输入一个角度值,也可以输入两个点,函数将计算两点连线的倾斜角度并返回,如果提供了基点pt,只需输入第二点即可。在该函数中,角度的测量计算是以系统变量ANGBASE的当前设置为零弧度按逆时针方向来测量的(忽略系统变量ANGDIR的设置)。例如:(setqang(getangle)(setqpt1(getpointn请输入基点的位置:)(setqang(getanglept1n请输入角度方向的另一点:)(getorientptmsg)该函数的功能与Getangle函数类似,不同之处在于该函数返回的弧度值不受系统变量ANGBASE和ANGDIR的影响,始终以水平右手方向为零弧度,按逆时针方向来测量。,3.10打印输出函数,(promptmsg)该函数在AutoCAD文本窗口中显示一个字符串,用作提示信息。参数msg为字符串。函数承认字符串中的控制字符,并总是返回nil。(princexprfile-desc)(printexprfile-desc)(prin1exprfile-desc)这些函数在命令行打印一个表达式的值(没有指定file-desc时)或将该表达式的值写入一个已打开的文件中(指定file-desc时)。参数expr为将要打印的表达式,参数file-desc是一个以写方式打开的文件描述符。函数返回表达式的值。例如:(setqa(+13)(princa);打印表达式的值4,返回表达式的值4(printa);换行打印表达式的值4,再加一空格,返回表达式的值4(prin1a);打印表达式的值4,返回表达式的值4。,Princ函数和Prin1函数直接打印表达式的值,而Print函数在打印表达式的值之前先打印一个空行,打印表达式之后增加打印一个空格。对于字符串型表达式,Princ函数显示的字符串不带双引号,而Print和Prin1函数显示的字符串都带有双引号。如果字符串中有控制字符(见表5-2),Princ函数将按照控制来打印字符串,而Print和Prin1函数将不承认控制字符并把它原样打印出来。例如:(setqstrTheallowabletoleranceisn0.25)(promptstr);打印Theallowabletoleranceis;换行0.25并返回nil(princstr);打印Theallowabletoleranceis;换行0.25,并返回str的值(printstr);打印空行;打印Theallowabletoleranceisn0.25,并返回str的值(prin1str);打印Theallowabletoleranceisn0.25,并返回str的值,一般在程序的最后加一个无参数的打印函数语句,如(princ),表示程序静默退出,相当于其他语言中的Return语句。(terpri)换行函数,在命令行上输出一个换行符,功能和(princn)相同,返回值为nil。,3.11Command函数,Command函数用来在AutoLISP程序中调用AutoCAD命令,并响应命令进行操作。利用该函数可以实现图形的绘制和编辑等AutoCAD命令,使编写图形处理程序变得相当方便。Command函数的格式为:(commandarguments)其中arguments参数表表示要执行的AutoCAD命令名和所需要的响应,可以是字符串、实数、整数或点,但必须与要执行的命令所需要的参数一致。一般来说,arguments参数表的第一个参数是AutoCAD命令名,后跟该命令执行时所需要的参数,参数与参数之间用空格分开。,例如,在AutoCAD中运行画圆命令,步骤为:命令:_circle指定圆的圆心或三点(3P)/两点(2P)/相切、相切、半径(T):10,10指定圆的半径或直径(D):25画圆命令结束,把上述步骤写成Command函数,语句为:(command_circle10,1025)其中,_circle对应命令名,10,10对应圆心点,25对应半径,实现对画圆命令的响应。在Command函数中,命令执行所需的数据也可用相应类型的变量来响应,上述画圆的语句可以写成:(setqpt(1010)(setqr125)(command_circleptr1)结果是一样的。,(1)AutoCAD命令及其选项用字符串表示,大小写均可。如:(command_circle10,10d50)和(command_CIRcle10,10D50)是一样的。(2)数值常量(整数或实数)可以写数的本身,也可以写成字符串形式。如:(command_circle10,1025)也可以写成(command_circle10,1025)。(3)对于点的响应,有三种方式:表、字符串或变量,例如:(command_circle(1010)25)与(command_circle10,1025)与(setqpt(1010)(command_circlept25)是等价的。(4)Command函数的参数中,空字符串()等效于键盘上按一次空格键。若没有参数而调用Command函数,相当于ESC键,可取消大多数AutoCAD命令。(5)一个Command函数可以执行多个AutoCAD命令。一条AutoCAD命令可由多个Command函数来完成,中间可以插入其他AutoLISP语句。,3.12存取AutoCAD系统变量值函数,在AutoCAD中,可以很方便地查看或修改系统变量的值,只要在命令行中输入系统变量的名称就可以完成操作,这也使得可以利用Command函数来修改系统变量的值。除此之外,AutoLISP还提供了专门用来存取系统变量值的函数:Getvar函数和Setvar函数。,Getvar函数,格式:(getvarVarName)Getvar函数用于获取AutoCAD系统变量的当前值,其中,参数VarName为系统变量的名称,其字符大小写均可。若VarName是一个合法的系统变量名,Getvar函数将返回该系统变量的当前值,否则返回nil。例如,系统变量CMDECHO控制AutoLISP的command函数运行时AutoCAD是否回显提示和输入,CMDECHO有两个值0和1,0表示关闭回显,1表示打开回显。得到CMDECHO的当前值,语句如下:(setqCurVal(getvarCMDECHO);变量CurVal=CMDECHO的当前值,Setvar函数,格式:(setvarVarNamevalue)Setvar函数用于设置AutoCAD系统变量的新值,其中,参数VarName为系统变量的名称,参数value为所设置的新值。Setvar函数将value值设置给系统变量VarName,并返回该新值。Getvar函数一般和Setvar函数联用,实现用户的意图,例如,在运行command函数时,想要避免在命令行中出现回显,但又不想修改原来的设置,可在程序中加入以下语句:(setqCurVal(getvarCMDECHO);变量CurVal记下CMDECHO的当前值(setvarCMDECHO0);设置CMDECHO的值为0,关闭回显;程序体,包含command函数(setvarCMDECHOCurVal);恢复CMDECHO的原始值,3.13自定义函数和子程序,(1)自定义函数Defun函数格式:(defun(实参变量名表/局部变量名表)其中,为一字符串,以后要调用此函数就通过来调用。自定义函数名不要与内部函数重名。函数名后边是圆括号“()”,括号内的变量名表分为两部分,用“/”隔开,前半部分为实参变量名表,是函数的实参,实现参数的传递;后半部分为局部变量名表,其内的局部变量仅在函数内部使用,与函数外部没有任何联系。变量名表中的变量,无论“/”号前还是“/”号后的均为局部变量(约束变量),只在函数执行过程中有值,等函数执行完毕,所有的局部变量均置为nil(空),不占内存。凡是在变量名表中未出现的其他变量均为全局变量(自由变量),它们在函数执行过后,仍在内存中保存其值。,变量名表中的各项要用空格分开,尤其要注意“/”号前后必须有空格。变量名表可以没有,可以只有实参变量名表(此时“/”号不写),也可以只有局部变量名表(此时“/”号不能省略)。例如:(defunmyfunc(xy);myfunc函数有两个实参(defunmyfunc(/ab);myfunc函数有两个局部变量(defunmyfunc(x/temp);myfunc函数有一个实参,一个局部变量(defunmyfunc();myfunc函数没有变量都是合法的定义方式。Defun函数返回最后一个表达式的值,供其他程序使用。,例5-5:计算两点连线的斜率,程序可存为Sam5_5.lsp,函数名为slope。(defunslope(pt1pt2/x1y1x2y2)(if(or(null(cdrpt1)(null(cdrpt2)nil;如果参数有错误返回nil(progn(setqx1(carpt1)(setqy1(cadrpt1)(setqx2(carpt2)(setqy2(cadrpt2);坐标值乘1.0的目的是保证坐标值为实数(if(abs(-(*1.0 x1)x2)0.0001)斜率无穷大(/(-(*1.0y2)y1)(-(*1.0 x2)x1);If函数结束);Progn函数结束);外层If函数结束);自定义函数结束在AutoCAD中加载该程序Sam5_5.lsp,在命令行输入(slope(12)(56),返回1.0。,(2)定义AutoCAD命令格式:(defunC:XXX(/局部变量名表)其中,函数名称的形式必须为“C:XXX”,XXX部分就是子定义命令的名称,并且“C:”和“XXX”之间不能有空格。命令的名称最好不要和AutoCAD已有命令的名称重复。该函数不能带有实参变量名表,但可以含有局部变量,以“/”号为标记。例如:(defunc:mycomm();命令名为mycomm,无局部变量(defunc:mycomm(/ab);命令名为mycomm,有两个局部变量都是合法的定义方式。,例5-6:绘制心形图案,程序可存为Sam5_6.lsp,命令名为heart。(defunc:heart()(setqval_1(getvarCMDECHO)(setvarCMDECHO0)(setqptBase(getpointn请指定心形图案的中心:)(setqradius(getdistptBasen请输入心形图案的半径:)(setqnum(getintn请给出叠加次数(整数):)(setqafBase(/(*2.0pi)num)afi0);角度初始化(setqindex1);循环量初始化(while(=indexnum);计算圆心(setqxVal(+(*radius(cosafi)(carptBase)yVal(+(*radius(sinafi)(cadrptBase)(setqptCen(listxValyVal);计算半径(setqxTemp(*radius(cosafi)yTemp(-radius(*radius(sinafi)(setqrTemp(sqrt(+(*xTempxTemp)(*yTempyTemp);画圆(command_circleptCenrTemp);角度和循环量递增(setqafi(*afBaseindex)(setqindex(1+index)(setvarCMDECHOval_1)(princ),(3)子程序AutoLISP程序中可以定义多个自定义函数,这些函数之间相互调用,就产生了子程序。子程序的定义是通过Defun函数实现的,其调用方式与AutoLISP的内部函数完全相同。下面的例子演示了子程序的定义和调用。例5-7:程序要求用户输入两个点,计算两点连线的斜率,程序文件名为Sam5_7.lsp,命令名为Cal_k。本程序把计算斜率的函数slope作为子程序。;主程序开始(defunc:Cal_k()(setqptFst(getpointn请输入第一点:)(setqptSnd(getpointptFstn请输入第二点:)(setqkVal(slopeptFstptSnd);调用子程序(slopeptFstptSnd)(printkVal);打印结果(princ);主程序结束,;子程序开始(defunslope(pt1pt2/x1y1x2y2)(if(or(null(cdrpt1)(null(cdrpt2)nil(progn(setqx1(carpt1)(setqy1(cadrpt1)(setqx2(carpt2)(setqy2(cadrpt2)(if(abs(-(*1.0 x1)x2)0.0001)斜率无穷大(/(-(*1.0y2)y1)(-(*1.0 x2)x1);子程序结束在主程序中,语句(setqkVal(slopeptFstptSnd)调用了计算斜率的子程序slope函数,并把返回值赋给变量kVal,然后打印显示斜率的值。子程序的调用和普通函数的调用方式是一样的。,3.14参数化编程实例,参数化编程,就是根据用户输入的位置和尺寸,自动绘制出相应的图形。参数化编程的优点是操作非常方便,用户只需要向程序提供一些初始参数,绘图操作交给计算机来做。参数化编程通常适用于结构固定的系列化产品,如标准件和结构不变的常用零件。因为AutoLISP具有强大的图形处理功能,所以用AutoLISP可以方便地实现图形参数化编程。,参数化编程的一般步骤是:,(1)图形分析。分析图形的几何关系和变化,确定如何能最方便地画出图形。(2)输入参数分析。分析需要输入什么参数就能完全确定图形,建立参数和图形之间关系的数学模型。(3)编写调试图形程序,直到程序运行正确。,参数化编程的一般功能模块,参数化程序的一般功能模块如下:(1)参数输入模块,提示用户输入所需要的结构参数,一般是定位点和尺寸。(2)图形数据计算模块,根据输入参数和数学模型计算出图形中每一个图素的绘制所需要的数据。(3)绘图模块,画出各个图素。,各模块之间有先后顺序,如图5-7所示。,图5-7参数化程序结构图,例5-8:参数化编程,图形为轴键槽剖面图,如图5-8(a)所示,程序文件名为Sam5_8.lsp,命令名为bond。,图5-8轴键槽剖面图分析,(a),(b),(c),(1)图形分析5-8(a)所示为轴键槽剖面图的一般情况,键槽的倾斜角Alf是可以变化的,Alf=0,Alf=90,Alf=180为图样中的常见形式。如图5-8(b)所示,图形由一段圆弧和三段直线组成,圆弧可由P1、P2、P3三点画出,直线由P3、P4、P5、P1画出。,(2)输入参数分析根据工程习惯,输入参数如图5-8(a)所示:定位点P0轴径Dia键槽宽Wid键槽深度尺寸Depth倾斜角Alf根据输入参数,即可建立数学模型,其计算关系如图5-8(c)所示,键槽半宽,轴半径,则,夹角。各参数点采用极坐标函数polar求得:P1=polar(P0,Alf+Sit,radius)P2=polar(P0,Alf+,radius)P3=polar(P0,Alf-Sit,radius)P4=polar(P3,Alf+,(L1+radius)-Depth)P5=polar(P1,Alf+,(L1+radius)-Depth),(3)程序设计(defunc:bond()(setqval_1(getvarCMDECHO)(setvarCMDECHO0)(setqP0(getpointn请输入定位点:)(setqDia(getdistP0n轴径:)(setqAlf(getangleP0n倾斜角:)(setqWid(getrealn键槽宽:)(setqDepth(getrealn键槽深度尺寸:)(setqradius(/Dia2.0)B1(/Wid2.0)(setqL1(sqrt(-(*radiusradius)(*B1B1)(setqSit(atan(/B1L1)(setqP1(polarP0(+AlfSit)radius)(setqP2(polarP0(+Alfpi)radius)(setqP3(polarP0(-AlfSit)radius)(setqP4(polarP3(+Alfpi)(-(+L1radius)Depth)(setqP5(polarP1(+Alfpi)(-(+L1radius)Depth)(command_arcP1P2P3)(command_lineP3P4P5P1)(setvarCMDECHOval_1)(princ)(4)加载并运行程序,根据提示输入参数,程序将自动绘制出轴键槽剖面图。,
展开阅读全文
相关资源
相关搜索

当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!