明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
楼主: mokson

[提问] 有这样的命令或函数吗:能将选择集转换成列表?

[复制链接]
发表于 2022-4-20 14:28:31 | 显示全部楼层
  1. ;;--------------=={ SelectionSet -> Entities }==--------------;;
  2. ;;                                                            ;;
  3. ;;  Converts a SelectionSet to a list of Entities             ;;
  4. ;;------------------------------------------------------------;;
  5. ;;  Author: Lee Mac, Copyright © 2011 - www.lee-mac.com       ;;
  6. ;;------------------------------------------------------------;;
  7. ;;  Arguments:                                                ;;
  8. ;;  ss - Valid SelectionSet (Pickset)                         ;;
  9. ;;------------------------------------------------------------;;
  10. ;;  Returns:  List of Entity names, else nil                  ;;
  11. ;;------------------------------------------------------------;;

  12. (defun LM:ss->ent ( ss / i l )
  13.     (if ss
  14.         (repeat (setq i (sslength ss))
  15.             (setq l (cons (ssname ss (setq i (1- i))) l))
  16.         )
  17.     )
  18. )


 楼主| 发表于 2022-4-20 14:36:56 | 显示全部楼层
以上的思路是:用 ssname 获取对象的图元名称,然后用 cons 再将它累加到列表中。
发表于 2022-4-20 15:03:27 | 显示全部楼层
lm的这个不是特别好
他没考虑选择集形成以后
其中图元被删除的情况
发表于 2022-4-20 15:11:39 | 显示全部楼层
我自己的
几乎适用各种情况吧

  1. ;999公共函数
  2. ;;选择集转为图元列表
  3. (defun ss2list ( ss / n i elist )
  4.         (cond
  5.                 ((null ss) NIL)
  6.                 ((and (= (type ss) 'Pickset) (null (sslength ss)))
  7.                                 NIL
  8.                 )
  9.                 ((= (type ss) 'Pickset)
  10.                         (setq n  (sslength ss)
  11.                                         i n
  12.                                         elist '()
  13.                         )
  14.                         (repeat n
  15.                                 (setq i (1- i))
  16.                                 ;;如果没有这个if,那么选择集中被删除的图元,也会被加入到列表之中————但是极其偶尔也有可能,图元不存在但是能entget(遇到过一次,原因不明,或许是CAD的BUG)
  17.                                 (if (entget (ssname ss i))
  18.                                         (setq elist (cons (ssname ss i) elist))
  19.                                 )
  20.                         )
  21.                         elist
  22.                 )
  23.                 ((= (type ss) 'ename)
  24.                         (list ss)
  25.                 )
  26.                 ((= (type ss) 'list)
  27.                         (vl-remove-if-not ''((x) (and (= (type x) 'ename) (entget x))) ss)
  28.                 )
  29.                 ( T NIL )
  30.         )
  31. )

发表于 2022-4-20 16:32:50 | 显示全部楼层
masterlong 发表于 2022-4-20 15:11
我自己的
几乎适用各种情况吧

我觉得Lee的那个就够了,程序跑起来是为了效率,
可能是使用环境不同,你的才需要这种判断,别的不需要判断的,就是多余的
发表于 2022-4-20 16:35:37 | 显示全部楼层

我的是这么弄的,分散跟打包
  1. ;;;;判断有没有选到对象
  2. (defun ssgetp (ss)
  3.   (and (= (type ss) 'PICKSET)
  4.        (> (sslength ss) 0)
  5.   )
  6. )
  7. ;;;;判断是否是存在的图元
  8. (defun enamep (obj)
  9.   (and (= (type obj) 'ENAME) (entget obj))
  10. )
  11. ;;;;选择集转列表
  12. (defun sslist (ss / i lst)
  13.   (setq i -1)
  14.   (if (ssgetp ss)
  15.     (repeat (sslength ss)
  16.       (setq lst (cons (ssname ss (setq i (1+ i))) lst))
  17.     )
  18.   )
  19.   (reverse lst)
  20. )
  21. ;;;;列表转选择集
  22. (defun sspack (lst / pack)
  23.   (setq pack (ssadd))
  24.   (foreach x lst
  25.     (if  (enamep x)
  26.       (setq pack (ssadd x pack))
  27.     )
  28.   )
  29.   pack
  30. )

点评

我一般直接判断 ssget 返回值 ss 是否 nil。  发表于 2022-4-22 09:28
发表于 2022-4-20 16:39:58 | 显示全部楼层
我的程序里
很多并不是【选择完以后立即顺序处理】
ss2list的对象也比较杂乱
所以需要有各种判断
其实cond也就是一次的事
影响不大
发表于 2022-4-20 16:49:52 | 显示全部楼层
理解通透了
怎么做都可以

就说转表效率低
的确不如repeat高效
如果需要应对几百上千万
肯定要考虑效率
但是几百几千的循环次数
能有多大区别呢
0.2秒?
这时候我考虑的首先是代码简单
发表于 2022-4-20 18:23:50 | 显示全部楼层

很不错呀 感谢分享
 楼主| 发表于 2022-4-20 23:40:54 | 显示全部楼层
大伽如云呀,得好好地学习学习.
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-9-29 13:19 , Processed in 0.164859 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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