马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
不遍历选择集获得实体表的方法
第一个代码:
- (defun ss->ents (ss)
- (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss)))
- )
命令: (ss->ents ss)
(<图元名: -bea4e8> <图元名: -24db50> <图元名: -24db68> <图元名: -24db80>)
第二个代码:
通常的遍历选择集的代码
- (defun ss->ents1 (ss)
- (setq i (sslength ss))
- (repeat i
- (setq ents (cons (ssname ss (setq i (1- i))) ents))
- )
- )
命令: (ss->ents1 ss)
(<图元名: -bea4e8> <图元名: -24db50> <图元名: -24db68> <图元名: -24db80>)
上面哪个效率高呢? 测试下,18000个实体
测试代码:
- (defun c:tt ()
- (setq ss (ssget "x"))
- (setq ti (car (_vl-times)))
- (setq a (ss->ents ss))
- (prompt (strcat "\n实体数:" (itoa (length a)) "...Elapsed time : "))
- (princ (rtos (/ (- (car (_vl-times)) ti) 1000.0) 2 50))
- (setq ti (car (_vl-times)))
- (setq a (ss->ents1 ss))
- (prompt (strcat "\n实体数:" (itoa (length a)) "...Elapsed time : "))
- (princ (rtos (/ (- (car (_vl-times)) ti) 1000.0) 2 50))
- (princ)
- )
命令: tt
实体数:18000...Elapsed time : 0.079
实体数:18000...Elapsed time : 0.015
命令:
命令: tt
实体数:18000...Elapsed time : 0.078
实体数:18000...Elapsed time : 0.016
命令:
命令: tt
实体数:18000...Elapsed time : 0.078
实体数:18000...Elapsed time : 0.016
测试结果: 第二个代码效率要高的多
==============================
那么,遍历选择集从头开始,和从末尾往前哪个效率高呢?
第一种代码,从前往后遍历
- (defun ss->ents1 (ss / i ents)
- (setq len (sslength ss) i -1)
- (repeat len
- (setq ents (cons (ssname ss (setq i (1+ i))) ents))
- )
- (reverse ents)
- )
第二种代码,从末尾往前遍历,少了一个reverse的操作。
- (defun ss->ents2 (ss)
- (setq i (sslength ss))
- (repeat i
- (setq ents (cons (ssname ss (setq i (1- i))) ents))
- )
- )
测试代码:
- (defun c:tt ()
- (setq ss (ssget "x"))
- (setq ti (car (_vl-times)))
- (setq a (ss->ents1 ss))
- (prompt (strcat "\n实体数:" (itoa (length a)) "...Elapsed time : "))
- (princ (rtos (/ (- (car (_vl-times)) ti) 1000.0) 2 50))
- (setq ti (car (_vl-times)))
- (setq a (ss->ents2 ss))
- (prompt (strcat "\n实体数:" (itoa (length a)) "...Elapsed time : "))
- (princ (rtos (/ (- (car (_vl-times)) ti) 1000.0) 2 50))
- (princ)
- )
测试结果:
命令: tt
实体数:18000...Elapsed time : 0.04699999999999999
实体数:18000...Elapsed time : 0.015
命令:
命令: tt
实体数:18000...Elapsed time : 0.015
实体数:18000...Elapsed time : 0.016
命令:
命令: tt
实体数:18000...Elapsed time : 0.016
实体数:18000...Elapsed time : 0.015
命令:
命令: tt
实体数:18000...Elapsed time : 0.015
实体数:18000...Elapsed time : 0.016
命令:
命令: tt
实体数:18000...Elapsed time : 0.016
实体数:18000...Elapsed time : 0.015
命令:
命令: tt
实体数:18000...Elapsed time : 0.016
实体数:18000...Elapsed time : 0.015
命令:
命令: tt
实体数:18000...Elapsed time : 0.016
实体数:18000...Elapsed time : 0.015
命令:
命令: tt
实体数:18000...Elapsed time : 0.04699999999999999
实体数:18000...Elapsed time : 0.015
表明: 从前往后遍历和 从后往前遍历选择集得到实体表,效率基本相同。从前往后遍历不会因为多一个reverse操作减慢多少。这个可以说明从后往前遍历选集,ssname 这个效率比从前往后顺序来要耗费多些时间,平衡了reverse的耗费。
|