[求助]清除DWG文件中重复的线!
工作中DWG的图形文件中常常会出现一些乱七八糟的图纸,很多都是同一根线划了好几遍,而且是一个图层,有的甚至几条线相互重复起点和终点也不一样,哪位编个检测的程序,消除这种情况!<BR> CAD系统ET里带有一个程序,叫overkill的,应该够用了吧 HuaiYu 发表于 2005-11-4 23:29请试用,希望多提意见!!
(defun c:t1 (/ old_osmode old_cmdecho ss ssLine ssArc) (vl-load-com)&nb ...
非常好用 谢谢你的分享 之前找的都清理不干净 你的试了一下 清理的很干净 HuaiYu 发表于 2005-11-4 23:29
请试用,希望多提意见!!
(defun c:t1 (/ old_osmode old_cmdecho ss ssLine ssArc) (vl-load-com)&nb ...
大佬,你这个应该添加一下删除重复圆孔与弧的重复线删除,光删重复线有点那啥了:lol <P>请试用,希望多提意见!!</P>
<P>(defun c:t1 (/ old_osmode old_cmdecho ss ssLine ssArc)<BR> (vl-load-com)<BR> (setq *AcadDocument* (vla-get-activeDocument (vlax-Get-Acad-Object)))<BR> (vla-StartUndoMark *AcadDocument*)<BR> (setq old_osmode (getvar "osmode")<BR> old_cmdecho (getvar "cmdecho")<BR> )<BR>;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;<BR> (setq ss (GetSelToUnite)<BR> ssLine (car ss)<BR> ssArc (cadr ss)<BR> )<BR> (setvar "osmode" 0)<BR> (command ".ucs" "w")</P>
<P> (if (> (sslength ssLine) 1)<BR> (UniteLine ssLine)<BR> )<BR> (if (> (sslength ssArc) 1)<BR> (UniteArc ssArc)<BR> )<BR>;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;<BR> (if (> (sslength ssLine) 0)<BR> (pEdit ssLine)<BR> )<BR> (if (> (sslength ssArc) 0)<BR> (pEdit ssArc)<BR> )<BR>;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;<BR> (setvar "osmode" old_osmode)<BR> (setvar "cmdecho" old_cmdecho)<BR> (vla-EndUndoMark *AcadDocument*)<BR> (prin1)<BR>)<BR>(defun pedit (ss / i en vn startPt endPt ss1 ss2)<BR> (setq i 0)<BR> (repeat (sslength ss)<BR> (setq en (ssname ss i)<BR> i (1+ i)<BR> )<BR> (if (and (not (null (entget en))) (not (vlax-curve-isClosed (setq vn (vlax-ename->vla-object en)))))<BR> (progn<BR> (setq startPt (vlax-curve-GetStartPoint vn)<BR> endPt (vlax-curve-GetEndPoint vn)<BR> )<BR> (setq ss1 (ssget "_c" (polar startPt (* pi 0.25) 0.01) (polar startPt (* pi 1.25) 0.01)))<BR> (setq ss2 (ssget "_c" (polar endPt (* pi 0.25) 0.01) (polar endPt (* pi 1.25) 0.01)))<BR> (if (equal (strcase (vla-Get-ObjectName vn)) (strcase "AcDbPolyline"))<BR> (vl-cmdf "pedit" en "j" ss1 ss2 "")<BR> (vl-cmdf "pedit" en "y" "j" ss1 ss2 "" "")<BR> )<BR> )<BR> )<BR> )<BR>)<BR>;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;<BR>(defun GetSelToUnite (/ ss1 ssArc ssLine ss1 ss i en ss2)<BR> (setq ss1 (ssget "x")<BR> ssArc (ssadd)<BR> ssLine (ssadd)<BR> ss (ssget '((0 . "line,lwpolyline,arc")))<BR> i -1<BR> )<BR> (setvar "cmdecho" 0)<BR> (repeat (sslength ss)<BR> (setq en (ssname ss (setq i (1+ i))))<BR> (if (equal (strcase (cdr (assoc 0 (entget en)))) (strcase "lwpolyline"))<BR> (command "explode" en)<BR> )<BR> )<BR> (setq ss2 (ssget "x")<BR> i -1<BR> )<BR> (repeat (sslength ss2)<BR> (setq en (ssname ss2 (setq i (1+ i))))<BR> (if (or (not (ssmemb en ss1)) (ssmemb en ss))<BR> (cond ((equal (cdr (assoc 0 (entget en))) (strcase "line")) (ssadd en ssLine))<BR> ((equal (cdr (assoc 0 (entget en))) (strcase "arc")) (ssadd en ssArc))<BR> (t (princ "\n There is a error occured"))<BR> )<BR> )<BR> )<BR> (list ssLine ssArc)<BR>)<BR>;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;<BR>;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;<BR>(defun UniteArc (ss / i en)<BR> (vla-StartUndoMark *AcadDocument*)<BR>;;; (while (not (setq ss (ssget '((0 . "arc"))))))<BR> (setq i 0)<BR> (repeat (sslength ss)<BR> (setq en (ssname ss i)<BR> i (1+ i)<BR> )<BR> (if (not (null (entget en)))<BR> (JoinArc en)<BR> )<BR> )<BR> (vla-EndUndoMark *AcadDocument*)<BR>)<BR>;;;;;;;;;<BR>(defun JoinArc (en / vn cenPt Radius AngLst i ss MinPt MaxPt StartAngle EndAngle em vm)<BR> (setq vn (vlax-ename->vla-object en)<BR> cenPt (cdr (assoc 10 (entget en)))<BR> Radius (vla-get-radius vn)<BR> AngLst '()<BR> i -1<BR> ss (ssadd)<BR> )<BR> (vla-GetBoundingBox vn 'MinPt 'MaxPt)<BR> (setq MinPt (vlax-safearray->list MinPt)<BR> MaxPt (vlax-safearray->list MaxPt)<BR> )<BR> (setq ss (ssget "c" MinPt MaxPt (list '(0 . "arc") (append (list 10) cenPt) (cons 40 Radius)))<BR> ss (ssdel en ss)<BR> )<BR> (if ss<BR> (progn<BR> (setq StartAngle (vla-Get-StartAngle vn)<BR> EndAngle (vla-Get-EndAngle vn)<BR> )<BR> (if (< EndAngle StartAngle)<BR> (setq EndAngle (+ EndAngle (* pi 2.0)))<BR> )<BR> (setq AngLst (append AngLst (list StartAngle) (list EndAngle)))<BR> (repeat (sslength ss)<BR> (setq em (ssname ss (setq i (1+ i)))<BR> vm (vlax-ename->vla-object em)<BR> StartAngle (vla-Get-StartAngle vm)<BR> EndAngle (vla-Get-EndAngle vm)<BR> )<BR> (if (< EndAngle StartAngle)<BR> (setq EndAngle (+ EndAngle (* pi 2.0)))<BR> )<BR> (setq AngLst (append AngLst (list StartAngle) (list EndAngle)))<BR> )<BR> (setq AngLst (vl-sort AngLst '<))<BR> (vl-cmdf "erase" ss "")<BR> (vla-put-StartAngle vn (car AngLst))<BR> (vla-put-EndAngle<BR> vn<BR> (if (> (last AngLst) (* pi 2))<BR> (- (last AngLst) (* pi 2))<BR> (last AngLst)<BR> )<BR> )<BR> )<BR> )<BR>)<BR>;;;;;;;;;(setq aa (vlax-ename->vla-object (car (entsel))))<BR>;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;<BR>;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;<BR>(defun UniteLine (ss / i en)<BR> (vla-StartUndoMark *AcadDocument*)<BR>;;; (while (not (setq ss (ssget '((0 . "line"))))))<BR> (setq i 0)<BR> (repeat (sslength ss)<BR> (setq en (ssname ss i)<BR> i (1+ i)<BR> )<BR> (if (not (null (entget en)))<BR> (JoinLine en)<BR> )<BR> )<BR> (vla-EndUndoMark *AcadDocument*)<BR> (prin1)<BR>)<BR>(defun JoinLine (en / i lst_pt ang_en se ss em ang_em ssErase)<BR> (setq i 0<BR> lst_pt '()<BR> ang_en (RetAng (angle (cdr (assoc 10 (entget en))) (cdr (assoc 11 (entget en)))))<BR>;;; lst_pt (append lst_pt (list (cdr (assoc 10 (entget en)))) (list (cdr (assoc 11 (entget en)))))<BR> )<BR> (setq lst_pt (car (setq tmp (GetPtLst en)))<BR> ssErase (cadr tmp)<BR> )<BR> (if (> (length lst_pt) 2)<BR> (progn<BR> (cond ((or (equal ang_en 0.0 0.001) (equal ang_en 180.0 0.001))<BR> (setq lst_pt (vl-sort lst_pt '(lambda (e1 e2) (< (car e1) (car e2)))))<BR> )<BR> (t<BR> (setq lst_pt (vl-sort lst_pt '(lambda (e1 e2) (< (cadr e1) (cadr e2)))))<BR> )<BR> )<BR> (vla-put-startPoint (vlax-ename->vla-object en) (vlax-3d-point (car lst_pt)))<BR> (vla-put-endPoint (vlax-ename->vla-object en) (vlax-3d-point (last lst_pt)))<BR> (vl-cmdf "erase" ssErase "")<BR> )<BR> )<BR>)<BR>;;;;;;;;;;;<BR>(defun GetPtLst (en / en_10 en_11 ang_en ptLst ss i em em_10 em_11 ang_em ang_10 ang_11)<BR> (setq en_10 (cdr (assoc 10 (entget en)))<BR> en_11 (cdr (assoc 11 (entget en)))<BR> ang_en (RetAng (angle en_10 en_11))<BR> ptLst (list en_10 en_11)<BR> ssErase (ssadd)<BR> )<BR> (setq ss (ssget "c" en_10 en_11 '((0 . "line"))))<BR> (if (> (sslength ss) 1)<BR> (progn<BR> (setq i -1)<BR> (ssdel en ss)<BR> (repeat (sslength ss)<BR> (setq em (ssname ss (setq i (1+ i)))<BR> em_10 (cdr (assoc 10 (entget em)))<BR> em_11 (cdr (assoc 11 (entget em)))<BR> ang_em (RetAng (angle em_10 em_11))<BR> ang_10 (RetAng (angle en_10 em_10))<BR> ang_11 (RetAng (angle en_10 em_11))<BR> )<BR> (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> (setq ptLst (append ptLst (list em_10) (list em_11))<BR> ssErase (ssadd em ssErase)<BR> )<BR> )<BR> )<BR> )<BR> )<BR> (list ptLst ssErase)<BR>)<BR>;;;;;;;;;;;<BR>(defun RetAng (ang)<BR> (if (>= ang (- pi 0.0001))<BR> (atof (angtos (- ang pi) 0 4))<BR> (atof (angtos ang 0 4))<BR> )<BR>)<BR></P> 去<A href="http://www.10house.net/" target="_blank" >www.10house.net</A>下载一个Ycut,里面就有“删重”功能 <P>我在CAD2004中运行,出现: </P>
<P>错误: no function definition: VLAX-GET-ACAD-OBJECT</P>
<P>为什么?能改正吗?</P> 二楼老大,有这样的VBA程序吗? 很好就是看能不能将重叠圆也删除就好先谢了 很好的一样啊,就是在2004用不了,可否改下啊, 很久以前发的帖子,没想到今天来逛论坛居然浮上来了~<br/><br/>很多问题都是在工作中遇到,但是当时没办法解决,只是记了下来把问题贴了上来,后来也没去跟踪。真是惭愧。<br/><br/>愧对热心回答我的问题的兄弟,愧对各位大虾的一片热诚之心呀~<br/><br/>面壁……<br/> <p>好东西!顶一下</p>