明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2046|回复: 30

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

[复制链接]
发表于 2024-9-3 08:34:23 | 显示全部楼层 |阅读模式
(while (< (sslength ss) 1)

        (setq ss (ssget))
)
想用选择集个数终止While循环,但是一终止ssget或空选,整个程序就跳出来终止,如何终止ssget让while循环结束,然后继续执行下面的语句
发表于 2024-9-3 09:57:39 | 显示全部楼层
没看懂在问什么,重新组织一下问题吧
回复 支持 1 反对 0

使用道具 举报

发表于 2024-9-3 11:42:37 | 显示全部楼层
本帖最后由 自贡黄明儒 于 2024-9-3 11:44 编辑

太极端了吧,ssget 都要用VL-CATCH-ALL-APPLY ?
(while(setq ss (ssget))
   。。。
)不就好了吗?
回复 支持 1 反对 0

使用道具 举报

发表于 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 09:01:36 | 显示全部楼层
本帖最后由 fangmin723 于 2024-9-3 09:03 编辑

(while (setq ss (ssget)) (princ (rtos (sslength ss))))
发表于 2024-9-3 09:04:06 | 显示全部楼层
fangmin723 发表于 2024-9-3 09:01
(while (setq ss (ssget))
        (princ (rtos (sslength ss)))
)

他意思应该是让用户必须选择对象,否则就一直提示用户。
发表于 2024-9-3 09:27:01 | 显示全部楼层
正常的思路是这样的:
(setq ss nil)
(if (setq ss(ssget))
  (progn

    .....

评分

参与人数 1明经币 +1 收起 理由
tryhi + 1

查看全部评分

发表于 2024-9-3 09:27:09 | 显示全部楼层
当ssget让你选择对象的时候,如果用户输入空格,那么ss的数据类型就变成了nil,所以用sslength就会出现数据类型不匹配的错误,导致无法循环下去。
        (setq ss nil)
        (while(null ss)
                (setq ss(ssget))
        )
       

评分

参与人数 1明经币 +1 收起 理由
tryhi + 1

查看全部评分

 楼主| 发表于 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后面的程序
发表于 2024-9-3 09:39:12 | 显示全部楼层
(while (and (setq ss (ssget)) (< (sslength ss) 1))
....
)
 楼主| 发表于 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 | 显示全部楼层
  1. (setq ss (ssget))
  2. (while (and ss (> (sslength ss) 0))
  3.        
  4.         (setq ss (ssget))
  5. )
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-25 09:34 , Processed in 0.167879 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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