| |
 | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Creo |
| |
 | HPE ProLiant Summer Academy 2025 in Linz, eine Veranstaltung am 11.09.2025
|
Autor
|
Thema: Aktion für Teilegruppen in Browser-Popup-Menü einfügen (1561 mal gelesen)
|
holt Mitglied Systembetreuer CAD
  
 Beiträge: 720 Registriert: 07.08.2003 Lenovo ThinkStation P360 Core i7-12700@2.10 GHz, 32GB NVIDIA RTX A2000 12 GB Creo Elements/Direct Modeling 20.5 Creo Elements/Direct Drafting 20.5 Creo Elements/Direct ModelManager 20.5
|
erstellt am: 10. Aug. 2006 14:22 <-- editieren / zitieren --> Unities abgeben:         
Hallo, ich stehe wieder einmal vor einem Lisp Problem: ich möchte bei Rechtsklick auf ein Teilgruppen-Feature im Browser eine Aktion starten (die es in V13 noch gab, in V14 jedoch nicht mehr). 1. Problem: die Aktion soll nur bei Teilegruppen-Features sichtbar sein. Wie muss ich die is-visible-Funktion erweitern/verändern? (defun is-visible (obj name) (if obj (sd-string-match-pattern-p "*:FEATURE*" (BrowserNode-objPath obj)) nil ) ) Mit der Funktion sd-cust-feat-inq-props komme ich da nicht ans Ziel, da BrowserNode-objPath einen String im Format "PFAD" :FEATURE "FEATURE-NAME" liefert, mit dem ich nicht weiterarbeiten kann. 2. Problem: die Aktion soll eine Auswahl (get_selection ?) mit den in der Teilegruppe enthaltenen Teilen/Baugruppen enthalten. (ident Bezug wählen in V14) Da hab ich überhaupt keine Idee, wie das gehen könnte bzw. bekomme ich beim Aufruf von (sd-call-cmds (get_selection :by_feature :FULL_NAME :START_NAME (BrowserNode-objPath obj) :END_NAME)) das selbe Problem wie oben. ------------------ Gruß aus dem Salzkammergut Thomas Hollerweger Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
JC Wasti Mitglied Student

 Beiträge: 52 Registriert: 10.11.2004 ACADR14,Genius14,ACADM6PP alles auf WinXP
|
erstellt am: 13. Dez. 2006 15:58 <-- editieren / zitieren --> Unities abgeben:          Nur für holt
Hallo Zusammen, hat jemand das Problem von Thomas schon gelöst? Zitat: Original erstellt von holt: 1. Problem: die Aktion soll nur bei Teilegruppen-Features sichtbar sein. Wie muss ich die is-visible-Funktion erweitern/verändern? (defun is-visible (obj name) (if obj (sd-string-match-pattern-p "*:FEATURE*" (BrowserNode-objPath obj)) nil ) ) [/B]
Ich habe nämlich so ein ähnliches Problem. Und zwar möchte ich den Parameter ":is-entry-applicable" des Befehls "sd-browser-add-popup-entry" so vorgeben, dass: - beim Rechtsklick auf ein Teil der Eintrag ausgegraut ist und - beim Rechtsklick auf eine Baugruppe die Funktion ausgeführt werden kann. Des Ganze müßte dann ungefähr so aussehen: (defun is-applicable (obj name) (if (eq :assembly (sd-inq-assembly-p obj)) t nil)) Nur ist obj ein BrowserNode und kann mit der Funktion sd-inq-assembly-p nicht verwendet werden. Wie kann ich nun abfragen ob der mit der rechten Maustaste angeklickte Eintrag im Browser eine Baugruppe oder ein Teil ist?
Hat da jemand ne Idee? Gruß JC Wasti
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: 13. Dez. 2006 16:21 <-- editieren / zitieren --> Unities abgeben:          Nur für holt
|
JC Wasti Mitglied Student

 Beiträge: 52 Registriert: 10.11.2004 ACADR14,Genius14,ACADM6PP alles auf WinXP
|
erstellt am: 13. Dez. 2006 16:50 <-- editieren / zitieren --> Unities abgeben:          Nur für holt
Zitat: Original erstellt von clausb: Lass das mit dem "eq :assembly" einfach weg. Mein Codevorschlag (komplett ungetestet):
Code:
(defun is-applicable(obj name) (declare (ignore name)) (sd-inq-assembly-p (sd-pathname-to-obj (BrowserNode-objPname obj))))
DANKE 10U's4u Claus.  Es ist nur noch eine Kleinigkeit falsch : es muß BrowserNode-objPath heißen! Das sieht dann so aus:
(defun is-applicable (obj name) (declare (ignore name)) (if (sd-inq-assembly-p (sd-pathname-to-obj (BrowserNode-objPath obj))) t nil) )
Jetzt würde mich nur noch interessieren wie ich ein DialogMenü (mit sd-defdialog erstellt) über den Parameter ":menu-action" aufrufen kann? Hast du (Claus) oder jemand anderes ne Idee? Gruß JC Wasti Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
holt Mitglied Systembetreuer CAD
  
 Beiträge: 720 Registriert: 07.08.2003 Lenovo ThinkStation P360 Core i7-12700@2.10 GHz, 32GB NVIDIA RTX A2000 12 GB Creo Elements/Direct Modeling 20.5 Creo Elements/Direct Drafting 20.5 Creo Elements/Direct ModelManager 20.5
|
erstellt am: 14. Dez. 2006 06:24 <-- editieren / zitieren --> Unities abgeben:         
Hallo, zur Information: Mit Hilfe des Supports habe ich das Problem damals lösen können: 1. Problem: (defun is-visible (obj name) (if obj (progn (setf is-feat (sd-string-match-pattern-p "*:FEATURE*" (BrowserNode-objPath obj))) (if is-feat (progn (setf ft-full-path (sd-string-replace (BrowserNode-objPath obj) " :FEATURE " "/")) (setf ft-full-path (sd-string-replace ft-full-path "\"" "")) (setf is-part-group (sd-string= "COCREATE_PART_GROUP_FEAT" (second (sd-cust-feat-inq-props ; FRAME2::getres muss ausserhalb von Dialogen statt sd-call-cmds eingesetzt werden (first (FRAME2::getres (get_selection :focus_type *sd-feature-seltype* :select ft-full-path))) roperties :dialog );sd-cust-feat-inq-props );second );sd-string= );setf (if is-part-group t nil );if is-part-group );progn then nil ;else );if is-feat );progn then nil ;else );if obj ) 2. Problem: (defun menu-action (obj name) (sd-put-buffer (format nil ":by_feature :FULL_NAME :START_NAME ~a :END_NAME" (BrowserNode-objPath obj))) )
------------------ Gruß aus dem Salzkammergut Thomas Hollerweger 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: 14. Dez. 2006 07:43 <-- editieren / zitieren --> Unities abgeben:          Nur für holt
Das folgende Muster faellt mir in Lisp-Code, der hier im Forum diskutiert wird, sehr oft auf: Code:
(if some-condition (progn (bla) (fasel) ) ;; else nil )
Tipp: Das kann man in Lisp gleichwertig, kuerzer und viel eleganter so schreiben: Code:
(when some-condition (bla) (fasel))
Wenn man diesen Tipp beherzigt und ausserdem noch die globalen Variablen aus dem Codebeispiel unter Punkt (1) entfernt, bekommt man die folgende, deutlich kuerzere Variante (die dann auch nicht mehr aussieht wie Visual Basic mit Klammern ) (defun is-visible (obj name) (when (and obj (sd-string-match-pattern-p "*:FEATURE*" (BrowserNode-objPath obj))) (let ((full-path (sd-string-replace (BrowserNode-objPath obj) " :FEATURE " "/"))) (setf full-path (sd-string-replace full-path "\"" "")) (sd-string= "COCREATE_PART_GROUP_FEAT" (second (sd-cust-feat-inq-props (first (FRAME2::getres (get_selection :focus_type *sd-feature-seltype* :select full-path))) : properties :dialog);;sd-cust-feat-inq-props ));;sd-string= );;let );;when ) ------------------ CoCreate OneSpace Modeling FAQ: http://www.clausbrod.de/OneSpaceModeling/
[Diese Nachricht wurde von clausb am 14. Dez. 2006 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
holt Mitglied Systembetreuer CAD
  
 Beiträge: 720 Registriert: 07.08.2003 Lenovo ThinkStation P360 Core i7-12700@2.10 GHz, 32GB NVIDIA RTX A2000 12 GB Creo Elements/Direct Modeling 20.5 Creo Elements/Direct Drafting 20.5 Creo Elements/Direct ModelManager 20.5
|
erstellt am: 14. Dez. 2006 07:53 <-- editieren / zitieren --> Unities abgeben:         
Hallo Claus, da sieht man halt den Unterschied zwischen Profi und Amateur! Was mir aber schon oft aufgefallen ist: Manche Programmierer setzen beim let die Klammer gleich nach den lokalen Variablen, andere wiederum setzen die Klammer über einen ganzen Codebereich bzw. die gesamte Funktion. Macht das einen wesentlichen Unterschied oder ist das nur Geschmackssache? ------------------ Gruß aus dem Salzkammergut Thomas Hollerweger 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: 14. Dez. 2006 08:10 <-- editieren / zitieren --> Unities abgeben:          Nur für holt
|
holt Mitglied Systembetreuer CAD
  
 Beiträge: 720 Registriert: 07.08.2003 Lenovo ThinkStation P360 Core i7-12700@2.10 GHz, 32GB NVIDIA RTX A2000 12 GB Creo Elements/Direct Modeling 20.5 Creo Elements/Direct Drafting 20.5 Creo Elements/Direct ModelManager 20.5
|
erstellt am: 14. Dez. 2006 08:18 <-- editieren / zitieren --> Unities abgeben:         
Ich meine folgendes: let über Codebereich: (let ((full-path (sd-string-replace (BrowserNode-objPath obj) " :FEATURE " "/"))) (setf full-path (sd-string-replace full-path "\"" "")) (sd-string= "COCREATE_PART_GROUP_FEAT" (second (sd-cust-feat-inq-props (first (FRAME2::getres (get_selection :focus_type *sd-feature-seltype* :select full-path))) roperties :dialog);;sd-cust-feat-inq-props ));;sd-string= );;let let nur über lokale Variable: (let (full-path (sd-string-replace (BrowserNode-objPath obj) " :FEATURE " "/")));;let (setf full-path (sd-string-replace full-path "\"" "")) ... Rest vom Code
------------------ Gruß aus dem Salzkammergut Thomas Hollerweger 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: 14. Dez. 2006 08:36 <-- editieren / zitieren --> Unities abgeben:          Nur für holt
In diesem Fall sind die Klammern keine Stilfrage, sondern entscheidend dafuer, wie sich der Code verhaelt: Code:
(let ((foobla 42))) (print foobla) ;; Lisp-Fehler!
"foobla" ist nur innerhalb des let-Blocks definiert. Benutzt man es ausserhalb, ist es nicht definiert, es sei denn, es gibt eine Variable gleichen Namens in einem umschliessenden Block oder als globale Variable. Also: Lisp-Fehler zur Laufzeit. Meistens will man also eher dieses: Code:
(let ((foobla 42)) (print foobla)) ;; gibt 42 aus
Claus ------------------ CoCreate OneSpace Modeling FAQ: http://www.clausbrod.de/OneSpaceModeling/
[Diese Nachricht wurde von clausb am 14. Dez. 2006 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
holt Mitglied Systembetreuer CAD
  
 Beiträge: 720 Registriert: 07.08.2003 Lenovo ThinkStation P360 Core i7-12700@2.10 GHz, 32GB NVIDIA RTX A2000 12 GB Creo Elements/Direct Modeling 20.5 Creo Elements/Direct Drafting 20.5 Creo Elements/Direct ModelManager 20.5
|
erstellt am: 14. Dez. 2006 08:57 <-- editieren / zitieren --> Unities abgeben:         
Zitat: Original erstellt von clausb: (let ((foobla 42))) (print foobla) ;; Lisp-Fehler!
Warum funktioniert das dann in local-functions von Dialogen? ------------------ Gruß aus dem Salzkammergut Thomas Hollerweger 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: 14. Dez. 2006 09:14 <-- editieren / zitieren --> Unities abgeben:          Nur für holt
|
holt Mitglied Systembetreuer CAD
  
 Beiträge: 720 Registriert: 07.08.2003 Lenovo ThinkStation P360 Core i7-12700@2.10 GHz, 32GB NVIDIA RTX A2000 12 GB Creo Elements/Direct Modeling 20.5 Creo Elements/Direct Drafting 20.5 Creo Elements/Direct ModelManager 20.5
|
erstellt am: 14. Dez. 2006 10:14 <-- editieren / zitieren --> Unities abgeben:         
|
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: 14. Dez. 2006 10:36 <-- editieren / zitieren --> Unities abgeben:          Nur für holt
Danke fuer das Beispiel. Code:
:local-functions '( (testfun () (let (testvar)) (setf testvar 42) (display testvar) ) );local-functions
Auch hier gilt das, was ich schon gesagt habe. Du bekommst nur deswegen keinen Lisp-Fehler, weil (setf) eine neue globale (!) Variable namens "testvar" anlegt, wenn es kein gleichnamiges lokales Symbol findet. Zur Verifikation probiere mal folgende Variante:
Code:
:local-functions '( (testfun () (let (my-testvar 42)) (display my-testvar) ) );local-functions
Claus
------------------ CoCreate OneSpace Modeling FAQ: http://www.clausbrod.de/OneSpaceModeling/ Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
JC Wasti Mitglied Student

 Beiträge: 52 Registriert: 10.11.2004 ACADR14,Genius14,ACADM6PP alles auf WinXP
|
erstellt am: 14. Dez. 2006 10:37 <-- editieren / zitieren --> Unities abgeben:          Nur für holt
Zitat: Original erstellt von holt: Hallo Claus,anbei ein primitiver Dialog
Hallo Zusammen, wie kann ich denn jetzt diesen primitiven Dialog über einen Rechts-Klick im Bowser mit Hilfe des Parameters ":menu-action"( des Befehls "sd-browser-add-popup-entry") aufrufen? Kann mir da jemand weiterhelfen? Gruß JC Wasti Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
holt Mitglied Systembetreuer CAD
  
 Beiträge: 720 Registriert: 07.08.2003 Lenovo ThinkStation P360 Core i7-12700@2.10 GHz, 32GB NVIDIA RTX A2000 12 GB Creo Elements/Direct Modeling 20.5 Creo Elements/Direct Drafting 20.5 Creo Elements/Direct ModelManager 20.5
|
erstellt am: 14. Dez. 2006 11:25 <-- editieren / zitieren --> Unities abgeben:         
@Claus: Jetzt ist mir das auch klar! Da hab ich wohl oft lokale Variable "doppelt" (1x umsonst) deklariert. @Wasti: nur zum Aufrufen des Dialogs:
Code:
:menu-action '(sd-put-buffer "testdialog")
Wenn du auch das angeklickte Objekt übergeben willst (was eigentlich Sinn der Sache ist), muss eine Variable des Dialogs angesprochen werden:
Code:
:menu-action '(sd-put-buffer (format nil "testdialog :namedervariablen ~S" (BrowserNode-objPath obj)))
ungetestet!Tut mir leid, wir haben dich einfach ignoriert! ------------------ Gruß aus dem Salzkammergut Thomas Hollerweger Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
JC Wasti Mitglied Student

 Beiträge: 52 Registriert: 10.11.2004 ACADR14,Genius14,ACADM6PP alles auf WinXP
|
erstellt am: 14. Dez. 2006 11:41 <-- editieren / zitieren --> Unities abgeben:          Nur für holt
|