|

楼主 |
发表于 2007-3-13 08:33
|
显示全部楼层
undo.lsp
;;; UNDO.LSP made by piggy0 W- [4 a* X' B2 P9 _0 V
;;;2 {5 p, d5 c; T* S6 D( D S1 a* G
;;; DESCRIPTION
5 O0 J7 A/ e% z" F. W;;; These are general error routines which can be called by 1 x+ o( O& S5 a- M) T
;;; other routine. See AutoCAD 14 ac_bonus.lsp for reference4 B& i- D4 g# U- X7 C0 a1 m( ?
;;;
! g& I1 {: h+ A) u;;; SUBROUTINE INCLUDED IN THIS FILE* d# d- i8 `7 }7 n" G& U, z
;;; UNDO_INIT
: }) m+ ]3 Q3 d1 q$ J;;; UNDO_RESTORE4 j& q+ Y7 V! b# D
;;; VAR_SAVE
9 i; p1 U* u- A- I9 p$ ~4 [;;; VAR_SET
+ b4 C4 m9 D7 V0 c! T. A: s;;; VAR_RESTORE
+ u: I: c- V/ u4 c;;; ERR_INIT
( c5 G0 R6 w J5 j- s: k) J" w;;; ERR_MAIN
3 a/ a B$ v; D7 X$ X; X% [;;; ERR_RESTORE
0 ]. U2 j0 o2 x, f' ];;;
8 l$ N/ @: a: n' v;;; DATE: 10/17/98; 03/31/99
# s+ ~, b, {4 E;;;
# J) Y, e: v7 E9 f( G;;; HISTORY:
U( E6 c6 a7 i$ `' _( O;;; Add routine of mod_att
, u ?# D5 P- k! B;;;
" d, F. S; L. A! @# `$ I;;; USING METHOD$ [2 _4 k3 P; E) ?* U/ d- q
;;; ERR_INIT:6 ^" T, E6 a' T y$ G( {1 Q
;;; This routine initialzes the error handler. It should be called as:
# C$ M# r$ S8 `( [5 {$ `;;;( C0 q: X: K2 ]
;;; (if (and (not undo_init)% j4 o+ G g4 o& w8 @& X
;;; (equal -1 (load "undo.lsp" -1)) : }2 a1 n4 s; C+ x# y0 V1 S2 l2 U
;;; );and
8 q" e: t; ? |;;; (progn (alert "Error:\n Cannot find UNDO.LSP.")(exit)), ~8 O! ^( I+ l& v) Y2 v) ]
;;; ); if" e, U5 T: h' V
;;;
2 ?- ?+ F y M;;; ARGUMENTS:
$ J; q/ y! |2 \2 _) C2 m;;; err_init Takes 3 arguments.
6 t3 L0 G( s9 n* g7 Q6 i;;; 1. - The first element of the argument:7 K B. D' |# F3 M1 P
;;; This is a list of system variables paired with& C! Q y0 a# o* O( G
;;; the values you want to set them to. i.e. '("CMDECHO" "ATTMODE"). Y0 K/ i6 G* e b* U4 `
;;; 2. - The second element is a flag
9 G2 c0 D3 ~/ v) N0 N" f, O. |4 E& i;;; If it is true, then in the event of an error ; [/ {+ R5 b: F- O$ f0 j4 Z, a
;;; the custom *error* routine will utilize UNDO
: G% S! L0 {6 X3 K& f" m;;; as a cleanup mechanism.
# H8 o4 m; J% ^9 r8 C; }* @7 K;;; 3. - The third element is a quoted function call.
' W+ X; a7 I* I, x/ J3 {6 G;;; You pass a quoted call to the function you
2 C3 d( o% B h# I# \3 P;;; wish to execute at the end of nomal routine if an error occurs. # s ]9 Y* E8 m3 R/ j
;;; i.e. '(my_special_stuff arg1 arg2...)
- u' x/ J7 w% p;;; Use this arg if you want to do some specialized clean up * e% ?7 R& b6 f; t/ p; A+ j7 H3 _6 S4 R7 p
;;; things that are not already done by the standard bonus_error
& x# g7 E& I0 R% n) b% f;;; function.3 Y! a: g9 `: h) @
;;;
) ?9 A$ `+ b) w# A% f( b;;; ERR_MAIN: Body of error routine
- W! h8 \( Y i;;;
5 K* r* j; r @3 Z d& p1 ];;; ERR_RESTORE: This routine should be called at the end of command to
$ X* D3 c5 B. j" t, {$ b; [/ l;;; restore the VARIABLES, UNDO & *error*.5 P& s2 H: ^* W4 M/ g6 H
;;;3 N& [' B8 P8 O8 B
;;; UNDO_INIT: Initialize the UNDO status! u4 {1 N" G2 U8 [% l
;;;
% E! {$ ~) V7 r# s' x" c: B; Y;;; UNDO_RESTORE: Restore the UNDO status! e. g5 C7 n6 j. k9 ^( {
;;;
5 k4 `: j d6 y9 E o! c7 N* l. c;;; VAR_SAVE: Save the variables. the argument is like '("CMDECHO" "ATTMODE")/ X0 k2 s7 c' U: e
;;;
" |$ n/ s" T- z$ C% I$ t8 `;;; UNDO_set: Set the variables. the argument is like
6 L0 ~; w" i8 k5 L" m/ s- B;;; '(("CMDECHO" 0) ( "ATTMODE" 0))
7 y3 m- K1 l3 P4 y2 r& \;;;: D7 A1 l! z7 p [3 Q+ U! g
;;; UNDO_RESTORE: Restore the variables
9 Y. }) }) X* \& X3 Z;;;
`6 {; U* v" D7 O8 F$ u;----------------------------------------------------------------------------
: r* v/ f" z0 e6 d$ C% B; GLOBALS:9 U3 A* p7 o6 E% [ Y1 `- Q: Z
; old_undoctl -- old status of UNDO (voided by UNDO_RESTORE)
7 A& I9 N$ t3 ]" @0 `$ L% e# I7 }4 v; m_lst -- list of variables (voided by VAR_RESTORE)
3 Y7 c& q& |( ?, ]5 z; err_alive -- indicate error routine is active (voided by ERR_MAIN or. Z9 D" u- u x
; ERR_OLD)" ^, m, K& I+ Z- w9 H: w
; err_old -- old handler of *error* (voided by ERR_MAIN or ERR_OLD)8 U" \9 \4 D7 K
;----------------------------------------------------------------------------
! y- p, Q% R. d* a# Z$ L8 K! n. ?
! q, J# h8 F# Z' u* J;----------------------------------------------------------------------------; G6 O( Q; ]) Z1 l4 T7 R
; Modify attributes according to entity name, attribute name, dxf_item) G. B( G: |( o
;----------------------------------------------------------------------------+ I1 q* H S- e" Y6 `( D {
(defun mod_att(ent id dxf_item) 3 z9 ]" Y# E; W, @
(while (and (/= "ATTRIB" (car (entgetf '(0) ent))) (/= id (car (entgetf '(2) ent))))
/ {" G3 a6 u5 Q" C* H) U& A6 q (setq ent (entnext ent))3 m- C5 D* _+ J% P3 }/ l; H8 i
); while
, W2 P, o8 h h, w- p" e& z X ((lambda (x)
% A8 m8 X" s9 f8 f6 o7 }6 v (mapcar '(lambda (y)0 ?' z/ N# W4 f* X* ?
(setq x (subst y (assoc (car y) x) x))1 {. K5 x; ~. E& y. X2 s! {
); lambda) j( V$ d. ~. g- L
dxf_item* r1 O* z! m0 j& \9 Y& t; m& d
); mapcar
6 A; m C+ L, s6 o# p* T$ p (entmod x)
' i1 X9 L1 C) u0 k9 @* j (entupd ent)
r5 e" n8 Z1 q3 m ); lambda
, F$ v6 W/ U8 ^ (entget ent)
7 B( B, d5 R& K7 A* ?0 s5 u: b, V: J ): U( ~+ j& h ]3 K, O$ k
); defun mod_att
) S W/ Z+ O# n' Z1 F( w! N r' W5 ]/ |% v' {- j7 w
;----------------------------------------------------------------------------
4 r6 E! O+ N# c& a1 k; Check layer status, return a association list which contains layer information
: Z4 @3 S7 s1 W( H- O" s( K;----------------------------------------------------------------------------
5 [( N( H z, e(defun laychk(lay / l_sta)/ d( F5 [4 D, h
( (lambda (x)
; t9 y; o* C, Q5 f+ y& w$ ]# X" P5 f (if (not l_s); v& X( {; O D. E3 n# A
(setq l_s (list (cons x (logand 5 (cdr (assoc 70 (tblsearch "LAYER" x)))))))
) J* o; @& S4 Y4 A5 b. q, L ); if, ?9 N2 D7 B" J5 ^/ S9 R" B9 n
); lambda ' \3 [. A1 L* G4 O; y
(getvar "CLAYER"): g, B) _2 S/ T4 A5 ?
)! T7 j3 ^# ?7 ?- \& ^
(if (not (tblsearch "LAYER" lay)) \) V: W5 u4 v* H; _
(progn # q7 z0 }; f6 l0 v" N2 t2 p
(initget "Yes No")
* X! o& _ @5 l; @" c/ j2 d' p (if (= (setq l_sta (getkword "\n图层不存在,是否建立该图层 ?\(Y/N\)")) "Yes")
& a1 _, I& Z8 b5 s (progn
8 u# f; X i6 k1 I7 o6 W (command "_.layer" "n" lay "")
4 C+ _4 x" d0 B3 x3 `- m! R* V (setq l_sta 0)2 B# B K6 [2 ^3 ~
); progn
1 z- b, o% Y- K! v, e! H ); if
6 g) Q! e( u0 L: N7 k ); progn
6 U' j( N, J! V' e! D* a' m: I (progn8 d3 u& D4 h$ f
(setq l_sta (logand 5 (cdr (assoc 70 (tblsearch "LAYER" lay)))))
5 v6 R% X, I# A3 Y! @ (if (= 1 (logand 1 l_sta))9 {$ m/ Z: W% A2 K) k0 ~
(progn
+ g6 Z- l. W& P9 l+ M# D (initget "Yes No")
3 V1 K/ m- ^* q (if (= (getkword "\n该图层被冻结,是否解冻 ?\(Y/N\)") "Yes")& x+ ?7 B Y7 R, i6 E- U5 ]' D
(command "_.layer" "t" lay "") M7 S. _: K; i1 o8 g8 ?
(setq l_sta "No")3 f: O$ @3 {/ q* J9 T
); if+ K5 g; b. T# K* q9 L
); progn8 P2 R2 E9 {; p- |2 P
); if# h/ t/ E0 s! O# F
(if (numberp l_sta) ' E$ Q$ ], L# O9 c# T; @
(if (= 4 (logand 4 l_sta)) (command "_.layer" "u" lay "")); if: M& ]2 Q" M) P- A
); if0 k* i3 f9 n3 h* v+ @3 w% h6 A
); progn" _9 U: [/ ^+ E
); if: n# b$ \" S1 d) R
( (lambda (x)# N( a$ G+ l2 }8 ^
(cond
6 G# @1 V7 G9 i5 ~: M- g ( (not x)
! i; c2 T6 N W+ z3 [/ S2 L (setq l_s (cons (cons lay l_sta) l_s))# L! o3 M. M Q( l# q
)5 G' G3 C0 Y/ S; e+ t
( (= "No" (cdr x))
1 N1 q% J& m V (setq l_s (subst (cons lay l_sta) x l_s))9 \( f* u3 N$ ^9 ~' @: A) ]) R
); ~1 Y" o% k, V# u. K7 K
( T l_s)$ V% [2 I" F3 H# k) V
); cond
1 i3 x& h1 n/ P ); lambda6 k( k6 U5 w7 d. ^& q: \
(assoc lay l_s)
* j0 H6 O$ F9 @9 p, m3 v, I )+ e" r+ z8 Q$ I, U. E# a- [8 `' A
; a* `% n8 B$ G* v! `
); defun chklay
( T6 B! f7 z. U; S4 E
6 y" a) `: k: U4 ` w7 x' q. T;----------------------------------------------------------------------------8 X0 v- \" J, r" {4 d6 m8 _
; Restore layer status according to association list l_s& w3 ?; D0 O/ ]' r' R
;----------------------------------------------------------------------------
3 }. N% r; H K V9 n(defun layres()8 \3 w+ ^8 \) K( g! F3 p: x8 |
(setvar "CLAYER" (car (last l_s)))
( d8 M, R8 F) s3 k1 x3 e8 t) D (repeat (length l_s)
: |- S5 `0 ~- S: D2 H ( (lambda(x)
9 R, k9 w- g! r& `. C) I) O# L (if (numberp (cdr x))7 r( ^: m- ^( ?! y$ k* a9 X, e
(progn 9 K. j! a# _* Q, |5 `) U2 g# g
(if (= 4 (logand 4 (cdr x)))# P% T6 u' N+ p
(command "_.layer" "lo" (car x) "")
z; H/ n: A% @8 F1 ^3 Y ); if5 l/ O( I) H& M- f3 ]
(if (= 1 (logand 1 (cdr x)))7 h! c" L$ O1 ^$ y# C% ]
(command "_.layer" "f" (car x) "")
& J/ T6 f5 q+ x+ u8 {) @; _8 J ); if# `+ m8 {8 N/ C
); progn Y, I$ i) t" w# U- v* C- n# L9 X
); if ) N9 `; \# G' {9 Q9 v( w/ I" J: ]
); lambda
( }/ ~: o [% G5 G1 `: i" N (car l_s)/ y) j" V; r3 k) W5 Z4 H( s. l; Y
)6 M8 l) B- v7 s5 f1 a! E8 A6 B% ~
(setq l_s (cdr l_s))8 p: b$ y3 {* d: R7 D
); repeat
- c& ^, {: u9 J. `) j0 j9 e); layres! T6 |1 ]* M. m O5 H1 ]8 H
, m/ l. o0 h4 ?. e7 m3 B
;----------------------------------------------------------------------------/ S K, U! C4 I) O( x- ^9 L8 H
; Get DXF codes) j3 h Q, o/ Z
;----------------------------------------------------------------------------+ {8 T& j* E5 B2 {# \' D& B
(defun entgetf (index ent)7 A/ v% z g8 p: y' K1 {+ k `
((lambda (e); I$ M; p5 T4 L$ z0 G4 Q
(mapcar '(lambda (x)
. L( v! k3 j& B; N (cdr (assoc x e))) r _4 r; \! M7 T
); lambda
: I9 n, G, b% ]$ W) h; t" F( c% T index) ; internal lambda function4 Z, M: V" [& l! T! ~, B& J* l/ M
); lambda# f: Q; n. |, ^* n7 z; }. g
(entget ent)
) r1 @1 e9 a6 a/ V, a: r5 U! _ ): I" F+ j& d% G" }; H
); defun entgetf
$ Y% m e- O/ z# w0 K! |* _; l9 M U8 w3 V; Q' s0 @
;----------------------------------------------------------------------------
3 R. J8 y$ R- P) b3 s; Save UNDO status ^ ?& V& M7 y5 ~5 U Q
;----------------------------------------------------------------------------- Q9 h+ @: t, Y4 h+ A- W
(defun undo_init (/ cmdecho undo_ctl) 0 \" V' w8 d& w) }4 {! Z9 \
(setq cmdecho (getvar "CMDECHO") undo_ctl (getvar "UNDOCTL")) ; Save the value5 s7 W" {, R* V( y$ \9 u- i
(setvar "CMDECHO" 0)
* \2 U& \7 B$ @( Y, [) T1 ~; x# o4 z6 O8 C( F
(if (equal 0 undo_ctl) ; Make sure undo is fully enable
; }- R$ {' U/ A5 N (command "_.undo" "_all")
0 W; O1 [1 |' ^+ A$ m) e (command "_.undo" "_control" "_all")
5 |" \* Q# W/ M/ n+ K& ` )9 b1 q' d* H, e5 v, V: T1 y
/ k' }5 O" ~/ J: Z$ _+ |
(if (equal 4 (logand 4 (getvar "UNDOCTL"))) ; Ensure undo auto is off, |6 c. u/ w# }0 s: \, v1 N) c
(command "_.undo" "_auto" "_off")
. L' m6 x3 z- R- y1 w- p; c4 | )+ l" H0 B. r0 p; ~) F- j2 O
. M* [& e5 v; d4 J3 m" F (while (equal 8 (logand 8 (getvar "UNDOCTL"))) ; Place an end mark here
( p+ e6 G' A& O! b O (command "_.undo" "_end")8 f% j: T* H' i* {2 S# W
)# {% ?# w, k: d; i
$ U$ y( k' U0 S* U5 \3 H- N
(while (not (equal 8 (logand 8 (getvar "UNDOCTL"))))5 g" W1 u; E7 {2 D. [1 p
(command "_.undo" "_group")
) D0 ~2 O) {/ s/ o- H; e: H )( v( {, C- v9 W2 l& |3 ^
- h1 L8 W& ]( X0 n- R (setvar "CMDECHO" cmdecho)5 m& u% I" U0 R9 H2 a
undo_ctl; n2 V, [: @0 _1 i, o, c
); defun undo_init; u; u# a7 [7 l5 C1 W! q
8 x8 E7 ]- M6 S) A) i
;----------------------------------------------------------------------------# S% m: ~4 `9 i: i- u- ]- W# ^
; Restore UNDO status
( k2 y" K5 j1 o( D;----------------------------------------------------------------------------- r) f- k ?% n
(defun undo_restore (/ cmdecho)% P) c8 a4 H3 Q1 L* `
(if old_undoctl
8 m3 w7 g: X) n2 k' g (progn
/ _# M# L& V9 y* j& j% G3 g. t (setq cmdecho (getvar "CMDECHO"))* o4 c& `6 }$ \3 |# A* K
(setvar "CMDECHO" 0)9 O% y* J4 P5 Z' u5 o5 C
0 J6 C! B. w! i" P9 }" X" M
(if (equal 0 (getvar "UNDOCTL")) (command "_.undo" "_all"))
- l3 z' @* b v3 ^7 @6 d (while (equal 8 (logand 8 (getvar "UNDOCTL")))
, w Y6 G4 B6 m. x8 @ (command "_.undo" "_end")
6 z$ y' ~: s% H ); while
5 V# z' f! k5 l+ H$ v7 }& e; R& Z/ @" D
6 `* ^: T$ t7 z" E (if (not (equal old_undoctl (getvar "UNDOCTL")))
% l2 ~1 s2 t3 [+ X1 C2 F) Q: A$ m0 s (progn' R( H: G6 _+ l
(cond6 h9 U: f k, N! C9 ]) x- L/ ]
((equal 0 old_undoctl)9 K( G$ ]4 O: ?" z [; c$ v
(command "_.undo" "_control" "_none")
; m' n# {; t* l0 g- I+ S )
{' A7 J: ~1 e m2 i+ j ((equal 2 (logand 2 old_undoctl))
% ?6 s/ v9 d" s (command "_.undo" "_control" "_one")
/ k( [! {# S+ o* { )5 `5 \' ?: c7 m: \5 l
)& K3 W: ^1 X. o
(if (equal 4 (logand 4 old_undoctl))
5 k3 B: R( { D (command "_.undo" "_auto" "_on")
( i& Y e( O, f: @. a" k* m. | (command "_.undo" "_auto" "_off")
; w5 J) H2 j) S! v! w6 I3 W1 z )
1 f2 E. G3 H2 L )
; { l( k" ^# ]& l% B, u )3 ~2 Y0 @6 Q; B9 U& `- t# }
(setq old_undoctl nil)
! `, K2 V9 C# r/ u' e5 q6 Y W (setvar "CMDECHO" cmdecho)3 E Y4 V, C8 `5 F
)3 D- H: |) P* y0 w2 I
)
w0 J& I8 ~8 h5 u* f: N6 C); defun undo_restore
9 w3 D' v. T. u' c. A, P8 d f4 Y) [# W* J& x# X( }( K; W
;----------------------------------------------------------------------------/ [: \! L9 J8 O# u
; Save variables4 s# q. M) G# b
;----------------------------------------------------------------------------5 K; U( b( M: c7 p0 H
(defun var_save (a)
8 R9 L( R ^$ I9 Y5 Y (setq m_lst '())( X1 M! P4 k& R& b7 W
(repeat (length a): ]/ \4 G; z' ~. P
(setq m_lst (append m_lst (list (list (car a) (getvar (car a))))))
, q9 S) W$ o) q6 i (setq a (cdr a))
* r5 w" ]4 z) u! V) [! s" A) c )
2 F/ E- V) W/ G2 |8 a1 _); defun var_save
& s% b! ^( q- q$ f% ]$ h j, ]: l: K' @/ I# t- ]* B
;----------------------------------------------------------------------------
9 O" X8 {+ r. y# r& Q; Set variables
/ D6 {8 @9 W2 G% e1 V K' F6 q8 q;----------------------------------------------------------------------------) ~3 v0 F; y1 h. x
(defun var_set (m_lst)9 Y% l. l2 c+ T, ?8 }
(repeat (length m_lst)
( q' i) f T! d* b (setvar (caar m_lst) (cadar m_lst))
( W" X" [3 i& s8 C1 B (setq m_lst (cdr m_lst)): r) Y0 N7 Z7 K- J! o
). a5 i) b$ H/ L/ q9 e
); defun var_set8 I- t, t! B% x) C r1 j
$ R" Y% ~( c0 N. w
;----------------------------------------------------------------------------
3 H: G3 [% I' J0 V* E/ Q' u% X4 J; Restore variables: D2 q/ d/ A* Q4 K8 ?/ H
;----------------------------------------------------------------------------
, d) x/ t$ p& v7 r; y* \! W(defun var_restore ()0 i' [ A/ F( ]% j% u& M, W
(repeat (length m_lst)* I4 M/ N2 h' N/ F$ B+ i4 m* P
(setvar (caar m_lst) (cadar m_lst))
2 v2 d- ~7 l5 ?; w/ v (setq m_lst (cdr m_lst))7 V( H; Z1 Z9 V: d. s) w0 ~8 j$ O
)! N; x! u; \. s9 r
); defun var_restore! q. \+ h+ q- g: _% u
/ ?9 l+ ~* `: T/ R6 Y: b. S;----------------------------------------------------------------------------
1 v5 G a# B+ Q6 O3 y5 |8 o; Initialize routine $ E% S5 v8 W+ M1 o
;----------------------------------------------------------------------------
7 f; l1 S, {' l( @(defun err_init(e_lst u_enable add_fun)+ v$ j$ G$ }# V0 s, e7 N
(if err_alive (err_restore)) ; To avoid nested call
6 |) u4 v, J' |5 w5 @ (setq err_alive T)4 b1 Q$ t& T6 C: B
(var_save e_lst) ; Save the modes& x6 u. r/ H' v! Y
(if u_enable (setq old_undoctl (undo_init))) ; Initialize UNDO status4 O& F; z% G# k: c: K2 X
(setq err_old *error* *error* err_main) ; Save the handle of *error*
# W2 e z( D( e, f# F( \ (if add_fun ; Add the user cleaner
) Z. K, j; e/ k/ Z# B9 Q) q! O (setq *error* (append (reverse (cdr (reverse *error*)))+ b! R1 C0 L2 O5 X: ^! M
(list add_fun (last *error*))
) B5 x( I6 N8 R ); append! e$ m" n# W$ q, a
). D2 v* X4 Q' w; K! b
)3 e2 |6 R6 K; I9 y2 c2 {( t
); defun err_init |
|