明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 433|回复: 25

[讨论] 选择集转图元名表,还有没有更简洁的写法?

[复制链接]
发表于 2024-6-25 22:03 | 显示全部楼层 |阅读模式
  1. (defun ss-to-enlst(ss / en enlst n)
  2.         (setq enlst nil)
  3.         (repeat(setq n(sslength ss))
  4.                 (setq en(ssname ss(setq n(1- n))))
  5.                 (setq enlst(cons en enlst))
  6.         )
  7. enlst
  8. )




感觉这个转换是比较常用的,使用频率很高,好奇有没有一两行的写法?

发表于 2024-6-26 13:30 | 显示全部楼层
本帖最后由 fangmin723 于 2024-6-26 16:45 编辑

  1. (defun c:test(/ en enlst ent etime info n ss stime)
  2.   (setq ss (ssget) info "\n---取3次测试结果,十万个圆:\nGG1处理:" i 0)
  3.   (repeat 3;;GG1
  4.     (princ (strcat "\nGG1第 " (rtos (setq i (1+ i))) " 次处理!"))
  5.     (setq stime (getvar "MILLISECS"))
  6.     (setq enlst (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss))))
  7.     (setq etime (getvar "MILLISECS"))
  8.     (setq info (strcat info "耗时:" (rtos (- etime stime) 2 0)" ms;"))
  9.   )
  10.   (setq info (strcat info "\nGG2处理:") i 0)
  11.   (repeat 3;;GG2
  12.     (princ (strcat "\nGG2第 " (rtos (setq i (1+ i))) " 次处理!"))
  13.     (setq stime (getvar "MILLISECS"))
  14.     (setq enlst (mapcar 'cadr (cdr (reverse (ssnamex ss)))))
  15.     (setq etime (getvar "MILLISECS"))
  16.     (setq info (strcat info "耗时:" (rtos (- etime stime) 2 0)" ms;"))
  17.   )
  18.   (setq info (strcat info "\nGG3处理:") i 0)
  19.   (repeat 3;;GG3
  20.     (princ (strcat "\nGG3第 " (rtos (setq i (1+ i))) " 次处理!"))
  21.     (setq stime (getvar "MILLISECS"))
  22.     (setq enlst nil)
  23.     (repeat(setq n (sslength ss))
  24.       (setq en(ssname ss (setq n(1- n))))
  25.       (setq enlst(cons en enlst))
  26.     )
  27.     (setq etime (getvar "MILLISECS"))
  28.     (setq info (strcat info "耗时:" (rtos (- etime stime) 2 0)" ms;"))
  29.   )
  30.   (setq info (strcat info "\nGG4处理:") i 0)
  31.   (repeat 3;;GG4
  32.     (princ (strcat "\nGG4第 " (rtos (setq i (1+ i))) " 次处理!"))
  33.     (setq stime (getvar "MILLISECS"))
  34.     (setq enlst nil n -1)
  35.     (while (setq ent (ssname ss (setq n (1+ n))))
  36.       (setq enlst(cons ent enlst))
  37.     )
  38.     (setq etime (getvar "MILLISECS"))
  39.     (setq info (strcat info "耗时:" (rtos (- etime stime) 2 0)" ms;"))
  40.   )
  41.   (setq info (strcat info "\nGG5处理:") i 0)
  42.   (repeat 3;;GG5
  43.     (princ (strcat "\nGG5第 " (rtos (setq i (1+ i))) " 次处理!"))
  44.     (setq stime (getvar "MILLISECS"))
  45.     (setq enlst (vl-remove-if-not '(lambda (arg) (equal (type arg) 'ENAME)) (mapcar 'cadr (ssnamex SS))))
  46.     (setq etime (getvar "MILLISECS"))
  47.     (setq info (strcat info "耗时:" (rtos (- etime stime) 2 0)" ms;"))
  48.   )
  49.   (princ info)
  50.   (princ)
  51. )


测试环境:中望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;



点评

aws
感谢测试,原来我测试那些都是错误的,因为没有编译,都是在飞诗里面测的时间,确实是ssname更好。  发表于 2024-6-26 16:54
 楼主| 发表于 2024-6-26 09:11 | 显示全部楼层
  1. (defun c:gg1(/ enlst etime ss stime)
  2.   (setq ss(ssget))
  3.   (setq stime(getvar "MILLISECS"))
  4.   (setq enlst(vl-remove-if 'listp (mapcar 'cadr (ssnamex ss))))
  5.   (setq etime(getvar "MILLISECS"))
  6.   (princ(strcat "\n处理完毕!耗时:"(rtos(- etime stime)2 0)" ms"))
  7.   (princ)
  8. );---取3次测试结果,十万个圆,处理完毕!耗时:281 ms  处理完毕!耗时:266 ms  处理完毕!耗时:312 ms
  9. (defun c:gg2(/ enlst etime ss stime)
  10.   (setq ss(ssget))
  11.   (setq stime(getvar "MILLISECS"))
  12.   (setq enlst(mapcar 'cadr(cdr(reverse(ssnamex ss)))))
  13.   (setq etime(getvar "MILLISECS"))
  14.   (princ(strcat "\n处理完毕!耗时:"(rtos(- etime stime)2 0)" ms"))
  15.   (princ)
  16. );---取3次测试结果,十万个圆,处理完毕!耗时:282 ms  处理完毕!耗时:250 ms  处理完毕!耗时:281 ms
  17. (defun c:gg3(/ en enlst etime n ss stime)
  18.   (setq ss(ssget))
  19.   (setq stime(getvar "MILLISECS"))
  20.   (setq enlst nil)
  21.   (repeat(setq n(sslength ss))
  22.     (setq en(ssname ss(setq n(1- n))))
  23.     (setq enlst(cons en enlst))
  24.   )
  25.   (setq etime(getvar "MILLISECS"))
  26.   (princ(strcat "\n处理完毕!耗时:"(rtos(- etime stime)2 0)" ms"))
  27.   (princ)
  28. );---取3次测试结果,十万个圆,处理完毕!耗时:360 ms  处理完毕!耗时:359 ms  处理完毕!耗时:359 ms
分别测试了一下,供参考
发表于 2024-6-26 13:42 | 显示全部楼层
本帖最后由 gzcsun 于 2024-6-26 13:48 编辑

(defun c:gg4(/ enlst etime ss stime)
        (setq ss(ssget))
  (setq stime(getvar "MILLISECS"))
(setq  enlst (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 是最慢的。


发表于 2024-6-25 22:26 | 显示全部楼层
大神那来的,是谁的忘记了!抱歉!
(setq ss (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss))))

点评

aws
实测十万个图元,这个比repeat快。  发表于 2024-6-26 09:04
这个慢得很  发表于 2024-6-26 08:31
发表于 2024-6-26 07:00 | 显示全部楼层
好好学习,天天向上
发表于 2024-6-26 08:35 | 显示全部楼层
  1. (defun ss-to-enlst (ss / EN ENLST N)
  2.   (repeat (setq n (sslength ss))
  3.     (setq en (ssname ss (setq n (1- n))))
  4.     (setq enlst (cons en enlst))
  5.   )
  6. )
发表于 2024-6-26 09:49 | 显示全部楼层
你已经坐上火箭了,不要想简单的去坐汽车。
 楼主| 发表于 2024-6-26 10:36 | 显示全部楼层
gzcsun 发表于 2024-6-26 09:49
你已经坐上火箭了,不要想简单的去坐汽车。

没有钻研精神,没有好奇心,是学不下去编程的。
发表于 2024-6-26 13:13 | 显示全部楼层
本帖最后由 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




 楼主| 发表于 2024-6-26 13:24 | 显示全部楼层


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

您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-6-29 09:30 , Processed in 0.156981 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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