| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
| |
| PNY WIRD VON NVIDIA ZUM HÄNDLER DES JAHRES GEWÄHLT, eine Pressemitteilung
|
Autor
|
Thema: no function definition: layerstate-getnames (1394 / 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: 18. Nov. 2019 10:25 <-- editieren / zitieren --> Unities abgeben:
Hallo Lispler, ich möchte per Lisp im single document interface (SDI=1) nacheinander mehrere DWG's öffnen und in jeder DWG (setq lstate (layerstate-getnames 'T)) ausführen. Wenn ich das mit der im Anhang hochgeladenen "!OPSAVE1.lsp" ausführe bekomme ich die Fehlermeldung no function definition: layerstate-getnames und die Lisp wird abgebrochen. Wenn ich nach dem Abbruch den Befehl in die Befehlszeile kopiere funktioniert er. Kann mir jemand sagen woran das liegt? Im Anhang befindet sich ein Beispeil mit drei DWG's, die nacheinander abgearbeitet werden sollen, sowie die Lisp und die OPSAVE_DatList.txt, in der die zu bearbeitenden Dateien stehen. Vorgehensweise: Leere Zeichnung öffnen, Zeichnung speichern und dann die Lisp starten.
------------------ Danke Stefan Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADwiesel Moderator CAD4FM UG
Beiträge: 1989 Registriert: 05.09.2000 AutoCAD, Bricscad Wir machen das Mögliche unmöglich
|
erstellt am: 18. Nov. 2019 10:48 <-- editieren / zitieren --> Unities abgeben: Nur für cadking
Wenn du sichergestellt hast, das die Zeichnungen nacheinander geöffnet werden und eine Aktion erfolgen soll, musst du natürlich auch sicherstellen, das die auszuführende Aktion, in der Zeichnung zur Verfügung steht. Wird dein Lisp geladen? Sieh dazu auch die setvar lispinit an Is es eine Unterfunktion, die ausgeführt werden soll? Hast du die Funktion mal als C: definiert? ------------------ Gruß CADwiesel Besucht uns im CHAT
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: 18. Nov. 2019 12:52 <-- editieren / zitieren --> Unities abgeben:
Hallo CADwiesel, hast du dir mal die hochgeladene Lisp angesehen? Wenn ich z.B. die Zeichnung1.dwg ohne die Lisp (also manuell) im SDI=1 öffne und (setq lstate (layerstate-getnames 'T)) in die Befehlszeile eingebe funktioniert es sofort. lispinit steht auf 1 In der Lisp ist es keine Unterfunktion. Kopiere doch einfach mal alle Dateien aus der ZIP in einen Test-Ordner, öffne eine neue Zeichnung, speichere Diese in den Test-Ordner und zieh die List per Drag&Drop in die Zeichnung. Wenn die Fehlermeldung "no function definition: layerstate-getnames" erscheint gibt sofort danach (setq lstate (layerstate-getnames 'T)) ein. Bei mir gibt AutoCAD dann keine Fehlermeldung aus, sondern: Befehl: (setq lstate (layerstate-getnames 'T)) ("xx" "yy" "zz") Da lade ich doch vorher auch nichts, folglich steht doch die auszuführende Aktion, in der Zeichnung zur Verfügung? ------------------ Danke Stefan Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Peter2 Ehrenmitglied V.I.P. h.c.
Beiträge: 3849 Registriert: 15.10.2003
|
erstellt am: 18. Nov. 2019 15:41 <-- editieren / zitieren --> Unities abgeben: Nur für cadking
Zitat: Original erstellt von cadking: Hallo CADwiesel, hast...Wenn die Fehlermeldung "no function definition: layerstate-getnames" erscheint gibt sofort danach (setq lstate (layerstate-getnames 'T)) ein....
Genau zwischen der Fehlermeldung und dem händischen Eingeben scheint etwas zu passieren (nachladen von Funktionen?), dass eben vorher nicht funktioniert hat. ich weiss nicht wie flexibel du sein willst und wie oft und wie deine DWG_DATLIST.TXT erstellt wird, aber ist hier ein Script eine Option für dich? So a la .. dwg_datlist.scr
Code: _open zeichnung1.dwg (load "opsave.lsp") (opsave) _open zeichnung2.dwg (load "opsave.lsp") (opsave) ...
BTW: Ein Rufzeichen im Dateinamen macht mich immer leicht paranoid. Aber wenn's klappt .. ------------------ Für jedes Problem gibt es eine einfache Lösung. Die ist aber meistens falsch. ;-) 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: 18. Nov. 2019 16:16 <-- editieren / zitieren --> Unities abgeben:
Hallo Peter2, die Idee hatte ich auch schon, aber... zunächst mal, die DWG_DATLIST.TXT erstelle ich nur einmal von hand ausserhalb von Autocad. Nun zum aber: wenn ich eine Zeichnung geöffnt habe und dort das Script starte wird die erste Zeichnung geöffnet und die Lisp abgearbeitet (in der Lisp steht am Ende speichern und schliessen). Dann geschieht nichts mehr, sprich die nächste Zeile im Script wird nicht mehr abgearbeitet. Script: _open "Zeichnung1.dwg" (load "get-LAYERSTATE.lsp") _open "Zeichnung2.dwg" (load "get-LAYERSTATE.lsp") _open "Zeichnung3.dwg" (load "get-LAYERSTATE.lsp") Lisp: (defun get-LAYERSTATE ( / lstate) (setq lstate (layerstate-getnames 'T)) (print "Layerstatus in Zeichnung: ")(princ lstate)(terpri) (command "_qsave") (command "_close") ) ;--------------- (get-LAYERSTATE) ------------------ Danke Stefan Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Peter2 Ehrenmitglied V.I.P. h.c.
Beiträge: 3849 Registriert: 15.10.2003
|
erstellt am: 18. Nov. 2019 16:30 <-- editieren / zitieren --> Unities abgeben: Nur für cadking
Ist es so geplant, dass das Lisp nur etwas schreibt und dann speichert? Und das (princ lstate) würde ich mit einem "if" prüfen, damit es bei Zeichnungen ohne Layerstate nicht auf die Nase fällt .. Und auf was steht jetzt "sdi"? ------------------ Wichtig: Vor dem Schütteln gut öffnen! [Diese Nachricht wurde von Peter2 am 18. Nov. 2019 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Moderator 良い精神
Beiträge: 22275 Registriert: 03.06.2002 Alles
|
erstellt am: 18. Nov. 2019 16:35 <-- editieren / zitieren --> Unities abgeben: Nur für cadking
Wenn du im SDI bist dann schließt nicht der User die Datei, ausschließlich AutoCAD mit Beenden der Anwendung oder dem öffnen eines anderen Dokuments. SDI bedeutet SingleDocumentInterface und hat immer genau 1 Dokument offen. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Moderator 良い精神
Beiträge: 22275 Registriert: 03.06.2002 Alles
|
erstellt am: 18. Nov. 2019 16:41 <-- editieren / zitieren --> Unities abgeben: Nur für cadking
Zitat: Original erstellt von Peter2: Und das (princ lstate) würde ich mit einem "if" prüfen
Ich denke das ist in dem geposteten Beispiel nicht nötig, da kein Layerstatus gar der bessere Fall ist und wenn ein oder mehrere Layerstatus vorhanden wäre, es immer crashed. Es gibt in dem Thread/Dateien mehrere "unmögliche" Dinge. Vielleicht sollte man einfach noch einmal in Rihe anfangen und das ganze Schritt für Schritt überdenken. Es sind nur Details, aber es gibt nunmal kein "es funktioniert nur ein bischen nicht" 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: 18. Nov. 2019 19:29 <-- editieren / zitieren --> Unities abgeben:
Es ist doch nur ein Beispiel mit dem ich dahinterkommen will warum im SDI=1 beim Öffnen von Dateien per lisp die Zeile (setq lstate (layerstate-getnames 'T)) no function definition: layerstate-getnames zurück gibt und die Lisp abgebrochen wird aber bei manuell geöffneten Dateien auch im SDI=1 bei der Eingabe von (setq lstate (layerstate-getnames 'T)) kein Abbruch erfolgt. Die Zeile (setq lstate (layerstate-getnames 'T)) ist Bestandteil einer Lisp, die nacheinander 6000 Dateien öffnen soll (aufgelistet in einer Textdatei) und diverse Änderungen vornimmt. Mir fehlt nur noch eine Möglichkeit die Layerstatusse zu bereinigen (löschen) und das geht nur, wenn ich weiß wie die heißen. (setq lstate (layerstate-getnames 'T)) erzeugt eine Liste mit alle Layerstatussen, die ich dann bereinigen könnte.
------------------ 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: 19. Nov. 2019 10:45 <-- editieren / zitieren --> Unities abgeben: Nur für cadking
Zitat: Original erstellt von cadking: Es ist doch nur ein Beispiel
Nein, es ist ein Script/Code den du hier (als grundsätzlich lauffähig) präsentierst, daher wiederhole ich meine Aussage. Höre mit deinen "Beispielen" auf und erstelle Script/Code richtig, dann können wir auch "richtig" darüber reden was schief läuft (was es dann aber nicht mehr macht).
Zitat: Original erstellt von cadffm: Es gibt in dem Thread/Dateien mehrere "unmögliche" Dinge. Vielleicht sollte man einfach noch einmal in R[i]uhe anfangen und das ganze Schritt für Schritt überdenken.Es sind nur Details, aber es gibt nunmal kein "es funktioniert nur ein bischen nicht" [/i]
Dann fliegen auch Dinge wie FILEDIA oder OBJECTISOLATIONMODE raus da diese keine Funktion haben, zumind. keine sinnvoll-logische, das verschafft ebenfalls Überblick. Ein Beispielablauf, orientiert an deiner Lispdatei mit dem angstfreien Namen: Stelle sicher das OPSAVE und get-Layerstate (ohne open/close Anweisungen) geladen ist.
;===== Wenn möglich, SDI=1 dann
Setze Lispinit 0
Foreach <aus Datliste gelesen und gefundene DWG,> {das WHILE ""hier ist das ende"" ist unnötig solange diese Zeile nicht in der DatList.txt steht} Datei öffnen MachWasDuMöchtest (Hauptsache) QSAVE Foreach_ende Datei neu {oder erst SDI=0 und _Close} SDI=0 ;==== Wenn du die Antwort als ungerechtfertigt ansiehst (also ganz am Ende wenn es dann mal läuft), dann Antworte ich darauf bereits jetzt: Die richtige Antwort kam bereits mit der ersten Antwort von CADwiesel: Die Script/Code-Struktur passt nicht zur Lispinit=1 Einstellung.
Einmal auf weissem Blatt Papier anfangen und den ganzen Ablauf 1:1 im Kopf durchgehen und notieren. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |