有这样的命令或函数吗:能将选择集转换成列表?
不想用循环语句实现,能将选择集对象,通过一个函数一步到位,转换成列表对象吗? 我自己的几乎适用各种情况吧
;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 )
)
)
;;--------------=={ 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))
)
)
)
本帖最后由 lee50310 于 2022-4-25 11:42 编辑
mokson 发表于 2022-4-20 14:26
目前有没有更好的方法解决慢的问题吗?
(setq lst (vl-remove-if 'listp (mapcar 'cadr (ssnamex(ssget))))) ;;將集合物轉圖元串列
這式子最吸引人的地方就是 "簡潔有力"短短的一行 就可以取代 傳統數十行的效果
不過美中不足就是 當集合物眾多時會拖慢速度
如何能保有此式的優點將缺點去除呢?
發現上面這式子中的vl-remove-if 有使用到 if 判斷式 若數量多時會拖慢速度
因此修改成不須要 if 判斷式 應該會快很多
;------------------------------------------------------------------------------------
方法 (1):
(setq lst (cdr(reverse(mapcar 'cadr (ssnamex(ssget))))))
;-------------------------------------------------------------------------------------
方法 (2):
(setq sel(mapcar 'cadr (ssnamex(ssget))))
(setq lst (vl-remove (last sel) sel))
;-------------------------------------------------------------------------------------
再增加一個
;--------------------------------------------------------------------------------------
方法(3):
(setq lst((lambda (x) (vl-remove(last x) x)) (mapcar 'cadr(ssnamex(ssget)))))
(setq lst (vl-remove-if 'listp (mapcar 'cadr (ssnamex(ssget))))) yshf 发表于 2022-4-20 08:51
(setq lst (vl-remove-if 'listp (mapcar 'cadr (ssnamex(ssget)))))
感谢您,解决了我想要的问题。让我叫你一声大佬吧。 很实用,赞一个 据说这个慢,没多少人使用。 自贡黄明儒 发表于 2022-4-20 13:19
据说这个慢,没多少人使用。
好奇大神用的啥,我一直repeat(sslength ss) 我就喜欢这样用
烦写repeat
自贡黄明儒 发表于 2022-4-20 13:19
据说这个慢,没多少人使用。
这个不是一般慢,选择集越大,慢得越明显 本帖最后由 mokson 于 2022-4-20 14:18 编辑
我之前一直用 repeat 递增或递减,或 while 判断去实现,
现在终于可以舒服地用上 foreach 去实现了。 菜卷鱼 发表于 2022-4-20 14:16
这个不是一般慢,选择集越大,慢得越明显
目前有没有更好的方法解决慢的问题吗?