- 积分
- 3466
- 明经币
- 个
- 注册时间
- 2010-9-4
- 在线时间
- 小时
- 威望
-
- 金钱
- 个
- 贡献
-
- 激情
-
|
发表于 2019-12-4 05:00:19
|
显示全部楼层
如果能保证圆心相同,那很好处理,否则需要设置容错值.
(defun c:ttt ( / fuzz ss lst_en y lst_tmp y_10 lst_en wyl:ss2ptlistatlst wyl:ss2ptlist)
(setq fuzz 20);设置容错值
;;选择集转为dxf列表
;;说明:传入选择集,将对应的组码返回
;;参数:ss:选择集
;;参数:dxf:组码,例如10代表插入点,0代表对象类型,2代表对象名,8代表图层,-1是图元名
;;返回:列表
(defun wyl:ss2ptlist ( ss dxf / n i elist )
;(defun ss2ptlist ( ss / )
(setq n (if (= (type ss) 'Pickset) (sslength ss) 0)
elist '()
)
(repeat n
(setq elist (cons (cdr (assoc dxf (entget (ssname ss (setq n (1- n)))))) elist))
)
)
;|
选择集转为dxf列表
说明:传入选择集或图元列表,将对应的组码返回
参数:ss:选择集
参数:dxf:组码组成的列表,例如10代表插入点,0代表对象类型,2代表对象名,8代表图层,-1是图元名
可以仅为一个int,可用""代替-1即图元名.
返回:列表,每个子项的顺序和参数相同
(wyl:ss2ptlistatlst ss1 "") 返回(图元名 图元名)
(wyl:ss2ptlistatlst ss1 -1) 返回(图元名 图元名)
(wyl:ss2ptlistatlst ss1 8) 返回(图层 图层)
(wyl:ss2ptlistatlst ss1 (-1 8)) 返回((图元名 图层)(图元名 图层))
(wyl:ss2ptlistatlst ss1 ("" 8)) 返回((图元名 图层)(图元名 图层))
新增支持传入图元列表
|;
(defun wyl:ss2ptlistatlst ( ss dxflst / n elist falg elistr )
(if (not (listp dxflst));如果不是列表,转换成列表,统一一下,其实这里统一了也没什么意义
(setq dxflst (list dxflst)))
(setq falg (length dxflst));设置一个标志,方便下面确定返回值
(setq dxflst(subst -1 "" dxflst ));把""替换成-1
(if (= (type ss) 'Pickset) ;如果传入的参数为选择集
(setq ss (wyl:ss2ptlist ss -1));把选择集转换成图元列表
)
;(setq n (if (= (type ss) 'Pickset) (sslength ss) 0))
(foreach x ss
(setq elist nil);每次循环要先把这里清0
(cond
((= 1 falg)
(setq elist (cdr (assoc (car dxflst) (entget x))))
)
(t
(foreach y dxflst
(setq elist (append elist (list (cdr (assoc y (entget x)))) ))
)
)
)
(setq elistr (append (list elist) elistr))
)
)
;main
(setq ss (ssget '((0 . "CIRCLE"))))
(setq lst_en (wyl:ss2ptlistatlst ss (list -1 10 40)));返回值为((图元名 坐标 半径) (图元名 坐标 半径))
(while (> (length lst_en) 1);当只剩一个图元的时候,退出循环
(setq y (nth 0 lst_en )
lst_tmp (list y);临时列表
y_10 (cadr y);参照图元的坐标
lst_en (vl-remove y lst_en)
);获取首个图元,并将其从列表中删除
(setq x (nth 0 lst_en))
(foreach x lst_en;根据圆心分组处理
(if (<= (distance y_10 (cadr x)) fuzz);如果圆心距离不大于容错值
(setq lst_tmp (append lst_tmp (list x))
lst_en (vl-remove x lst_en)
);将x从图元列表中删除,并加入到临时列表中
));endforeach
(if (> (length lst_tmp) 1);如果有与第一个图元同心的圆
(progn
(setq lst_tmp (cdr (vl-sort lst_tmp '(lambda(x y) (< (caddr x) (caddr y))))));根据直径排序,最小的在最前被删除
(foreach x lst_tmp
(entdel (car x));删除其余的图元
)
)
);endif
);endwhile
)
(princ) |
|