mokson 发表于 2022-4-20 08:48:01

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

不想用循环语句实现,能将选择集对象,通过一个函数一步到位,转换成列表对象吗?

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 )
      )
)

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))
      )
    )
)


lee50310 发表于 2022-4-21 11:20:54

本帖最后由 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)))))






yshf 发表于 2022-4-20 08:51:53

(setq lst (vl-remove-if 'listp (mapcar 'cadr (ssnamex(ssget)))))

mokson 发表于 2022-4-20 11:30:38

yshf 发表于 2022-4-20 08:51
(setq lst (vl-remove-if 'listp (mapcar 'cadr (ssnamex(ssget)))))

感谢您,解决了我想要的问题。让我叫你一声大佬吧。

wosiguwozai0830 发表于 2022-4-20 12:28:57

很实用,赞一个

自贡黄明儒 发表于 2022-4-20 13:19:05

据说这个慢,没多少人使用。

845245015 发表于 2022-4-20 13:23:11

自贡黄明儒 发表于 2022-4-20 13:19
据说这个慢,没多少人使用。

好奇大神用的啥,我一直repeat(sslength ss)

masterlong 发表于 2022-4-20 14:15:51

我就喜欢这样用
烦写repeat

菜卷鱼 发表于 2022-4-20 14:16:53

自贡黄明儒 发表于 2022-4-20 13:19
据说这个慢,没多少人使用。

这个不是一般慢,选择集越大,慢得越明显

mokson 发表于 2022-4-20 14:17:30

本帖最后由 mokson 于 2022-4-20 14:18 编辑

我之前一直用 repeat 递增或递减,或 while 判断去实现,
现在终于可以舒服地用上 foreach 去实现了。

mokson 发表于 2022-4-20 14:26:00

菜卷鱼 发表于 2022-4-20 14:16
这个不是一般慢,选择集越大,慢得越明显

目前有没有更好的方法解决慢的问题吗?
页: [1] 2 3
查看完整版本: 有这样的命令或函数吗:能将选择集转换成列表?