| |
| 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: Fehlermeldung bei Globalen Varaiblen (1602 / mal gelesen)
|
cadking Mitglied CAD-Zeichendiensleistung
Beiträge: 242 Registriert: 26.10.2004 Intel Quadcore i7,W7-64bit, Quadro FX 3800 MEP/ACA2018; MEP/ACA2018; MEP/ACA2021; MEP/ACA2021
|
erstellt am: 09. Jan. 2017 12:20 <-- editieren / zitieren --> Unities abgeben:
Hallo ihr lieben Helfer, ich habe schon in AutoCAD 2012 einige Lisp's erstellt unf versuche mich jetzt an AutoCAD 2015. Dabei habe ich ein Problem mit Lisp's, in denen Variablen Global definiert sind: (defun getoldvar (blkscale blkscaleo attreqmode cmdoldecho oldsnap / ) (setq blkscale (getvar "INSUNITS")) (setq blkscaleo (getvar "INSUNITSDEFTARGET")) (setq attreqmode (getvar "attreq")) (setq cmdoldecho (getvar "cmdecho")) (setq oldsnap (getvar "osmode")) ) Diese Variante gibt mir folgende Meldung zurück: Befehl: (LOAD "T:/Roche/Ihmann/Elektroblocktausch/LSP/getoldvar1.lsp") Aufrufen von (command) aus *Fehler* nicht möglich, ohne vorheriges Aufrufen von (*push-error-using-command*). Konvertieren von (command)-Aufrufen in (command-s) wird empfohlen. (defun getoldvar ( / blkscale blkscaleo attreqmode cmdoldecho oldsnap) (setq blkscale (getvar "INSUNITS")) (setq blkscaleo (getvar "INSUNITSDEFTARGET")) (setq attreqmode (getvar "attreq")) (setq cmdoldecho (getvar "cmdecho")) (setq oldsnap (getvar "osmode")) ) (getoldvar) Diese Variante funktioniert. Wie kann ich Lisp's mit globalen Variablen für AutCAD 2015 definieren? Danke für eure Hilfe Stefan ------------------ Danke Stefan Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13527 Registriert: 30.11.2003 .
|
erstellt am: 09. Jan. 2017 12:26 <-- editieren / zitieren --> Unities abgeben: Nur für cadking
|
cadking Mitglied CAD-Zeichendiensleistung
Beiträge: 242 Registriert: 26.10.2004 Intel Quadcore i7,W7-64bit, Quadro FX 3800 MEP/ACA2018; MEP/ACA2018; MEP/ACA2021; MEP/ACA2021
|
erstellt am: 09. Jan. 2017 13:11 <-- editieren / zitieren --> Unities abgeben:
Hallo CADmium, deine Variante funktioniert zwar auch, aber die Variablen behalten ihre Werte nach Beendigung der Lisp. Die Variablen sollen aber wieder auf NIL zurückgesetzt werden und ich möchte die nicht mit am Ende allle wieder Setq wieder zurücksetzen. Ausserdem ist diese defun-Funktion nur ein Bestandteil einer Lisp und immer wenn ich die Variablen Global, also ( Variable1 Variable2 Variable3 / ) eingebe erhalte ich die Meldung: Aufrufen von (command) aus *Fehler* nicht möglich, ohne vorheriges Aufrufen von (*push-error-using-command*). Konvertieren von (command)-Aufrufen in (command-s) wird empfohlen. Diese Meldung kenne ich nicht aus AutoCAD 2012. Werden in AutoCAD 2015 die globalen Variablen anders definiert? ------------------ Danke Stefan Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13527 Registriert: 30.11.2003 .
|
erstellt am: 09. Jan. 2017 13:17 <-- editieren / zitieren --> Unities abgeben: Nur für cadking
|
cadking Mitglied CAD-Zeichendiensleistung
Beiträge: 242 Registriert: 26.10.2004 Intel Quadcore i7,W7-64bit, Quadro FX 3800 MEP/ACA2018; MEP/ACA2018; MEP/ACA2021; MEP/ACA2021
|
erstellt am: 09. Jan. 2017 17:55 <-- editieren / zitieren --> Unities abgeben:
Hallo CADmium, danke für deine Antwort. So funktioniert es zwar, aber es ist doch wesentlich umständlicher als in AutoCAD 2012. Ist das mit den globalen Variablen wirklich anders als früher? So muss man ja immer eine zusätzliche Funktion erstellen um die Variablen zu löschen. ------------------ Danke Stefan Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Moderator 良い精神
Beiträge: 22275 Registriert: 03.06.2002 Alles
|
erstellt am: 09. Jan. 2017 18:15 <-- editieren / zitieren --> Unities abgeben: Nur für cadking
Zitat: Original erstellt von cadking: Ist das mit den globalen Variablen wirklich anders als früher?
NEIN, es ist nichts anders wie früher (was dies angeht). Auch denke ich, ohne selbst am Programm zu prüfen, dass deine Fehlermeldung nichts mit dem hier geposteten Code zutun hat. Deine Fehlermeldung zeigt den Fehlerfall(Abbruch) und die Meldung deutet darauf hin das in deiner *error*-Routine ein COMMAND verwendet wird. Dein ursprünglicher {(defun getoldvar (blkscale...} Code ist Nonsens, egal in welcher Version. Es ist daher derzeit nicht klar was du bisher eingesetzt hattest. ------------------ CAD on demand GmbH - Beratung und Programmierung rund um AutoCAD Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
neurosis Mitglied dipl.ing.
Beiträge: 224 Registriert: 22.08.2006
|
erstellt am: 09. Jan. 2017 20:53 <-- editieren / zitieren --> Unities abgeben: Nur für cadking
hallo cadking, als ergaenzung zu dem schon geschrieben wuerde ich dir folgende seiten zum thema funktionen / funktionsdeklarationen / sichtbarkeiten von variablen empfehlen: definieren von eigenen funktionen und besonders lokale variablen und funktionsargumente vielleicht klaert sich dadurch schon einiges. ansonsten gehe ich mit cadffm konform, dass der fehler in einer error-routine liegt. wodurch der fehler auftritt, keine ahnung, aber definitiv nicht durch verwendung der geposteten funktion (ausser du rufst sie falsch auf). gruss marco ------------------ Marco Heuer www.arc-aachen.de Airport Office [Diese Nachricht wurde von neurosis am 09. Jan. 2017 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadking Mitglied CAD-Zeichendiensleistung
Beiträge: 242 Registriert: 26.10.2004 Intel Quadcore i7,W7-64bit, Quadro FX 3800 MEP/ACA2018; MEP/ACA2018; MEP/ACA2021; MEP/ACA2021
|
erstellt am: 10. Jan. 2017 10:25 <-- editieren / zitieren --> Unities abgeben:
Hallo cadffm, hallo Marco, vielen Dank, dass ihr euch mit meinem Problem beschäftigt. Warum ist der Code Nonsens? Ich speichere damit Variablen, die ich später wieder zurücksetzen möchte. zu Marco: ich habe die Funktion aus einer anderen Lisp herauskopiert um zu prüfen ob die Fehlermeldung aus den globalen Variablen herrührt. In dieser Funktion gib es doch gar keine error-routine. Und ich starte die Funktion: (defun getoldvar (blkscale blkscaleo attreqmode cmdoldecho oldsnap / ) (setq blkscale (getvar "INSUNITS")) (setq blkscaleo (getvar "INSUNITSDEFTARGET")) (setq attreqmode (getvar "attreq")) (setq cmdoldecho (getvar "cmdecho")) (setq oldsnap (getvar "osmode")) ) (getoldvar) durch Drag&Drop aus dem Explorer. Wie kann ich die Funktion da falsch starten? Ich erhalte die Fehlermeldung immer, wenn ich eine Funktion wie folgt schreibe: (defun irgendwas (Var1 Var2 / ) ... ) (irgendwas) Diese Funktion läuft ohne Fehlermeldung ab: (defun irgendwas ( / Var1 Var2) ... ) (irgendwas) Gruß Stefan ------------------ Danke Stefan 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. Jan. 2017 10:38 <-- editieren / zitieren --> Unities abgeben: Nur für cadking
(defun getoldvar (blkscale blkscaleo attreqmode cmdoldecho oldsnap / ) ... (getoldvar) da fehlen im Funktionsaufruf 5 Parameter !!!!! da du die Variablen eh nicht nutzt reicht (getoldvar 0 0 0 0 0) oder mit Nil Aber ich verstehe dich trotzdem nicht ... wenn du die Funktion so definierst (defun getoldvar (blkscale blkscaleo attreqmode cmdoldecho oldsnap / ) hast du außerhalb der Funktion keinen Zugriff auf die Vars ... alle Nil ... kannst nichts zurücksetzen, brauchst aber auch nicht zu "löschen" definierst du die Funktion so (defun getoldvar () (setq blkscale (getvar "INSUNITS")) ... ) hast du globale Variablen, kannst zurücksetzen , und musst so gewollt ??? "löschen" Universeller wäre sowieso ne Funktion mit einer Sysvarliste als Parameter und Rückgabewert ... irgendwo in den Tiefen des Lispbretts gabs mal einen Errorhandler , der so ähnlich gearbeitet hat Mal als Idee: (vl-load-com) (defun GETSYSVARS( SYSVARS ) (if(and(=(type SYSVARS)'LIST) (setq SYSVARS(vl-remove-if-not '(lambda(X)(=(type X)'STR)) SYSVARS)) ) (mapcar '(lambda(X)(list (strcase X)(getvar X))) SYSVARS) ) ) (defun SETSYSVARS( SYSVARS ) (if(and(=(type SYSVARS) 'LIST) (setq SYSVARS(vl-remove-if-not '(lambda(X)(=(type (car X))'STR)) SYSVARS)) ) (mapcar '(lambda(X) (if(not(vl-catch-all-error-p (vl-catch-all-apply 'setvar (list (car X)(cadr X))) ) ) (car X) ) ) SYSVARS ) ) ) (defun C:TESTUS(/ *MYSYVARLIST*) (setq *MYSYVARLIST* (GETSYSVARS '("INSUNITS" "INSUNITSDEFTARGET" "attreq" "cmdecho" "osmode"))) machwas (SETSYSVARS *MYSYVARLIST*) (princ) ) ------------------ Also ich finde Unities gut ... und andere sicher auch --------------------------------------- - Thomas - "Bei 99% aller Probleme ist die umfassende Beschreibung des Problems bereits mehr als die Hälfte der Lösung desselben."
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Meldin Mitglied
Beiträge: 398 Registriert: 15.07.2011 ACA2020 Windows10
|
erstellt am: 10. Jan. 2017 10:44 <-- editieren / zitieren --> Unities abgeben: Nur für cadking
Hallo, dein Code läuft immer wenn du was übergibst also teste verschidenes: (getoldvar "hier" "kann" "egal" "was" "stehen") (getoldvar "Ein" "Vogel" "auf" "dem" "Baum") (getoldvar 1 2 3 4 5 ) Schau dir im defun die Klammer an "(Übergabe / lokaleVar)" ------------------ Gruß Wolfgang Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
joern bosse Ehrenmitglied Dipl.-Ing. Vermessung
Beiträge: 1763 Registriert: 11.10.2004 Window 11 ACAD 2021 CIVIL 2021 BricsCAD ab V14 11th Gen Intel(R) Core(TM) i7-1165G7 @ 2.80GHz 2.80 GHz 32.0GB RAM NVIDIA GeForce MX450<P>
|
erstellt am: 10. Jan. 2017 12:16 <-- editieren / zitieren --> Unities abgeben: Nur für cadking
Hallo Stefan, hier noch eine Variante, mit der die alten Variableninhalte in einer globalen Variable "TEST$$VariList" gespeichert werden und zu Beginn, optional, auf Default-Werte gesetzt werden: Code:
;;;Varialble mit optionalen DefaultWert für die Laufzeit (defun Test:Vari:List ( / VariList) '( ("plinetype" nil) ("osmode" 0) ("cmdecho" 0) ("osnapcoord" 1) ("clayer" nil) ("dimzin" 3) ("michgibtesgarnicht" nil) )) ;;;Variablenwerte speichern und optional auf Defaultwert setzen (defun TEST:Vari:Store ( / ) (setq TEST$$VariList (vl-remove-if 'not (mapcar '(lambda(X) (if (getvar (car X)) (progn (if (cadr X) (setvar (car X)(cadr X))) (list (car X)(getvar (car X))))) ) (Test:Vari:List)))) ) ;;;ursprüngliche Variablenwerte wiederherstellen (defun TEST:Vari:ReStore ( / ) (mapcar '(lambda(X) (setvar (car X)(cadr X))) TEST$$VariList) (setq TEST$$VariList nil)) (defun c:test ( / ) (TEST:Vari:Store) (alert "Das ist ein Testprogramm") (TEST:Vari:ReStore) (princ))
------------------ viele Grüße Jörn http://www.bosse-engineering.com Liniensignaturen Youtube Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadking Mitglied CAD-Zeichendiensleistung
Beiträge: 242 Registriert: 26.10.2004 Intel Quadcore i7,W7-64bit, Quadro FX 3800 MEP/ACA2018; MEP/ACA2018; MEP/ACA2021; MEP/ACA2021
|
erstellt am: 10. Jan. 2017 14:19 <-- editieren / zitieren --> Unities abgeben:
Hallo CADmium, danke für die Mühe, aber dein Code gibt mir dieselbe Fehlermeldung zurück: Ich habe die Zeile machwas durch (princ *MYSYVARLIST*) ersetzt. Befehl: testus Aufrufen von (command) aus *Fehler* nicht möglich, ohne vorheriges Aufrufen von (*push-error-using-command*). Konvertieren von (command)-Aufrufen in (command-s) wird empfohlen. Befehl: Ich kappiers nicht, sorry ------------------ Danke Stefan Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Moderator 良い精神
Beiträge: 22275 Registriert: 03.06.2002 Alles
|
erstellt am: 10. Jan. 2017 14:45 <-- editieren / zitieren --> Unities abgeben: Nur für cadking
nur Kurz: Der Code von CADmium hat Fehler <sicher keine Absicht>, soweit so gut. Durch den Fehler gibt es (wieder) einen Abbruch, die aktuelle *error*-Funktion springt an und da diese unverändert ist, kommt wieder der besagte Fehler. DIESER Fehler hat aber nicht mit dem Code zutun, der möglicherweise auch schon bei der Eingabe von (/ 1 0) nachzuvollziehen ist, was aber nicht ganz sicher zu sagen ist, da man die Error-Funktion nicht kennt. Soll-Verhalten: Befehl: (/ 1 0) ; Fehler: Division durch 0 Gegen-Probe: Befehl: (setq olderr *error*) #<SUBR @0000006e43e2e8e0 *ERROR*> Befehl: (defun *error* (msg)(command "FILEDIA" 1)(alert "Diese Meldung wird nicht erscheinen")) *ERROR* Befehl: (/ 1 0) Aufrufen von (command) aus *Fehler* nicht möglich, ohne vorheriges Aufrufen von (*push-error-using-command*). Konvertieren von (command)-Aufrufen in (command-s) wird empfohlen. ------------------ CAD on demand GmbH - Beratung und Programmierung rund um AutoCAD Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Andreas Kraus Mitglied Elektrotechniker
Beiträge: 1455 Registriert: 11.01.2006 WIN 10 ACAD 2022 BricsCAD V23
|
erstellt am: 10. Jan. 2017 14:50 <-- editieren / zitieren --> Unities abgeben: Nur für cadking
Hallo Stefan, ich hab das hier gelesen und möchte dir noch etwas zum Nachdenken geben. Wenn du kleine Hilfsprogramme wie z.B. das hier zum Verwalten von Systemvariablen erstelltst, dann mach sie so universell wie möglich. Wenn du ein Programm schreibst das dir einige Variablen speichert/wiederherstellt dann kann dieses Programm keine weitere Variable verarbeiten (außer du änderst das Programm). Wenn du ein Programm schreibst dem du eine Liste mit Variablennamen gibst die verarbeitet werden sollen, ist das universeller wenn du mal andere Variablen brauchst. Die Variable in der die Werte (mit den zugehörigen Namen) gespeichert werden ist natürlich "so global wie möglich" damit andere Programmmodule darauf zugreifen können. Das kann so weit gehen dass du z.B. den aktuellen Layer speicherst, stundenlang bis kurz vor Feierabend auf anderen Layern arbeitest und dann den gespeicherten Layer wieder aktuell machen lässt. Also keine Angst vor globalen Variablen, wenn sie Sinn machen. Aber wie hier ja schon darauf hingewiesen wurde, solltest du dir die Verarbeitung in Listen anschauen. Du kannst viele Vorhaben damit vereinfachen. Stell dir nur mal vor du hast 30-50 Systemvariablen gespeichert, während dem Programmablauf müssen einige wieder ihren gespeicherten Wert bekommen (das Programm holt sich die Werte aus der Liste) und zum Schluss alle. Das Programm könnte einfach alle in der Liste abarbeiten, ohne dass du dir merken musst welche Sysvars du gespeichert hast (stehn ja in der Liste) Und wenn du die gespeicherten Sysvars nicht mehr braucht, löschst du nur die Liste, also eine einzige Variable. Denk mal drüber nach. Ich hab vor 17 Jahren (kann ich mir gut merken weils 2000 war ) fast alle meine Programme neu geschrieben, weil ich sagen wir mal "üngünstig" programmiert habe. War ne Menge Arbeit. Spar dir das. ------------------ Geht nicht, gibts nicht Gruß Andreas http://kraus-cad.de 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. Jan. 2017 15:19 <-- editieren / zitieren --> Unities abgeben: Nur für cadking
|
cadking Mitglied CAD-Zeichendiensleistung
Beiträge: 242 Registriert: 26.10.2004 Intel Quadcore i7,W7-64bit, Quadro FX 3800 MEP/ACA2018; MEP/ACA2018; MEP/ACA2021; MEP/ACA2021
|
erstellt am: 10. Jan. 2017 16:04 <-- editieren / zitieren --> Unities abgeben:
Hallo cadffm, danke für deinen Beitrag. Befehl: (/ 1 0) gibt bei mir Aufrufen von (command) aus *Fehler* nicht möglich, ohne vorheriges Aufrufen von (*push-error-using-command*). Konvertieren von (command)-Aufrufen in (command-s) wird empfohlen. zurück. Also scheint etwas mit der *error*-Funktion nicht zu stimmen. Bisher (in AutoCAD 2012) kannte ich in diesem Fall nur die Meldung: ; Fehler: Division durch 0 Wo ist denn diese *error*-Funktion in MEP2015 programmiert? Ich danke euch allen für eure Mühe und Hinweise. ------------------ Danke Stefan Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Moderator 良い精神
Beiträge: 22275 Registriert: 03.06.2002 Alles
|
erstellt am: 10. Jan. 2017 16:14 <-- editieren / zitieren --> Unities abgeben: Nur für cadking
Die Originale ist für dich nicht greifbar, aber man kann diese wie zuvor überschreiben und das nehme ich an, ist bei dir der Fall. Du lässt wohl (automatisch?) irgendwelche Dateien laden in der die *error* Funktion definiert ist, damit überschreibst du die Originale. Wir können aber nicht prüfen welche Scripte.scr und Lisps.lsp/fas/vlax bei dir mitgeladen waren. Jeder der versucht zu helfen kann Fehler machen oder einfach falsch liegen, aber ich würde meinen zu 99% richtig zu liegen. Bisher wurde meine Meinung zumindest von niemandem ergänzt oder korrigiert? ------------------ CAD on demand GmbH - Beratung und Programmierung rund um AutoCAD Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Rembetiko Mitglied CAD-Konstrukteur
Beiträge: 101 Registriert: 06.10.2015
|
erstellt am: 10. Jan. 2017 16:45 <-- editieren / zitieren --> Unities abgeben: Nur für cadking
Ich kann Dir nur empfehlen, diese Meldung Aufrufen von (command) aus *Fehler* nicht möglich, ohne vorheriges Aufrufen von (*push-error-using-command*). Konvertieren von (command)-Aufrufen in (command-s) wird empfohlen. geflissentlich zu ignorieren, da Du keinen Einfluss auf sie haben wirst, da sie irgendwo aus den Untiefen Deiner Zusatzapplikation stammen wird. Autodesk scheint irgendwo zwischen AutoCAD 2012 und AutoCAD 2015 etwas hinsichtlich command-s und command geändert zu haben. Seitdem schlagen sich diverse Anwender von Zusatzapplikationen mit dieser Fehlermeldung herum, welche offenbar von den wenigsten Applikationsherstellern einschl. Autodesk (--->MEP) nicht in älteren Programmcodes revidiert wird. Konkrete Auswirkungen habe ich selbst deshalb noch nicht festgestellt. ------------------ *So spielt das Leben sagte der Clown und malte sich ein Lächeln ins Gesicht* Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Andreas Kraus Mitglied Elektrotechniker
Beiträge: 1455 Registriert: 11.01.2006 WIN 10 ACAD 2022 BricsCAD V23
|
erstellt am: 10. Jan. 2017 18:23 <-- editieren / zitieren --> Unities abgeben: Nur für cadking
Ja, der "Umbau" war bei Version 2015. Hat mich (und andere) auch ganz schön Arbeit gekostet. Aber das sollte auf keinen Fall ignoriert werden, weil ab dem Moment der Fehlermeldung das laufende Lisp ja abgebrochen wird und somit nicht mehr funktioniert. Wenn das so OK ist ... von mir aus, aber eigentlich soll es doch funktionieren, oder Also wenn ich Tage oder sogar Wochen an einer Funktion schreibe oder diese evtl. für sauer verdientes Geld gekauft habe, ignoriere ich das ganz sicher nicht. Muss aber jeder sebst entscheiden. ------------------ Geht nicht, gibts nicht Gruß Andreas http://kraus-cad.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |