| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Creo |
Autor
|
Thema: Menu rechte Maustaste anpassen (3643 mal gelesen)
|
StephanWörz Mitglied Maschinenbautechniker
Beiträge: 770 Registriert: 11.10.2000 CEDM V20 SolidPower V20 ModelSearch KeyShot 7 CadDoctor V4.2 SWX 2008 PHOENIX V10
|
erstellt am: 08. Okt. 2008 08:47 <-- editieren / zitieren --> Unities abgeben:
Guten morgen! Wie kann ich denn das Menu welches sich hinter der rechten Maustaste verbirgt anpassen? Es geht um die Einträge die verfügbar sind wenn in der Strukturliste was gewählt ist. Die Anpassung für Teilevorauswahl u.ä. im Grafikfenster ist mir klar. Gruß Stephan Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
3D-Papst Moderator
Beiträge: 3239 Registriert: 11.06.2001 Herr, stärke mich in Geduld, aber ZACK ZACK!!
|
erstellt am: 08. Okt. 2008 08:50 <-- editieren / zitieren --> Unities abgeben: Nur für StephanWörz
|
StephanWörz Mitglied Maschinenbautechniker
Beiträge: 770 Registriert: 11.10.2000 CEDM V20 SolidPower V20 ModelSearch KeyShot 7 CadDoctor V4.2 SWX 2008 PHOENIX V10
|
erstellt am: 08. Okt. 2008 08:56 <-- editieren / zitieren --> Unities abgeben:
|
der_Wolfgang Ehrenmitglied V.I.P. h.c. Tastenhauer
Beiträge: 2017 Registriert: 3.20. ● PE6+8@home ● W10 Pro Build19044.2364 ● Drafting V20.1+4 ● Modeling V20.1+4
|
erstellt am: 08. Okt. 2008 19:12 <-- editieren / zitieren --> Unities abgeben: Nur für StephanWörz
|
StephanWörz Mitglied Maschinenbautechniker
Beiträge: 770 Registriert: 11.10.2000 CEDM V20 SolidPower V20 ModelSearch KeyShot 7 CadDoctor V4.2 SWX 2008 PHOENIX V10
|
erstellt am: 09. Okt. 2008 16:34 <-- editieren / zitieren --> Unities abgeben:
Hallo Wolfgang, herzlichen Dank! Dein Beitrag hat mich zum Ziel gebracht! ... was in der Doku soll alles drinsteht Eigentlich hatte ich gehofft es gibt hier eine bequemere Lösung (Anpassen...). Ich hab das ganz jetzt so gelöst: Code: (sd-browser-add-popup-entry "parcel-gbrowser" :entry-type :Push :label "direkt speichern" :is-entry-visible 'IsVisible_SaveDirect :is-entry-applicable 'AIsApplicable_SaveDirect :menu-action 'MenuAction_SaveDirect :new-group t );;sd-browser-add-popup-entry ;; ------------------------------------------------------------------ (defun MenuAction_SaveDirect (obj name) (sd-put-buffer (format nil "px-resave-model-dlg :selection ~S complete"(BrowserNode-objPath obj))) );;MenuAction_SaveDirect ;; ------------------------------------------------------------------ (defun IsVisible_SaveDirect (obj name) (if obj ;;let* ... node muss zuerst gebunden werden (sequentielles binden der vars) (let* ( (node (BrowserNode-objPath obj)) (path (sd-pathname-to-obj node))) (if (and node path) ;; when node and part is not nil ;;when obj is a part or a assembly >> show menu item (or (sd-inq-assembly-p path) (sd-inq-part-p path)) nil );;if );;let nil );;if );;IsVisible_SaveDirect ;; --------------------------------------------------------------------- (defun AIsApplicable_SaveDirect(obj name) ;; when obj is NOT read-only then make it applicable (not (sd-inq-obj-contents-read-only-p(sd-pathname-to-obj(BrowserNode-objPath obj)))) );;AIsApplicable_SaveDirect
Also danke nochmals!
Stephan Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
der_Wolfgang Ehrenmitglied V.I.P. h.c. Tastenhauer
Beiträge: 2017 Registriert: 3.20. ● PE6+8@home ● W10 Pro Build19044.2364 ● Drafting V20.1+4 ● Modeling V20.1+4
|
erstellt am: 09. Okt. 2008 20:30 <-- editieren / zitieren --> Unities abgeben: Nur für StephanWörz
Zitat: Original erstellt von StephanWörz: Hallo Wolfgang, herzlichen Dank! Dein Beitrag hat mich zum Ziel gebracht!... was in der Doku soll alles drinsteht
gewusste wo.. Ich finde die docu schon ganz gut, aber man muss sich wirklich auskennen und wissen *was* man sucht. Sonsts ist's schwierig. Zitat: Ich hab das ganz jetzt so gelöst:..... Also danke nochmals!
Bitte, bitte, gern geschehen. Zitat: (sd-put-buffer (format nil "px-resave-model-dlg :selection ~S complete"(BrowserNode-objPath obj)))
warum sd-put-buffer? Du rufst es doch komplett auf, willst also gar nicht innerhalb px-resave-model-dlg interactive werden. Also: Zitat: (px-resave-model-dlg :selection (BrowserNode-objPath obj))
Falls Du diese Zeile allerdings auch mal in einem recorderfile sehen möchtest wäre Deine variante dann drin, die 2. jedoch nicht. -- nur so als zusätlicher input. ------------------ ● Seamonkey Firefox Thunderbird Seamonkey auf deutsch ● OSD Hilfeseite (de) / help page (en) ● NotePad++ ● Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
der_Wolfgang Ehrenmitglied V.I.P. h.c. Tastenhauer
Beiträge: 2017 Registriert: 3.20. ● PE6+8@home ● W10 Pro Build19044.2364 ● Drafting V20.1+4 ● Modeling V20.1+4
|
erstellt am: 09. Okt. 2008 20:55 <-- editieren / zitieren --> Unities abgeben: Nur für StephanWörz
|
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: 09. Okt. 2008 21:13 <-- editieren / zitieren --> Unities abgeben: Nur für StephanWörz
Zitat: Original erstellt von der_Wolfgang: Empfehlung -> zieh' den sd-browser-add-popup-entry Aufruf unter die defuns. ;) Das ist die sicherererere Seite.
Ist sie wohl in der Praxis. Man beachte aber, dass das nicht eine Anforderung der Sprache ist, sondern nur des jeweiligen APIs, das man verwendet. Daher ist die Konstruktion von Stephan in vielen Szenarien durchaus akzeptabel und funktioniert. Beispiel zum Experimentieren:
Code:
(let (callback) (defun set-callback(c) (setf callback c)) (defun trigger-callback() (funcall callback))) (set-callback 'foobar) (defun foobar(&rest r) (format t "foobar ~A~%" r)) (trigger-callback) ;; OK (set-callback 'gazonk) (trigger-callback) ;; Fehler (defun gazonk(&rest r) (format t "gazonk ~A~%" r))
------------------ CoCreate Modeling FAQ: http://www.clausbrod.de/CoCreateModeling/ 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: 09. Okt. 2008 21:18 <-- editieren / zitieren --> Unities abgeben: Nur für StephanWörz
|
highway45 Moderator Bastler mit Diplom
Beiträge: 6331 Registriert: 14.12.2004 SolidDesigner-20.5.1 + PhoenixPDM-11 + Solidworks-2022 + PE8
|
erstellt am: 10. Okt. 2008 14:44 <-- editieren / zitieren --> Unities abgeben: Nur für StephanWörz
Hallo Ich hab auch mal etwas damit herumprobiert. Dies soll einfach nur das Messen-Menü öffnen: Code: (defun menu_action_messen (get_vol_prop)) (sd-browser-add-popup-entry "parcel-gbrowser" :entry-type :Push :label "Messen" :menu-action 'menu_action_messen)
Aber es kommt die Meldung: "LISP-Fehler: MENU_ACTION_MESSEN requires only one argument, but two were supplied." Und das stellt mich vor unlösbare Probleme Habe bis jetzt kein Menü zum Starten gebracht. ------------------ http://osd.cad.de/ 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: 10. Okt. 2008 14:56 <-- editieren / zitieren --> Unities abgeben: Nur für StephanWörz
Die Fehlermeldung sagt bereits alles, was man wissen muss: Der Browser ruft Deine Funktion "menu_action_messen" mit zwei Parametern auf. Deine Funktion erwartet aber nur einen Parameter, und zwar mit Namen "get_vol_prop"... In der Doku zu sd-browser-add-popup-entry ist ein Beispiel für eine "menu-action" angegeben - und diese Funktion hat dort tatsächlich zwei Parameter, nicht nur einen. Zitat: Code:
(defun menu-action (obj name) ;since this menu is only visible when over an object, don't have to check ;if obj is nil. (print (format nil "load file:~A" (BrowserNode-objPath obj))))
------------------ CoCreate Modeling FAQ: http://www.clausbrod.de/CoCreateModeling/
[Diese Nachricht wurde von clausb am 10. Okt. 2008 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
highway45 Moderator Bastler mit Diplom
Beiträge: 6331 Registriert: 14.12.2004 SolidDesigner-20.5.1 + PhoenixPDM-11 + Solidworks-2022 + PE8
|
erstellt am: 10. Okt. 2008 15:19 <-- editieren / zitieren --> Unities abgeben: Nur für StephanWörz
Zitat: ...Der Browser ruft Deine Funktion "menu_action_messen" mit zwei Parametern auf...
Also irgendwie hab ich dem doch gar keine Parameter vorgegeben :Push soll doch nur get_vol_prop aufmachen. Wenn ich (obj name) dazwischen baue, passiert gar nichts mehr, weder Fehler noch Funktion. Naja, irgendwie tickt das Gehirn eh schon im Wochenend-Modus... Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
StephanWörz Mitglied Maschinenbautechniker
Beiträge: 770 Registriert: 11.10.2000 CEDM V20 SolidPower V20 ModelSearch KeyShot 7 CadDoctor V4.2 SWX 2008 PHOENIX V10
|
erstellt am: 10. Okt. 2008 15:20 <-- editieren / zitieren --> Unities abgeben:
Zitat: Original erstellt von highway45: Meldung: "[i]LISP-Fehler: MENU_ACTION_MESSEN requires only one argument, but two were supplied." [/i]
Damit hab ich mich rumgeplagt! Im IK habe ich dann folendes gefunden: Note: Each menu interrogator will be passed two parameters the BrowserNode struct of the object over which the popup menu action occurred, and the Browser Name , respectively. Ich habe das so verstanden dass hier auf jeden Fall 2 Parameter übergeben werden. Diese soltten dann auch von der Funktion erwartet werden (... Funktion mit 2 Parameter definieren, auch wenn man nacher nur einen braucht).
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
highway45 Moderator Bastler mit Diplom
Beiträge: 6331 Registriert: 14.12.2004 SolidDesigner-20.5.1 + PhoenixPDM-11 + Solidworks-2022 + PE8
|
erstellt am: 10. Okt. 2008 15:23 <-- editieren / zitieren --> Unities abgeben: Nur für StephanWörz
|
StephanWörz Mitglied Maschinenbautechniker
Beiträge: 770 Registriert: 11.10.2000 CEDM V20 SolidPower V20 ModelSearch KeyShot 7 CadDoctor V4.2 SWX 2008 PHOENIX V10
|
erstellt am: 10. Okt. 2008 15:24 <-- editieren / zitieren --> Unities abgeben:
Zitat: Also irgendwie hab ich dem doch gar keine Parameter vorgegeben :Push soll doch nur get_vol_prop aufmachen.
Müsste das dann nicht Code: (defun menu_action_messen () (get_vol_prop) )
heissen? Das tut in diesem Fall auch nicht, aber Funktionsdefinition ohne Paremter = Code: (defun IRGENDWAS () IrgendwelcheAnweisungen )
[Diese Nachricht wurde von StephanWörz am 10. Okt. 2008 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
highway45 Moderator Bastler mit Diplom
Beiträge: 6331 Registriert: 14.12.2004 SolidDesigner-20.5.1 + PhoenixPDM-11 + Solidworks-2022 + PE8
|
erstellt am: 10. Okt. 2008 15:40 <-- editieren / zitieren --> Unities abgeben: Nur für StephanWörz
Ganz so einfach ist es nicht, denn dies geht auch nicht: (defun menu_action_messen (uic_new_wp_with_cgeo) (get_vol_prop))oder mit (defun menu_action_messen (get_vol_prop) (get_vol_prop))läßt es sich auch nicht austricksen. Ist jetzt auch nicht wichtig, hatte nur mal etwas herumgespielt. Und hab jetzt 37 Einträge im Menü 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: 10. Okt. 2008 15:59 <-- editieren / zitieren --> Unities abgeben: Nur für StephanWörz
Also Lisp nochmal komplett von vorn - so sieht eine Funktionsdefinition für eine Funktion mit zwei Parametern aus: Code:
(defun funktionsname (parameter1 parameter2) (tu-was-mit-den-parametern parameter1 parameter2))
Und jetzt mit einem Parameter:
Code:
(defun funktionsname (parameter1) (tu-was-mit parameter1))
Und jetzt benennen wir die Funktion um:
Code:
(defun menu_action_messen (parameter1) )
Und jetzt benennen wir den Parameter um:
Code:
(defun menu_action_messen (get_vol_prop) )
Jetzt klar, was Dir da passiert ist? Claus
------------------ CoCreate Modeling FAQ: http://www.clausbrod.de/CoCreateModeling/ 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: 10. Okt. 2008 16:38 <-- editieren / zitieren --> Unities abgeben: Nur für StephanWörz
Zitat: Original erstellt von highway45: Ganz so einfach ist es nicht, denn dies geht auch nicht: [i](defun menu_action_messen (uic_new_wp_with_cgeo) (get_vol_prop)) oder mit (defun menu_action_messen (get_vol_prop) (get_vol_prop)) läßt es sich auch nicht austricksen. [/i]
Du trickst Dich hier nur selber aus. Korrekt wäre einzig: Code:
(defun menu_action_messen (obj name) (deine-gewuenschte-aktion))
------------------ CoCreate Modeling FAQ: http://www.clausbrod.de/CoCreateModeling/ Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
highway45 Moderator Bastler mit Diplom
Beiträge: 6331 Registriert: 14.12.2004 SolidDesigner-20.5.1 + PhoenixPDM-11 + Solidworks-2022 + PE8
|
erstellt am: 10. Okt. 2008 20:19 <-- editieren / zitieren --> Unities abgeben: Nur für StephanWörz
Aber das funktioniert ja nicht ! Zitat: Original erstellt von clausb: Also Lisp nochmal komplett von vorn...
Danke für deine Geduld, aber ich habe noch zu viele Defizite, als daß ich hier überhaupt mitreden könnte. Ich werde mich erst mal ins I-Kit vertiefen, bevor ich hier weiter mache. Die chm-Datei hab ich mir von der Arbeit nach hause kopiert, da kann ich besser stöbern. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
der_Wolfgang Ehrenmitglied V.I.P. h.c. Tastenhauer
Beiträge: 2017 Registriert: 3.20. ● PE6+8@home ● W10 Pro Build19044.2364 ● Drafting V20.1+4 ● Modeling V20.1+4
|
erstellt am: 10. Okt. 2008 21:08 <-- editieren / zitieren --> Unities abgeben: Nur für StephanWörz
|
der_Wolfgang Ehrenmitglied V.I.P. h.c. Tastenhauer
Beiträge: 2017 Registriert: 3.20. ● PE6+8@home ● W10 Pro Build19044.2364 ● Drafting V20.1+4 ● Modeling V20.1+4
|
erstellt am: 10. Okt. 2008 21:23 <-- editieren / zitieren --> Unities abgeben: Nur für StephanWörz
Auch noch meinen mist beisteuernd... Die Aktion die du in :menu-action reinhängst bekommt 2 parameter. PUNKT. Das ist so. PUNKT. Was Du damit anfängst, innerhalb der Funktion ist was anderers. In den Funktionen von Stephan's Implementierung wird auch immer nur 'obj' (also der 1.) verwendet, aber 'name' (der 2. parameter) verworfen/nicht genutzt. Das selbe gilt für Deinen Anwendungsfall. Zusätlich möchtest Du aber noch 'interactive' werden (davon gehe ich mal aus jetzt). Das geht nur dadurch das Du (sozusagen) ein halbes Kommado nur hast, dieses schubst Du deswegen in den input-buffer (bildlich gesprochen: in die EingabeZeile) damit der rest interactive erfolgen kann. Bischen vorgekaut (verdaubar, aber in dieser Form nicht vollständig bekömmlich! ):
Code: (defun menu-action-messen (obj name) ;; name brauchen wir gar nicht ;; das Browser obj nehmen und den OBJ pfad besorgen. (setq objekt-pfad ......... ) ;; damit das mess menu füttern (sd-but-puffer (format nil "get_vol_prop ~S" objekt-pfad)) )
------------------ ● Seamonkey Firefox Thunderbird Seamonkey auf deutsch ● OSD Hilfeseite (de) / help page (en) ● NotePad++ ● 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: 12. Okt. 2008 18:49 <-- editieren / zitieren --> Unities abgeben: Nur für StephanWörz
Zitat: Original erstellt von highway45: Aber das funktioniert ja nicht !
Wie Wolfgang schon schrieb, hattest Du nicht einen, sondern zwei Fehler in Deiner Testfunktion. Ich hatte versucht, Dir über den ersten (fehlerhafte Syntax bei der Funktionsdefinition) hinwegzuhelfen, damit die Sicht auf den zweiten (bei der Anwendung von get_vol_prop) frei wird. Hätte ich freilich auch gleich sagen können, anstatt herumzupädagogisieren 8-) Zitat:
Ich werde mich erst mal ins I-Kit vertiefen, bevor ich hier weiter mache.
Viel wichtiger als alles Buchwissen ist die systematische Fehlersuche. In Deinem Falle hätte es Dir Stunden erspart, wenn Du zunächst einmal eine Version von menu_action_messen geschrieben hättest, in der Du einfach nur mal "hallo" ausgibst. In der fehlerhaften Syntax, die Du versucht hast, hätte das so ausgesehen: Code:
(defun menu_action_messen (print "hallo"))
Dann hätte ich diese Funktion einfach manuell aus der Eingabezeile aufgerufen, also ganz ohne komplizierte Browser-Integration: Code:
(menu_action_messen)
Das produziert die Fehlermeldung "'hallo' is not a symbol" - und hätte Dich schnell auf die Spur geführt, dass hier syntaktisch etwas daneben sein muss, und dass die korrekte Form der Funktion heissen muss. An dieser Stelle hätte das Studium der Browserfunktionen im IKIT die Sache dann endgültig aufgeklärt. Die Möglichkeit, interaktiv und ohne jede Zwischenschritte in Lisp mal schnell wie hier gezeigt herumzuprobieren, ist eine der ganz grossen Stärken der Sprache. Nutzt sie! ------------------ CoCreate Modeling FAQ: http://www.clausbrod.de/CoCreateModeling/ Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
highway45 Moderator Bastler mit Diplom
Beiträge: 6331 Registriert: 14.12.2004 SolidDesigner-20.5.1 + PhoenixPDM-11 + Solidworks-2022 + PE8
|
erstellt am: 12. Okt. 2008 19:00 <-- editieren / zitieren --> Unities abgeben: Nur für StephanWörz
Stunden ? Ich war auf der Arbeit und hab zwischendurch nur etwas gefummelt. is not a symbol kam auch mehrmals, aber wie schon mehrfach erwähnt fehlte mir in diesem Fall die Not, die Lust und die Zeit mich reinzuknien. Strukturiert daranzugehen werde ich aber noch nachholen ! chm entpacken hab ich heute morgen schon mal geschafft Kann man weiterempfehlen ! Und bleibt beim "herumzupädagogisieren", so lernt man am meisten ! Schönen Abend noch ------------------ http://osd.cad.de/ Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |