| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: Errorhandling (1004 / mal gelesen)
|
Urs.Dardel Mitglied Zeichner
Beiträge: 14 Registriert: 25.04.2021 AutoCAD 2021
|
erstellt am: 14. Mai. 2021 23:00 <-- editieren / zitieren --> Unities abgeben:
Hallo zusammen Ich habe mir mit meinen bescheidenen Lispkenntnissen eine LISP gebastelt, mit dem ich mit dem Tachymeter Höhenpunkte in einen Block schreiben kann. Dafür muss ich attdia auf 0 stellen und will dynmode auf 3 haben. Da der Befehl eine Schlaufe hat, die nach der letzten gewünschte Höhe abgebrochen wird kann ich die Systemvariablen nicht mehr zurüchstellen. Ich habe auf der Webseite von Axel Strube eine Errorhandling-Funktion gefunden und diese versucht einzubauen. Meine Lisp sieht folgendermassen aus: (defun startErrorHandler(varsToSave / ) (command "_undo" "_begin") (foreach pair varsToSave (setq *saveList* (cons (cons(car pair)(getvar(car pair))) saveList ) ) (setvar(car pair)(cdr pair)) ) (setq *oldError* *error*) (setq *error* myErrorFunction) ) (defun endErrorHandling( / ) (*error* nil) ) (defun myErrorFunction(msg / ) (while(>(getvar "cmdactive")0)(command)) (if msg(print msg)) (command"_undo""_end") (foreach pair *savedList* (setvar(car pair)(cadr pair)) ) (setq *savedVars* nil) (setq *error* *oldError*) (setq *oldError* nil) ) (defun c:ha () (if (not (tblsearch "BLOCK" "ADB_Höhe_Grundriss")) ((alert"Der Block ADB_Höhe_Grundriss wird nicht gefunden. \Bitte lade den Block in die Zeichnung und führe den Befehl HA erneut aus"))) (startErrorHandler nil '( ("attdia" . 0) ("dynmode" . 3) ) ) (repeat 100 (command "_-insert" "ADB_Höhe_Grundriss" (setq p1 (getpoint "\nPunkt wählen: ")) "" "" "" (rtos (caddr p1) 2 2)) ) (endErrorHandling) )
Die Systemvariablen werden wie gewollt geändert. Nach eienm Abbruch vor der Eingabe werden diese aber nicht wieder zurückgestellt. Es gibt keine Fehlermeldung. Kann mir jemand weiterhelfen.
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Moderator 良い精神
Beiträge: 21533 Registriert: 03.06.2002 System: F1 und Google
|
erstellt am: 14. Mai. 2021 23:19 <-- editieren / zitieren --> Unities abgeben: Nur für Urs.Dardel
|
Urs.Dardel Mitglied Zeichner
Beiträge: 14 Registriert: 25.04.2021 AutoCAD 2021
|
erstellt am: 14. Mai. 2021 23:30 <-- editieren / zitieren --> Unities abgeben:
|
CAD-Huebner Ehrenmitglied V.I.P. h.c. Verm.- Ing., ATC-Trainer
Beiträge: 9732 Registriert: 01.12.2003 AutoCAD 2.5 - 2022, Civil 3D, MAP 3D, ACADM Inventor AutoCAD 2022, AIP 4-2022 Win 10
|
erstellt am: 15. Mai. 2021 10:39 <-- editieren / zitieren --> Unities abgeben: Nur für Urs.Dardel
Trenne in deinen Programmen die Eingabe immer von der Aufgabe. Dann kanst du die Eingabe erst validieren und dann entscheiden, ob die Aufgabe durchgeführt werden kann/soll. Statt
Code: (repeat 100 (command "_-insert" "ADB_Höhe_Grundriss" (setq p1 (getpoint "\nPunkt wählen: ")) "" "" "" (rtos (caddr p1) 2 2)) )
Z.B. Code:
; nur wenn p1 einen gültigen Punkt enthält (While (setq p1 (getpoint "\nPunkt wählen: <Enter zum Beenden> ")) (setvar "ATTDIA" 0) (command "_-insert" "ADB_Höhe_Grundriss" p1 "" "" "" (rtos (caddr p1) 2 2)) ; Aufgabe ausführen (setvar "ATTDIA" 1) )
Selbst ohne erorhandling würde ATTDIA bei Abbruch mit Esc bei (getpoint...) anschließend immer auf 1 stehen. ------------------ Mit freundlichem Gruß
Udo Hübner www.CAD-Huebner.de [Diese Nachricht wurde von CAD-Huebner am 15. Mai. 2021 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Urs.Dardel Mitglied Zeichner
Beiträge: 14 Registriert: 25.04.2021 AutoCAD 2021
|
erstellt am: 15. Mai. 2021 17:34 <-- editieren / zitieren --> Unities abgeben:
Da habe ich gleich wieder etwas wichtiges gelernt und es macht alles viel einfacher. Meine LISP sieht folgendermassen aus: (defun c:ha () (if (not (tblsearch "BLOCK" "ADB_Höhe_Grundriss")) ((alert"Der Block ADB_Höhe_Grundriss wird nicht gefunden. \Bitte lade den Block in die Zeichnung und führe den Befehl ha erneut aus")exit)) (setq attdia-aw (getvar "attdia")) (setq dimzin-aw (getvar "dimzin")) (setvar "dynmode" 3) (Setq präfix (getstring "\Präfix ohne ():<Enter = ohne Präfix>")) (if (/= präfix "")(setq präfix (strcat "("präfix")"))) (While (setq p1 (getpoint "\nPunkt wählen: <Enter zum Beenden> ")) (setq Höhe (strcat präfix (rtos (caddr p1) 2 2))) (setvar "attdia" 0) (setvar "dimzin" 0) (command "_-insert" "ADB_Höhe_Grundriss" p1 "" "" "" höhe) (setvar "attdia" attdia-aw) (setvar "dimzin" dimzin-aw) ) ) Die Systemvariable dynmode bleibt halt auf 3, aber das stört mich nicht, vielleicht nehme ich es ganz raus. An das Errorhandling mache ich mich als nächstes, dass kann man sicher immer wieder gut gebrauchen. Danke für dein Hilfe. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Moderator 良い精神
Beiträge: 21533 Registriert: 03.06.2002 System: F1 und Google
|
erstellt am: 15. Mai. 2021 18:35 <-- editieren / zitieren --> Unities abgeben: Nur für Urs.Dardel
|
Urs.Dardel Mitglied Zeichner
Beiträge: 14 Registriert: 25.04.2021 AutoCAD 2021
|
erstellt am: 15. Mai. 2021 20:45 <-- editieren / zitieren --> Unities abgeben:
Danke Für die Hinweise Das dynmode 3 habe ich eingeführt, weil es bei uns einige Anwender gibt, die sehr selten mit Autocad arbeiten und sich nie an der Befehlszeile orientieren. Aber vielleicht sollte ich es weglassen sonst fördere ich ihr Verhalten noch. Das mit dem Fang hatte ich auf dem Schirm. Ich wollte das noch austesten ob der Objektang greift, wenn ich XYZ-Daten mit dem Tachy direkt in Befehlszeile schreibe. Wenn ja muss ich den noch steuern. Es ist nur so, dass wir den selben Befehl teilweise auch über Punktwolken brauchen und da brauche ich den Fang. Ich kann den Fang ja sonst am Anfang der LISP ausschalten, so kann man ihn manuell wieder einschalten für die Punktwolke.
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Urs.Dardel Mitglied Zeichner
Beiträge: 14 Registriert: 25.04.2021 AutoCAD 2021
|
erstellt am: 15. Mai. 2021 22:55 <-- editieren / zitieren --> Unities abgeben:
|
Urs.Dardel Mitglied Zeichner
Beiträge: 14 Registriert: 25.04.2021 AutoCAD 2021
|
erstellt am: 16. Mai. 2021 16:19 <-- editieren / zitieren --> Unities abgeben:
Ich will mich nochmals an den Errorhandler von Axel Strube wagen. Die Variablen habe ich überprüft und bereinigt. Ich verstehe folgende Zeilen nicht: (defun myErrorFunction(msg / ) (while(>(getvar "cmdactive")0)(command)) (if msg(print msg)) (command "_undo""_end") In der zweiten Zeile wird über cmdactive ermittelt ob ein Befehl oder Script aktiv ist. Wenn ja dann Command das verstehe ich nicht. Auch (if msg(print msg)(command "_undo""_end") verstehe ich den Sinn nicht. Kann mir da jemand auf die Sprünge helfen.
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Moderator 良い精神
Beiträge: 21533 Registriert: 03.06.2002 System: F1 und Google
|
erstellt am: 16. Mai. 2021 17:38 <-- editieren / zitieren --> Unities abgeben: Nur für Urs.Dardel
>" Wenn ja dann Command das verstehe ich nicht" Dann hast du vermutlich nie die Hilfe zu der LispFunktion command gelesen? Dann hole es doch jetzt nach: [F1] Command (AutoLISP) >"Auch (if msg(print msg)(command "_undo""_end") verstehe ich den Sinn nicht..
Also das ist jetzt schon härter. PRINT gibt Text aus (wenn denn das Argument MSG übergeben wurde), sollte ja bekannt sein. Das ist Standard bei einem AutoCAD Befehls-Abbruch und sollte so auch bei benutzerdefinierten Befehlen übernommen werden. (Wie der ganze Standard Syntax in Acad) Und wenn du command undo nicht verstehst, das ist eigentlich selbsterklarend wenn einem Undo/Zurück bekannt ist, dann starte ACAD und lese dich ein zum Befehl ZURÜCK und den Optionen [F1], hat ja nichts mit Lisp und Programmierung an sich zutun. Zudem steht auf Axels Tutorial auch erklärt warum er undo einsetzt. Zwar nur Hinweise auf die Hilfe und das Tutorial, aber es sollte dennoch helfen wink: Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Moderator 良い精神
Beiträge: 21533 Registriert: 03.06.2002 System: F1 und Google
|
erstellt am: 16. Mai. 2021 17:43 <-- editieren / zitieren --> Unities abgeben: Nur für Urs.Dardel
Ich sehe gerade einen Tippfehler bei dir, vielleicht liest du es auch immer falsch und verstehst es deswegen nicht. SO macht es keinen Sinn: (if msg(print msg)(command "_undo""_end") aber SO hat es auch keiner vorgeschlagen Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |