wzg356 发表于 2025-3-12 18:26:48

2分法快速取得选择集的图元类型/图层/块名/线型等符号表 -提速方案

本帖最后由 wzg356 于 2025-3-13 19:47 编辑

使用场景有限    下载文件提供另一个方法函数 可对比

;2分法快速取得选择集的符号表--函数getSSsymbols
;选择集庞大时循环次数较常规减少70%以上---先循环取得一部分值/可能实现目标的绝大部分了
;在已取得的表去反选选择集---剩下的循环/图元数量就很少很少了

;ss选择集/nil nil时取全图,全图的线型块名样式等符号表就别用该函数了
;fls过滤表/nil---比如取块名/填充图案等式时需要区分-也大大减少循环量
;code属性指向的组码--函数的目标取得该值的表
;flag是否属性值转义t/nil--对符号型属性值有效

;运行示例
;(getSSsymbols nil nil 0 nil);取图元类型
;(getSSsymbols (ssget) nil 8 t);取图层
;(getSSsymbols nil nil 6 t);取线型
;(getSSsymbols (ssget) nil 62 nil);取颜色
;(getSSsymbols nil '((0 . "INSERT")) 2 t);取块名
;(getSSsymbols nil '((0 . "*DIMENSION,LEADER")) 3 t);取标注样式

如果要取全图图元类型,下面方法更佳,该函数仅捡漏了,取颜色同理

(progn
(setq lst '("TEXT" "MTEXT" "DIMENSION" "INSERT" "HATCH" "LINE"
                                 "LWPOLYLINE" "POLYLINE" "CIRCLE" "POINT"))
(setq lst(vl-remove-if(function(lambda(x)(not(ssget "x"(list(cons 0 x))))))lst))
(if (setq ss(ssget "x"(mapcar (function(lambda(x)(cons 0 (strcat "~" x))))lst)))
(setq lst(append(getSSsymbols ss nil 0 nil)lst))
)
)



tigcat 发表于 2025-3-12 22:06:49

如果图形在块里面,ssget "X"方法会有问题吧.

kozmosovia 发表于 2025-3-12 22:18:08

你这种思路,都没必要先循环一部分,直接先去第一个图元,然后从选择集中选一样的,和不一样的。然后对不一样的选择集,递归执行相同的操作,最后把所有一样的集合顺次组成表即可。这样循环不了几次,几乎全部都由select命令来实现。

wzg356 发表于 2025-3-12 22:41:40

本帖最后由 wzg356 于 2025-3-12 23:06 编辑

kozmosovia 发表于 2025-3-12 22:18
你这种思路,都没必要先循环一部分,直接先去第一个图元,然后从选择集中选一样的,和不一样的。然后对不一 ...
测试过的了, 实际上select/ssget也非常耗时
之所以先循环一部分,是考虑了select/ssget能尽可能抵消逐个图元循环量----二者的优势尽可能利用

wzg356 发表于 2025-3-12 22:47:06

tigcat 发表于 2025-3-12 22:06
如果图形在块里面,ssget "X"方法会有问题吧.

没思考过这种,据说子图元通常是以其头部图元存入选择集

wzg356 发表于 2025-3-13 12:51:03

3文件下Get00Styles函数有错漏,已改
页: [1]
查看完整版本: 2分法快速取得选择集的图元类型/图层/块名/线型等符号表 -提速方案