While循环如何终止ssget
(while (< (sslength ss) 1)(setq ss (ssget))
)
想用选择集个数终止While循环,但是一终止ssget或空选,整个程序就跳出来终止,如何终止ssget让while循环结束,然后继续执行下面的语句
没看懂在问什么,重新组织一下问题吧 本帖最后由 自贡黄明儒 于 2024-9-3 11:44 编辑
dcl1214 发表于 2024-9-3 11:20
太极端了吧,ssget 都要用VL-CATCH-ALL-APPLY ?
(while(setq ss (ssget))
。。。
)不就好了吗?
zolly 发表于 2024-9-3 12:21
(defun C:tt()
(setvar "cmdecho" 0)
你这while后面也没有东西了啊(defun c:tt (/ findxmin p1 ss x1 x2 y1)
(defun findxmin(/ a ent n xmin y)
(setq n 0)
(setq ent (ssname ss 0))
(setq xmin (cadr (assoc 10 (entget ent))))
(repeat(sslength ss)
(setq ent (entget (ssname ss n)))
(setq a (cadr (assoc 10 ent)))
(setq y (caddr (assoc 10 ent)))
(if (< a xmin) (setq xmin a))
(setq n (1+ n))
)
(princ)
)
(setvar "cmdecho" 0)
(princ "\n选择第一个选择集")
(setq ss (ssget (list '(0 . "LINE"))))
(while (and ss (> (sslength ss) 0))
(findxmin)
(setq x1 xmin)
(setq y1 y)
(princ "\n选择第二个选择集")
(setq ss (ssget (list '(0 . "LINE"))))
(if (and ss (> (sslength ss) 0))
(progn
(findxmin)
(setq x2 xmin)
(setq p1 (list xmin y1))
(command "move" ss "" (cdr (assoc 10 ent)) p1)
)
)
(princ "\n选择第一个选择集")
(setq ss (ssget (list '(0 . "LINE"))))
)
(princ)
) 本帖最后由 fangmin723 于 2024-9-3 09:03 编辑
(while (setq ss (ssget)) (princ (rtos (sslength ss)))) fangmin723 发表于 2024-9-3 09:01
(while (setq ss (ssget))
(princ (rtos (sslength ss)))
)
他意思应该是让用户必须选择对象,否则就一直提示用户。 正常的思路是这样的:
(setq ss nil)
(if (setq ss(ssget))
(progn
..... 当ssget让你选择对象的时候,如果用户输入空格,那么ss的数据类型就变成了nil,所以用sslength就会出现数据类型不匹配的错误,导致无法循环下去。
(setq ss nil)
(while(null ss)
(setq ss(ssget))
)
fangmin723 发表于 2024-9-3 09:01
(while (setq ss (ssget)) (princ (rtos (sslength ss))))
不行啊,我的意思是while循环里面有ssget选择语句,不终止while,就会一直循环执行ssget,但是ssget这个命令自身要是没选到东西就会一直让选,如果空格或回车,就出错,程序就在这里退出,必须要选一个才能完成这个命令,我的意思是终止ssget后如何不报错跳出while循环,去执行while后面的程序 (while (and (setq ss (ssget)) (< (sslength ss) 1))
....
) 本帖最后由 zolly 于 2024-9-3 09:47 编辑
aws 发表于 2024-9-3 09:27
当ssget让你选择对象的时候,如果用户输入空格,那么ss的数据类型就变成了nil,所以用sslength就会出现数据 ...
还是不行,只能执行一个循环就退出来了 (setq ss (ssget))
(while (and ss (> (sslength ss) 0))
(setq ss (ssget))
)