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
大伽如云呀,得好好地学习学习.