zolly 发表于 2024-9-3 08:34:23

While循环如何终止ssget

(while (< (sslength ss) 1)

      (setq ss (ssget))
)
想用选择集个数终止While循环,但是一终止ssget或空选,整个程序就跳出来终止,如何终止ssget让while循环结束,然后继续执行下面的语句

tryhi 发表于 2024-9-3 09:57:39

没看懂在问什么,重新组织一下问题吧

自贡黄明儒 发表于 2024-9-3 11:42:37

本帖最后由 自贡黄明儒 于 2024-9-3 11:44 编辑

dcl1214 发表于 2024-9-3 11:20

太极端了吧,ssget 都要用VL-CATCH-ALL-APPLY ?
(while(setq ss (ssget))
   。。。
)不就好了吗?

飞雪神光 发表于 2024-9-3 12:32:38

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:01:36

本帖最后由 fangmin723 于 2024-9-3 09:03 编辑

(while (setq ss (ssget)) (princ (rtos (sslength ss))))

aws 发表于 2024-9-3 09:04:06

fangmin723 发表于 2024-9-3 09:01
(while (setq ss (ssget))
      (princ (rtos (sslength ss)))
)

他意思应该是让用户必须选择对象,否则就一直提示用户。

ljpnb 发表于 2024-9-3 09:27:01

正常的思路是这样的:
(setq ss nil)
(if (setq ss(ssget))
(progn

    .....

aws 发表于 2024-9-3 09:27:09

当ssget让你选择对象的时候,如果用户输入空格,那么ss的数据类型就变成了nil,所以用sslength就会出现数据类型不匹配的错误,导致无法循环下去。
        (setq ss nil)
        (while(null ss)
                (setq ss(ssget))
        )
       

zolly 发表于 2024-9-3 09:32:31

fangmin723 发表于 2024-9-3 09:01
(while (setq ss (ssget)) (princ (rtos (sslength ss))))
不行啊,我的意思是while循环里面有ssget选择语句,不终止while,就会一直循环执行ssget,但是ssget这个命令自身要是没选到东西就会一直让选,如果空格或回车,就出错,程序就在这里退出,必须要选一个才能完成这个命令,我的意思是终止ssget后如何不报错跳出while循环,去执行while后面的程序

kozmosovia 发表于 2024-9-3 09:39:12

(while (and (setq ss (ssget)) (< (sslength ss) 1))
....
)

zolly 发表于 2024-9-3 09:43:32

本帖最后由 zolly 于 2024-9-3 09:47 编辑

aws 发表于 2024-9-3 09:27
当ssget让你选择对象的时候,如果用户输入空格,那么ss的数据类型就变成了nil,所以用sslength就会出现数据 ...
还是不行,只能执行一个循环就退出来了

飞雪神光 发表于 2024-9-3 10:10:29

(setq ss (ssget))
(while (and ss (> (sslength ss) 0))
       
        (setq ss (ssget))
)
页: [1] 2 3
查看完整版本: While循环如何终止ssget