关于窗口选择与窗交选择重复计算图元数量的问题
用过跟多批量选择的插件,贱人工具箱的不支持选择名称有特殊字符的以及动态块,小菜版选择易功能强大,但对于我需要频繁使用的部分需求来说,小菜版选择易的操作还是相对有些繁琐,所以抽空攒了这么个插件。今天突然发现了一个小BUG,复现条件如下:
输入命令后,窗口选择一次,再窗交选择一次,如果两次选择(两种选择不分先后顺序)的图元中有重复,重复的图元会在特性面板的总选择数量中重复计入。
程序源码、测试文件和问题录屏演示已上传附件,还请各位大佬不吝赐教
N 在执行 ssget 操作的过程中,为选定图元调用 ssnamex 获得容器块和转换矩阵的附加信息。只有通过窗口、窗交点拾取等图形选择方法选定的图元,这一附加信息才可以使用。与其他对象选择方法不同,:N 可能会返回选择集中的多个同名图元。例如,如果用户选择了一个复杂图元(如 BlockReference、PolygonMesh 或老式多段线)的子图元,那么 ssget 将查看该子图元是否已被选中。不过,ssget 实际上会将主图元(如 BlockReference 和 PolygonMesh)添加到选择集中。这样就会在选择集中出现多个同名图元,而 ssnamex 获得的每个图元的子图元信息各不相同。
(defun xyp-dxf (code e) (cdr (assoc code (entget e))))
(defun GetBn (s1) (vla-get-EffectiveName (vlax-ename->vla-object s1)))
(defun c:XK-KX () ;按块名框选同名快
(if (and (setq s1 (car (entsel "\请选择一个图块: ")))
(= (xyp-DXF 0 s1) "INSERT")
(setq bn (GetBn s1))
(setq ss (ssget (list '(0 . "insert") (cons 2 bn))))
)
(progn
(sssetfirst nil ss)
(princ (strcat "\n共选中 |"(itoa (sslength ss))"| 个块,块名 |" bn "| "))
)
)
(princ)
)
(defun c:XK-QX () ;按块名全选同名快
(if (and (setq s1 (car (entsel "\请选择一个图块: ")))
(= (xyp-DXF 0 s1) "INSERT")
(setq bn (GetBn s1))
(setq ss (ssget "X" (list '(0 . "insert") (cons 2 bn))))
)
(progn
(sssetfirst nil ss)
(princ (strcat "\n共选中 |"(itoa (sslength ss))"| 个块,块名 |" bn "| "))
)
)
(princ)
)
(defun c:dK-KX () ;按块名框选同名快删除
(if (and (setq s1 (car (entsel "\请选择一个图块: ")))
(= (xyp-DXF 0 s1) "INSERT")
(setq bn (GetBn s1))
(setq ss (ssget (list '(0 . "insert") (cons 2 bn))))
)
(command "erase" ss "")
)
(princ)
)
(defun c:dK-QX () ;按块名全选同名快删除
(if (and (setq s1 (car (entsel "\请选择一个图块: ")))
(= (xyp-DXF 0 s1) "INSERT")
(setq bn (GetBn s1))
(setq ss (ssget "X" (list '(0 . "insert") (cons 2 bn))))
)
(command "erase" ss "")
)
(princ)
)
看起来bug是因为过滤器实现了,但是没有重构选择集
页:
[1]