找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 3698|回复: 13

[研讨] 关于选择集变表函数测试!

[复制链接]
发表于 2013-6-3 18:38:19 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
本帖最后由 wowan1314 于 2013-6-3 18:43 编辑

     这段时间大家都在讨论mapcar函数的高效。那么要利用mapcar函数,无疑对数据需要-“变表”-操作。


     最常见的是 选择集变表 -----常见的做法是利用循环+ssname
今天突然想到可利用mapcar+ssnamex处理选择集成表!代码要少很多.
所以又进行了测试。现将测试结果公布!共同讨论。
  1. ;;;样本为:三万一条直线
  2. (DEFUN C:3W ()
  3. (SETQ ENT (ENTGET(CAR(ENTSEL))))
  4. (REPEAT 30000 (ENTMAKE ENT))
  5. )

  6. ;;测试时间函数
  7. (defun get-utime () (* 86400.0 (getvar "tdusrtimer")))

  8. ;;mapcar方法---利用SSNAMEX--------选择集变表
  9. (DEFUN c:T11 ()
  10. (SETQ SS (SSGET))
  11. (SETQ T1 (get-utime))
  12. (CDR(REVERSE (MAPCAR 'CADR (SSNAMEX SS))))
  13. (SETQ T2 (get-utime))
  14. (PRINC "\n用时:")
  15. (PRINC (- T2 T1))
  16. (PRINC "S")
  17. (PRINC)
  18. )

  19. ;;repeat方法----利用SSNAME--------选择集变表函数
  20. (DEFUN c:T12 ()
  21. (SETQ SS (SSGET))
  22. (SETQ T1 (get-utime))
  23. (ss2entl SS)
  24. (SETQ T2 (get-utime))
  25. (PRINC "\n用时:")
  26. (PRINC (- T2 T1))
  27. (PRINC "S")
  28. (PRINC)
  29. )

  30. ;;选择集变表--BY newer
  31. (defun ss2entl (ss / el i len)
  32.   (if (= 'PICKSET (type ss))
  33.     (progn
  34.       (setq i -1
  35.             len (sslength ss)
  36.       )
  37.       (repeat len
  38.         (setq el (cons (ssname ss (setq i (1+ i))) el))
  39.       )
  40.     )
  41.   )
  42.   el
  43. )
命令: T11
选择对象: 指定对角点: 找到 30001 个


选择对象:


用时:0.156S


命令:
命令: T12
选择对象: 指定对角点: 找到 30001 个


选择对象:


用时:0.015S



结论:ssnamex是个不高效的函数相对于ssname来说!

评分

参与人数 2D豆 +10 收起 理由
xshrimp + 5 出题引导交流奖!
牢固 + 5 出题引导交流奖!

查看全部评分

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 51个

财富等级: 招财进宝

发表于 2013-6-3 18:55:09 | 显示全部楼层
差一个数量级啊,葛老。你的结论及建议呢?

点评

我觉的我也被你害了。总在想函数效率问题。都没去研究算法、矩阵之类的。  详情 回复 发表于 2013-6-3 19:15
结论写了啊。 ssnamex不高效,那么久只能还是用循环来把选择集变表了。  详情 回复 发表于 2013-6-3 18:56

评分

参与人数 1D豆 +5 收起 理由
wowan1314 + 5 及时回复奖!我觉的我也被你害了,每天都在.

查看全部评分

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 2个

财富等级: 恭喜发财

发表于 2013-6-3 18:56:32 | 显示全部楼层
所有的方法中,SSNAMEX是最慢的

点评

是呀! 同样取图元名。ssnamex比ssname整整差了一个级别。  详情 回复 发表于 2013-6-3 19:02
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-6-3 18:56:44 | 显示全部楼层
Lispboy 发表于 2013-6-3 18:55
差一个数量级啊,葛老。你的结论及建议呢?

结论写了啊。 ssnamex不高效,那么久只能还是用循环来把选择集变表了。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-6-3 19:02:20 | 显示全部楼层
taner 发表于 2013-6-3 18:56
所有的方法中,SSNAMEX是最慢的

是呀! 同样取图元名。ssnamex比ssname整整差了一个级别。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-6-3 19:15:55 | 显示全部楼层
Lispboy 发表于 2013-6-3 18:55
差一个数量级啊,葛老。你的结论及建议呢?

我觉的我也被你害了。总在想函数效率问题。都没去研究算法、矩阵之类的。

点评

我好像也说过矩阵,算法啥的吧,怎么你就偏往这条路走呢。  详情 回复 发表于 2013-6-3 19:29
还有谁被我害了,都出来吧。  详情 回复 发表于 2013-6-3 19:27
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 51个

财富等级: 招财进宝

发表于 2013-6-3 19:27:58 | 显示全部楼层
wowan1314 发表于 2013-6-3 19:15
我觉的我也被你害了。总在想函数效率问题。都没去研究算法、矩阵之类的。

还有谁被我害了,都出来吧。:'(
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 51个

财富等级: 招财进宝

发表于 2013-6-3 19:29:08 | 显示全部楼层
wowan1314 发表于 2013-6-3 19:15
我觉的我也被你害了。总在想函数效率问题。都没去研究算法、矩阵之类的。

我好像也说过矩阵,算法啥的吧,怎么你就偏往这条路走呢。

点评

呵呵。你给了个容易的课题给我。。。。 人都有“避重就轻”的本能啊  详情 回复 发表于 2013-6-3 19:34
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-6-3 19:34:01 | 显示全部楼层
Lispboy 发表于 2013-6-3 19:29
我好像也说过矩阵,算法啥的吧,怎么你就偏往这条路走呢。

呵呵。你给了个容易的课题给我。。。。  人都有“避重就轻”的本能啊
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2013-6-3 19:56:51 | 显示全部楼层
获取关于选择集创建方式的信息

(ssnamex ss [index])
本函数只能查找当前图形模型空间和图纸空间中的图元,而不能查找非图形对象和其他块定义中的图元

它是不是自身加了个判断?

点评

看你的这句话的意思好像就是 SSNAME 能查找非图形对象和其他块定义中的图元?  详情 回复 发表于 2013-6-3 23:46
什么意思?  详情 回复 发表于 2013-6-3 19:57
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-6-3 19:57:57 | 显示全部楼层
QiaoCheng 发表于 2013-6-3 19:56
获取关于选择集创建方式的信息

(ssnamex ss )

什么意思?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2013-6-3 20:07:45 | 显示全部楼层
我是这么觉得的,像这些AutoLISP函数本身有的就直接拿来用就是了,
我们也不知道它的内在构造,但应该也是像我们平时自己定义的函数一样吧?

不知道是不是我想的不靠谱啊{:soso_e120:}

评分

参与人数 1D豆 +5 收起 理由
wowan1314 + 5 很靠谱!

查看全部评分

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 20个

财富等级: 恭喜发财

发表于 2013-6-3 23:46:59 | 显示全部楼层
QiaoCheng 发表于 2013-6-3 19:56
获取关于选择集创建方式的信息

(ssnamex ss )

看你的这句话的意思好像就是 SSNAME 能查找非图形对象和其他块定义中的图元?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2016-9-3 23:15:36 | 显示全部楼层
本帖最后由 llsheng_73 于 2016-9-3 23:58 编辑

t11这个函数还有点问题,如果ss是通过(ssget"X" filter)或者(ssget"F" filter)甚至是通过ssadd得到的选择集,那么ssnamex后再cdr一下就会丢掉一个图元而不是与选择窗口有关的表...
_$ (setq ss(ssget"X"))
<Selection set: 3>
_$ (sslength ss)
1
_$ (cdr(reverse(mapcar'cadr(ssnamex ss))))
nil
_$ (setq ss(ssadd(entlast)))
<Selection set: 5>
_$ (cdr(reverse(mapcar'cadr(ssnamex ss))))
nil
如果不考虑时间效率,要通过ssnamex处理选择集得到图元表也得考虑适用选择集的不同构成方式
(defun s2es(s)(reverse(mapcar'cadr(member(nth(1-(sslength s))(setq s(ssnamex s)))(reverse s)))))
其实有时最快的不一定是适用的,比如用repeat是最快,但是假如选择集内图元总数超过计算机最大整数表示范围,这时根本无法直接进行repeat了不是?当然,如果确实需要repeat还是有办法的,得采用进制换算的办法了
假设最大整数只能表示511,那么1024可以用512进制来表示为2 0,或者用500进制表示为2 24,那么就可以这样来实现循环1024次
(repeat 2(repeat 500    ...))(repeat 24 ...)这样来变通


论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-4-19 23:53 , Processed in 0.711698 second(s), 68 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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