dkj0322 发表于 2010-10-12 09:38:00

[求助]这个程序出了问题,请求高手指点迷津!谢谢!

<p><font face="Verdana">;;消除重复线条&nbsp;&nbsp; <br/>(defun c:XCF(/ dxf tang chg_ent on_ent undup os 2pi sline sarc scircle n ss ent pmt)<br/>&nbsp;&nbsp;&nbsp;&nbsp; (defun dxf(ent i)<br/>&nbsp;&nbsp;&nbsp;&nbsp; (cdr (assoc i (entget ent)))<br/>&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp;&nbsp; (defun tang(ang sty)<br/>&nbsp;&nbsp;&nbsp;&nbsp; (rem (+ 2pi ang) sty)<br/>&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp;&nbsp; (defun chg_ent(ent i pt / en)<br/>&nbsp;&nbsp;&nbsp;&nbsp; (setq en (entget ent) en (subst (cons i pt) (assoc i en) en))<br/>&nbsp;&nbsp;&nbsp;&nbsp; (entmod en)<br/>&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp;&nbsp; (defun on_ent(a a1 a2 sty)<br/>&nbsp;&nbsp;&nbsp;&nbsp; (if (= sty "直线")<br/>&nbsp;&nbsp;&nbsp;&nbsp; (equal (+ (distance a1 a) (distance a a2)) (distance a1 a2) 0.01)<br/>&nbsp;&nbsp;&nbsp;&nbsp; (if (&gt; a2 a1) (&gt;= a2 a a1) (or (&lt;= a a2) (&gt;= a a1)))<br/>&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp;&nbsp; (defun undup(s sty / nm m ss ent1 spt1 ept1 cpt1 r1 ent2 spt2 ept2 cpt2 r2)<br/>&nbsp;&nbsp;&nbsp;&nbsp; (setq n -1 nm 0)<br/>&nbsp;&nbsp;&nbsp;&nbsp; (if (= sty "圆")<br/>&nbsp;&nbsp;&nbsp;&nbsp; (repeat (sslength s)<br/>&nbsp;&nbsp;&nbsp;&nbsp; (setq ent1 (ssname s (setq n (1+ n))))<br/>&nbsp;&nbsp;&nbsp;&nbsp; (if (entget ent1)<br/>&nbsp;&nbsp;&nbsp;&nbsp; (progn<br/>&nbsp;&nbsp;&nbsp;&nbsp; (setq cpt1 (dxf ent1 10) r1 (dxf ent1 40))<br/>&nbsp;&nbsp;&nbsp;&nbsp; (if (setq ss (ssget "x" (list (cons 0 "circle") (cons 10 cpt1) (cons 40 r1))))<br/>&nbsp;&nbsp;&nbsp;&nbsp; (progn<br/>&nbsp;&nbsp;&nbsp;&nbsp; (ssdel ent1 ss)<br/>&nbsp;&nbsp;&nbsp;&nbsp; (setq m -1)<br/>&nbsp;&nbsp;&nbsp;&nbsp; (repeat (sslength ss)<br/>&nbsp;&nbsp;&nbsp;&nbsp; (setq ent (ssname ss (setq m (1+ m))))<br/>&nbsp;&nbsp;&nbsp;&nbsp; (if (not (ssmemb ent s))<br/>&nbsp;&nbsp;&nbsp;&nbsp; (progn<br/>&nbsp;&nbsp;&nbsp;&nbsp; (ssdel ent ss)<br/>&nbsp;&nbsp;&nbsp;&nbsp; (setq m (1- m))<br/>&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp;&nbsp; (command "_.erase" ss "")<br/>&nbsp;&nbsp;&nbsp;&nbsp; (setq nm (+ nm (sslength ss)))<br/>&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp;&nbsp; (repeat (sslength s)<br/>&nbsp;&nbsp;&nbsp;&nbsp; (setq ent1 (ssname s (setq n (1+ n))))<br/>&nbsp;&nbsp;&nbsp;&nbsp; (if (entget ent1)<br/>&nbsp;&nbsp;&nbsp;&nbsp; (progn<br/>&nbsp;&nbsp;&nbsp;&nbsp; (if (= sty "直线")<br/>&nbsp;&nbsp;&nbsp;&nbsp; (setq spt1 (dxf ent1 10) ept1 (dxf ent1 11))<br/>&nbsp;&nbsp;&nbsp;&nbsp; (setq spt1 (tang (dxf ent1 50) 2pi)<br/>&nbsp;&nbsp;&nbsp;&nbsp; ept1 (tang (dxf ent1 51) 2pi)<br/>&nbsp;&nbsp;&nbsp;&nbsp; cpt1 (dxf ent1 10)<br/>&nbsp;&nbsp;&nbsp;&nbsp; r1 (dxf ent1 40)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp;&nbsp; (if (setq ss (if (= sty "直线")<br/>&nbsp;&nbsp;&nbsp;&nbsp; (ssget "cp" (list (polar spt1 (angle ept1 spt1) 0.1)<br/>&nbsp;&nbsp;&nbsp;&nbsp; (polar ept1 (- (angle spt1 ept1) (/ pi 4)) 0.15)<br/>&nbsp;&nbsp;&nbsp;&nbsp; (polar ept1 (+ (angle spt1 ept1) (/ pi 4)) 0.15)<br/>&nbsp;&nbsp;&nbsp;&nbsp; ) '((0 . "line"))<br/>&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp;&nbsp; (ssget "x" (list (cons 0 "arc") (cons 10 cpt1) (cons 40 r1)))<br/>&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp;&nbsp; (progn<br/>&nbsp;&nbsp;&nbsp;&nbsp; (ssdel ent1 ss)<br/>&nbsp;&nbsp;&nbsp;&nbsp; (setq m -1)<br/>&nbsp;&nbsp;&nbsp;&nbsp; (repeat (sslength ss)<br/>&nbsp;&nbsp;&nbsp;&nbsp; (setq ent (ssname ss (setq m (1+ m))))<br/>&nbsp;&nbsp;&nbsp;&nbsp; (if (not (ssmemb ent s))<br/>&nbsp;&nbsp;&nbsp;&nbsp; (progn<br/>&nbsp;&nbsp;&nbsp;&nbsp; (ssdel ent ss)<br/>&nbsp;&nbsp;&nbsp;&nbsp; (setq m (1- m))<br/>&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp;&nbsp; (setq m -1)<br/>&nbsp;&nbsp;&nbsp;&nbsp; (repeat (sslength ss)<br/>&nbsp;&nbsp;&nbsp;&nbsp; (setq ent2 (ssname ss (setq m (1+ m))))<br/>&nbsp;&nbsp;&nbsp;&nbsp; (if (= sty "直线")<br/>&nbsp;&nbsp;&nbsp;&nbsp; (setq spt2 (dxf ent2 10)<br/>&nbsp;&nbsp;&nbsp;&nbsp; ept2 (dxf ent2 11)<br/>&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp;&nbsp; setq spt2 (tang (dxf ent2 50) 2pi)<br/>&nbsp;&nbsp;&nbsp;&nbsp; ept2 (tang (dxf ent2 51) 2pi)<br/>&nbsp;&nbsp;&nbsp;&nbsp; cpt2 (dxf ent2 10)<br/>&nbsp;&nbsp;&nbsp;&nbsp; r2 (dxf ent2 40)<br/>&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp;&nbsp; (cond<br/>&nbsp;&nbsp;&nbsp;&nbsp; ((and (on_ent spt2 spt1 ept1 sty) (on_ent ept2 spt1 ept1 sty))<br/>&nbsp;&nbsp;&nbsp;&nbsp; (entdel ent2)<br/>&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp;&nbsp; ((and (on_ent spt1 spt2 ept2 sty) (on_ent ept1 spt2 ept2 sty))<br/>&nbsp;&nbsp;&nbsp;&nbsp; (entdel ent1)<br/>&nbsp;&nbsp;&nbsp;&nbsp; (setq ent1 ent2 spt1 spt2 ept1 ept2)<br/>&nbsp;&nbsp;&nbsp;&nbsp; (if (= sty "圆弧")<br/>&nbsp;&nbsp;&nbsp;&nbsp; (setq cpt1 cpt2 r1 r2)<br/>&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp;&nbsp; ((and (if (= sty "直线")<br/>&nbsp;&nbsp;&nbsp;&nbsp; (equal (tang (angle spt1 ept1) pi) (tang (angle spt2 ept2) pi) 0.001)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; T<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp;&nbsp; (or (on_ent spt2 spt1 ept1 sty) (on_ent ept2 spt1 ept1 sty))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp;&nbsp; (entdel ent2)<br/>&nbsp;&nbsp;&nbsp;&nbsp; (if (= sty "直线")<br/>&nbsp;&nbsp;&nbsp;&nbsp; (progn<br/>&nbsp;&nbsp;&nbsp;&nbsp; (if (on_ent spt2 spt1 ept1 sty)<br/>&nbsp;&nbsp;&nbsp;&nbsp; (setq spt2 ept2)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp;&nbsp; (if (&gt; (distance spt1 spt2) (distance ept1 spt2))<br/>&nbsp;&nbsp;&nbsp;&nbsp; (progn (chg_ent ent1 11 spt2) (setq ept1 spt2))<br/>&nbsp;&nbsp;&nbsp;&nbsp; (progn (chg_ent ent1 10 spt2) (setq spt1 spt2))<br/>&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp;&nbsp; (if (on_ent spt2 spt1 ept1 sty)<br/>&nbsp;&nbsp;&nbsp;&nbsp; (progn (chg_ent ent1 51 ept2) (setq ept1 ept2))<br/>&nbsp;&nbsp;&nbsp;&nbsp; (progn (chg_ent ent1 50 spt2) (setq spt1 spt2))<br/>&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp;&nbsp; (T (setq nm (1- nm)))<br/>&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp;&nbsp; (setq nm (1+ nm))<br/>&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp;&nbsp; (prompt (strcat "选到" (itoa (sslength s)) "个" sty "消去" (itoa nm) "个!"))<br/>&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp;&nbsp; (command "_.undo" "_be")<br/>&nbsp;&nbsp;&nbsp;&nbsp; (command "_.ucs" "")<br/>&nbsp;&nbsp;&nbsp;&nbsp; (setq os (getvar "osmode")<br/>&nbsp;&nbsp;&nbsp;&nbsp; 2pi (* 2 pi)<br/>&nbsp;&nbsp;&nbsp;&nbsp; sline (ssadd)<br/>&nbsp;&nbsp;&nbsp;&nbsp; sarc (ssadd)<br/>&nbsp;&nbsp;&nbsp;&nbsp; scircle (ssadd)<br/>&nbsp;&nbsp;&nbsp;&nbsp; n -1<br/>&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp;&nbsp; (setvar "cmdecho" 0)<br/>&nbsp;&nbsp;&nbsp;&nbsp; (setvar "osmode" 0)<br/>&nbsp;&nbsp;&nbsp;&nbsp; (PRINC "\n消除重复线功能")(PRINC) <br/>&nbsp;&nbsp;&nbsp;&nbsp; (prompt "\n→请选择直线、圆弧或圆:")<br/>&nbsp;&nbsp;&nbsp;&nbsp; (if (setq ss (ssget '((0 . "line,arc,circle"))))<br/>&nbsp;&nbsp;&nbsp;&nbsp; (progn<br/>&nbsp;&nbsp;&nbsp;&nbsp; (prompt "\n→正在消除重复线条,请稍候...")<br/>&nbsp;&nbsp;&nbsp;&nbsp; (prompt "\n")<br/>&nbsp;&nbsp;&nbsp;&nbsp; (repeat (sslength ss)<br/>&nbsp;&nbsp;&nbsp;&nbsp; (setq ent (ssname ss (setq n (1+ n))))<br/>&nbsp;&nbsp;&nbsp;&nbsp; (cond<br/>&nbsp;&nbsp;&nbsp;&nbsp; ((= (dxf ent 0) "LINE") (ssadd ent sline))<br/>&nbsp;&nbsp;&nbsp;&nbsp; ((= (dxf ent 0) "CIRCLE") (ssadd ent scircle))<br/>&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp;&nbsp; (if (&gt; (sslength sline) 1) (progn (undup sline "直线") (setq pmt T)))<br/>&nbsp;&nbsp;&nbsp;&nbsp; (if (&gt; (sslength sarc) 1) (progn (undup sarc "圆弧") (setq pmt T)))<br/>&nbsp;&nbsp;&nbsp;&nbsp; (if (&gt; (sslength scircle) 1) (progn (undup scircle "圆") (setq pmt T)))<br/>&nbsp;&nbsp;&nbsp;&nbsp; (if (and ss (not pmt)) (prompt "\n→没有重复实体!"))<br/>&nbsp;&nbsp;&nbsp;&nbsp; (setvar "osmode" os)<br/>&nbsp;&nbsp;&nbsp;&nbsp; (command "_.undo" "_e")<br/>&nbsp;&nbsp;&nbsp;&nbsp; (princ)<br/>&nbsp;&nbsp;&nbsp;&nbsp; (PRINC "\n所选地方→消除重复线完成!")(PRINC))</font></p>
<p><font face="Verdana"><br/></font>&nbsp;</p>
页: [1]
查看完整版本: [求助]这个程序出了问题,请求高手指点迷津!谢谢!