明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2082|回复: 27

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

[复制链接]
发表于 2022-4-20 08:48:01 | 显示全部楼层 |阅读模式
不想用循环语句实现,能将选择集对象,通过一个函数一步到位,转换成列表对象吗?
"觉得好,就打赏"
还没有人打赏,支持一下
发表于 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 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-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)))))







发表于 2022-4-20 08:51:53 | 显示全部楼层
(setq lst (vl-remove-if 'listp (mapcar 'cadr (ssnamex  (ssget)))))
 楼主| 发表于 2022-4-20 11:30:38 | 显示全部楼层
yshf 发表于 2022-4-20 08:51
(setq lst (vl-remove-if 'listp (mapcar 'cadr (ssnamex  (ssget)))))

感谢您,解决了我想要的问题。让我叫你一声大佬吧。
发表于 2022-4-20 12:28:57 | 显示全部楼层
很实用,赞一个
发表于 2022-4-20 13:19:05 | 显示全部楼层
据说这个慢,没多少人使用。
发表于 2022-4-20 13:23:11 | 显示全部楼层
自贡黄明儒 发表于 2022-4-20 13:19
据说这个慢,没多少人使用。

好奇大神用的啥,我一直repeat(sslength ss)
发表于 2022-4-20 14:15:51 | 显示全部楼层
我就喜欢这样用
烦写repeat
发表于 2022-4-20 14:16:53 | 显示全部楼层
自贡黄明儒 发表于 2022-4-20 13:19
据说这个慢,没多少人使用。

这个不是一般慢,选择集越大,慢得越明显
 楼主| 发表于 2022-4-20 14:17:30 | 显示全部楼层
本帖最后由 mokson 于 2022-4-20 14:18 编辑

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

点评

把ss转换为list再处理,程序简洁多了。 我一直都这么用的。 很多人都有这么个常用函数的,Lee Mac 也提供了一个。  发表于 2022-4-20 14:24
 楼主| 发表于 2022-4-20 14:26:00 | 显示全部楼层
菜卷鱼 发表于 2022-4-20 14:16
这个不是一般慢,选择集越大,慢得越明显

目前有没有更好的方法解决慢的问题吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-14 14:35 , Processed in 0.317086 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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