77077 发表于 2014-7-21 09:30:19

写给新手的while循环,欢迎高手继续完善~~~

本帖最后由 77077 于 2014-7-21 09:32 编辑

本人也是新手,来这里做点学习笔记~
前段时间有人问循环问题,这里我发一个while循环,欢迎大家一起来讨论,也不知道我这样说,算说清楚了没!!
(defun c:tt( / 循环标记 en)
(setq 循环标记 T);程序开始时,咱暂时假定需要循环
(while 循环标记;循环标记为T,执行以下代码
   (if (setq en (entsel "\n点选物件"))
       (progn   ;选到物件时,执行
          (princ (entget(car en)));举例:输出DXF
          ;还有其它要说的,在这里添加即可
      )
   (setq 循环标记 nil);没选到物体时,设定循环标记为nil,退出循环
   )
)
)

langjs 发表于 2014-7-21 10:43:52

可以精简一下实现同样功能
(defun c:tt ( / en)
(while (not (setq en (entsel "\n点选物件"))))
(entget (car en))
)

77077 发表于 2014-7-21 10:56:37

本帖最后由 77077 于 2014-7-21 11:03 编辑

是啊,梁大师这个减少了很多不必要的运算,速度应该提升不少~~~多谢
不过大师,没循环起来啊~~

llsheng_73 发表于 2014-7-21 11:49:50

(while(setq en(car(entsel "\n点选物件")))
    (princ(entget en))
)

其实楼主对while的解释相当准确,只是while它本身会先对循环条件进行检查,所以有时可以利用这点去掉多余的if条件判断

langjs 发表于 2014-7-21 12:40:08

本帖最后由 langjs 于 2014-7-21 12:46 编辑

while并不特殊,后边可跟and,or甚至progn,自定义函数都行,只要最后结果能判断真假就成。据说while没有repeat执行速度快。

77077 发表于 2014-7-21 13:13:23

llsheng_73 发表于 2014-7-21 11:49 static/image/common/back.gif
(while(setq en(car(entsel "\n点选物件")))
    (princ(entget en))
)


没办法啊,新手只能按照字面意思来做程序~~

llsheng_73 发表于 2014-7-21 13:20:41

本帖最后由 llsheng_73 于 2014-7-21 13:22 编辑

langjs 发表于 2014-7-21 12:40 static/image/common/back.gif
while并不特殊,后边可跟and,or甚至progn,自定义函数都行,只要最后结果能判断真假就成。据说while没有repe ...

按道理来说应该没有repeat快,因为while它会每次对循环条件进行检查,而repeat只需要一个计数器进行次数计算,不过一般情况下用不着考虑这点差别
但是repeat对于循环次数不能超过所以表示的最大整数(比如32位下不能超过2的31次方减去1: 2147483647)

(repeat 2147483648 t)
; 错误: 参数类型错误: fixnump: 2.14748e+009

xyp1964 发表于 2014-7-21 13:23:45

太复杂了(defun c:tt ()
(while (setq en (entsel "\n点选物件: "))
    (princ (entget (car en)))
)
(princ)
)

nzl1116 发表于 2014-7-21 13:34:12

llsheng_73 发表于 2014-7-21 13:20 static/image/common/back.gif
按道理来说应该没有repeat快,因为while它会每次对循环条件进行检查,而repeat只需要一个计数器进行次数 ...

repeat照样对条件进行检查,只不过一个是我们写的lsp表达式,一个是CAD自动添加的表达式。

恕放之生命 发表于 2014-7-25 09:24:02

学习一下。
页: [1] 2
查看完整版本: 写给新手的while循环,欢迎高手继续完善~~~