明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
123
返回列表 发新帖
楼主: zolly

[提问] While循环如何终止ssget

[复制链接]
发表于 2024-9-3 12:11:00 | 显示全部楼层
不明白你的用意,我都是这样写的
(while (not (setq ss (ssget))))
就是没有选中对象的情况下,一直选,选中为止,按空格与回车不能退出,只能按ESC退出。
 楼主| 发表于 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个选择集,当先到中间不想选了,如何让选择退出并让程序运行完不出错,按空格或回车就出错
 楼主| 发表于 2024-9-3 12:24:51 | 显示全部楼层
qazxswk 发表于 2024-9-3 12:11
不明白你的用意,我都是这样写的
(while (not (setq ss (ssget))))
就是没有选中对象的情况下,一直选, ...

按空格与回车会出错,也相当于ESC终止程序继续运行
发表于 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后面也没有东西了啊
  1. (defun c:tt (/ findxmin p1 ss x1 x2 y1)
  2.         (defun findxmin(/ a ent n xmin y)
  3.                 (setq n 0)
  4.                 (setq ent (ssname ss 0))
  5.                 (setq xmin (cadr (assoc 10 (entget ent))))
  6.                 (repeat(sslength ss)
  7.                         (setq ent (entget (ssname ss n)))
  8.                         (setq a (cadr (assoc 10 ent)))
  9.                         (setq y (caddr (assoc 10 ent)))
  10.                         (if (< a xmin) (setq xmin a))
  11.                         (setq n (1+ n))
  12.                 )
  13.                 (princ)
  14.         )
  15.   (setvar "cmdecho" 0)
  16.         (princ "\n选择第一个选择集")
  17.         (setq ss (ssget (list '(0 . "LINE"))))
  18.   (while (and ss (> (sslength ss) 0))
  19.                 (findxmin)
  20.                 (setq x1 xmin)
  21.                 (setq y1 y)
  22.                 (princ "\n选择第二个选择集")
  23.                 (setq ss (ssget (list '(0 . "LINE"))))
  24.                 (if (and ss (> (sslength ss) 0))
  25.                         (progn
  26.                                 (findxmin)
  27.                                 (setq x2 xmin)
  28.                                 (setq p1 (list xmin y1))
  29.                                 (command "move" ss "" (cdr (assoc 10 ent)) p1)
  30.                         )
  31.                 )
  32.                 (princ "\n选择第一个选择集")
  33.                 (setq ss (ssget (list '(0 . "LINE"))))
  34.         )
  35.         (princ)
  36. )
 楼主| 发表于 2024-9-3 12:51:00 | 显示全部楼层
飞雪神光 发表于 2024-9-3 12:32
你这while后面也没有东西了啊

假设写了哈
 楼主| 发表于 2024-9-3 13:03:01 | 显示全部楼层
飞雪神光 发表于 2024-9-3 12:32
你这while后面也没有东西了啊

原来while里面再加个IF就可以了,非常感谢
 楼主| 发表于 2024-9-3 13:07:14 | 显示全部楼层
start4444 发表于 2024-9-3 12:30
出错应该是后面的东西,加个(if ss (progn 。。。。)应该就可以顺利退出while了

确实是这样,谢谢解答
发表于 2024-9-3 22:09:11 | 显示全部楼层
  1. (while (and (setq ss1 (ssget '((0 . "LINE"))))(setq ss2 (ssget '((0 . "LINE"))))) ...)
发表于 2024-9-4 09:34:17 | 显示全部楼层
解决报错,可以添加一个error函数
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-25 11:35 , Processed in 0.148023 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表