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。•·(rtosnumber[mode[precision]])•实型格式化函数rtos,该函数把实型数number(也可为整型数)按照指定的模式mode和精度precision转换成字符串。中括号“[]”内的参数可以不写。•参数number可以是整型或实型常量、变量或表达式。•参数mode为线性单位的格式编码,与AutoCAD的线性格式相对应,具体对应关系如表5-4所示。如果没有指定mode的值,将采用系统变量LUNITS的值来指定当前的线性单位格式。表5-4rtos函数中mode的值与线性单位格式的对应关系mode值线性单位格式示例1科学1.75E+042十进制小数23.753工程(英尺+十进制英寸)5'-4.254建筑(英尺+分数英寸)1'-51/2\5分数171/2•参数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•·(angtosangle[mode[precision]])•·(angtosangle[mode[precision]])•角度格式化函数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为弧度。•(atanx[y])反正切函数,求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函数•·(intersp1p2p3p4[onseg])•求交点函数,返回两直线的交点坐标,其中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,(abcabd)返回T。•·(=x1x2……)•小于等于函数,用法同小于函数,只是进行的是小于等于判断。•·(equalexpr1expr2[fuzz])•判断两个表达式的值是否相同,可以完成表的比较。参数expr1和expr2是用于比较的表达式,参数fuzz为实数,用于定义expr1和expr2之间最大允许误差。如果两表达式相等或两者相差在参数fuzz的范围内,认为两者相等,返回T,否则返回nil。如果不提供参数fuzz,则系统默认误差值为0。•例如:在命令行输入•命令:(setqexp1'(xyz)exp2'(xyz))•(XYZ)•命令:(setqexp3exp2)•(XYZ)•命令:(equalexp1exp3)•T•命令:(setqx18.00004x28.00005)•8.00005•命令:(equalx1x20.00001)•T•命令:(equalx1x2)•nil(2)逻辑函数•·(and[expr1][expr2][expr3]……)•AND函数,用于表达式的“逻辑与”运算,参数expr1,expr2,……为AutoLISP表达式。只有当所有参数的值都不为空时,函数才返回真(T);只要有一个参数的值为空(nil),函数就停止求值并返回假(nil);如果不提供参数而调用该函数也返回真(T)。•例如:(setqa103bnilcstring);;a=103b=0c=string•(and1.4ac);;返回T•(and1.4abc);;返回nil,因为b=0•·(or[expr1][expr2][expr3]……)•OR函数,用于表达式的“逻辑或”运算,参数expr1,expr2,……为AutoLISP表达式。在所有参数中,只要有一个值为非空(T),则函数就停止求值并返回真(T);只有当所有参数的值都为空(nil)时,才返回假(nil);如果不提供参数而调用该函数也返回假(nil)。•例如:(ornil45'());;返回T•(ornil'());;返回nil•·(notitem)•NOT函数,用于表达式的“逻辑非”运算,为单目运算符,参数item仅有一个,是一个AutoLISP表达式。当参数item的值为空(nil)时,函数返回非空(T);参数的值为非空(T)时,返回空(nil);如果不提供参数而调用该函数将提示出错。•例如:(setqa123bstringcnil);;a=123b=stringc=0•(nota);;返回nil•(notb);;返回nil•(notc);;返回T•(not'());;返回T•·(nullitem)•NULL函数,测试参数表达式是否为空。NULL函数与NOT函数的功能基本相同,不同之处在于,NULL函数一般用于表(也可用于其他数据类型),而NOT函数可用于所有数据类型。•例如:(null'());;返回T•(null'(xyz));;返回nil3.5条件分支函数•条件分支函数可以实现程序的流程控制,判断条件是否成立,根据不同