| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für PTC CREO |
| |
| Webcast: PTC | Smart Services, ein Webinar am 13.12.2024
|
Autor
|
Thema: LISP Datei am Start ausführen - Warten auf Creo (2364 mal gelesen)
|
constructr Mitglied
Beiträge: 5 Registriert: 13.08.2019 PTC Creo Elements Access 18.1
|
erstellt am: 13. Aug. 2019 08:13 <-- editieren / zitieren --> Unities abgeben:
Hallo zusammen, ich habe folgendes Problem: Ich möchte eine LISP-Datei zum Start von Creo Elements 18.1 Access ausführen. Die LISP funktioniert tadellos, wenn man sie in das Access-Fenster nach Programmstart zieht. Wenn man sie in die sd_3d_access_customize wird sie geladen und auch ausgeführt (Display Befehle werden korrekt wiedergegeben, die Hauptfunktion wird gestartet). Jedoch kommt das Problem in einer Funktion der LISP: Zum Start des Programms soll eine CAD-Datei automatisch geladen werden und mit (sd-inq-curr-part) soll diese referenziert werden. Wenn man das LISP-Programm nach Programmstart manuell einfügt, kein Problem. Wenn man es zu Programmstart aufrufen lässt, wird einfach das Teil nicht geladen (weil wahrscheinlich noch nicht alle Parts von Access fertiggeladen sind?) Hier ein Ausschnitt aus der aufgerufenen Hauptfunktion:
Code:
(sd-call-cmds (UNIVERSAL_LOAD :FILE (namestring model))) (setq cpart (sd-inq-curr-part)) (if cpart (do_something cpart) (display "Wird bei automatischem Start immer angezeigt"))
Dabei geht das Programm immer zum Display, wenn es automatisch ausgeführt wird. Per drag and drop funktioniert es super. Ich habe auch schon via (SLEEP x) versucht zu warten, was irgendwie nur den gesamten Start von Creo verlangsamt hat. Gibt es bekannte Ansatzpunkte um abzuwarten, bis das gesamte Programm geladen ist um danach erst zu starten? Im Handbuch steht noch, dass man etwas in Anführungszeichen ausführen sollte, aber dann wird das Modul ja nicht mehr geladen?! [Diese Nachricht wurde von constructr am 13. Aug. 2019 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
der_Wolfgang Moderator Tastenhauer
Beiträge: 2219 Registriert: 3.20. ● PE20+60+80@home ● W10 Pro Build19045.4780 ● Drafting V17~V20.7 ● Modeling V17~V20.7 ● Windchill 12.1.2.6 ● UWGM Client 13.0.0.1
|
erstellt am: 13. Aug. 2019 20:37 <-- editieren / zitieren --> Unities abgeben: Nur für constructr
Zitat: Original erstellt von constructr: ... Jedoch kommt das Problem in einer Funktion der LISP: .... zu Programmstart aufrufen lässt, wird einfach das Teil nicht geladen.Hier ein Ausschnitt aus der aufgerufenen Hauptfunktion:
Code: (sd-call-cmds (UNIVERSAL_LOAD :FILE (namestring model))) (setq cpart (sd-inq-curr-part)) (when cpart (do_something cpart) (display "Wird bei automatischem Start immer angezeigt"))
Dabei geht das Programm immer zum Display, wenn es automatisch ausgeführt wird. Per drag and drop funktioniert es super.
Also ich bin jetzt auch confused. Was heisst denn "geht zum display"? Bei Modeling wird (standard mäßig) ein Teil "T1" erzeugt was dann auch current ist. Damit man gleich damit arbeiten kann. 3D Access ist kein Modellierer.. nur ein Gucker. Gibt es da ein "T1" ??
- du schreibst von einem LISP file. und einer Hautpfunktion schickst aber nur 5 Zeilen.
reduziere Deine Lisp Datei auf die 5 Zeilen.. nimm einen hardcodierten Dateinamen.
- mir FEHLT was NICHT funktioniert
- Was wird denn geladen? Ein PKG file? 'universal_load' ist raten+laden
-- für programmatische Aufrufe eher suboptimal -- nimm lieber load_package (oder was anderes DIREKT passendes)
- ein ==>> sd-call-cmds hat mehr als eine option. Du nutzt die Möglichkeiten nicht aus um den Fehler einzugrenzen
siehe mal https://ww3.cad.de/foren/ubb/Forum92/HTML/000941.shtml#000001
Code: :failure (pprint (sd-inq-error-obj :all))
besser ein pprint als display..
- Tracen... TRACEN!!!! tracen! . also (trace UNIVERSAL_LOAD load_package oli:sd-inq-curr-part)
- Das Teil wird nicht geladen? Oder ist es nur nicht 'current'?
- Du schreibst das 'display's ausgeführt werden .. aber das sind nicht die, die du im obigen Lisp Schnipsel hier offen legst.
- welchen WERT hat 'model' -->> (pprint model)
hint: pprint schreibt die Ausgaben in die Console. Starte 3D Access entweder mit -v oder schreibe in dein LISP file ganz oben ein ==>> (oli:sd-show-console-window) rein. -- pprint ist "unverfälschter" als display
------------------ ● Firefox ESR ● Java Forum Stuttgart JUGS ● OSD Hilfeseite (de) / help page (en) ● NotePad++ ● BuFDi ● Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
constructr Mitglied
Beiträge: 5 Registriert: 13.08.2019 PTC Creo Elements Access 18.1
|
erstellt am: 15. Aug. 2019 10:41 <-- editieren / zitieren --> Unities abgeben:
Hallo Wolfgang, vielen Dank für Deine Anmerkungen. Ich werde diese Woche leider nicht mehr dazu kommen, das Programm zu bearbeiten, deshalb nur die Anmerkungen der Verständlichkeit halber: Zitat: Also ich bin jetzt auch confused. Was heisst denn "geht zum display"?
Zitat:
Code: (display "Wird bei automatischem Start immer angezeigt"))
Es wird immer der Teil mit dem display (bei automatischen Start) abgearbeitet, nicht der part (do_something ...) Zitat: mir FEHLT was NICHT funktioniert
Zitat: Dabei geht das Programm immer zum Display, wenn es automatisch ausgeführt wird. Per drag and drop funktioniert es super.
Wie geschrieben. Creo lädt bei automatisch ausgeführtem Skript das Teil nicht! Das funktioniert NICHT! Bei Drag und Drop FUNKTIONIERT es. Das Teil ist auch einfach NICHT da (in Creo). Zitat: Was wird denn geladen? Ein PKG file? 'universal_load' ist raten+laden
Zitat: Zum Start des Programms soll eine CAD-Datei automatisch geladen werden
Die CAD-Datei ist eine .SDEXP Datei. Sie wird auch sauber geladen, WENN das Skript per drag and drop gestartet wird, nur bei automatisiertem Start passiert das nicht! Zitat:
Du schreibst das 'display's ausgeführt werden .. aber das sind nicht die, die du im obigen Lisp Schnipsel hier offen legst.
? Doch, der relevante Display Befehl ist der dargelegte. Ich hatte noch ein, zwei andere eingefügt gehabt, um zu gucken, ob überhaupt irgendwo irgendwas passiert, das ist jedoch irrelevant. [Diese Nachricht wurde von constructr am 15. Aug. 2019 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
clausb Ehrenmitglied V.I.P. h.c.
Beiträge: 2914 Registriert: 20.12.2000 Ich schreibe das hier in meiner Freizeit und spreche weder für meinen Arbeitgeber noch für andere Firmen. Mehr Unsinn von mir unter clausbrod.de.
|
erstellt am: 15. Aug. 2019 10:55 <-- editieren / zitieren --> Unities abgeben: Nur für constructr
Brechen wir das Problem aufs Elementare herunter. Code:
(if cpart (do_something cpart) (display "Wird bei automatischem Start immer angezeigt"))
Die (display)-Anweisung ist der else-Zweig des if-Statements. Wenn die Beobachtung ist, dass die (display)-Anweisung immer ausgeführt wird, bedeutet das also, dass es bei der Ausführung des Skripts kein "current part" gibt, was bedeutet, dass der Rückgabewert von (sd-inq-curr-part) offenbar NIL war. In diesem Fall wird (do_something) natürlich auch nicht ausgeführt. Passt also schon mal gut zusammen. Der Filename, der UNIVERSAL_LOAD übergeben wird, leitet sich direkt aus dem Namen von "model" ab: Code:
(sd-call-cmds (UNIVERSAL_LOAD :FILE (namestring model)))
Welchen Wert hat "model" denn in einem konkreten Testfall? Kleiner Hinweis noch zum Debuggen. Mit dem folgenden Befehl sollte man zusätzliches Logging für UNIVERSAL_LOAD im Konsolenfenster sehen: Code:
(debugaction 2)
------------------ CoCreate Modeling FAQ: http://www.clausbrod.de/CoCreateModeling/ - Blog: http://www.clausbrod.de/Blog
[Diese Nachricht wurde von clausb am 15. Aug. 2019 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
der_Wolfgang Moderator Tastenhauer
Beiträge: 2219 Registriert: 3.20. ● PE20+60+80@home ● W10 Pro Build19045.4780 ● Drafting V17~V20.7 ● Modeling V17~V20.7 ● Windchill 12.1.2.6 ● UWGM Client 13.0.0.1
|
erstellt am: 15. Aug. 2019 18:22 <-- editieren / zitieren --> Unities abgeben: Nur für constructr
Zitat: Original erstellt von clausb: Brechen wir das Problem aufs Elementare herunter.
Lach .. if then else. In meinem jugendlichem( :kicher: ) Leichtsinn hatte ich den code semi-zitiert im Sinne des Erfinders - mein Fehler. Du hast rechts. und ein (trace sd-inq-curr-part) wäre auch eine hilfreiche Ergänzung. und @constructr .. alles was in dem Bereich dann in der console (oli:sd-show-console-window) sichtbar ist hier zur Verfügung stellen. Ich helfe gerne, aber Rätselraten ist nicht mein Hobby. ------------------ ● Firefox ESR ● Java Forum Stuttgart JUGS ● OSD Hilfeseite (de) / help page (en) ● NotePad++ ● BuFDi ● Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
constructr Mitglied
Beiträge: 5 Registriert: 13.08.2019 PTC Creo Elements Access 18.1
|
erstellt am: 19. Aug. 2019 09:25 <-- editieren / zitieren --> Unities abgeben:
Hallo Claus und Wolfgang, vielen Dank für eure Antworten. Ich habe nun das Debugging durchgeführt, leider werde ich nicht schlauer daraus. Ich habe sowohl (debugaction 2) gemacht und das ganze laufen gelassen, als auch mit trace experimentiert. Bei trace gibt es nur "sd-call-cmds is a macro" aus. Des Weiteren geschieht bei :failure (pprint (sd-inq-error-obj :all) im sd-call-cmds Aufruf nichts. Keine Ausgabe. Zitat: Welchen Wert hat "model" denn in einem konkreten Testfall?
Einen Dateipfad zum Modell, z.B.: "D:/Modelle/Teil1.sdexp" Ich habe außerdem eine Lisp angehängt, die ich mit (load "pfad-zur-lisp") in sd_3d_access_customize aufrufe. Wie gesagt, mit der Datei funktioniert das Laden des Modells bei drag and drop, bei direktem Start zeigt er an, dass das Teil nicht geladen wurde(es ist auch nirgends vorhanden). Der trace bei universal-load macht beim automatischen Start nichts, bei drag and drop Ausführung des Skripts kommt die Fehlermeldung, "A trace spec must have odd length, but ( ... ) does not." Vielen Dank für eure Hilfe PS: Kann man die 3 angehängten Dateien sehen? Ich sehe diese beim "Dateien verwalten", im Beitrag wird mir nur die letzte angezeigt [Diese Nachricht wurde von constructr am 19. Aug. 2019 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
clausb Ehrenmitglied V.I.P. h.c.
Beiträge: 2914 Registriert: 20.12.2000 Ich schreibe das hier in meiner Freizeit und spreche weder für meinen Arbeitgeber noch für andere Firmen. Mehr Unsinn von mir unter clausbrod.de.
|
erstellt am: 20. Aug. 2019 15:12 <-- editieren / zitieren --> Unities abgeben: Nur für constructr
|
constructr Mitglied
Beiträge: 5 Registriert: 13.08.2019 PTC Creo Elements Access 18.1
|
erstellt am: 20. Aug. 2019 16:34 <-- editieren / zitieren --> Unities abgeben:
ok, ich hoffe externes bilderhosting ist i.o., ansonsten bitte entfernen. https://imgur.com/a/RD5bPg5 die lisp:
Code: (in-package :Dbgpackage) (use-package :OLI)(defun tobedebugged () (let ((mdl)(basedir)(filelist)(cpart)) (setq basedir "D:/Konstruktionsteile/*.sdexp") (setq filelist (directory basedir)) (loop for mdl in filelist do (display mdl) ;(sd-call-cmds (UNIVERSAL_LOAD :FILE (namestring mdl))) (sd-call-cmds (UNIVERSAL_LOAD :FILE (namestring mdl) :failure (pprint (sd-inq-error-obj :all)))) (setq cpart (sd-inq-curr-part)) (if cpart (display "Successfully loaded model") (display "No valid part detected!"))))) (tobedebugged)
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
der_Wolfgang Moderator Tastenhauer
Beiträge: 2219 Registriert: 3.20. ● PE20+60+80@home ● W10 Pro Build19045.4780 ● Drafting V17~V20.7 ● Modeling V17~V20.7 ● Windchill 12.1.2.6 ● UWGM Client 13.0.0.1
|
erstellt am: 20. Aug. 2019 20:45 <-- editieren / zitieren --> Unities abgeben: Nur für constructr
Zitat: Original erstellt von constructr: die lisp:
Prima!!!!! Das mit dem Anhang hatte irgendwie nicht funktioniert.. aber nun ist auch gut. wenn du ein sdexp lädts wäre SDEXPLOAD besser, weil direkter. Für ein einzelnes file wäre dann folgendes richtig
Code: SDEXPLOAD :DESCFILE "D:/Konstruktionsteile/P4712.sdexp"
Füge OBEN (nach dem (use-package)) folgendes ein:
Code: (trace universal_load load_package SDEXPLOAD)
Die eigentlich Lade routine würde ich wie folgt ersetzen Code: (sd-call-cmds (SDEXPLOAD :DESCFILE (namestring mdl)) :success (pprint (sd-inq-curr-part)) :failure (pprint (sd-inq-error-obj :all)) ) ;; end sd-call-cmds
Wie du :success und :failure eingebaut hast war von der Idee her richtig. Aber leider war eine Klammer an der falschen Stelle. Hake das als 'Lisp-Erfahrung-machen' ab. Wenn dein XY.sdexp file eine Baugruppe enthält, hast du kein current-part. Aber Du schriebst ja andererseits das gar nichts geladen würde. und nun der code,wie ich ihn probieren würde:
Code: (in-package :Dbgpackage) (use-package :OLI)(sd-show-console-window) (trace universal_load load_package SDEXPLOAD directory) (defun tobedebugged () (let (mdl (basedir "D:/Konstruktionsteile/*.sdexp") cpart) (dolist (mdl (directory basedir)) (display mdl) (pprint mdl) (sd-call-cmds (SDEXPLOAD :DESCFILE (namestring mdl)) :success (pprint (sd-inq-curr-part)) :failure (pprint (sd-inq-error-obj :all)) ) ;; end sd-call-cmds (setq cpart (sd-inq-curr-part)) (if cpart (display (format nil "Successfully loaded model ~S" (sd-inq-obj-pathname cpart))) (display "No current part detected!") ) ))) ; end loop/let/defun (trace tobedebugged) (tobedebugged) ;; call on load of lisp file
Diser Code ist trocken geschrieben und von mir nie ausgeführt worden. Die Ausgabe im KonsoleFenster kannst du als TEXT kopieren. Dafür ist kein ScreenShot als Bild nötig. Das macht es einfacher uns DEIN Ergebnis hier mitzuteilen. ------------------ ● Firefox ESR ● Java Forum Stuttgart JUGS ● OSD Hilfeseite (de) / help page (en) ● NotePad++ ● BuFDi ● Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
der_Wolfgang Moderator Tastenhauer
Beiträge: 2219 Registriert: 3.20. ● PE20+60+80@home ● W10 Pro Build19045.4780 ● Drafting V17~V20.7 ● Modeling V17~V20.7 ● Windchill 12.1.2.6 ● UWGM Client 13.0.0.1
|
erstellt am: 20. Aug. 2019 21:01 <-- editieren / zitieren --> Unities abgeben: Nur für constructr
ein 'guter' trace würde mit Deinem code dann so aus sehen: Code: 1> (tobedebugged) 2> (UNIVERSAL_LOAD :FILE "D:/Konstruktionsteile/P4712.sdexp") 3> (SDEXPLOAD :DESCFILE "D:/Konstruktionsteile/P4712.sdexp") Loading C:/Programme/PTC/Creo Elements/Direct Modeling 20.1/binx64/newdm_interface.dll Full path: C:/Programme/PTC/Creo Elements/Direct Modeling 20.1/binx64/newdm_interface.dll Finished loading C:/Programme/PTC/Creo Elements/Direct Modeling 20.1/binx64/newdm_interface.dll <2 (SDEXPLOAD) <1 (UNIVERSAL_LOAD) <1 (tobedebugged)
Das sind die Ausgaben in der Konsole mit denen man (=Claus, ich und paar andere) was anfangen kann ------------------ ● Firefox ESR ● Java Forum Stuttgart JUGS ● OSD Hilfeseite (de) / help page (en) ● NotePad++ ● BuFDi ● Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
constructr Mitglied
Beiträge: 5 Registriert: 13.08.2019 PTC Creo Elements Access 18.1
|
erstellt am: 26. Aug. 2019 08:21 <-- editieren / zitieren --> Unities abgeben:
Hallo Claus und Wolfgang, vielen Dank für eure Hilfe. ich habe den Code ausprobiert und folgende Meldungen im Konsolenfenster erhalten: Code:
1> (TOBEDEBUGGED) 2> (DIRECTORY "D:/Konstruktionsteile/*.sdexp") <2 (DIRECTORY (#P"D:/Konstruktionsteile/Teil_1.sdexp")) DISPLAY action ENTRY DISPLAY action EXIT#P"D:/Konstruktionsteile/Teil_1.sdexp" ("OLI" "SD-CALL-ACTION-ILLEGAL-CALL" "Unzulässiger Aufruf einer Aktionsroutine." NIL)DISPLAY action ENTRY DISPLAY action EXIT <1 (TOBEDEBUGGED NIL) SET_COLLABORATION_LOG action ENTRY SET_COLLABORATION_LOG action EXIT PRESELECT action ENTRY GET_SELECTION action ENTRY SELECT action ENTRY SELECT action EXIT GET_SELECTION action EXIT SELECT action ENTRY
Wenn man das Lisp per drag and drop ausführt kommt folgender trace: Code: SET_PERS_CONTEXT action ENTRY SET_PERS_CONTEXT action EXIT 1> (UNIVERSAL_LOAD :FILE "D:/debug_test.lsp" ) UNIVERSAL_LOAD action ENTRY Warning: DIRECTORY is being redefined. Warning: DIRECTORY is being redefined.The function TOBEDEBUGGED was traced, but redefined. 2> (TOBEDEBUGGED) 3> (DIRECTORY "D:/Konstruktionsteile/*.sdexp") <3 (DIRECTORY (#P"D:/Konstruktionsteile/Teil_1.sdexp"))#P"D:/Konstruktionsteile/Teil_1.sdexp" 3> (SDEXPLOAD :DESCFILE "D:/Konstruktionsteile/Teil_1.sdexp") SDEXPLOAD action ENTRY DB_AIP_LOAD action ENTRY CD action ENTRY CD action EXIT CD action ENTRY CD action EXIT CD action ENTRY CD action EXIT LOAD_SD action ENTRY LOAD_SD action EXIT CD action ENTRY CD action EXIT DB_AIP_LOAD action EXIT SDEXPLOAD action EXIT <3 (SDEXPLOAD) #S(SEL_ITEM ELAN::PATH (#S(ELAN::NPARCEL DSM::SIMPLE-ENTITY-PTR 119802512) #S(ELAN::NPARCEL DSM::SIMPLE-ENTITY-PTR 120506752)) TYPE 120745216 ELAN::ITEM #S(ELAN::NPART3 DSM::SIMPLE-ENTITY-PTR 120506752))DISPLAY action ENTRY DISPLAY action EXIT <2 (TOBEDEBUGGED NIL) UNIVERSAL_LOAD action EXIT <1 (UNIVERSAL_LOAD) CD action ENTRY CD action EXIT FIT_VP action ENTRY SELECT_VP_SA action ENTRY SELECT_VP_SA action EXIT FIT_VP action EXIT PRESELECT action ENTRY GET_SELECTION action ENTRY SELECT action ENTRY SELECT action EXIT GET_SELECTION action EXIT SELECT action ENTRY DISPLAY action ENTRY DISPLAY action EXIT
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
der_Wolfgang Moderator Tastenhauer
Beiträge: 2219 Registriert: 3.20. ● PE20+60+80@home ● W10 Pro Build19045.4780 ● Drafting V17~V20.7 ● Modeling V17~V20.7 ● Windchill 12.1.2.6 ● UWGM Client 13.0.0.1
|
erstellt am: 26. Aug. 2019 13:48 <-- editieren / zitieren --> Unities abgeben: Nur für constructr
Zitat: Original erstellt von constructr: ich habe den Code ausprobiert und folgende Meldungen im Konsolenfenster erhalten:
Code: ("OLI" "SD-CALL-ACTION-ILLEGAL-CALL" "Unzulässiger Aufruf einer Aktionsroutine." NIL)DISPLAY action ENTRY
HA!!!! ja klar!!! aber: bevor du jetzt was änderst füge mal bitte noch ein (trace load) ein und setzt die (debugaction 0) wieder runter. Dann guckst du noch mal die Ausgabe in der Console an. -- Wegen der Lernkurve ;) ------------------ Drag und Drop ruft UNIVERSAL_LOAD .. der findet eine LSP datei und lädt diese mit einem sd-call-cmds drum rum... deswegen funktioniert es. Wenn Du deinen lisp load in der customize Datei hast, wird nur geladen. Und damit ist keine "action routine" (vereinfacht ein Dialog) aktiv. Aber ein sd-call-cmds Aufruf AUSSERHALB einer Action Routine ist nicht zulässig. Die ⇒⇒ Doku sagt klar: Zitat: This macro can only be used in the context of a user action.
a) Du kannst Deinen code die Situtation abfangen lassen. Dafür gibt es ⇒⇒ sd-call-action-active-p
b) du könntest den "sd-call-cmds" drum rum weglassen. Ich denke b) ist für dich / den Anwendungszweck ausreichend.
--------------- Was WIR aber hier mal wieder sehen, das die exakte Fehlermeldung sehr schnell zur Eingrenzung des Problem oder aber und zur Lösung des selben führt. Deswegen dränge ich immer arg drauf pprint, trace, Konsole Fenster zu nutzen, 1:1 copy'n Paste von jeglichen Meldungen und solche Dinge wirklich mitzuteilen. ------------------ ● Firefox ESR ● Java Forum Stuttgart JUGS ● OSD Hilfeseite (de) / help page (en) ● NotePad++ ● BuFDi ● Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |