Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  Rund um AutoCAD
  Errorhandling

Antwort erstellen  Neues Thema erstellen
CAD.de Login | Logout | Profil | Profil bearbeiten | Registrieren | Voreinstellungen | Hilfe | Suchen

Anzeige:

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen nächster neuer Beitrag | nächster älterer Beitrag
  
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


Sehen Sie sich das Profil von Urs.Dardel an!   Senden Sie eine Private Message an Urs.Dardel  Schreiben Sie einen Gästebucheintrag für Urs.Dardel

Beiträge: 14
Registriert: 25.04.2021

AutoCAD 2021

erstellt am: 14. Mai. 2021 23:00    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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
良い精神




Sehen Sie sich das Profil von cadffm an!   Senden Sie eine Private Message an cadffm  Schreiben Sie einen Gästebucheintrag für cadffm

Beiträge: 21533
Registriert: 03.06.2002

System: F1
und Google

erstellt am: 14. Mai. 2021 23:19    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Urs.Dardel 10 Unities + Antwort hilfreich

Hi,

da du wohl noch öfters Fragen zur Programmierung mit AutoLisp/VLisp hast,
hier die Liste der Foren rund um Autodesk Software: https://ww3.cad.de/cgi-bin/ubb/Ultimate.cgi?action=intro&category=13

Und dort gibt es auch ein Brett für LISP Programmierung!

PS: Überprüfe als erstes den Namen der Variable für die alten Variablenwerte,
überprüfe alle Stellen wo du diese fütterst oder ausliest.


Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Urs.Dardel
Mitglied
Zeichner


Sehen Sie sich das Profil von Urs.Dardel an!   Senden Sie eine Private Message an Urs.Dardel  Schreiben Sie einen Gästebucheintrag für Urs.Dardel

Beiträge: 14
Registriert: 25.04.2021

AutoCAD 2021

erstellt am: 14. Mai. 2021 23:30    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Danke für den Hinweis. Ich habe noch extra gesucht nach einem LISP-Forum. Fürs nächste mal weiss ich es jetzt. Ich überprüfe die LISP nochmal.

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

CAD-Huebner
Ehrenmitglied V.I.P. h.c.
Verm.- Ing., ATC-Trainer



Sehen Sie sich das Profil von CAD-Huebner an!   Senden Sie eine Private Message an CAD-Huebner  Schreiben Sie einen Gästebucheintrag für CAD-Huebner

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Urs.Dardel 10 Unities + Antwort hilfreich

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


Sehen Sie sich das Profil von Urs.Dardel an!   Senden Sie eine Private Message an Urs.Dardel  Schreiben Sie einen Gästebucheintrag für Urs.Dardel

Beiträge: 14
Registriert: 25.04.2021

AutoCAD 2021

erstellt am: 15. Mai. 2021 17:34    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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
良い精神




Sehen Sie sich das Profil von cadffm an!   Senden Sie eine Private Message an cadffm  Schreiben Sie einen Gästebucheintrag für cadffm

Beiträge: 21533
Registriert: 03.06.2002

System: F1
und Google

erstellt am: 15. Mai. 2021 18:35    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Urs.Dardel 10 Unities + Antwort hilfreich

Hi

wofür ist das dynmode=3?

Checke auch nochmal diesen Teil: (getstring "\Präfix ohne

Was mir noch auffällt: Du kümmerst dich nicht um den Objektfang,
dies kann dann unter Umständen zu unerwünschten Ergebnissen führen.

Wenn der Einfüge-Befehl nach dem Einfügepunkt verlangt, dann sende doch zunächst die temporäre Objektfangoption  "Kein" oder "_non"
und schon interessiert der aktuelle Objektfang nicht mehr.

(der Objektfang ist bei Punktangaben nur per Hand deaktiviert, wenn die Einstellung noch auf dem Vorgabewert dafür steht.
Schau mal hier zum Thema OsnapCoord
http://ww3.cad.de/cgi-bin/ubb/ubbmisc.cgi?action=getannounce&ForumNumber=54&Start=2456475.99&End=2462835&Announce=2
)

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Urs.Dardel
Mitglied
Zeichner


Sehen Sie sich das Profil von Urs.Dardel an!   Senden Sie eine Private Message an Urs.Dardel  Schreiben Sie einen Gästebucheintrag für Urs.Dardel

Beiträge: 14
Registriert: 25.04.2021

AutoCAD 2021

erstellt am: 15. Mai. 2021 20:45    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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


Sehen Sie sich das Profil von Urs.Dardel an!   Senden Sie eine Private Message an Urs.Dardel  Schreiben Sie einen Gästebucheintrag für Urs.Dardel

Beiträge: 14
Registriert: 25.04.2021

AutoCAD 2021

erstellt am: 15. Mai. 2021 22:55    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Danke noch für den Link zur Systemvariablen osnapCoord. Das löst natürlich mein Problem mit dem Objektfang.

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Urs.Dardel
Mitglied
Zeichner


Sehen Sie sich das Profil von Urs.Dardel an!   Senden Sie eine Private Message an Urs.Dardel  Schreiben Sie einen Gästebucheintrag für Urs.Dardel

Beiträge: 14
Registriert: 25.04.2021

AutoCAD 2021

erstellt am: 16. Mai. 2021 16:19    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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
良い精神




Sehen Sie sich das Profil von cadffm an!   Senden Sie eine Private Message an cadffm  Schreiben Sie einen Gästebucheintrag für cadffm

Beiträge: 21533
Registriert: 03.06.2002

System: F1
und Google

erstellt am: 16. Mai. 2021 17:38    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Urs.Dardel 10 Unities + Antwort hilfreich

>" 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
良い精神




Sehen Sie sich das Profil von cadffm an!   Senden Sie eine Private Message an cadffm  Schreiben Sie einen Gästebucheintrag für cadffm

Beiträge: 21533
Registriert: 03.06.2002

System: F1
und Google

erstellt am: 16. Mai. 2021 17:43    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Urs.Dardel 10 Unities + Antwort hilfreich

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

Anzeige.:

Anzeige: (Infos zum Werbeplatz >>)

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen

nächster neuerer Beitrag | nächster älterer Beitrag
Antwort erstellen


Diesen Beitrag mit Lesezeichen versehen ... | Nach anderen Beiträgen suchen | CAD.de-Newsletter

Administrative Optionen: Beitrag schliessen | Archivieren/Bewegen | Beitrag melden!

Fragen und Anregungen: Kritik-Forum | Neues aus der Community: Community-Forum

(c)2023 CAD.de | Impressum | Datenschutz