AutoLisp从入门到放弃(十六)


本章正式开始进入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)
)
  • 7
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值