;; aus BIBO-Error ;; --------------------------------------------------------------------------------------------------- ;; ;; -- Aufschreiber : Th.Krüger , Eberswalde (Fragmentautoren ??? - Wenn ja, dann Danke ) -- ;; ;; --------------------------------------------------------------------------------------------------- ;; ;; -- Datum : 10.11.03 -- ;; ;; --------------------------------------------------------------------------------------------------- ;; ;; -- Besonderer Dank an MAPCAR (http://www.autolisp.mapcar.net) für seinen Error-Handler -- ;; ;; --------------------------------------------------------------------------------------------------- ;; ;; --------------------------------------------------------------------------------------------------- ;; ;; -- StartErrorHandler : Stapelbare Fehlerbehandlungsroutine -- ;; ;; -- NAME ist ein frei wählbarer String. Wenn eine (*error*)-Funktion etwas -- ;; ;; -- auf dem Bildschirm ausgibt, setzt sie diesen Namen dazu, damit man -- ;; ;; -- unterscheiden kann, was von welcher Instanz des Errhandlers kommt. -- ;; ;; -- UNDOMODE kann T oder nil sein und gibt an, ob im Fehler- bzw. Abbruchs- -- ;; ;; -- fall gleich der Befehl 'Z' ausgeführt werden soll, um alle bis dahin -- ;; ;; -- vorgenommen Aktionen sofort rückgängig zu machen. -- ;; ;; -- VARS_TO_SAVE sind die zu setzenden Systemvariablen und Globalen Variablen -- ;; ;; --------------------------------------------------------------------------------------------------- ;; ;; -- .. Aufruf: (defun c:Test( / ) -- ;; ;; -- (startErrorHandler "Funktion TEST" 'T -- ;; ;; -- '(("cmdecho" 0)("filedia" 0)("MYOWN" nil)) -- ;; ;; -- ) -- ;; ;; -- ....... -- ;; ;; -- (endErrorHandler) -- ;; ;; -- ) -- ;; ;; --------------------------------------------------------------------------------------------------- ;; (defun StartErrorHandler( NAME UNDOMODE VARS_TO_SAVE / ErrorTemplate SAVELIST) ;; -- Schablone für programmspezifische Fehlerroutine -- ;; (setq ErrorTemplate '( (MSG / NAME UNDO SAVEDVARS PREVIOUSHANDLER ZAEHLER AUSWAHLSATZ) ;... Zeile wird eventuell noch eingesetzt.. Siehe unten .... (while(>(getvar "cmdactive")0)(command)) ; noch ein "ACAD-Befehl aktiv ??, dann Abbrechen! (command"_undo""_end") ; Undo-Endmarkierung (if (and undo msg) (command"_u")) ; wenn Undo True, dann alle Aktionen zurücksetzen (foreach PAIR SAVEDVARS ; Veränderte Variablen zurücksetzen (if (Getvar (car PAIR)) ; ist es eine Systemvariable ? (setvar(car PAIR)(cadr PAIR)) ; dann zurücksetzen mit SETVAR (set (read(car PAIR)) (cadr PAIR)) ;..sonst mit SET zurücksetzen ) ) (setq ZAEHLER 0) (setq AUSWAHLSATZ (ssget "X")) (while (and AUSWAHLSATZ (setq ELEMENT (ssname AUSWAHLSATZ ZAEHLER))) (redraw ELEMENT 4) ; Ausleuchten abschalten (setq ZAEHLER (1+ ZAEHLER)) ) (setq *error* previousHandler) ; Fehlerroutine auf ursprüngliche Fehlerroutine setzen (if msg (progn (princ(strcat"\n" Name ": \"" msg "\"")) ; und Fehlermeldung ausgeben (if previousHandler(previousHandler msg)) ) ) ) ) ;; -- Systemvariablen behandeln -- ; (if (=(type VARS_TO_SAVE) 'LIST) (foreach PAIR VARS_TO_SAVE ; Liste mit den Systemvariablen und den zu setzenden Werten durchlaufen (if (=(type PAIR) 'LIST) (if (=(length PAIR) 2) (if (=(type(car PAIR)) 'STR) (if (Getvar (car PAIR)) ; konnte Systemvariable ausgelesen werden ? (progn (setq SAVELIST (append SAVELIST; Namen der Systemvariable und alten Wert als "2er-Liste" (list (list (car PAIR) (getvar (car PAIR))))) ; .. in SAVELIST ) ; speichern .. (setvar(car PAIR)(cadr PAIR)) ; anschließend Systemvariable auf neuen Wert setzen ) (progn (setq SAVELIST (append SAVELIST ; Namen der Variable und alten Wert als "2er-Liste" (list (list (car PAIR) (eval(read(car PAIR)))))) ; .. in SAVELIST ) ; speichern .. (set (read(car PAIR)) (cadr PAIR)) ; anschließend Variable auf neuen Wert setzen ) ) ) ) ) ) ) (command"_undo""_begin") ; Undo-Markierung für "Rückgängig ab diesem Punkt" setzen ;; -- Error-Handler installieren -- ;; (setq *error* (append ; und ErrorTemplate initialisieren (list(car ErrorTemplate)) ; erste Zeile (Unterliste von ErrorTemplate) hinzufügen (if undomode'((setq undo 'T))) ; .. ergänzende Zeilen einfügen .. (list (list 'setq 'PreviousHandler (cons'quote(list *error*)) ) ) (list(list 'setq 'name name)) (list (cons'setq (cons'savedvars (list(cons'quote(list savelist))) ) ) ) (cdr ErrorTemplate) ; Rest von ErroTemplate hinzufügen .... ) ; end [APPEND] ) ; end [SETQ *ERROR*] ) ; end [DEFUN] ;; --------------------------------------------------------------------------------------------------- ;; ;; --------------------------------------------------------------------------------------------------- ;; ;; -- EndErrorHandler : Beendet Nutzerspezifischer Error-Handling -- ;; ;; --------------------------------------------------------------------------------------------------- ;; (defun EndErrorHandler( / ) (*error* nil) ; alle Änderungen von StartErrorHandler restaurieren ) ;; --------------------------------------------------------------------------------------------------- ;; ;; .. bishierher verschwindet theor. alles in irgentwelchen Bibos ;; --------------------------------------------------------------------------------------------------- ;; ;; --------------------------------------------------------------------------------------------------- ;; (defun c:my_ambroutline ( / ) (startErrorHandler "MYAMBROUTLINE" 'T '(("cmdecho" 0)("osmode" 512))) (c:ambroutline) ;(command "c:ambroutline") ;(command pause) ;(if (getvar "CMDACTIVE") (command pause)) (EndErrorHandler) (princ) ; ohne Rückgabe beenden ) ; end [DEFUN] ;; --------------------------------------------------------------------------------------------------- ;; (princ "\nAufruf mit : my_ambroutline\n")