QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

全站
11天前
查看: 1820|回复: 5
收起左侧

[求助] 请高手帮修改一个程序

[复制链接]
发表于 2008-11-26 09:33:57 | 显示全部楼层 |阅读模式 来自: 中国湖北孝感

马上注册,结识高手,享用更多资源,轻松玩转三维网社区。

您需要 登录 才可以下载或查看,没有帐号?注册

x
   在网上找的一个删除重复图元的LISP程序 加载使用后发现对重复线段的删除有时候无效 而且线段内部的线段无法删除 就是说如果一条线段长100一条长50 使用这个删除不掉!!请高手帮忙修改下!!
1 M; |" ?# V4 x& b$ _* V" N1 O8 J 以下是程序原文:(附件内容是程序源文件)
0 P# W* v# I" a0 e" Z' y) c(defun c:ere()1 |* k5 Q; V& u" h
  (setq m0 (getpoint "\n左下角:"))' @: c1 g- ~- @
  (setq m1 (getpoint "\n右上角:"))
0 {8 x% X. X0 f# E( L  (setq x0 (car m0) x1 (car m1) y0 (cadr m0) y1 (cadr m1) m2 m0 x2 x0 y2 y0)
3 y! w$ n7 n: S7 H5 v  (while (< x2 x1)7 `  @6 v' ]0 T
    (setq y2 y0 m3 m2)
9 ^. g: F/ z4 N# W) P; g0 {/ g" ~    (while (< y2 y1)
& g( G2 J' p4 |4 O      (setq m4 (polar m3 0.785398 70.72))
" _# u# u& |$ h6 l/ Q% d7 g4 ?      (setq a (ssget "_C" m3 m4))
1 X7 z6 n: Q: h6 i      (if (not a)(setq i 0)(setq i (sslength a)))7 y: K9 P/ v; s4 [" C- D! g
      (while (> i 1)
( x; p/ j; Q4 U        (setq j (- i 1))
# b! ]9 H/ T. A0 K9 w. ?        (setq b (ssname a (setq i (1- i)))) ;(setq b (ssname a 1))
. o) z# p5 {5 e! y, g        (setq c (entget b))3 L7 x0 H& j1 t: i0 h1 z* @
        (setq d (cdr (assoc 0 c))). }; m) u1 J: v, O
        (while (> j 0)
: I6 j, n9 u; m# v0 D% R          (setq b1 (ssname a (setq j (1- j))))
$ l3 }8 ^6 @4 \* b' B0 a2 ~  c! `          (setq c1 (entget b1))& f1 @4 t' n# o. l  T( ^/ r
          (setq d1 (cdr (assoc 0 c1)))
: T( n9 s+ \/ V  }- y          (if (= d d1)
0 c& Z7 v- o3 D. b- g            (if (= d "LINE")( |( [5 G/ O$ c# u; ^1 ^
              (if (and (= (rtos (cadr (assoc 10 c)) 2 4)(rtos (cadr (assoc 10 c1)) 2 4))! V' E8 |, s" \8 N
                       (= (rtos (caddr (assoc 10 c)) 2 4)(rtos (caddr (assoc 10 c1)) 2 4))
+ t, ]- ^- a8 l. k, A* o                       (= (rtos (cadr (assoc 11 c)) 2 4)(rtos (cadr (assoc 11 c1)) 2 4))
! J3 q( B: r" ^# P& ~7 R- g$ W                       (= (rtos (caddr (assoc 11 c)) 2 4)(rtos (caddr (assoc 11 c1)) 2 4))- [3 b( \% R  H$ c
                  )(command "erase" b1 "")
  M( `- X9 w4 Z% b; E! E              )
: U, _% s* x2 d# A              (if (= d "INSERT"). g0 z7 O( y5 R, _  n
                (if (and (equal (assoc 2 c) (assoc 2 c1))/ V% N/ t$ B" m* e% b) h
                         (= (rtos (cadr (assoc 10 c)) 2 4)(rtos (cadr (assoc 10 c1)) 2 4))/ Q$ }$ H  i- T" k/ }" r; X. S: W
                         (= (rtos (caddr (assoc 10 c)) 2 4)(rtos (caddr (assoc 10 c1)) 2 4))
% t5 V. h4 Y( l9 {% c8 ?                    )(command "erase" b1 "")
0 q/ p( S* B# z0 n1 p# s1 ^                )
$ T+ A/ o  L8 \( u9 P$ `5 C& x9 o                (if (= d "LWPOLYLINE"). K3 k! y3 C$ G! R$ e& M
                  (progn
: F' k+ z' O2 _* i                    (setq e (cddddr c) e1 (cddddr c1) e (cddddr e) e1 (cddddr e1))6 N8 {4 \2 [7 k( M, E" Z% I9 W1 F
                    (while (and e e1)
1 G5 W0 D3 V; `' d' P; Q                      (progn
1 q5 Z1 h; ]- K6 U                      (setq f (car e) f1 (car e1) e (cdr e) e1 (cdr e1))
! x  n8 ^+ D8 [7 x& y' Z                      (while (and e (/= (car f) 10))(setq f (car e) e (cdr e)))
+ @: Q: A6 }8 q" L& i                      (while (and e1 (/= (car f1) 10))(setq f1 (car e1) e1 (cdr e1)))) e4 E) ^# g3 Q1 T& P
                      (if (or (/= (rtos (cadr f) 2 4)(rtos (cadr f1) 2 4))
3 q4 ]2 Y! ?' J                              (/= (rtos (caddr f) 2 4)(rtos (caddr f1) 2 4)))(setq e1 nil)
; H# Y0 U; Z- _$ N4 {5 r7 K6 \7 o  p0 q                        (if (not e1) (command "erase" b1 "")(if (not e)
( c/ H: O9 U- M  H# q+ X                           (progn (command "erase" b "")(setq b b1 b1 nil))))2 F1 p9 U1 D! t3 Q* |3 ?
                  ) ) ) )         
& k  v7 y5 z( p, i; Q( K                  (if (= d "SPLINE")/ t! c# }- l0 e( G
                    (progn4 S; T1 ]) V2 I; O, @# X# _
                      (setq e (cddddr c) e1 (cddddr c1) e (cddddr e) e1 (cddddr e1))
6 q1 |( K$ b5 s                      (while (and e e1)' ^& @$ k' h' q* W: z
                        (progn   C+ O" G! |, A/ P$ {0 H
                          (setq f (car e) f1 (car e1) e (cdr e) e1 (cdr e1))
3 f, F# y' v) W; s3 h. T                          (while (and e (/= (car f) 10))(setq f (car e) e (cdr e)))
9 E: Y7 t% q6 k+ E, X                          (while (and e1 (/= (car f1) 10))(setq f1 (car e1) e1 (cdr e1)))
. A8 v" F! j2 b0 M                          (if (or (/= (rtos (cadr f) 2 4)(rtos (cadr f1) 2 4))(/= (rtos (caddr f) 2 4)(rtos (caddr f1) 2 4)))(setq e1 nil)
9 R2 S2 q- j+ w                            (if (not e1 ) (command "erase" b1 "")(if (not e)(progn (command "erase" b "")(setq b b1 b1 nil))))
  a# ~7 |& z8 L2 e" k4 A* L* W                    ) ) ) )         
: w7 ?* p  [3 r                    (if (= d "TEXT")- p3 o; n! q$ O1 t* m5 d/ c* Z
                      (if (and (= (rtos (cadr (assoc 10 c)) 2 4)(rtos (cadr (assoc 10 c1)) 2 4))
% A$ f# a7 m& ~2 B7 `3 B. H; Z                               (= (rtos (caddr (assoc 10 c)) 2 4)(rtos (caddr (assoc 10 c1)) 2 4))
& i$ V% A3 Y7 o. g, t( }                          )(command "erase" b1 "")$ u% ]& m; E' J; A2 \: n
                      )
3 y! `2 f! ]9 o5 _7 B                      (if (= d "CIRCLE")
3 E) ~, ?- a/ ~, ~                        (if (and (= (rtos (cadr (assoc 10 c)) 2 4)(rtos (cadr (assoc 10 c1)) 2 4))& Z5 j" T, f1 u" t
                                 (= (rtos (caddr (assoc 10 c)) 2 4)(rtos (caddr (assoc 10 c1)) 2 4))
" c* h4 _/ Y, A# @                                 (= (rtos (cdr (assoc 40 c)) 2 4)(rtos (cdr (assoc 40 c1)) 2 4))
1 r" Y! e8 a( z  ]1 u* F3 I                            )(command "erase" b1 "")! m/ \" J7 F  |0 D
      ) ) ) ) ) ) ) ) ) ): u7 J+ c9 z; a
      (setq m3 (polar m3 1.5708 50.0) y2 (+ y2 50.0))% N4 \7 N  Z3 E
    )
3 p9 n1 m7 L7 k$ z    (setq m2 (polar m2 0.0 50.0) x2 (+ x2 50.0))* z  D& D% e) ], I' q8 e& q
  )7 |& w1 Y: `' D
  (princ)
% Z5 i7 o% n, l) B& {/ i)
/ ]$ {/ ?2 f! [1 A. J; B(princ "\n\"ere\"启动")3 C$ L/ E2 u' g

+ u1 K9 c* }% D$ j" \5 M/ O[ 本帖最后由 zedcar 于 2008-11-26 09:35 编辑 ]

删除重复元素.rar

1.12 KB, 下载次数: 6

发表于 2008-11-26 11:05:42 | 显示全部楼层 来自: 中国辽宁鞍山
有没有中间使用变量得说明?做什么用得?
 楼主| 发表于 2008-11-26 12:40:25 | 显示全部楼层 来自: 中国湖北孝感
原帖由 maoyangmy 于 2008-11-26 11:05 发表 http://www.3dportal.cn/discuz/images/common/back.gif6 d' v" e( k( \( J" M. |
有没有中间使用变量得说明?做什么用得?

1 G5 O' S  a/ S: J& [9 Y没有 这个程序用来删除多余的图元。程序特点,可以删除完全重合的直线、多段线、光滑曲线(程序中设置了4位小数,当坐标数值四舍五入精确到4位小数时认为重合),删除位置重合的文字,删除位置和半径相同的圆,删除位置和块名相同的块。
发表于 2008-12-6 15:17:15 | 显示全部楼层 来自: 中国四川成都
给你一个思路:
( {) B4 w* _# {8 ?' L' _    处理"LINE"时,增加一个判定函数,用于首先判定直线L1的两个端点是否在直线L2上面;若在,再判定直线L1的两个端点是否在直线L2的两个端点以内,则返回直线L1,否则返回直线L2。
* w5 B! K( ^1 i1 l8 A# r    判定直线L1的两个端点是否在直线L2上面:
3 ?5 ^8 i) i- r4 I2 l2 c! q$ W       可以逐点计算直线L1的两个端点到直线L2的距离是否小余你的精度要求,若小余,则判定为该点在直线L2上,否则,该点不在直线L2上。

评分

参与人数 1三维币 +5 收起 理由
woaishuijia + 5 技术讨论

查看全部评分

发表于 2008-12-6 22:42:04 | 显示全部楼层 来自: 中国台湾
  1.       ?- ]/ k4 a1 E- `& Z. g. `
  2.     (defun dxg (code ele)) e6 N4 d- B1 a8 \. U
  3.       (cdr (assoc code (entget ele)))2 S4 A( O" k' [
  4.     )
    9 H% E8 [2 w9 I3 t4 f
  5.       
    4 r0 x% S# C0 S8 F
  6. * v& z9 m8 t" _
  7.     (defun vpt (a b c)- ~- Z! J' y5 _( @3 ]; k% u! V
  8.        (equal0 L7 M5 c6 x2 r2 E/ ^/ C7 V0 o
  9.          (if (caddr a) a (reverse (cons 0.0 (reverse a)))); ]% _2 V  W6 s
  10.          (if (caddr b) b (reverse (cons 0.0 (reverse b))))% h; d* N. V( x4 [7 L3 X* _% r
  11.          (expt 0.1 c)6 \3 ]4 J4 p& B( V# Q1 I, u
  12.        )
    4 c) f# b3 D1 @1 K/ h9 y" J1 v! y1 n, x! u
  13.     ): x+ Q0 F4 K4 |/ L  K8 \4 q7 g
  14.     - k  G, f' z# @* p8 v0 ^/ L  _% L
  15. ;;; =========== for Test only =========================================9 [0 I9 i4 J4 s- u: I+ J
  16. ;;; 删除线段内的短线
    + o; H6 Q3 e4 v$ V* R1 Y% }6 D
  17. ;; ssen = Line Selection+ t! J6 Z# y7 E3 H
  18. (setq nn (sslength ssen))* O% w+ \+ p- Z6 d& J" A
  19. (cond
      b# T: W0 c- N. p/ f
  20.   ((< nn 2) nil)                        ; Nothing to do
    / ~- l  y# B, J1 Q$ ?9 M
  21.   (T2 f6 M$ w6 n, i/ E2 v: R5 c/ R
  22.    (princ "\nProceeding with Line ....."
    , A# f$ C8 Y/ x5 Y: T
  23.    (while (setq ee (ssname ssen (setq nn (1- nn)))) " Z7 H7 z0 \, l# k! J# I
  24.      (cond
    7 p9 H9 L8 }- M
  25.        ((null (entget ee)))                ; bypass2 @7 F- c( _7 v4 ?3 b0 f
  26.        (T
    . t% N/ ^7 L( I3 w' F$ i/ T! v$ Y
  27.         (setq p1  (dxg 10 ee)( K+ o2 {' G8 t1 C  G
  28.               p2  (dxg 11 ee)+ D* I- R/ R2 E
  29.               v1  (angle p1 p2)9 P0 u" j! Z- `4 A' w0 X8 G
  30.               e1d (cdddr (cddr (entget ee)))6 W2 Y1 l! D6 ^
  31.               sc  (ssget "f" (list p1 p2) '((0 . "LINE")
    9 M& G( d, k) R3 k. q8 \
  32.               sum (if sc (sslength sc))1 q) ]* |6 F8 w( o/ y
  33.         )
    & Z9 g8 @  g* }+ g7 ^5 g
  34.         (while (and (entget ee) (> sum 0))2 w9 L# x. |1 s
  35.           (setq e1 (ssname sc (setq sum (1- sum))))5 `4 C3 l. `5 T& z/ w
  36.           (cond
    % `  U, Z" [: {% e5 m: N; o1 L- M
  37.             ((eq e1 ee) nil)                ; Itself
    + `6 B. p% T8 c; \& j" x  Q
  38.             ((equal (cdddr (cdddr (entget e1))) e1d); l: H/ U2 B3 C1 z, B8 J
  39.              (entdel e1)
    / n: t& [# x) G  V* ~0 E
  40.             )% T8 m- N+ _* x5 y& M7 d6 f
  41.             (T
    / h! |$ J7 c/ Q  G. D
  42.              (setq p3 (dxg 10 e1)6 e) ~2 b# O5 s0 S$ W, q
  43.                    p4 (dxg 11 e1)8 l6 T2 W6 z$ k* b+ s
  44.                    v2 (if (vpt p1 p3 5)0 I8 E) G# Q3 {/ g$ @
  45.                         (angle p2 p3)1 s- p7 ?# F  f( w% |+ D6 f
  46.                         (angle p1 p3)
    - ^; `' _: H2 e. _: }$ f
  47.                       )
    ! Z& {$ V4 e# P5 I) q: C3 h7 C+ L( `" A
  48.              )2 L& l" u, P) h
  49.              (if (< (rem (abs (- v1 v2)) pi) 0.0001)
    * l! I& M* h0 h- {/ l+ [: V
  50.                (if (< (distance p3 p4) (distance p1 p2))9 Y4 f8 o4 J" [2 g7 i
  51.                  (entdel e1)
    4 ~% w, r) r% B' d5 R
  52.                  (entdel ee)
    8 m% o: Y& S9 q/ |
  53.                ). k' p5 [8 I1 G" `' e
  54.              )# i. k/ |+ h5 n# B# |5 u
  55.             )9 o. ^: v6 s. U3 ^
  56.           )0 G! z' [* r# M
  57.         )6 u/ o$ u7 ~8 m- R6 m' d% C- x' t$ Q
  58.        )/ k! o" R9 x' U6 y5 ~$ n, h( n8 w! o/ \) R
  59.      )
    2 Y) K2 N3 p3 @, J
  60.    )! V! H% T! m) I# K$ @6 m+ Q$ s% E
  61.   )3 N9 |  n6 g. j, }. {
  62. )
      g1 y4 M3 }) k3 X1 `

  63. % o$ C* ]* ?6 w# X
复制代码
  l# B( e6 [/ c5 O0 {% y( d
[ 本帖最后由 SunVei 于 2008-12-6 23:24 编辑 ]

评分

参与人数 1三维币 +10 收起 理由
woaishuijia + 10 应助

查看全部评分

发表于 2008-12-7 09:59:37 | 显示全部楼层 来自: 中国广东深圳
我认为对有利于促进论坛的发展,同时也激励会员多参与.但对于管理人员应该考虑工作需要,不收取流量.

评分

参与人数 1三维币 -50 收起 理由
woaishuijia -50 灌水

查看全部评分

发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Licensed Copyright © 2016-2020 http://www.3dportal.cn/ All Rights Reserved 京 ICP备13008828号

小黑屋|手机版|Archiver|三维网 ( 京ICP备2023026364号-1 )

快速回复 返回顶部 返回列表