AutoCAD-AutoLISP基本函数.ppt_第1页
AutoCAD-AutoLISP基本函数.ppt_第2页
AutoCAD-AutoLISP基本函数.ppt_第3页
AutoCAD-AutoLISP基本函数.ppt_第4页
AutoCAD-AutoLISP基本函数.ppt_第5页
已阅读5页,还剩60页未读 继续免费阅读

下载本文档

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

文档简介

AutoCAD高级培训教程之二 AutoCAD应用开发,第三部分 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函数,并对这些函数做适当的组合和编排,就可以编写一个AutoLISP程序,来完成用户的特定的操作。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的整型数。取整过程是直接截断x的小数部分,而非四舍五入。例如:(fix 3.7) 返回3。 (rtos number mode precision ) 实型格式化函数rtos,该函数把实型数number(也可为整型数)按照指定的模式mode和精度precision转换成字符串。中括号“ ”内的参数可以不写。 参数number可以是整型或实型常量、变量或表达式。,参数mode为线性单位的格式编码,与AutoCAD的线性格式相对应,具体对应关系如表5-4所示。如果没有指定mode的值,将采用系统变量LUNITS的值来指定当前的线性单位格式。 表5-4 rtos函数中mode的值与线性单位格式的对应关系,参数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 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可以是整型或实型常量、变量或表达式。 参数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) 字符串转换为实型,string为字符串。例如:(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的值。 (log 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轴正向之间的夹角,是从当前构造平面的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) 极坐标函数,求点坐标,已知一点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(真值),则两条直线段不延长,那么对于图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,否则为假,返回值为nil。如果函数仅有一个参数,则返回真。如果没有参数,则提示出错。其中,参数的类型为整型、实型或字符串型。例如:(= 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 是否成立。若每个参数值都大于它右边的参数值,则返回T,否则返回nil。如果函数仅有一个参数,则返回T。如果没有参数,则提示出错。例如:( 12 13) 返回nil,( “abd“ “abc“) 返回T。 (= x1 x2 ) 大于等于函数,用法同大于函数,只是进行的是大于等于判断。 ( x1 x2 ) 小于函数,判断x1 x2 是否成立。若每个参数值都小于它右边的参数值,则返回T,否则返回nil。如果函数仅有一个参数,则返回T。如果没有参数,则提示出错。例如:( 12 13) 返回T,( “abc“ “abd“) 返回T。, (= x1 x2 ) 小于等于函数,用法同小于函数,只是进行的是小于等于判断。 (equal expr1 expr2 fuzz ) 判断两个表达式的值是否相同,可以完成表的比较。参数expr1和expr2是用于比较的表达式,参数fuzz为实数,用于定义expr1和expr2之间最大允许误差。如果两表达式相等或两者相差在参数fuzz的范围内,认为两者相等,返回T,否则返回nil。如果不提供参数fuzz,则系统默认误差值为0。 例如:在命令行输入 命令: (setq exp1 (x y z) exp2 (x y z) (X Y Z) 命令: (setq exp3 exp2) (X Y Z) 命令: (equal exp1 exp3) T 命令: (setq x1 8.00004 x2 8.00005) 8.00005 命令: (equal x1 x2 0.00001) T 命令: (equal x1 x2) nil,(2)逻辑函数, (and expr1 expr2 expr3 ) AND函数,用于表达式的“逻辑与”运算,参数expr1,expr2, 为AutoLISP表达式。只有当所有参数的值都不为空时,函数才返回真(T);只要有一个参数的值为空(nil),函数就停止求值并返回假(nil);如果不提供参数而调用该函数也返回真(T)。 例如: (setq a 103 b nil c “string“) ; a = 103 b = 0 c = “string“ (and 1.4 a c) ; 返回T (and 1.4 a b c) ; 返回nil,因为b = 0 (or expr1 expr2 expr3 ) OR函数,用于表达式的“逻辑或”运算,参数expr1,expr2, 为AutoLISP表达式。在所有参数中,只要有一个值为非空(T),则函数就停止求值并返回真(T);只有当所有参数的值都为空(nil)时,才返回假(nil);如果不提供参数而调用该函数也返回假(nil)。 例如: (or nil 45 ( ) ; 返回T (or nil ( ) ; 返回nil, (not item) NOT函数,用于表达式的“逻辑非”运算,为单目运算符,参数item仅有一个,是一个AutoLISP表达式。当参数item的值为空(nil)时,函数返回非空(T);参数的值为非空(T)时,返回空(nil);如果不提供参数而调用该函数将提示出错。 例如: (setq a 123 b “string“ c nil) ; a = 123 b = “string“ c = 0 (not a) ; 返回nil (not b) ; 返回nil (not c) ; 返回T (not ( ) ; 返回T (null item) NULL函数,测试参数表达式是否为空。NULL函数与NOT函数的功能基本相同,不同之处在于,NULL函数一般用于表(也可用于其他数据类型),而NOT函数可用于所有数据类型。 例如: (null ( ) ; 返回T (null (x y z) ; 返回nil,3.5 条件分支函数,条件分支函数可以实现程序的流程控制,判断条件是否成立,根据不同的条件,选择不同的操作。AutoLISP提供了下列一些条件分支函数。 (if testexpr thenexpr elseexpr) 条件函数,根据条件是否成立,选择执行不同的语句。其中testexpr为条件表达式,如果条件为真(T),则执行第一个表达式thenexpr,如果条件为假(nil),则执行第二个表达式elseexpr。 例如: (if (= 2 (+ 3 4) “YES!“ “no.“) ; 返回“no.“ 下列语句把变量x、y中的较大值赋给变量z (setq x 8.9 y 9.0) (if ( x y) (setq z x) (setq z y), (progn expr1 expr2 ) 顺序控制函数,按顺序对表达式进行求值,先执行表达式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) ; 判别式judge (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中加载该程序后,在命令行中输入 (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 ) ) 分支函数,参数由表构成,数目任意,每个参数表的第一项是条件表达式,后续各项是要求值的表达式。该函数按照顺序检查各条件是否成立,然后执行第一个条件成立的那一组表达式,并返回该组中最后一个表达式的值。一旦有一个条件已经成立,将不再对后面的条件进行处理。 分支函数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 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) ) 运算结果显示为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+ 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 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) (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函数和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 = 12.0 (setq z (caddr point) ; 得到点的Z坐标,z = 13.0 Car和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 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 = nil Assoc函数一般用来检索实体的数据(DXF组码),在5.4.4实体数据处理一节中将有详细介绍。 (length ) Length函数返回的长度,为一整型数。例如:(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) ; 返回 (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, 求值,函数将返回最后一个expr表达式的结果。例如: (foreach n (x y z) (princ n) ; 等价于 (princ x) (princ y) (princ z) ,返回z,3.8 字符串处理函数, (strcat str1 str2 ) 该函数返回一个字符串,它是字符串str1、str2、 连接起来的。如果没有参数,则返回空字符串。如:(strcat “AutoLISP“ “ for“ “ AutoCAD“) 返回“AutoLISP for AutoCAD“。 (strlen str1 str2 ) 该函数返回字符串中字符的个数(不包括双引号),返回值为整数。如果字符串有多个,则返回各字符串的总长度。例如: (strlen “) ; 返回0 (strlen “AutoLISP“ “for“ “AutoCAD“) ; 返回18,3.9 交互式数据输入函数,交互式数据输入函数是AutoLISP提供的、用户向AutoLISP程序输入数据的接口。这类函数执行时使机器暂停下来,等待用户按提示输入数据。这类函数有时统称为GetXXX函数。 (getint msg) 和 (getreal msg) 函数执行时系统暂停,等待用户输入数据。参数msg为提示字符串,将出现在命令行中(如果有的话)。Getint函数要求用户输入整数,并返回该整数;Getreal函数可输入实数或整数,但返回实数。提示字符串msg中允许使用控制字符。例如: (setq num (getint) ;要求用户输入一个整数,但命令行没有提示,整数将赋给num (setq num (getint “n请输入一个整数:“) (setq val (getreal “n请输入一个实数:“), (getstring cr msg) 函数等待用户输入一个字符串并返回该字符串。如果提供了参数cr并且其值不为nil,则输入的字符串可以包含空格且必须以Enter键结束;否则,输入的字符串以空格或Enter键结束。参数msg为提示字符串,将出现在命令行中(如果有的话)。 Getstring函数能接受的字符串的最大长度为132个字符,如果输入超过132个,则仅返回前面132个字符。 例如:(setq str1 (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函数等待用户输入一个距离(即一个实数)。用户可以通过选择两个点来指定距离,如果提供了基点pt,用户只需输入第二点即可计算出距离值。Getdist函数会从pt点画一条橡皮线以帮助用户确定距离,并总是以实数形式返回距离值。 例如:(setq pt1 (getpoint “n请输入第一点的位置:“) (setq pt2 (getcorner pt1 “n请输入下一点的位置:“) (setq dist (getdist pt2 “n选择点以确定距离:“), (getangle pt msg) 该函数等待用户输入一个角度(以度为单位),返回角度的弧度值。参数pt为基点,参数msg为提示信息(字符串)。响应该函数,用户可以直接输入一个角度值,也可以输入两个点,函数将计算两点连线的倾斜角度并返回,如果提供了基点pt,只需输入第二点即可。在该函数中,角度的测量计算是以系统变量ANGBASE的当前设置为零弧度按逆时针方向来测量的(忽略系统变量ANGDIR的设置)。 例如: (setq ang (getangle) (setq pt1 (getpoint “n请输入基点的位置:“) (setq ang (getangle pt1 “n请输入角度方向的另一点:“) (getorient pt msg) 该函数的功能与Getangle函数类似,不同之处在于该函数返回的弧度值不受系统变量ANGBASE和ANGDIR的影响,始终以水平右手方向为零弧度,按逆时针方向来测量。,3.10 打印输出函数, (prompt msg) 该函数在AutoCAD文本窗口中显示一个字符串,用作提示信息。参数msg为字符串。函数承认字符串中的控制字符,并总是返回nil。 (princ expr file-desc) (print expr file-desc) (prin1 expr file-desc) 这些函数在命令行打印一个表达式的值(没有指定file-desc时)或将该表达式的值写入一个已打开的文件中(指定file-desc时)。参数expr为将要打印的表达式,参数file-desc是一个以写方式打开的文件描述符。函数返回表达式的值。例如: (setq a (+ 1 3) (princ a) ; 打印表达式的值4,返回表达式的值4 (print a) ; 换行打印表达式的值4,再加一空格,返回表达式的值4 (prin1 a) ; 打印表达式的值4,返回表达式的值4。,Princ函数和Prin1函数直接打印表达式的值,而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) ; 打印 The “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函数用来在AutoLISP程序中调用AutoCAD命令,并响应命令进行操作。利用该函数可以实现图形的绘制和编辑等AutoCAD命令,使编写图形处理程序变得相当方便。 Command函数的格式为: (command arguments ) 其中arguments参数表表示要执行的AutoCAD命令名和所需要的响应,可以是字符串、实数、整数或点,但必须与要执行的命令所需要的参数一致。一般来说,arguments参数表的第一个参数是AutoCAD命令名,后跟该命令执行时所需要的参数,参数与参数之间用空格分开。,例如,在AutoCAD中运行画圆命令,步骤为: 命令: _circle 指定圆的圆心或 三点(3P)/两点(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“ 50) 和 (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函数的参数中,空字符串(“)等效于键盘上按一次空格键。若没有参数而调用Command函数,相当于ESC键,可取消大多数AutoCAD命令。 (5)一个Command函数可以执行多个AutoCAD命令。一条AutoCAD命令可由多个Command函数来完成,中间可以插入其他AutoLISP语句。,3.12 存取AutoCAD系统变量值函数,在AutoCAD中,可以很方便地查看或修改系统变量的值,只要在命令行中输入系统变量的名称就可以完成操作,这也使得可以利用Command函数来修改系统变量的值。除此之外,AutoLISP还提供了专门用来存取系统变量值的函数:Getvar函数和Setvar函数。, Getvar函数,格式:(getvar VarName) 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) Setvar函数用于设置AutoCAD系统变量的新值,其中,参数VarName为系统变量的名称,参数value为所设置的新值。Setvar函数将value值设置给系统变量VarName,并返回该新值。 Getvar函数一般和Setvar函数联用,实现用户的意图,例如,在运行command函数时,想要避免在命令行中出现回显,但又不想修改原来的设置,可在程序中加入以下语句: (setq CurVal (getvar “CMDECHO“) ; 变量CurVal记下CMDECHO的当前值 (setvar “CMDECHO“ 0) ; 设置CMDECHO的值为0,关闭回显 ; 程序体,包含command函数 (setvar “CMDECHO“ CurVal) ; 恢复CMDECHO的原始值,3.13 自定义函数和子程序,(1)自定义函数Defun函数 格式:(defun (实参变量名表 / 局部变量名表 ) ) 其中,为一字符串,以后要调用此函数就通过来调用。自定义函数名不要与内部函数重名。 函数名后边是圆括号“()”,括号内的变量名表分为两部分,用“/”隔开,前半部分为实参变量名表,是函数的实参,实现参数的传递;后半部分为局部变量名表,其内的局部变量仅在函数内部使用,与函数外部没有任何联系。 变量名表中的变量,无论“/”号前还是“/”号后的均为局部变量(约束变量),只在函数执行过程中有值,等函数执行完毕,所有的局部变量均置为nil(空),不占内存。凡是在变量名表中未出现的其他变量均为全局变量(自由变量),它们在函数执行过后,仍在内存中保存其值。,变量名表中的各项要用空格分开,尤其要注意“/”号前后必须有空格。 变量名表可以没有,可以只有实参变量名表(此时“/”号不写),也可以只有局部变量名表(此时“/”号不能省略)。例如: (defun myfunc (x y) ) ; myfunc函数有两个实参 (defun myfunc (/ a b) ) ; myfunc函数有两个局部变量 (defun myfunc (x / temp) ) ; myfunc函数有一个实参,一个局部变量 (defun myfunc ( ) ) ; myfunc函数没有变量 都是合法的定义方式。 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 (- (* 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已有命令的名称重复。 该函数不能带有实参变量名表,但可以含有局部变量,以“/”号为标记。例如: (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 radius (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 (* 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函数实现的,其调用方式与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) ) ; 主程序结束,; 子程序开始 (defun slope (pt1 pt2 / x1 y1 x2 y2)

温馨提示

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

评论

0/150

提交评论