AutoCADAutoLISP基本函数解析

上传人:桔**** 文档编号:568632291 上传时间:2024-07-25 格式:PPT 页数:66 大小:203.50KB
返回 下载 相关 举报
AutoCADAutoLISP基本函数解析_第1页
第1页 / 共66页
AutoCADAutoLISP基本函数解析_第2页
第2页 / 共66页
AutoCADAutoLISP基本函数解析_第3页
第3页 / 共66页
AutoCADAutoLISP基本函数解析_第4页
第4页 / 共66页
AutoCADAutoLISP基本函数解析_第5页
第5页 / 共66页
点击查看更多>>
资源描述

《AutoCADAutoLISP基本函数解析》由会员分享,可在线阅读,更多相关《AutoCADAutoLISP基本函数解析(66页珍藏版)》请在金锄头文库上搜索。

1、AutoCAD-AutoLISPAutoCAD-AutoLISP基本函基本函数解析数解析3 AutoLISP基本函数基本函数3.1 赋值函数3.2 数据类型转换函数3.3 数学几何函数3.4 关系逻辑函数3.5 条件分支函数3.6 循环函数3.7 表处理函数3.8 字符串处理函数3.9 交互式数据输入函数3.10 打印输出函数3.11 Command函数3.12 存取AutoCAD系统变量值函数3.13 自定义函数和子程序3.14 参数化编程实例AutoLISP提供了大量的函数,每个函数都实现特定的功能。通过调用AutoLISP函数,并对这些函数做适当的组合和编排,就可以编写一个AutoLIS

2、P程序,来完成用户的特定的操作。AutoLISP语言是函数的语言,AutoLISP程序是由函数语句组成的。本节将介绍最常用的AutoLISP函数,以便使读者比较快地学习和理解AutoLISP程序设计。详细而全面的函数说明可以参见AutoLISP帮助。3.1 赋值函数格式:(setq )详见5.2.4。3.2 数据类型转换函数 (float x)整型转换为实型,x为整型数,返回x的实型数。例如:(float 3) 返回3.0。 (itoa x)整型转换为字符串,x为整型数,把x转化为字符串。例如:(itoa 53) 返回 53。 (fix x)实型转换为整型,x为实型或整型数,返回x的整型数。取

3、整过程是直接截断x的小数部分,而非四舍五入。例如:(fix 3.7) 返回3。 (rtos number mode precision )实型格式化函数rtos,该函数把实型数number(也可为整型数)按照指定的模式mode和精度precision转换成字符串。中括号“ ”内的参数可以不写。参数number可以是整型或实型常量、变量或表达式。参数mode为线性单位的格式编码,与AutoCAD的线性格式相对应,具体对应关系如表5-4所示。如果没有指定mode的值,将采用系统变量LUNITS的值来指定当前的线性单位格式。表5-4 rtos函数中mode的值与线性单位格式的对应关系mode值 线性

4、单位格式 示例 1科学 1.75E+04 2十进制小数 23.75 3工程(英尺 + 十进制英寸) 5-4.25 4建筑(英尺 + 分数英寸) 1-5 1/2 5分数 17 1/2 参数precision指定数值的显示精度,对于表5-4中前3种格式,该参数用来指定小数点后的小数位数。对于后两种格式,用来设定最小分数的分母。如果没有指定precision的值,将采用系统变量LUPREC来设定当前精度的值。例如:在命令行中输入命令: (setq x 17.5)17.5命令: (setq fmtval (rtos x 1 4)1.7500E+01命令: (setq fmtval (rtos x 2

5、2)17.50命令: (setq fmtval (rtos x 3 2)1-5.5命令: (setq fmtval (rtos x 4 2)1-5 1/2命令: (setq fmtval (rtos x 5 2)17 1/2 (angtos angle mode precision ) (angtos angle mode precision )角度格式化函数angtos,该函数把以弧度为单位的角度数值angle按照指定的角度格式mode和精度precision转换成字符串,角度值angle的大小在0, 2之间。中括号“ ”内的参数可以不写。参数angle可以是整型或实型常量、变量或表达式。参

6、数mode为角度格式编码,对应的系统变量为ANNITS。Mode的取值为:0 十进制角度,1 度/分/秒,2 百分度,3 弧度,4 勘测单位角度。参数precision指定转换后小数点之后的小数位数,对应系统变量为AUPREC。例如:在命令行中输入命令: (angtos 0.785398 0 4)45.0000命令: (angtos -0.785398 0 4)315.0000命令: (angtos -0.785398 4)S 45d E (atoi string)字符串转换为整型,string为字符串。例如:(atoi 80) 返回80。 (atof string)字符串转换为实型,stri

7、ng为字符串。例如:(atof -1.25) 返回-1.25。3.3 数学几何函数(1)数学函数 (+ x1 x2 ) 加运算,求x1 + x2 + 之和。 (- x1 x2 ) 减运算,求x1 - x2 - 之差。 (* x1 x2 )乘运算,求x1 * x2 * 之积。 (/ x1 x2 )除运算,求x1 / x2 / 之商。 (1+ x)增量运算,返回x + 1。 (1- x)减量运算,返回x - 1。 (abs x)绝对值函数,求x的绝对值。 (sqrt x)平方根函数,求x的平方根。 (expt x p)任意次方函数,求xp的值。 (exp p)e的任意次方函数,求ep的值。 (lo

8、g x)自然对数函数,求ln(x) 的值。 (sin x)正弦函数,求sin(x) 的值,其中x为弧度。 (cos x)余弦函数,求cos(x) 的值,其中x为弧度。 (atan x y )反正切函数,求atan(x) 或atan(x/y) 值,其中x,y为弧度。 (rem x y)余数函数,求x/y的余数,其中x,y为整型或实型数。 (max x1 x2 )最大值函数,求出x1,x2, 中的最大值。 (min x1 x2 )最小值函数,求出x1,x2, 中的最小值。(2)几何函数 (angle pt1 pt2)角度计算函数,以弧度为单位返回点pt1和点pt2两点连线与X轴正向之间的夹角,是从

9、当前构造平面的X轴起,按逆时针方向计算的。如果pt1和pt2为三维点,则先将它们投影到当前构造平面上,再计算投影线与X轴正向之间的夹角。例如:在命令行中输入命令: (angle (1.0 1.0) (1.0 4.0)1.5708命令: (angle (1.0 1.0 2.0) (3.0 4.0 5.0)0.982794 (distance pt1 pt2)距离计算函数,返回两点之间的距离, pt1和pt2为两个点的坐标。例如:在命令行中输入命令: (distance (50.0 44.5 20.0) (100.0 100.0 80.5)96.1275 (polar pt angle dist)

10、极坐标函数,求点坐标,已知一点pt,求距离为dist,角度(两点连线与X轴正向之间的夹角)为angle的另一点Q的坐标,其中angle为弧度,如图5-5所示。例如:命令: (polar (50 40) 0.785 50)(85.3694 75.3413) 图5-5 Polar函数 (inters p1 p2 p3 p4 onseg )求交点函数,返回两直线的交点坐标,其中p1、p2为第一条直线的端点,p3、p4为另一条直线的端点。如果设置了onseg参数且为nil,则认为两条直线是无限长的,对于图5-6中的两种情况都能求出交点。如果省略onseg参数或设置onseg为T(真值),则两条直线段不

11、延长,那么对于图5-6,(a)情况可以求出交点,但(b)情况不能求出交点。例如:(setq a (1.0 1.0) b (9.0 9.0) c (4.0 1.0) d (4.0 2.0)(inters a b c d); 返回nil(inters a b c d T); 返回nil(inters a b c d nil); 返回 (4.0 4.0) 图5-6 Inters函数的两种情况 (a)交点在线段内 (b)交点在线段外 3.4 关系逻辑函数(1)关系函数 (= x1 x2 )等于函数,判断参数x1,x2, 的值是否都相等。只有当所有参数的值都相等时为真,返回值为T,否则为假,返回值为ni

12、l。如果函数仅有一个参数,则返回真。如果没有参数,则提示出错。其中,参数的类型为整型、实型或字符串型。例如:(= 10.5 10.5) 返回T,(= String string) 返回nil。 (/= x1 x2 )不等于函数,判断参数x1,x2, 的值是否不相等。依次比较相邻两个参数的值,如果没有两个相邻参数的值相等则返回T,否则返回nil。如果函数仅有一个参数,则返回T。如果没有参数,则提示出错。例如:(/= Str str) 返回T,(/= Str str str) 返回nil,(/= str 1.0) 返回T。3.4 关系逻辑函数 ( x1 x2 )大于函数,判断x1 x2 是否成立。

13、若每个参数值都大于它右边的参数值,则返回T,否则返回nil。如果函数仅有一个参数,则返回T。如果没有参数,则提示出错。例如:( 12 13) 返回nil,( abd abc) 返回T。 (= x1 x2 )大于等于函数,用法同大于函数,只是进行的是大于等于判断。 ( x1 x2 )小于函数,判断x1 x2 是否成立。若每个参数值都小于它右边的参数值,则返回T,否则返回nil。如果函数仅有一个参数,则返回T。如果没有参数,则提示出错。例如:( 12 13) 返回T,( abc abd) 返回T。 ( x y) (setq z x) (setq z y) (progn expr1 expr2 )顺

14、序控制函数,按顺序对表达式进行求值,先执行表达式expr1,再执行表达式expr2,并返回第一个表达式的结果。如果没有表达式,该函数返回nil。由于if函数在条件为真(或假)时只能执行一条语句,所以progn函数常与if函数联用,可实现执行多条语句。例5-2:下列程序实现一元二次方程的求解,程序源文件可存为Sam5_2.lsp 求解一元二次方程ax2 + bx + c = 0 需要输入方程的系数a,b,c(defun roots(a b c) (if (/= a 0); a 不等于 0 的情况 (progn (setq judge (- (* b b) (* 4.0 a c) ; 判别式jud

15、ge (if (= judge 0.0); 判别式是否大于0(progn (setq val (sqrt judge) (setq x1 (/ (- val b) (* 2 a) (setq x2 (/ (- 0 b val) (* 2 a) (print (list x1 x2)(princ 方程的根是复数) ) ) (progn (if (/= b 0) ; a 等于 0,b 不等于 0 的情况(progn (setq x (/ (- 0.0 c) b) (print x)(princ 不是方程) ) ) ) (princ) ; 结束,返回)在AutoCAD中加载该程序后,在命令行中输入

16、(roots 1 2 4),程序运行后提示“方程的根是复数”;输入 (roots 1 2 -4),程序返回 (1.23607 -3.23607),即方程x2 + 2x - 4 = 0的两个根分别为1.23607,-3.23607。 (cond(testexpr1 expr11 expr12 )(testexpr2 expr21 expr22 ) )分支函数,参数由表构成,数目任意,每个参数表的第一项是条件表达式,后续各项是要求值的表达式。该函数按照顺序检查各条件是否成立,然后执行第一个条件成立的那一组表达式,并返回该组中最后一个表达式的值。一旦有一个条件已经成立,将不再对后面的条件进行处理。分

17、支函数Cond相当于case类型的函数,下面这段程序处理用户的输入,当用户输入y或Y时,返回T,当用户输入n或N时,返回nil,假设用户输入的字符串已经存储在变量str中,程序如下:(cond(or (= str y) (= str Y) T)(or (= str n) (= str N) nil)(T nil)3.6 循环函数程序的三种控制结构顺序控制、条件控制和循环控制结构,在理论上可以满足任意功能的程序设计。在AutoLISP下,程序控制也是通过函数来实现的,前面已经介绍了顺序控制函数条件控制函数(5.3.5节),下面介绍AutoLISP的循环控制函数。 (while testexpr

18、expr1 expr2 )While函数,先判断条件表达式testexpr,若条件为真,则执行循环体expr1,expr2,即按照顺序执行后续各求值表达式,然后再次判断条件,一直循环执行下去,直到条件是假为止。函数返回最后一个表达式的计算结果。例5-3:计算 sum = 1 + 2 + 3 + + 100。程序可存为Sam5_3.lsp,命令名为Sam5_3。(defun c:Sam5_3() (setq sum 0 index 1) (while (= index 100) (setq sum (+ sum index) (setq index (1+ index) ) (print sum

19、)运算结果显示为5050。 (repeat int expr1 expr2 )Repeat函数,对循环体进行指定次数的求值运算。其中,参数int为一整型数据,表示循环重复次数,如果该参数大于0,则依次执行循环体中的表达式expr1,expr2,并返回最后一个表达式的计算结果。否则返回nil。例5-4:计算 sum = 12 + 22 + + 102。程序可存为Sam5_4.lsp,命令名为Sam5_4。(defun c:Sam5_4() (setq sum 0 index 1) (repeat 10 (setq sum (+ sum (* index index) (setq index (1

20、+ index) ) (print sum)运算结果显示为385。3.7 表处理函数表处理函数主要对表进行构造、分离、访问和修改,并以表的形式为返回值(有的以表中的元素为返回值,如car,cdr系列函数)。 (quote )引用函数,禁止对表进行求值,直接返回表本身。本函数的作用与表前加单引号完全相同,表前单引号是Quote函数的简写。例如:(setq a (quote (x y z) ; a = (x y z),相当于 (setq a (x y z) (list expr1 expr2 )表构造函数,用各表达式的值按照顺序组成一个表,并返回该表。参数个数不限。例如:(list (+ 10.0

21、 0.5) 12.0 (sqrt 9.0) ; 返回表 (10.5 12.0 3.0) (cons new-item expr)表构造函数,限两个参数,将一个新元素(new-item,可以是原子,也可以是表)加入到表达式expr(原子或表)的开头,返回两参数形成的表。例如:(cons a (b c d) 返回 (a b c d),(cons (a) (b c d) 返回 (a) b c d)。如果Cons函数的两个参数都是原子,则返回点对。例如:(cons a 2) 返回 (A . 2) (append )表构造函数,把所有的表按照顺序放在一起,作为一个新表返回。例如:(append (a b

22、) (c d) 返回 (a b c d)。 (car )该函数返回的第一个元素,如果是空表,它返回nil。如果是点对,操作是一样的。例如:(setq point (11.0 12.0 13.0) ; 设置点的坐标(setq x (car point) ; 得到点的X坐标,x = 11.0(setq t (car (0 . LINE) ; t = 0 (cdr )该函数返回的除第一个元素外的所有元素组成的新表,对原并没有任何修改。例如:(cdr (a b c) ; 返回表 (b c)。(cdr (1 . Text) ; 返回Text 由由car和和cdr函数组合而成的函数函数组合而成的函数Car

23、函数和Cdr函数组合,用来提取表中的不同位置的元素或得到表的任意位置的子表,组合深度可达到4级。组合函数的书写采用缩写格式,以c开头,以r结尾,中间是a和d的组合,d表示去掉的第一个元素,a表示提取新表的第一个元素,如:(cadr ) 函数,表示先去掉的第一个元素形成一个新表,再提取新表的第一个元素,相当于得到了原的第二个元素。Car和Cdr组合函数一般用于提取点的坐标值,如:(setq point (11.0 12.0 13.0) ; 设置点的坐标(setq x (car point) ; 得到点的X坐标,x = 11.0(setq y (cadr point) ; 得到点的Y坐标,y =

24、12.0(setq z (caddr point) ; 得到点的Z坐标,z = 13.0Car和Cdr组合函数其他写法可以类推。 (last )该函数返回的最后一个元素,如果为空表,则返回nil。例如:(last (a b c d e) ; 返回e(setq point (11.0 12.0 13.0) ; 设置点的坐标(setq z (last point) ; 得到点的Z坐标,z = 13.0 (nth n )该函数返回的第n个元素,其中参数n是元素的序号(整型数)。表的元素序号从0开始,即0,1,2,3, 。如果参数n大于的最高元素序号,则返回nil。例如:(nth 4 (a b c d

25、 e) 返回d。 (assoc )函数以为搜索条件,查找中包含的条目(元素),若找到则返回该条目,否则返回nil。例如:(setq abox (name bos) (length 100.0) (width 80.0) (height 50.0)(setq lentbl (assoc length abox) ; 相当于lentbl = (LENGTH 100.0)(setq atbl (assoc size abox) ; 相当于atbl = nilAssoc函数一般用来检索实体的数据(DXF组码),在5.4.4实体数据处理一节中将有详细介绍。 (length )Length函数返回的长度,

26、为一整型数。例如:(length (a b c d e) 返回5。 (reverse )该函数将的元素倒置后返回。例如:(reverse (a b c (d e) 返回 (D E) C B A)。 (subst newitem olditem )该函数在表中搜索某旧项,并将表中出现的每一个旧项用新项代替,然后返回修改后所得的表。其中,参数newitem为新项,olditem为旧项。如果在中没有找到olditem,该函数返回没有被修改的表。例如:(setq sample (a b (b c) b) ; 注意,Subst函数把子表当成主表的一个元素来处理(subst qq b sample) ;

27、返回 (A QQ (B C) QQ)与Assoc函数连用,Subst函数可以方便地替换关联表中与某关键字相关的值,例如:(setq sample (0 . CIRCLE) (8 . 0) (10 100.0 120.0 0.0)(setq old (assoc 8 sample)(setq new (8 . LAYER1)(subst new old sample); 把sample表中的 (8 . 0) 替换为 (8 . LAYER1) (foreach name expr1 expr2 )该函数将遍历,将中每一个元素依次赋给name,并依次对表达式expr1,expr2, 求值,函数将返回

28、最后一个expr表达式的结果。例如:(foreach n (x y z) (princ n) ; 等价于 (princ x) (princ y) (princ z) ,返回z3.8 字符串处理函数 (strcat str1 str2 )该函数返回一个字符串,它是字符串str1、str2、 连接起来的。如果没有参数,则返回空字符串。如:(strcat AutoLISP for AutoCAD) 返回AutoLISP for AutoCAD。 (strlen str1 str2 )该函数返回字符串中字符的个数(不包括双引号),返回值为整数。如果字符串有多个,则返回各字符串的总长度。例如:(strl

29、en ) ; 返回0(strlen AutoLISP for AutoCAD); 返回183.9 交互式数据输入函数交互式数据输入函数是AutoLISP提供的、用户向AutoLISP程序输入数据的接口。这类函数执行时使机器暂停下来,等待用户按提示输入数据。这类函数有时统称为GetXXX函数。 (getint msg) 和和 (getreal msg)函数执行时系统暂停,等待用户输入数据。参数msg为提示字符串,将出现在命令行中(如果有的话)。Getint函数要求用户输入整数,并返回该整数;Getreal函数可输入实数或整数,但返回实数。提示字符串msg中允许使用控制字符。例如:(setq nu

30、m (getint);要求用户输入一个整数,但命令行没有提示,整数将赋给num(setq num (getint n请输入一个整数:)(setq val (getreal n请输入一个实数:) (getstring cr msg)函数等待用户输入一个字符串并返回该字符串。如果提供了参数cr并且其值不为nil,则输入的字符串可以包含空格且必须以Enter键结束;否则,输入的字符串以空格或Enter键结束。参数msg为提示字符串,将出现在命令行中(如果有的话)。Getstring函数能接受的字符串的最大长度为132个字符,如果输入超过132个,则仅返回前面132个字符。例如:(setq str1

31、(getstring T n请输入你的学号:) (getpoint pt msg) (getcorner pt msg) (getdist pt msg)这三个函数操作方式相似,参数pt为基点(二维点或三维点),参数msg为提示字符串。Getpoint函数让用户输入一个点并返回该点的坐标值(x y z),如果提供了基点pt,系统会从pt点到当前十字光标画一条橡皮线以提示用户选择点。Getcorner函数与Getpoint函数类似,也返回点的坐标值,但Getcorner函数必须提供参数pt作为基点,系统会从基点到当前十字光标画一个矩形以提示用户选择点。Getdist函数等待用户输入一个距离(即一

32、个实数)。用户可以通过选择两个点来指定距离,如果提供了基点pt,用户只需输入第二点即可计算出距离值。Getdist函数会从pt点画一条橡皮线以帮助用户确定距离,并总是以实数形式返回距离值。例如:(setq pt1 (getpoint n请输入第一点的位置:)(setq pt2 (getcorner pt1 n请输入下一点的位置:)(setq dist (getdist pt2 n选择点以确定距离:) (getangle pt msg)该函数等待用户输入一个角度(以度为单位),返回角度的弧度值。参数pt为基点,参数msg为提示信息(字符串)。响应该函数,用户可以直接输入一个角度值,也可以输入两个

33、点,函数将计算两点连线的倾斜角度并返回,如果提供了基点pt,只需输入第二点即可。在该函数中,角度的测量计算是以系统变量ANGBASE的当前设置为零弧度按逆时针方向来测量的(忽略系统变量ANGDIR的设置)。例如:(setq ang (getangle)(setq pt1 (getpoint n请输入基点的位置:)(setq ang (getangle pt1 n请输入角度方向的另一点:) (getorient pt msg)该函数的功能与Getangle函数类似,不同之处在于该函数返回的弧度值不受系统变量ANGBASE和ANGDIR的影响,始终以水平右手方向为零弧度,按逆时针方向来测量。3.1

34、0 打印输出函数 (prompt msg)该函数在该函数在AutoCAD文本窗口中显示一个字符串,用作提示信息。参文本窗口中显示一个字符串,用作提示信息。参数数msg为字符串。函数承认字符串中的控制字符,并总是返回为字符串。函数承认字符串中的控制字符,并总是返回nil。 (princ expr file-desc) (print expr file-desc) (prin1 expr file-desc)这些函数在命令行打印一个表达式的值(没有指定这些函数在命令行打印一个表达式的值(没有指定file-desc时)或将时)或将该表达式的值写入一个已打开的文件中(指定该表达式的值写入一个已打开的文

35、件中(指定file-desc时)。参数时)。参数expr为将要打印的表达式,参数为将要打印的表达式,参数file-desc是一个以写方式打开的文件是一个以写方式打开的文件描述符。函数返回表达式的值。例如:描述符。函数返回表达式的值。例如:(setq a (+ 1 3)(princ a) ; 打印表达式的值打印表达式的值4,返回表达式的值,返回表达式的值4(print a) ; 换行打印表达式的值换行打印表达式的值4,再加一空格,返回表达式,再加一空格,返回表达式的值的值4(prin1 a) ; 打印表达式的值打印表达式的值4,返回表达式的值,返回表达式的值4。 Princ函数和Prin1函数直

36、接打印表达式的值,而Print函数在打印表达式的值之前先打印一个空行,打印表达式之后增加打印一个空格。对于字符串型表达式,Princ函数显示的字符串不带双引号,而Print和Prin1函数显示的字符串都带有双引号。如果字符串中有控制字符(见表5-2),Princ函数将按照控制来打印字符串,而Print和Prin1函数将不承认控制字符并把它原样打印出来。例如:(setq str The allowable tolerance is n0.25)(prompt str); 打印 The allowable tolerance is ; 换行0.25 并返回nil(princ str) ; 打印 T

37、he allowable tolerance is; 换行 0.25,并返回str的值(print str); 打印空行; 打印 The allowable tolerance is n0.25,并返回str的值(prin1 str) ; 打印 The allowable tolerance is n0.25,并返回str的值一般在程序的最后加一个无参数的打印函数语句,如 (princ),表示程序静默退出,相当于其他语言中的Return语句。 (terpri)换行函数,在命令行上输出一个换行符,功能和 (princ n) 相同,返回值为nil。3.11 Command函数Command函数用来

38、在AutoLISP程序中调用AutoCAD命令,并响应命令进行操作。利用该函数可以实现图形的绘制和编辑等AutoCAD命令,使编写图形处理程序变得相当方便。Command函数的格式为:(command arguments )其中arguments参数表表示要执行的AutoCAD命令名和所需要的响应,可以是字符串、实数、整数或点,但必须与要执行的命令所需要的参数一致。一般来说,arguments参数表的第一个参数是AutoCAD命令名,后跟该命令执行时所需要的参数,参数与参数之间用空格分开。 例如,在AutoCAD中运行画圆命令,步骤为:命令: _circle指定圆的圆心或 三点(3P)/两点(

39、2P)/相切、相切、半径(T): 10,10指定圆的半径或 直径(D): 25画圆命令结束,把上述步骤写成Command函数,语句为:(command _circle 10,10 25)其中,_circle对应命令名,10,10对应圆心点,25对应半径,实现对画圆命令的响应。在Command函数中,命令执行所需的数据也可用相应类型的变量来响应,上述画圆的语句可以写成:(setq pt (10 10)(setq r1 25)(command _circle pt r1)结果是一样的。(1)AutoCAD命令及其选项用字符串表示,大小写均可。如:(command _circle 10,10 d 5

40、0) 和 (command _CIRcle 10,10 D 50) 是一样的。(2)数值常量(整数或实数)可以写数的本身,也可以写成字符串形式。如:(command _circle 10,10 25) 也可以写成 (command _circle 10,10 25)。(3)对于点的响应,有三种方式:表、字符串或变量,例如:(command _circle (10 10) 25) 与 (command _circle 10,10 25) 与 (setq pt (10 10) (command _circle pt 25) 是等价的。(4)Command函数的参数中,空字符串()等效于键盘上按一次

41、空格键。若没有参数而调用Command函数,相当于ESC键,可取消大多数AutoCAD命令。(5)一个Command函数可以执行多个AutoCAD命令。一条AutoCAD命令可由多个Command函数来完成,中间可以插入其他AutoLISP语句。 3.12 存取AutoCAD系统变量值函数在AutoCAD中,可以很方便地查看或修改系统变量的值,只要在命令行中输入系统变量的名称就可以完成操作,这也使得可以利用Command函数来修改系统变量的值。除此之外,AutoLISP还提供了专门用来存取系统变量值的函数:Getvar函数和Setvar函数。 Getvar函数格式:(getvar VarNam

42、e)Getvar函数用于获取AutoCAD系统变量的当前值,其中,参数VarName为系统变量的名称,其字符大小写均可。若VarName是一个合法的系统变量名,Getvar函数将返回该系统变量的当前值,否则返回nil。例如,系统变量CMDECHO控制AutoLISP的command函数运行时AutoCAD是否回显提示和输入,CMDECHO有两个值0和1,0表示关闭回显,1表示打开回显。得到CMDECHO的当前值,语句如下:(setq CurVal (getvar CMDECHO); 变量CurVal = CMDECHO的当前值 Setvar函数格式:(setvar VarName value)

43、Setvar函数用于设置AutoCAD系统变量的新值,其中,参数VarName为系统变量的名称,参数value为所设置的新值。Setvar函数将value值设置给系统变量VarName,并返回该新值。Getvar函数一般和Setvar函数联用,实现用户的意图,例如,在运行command函数时,想要避免在命令行中出现回显,但又不想修改原来的设置,可在程序中加入以下语句:(setq CurVal (getvar CMDECHO); 变量CurVal记下CMDECHO的当前值(setvar CMDECHO 0) ; 设置CMDECHO的值为0,关闭回显 ; 程序体,包含command函数(setva

44、r CMDECHO CurVal) ; 恢复CMDECHO的原始值3.13 自定义函数和子程序(1)自定义函数Defun函数格式:(defun (实参变量名表 / 局部变量名表 ) )其中,为一字符串,以后要调用此函数就通过来调用。自定义函数名不要与内部函数重名。函数名后边是圆括号“()”,括号内的变量名表分为两部分,用“/”隔开,前半部分为实参变量名表,是函数的实参,实现参数的传递;后半部分为局部变量名表,其内的局部变量仅在函数内部使用,与函数外部没有任何联系。变量名表中的变量,无论“/”号前还是“/”号后的均为局部变量(约束变量),只在函数执行过程中有值,等函数执行完毕,所有的局部变量均置

45、为nil(空),不占内存。凡是在变量名表中未出现的其他变量均为全局变量(自由变量),它们在函数执行过后,仍在内存中保存其值。变量名表中的各项要用空格分开,尤其要注意“/”号前后必须有空格。变量名表可以没有,可以只有实参变量名表(此时“/”号不写),也可以只有局部变量名表(此时“/”号不能省略)。例如:(defun myfunc (x y) ); myfunc函数有两个实参(defun myfunc (/ a b) ) ; myfunc函数有两个局部变量(defun myfunc (x / temp) ); myfunc函数有一个实参,一个局部变量(defun myfunc ( ) ); myf

46、unc函数没有变量都是合法的定义方式。Defun函数返回最后一个表达式的值,供其他程序使用。例5-5:计算两点连线的斜率,程序可存为Sam5_5.lsp,函数名为slope。(defun slope (pt1 pt2 / x1 y1 x2 y2) (if (or (null (cdr pt1) (null (cdr pt2) nil ; 如果参数有错误返回nil (progn (setq x1 (car pt1) (setq y1 (cadr pt1) (setq x2 (car pt2) (setq y2 (cadr pt2) ; 坐标值乘1.0的目的是保证坐标值为实数 (if ( (abs

47、 (- (* 1.0 x1) x2) 0.0001) 斜率无穷大(/ (- (* 1.0 y2) y1) (- (* 1.0 x2) x1) ); If函数结束 ); Progn函数结束 ); 外层If函数结束); 自定义函数结束在AutoCAD中加载该程序Sam5_5.lsp,在命令行输入 (slope (1 2) (5 6),返回1.0。(2)定义AutoCAD命令格式:(defun C:XXX ( / 局部变量名表 ) )其中,函数名称的形式必须为“C:XXX”,XXX部分就是子定义命令的名称,并且“C:”和“XXX”之间不能有空格。命令的名称最好不要和AutoCAD已有命令的名称重复。

48、该函数不能带有实参变量名表,但可以含有局部变量,以“/”号为标记。例如:(defun c:mycomm ( ) ) ; 命令名为mycomm,无局部变量(defun c:mycomm (/ a b) ) ; 命令名为mycomm,有两个局部变量都是合法的定义方式。例例5-6:绘制心形图案,程序可存为:绘制心形图案,程序可存为Sam5_6.lsp,命令名为,命令名为heart。(defun c:heart() (setq val_1 (getvar CMDECHO) (setvar CMDECHO 0) (setq ptBase (getpoint n请指定心形图案的中心:) (setq rad

49、ius (getdist ptBase n请输入心形图案的半径:) (setq num (getint n请给出叠加次数(整数):) (setq afBase (/ (* 2.0 pi) num) afi 0) ; 角度初始化 (setq index 1) ; 循环量初始化 (while (= index num); 计算圆心 (setq xVal (+ (* radius (cos afi) (car ptBase) yVal (+ (* radius (sin afi) (cadr ptBase) (setq ptCen (list xVal yVal); 计算半径 (setq xTemp

50、 (* radius (cos afi) yTemp (- radius (* radius (sin afi) (setq rTemp (sqrt (+ (* xTemp xTemp) (* yTemp yTemp); 画圆 (command _circle ptCen rTemp); 角度和循环量递增 (setq afi (* afBase index) (setq index (1+ index) ) (setvar CMDECHO val_1) (princ)(3)子程序AutoLISP程序中可以定义多个自定义函数,这些函数之间相互调用,就产生了子程序。子程序的定义是通过Defun函数

51、实现的,其调用方式与AutoLISP的内部函数完全相同。下面的例子演示了子程序的定义和调用。例5-7:程序要求用户输入两个点,计算两点连线的斜率,程序文件名为Sam5_7.lsp,命令名为Cal_k。本程序把计算斜率的函数slope作为子程序。; 主程序开始(defun c:Cal_k() (setq ptFst (getpoint n请输入第一点:) (setq ptSnd (getpoint ptFst n请输入第二点:) (setq kVal (slope ptFst ptSnd) ; 调用子程序 (slope ptFst ptSnd) (print kVal); 打印结果 (princ

52、); 主程序结束; 子程序开始(defun slope (pt1 pt2 / x1 y1 x2 y2) (if (or (null (cdr pt1) (null (cdr pt2) nil (progn (setq x1 (car pt1) (setq y1 (cadr pt1) (setq x2 (car pt2) (setq y2 (cadr pt2) (if ( (abs (- (* 1.0 x1) x2) 0.0001) 斜率无穷大(/ (- (* 1.0 y2) y1) (- (* 1.0 x2) x1) ) ) ) ; 子程序结束在主程序中,语句 (setq kVal (slop

53、e ptFst ptSnd) 调用了计算斜率的子程序slope函数,并把返回值赋给变量kVal,然后打印显示斜率的值。子程序的调用和普通函数的调用方式是一样的。3.14 参数化编程实例参数化编程,就是根据用户输入的位置和尺寸,自动绘制出相应的图形。参数化编程的优点是操作非常方便,用户只需要向程序提供一些初始参数,绘图操作交给计算机来做。参数化编程通常适用于结构固定的系列化产品,如标准件和结构不变的常用零件。因为AutoLISP具有强大的图形处理功能,所以用AutoLISP可以方便地实现图形参数化编程。参数化编程的一般步骤是:(1)图形分析。分析图形的几何关系和变化,确定如何能最方便地画出图形。

54、(2)输入参数分析。分析需要输入什么参数就能完全确定图形,建立参数和图形之间关系的数学模型。(3)编写调试图形程序,直到程序运行正确。参数化编程的一般功能模块参数化程序的一般功能模块如下:(1)参数输入模块,提示用户输入所需要的结构参数,一般是定位点和尺寸。(2)图形数据计算模块,根据输入参数和数学模型计算出图形中每一个图素的绘制所需要的数据。(3)绘图模块,画出各个图素。各模块之间有先后顺序,如图5-7所示。图5-7 参数化程序结构图例5-8:参数化编程,图形为轴键槽剖面图,如图5-8(a)所示,程序文件名为Sam5_8.lsp,命令名为bond。图5-8 轴键槽剖面图分析(a)(b)(c)

55、(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

56、, 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)程序设计)程序设计(defun c:bond() (setq val_1 (getvar CMDECHO) (setvar CMDECHO 0) (setq P0 (getpoint n请输入定位点:) (setq Dia (getdist P0

57、n轴径:) (setq Alf (getangle P0 n倾斜角:) (setq Wid (getreal n键槽宽:) (setq Depth (getreal n键槽深度尺寸:) (setq radius (/ Dia 2.0) B1 (/ Wid 2.0) (setq L1 (sqrt (- (* radius radius) (* B1 B1) (setq Sit (atan (/ B1 L1) (setq P1 (polar P0 (+ Alf Sit) radius) (setq P2 (polar P0 (+ Alf pi) radius) (setq P3 (polar P0 (- Alf Sit) radius) (setq P4 (polar P3 (+ Alf pi) (- (+ L1 radius) Depth) (setq P5 (polar P1 (+ Alf pi) (- (+ L1 radius) Depth) (command _arc P1 P2 P3) (command _line P3 P4 P5 P1 ) (setvar CMDECHO val_1) (princ)(4)加载并运行程序,根据提示输入参数,程序将自动绘制出轴键槽剖面图。结束结束

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 资格认证/考试 > 自考

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号