本帖最后由 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)))))
lee50310 发表于 2022-4-21 11:20
(setq lst (vl-remove-if 'listp (mapcar 'cadr (ssnamex(ssget)))))
上面這式子中的vl-remove-if...
方法真是多,多才多艺。
选择集转表好像有风险?数量多于66000的时候会不会存在数据丢失?
mokson 发表于 2022-4-20 11:30
感谢您,解决了我想要的问题。让我叫你一声大佬吧。
作为菜鸟的你,要有自己的思维,代码不是越短越好,很明显, (setq lst (vl-remove-if 'listp (mapcar 'cadr (ssnamex(ssget)))))这一句虽然能实现选择集转图元表,但是,效率比正常写法至少慢3倍,有何意义?是你的硬盘太小,装不下几句代码?建议用其他人贴出的任何写法!
(setq lst(vl-remove-if-not '(lambda (x)(= (type x)'ENAME))(apply 'append(ssnamex ss))))
我都是这么用,忘记在哪里抄的了
向大佬们学习,刚好用到这个。