e2002 发表于 2022-4-20 14:28:31


;;--------------=={ SelectionSet -> Entities }==--------------;;
;;                                                            ;;
;;Converts a SelectionSet to a list of Entities             ;;
;;------------------------------------------------------------;;
;;Author: Lee Mac, Copyright © 2011 - www.lee-mac.com       ;;
;;------------------------------------------------------------;;
;;Arguments:                                                ;;
;;ss - Valid SelectionSet (Pickset)                         ;;
;;------------------------------------------------------------;;
;;Returns:List of Entity names, else nil                  ;;
;;------------------------------------------------------------;;

(defun LM:ss->ent ( ss / i l )
    (if ss
      (repeat (setq i (sslength ss))
            (setq l (cons (ssname ss (setq i (1- i))) l))
      )
    )
)


mokson 发表于 2022-4-20 14:36:56

以上的思路是:用 ssname 获取对象的图元名称,然后用 cons 再将它累加到列表中。

masterlong 发表于 2022-4-20 15:03:27

lm的这个不是特别好
他没考虑选择集形成以后
其中图元被删除的情况

masterlong 发表于 2022-4-20 15:11:39

我自己的
几乎适用各种情况吧

;999公共函数
;;选择集转为图元列表
(defun ss2list ( ss / n i elist )
      (cond
                ((null ss) NIL)
                ((and (= (type ss) 'Pickset) (null (sslength ss)))
                              NIL
                )
                ((= (type ss) 'Pickset)
                        (setq n(sslength ss)
                                        i n
                                        elist '()
                        )
                        (repeat n
                              (setq i (1- i))
                              ;;如果没有这个if,那么选择集中被删除的图元,也会被加入到列表之中————但是极其偶尔也有可能,图元不存在但是能entget(遇到过一次,原因不明,或许是CAD的BUG)
                              (if (entget (ssname ss i))
                                        (setq elist (cons (ssname ss i) elist))
                              )
                        )
                        elist
                )
                ((= (type ss) 'ename)
                        (list ss)
                )
                ((= (type ss) 'list)
                        (vl-remove-if-not ''((x) (and (= (type x) 'ename) (entget x))) ss)
                )
                ( T NIL )
      )
)

菜卷鱼 发表于 2022-4-20 16:32:50

masterlong 发表于 2022-4-20 15:11
我自己的
几乎适用各种情况吧



我觉得Lee的那个就够了,程序跑起来是为了效率,
可能是使用环境不同,你的才需要这种判断,别的不需要判断的,就是多余的

菜卷鱼 发表于 2022-4-20 16:35:37


我的是这么弄的,分散跟打包

;;;;判断有没有选到对象
(defun ssgetp (ss)
(and (= (type ss) 'PICKSET)
       (> (sslength ss) 0)
)
)
;;;;判断是否是存在的图元
(defun enamep (obj)
(and (= (type obj) 'ENAME) (entget obj))
)
;;;;选择集转列表
(defun sslist (ss / i lst)
(setq i -1)
(if (ssgetp ss)
    (repeat (sslength ss)
      (setq lst (cons (ssname ss (setq i (1+ i))) lst))
    )
)
(reverse lst)
)
;;;;列表转选择集
(defun sspack (lst / pack)
(setq pack (ssadd))
(foreach x lst
    (if(enamep x)
      (setq pack (ssadd x pack))
    )
)
pack
)

masterlong 发表于 2022-4-20 16:39:58

我的程序里
很多并不是【选择完以后立即顺序处理】
ss2list的对象也比较杂乱
所以需要有各种判断
其实cond也就是一次的事
影响不大

masterlong 发表于 2022-4-20 16:49:52

理解通透了
怎么做都可以

就说转表效率低
的确不如repeat高效
如果需要应对几百上千万
肯定要考虑效率
但是几百几千的循环次数
能有多大区别呢
0.2秒?
这时候我考虑的首先是代码简单

zghmaya 发表于 2022-4-20 18:23:50


很不错呀 感谢分享

mokson 发表于 2022-4-20 23:40:54

大伽如云呀,得好好地学习学习.
页: 1 [2] 3
查看完整版本: 有这样的命令或函数吗:能将选择集转换成列表?