aws 发表于 2024-6-25 22:03:00

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

(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 13:30:17

本帖最后由 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;



aws 发表于 2024-6-26 09:11:52

(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:42:50

本帖最后由 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 是最慢的。


`中微子 发表于 2024-6-25 22:26:52

大神那来的,是谁的忘记了!抱歉!
(setq ss (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss))))

技术工作室 发表于 2024-6-26 07:00:04

好好学习,天天向上

自贡黄明儒 发表于 2024-6-26 08:35:11

(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:55

你已经坐上火箭了,不要想简单的去坐汽车。

aws 发表于 2024-6-26 10:36:49

gzcsun 发表于 2024-6-26 09:49
你已经坐上火箭了,不要想简单的去坐汽车。

:lol没有钻研精神,没有好奇心,是学不下去编程的。

gzcsun 发表于 2024-6-26 13:13:29

本帖最后由 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




aws 发表于 2024-6-26 13:24:11

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

页: [1] 2 3
查看完整版本: 选择集转图元名表,还有没有更简洁的写法?