| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
| |
| PNY präsentiert die neue NVIDIA RTX A400 und die A1000 Grafikkarte, eine Pressemitteilung
|
Autor
|
Thema: Befehlsabbruch in Bemaßung (1179 mal gelesen)
|
wisch Mitglied
Beiträge: 78 Registriert: 22.05.2003
|
erstellt am: 02. Dez. 2009 15:01 <-- editieren / zitieren --> Unities abgeben:
Hallo LISP-Profi's! Ich hab da ein paar Code-Schnipsel angehängt, ich hab das Problem, dass bei Abbruch der Bemaßungsfunktion (z.B. "GS_ATH_DIM_OBJ") der Layer nicht wieder zum Ursprungslayer ($clayer) wechselt. Was müsste ich denn da noch einbauen? Vielen Dank im Voraus! Code: ;;----------------------------------------------------------------------------- ;;Ermitteln und Setzen des vom Bemassungsstil abhängigen Layers für Bemaßungen ;;----------------------------------------------------------------------------- (defun c:GS_GETLAY_DIM() (setq DIMS(getvar "DIMSTYLE"));_Dimstyle auslesen (cond ((= DIMS "STANDARD")(setvar "CLAYER" "0"));_Layer entsprechend aktuell setzen ((= DIMS "GS_M1-1")(command "_-layer" "M" "GS_DIM_M1-1" "FA" "12" "GS_DIM_M1-1" "")) ((= DIMS "GS_M1-10")(command "_-layer" "M" "GS_DIM_M1-10" "FA" "12" "GS_DIM_M1-10" "")) ) (princ) ) ;;------------------------------------------------------------------------
;;------------------------------------------------------------------------ ;;Funktion zum Erzeugen von Athena-Bemaßungs- und Beschriftungselementen ;;------------------------------------------------------------------------ (defun c:GS_ATH_DIM_OBJ() (setq $clayer (getvar "clayer")) (c:GS_GETLAY_DIM) (c:ATH_DIM_OBJ) (while (not (= 0 (getvar "CMDACTIVE"))) (command pause) ) (setvar "clayer" $clayer) (princ) ) ;;-------------------------------------------------------------------------- (defun c:GS_ATH_BKET() (setq $clayer (getvar "clayer")) (c:GS_GETLAY_DIM) (c:ATH_BKET) (while (not (= 0 (getvar "CMDACTIVE"))) (command pause) ) (setvar "clayer" $clayer) (princ) )
..... usw. ------------------ wisch Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Dorfy Mitglied Double-Dipl.-Ing. Bleistiftanspitzer
Beiträge: 900 Registriert: 21.07.2006 AutoCad2007, ProE, HiCad
|
erstellt am: 02. Dez. 2009 15:11 <-- editieren / zitieren --> Unities abgeben: Nur für wisch
Hi, du kannst den "Fehler" abfangen (vl-catch-all-apply 'deinesub) [Eidt: siehe auch (vl-catch-all-error-message (siehe Hilfe..)] oder probierst einen "klassischen" error-Handler einzubauen (siehe Hilfe oder Forum...) ------------------ Mfg Heiko Elefantenjagd in Afrika "... LISP-Programmierer bauen einen Irrgarten aus Klammern und hoffen, dass sich der Elefant darin verirrt..." (www.uni-leipzig.de/~rotheh/elefant.htm) [Diese Nachricht wurde von Dorfy am 02. Dez. 2009 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
wisch Mitglied
Beiträge: 78 Registriert: 22.05.2003
|
erstellt am: 03. Dez. 2009 08:48 <-- editieren / zitieren --> Unities abgeben:
1) Ich habe bei mapcar zu (vl-catch-all-apply ...) nachgelesen, aber wenn ich es richtig verstehe, geht es hier um Fehlerrückmeldungen. In meinem Fall interessiert mich nur der Fall, wenn mit ESC abgebrochen wird, soll der Layer wieder zurückgesetzt werden auf den Ausgangswert ($clayer), ich benötige keine Rückmeldungen. Ich hab nun auch einen Error-Handler eingebaut, aber auch der bringt nicht das gewünschte Ergebnis (der Layer wird nicht zurückgesetzt). Vielleicht erkennt noch jemand, was das Problem ist, bzw. hat einen besseren Lösungsvorschlag!? 2) Ich hab auch noch eine Frage für etwas Kosmetik: Ich habe mehrere Funktionen, für die ich so wie hier im Beispiel f. "GS_ATH_DIM_OBJ" beinahe die selbe Funktion ausführen möchte. Beinahe deshalb, es soll bis auf die in der Funktion ausgeführten Unterfunktion "ATH_DIM_OBJ" der gleiche Ablauf erfolgen: <clayer ermittel> <GS_GETLAY_DIM (Bemaßungslayer setzen)> <Unterfunktionsaufruf> <vorherigen Layer wieder aktuell setzen> Wie könnte man das "sauberer" lösen, indem man ev. die Funktionen besser gruppieren kann. Denke etwa so: Mein Funktionsaufruf | Unterfunktionsaufruf | Layerkram GS_ATH_DIM_OBJ | ATH_DIM_OBJ | GS_SET_LAY GS_ATH_DIM_XYZ | ATH_DIM_XYZ | GS_SET_LAY Zur Erklärung für mein wahrscheinlich lächerliches Geschreibsel: Ich Zähle nicht zur Gruppe von LISP-Programmierern -verstehern und -profis, sondern zur Gruppe der LISP-Zusammenstoppler und -erahner!!!
Code:
;;----------------------------------------------------- (defun c:GS_ATH_DIM_OBJ() (startErrorHandler nil) (setq $clayer (getvar "clayer")) (c:GS_GETLAY_DIM) (c:ATH_DIM_OBJ) (while (not (= 0 (getvar "CMDACTIVE"))) (command pause) ) (setvar "clayer" $clayer) (endErrorHandler) ) ;;----------------------------------------------------- ;;----------------------------------------------------- ;;Error-Handler ;;----------------------------------------------------- (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 endErrorHandler( / ) (*error* nil) ) (defun myErrorFunction(msg / ) ; hinzugefügt: (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) ) ;;Ende Error-Handler ;;-----------------------------------------------------
DANKE! ------------------ wisch Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
wisch Mitglied
Beiträge: 78 Registriert: 22.05.2003 WIN 7 Prof. SP1 64Bit Intel i7 2,4GHz 8GB PDSU 2013 Vault Prof. 2013
|
erstellt am: 10. Dez. 2009 10:05 <-- editieren / zitieren --> Unities abgeben:
Vielleicht ist mein Beitrag hier etwas unübersichtlich geworden, ich versuche mal zu entwirren und auf die Kernfrage zurückzukommen: Beispiel: Code: (defun c:FUNKTION1() (setq $clayer (getvar "clayer")) (c:GET-DIM-LAYER) (c:FUNKTION2) (while (not (= 0 (getvar "CMDACTIVE"))) (command pause) ) (setvar "clayer" $clayer) (princ) )
Meine Frage ist nun, wie ich einen Abbruch mittels ESC in der "FUNKTION2", die Benutzereingaben erfordert, so abfangen kann, dass in jedem Fall der Layer wieder zurückgesetzt wird auf "$clayer"? In der Funktion "GET-DIM-LAYER" wird der Layer in Abhängigkeit vom aktuellen Bemaßungsstil gesetzt, das funktioniert alles soweit. Danke für eure Hilfe! ------------------ wisch Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13527 Registriert: 30.11.2003 .
|
erstellt am: 10. Dez. 2009 10:12 <-- editieren / zitieren --> Unities abgeben: Nur für wisch
|
wisch Mitglied
Beiträge: 78 Registriert: 22.05.2003
|
erstellt am: 10. Dez. 2009 10:50 <-- editieren / zitieren --> Unities abgeben:
Danke Thomas für die schnelle Antwort! Leider funktioniert es aber immer noch nicht! Es muss an der FUNKTION2 liegen, die ja mit (c:FUNKTION2)aufgerufen wird. Ich hab mal ausprobiert, stattdessen (command "_.dimlinear")einzusetzen, da funktioniert es grundsätzlich, wenn auch in der Befehlszeile die Benutzeraufforderungen fehlen, es steht nur "Befehl:" da! Hilft das jemandem weiter eine Lösung zu finden?? ------------------ wisch Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13527 Registriert: 30.11.2003 .
|
erstellt am: 10. Dez. 2009 10:53 <-- editieren / zitieren --> Unities abgeben: Nur für wisch
|
Dorfy Mitglied Double-Dipl.-Ing. Bleistiftanspitzer
Beiträge: 900 Registriert: 21.07.2006 AutoCad2007, ProE, HiCad
|
erstellt am: 10. Dez. 2009 10:54 <-- editieren / zitieren --> Unities abgeben: Nur für wisch
dann fange doch die Funktion2 ab oder poste doch diese einfach mal... das könnte uns die Glaskugel ersparen oder poste doch mal alles und nicht nur Fragmente... ------------------ Mfg Heiko Elefantenjagd in Afrika "... LISP-Programmierer bauen einen Irrgarten aus Klammern und hoffen, dass sich der Elefant darin verirrt..." (www.uni-leipzig.de/~rotheh/elefant.htm) Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
wisch Mitglied
Beiträge: 78 Registriert: 22.05.2003
|
erstellt am: 10. Dez. 2009 11:15 <-- editieren / zitieren --> Unities abgeben:
Zitat: Original erstellt von Dorfy: dann fange doch die Funktion2 ab oder poste doch diese einfach mal... das könnte uns die Glaskugel ersparen oder poste doch mal alles und nicht nur Fragmente...
@Heiko: Ich habe eigentlich im ersten Beitrag ganz oben in diesem Thread alles wesentliche angeführt, meine LISP ist zwar noch größer, aber da sind nur noch andere Dinge drinnen. @Thomas: Leider bringt auch (VL-CATCH-ALL-APPLY 'c:FUNKTION2) nicht das gewünschte Ergebnis. Die FUNKTION2 ist ein ATHENA-Befehl, vielleicht liegt es an dem? Da weiß ich aber nicht, wie ich das herausfinden kann!?! ------------------ wisch Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Dorfy Mitglied Double-Dipl.-Ing. Bleistiftanspitzer
Beiträge: 900 Registriert: 21.07.2006 AutoCad2007, ProE, HiCad
|
erstellt am: 10. Dez. 2009 11:29 <-- editieren / zitieren --> Unities abgeben: Nur für wisch
was erhälts du denn als Rückgabe mit vl-catch-all-error-message (vl-catch-all-error-message (VL-CATCH-ALL-APPLY 'c:Funktion2)) ------------------ Mfg Heiko Elefantenjagd in Afrika "... LISP-Programmierer bauen einen Irrgarten aus Klammern und hoffen, dass sich der Elefant darin verirrt..." (www.uni-leipzig.de/~rotheh/elefant.htm) Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
wisch Mitglied
Beiträge: 78 Registriert: 22.05.2003
|
erstellt am: 10. Dez. 2009 12:02 <-- editieren / zitieren --> Unities abgeben:
Wenn ich mit ESC abbreche gar keine Rückmeldung, wenn ich den Befehl normal durchlaufen lasse, bekomme ich: ; Fehler: Argument ist kein vl-catch-all-apply-Fehler: Befehl:------------------ wisch Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |