选择集转图元名表,还有没有更简洁的写法?
(defun ss-to-enlst(ss / en enlst n)(setq enlst nil)
(repeat(setq n(sslength ss))
(setq en(ssname ss(setq n(1- n))))
(setq enlst(cons en enlst))
)
enlst
)
感觉这个转换是比较常用的,使用频率很高,好奇有没有一两行的写法?
本帖最后由 fangmin723 于 2024-6-26 16:45 编辑
(defun c:test(/ en enlst ent etime info n ss stime)
(setq ss (ssget) info "\n---取3次测试结果,十万个圆:\nGG1处理:" i 0)
(repeat 3;;GG1
(princ (strcat "\nGG1第 " (rtos (setq i (1+ i))) " 次处理!"))
(setq stime (getvar "MILLISECS"))
(setq enlst (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss))))
(setq etime (getvar "MILLISECS"))
(setq info (strcat info "耗时:" (rtos (- etime stime) 2 0)" ms;"))
)
(setq info (strcat info "\nGG2处理:") i 0)
(repeat 3;;GG2
(princ (strcat "\nGG2第 " (rtos (setq i (1+ i))) " 次处理!"))
(setq stime (getvar "MILLISECS"))
(setq enlst (mapcar 'cadr (cdr (reverse (ssnamex ss)))))
(setq etime (getvar "MILLISECS"))
(setq info (strcat info "耗时:" (rtos (- etime stime) 2 0)" ms;"))
)
(setq info (strcat info "\nGG3处理:") i 0)
(repeat 3;;GG3
(princ (strcat "\nGG3第 " (rtos (setq i (1+ i))) " 次处理!"))
(setq stime (getvar "MILLISECS"))
(setq enlst nil)
(repeat(setq n (sslength ss))
(setq en(ssname ss (setq n(1- n))))
(setq enlst(cons en enlst))
)
(setq etime (getvar "MILLISECS"))
(setq info (strcat info "耗时:" (rtos (- etime stime) 2 0)" ms;"))
)
(setq info (strcat info "\nGG4处理:") i 0)
(repeat 3;;GG4
(princ (strcat "\nGG4第 " (rtos (setq i (1+ i))) " 次处理!"))
(setq stime (getvar "MILLISECS"))
(setq enlst nil n -1)
(while (setq ent (ssname ss (setq n (1+ n))))
(setq enlst(cons ent enlst))
)
(setq etime (getvar "MILLISECS"))
(setq info (strcat info "耗时:" (rtos (- etime stime) 2 0)" ms;"))
)
(setq info (strcat info "\nGG5处理:") i 0)
(repeat 3;;GG5
(princ (strcat "\nGG5第 " (rtos (setq i (1+ i))) " 次处理!"))
(setq stime (getvar "MILLISECS"))
(setq enlst (vl-remove-if-not '(lambda (arg) (equal (type arg) 'ENAME)) (mapcar 'cadr (ssnamex SS))))
(setq etime (getvar "MILLISECS"))
(setq info (strcat info "耗时:" (rtos (- etime stime) 2 0)" ms;"))
)
(princ info)
(princ)
)
测试环境:中望CAD2025
命令: TEST
选择对象:
指定对角点:
找到 100000 个
选择对象:
GG1第 1 次处理!
GG1第 2 次处理!
GG1第 3 次处理!
GG2第 1 次处理!
GG2第 2 次处理!
GG2第 3 次处理!
GG3第 1 次处理!
GG3第 2 次处理!
GG3第 3 次处理!
GG4第 1 次处理!
GG4第 2 次处理!
GG4第 3 次处理!
GG5第 1 次处理!
GG5第 2 次处理!
GG5第 3 次处理!
---取3次测试结果,十万个圆:
GG1处理:耗时:625 ms;耗时:734 ms;耗时:656 ms;
GG2处理:耗时:656 ms;耗时:641 ms;耗时:656 ms;
GG3处理:耗时:94 ms;耗时:62 ms;耗时:78 ms;
GG4处理:耗时:79 ms;耗时:62 ms;耗时:63 ms;while+ssname 最优
GG5处理:耗时:7687 ms;耗时:8969 ms;耗时:9172 ms;
还是用
(setq enlst nil n -1)
(while (setq ent (ssname ss (setq n (1+ n))))
(setq enlst (cons ent enlst))
)
吧,比repeat都快!!!
命令: TEST
选择对象:
指定对角点:
找到 1000000 个
选择对象:
GG1第 1 次处理!
GG1第 2 次处理!
GG1第 3 次处理!
GG2第 1 次处理!
GG2第 2 次处理!
GG2第 3 次处理!
GG3第 1 次处理!
GG3第 2 次处理!
GG3第 3 次处理!
GG4第 1 次处理!
GG4第 2 次处理!
GG4第 3 次处理!
GG5第 1 次处理!
GG5第 2 次处理!
GG5第 3 次处理!
---取3次测试结果,一百万个圆:
GG1处理:耗时:130390 ms;耗时:118953 ms;耗时:18969 ms;
GG2处理:耗时:28844 ms;耗时:30594 ms;耗时:30781 ms;
GG3处理:耗时:797 ms;耗时:718 ms;耗时:797 ms;
GG4处理:耗时:610 ms;耗时:687 ms;耗时:625 ms;
GG5处理:耗时:320031 ms;耗时:500391 ms;耗时:681281 ms;
(defun c:gg1(/ enlst etime ss stime)
(setq ss(ssget))
(setq stime(getvar "MILLISECS"))
(setq enlst(vl-remove-if 'listp (mapcar 'cadr (ssnamex ss))))
(setq etime(getvar "MILLISECS"))
(princ(strcat "\n处理完毕!耗时:"(rtos(- etime stime)2 0)" ms"))
(princ)
);---取3次测试结果,十万个圆,处理完毕!耗时:281 ms处理完毕!耗时:266 ms处理完毕!耗时:312 ms
(defun c:gg2(/ enlst etime ss stime)
(setq ss(ssget))
(setq stime(getvar "MILLISECS"))
(setq enlst(mapcar 'cadr(cdr(reverse(ssnamex ss)))))
(setq etime(getvar "MILLISECS"))
(princ(strcat "\n处理完毕!耗时:"(rtos(- etime stime)2 0)" ms"))
(princ)
);---取3次测试结果,十万个圆,处理完毕!耗时:282 ms处理完毕!耗时:250 ms处理完毕!耗时:281 ms
(defun c:gg3(/ en enlst etime n ss stime)
(setq ss(ssget))
(setq stime(getvar "MILLISECS"))
(setq enlst nil)
(repeat(setq n(sslength ss))
(setq en(ssname ss(setq n(1- n))))
(setq enlst(cons en enlst))
)
(setq etime(getvar "MILLISECS"))
(princ(strcat "\n处理完毕!耗时:"(rtos(- etime stime)2 0)" ms"))
(princ)
);---取3次测试结果,十万个圆,处理完毕!耗时:360 ms处理完毕!耗时:359 ms处理完毕!耗时:359 ms分别测试了一下,供参考
本帖最后由 gzcsun 于 2024-6-26 13:48 编辑
(defun c:gg4(/ enlst etime ss stime)
(setq ss(ssget))
(setq stime(getvar "MILLISECS"))
(setqenlst (vl-remove-if-not '(lambda (arg) (equal (type arg) 'ENAME)) (mapcar 'cadr (ssnamex SS))))
(setq etime(getvar "MILLISECS"))
(princ(strcat "\n处理完毕!耗时:"(rtos(- etime stime)2 0)" ms"))
(princ))
命令: GG1
找到 843180 个
处理完毕!耗时:1469 ms
命令: GG2
找到 843180 个
处理完毕!耗时:1187 ms
命令: GG3
找到 843180 个
处理完毕!耗时:297 ms
命令: GG4
找到 843180 个
处理完毕!耗时:1640 ms
耗时最慢!
外国很多用 ssnamex 。
但 ssnamex 是最慢的。
大神那来的,是谁的忘记了!抱歉!
(setq ss (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss)))) 好好学习,天天向上 (defun ss-to-enlst (ss / EN ENLST N)
(repeat (setq n (sslength ss))
(setq en (ssname ss (setq n (1- n))))
(setq enlst (cons en enlst))
)
) 你已经坐上火箭了,不要想简单的去坐汽车。 gzcsun 发表于 2024-6-26 09:49
你已经坐上火箭了,不要想简单的去坐汽车。
:lol没有钻研精神,没有好奇心,是学不下去编程的。 本帖最后由 gzcsun 于 2024-6-26 13:14 编辑
cad2008
命令: gg1
选择对象: 指定对角点: 找到 843180 个
选择对象:
处理完毕!耗时:1625 ms
命令: 指定对角点或 [栏选(F)/圈围(WP)/圈交(CP)]:
命令: GG2
找到 843180 个
处理完毕!耗时:2093 ms
命令: 指定对角点或 [栏选(F)/圈围(WP)/圈交(CP)]:
命令: GG3
找到 843180 个
处理完毕!耗时:625 ms
cad2025
命令: GG1
找到 843180 个
处理完毕!耗时:1765 ms
命令:
命令: 指定对角点或 [栏选(F)/圈围(WP)/圈交(CP)]:
命令: GG2
找到 843180 个
处理完毕!耗时:1781 ms
命令:
命令: 指定对角点或 [栏选(F)/圈围(WP)/圈交(CP)]:
命令: GG3
找到 843180 个
处理完毕!耗时:375 ms
gzcsun 发表于 2024-6-26 13:13
cad2008
命令: gg1
100万条直线。测试结果如下,难道是电脑性能差异?
cad2020
命令: GG1
选择对象: 指定对角点: 找到 1000000 个
选择对象:
处理完毕!耗时:3766 ms处理完毕!耗时:3000 ms处理完毕!耗时:2985 ms
命令:
命令: GG2
选择对象: 指定对角点: 找到 1000000 个
选择对象:
处理完毕!耗时:3360 ms处理完毕!耗时:3578 ms处理完毕!耗时:3438 ms
命令:
命令: GG3
选择对象: 指定对角点: 找到 1000000 个
选择对象:
处理完毕!耗时:5625 ms处理完毕!耗时:4906 ms处理完毕!耗时:5703 ms