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






mokson 发表于 2022-4-22 08:39:18

lee50310 发表于 2022-4-21 11:20
(setq lst (vl-remove-if 'listp (mapcar 'cadr (ssnamex(ssget)))))
上面這式子中的vl-remove-if...

方法真是多,多才多艺。

陨落 发表于 2022-4-22 13:07:04

选择集转表好像有风险?数量多于66000的时候会不会存在数据丢失?

pengfei2010 发表于 2022-4-23 10:52:12

mokson 发表于 2022-4-20 11:30
感谢您,解决了我想要的问题。让我叫你一声大佬吧。

作为菜鸟的你,要有自己的思维,代码不是越短越好,很明显, (setq lst (vl-remove-if 'listp (mapcar 'cadr (ssnamex(ssget)))))这一句虽然能实现选择集转图元表,但是,效率比正常写法至少慢3倍,有何意义?是你的硬盘太小,装不下几句代码?建议用其他人贴出的任何写法!

caoliu023 发表于 2022-4-25 22:42:40

(setq lst(vl-remove-if-not '(lambda (x)(= (type x)'ENAME))(apply 'append(ssnamex ss))))
我都是这么用,忘记在哪里抄的了

荣sir 发表于 2022-5-8 15:41:31

向大佬们学习,刚好用到这个。
页: 1 2 [3]
查看完整版本: 有这样的命令或函数吗:能将选择集转换成列表?