[求助]请教高手!!另类删重复图元LISP!!!
<P> 请教:在论坛上有很多删重复图元的LISP我试了都有如下问题:在一条线上如有重复一条和它不一样长的线时不能删除此重复线!!!请教有办法解决吗??(但是要求不能把不在同一个图层的图元删除!))))</P><P> 谢谢了!!!!!</P> 本帖最后由 lee50310 于 2020-2-18 23:59 编辑
來源位置:https://forum.bricsys.com/discussion/33192/overkill-in-lisp-routine
試試這段代碼, 可完全删除重叠图元
;;圈选范围,删除重叠图元
;;
(defun c:Test (/ ss item)
(if (setq ss (ssget))
(progn
(command "-overkill" ss "" "Ignore" "lweight" "Ignore" "Layer" "")
(foreach item (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss)))
(if (not (entget item))
(setq ss (ssdel item ss))
)
)
)
)
(princ)
)
尘缘一生 发表于 2019-12-27 00:29
delCircleArc
Li_item
这个删除重叠图元scty基本已经有全部重叠对象删除功能
http://bbs.mjtd.com/plugin.php?id=imc_attachplug:attachad&aid=MTA0NjA1fGNjZGQ3MjM1fDE1NzczOTQxMzF8NzMyNjY2NnwxNzk1Mzg%3D 自贡黄明儒 发表于 2013-5-19 08:42
这个是我的overkill之路上自己写的东西
delCircleArc
Li_item
ArcJoin
能补上这三个函数吗? 用express tools 中的overkill <P>试试这个</P>
<P>;;;图元合并<BR>(defun c:tyhb (/ ARC_LIST ENT I LINE_LIST SS)<BR> (while (and<BR> (setq ss (ssget (list (cons -4 "<or")<BR> (cons 0 "arc")<BR> (cons 0 "CIRCLE")<BR> (cons 0 "line")<BR> (cons -4 "or>")<BR> )<BR> )<BR> )<BR> (> (sslength ss) 0)<BR> )<BR> (hbzhx ss)<BR> )<BR> (princ)<BR> )<BR>(defun cs_pross (to i / CS_TEXT MYI)<BR> (setq cs_text ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>")<BR> (setq myi (fix (/ (* (strlen cs_text) i) to))<BR> cs_text (substr cs_text 1 myi)<BR> )<BR> (grtext -2 cs_text)<BR> )</P>
<P>(defun hbzhx ( ss / ARC_LIST ENT I LINE_LIST SS jd)<BR>;;; 转为数据表<BR> (grtext -2 "正在整理数据")<BR> (setq i 0 jd 1e-5<BR> line_list ' ()<BR> arc_list '()<BR> )<BR> (repeat (sslength ss)<BR> (setq ent (ssname ss i)<BR> i (1+ i)<BR> )<BR> (if (= "LINE" (cdr (assoc 0 (entget ent))))<BR> (setq line_list (cons (line_data ent) line_list))<BR> (setq arc_list (cons (arc_data ent) arc_list))<BR> )<BR> )<BR> (setq line_list (vl-sort line_list<BR> '(lambda (e1 e2)<BR> (if (equal (car e1) (car e2) jd)<BR> (if (equal (cadr e1) (cadr e2) jd)<BR> (if (equal (car (caddr e1)) (car (caddr e2)) jd)<BR> (< (cadr (caddr e1)) (cadr (caddr e2)))<BR> (< (car (caddr e1)) (car (caddr e2)))<BR> )<BR> (< (cadr e1) (cadr e2))<BR> )<BR> (< (car e1) (car e2))<BR> )<BR> )<BR> )<BR> )<BR> (setq arc_list (vl-sort arc_list<BR> '(lambda (e1 e2)<BR> (if (equal (car e1) (car e2) jd)<BR> (if (equal (cadr e1) (cadr e2) jd)<BR> (if (equal (caddr e1) (caddr e2) jd)<BR> (< (cadddr e1) (cadddr e2))<BR> (< (caddr e1) (caddr e2))<BR> )<BR> (< (cadr e1) (cadr e2))<BR> )<BR> (< (car e1) (car e2))<BR> )<BR> )<BR> )<BR> )<BR> (if line_list (hb_line line_list jd))<BR> (if arc_list (hb_arc arc_list jd))<BR> (grtext)<BR> (princ)<BR> )<BR>(defun hb_line (line_list jd / B BIAOJI DATA ENT K LINE_A LINE_B P1 P2 P3 P4 P5 JD XUHAO ZONGSHU i lay)<BR> (setq zongshu (length line_list)<BR> i 0<BR> xuhao 0)<BR> (princ (strcat "\n共处理" (rtos zongshu) "个实体"))<BR> (grtext -1 "合并直线")<BR> (while (> (length line_list) 0) <BR> (setq xuhao (1+ xuhao))<BR> (cs_pross zongshu xuhao)<BR> (setq line_a (car line_list)<BR> line_list (cdr line_list)<BR> biaoji t<BR> k (car line_a)<BR> b (cadr line_a)<BR> p1 (caddr line_a)<BR> p2 (cadddr line_a)<BR> ent (last line_a)<BR> lay (cdr (assoc 8 (entget ent)))<BR> )<BR> (while (and biaoji<BR> (> (length line_list) 0)<BR> )<BR> (setq line_b (car line_list)<BR> )<BR> (cond<BR> ((and (equal k (car line_b) jd)<BR> (equal b (cadr line_b) jd)<BR> (= lay (cdr (assoc 8 (entget (last line_b)))))<BR> )<BR> (setq p3 (caddr line_b)<BR> p4 (cadddr line_b)<BR> p5 (vl-sort (list p1 p2 p3 p4)<BR> '(lambda (e1 e2)<BR> (if (equal (car e1) (car e2) jd)<BR> (< (cadr e1) (cadr e2))<BR> (< (car e1) (car e2))<BR> )<BR> )<BR> )<BR> p4 (cadr p5)<BR> )<BR> (if (or (equal p1 p4 jd)<BR> (equal p3 p4 jd)<BR> )<BR> (progn<BR> (setq p1 (car p5)<BR> p2 (last p5)<BR> line_list (cdr line_list)<BR> )<BR> (entdel (last line_b))<BR> (setq xuhao (1+ xuhao))<BR> (cs_pross zongshu xuhao)<BR> (setq i (1+ i))<BR> )<BR> (setq biaoji nil)<BR> )<BR> )<BR> (t (setq biaoji nil))<BR> )<BR> )<BR> (setq data (entget ent)<BR> data (subst (cons 10 p1) (assoc 10 data) data)<BR> data (subst (cons 11 p2) (assoc 11 data) data)<BR> )<BR> (entmod data)<BR> )<BR> (princ (strcat ",删除了" (rtos i) "个实体"))<BR> (princ)<BR> )<BR>(defun hb_arc (arc_list jd / i ARC_A ARC_B BIAOJI BJ DATA EANGL EANGL1 ENT JD LINE_LIST P5 PC SANGL SANGL1 XUHAO ZONGSHU lay)<BR> (setq zongshu (length arc_list)<BR> xuhao 0<BR> i 0)<BR> (princ (strcat "\n共处理" (rtos zongshu) "个实体"))<BR> (grtext -1 "合并圆弧")<BR> (while (> (length arc_list) 0)<BR> (setq xuhao (1+ xuhao))<BR> (cs_pross zongshu xuhao)<BR> (setq arc_a (car arc_list)<BR> arc_list (cdr arc_list)<BR> biaoji t<BR> bj (car arc_a)<BR> pc (list (cadr arc_a) (caddr arc_a))<BR> sangl (cadddr arc_a)<BR> eangl (nth 4 arc_a)<BR> ent (last arc_a)<BR> lay (cdr (assoc 8 (entget ent)))<BR> )<BR> (while (and biaoji<BR> (> (length arc_list) 0)<BR> )<BR> (setq arc_b (car arc_list)<BR> )<BR> (cond<BR> ((and (equal bj (car arc_b) jd)<BR> (equal pc (list (cadr arc_b) (caddr arc_b)) jd)<BR> (= lay (cdr (assoc 8 (entget (last arc_b)))))<BR> )<BR> (setq sangl1 (cadddr arc_b)<BR> eangl1 (nth 4 arc_b)<BR> p5 (vl-sort (list sangl eangl sangl1 eangl1)<BR> '(lambda (e1 e2)<BR> (< e1 e2)<BR> )<BR> )<BR> sangl1 (nth (- (length p5) 2) p5)<BR> )<BR> (if (or (equal eangl sangl1 jd)<BR> (equal eangl1 sangl1 jd)<BR> )<BR> (progn<BR> (setq sangl (car p5)<BR> eangl (last p5)<BR> arc_list (cdr arc_list)<BR> )<BR> (entdel (last arc_b))<BR> (setq xuhao (1+ xuhao))<BR> (cs_pross zongshu xuhao)<BR> (setq i (1+ i))<BR> )<BR> (setq biaoji nil)<BR> )<BR> )<BR> (t (setq biaoji nil))<BR> )<BR> )<BR> (setq data (entget ent)<BR> data (subst (cons 50 sangl) (assoc 50 data) data)<BR> data (subst (cons 51 eangl) (assoc 51 data) data)<BR> )<BR> (entmod data)<BR> )<BR> (princ (strcat ",删除了" (rtos i) "个实体"))<BR> (princ)<BR> )<BR>(defun arc_data (ent / BJ DATA EANGL PC SANGL)<BR> (setq data (entget ent))<BR> (setq bj (cdr (assoc 40 data)))<BR> (setq pc (cdr (assoc 10 data)))<BR> (setq sangl (cdr (assoc 50 data)))<BR> (setq eangl (cdr (assoc 51 data)))<BR> (if (not sangl)<BR> (setq sangl 0.0<BR> eangl (+ pi pi)<BR> )<BR> )<BR> (if (< eangl sangl)<BR> (setq eangl (+ eangl (+ pi pi)))<BR> )<BR> (list bj (car pc) (cadr pc) sangl eangl ent)<BR>)</P>
<P> (defun line_data (ent / B K P1 P2 jd)<BR> (setq p1 (vlax-curve-getstartpoint ent)<BR> p2 (vlax-curve-getendpoint ent)<BR> jd 1e-5<BR> )<BR> (if (equal (car p1) (car p2) jd)<BR> (setq k nil<BR> b (car p1)<BR> )<BR> (setq k (/ (- (cadr p2) (cadr p1))<BR> (- (car p2) (car p1))<BR> )<BR> b (- (cadr p1) (* (car p1) k))<BR> )<BR> )<BR> (setq p2 (vl-sort (list p1 p2)<BR> '(lambda (e1 e2)<BR> (if (equal (car e1) (car e2) jd)<BR> (< (cadr e1) (cadr e2))<BR> (< (car e1) (car e2))<BR> )<BR> )<BR> )<BR> p1 (car p2)<BR> p2 (cadr p2)<BR> )<BR> (list k<BR> b<BR> (list (car p1) (cadr p1))<BR> (list (car p2) (cadr p2))<BR> ent<BR> )<BR> )</P> 三楼的好酷,我要试一下。顶! 太好了,谢谢你了!!! 楼主辛苦啦,我先试试看好用不,谢谢你了 <P>那么长,工也试一下,</P>
<P>真的不错唉</P> 非多义线的同一图层重复图元能删除,一直想找个能取代OVERKILL的类似外挂! 其实本论坛上早就有了(谁写的忘了),写得很经典,从中我看到的是智慧
我回复在晓东论坛上,晓东马上加分了,老大就是老大,慧眼识珠.
;;8 删除重叠多段线、线、弧、块、文字
(DEFUN HH:delBLOCKs (ss / E EN K LIST1 S9 XY)
(repeat (setq k (sslength ss))
(spin "重叠对象")
(if (and (setq e (ssname ss (setq k (1- k))))
(setq en (entget e))
)
(progn
(setq xy (cdr en))
(IF (SETQ S9 (ASSOC 5 XY))
(SETQ XY (subst '(5 . "ASD") S9 XY))
)
(if (member xy list1)
(entdel e)
(setq list1 (cons xy list1))
)
)
)
)
)
这个是我的overkill之路上自己写的东西
;;5.2先删除与圆同心的圆和圆弧,然后同心同半径圆弧合并
;;(setq ss (ssget "X" '((0 . "ARC"))))
(defun del-Circles
(ss ssCircle / CEN E E1 E2 EN EN1 EN2 I N N1 R SS SSARC)
(delCircleArc ssCircle) ;删除与圆同心的圆和圆弧
(if ss
(repeat (setq n (sslength ss))
(spin "合并圆弧")
(if (and (setq e (ssname ss (setq n (1- n))))
(setq en (entget e))
)
(progn
(setq Cen (Li_item 10 en))
(setq R (Li_item 40 en))
(setq ssArc (ssget "x"
(list (cons 0 "ARC")
(cons 10 Cen)
(cons 40 R)
)
)
)
(repeat (setq n1 (sslength ssArc))
(if (and (setq e1 (ssname ssArc (setq n1 (1- n1))))
(setq en1 (entget e1))
)
(progn
(setq i n1)
(while (and (> i 0) ssArc)
(if (and (setq e2 (ssname ssArc (setq i (1- i))))
(setq en2 (entget e2))
)
(ArcJoin e1 e2 ssArc)
)
)
)
)
)
)
)
)
)
(princ)
)
页:
[1]
2