判断式、循环操作
本章正式开始进入AutoLisp劝退环节,这一章,我们将详细得介绍AutoLisp中的判断式和循环操作。
一、AutoLisp判断式
1、函数(if)
功能重点:检验判断式的结果,如果为T执行表达式1;否则执行表达式2。若表达式超过一行,则务必配合progn函数连接为一组。
函数 | 函数说明 |
---|---|
(if testexpr thenexpr [elseexpr]) | 根据对条件的判断结果,对两个表达式求值。 |
2、参数
参数 | 说明 |
---|---|
testexpr | 判断式,用于执行判断的式子,返回值为T或nil。 |
thenexpr | 表达式1,如果判断式返回T,则执行该表达式。 |
elseexpr | 表达式2,如果判断式返回nil,则执行该表达式。 |
3、返回值
if函数返回选定表达式的值。如果未指定elseexpr且 testexpr为nil,则if返回nil。
4、代码示例
判断用户输入的两个整数值的大小关系
(setq #iNum1 (getint "\n请输入第一个整数:")
#iNum2 (getint "\n请输入第二个整数:"))
(if (> #iNum1 #iNum2)
(princ "#iNum1 > #iNum2")
(princ "#iNum1 <= #iNum2")
) ;if
上述代码中的if判断式中并没有过于复杂的逻辑,但是在实际应用中,我们可能需要在同一个表达式中执行很多的操作,这时候我们就需要使用progn函数将多个表达式合并成一个表达式来执行。例如下面的例子:
根据用户输入绘制圆形,如果用户输入有效则绘制并输出绘制成功信息,反之,输出错误信息,并弹框提示。
(defun C:DrawCircle(/ #ptCenter #dRadius)
(setq #ptCenter (getpoint "\n请指定圆心:")
#dRadius (getreal "\n请指定半径:"))
(if (> #dRadius 0)
(progn
(command "circle" #ptCenter #dRadius "")
(princ "成功绘制圆形。")
);progn
(progn
(alert "半径不合法!")
(princ "绘制圆形失败。")
);progn
);if
)
二、AutoLisp重复函数
1、函数(repeat)
功能重点:重复执行N次循环内的表达式。
函数 | 说明 |
---|---|
(repeat int [expr…]) | 对循环体中的每一个表达式进行指定次数的求值计算,并返回最后一个表达式的值。 |
2、参数
参数 | 说明 |
---|---|
int | 正整数。表示循环的重复次数。 |
expr | 一个或多个原子或表达式。 |
3、返回值
最后一个计算的原子或表达式的值。如果未提供 expr 参数,repeat 返回 nil。
4、代码示例
求1+2+3+4+…+100的值。
(defun C:CalSum(/ #iTemp #iSumAll)
(setq #iTemp 1
#iSumAll 0)
(repeat 100
(setq #iSumAll (+ #iSumAll #iTemp)
#iTemp (1+ #iTemp))
);repeat
(princ "1+2+3+...+100 = ")
(princ #iSumAll)
(princ)
)
三、AutoLisp循环函数
1、函数(while)
功能重点:当判断式结果为T时,执行循环内的表达式,直到判断结果为nil。如果判断式结果始终为T,则为死循环。
函数 | 说明 |
---|---|
(while testexpr [expr…]) | 对测试表达式进行求值,如果它不是 nil,则执行循环体中的表达式,重复这个过程,直到测试表达式的求值结果为 nil。 |
2、参数
参数 | 说明 |
---|---|
testexpr | 包含测试条件的表达式。 |
expr | 在 testexpr 为 nil 之前要求值的一个或多个表达式。 |
3、返回值
最后的 expr 表达式最新的值。
4、代码示例
求1+2+3+4+…+100的值。
(defun C:CalSum(/ #iTemp #iSumAll)
(setq #iTemp 1
#iSumAll 0)
(while (<= #iTemp 100)
(setq #iSumAll (+ #iSumAll #iTemp)
#iTemp (1+ #iTemp))
);while
(princ "1+2+3+...+100 = ")
(princ #iSumAll)
(princ)
)
四、AutoLisp多条件式的if整合功能函数
1、函数(cond)
功能重点:多条件式的if整合功能,由上而下逐一比较,执行其中之一。当某一判断式成立的时候,执行对应的表达式。如果判断式皆不成立且有T值存在,则执行T值之后的表达式。
函数 | 说明 |
---|---|
(cond [(test result …) …]) | cond 函数的参数可以为任意数目的表。它按顺序对每一个表的第一项求值,直到其中之一的返回值不是 nil 为止。该函数接着对该项后续的其他表达式求值。 |
2、返回值
被执行的结果处理表达式中最后一个表达式的值。如果子表中只有一个表达式(即 result 不存在),则返回 test
的值。如果未指定参数,cond 返回 nil。
3、代码示例
实现程序,根据用户输入A0、A1、A2、A3、A4之后绘制出指定图框大小的矩形。
(defun C:InitPaperSet(/ #strPaperSet #ptStart #ptEnd)
(setq #strPaperSet (getstring "\n请输入图纸大小(A0/A1/A2/A3/A4)<A3>:"))
(if (= #strPaperSet "")
(setq #strPaperSet "A3")
);if
(setq #strPaperSet (strcase #strPaperSet)) ;; 统一转换为大写
(cond
((= #strPaperSet "A0") (setq #ptEnd (list 1189 841 0)))
((= #strPaperSet "A1") (setq #ptEnd (list 841 594 0)))
((= #strPaperSet "A2") (setq #ptEnd (list 594 420 0)))
((= #strPaperSet "A3") (setq #ptEnd (list 420 297 0)))
((= #strPaperSet "A4") (setq #ptEnd (list 297 210 0)))
(T nil)
);cond
(setq #ptSatrt (list 0 0 0))
(command "rectang" #ptSatrt #ptEnd)
(command "zoom" "A")
(princ)
)