jaminth 发表于 2007-3-18 12:31:00

9楼的程序好乱,能不能整理一下!拷下来,不知道怎么用!!

MRHDF 发表于 2007-8-9 16:37:00

<p>这个程序我拷贝下来就是一行&nbsp; ,看得都晕。你有lisp文件么?/共享下好么</p>

MRHDF 发表于 2007-8-9 16:39:00

9楼的程序有整理出来的 lisp么。我那别人的图纸继续画,郁闷死了 都是重线断线在里面,几度崩溃。。。

天龙八部 发表于 2007-8-14 16:38:00

<p>这也要编程啊!ET里有OV清理重线的工具啊!重线不过是判断所选择的实体对象是否大于一而已,即使编程也很简单</p><p>public sub dfsdsfsdf()</p><p>dim fssfsdfsdfsd as acadentity</p><p>dim pppsdffsf as variant</p><p>thisdrawing.utility.getentity fssfsdfsdfsd,pppsdfffsf,"select 选择OBJECT"</p><p>IF typeof fssfsdfsdfsd is "line" then '也可以是ARC </p><p>if fssfsdfsdfsd.count&gt;1 then</p><p>fssfsdfsdfsd.delete</p><p>end if </p><p>end if</p><p></p><p></p><p></p><p></p><p>end sub</p><p></p>

liuhoujun 发表于 2008-4-1 09:15:00

看不懂能不能编好贴上来!俺是菜鸟!

AMTONNY 发表于 2008-4-26 20:34:00

试一下我这个,AP加载后输命令DUP,是别人程序里的

jj2098 发表于 2008-5-13 10:51:00

<p>前生所提供的程序,很好用,我已测试过了。不过程序没有分行,在使用前需要编辑一下。下面是我编辑的,贴出来供参考。</p><p>;;;標題: 【解決方案】消除重線的LISP程序,使用純LISP函数,<br/>;;;適用于任何AUTOCAD平台。不考慮圖層,只要是重線就處理。<br/>;;;________________________________________________________<br/>(DEFUN ww ()<br/>&nbsp; (SETQ ls (ENTSEL "\n 請選取一條直線:..."))<br/>&nbsp; (SETQ ls (CAR ls))<br/>&nbsp; (SETQ&nbsp;p1 (TRANS (CDR (ASSOC 10 (ENTGET ls))) 0 1)<br/>&nbsp;p2 (TRANS (CDR (ASSOC 11 (ENTGET ls))) 0 1)<br/>&nbsp; )<br/>&nbsp; (SETQ&nbsp;ls&nbsp; (ANGLE p1 p2)<br/>&nbsp;ls1 (+ ls (* PI 1.5))<br/>&nbsp; )<br/>&nbsp; (SETQ p0 (GETPOINT "\n 請輸入一個點!.."))<br/>&nbsp; (SETQ p0 (TRANS p0 1 0))<br/>&nbsp; (SETQ pe (POLAR p0 ls1 1))<br/>&nbsp; (SETQ pp (INTERS p1 p2 p0 pe nil))<br/>&nbsp; (SETQ #l (DISTANCE pp p0))<br/>&nbsp; (PRINC "\n 距離為:")<br/>&nbsp; (PRINC #l)<br/>)<br/>;;;________________________________________________________<br/>;;;内容:<br/>;;;清重 LINE<br/>;;;消除重線,不生成任何新的LINE<br/>;;;程序沒考慮圖層,只要是重線,就處理<br/>;;;内有詳細的注釋,?助朋友理解開發思路。<br/>;;;這個程序很複雜,用了很多技巧。希望能對朋友有?助<br/>;;;命令:c:rdup (setvar "cmdecho" 0)<br/>;;;子程序 (ran), 將LISP表按關鍵字排序。參數 'a' 為要排序的LISP表。<br/>;;;例如執行程序: (ran '((3 3.2) (5.4 4.8) (3 3) (-0.4 5.5) (3 3)))<br/>;;;該程序將返回: ((-0.4 5.5) (3 3) (3 3.2) (5.4 4.8))<br/>(DEFUN ran (a / b c d mn mx)<br/>&nbsp; (SETQ&nbsp;c&nbsp; (MAPCAR 'CAR a)<br/>&nbsp;mn (APPLY 'MIN c)<br/>&nbsp;mn (1- mn)<br/>&nbsp; )<br/>&nbsp; (WHILE (&lt; mn (SETQ mx (APPLY 'MAX c)))<br/>&nbsp;&nbsp;&nbsp; (SETQ c (SUBST mn mx c))<br/>&nbsp;&nbsp;&nbsp; (WHILE (SETQ d (ASSOC mx a))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (SETQ a (SUBST '(nil) d a)<br/>&nbsp;&nbsp;&nbsp;&nbsp; b (CONS d b)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp; )<br/>&nbsp; )<br/>&nbsp; b<br/>)<br/>;;;子程序 (rz), 消去點 'p' 的 Z-坐標。<br/>(DEFUN rz (p) (LIST (CAR p) (CADR p)))<br/>;;;子程序 (p-l1), 求點到直線距離程序的前半部分 (求常數'c1','c2'和'c3')。<br/>;;;參數 'p1' 和 'p2' 為直線的兩個端點。<br/>(DEFUN p-l1 (p1 p2 / x1 y1 x2 y2)<br/>&nbsp; (SETQ&nbsp;x1 (CAR p1)<br/>&nbsp;y1 (CADR p1)<br/>&nbsp;x2 (CAR p2)<br/>&nbsp;y2 (CADR p2)<br/>&nbsp;c1 (- y2 y1)<br/>&nbsp;c2 (- x1 x2)<br/>&nbsp;c3 (SQRT (+ (* c1 c1) (* c2 c2)))<br/>&nbsp;c1 (/ c1 c3)<br/>&nbsp;c2 (/ c2 c3)<br/>&nbsp;c3 (/ (- (* x2 y1) (* x1 y2)) c3)<br/>&nbsp; )<br/>)<br/>;;;子程序 (p-l2), 求點到直線距離程序的後半部分 (返回距離?)。<br/>;;;參數 'p0' 為點坐標。<br/>(DEFUN p-l2 (p0) (+ (* c1 (CAR p0)) (* c2 (CADR p0)) c3))<br/>;;;子程序 (rddo1), 合並一條直線上的各線段。<br/>(DEFUN rddo1 (l2 / e el c1 c2 c3 ln1 ll1 ll2 ll3 ll4 lle len len1 p z)<br/>&nbsp; (SETQ&nbsp;ll (CAR l2)<br/>&nbsp;p1 (CAR ll)<br/>&nbsp;p2 (CADR ll)<br/>&nbsp;a1 (ANGLE p1 p2)<br/>&nbsp;p3 (POLAR p1 (+ pi2 a1) mx)<br/>&nbsp;n&nbsp; (+ n (LENGTH l2))<br/>&nbsp; )<br/>;;;分別求出直線上某點到各線段上兩個端點的距離, 並與實體名一同存入表 'll1'。<br/>;;;表 'll1' 的格式為 ((距離1 實體名1) (距離2 實體名2) . . .)。<br/>;;;'lle' 為各線段的實體名表, 格式為 (實體名1 實體名2 . . .)<br/>&nbsp; (p-l1 p1 p3)<br/>&nbsp; (FOREACH ll l2<br/>&nbsp;&nbsp;&nbsp; (SETQ e&nbsp;&nbsp; (LAST ll)<br/>&nbsp;&nbsp; ll1 (CONS (LIST (p-l2 (CAR ll)) e) ll1)<br/>&nbsp;&nbsp; ll1 (CONS (LIST (p-l2 (CADR ll)) e) ll1)<br/>&nbsp;&nbsp; lle (CONS e lle)<br/>&nbsp;&nbsp;&nbsp; )<br/>&nbsp; )<br/>;;;'ll2' 為臨時實體名表, 格式為 (實體名1 實體名2 . . .)。<br/>;;;'ll4' 為合並完成後的線段表, 格式為 ((首端1 . 末端1) (首端2 . 末端2) . . .)。<br/>&nbsp; (SETQ&nbsp;ll1 (ran ll1)<br/>&nbsp;ln1 (+ mx (CAAR ll1))<br/>&nbsp;ll4 nil<br/>&nbsp; )<br/>&nbsp; (FOREACH ll ll1<br/>&nbsp;&nbsp;&nbsp; (SETQ ln (CAR ll)<br/>&nbsp;&nbsp; e&nbsp; (CADR ll)<br/>&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp; (IF&nbsp;ll2<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (PROGN<br/>;;;此時有重疊的線段。<br/>&nbsp;(SETQ ll3 (MEMBER e ll2)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ll2 (IF ll3<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (APPEND (CDR ll3) (CDR (MEMBER e (REVERSE ll2))))<br/>;;;結束一條重線。<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (CONS e ll2)&nbsp;;將新重線的實體名加入 'll2'。<br/>&nbsp;&nbsp;&nbsp; )<br/>&nbsp;)<br/>&nbsp;(IF (NOT ll2)<br/>;;;結束一條線的合並, 將其存入 'll4'。<br/>&nbsp;&nbsp; (SETQ&nbsp;ll4 (CONS (CONS (POLAR p1 a1 ln) p2) ll4)<br/>&nbsp;&nbsp;ln1 ln<br/>&nbsp;&nbsp; )<br/>&nbsp;)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (PROGN<br/>;;;此時沒有重疊的線段。<br/>&nbsp;(IF (EQUAL ln1 ln mm)<br/>&nbsp;&nbsp; (SETQ ll4 (CDR ll4))&nbsp;&nbsp;;消去前一條線, 使首尾相接的兩條線連續。<br/>&nbsp;&nbsp; (SETQ p2 (POLAR p1 a1 ln))&nbsp;;求出一條新線的起始點。<br/>&nbsp;)<br/>&nbsp;(SETQ ll2 (CDR ll))&nbsp;&nbsp;;將起點實體名加入 'll2'。<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp; )<br/>&nbsp; )<br/>&nbsp; (IF (&gt; (SETQ len&nbsp; (LENGTH ll4)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; len1 (LENGTH lle)<br/>&nbsp; )<br/>&nbsp; len<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp; (PROGN (REPEAT (- len1 len)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (SETQ e&nbsp;&nbsp; (CAR lle)<br/>&nbsp;&nbsp;&nbsp;&nbsp; lle (CDR lle)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (ENTDEL e)<br/>&nbsp;&nbsp;&nbsp; )<br/>;;;用表 'll4' 中的線段更新表 'lle' 中的線段。<br/>&nbsp;&nbsp;&nbsp; (FOREACH ll ll4<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (SETQ e&nbsp;&nbsp; (CAR lle)<br/>&nbsp;&nbsp;&nbsp;&nbsp; lle (CDR lle)<br/>&nbsp;&nbsp;&nbsp;&nbsp; el&nbsp; (ENTGET e)<br/>&nbsp;&nbsp;&nbsp;&nbsp; p&nbsp;&nbsp; (ASSOC 10 el)<br/>&nbsp;&nbsp;&nbsp;&nbsp; z&nbsp;&nbsp; (CDDDR p)<br/>&nbsp;&nbsp;&nbsp;&nbsp; el&nbsp; (SUBST (CONS 10 (APPEND (CAR ll) z)) p el)<br/>&nbsp;&nbsp;&nbsp;&nbsp; el&nbsp; (SUBST (CONS 11 (APPEND (CDR ll) z)) (ASSOC 11 el) el)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (ENTMOD el)<br/>&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp; )<br/>&nbsp; )<br/>&nbsp; (SETQ n (- n len))<br/>;;;?畫 40 根線, 在提示行更新一次報數。<br/>&nbsp; (IF (&gt; (- n n2) 40)<br/>&nbsp;&nbsp;&nbsp; (PROGN (SETQ n2 n) (PRINC (STRCAT st2 (ITOA n))))<br/>&nbsp; )<br/>)<br/>;;;子程序 (rddo), 對一組同角度的線段進行重線合並。<br/>;;;參數 'l0' 為線段表, 其格式為<br/>;;; ((首端1 末端1 實體名1) (首端2 末端2 實體名2) . . .)。<br/>(DEFUN rddo (l0 / e1 a1 p1 p2 p3 c1 c2 c3 ln l1 l2 ll ll1)<br/>&nbsp; (SETQ&nbsp;ll (CAR l0)<br/>&nbsp;p1 (CAR ll)<br/>&nbsp;p2 (CADR ll)<br/>&nbsp;l1 (LIST (LIST 0. ll))<br/>&nbsp; )<br/>;;;將 'l0' 中各項, 按距離進行分類存入表 'l1'<br/>;;;'l1' 的格式為 ((距離1 (首端1 末端1 實體名1)<br/>;;; (首端2 末端2 實體名2) . . .) . . .)<br/>&nbsp; (p-l1 p1 p2)<br/>&nbsp; (FOREACH ll (CDR l0)<br/>;;;變量 'ln' 為該線段與首根直線的距離。<br/>&nbsp;&nbsp;&nbsp; (SETQ ln (p-l2 (CAR ll))<br/>&nbsp;&nbsp; l2 l1<br/>&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp; (WHILE (AND (SETQ ll1 (CAR l2)) (NOT (EQUAL ln (CAR ll1) mm)))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (SETQ l2 (CDR l2))<br/>&nbsp;&nbsp;&nbsp; )<br/>;;;將距離?近似的線段歸入同一個子表?, 否則?開一個新的子表。<br/>&nbsp;&nbsp;&nbsp; (SETQ l1 (IF ll1<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (SUBST (APPEND ll1 (LIST ll)) ll1 l1)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (CONS (LIST ln ll) l1)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp; )<br/>&nbsp; )<br/>;;;對表 'l1' 中各組同距離 (即在一條直線上) 的線段進行重線合並。<br/>&nbsp; (FOREACH l2 l1<br/>&nbsp;&nbsp;&nbsp; (SETQ l2 (CDR l2))<br/>&nbsp;&nbsp;&nbsp; (IF&nbsp;(CDR l2)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (rddo1 l2)<br/>&nbsp;&nbsp;&nbsp; )&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;一組線多于一根才進行處理。<br/>&nbsp; )<br/>)<br/>;;;主程序 (c:rdup), 合並或去除重線 (處理圖?全部 LINE 實體)。<br/>(DEFUN c:rdup (/ osm mm&nbsp;mx pi2 st1 st2 ss1 e1 el1 n n1 n2 a1 p1&nbsp;p2 l1 ll<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ll1)<br/>&nbsp; (GC)<br/>&nbsp; (PROMPT "\n選取要處理的LINE&lt;全選&gt;:")<br/>&nbsp; (IF (NOT (SETQ ss1 (SSGET '((0 . "LINE")))))<br/>&nbsp;&nbsp;&nbsp; (SETQ ss1 (SSGET "x" '((0 . "LINE"))))<br/>&nbsp; )<br/>;;;變量 'mm' 為距離微量 (在該距離?的線段均視為重合)。<br/>&nbsp; (COMMAND "undo" "be")<br/>&nbsp; (SETQ&nbsp;osm (GETVAR "osmode")<br/>&nbsp;mx&nbsp; (GETVAR "viewsize")<br/>&nbsp;mm&nbsp; (* 3e-4 mx)<br/>&nbsp;pi2 (/ PI 2)<br/>&nbsp;st1 "\r搜索到直線數: "<br/>&nbsp;st2 "\r已經去除重線數: "<br/>&nbsp;n&nbsp;&nbsp; 0<br/>&nbsp;n1&nbsp; 0<br/>&nbsp;n2&nbsp; 0<br/>&nbsp; )<br/>&nbsp; (SETVAR "osmode" 0)<br/>&nbsp; (SETVAR "highlight" 0)<br/>&nbsp; (PRINC "\n")<br/>;;;對全體 LINE 實體, 按角度進行分類存入表 'l1'。<br/>;;;'l1' 的格式為 ((角度1 (首端1 末端1 實體名1)<br/>;;; (首端2 末端2 實體名2) . . .) . . .)。<br/>&nbsp; (WHILE (SETQ e1 (SSNAME ss1 n))<br/>&nbsp;&nbsp;&nbsp; (SETQ n&nbsp;&nbsp; (1+ n)<br/>&nbsp;&nbsp; el1 (ENTGET e1)<br/>&nbsp;&nbsp; p1&nbsp; (rz (CDR (ASSOC 10 el1)))<br/>&nbsp;&nbsp; p2&nbsp; (rz (CDR (ASSOC 11 el1)))<br/>&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp; (IF&nbsp;(EQUAL p1 p2 mm)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (PROGN<br/>;;;線段長度小于 'mm', 認為是超短線, 做擦除處理。<br/>&nbsp;(ENTDEL e1)<br/>&nbsp;(SETQ n1 (1+ n1))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br/>;;;將角度?近似的線段歸入同一個子表?, 否則?開一個新的子表。<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (SETQ ll1&nbsp;(LIST (LIST p1 p2 e1))<br/>&nbsp;&nbsp;&nbsp;&nbsp; a1&nbsp;(ANGLE p1 p2)<br/>&nbsp;&nbsp;&nbsp;&nbsp; a1&nbsp;(RTOS (IF (&lt; a1 PI)<br/>&nbsp;&nbsp;&nbsp;a1<br/>&nbsp;&nbsp;&nbsp;(- a1 PI)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3<br/>&nbsp;&nbsp;)<br/>&nbsp;&nbsp;&nbsp;&nbsp; ll&nbsp;(ASSOC a1 l1)<br/>&nbsp;&nbsp;&nbsp;&nbsp; l1&nbsp;(IF ll<br/>&nbsp;&nbsp;&nbsp; (SUBST (APPEND ll ll1) ll l1)<br/>&nbsp;&nbsp;&nbsp; (CONS (CONS a1 ll1) l1)<br/>&nbsp;&nbsp;)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp; )<br/>;;;?處理 128 根線, 在提示行更新一次報數。<br/>&nbsp;&nbsp;&nbsp; (IF&nbsp;(= 127 (LOGAND 127 n))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (PRINC (STRCAT st1 (ITOA n)))<br/>&nbsp;&nbsp;&nbsp; )<br/>&nbsp; )<br/>&nbsp; (PRINC (STRCAT st1<br/>&nbsp;&nbsp; (ITOA n)<br/>&nbsp;&nbsp; (IF (ZEROP n1)<br/>&nbsp;&nbsp;&nbsp;&nbsp; ""<br/>&nbsp;&nbsp;&nbsp;&nbsp; (STRCAT ". 刪除超短線 " (ITOA n1))<br/>&nbsp;&nbsp; )<br/>&nbsp;&nbsp; ".\n"<br/>&nbsp; )<br/>&nbsp; )<br/>&nbsp; (SETQ&nbsp;n1 (- n n1)<br/>&nbsp;n&nbsp; 0<br/>&nbsp; )<br/>;;;對表 'l1' 中各組同角度的線段進行重線合並。<br/>&nbsp; (FOREACH ll l1<br/>&nbsp;&nbsp;&nbsp; (SETQ ll (CDR ll))<br/>&nbsp;&nbsp;&nbsp; (IF&nbsp;(CDR ll)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (rddo ll)<br/>&nbsp;&nbsp;&nbsp; )<br/>;;;一組線多于一根才進行處理。<br/>&nbsp; )<br/>&nbsp; (PRINC<br/>&nbsp;&nbsp;&nbsp; (STRCAT st2 (ITOA n) ". 還剩 " (ITOA (- n1 n)) " 條線.")<br/>&nbsp; )<br/>&nbsp; (REDRAW)<br/>&nbsp; (COMMAND "undo" "e")<br/>&nbsp; (SETVAR "osmode" osm)<br/>&nbsp; (SETVAR "highlight" 1)<br/>&nbsp; (PRINC)<br/>)</p>

claotlaot 发表于 2008-6-29 18:27:00

<p>非常实用的程序,收藏了,谢谢</p>

CAD83 发表于 2008-7-5 11:50:00

<p>直线就行,对圆弧没用,,,,</p>

FANGZHENG158 发表于 2008-7-8 12:59:00

对重复的字没有用
页: 1 2 [3] 4
查看完整版本: 申請刪重複線程序.