qazxswk 发表于 2024-9-3 12:11:00

不明白你的用意,我都是这样写的
(while (not (setq ss (ssget))))
就是没有选中对象的情况下,一直选,选中为止,按空格与回车不能退出,只能按ESC退出。

zolly 发表于 2024-9-3 12:21:49

飞雪神光 发表于 2024-9-3 10:55
你在while跳出后又使用ss了?发代码看看

(defun C:tt()
(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"))))
          (findxmin)
          (setq x2 xmin)
          (setq p1 (list xmin y1))
          (command "move" ss "" (cdr(assoc 10 ent)) p1)
      )

(princ)
)


(defun findxmin()
        (setq n 1 )
      (setq ent (ssname ss 0))
                  (setq xmin (cadr (assoc 10 (entget ent))))
                  (repeat (- (sslength ss) 1)
             (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)
             )


随便弄了个,大概就这个意思,有N个选择集,当先到中间不想选了,如何让选择退出并让程序运行完不出错,按空格或回车就出错

zolly 发表于 2024-9-3 12:24:51

qazxswk 发表于 2024-9-3 12:11
不明白你的用意,我都是这样写的
(while (not (setq ss (ssget))))
就是没有选中对象的情况下,一直选, ...

按空格与回车会出错,也相当于ESC终止程序继续运行

start4444 发表于 2024-9-3 12:30:20

出错应该是后面的东西,加个(if ss (progn 。。。。)应该就可以顺利退出while了

飞雪神光 发表于 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)
)

zolly 发表于 2024-9-3 12:51:00

飞雪神光 发表于 2024-9-3 12:32
你这while后面也没有东西了啊

假设写了哈:lol

zolly 发表于 2024-9-3 13:03:01

飞雪神光 发表于 2024-9-3 12:32
你这while后面也没有东西了啊

原来while里面再加个IF就可以了,非常感谢

zolly 发表于 2024-9-3 13:07:14

start4444 发表于 2024-9-3 12:30
出错应该是后面的东西,加个(if ss (progn 。。。。)应该就可以顺利退出while了

确实是这样,谢谢解答

xyp1964 发表于 2024-9-3 22:09:11

(while (and (setq ss1 (ssget '((0 . "LINE"))))(setq ss2 (ssget '((0 . "LINE"))))) ...)

CAD智能@未来 发表于 2024-9-4 09:34:17

解决报错,可以添加一个error函数
页: 1 2 [3]
查看完整版本: While循环如何终止ssget