钾肥 发表于 2005-10-29 21:29:00

[求助]清除DWG文件中重复的线!

工作中DWG的图形文件中常常会出现一些乱七八糟的图纸,很多都是同一根线划了好几遍,而且是一个图层,有的甚至几条线相互重复起点和终点也不一样,哪位编个检测的程序,消除这种情况!<BR>

my_autocad 发表于 2008-2-26 17:08:00

CAD系统ET里带有一个程序,叫overkill的,应该够用了吧

小小的人 发表于 2020-5-8 21:22:04

HuaiYu 发表于 2005-11-4 23:29
请试用,希望多提意见!!
(defun c:t1 (/ old_osmode old_cmdecho ss ssLine ssArc)&nbsp; (vl-load-com)&nb ...

非常好用   谢谢你的分享   之前找的都清理不干净   你的试了一下   清理的很干净

至今没学会 发表于 2020-5-6 17:03:08

HuaiYu 发表于 2005-11-4 23:29
请试用,希望多提意见!!
(defun c:t1 (/ old_osmode old_cmdecho ss ssLine ssArc)&nbsp; (vl-load-com)&nb ...

大佬,你这个应该添加一下删除重复圆孔与弧的重复线删除,光删重复线有点那啥了:lol

HuaiYu 发表于 2005-11-4 23:29:00

<P>请试用,希望多提意见!!</P>
<P>(defun c:t1 (/ old_osmode old_cmdecho ss ssLine ssArc)<BR>&nbsp; (vl-load-com)<BR>&nbsp; (setq *AcadDocument* (vla-get-activeDocument (vlax-Get-Acad-Object)))<BR>&nbsp; (vla-StartUndoMark *AcadDocument*)<BR>&nbsp; (setq&nbsp;old_osmode&nbsp; (getvar "osmode")<BR>&nbsp;old_cmdecho (getvar "cmdecho")<BR>&nbsp; )<BR>;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;<BR>&nbsp; (setq&nbsp;ss&nbsp;&nbsp;&nbsp;&nbsp; (GetSelToUnite)<BR>&nbsp;ssLine (car ss)<BR>&nbsp;ssArc&nbsp; (cadr ss)<BR>&nbsp; )<BR>&nbsp; (setvar "osmode" 0)<BR>&nbsp; (command ".ucs" "w")</P>
<P>&nbsp; (if (&gt; (sslength ssLine) 1)<BR>&nbsp;&nbsp;&nbsp; (UniteLine ssLine)<BR>&nbsp; )<BR>&nbsp; (if (&gt; (sslength ssArc) 1)<BR>&nbsp;&nbsp;&nbsp; (UniteArc ssArc)<BR>&nbsp; )<BR>;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;<BR>&nbsp; (if (&gt; (sslength ssLine) 0)<BR>&nbsp;&nbsp;&nbsp; (pEdit ssLine)<BR>&nbsp; )<BR>&nbsp; (if (&gt; (sslength ssArc) 0)<BR>&nbsp;&nbsp;&nbsp; (pEdit ssArc)<BR>&nbsp; )<BR>;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;<BR>&nbsp; (setvar "osmode" old_osmode)<BR>&nbsp; (setvar "cmdecho" old_cmdecho)<BR>&nbsp; (vla-EndUndoMark *AcadDocument*)<BR>&nbsp; (prin1)<BR>)<BR>(defun pedit (ss / i en vn startPt endPt ss1 ss2)<BR>&nbsp; (setq i 0)<BR>&nbsp; (repeat (sslength ss)<BR>&nbsp;&nbsp;&nbsp; (setq en (ssname ss i)<BR>&nbsp;&nbsp; i&nbsp; (1+ i)<BR>&nbsp;&nbsp;&nbsp; )<BR>&nbsp;&nbsp;&nbsp; (if&nbsp;(and (not (null (entget en))) (not (vlax-curve-isClosed (setq vn (vlax-ename-&gt;vla-object en)))))<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (progn<BR>&nbsp;(setq startPt (vlax-curve-GetStartPoint vn)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; endPt&nbsp;&nbsp; (vlax-curve-GetEndPoint vn)<BR>&nbsp;)<BR>&nbsp;(setq ss1 (ssget "_c" (polar startPt (* pi 0.25) 0.01) (polar startPt (* pi 1.25) 0.01)))<BR>&nbsp;(setq ss2 (ssget "_c" (polar endPt (* pi 0.25) 0.01) (polar endPt (* pi 1.25) 0.01)))<BR>&nbsp;(if (equal (strcase (vla-Get-ObjectName vn)) (strcase "AcDbPolyline"))<BR>&nbsp;&nbsp; (vl-cmdf "pedit" en "j" ss1 ss2 "")<BR>&nbsp;&nbsp; (vl-cmdf "pedit" en "y" "j" ss1 ss2 "" "")<BR>&nbsp;)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<BR>&nbsp;&nbsp;&nbsp; )<BR>&nbsp; )<BR>)<BR>;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;<BR>(defun GetSelToUnite (/ ss1 ssArc ssLine ss1 ss i en ss2)<BR>&nbsp; (setq&nbsp;ss1&nbsp;&nbsp;&nbsp; (ssget "x")<BR>&nbsp;ssArc&nbsp; (ssadd)<BR>&nbsp;ssLine (ssadd)<BR>&nbsp;ss&nbsp;&nbsp;&nbsp;&nbsp; (ssget '((0 . "line,lwpolyline,arc")))<BR>&nbsp;i&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -1<BR>&nbsp; )<BR>&nbsp; (setvar "cmdecho" 0)<BR>&nbsp; (repeat (sslength ss)<BR>&nbsp;&nbsp;&nbsp; (setq en (ssname ss (setq i (1+ i))))<BR>&nbsp;&nbsp;&nbsp; (if&nbsp;(equal (strcase (cdr (assoc 0 (entget en)))) (strcase "lwpolyline"))<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (command "explode" en)<BR>&nbsp;&nbsp;&nbsp; )<BR>&nbsp; )<BR>&nbsp; (setq&nbsp;ss2 (ssget "x")<BR>&nbsp;i&nbsp;&nbsp; -1<BR>&nbsp; )<BR>&nbsp; (repeat (sslength ss2)<BR>&nbsp;&nbsp;&nbsp; (setq en (ssname ss2 (setq i (1+ i))))<BR>&nbsp;&nbsp;&nbsp; (if&nbsp;(or (not (ssmemb en ss1)) (ssmemb en ss))<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (cond ((equal (cdr (assoc 0 (entget en))) (strcase "line")) (ssadd en ssLine))<BR>&nbsp;&nbsp;&nbsp;&nbsp; ((equal (cdr (assoc 0 (entget en))) (strcase "arc")) (ssadd en ssArc))<BR>&nbsp;&nbsp;&nbsp;&nbsp; (t (princ "\n There is a error occured"))<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<BR>&nbsp;&nbsp;&nbsp; )<BR>&nbsp; )<BR>&nbsp; (list ssLine ssArc)<BR>)<BR>;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;<BR>;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;<BR>(defun UniteArc&nbsp;(ss / i en)<BR>&nbsp; (vla-StartUndoMark *AcadDocument*)<BR>;;;&nbsp; (while (not (setq ss (ssget '((0 . "arc"))))))<BR>&nbsp; (setq i 0)<BR>&nbsp; (repeat (sslength ss)<BR>&nbsp;&nbsp;&nbsp; (setq en (ssname ss i)<BR>&nbsp;&nbsp; i&nbsp; (1+ i)<BR>&nbsp;&nbsp;&nbsp; )<BR>&nbsp;&nbsp;&nbsp; (if&nbsp;(not (null (entget en)))<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (JoinArc en)<BR>&nbsp;&nbsp;&nbsp; )<BR>&nbsp; )<BR>&nbsp; (vla-EndUndoMark *AcadDocument*)<BR>)<BR>;;;;;;;;;<BR>(defun JoinArc (en / vn cenPt Radius AngLst i ss MinPt MaxPt StartAngle EndAngle em vm)<BR>&nbsp; (setq&nbsp;vn&nbsp;&nbsp;&nbsp;&nbsp; (vlax-ename-&gt;vla-object en)<BR>&nbsp;cenPt&nbsp; (cdr (assoc 10 (entget en)))<BR>&nbsp;Radius (vla-get-radius vn)<BR>&nbsp;AngLst '()<BR>&nbsp;i&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -1<BR>&nbsp;ss&nbsp;&nbsp;&nbsp;&nbsp; (ssadd)<BR>&nbsp; )<BR>&nbsp; (vla-GetBoundingBox vn 'MinPt 'MaxPt)<BR>&nbsp; (setq&nbsp;MinPt (vlax-safearray-&gt;list MinPt)<BR>&nbsp;MaxPt (vlax-safearray-&gt;list MaxPt)<BR>&nbsp; )<BR>&nbsp; (setq&nbsp;ss (ssget "c" MinPt MaxPt (list '(0 . "arc") (append (list 10) cenPt) (cons 40 Radius)))<BR>&nbsp;ss (ssdel en ss)<BR>&nbsp; )<BR>&nbsp; (if ss<BR>&nbsp;&nbsp;&nbsp; (progn<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq StartAngle (vla-Get-StartAngle vn)<BR>&nbsp;&nbsp;&nbsp;&nbsp; EndAngle&nbsp;&nbsp; (vla-Get-EndAngle vn)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (if (&lt; EndAngle StartAngle)<BR>&nbsp;(setq EndAngle (+ EndAngle (* pi 2.0)))<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq AngLst (append AngLst (list StartAngle) (list EndAngle)))<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (repeat (sslength ss)<BR>&nbsp;(setq em&nbsp; (ssname ss (setq i (1+ i)))<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vm&nbsp; (vlax-ename-&gt;vla-object em)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; StartAngle (vla-Get-StartAngle vm)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; EndAngle&nbsp; (vla-Get-EndAngle vm)<BR>&nbsp;)<BR>&nbsp;(if (&lt; EndAngle StartAngle)<BR>&nbsp;&nbsp; (setq EndAngle (+ EndAngle (* pi 2.0)))<BR>&nbsp;)<BR>&nbsp;(setq AngLst (append AngLst (list StartAngle) (list EndAngle)))<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq AngLst (vl-sort AngLst '&lt;))<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (vl-cmdf "erase" ss "")<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (vla-put-StartAngle vn (car AngLst))<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (vla-put-EndAngle<BR>&nbsp;vn<BR>&nbsp;(if (&gt; (last AngLst) (* pi 2))<BR>&nbsp;&nbsp; (- (last AngLst) (* pi 2))<BR>&nbsp;&nbsp; (last AngLst)<BR>&nbsp;)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<BR>&nbsp;&nbsp;&nbsp; )<BR>&nbsp; )<BR>)<BR>;;;;;;;;;(setq aa (vlax-ename-&gt;vla-object (car (entsel))))<BR>;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;<BR>;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;<BR>(defun UniteLine (ss / i en)<BR>&nbsp; (vla-StartUndoMark *AcadDocument*)<BR>;;;&nbsp; (while (not (setq ss (ssget '((0 . "line"))))))<BR>&nbsp; (setq i 0)<BR>&nbsp; (repeat (sslength ss)<BR>&nbsp;&nbsp;&nbsp; (setq en (ssname ss i)<BR>&nbsp;&nbsp; i&nbsp; (1+ i)<BR>&nbsp;&nbsp;&nbsp; )<BR>&nbsp;&nbsp;&nbsp; (if&nbsp;(not (null (entget en)))<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (JoinLine en)<BR>&nbsp;&nbsp;&nbsp; )<BR>&nbsp; )<BR>&nbsp; (vla-EndUndoMark *AcadDocument*)<BR>&nbsp; (prin1)<BR>)<BR>(defun JoinLine&nbsp;(en / i lst_pt ang_en se ss em ang_em ssErase)<BR>&nbsp; (setq&nbsp;i&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0<BR>&nbsp;lst_pt '()<BR>&nbsp;ang_en (RetAng (angle (cdr (assoc 10 (entget en))) (cdr (assoc 11 (entget en)))))<BR>;;;&nbsp;lst_pt (append lst_pt (list (cdr (assoc 10 (entget en)))) (list (cdr (assoc 11 (entget en)))))<BR>&nbsp; )<BR>&nbsp; (setq&nbsp;lst_pt&nbsp;(car (setq tmp (GetPtLst en)))<BR>&nbsp;ssErase&nbsp;(cadr tmp)<BR>&nbsp; )<BR>&nbsp; (if (&gt; (length lst_pt) 2)<BR>&nbsp;&nbsp;&nbsp; (progn<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (cond ((or (equal ang_en 0.0 0.001) (equal ang_en 180.0 0.001))<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq lst_pt (vl-sort lst_pt '(lambda (e1 e2) (&lt; (car e1) (car e2)))))<BR>&nbsp;&nbsp;&nbsp;&nbsp; )<BR>&nbsp;&nbsp;&nbsp;&nbsp; (t<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq lst_pt (vl-sort lst_pt '(lambda (e1 e2) (&lt; (cadr e1) (cadr e2)))))<BR>&nbsp;&nbsp;&nbsp;&nbsp; )<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (vla-put-startPoint (vlax-ename-&gt;vla-object en) (vlax-3d-point (car lst_pt)))<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (vla-put-endPoint (vlax-ename-&gt;vla-object en) (vlax-3d-point (last lst_pt)))<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (vl-cmdf "erase" ssErase "")<BR>&nbsp;&nbsp;&nbsp; )<BR>&nbsp; )<BR>)<BR>;;;;;;;;;;;<BR>(defun GetPtLst&nbsp;(en / en_10 en_11 ang_en ptLst ss i em em_10 em_11 ang_em ang_10 ang_11)<BR>&nbsp; (setq&nbsp;en_10&nbsp;(cdr (assoc 10 (entget en)))<BR>&nbsp;en_11&nbsp;(cdr (assoc 11 (entget en)))<BR>&nbsp;ang_en&nbsp;(RetAng (angle en_10 en_11))<BR>&nbsp;ptLst&nbsp;(list en_10 en_11)<BR>&nbsp;ssErase&nbsp;(ssadd)<BR>&nbsp; )<BR>&nbsp; (setq ss (ssget "c" en_10 en_11 '((0 . "line"))))<BR>&nbsp; (if (&gt; (sslength ss) 1)<BR>&nbsp;&nbsp;&nbsp; (progn<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq i -1)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (ssdel en ss)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (repeat (sslength ss)<BR>&nbsp;(setq em&nbsp;&nbsp;&nbsp;&nbsp; (ssname ss (setq i (1+ i)))<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; em_10&nbsp; (cdr (assoc 10 (entget em)))<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; em_11&nbsp; (cdr (assoc 11 (entget em)))<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ang_em (RetAng (angle em_10 em_11))<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ang_10 (RetAng (angle en_10 em_10))<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ang_11 (RetAng (angle en_10 em_11))<BR>&nbsp;)<BR>&nbsp;(if (and (equal ang_en ang_em 0.001) (or (equal ang_en ang_10 0.001) (equal ang_en ang_11 0.001)))<BR>&nbsp;&nbsp; (setq&nbsp;ptLst&nbsp;(append ptLst (list em_10) (list em_11))<BR>&nbsp;&nbsp;ssErase&nbsp;(ssadd em ssErase)<BR>&nbsp;&nbsp; )<BR>&nbsp;)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<BR>&nbsp;&nbsp;&nbsp; )<BR>&nbsp; )<BR>&nbsp; (list ptLst ssErase)<BR>)<BR>;;;;;;;;;;;<BR>(defun RetAng (ang)<BR>&nbsp; (if (&gt;= ang (- pi 0.0001))<BR>&nbsp;&nbsp;&nbsp; (atof (angtos (- ang pi) 0 4))<BR>&nbsp;&nbsp;&nbsp; (atof (angtos ang 0 4))<BR>&nbsp; )<BR>)<BR></P>

10house 发表于 2005-11-8 18:07:00

去<A href="http://www.10house.net/" target="_blank" >www.10house.net</A>下载一个Ycut,里面就有“删重”功能

liushengri 发表于 2005-12-8 08:56:00

<P>我在CAD2004中运行,出现:&nbsp;&nbsp; </P>
<P>错误: no function definition: VLAX-GET-ACAD-OBJECT</P>
<P>为什么?能改正吗?</P>

zwd0077 发表于 2005-12-17 16:02:00

二楼老大,有这样的VBA程序吗?

flfcegu168 发表于 2008-2-23 20:28:00

很好就是看能不能将重叠圆也删除就好先谢了

CAD83 发表于 2008-2-27 08:32:00

很好的一样啊,就是在2004用不了,可否改下啊,

钾肥 发表于 2008-2-28 23:04:00

很久以前发的帖子,没想到今天来逛论坛居然浮上来了~<br/><br/>很多问题都是在工作中遇到,但是当时没办法解决,只是记了下来把问题贴了上来,后来也没去跟踪。真是惭愧。<br/><br/>愧对热心回答我的问题的兄弟,愧对各位大虾的一片热诚之心呀~<br/><br/>面壁……<br/>

liuhoujun 发表于 2008-4-1 10:25:00

<p>好东西!顶一下</p>
页: [1] 2 3
查看完整版本: [求助]清除DWG文件中重复的线!