问:
求一个cad lisp一键选取完全相同的图形
答:
在AutoCAD中,可以通过LISP编程实现一键选取完全相同的图形。思路如下:
1. 获取当前选取的图形实体,例如获取选择集合ssget的结果。
2. 获取这些图形的属性,比如层名(layer)、颜色(color)、线型(ltype)、线宽(lwidth)、样式(style)等。这些属性如果完全相同,则可认为是相同的图形。
3. 循环遍历图纸上的所有实体,检查每一个实体的属性是否与步骤2获取的选取图形属性完全匹配。
4. 如果属性匹配,则将该实体添加到选择集合,实现多选。
5. 最终,刷新重新生成选择集合ssget,就实现了一键选取所有相同属性的图形。
具体LISP代码可以这样实现:
(defun c:selectsame / ss ent attri butvalues layers styles)
(setq ss (ssget) ;获取当前选择集合
attri '(color layer ltype lwidth) ;要比较的属性列表
)
(if (= (sslength ss) 0) ;如果没有选择图形,退出
(prompt "\n没有图形被选择,请选择图形!")
(progn
(setq layers (entget (ssname ss 0)) ;获取选取图形的层属性
color (cdr (assoc 0 layers))
ltype (cdr (assoc 6 layers))
lwidth (cdr (assoc 39 layers))
style (cdr (assoc 7 layers))
butvalues (list color ltype lwidth style) ;要匹配的属性值列表
)
(prompt "\n开始搜索相同属性的图形...")
(setq ent (entnext (ssname ss (1- (sslength ss)))))
(while ent
(if (and
(equal (cdr (assoc 0 (entget ent))) color) ;检查颜色属性
(equal (cdr (assoc 6 (entget ent))) ltype) ;检查线型属性
(equal (cdr (assoc 39 (entget ent))) lwidth) ;检查线宽属性
(equal (cdr (assoc 7 (entget ent))) style) ;检查样式属性
)
(ssadd ent ss) ;添加到选择集合
)
(setq ent (entnext ent)) ;检查下一实体
)
(prin1 "\n选取完成!")
(sssetfirst ss) ;重新生成选择集合
)
)
)