| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Creo |
Autor
|
Thema: Markieren gewählter Browserelemente (3265 mal gelesen)
|
StephanWörz Mitglied Maschinenbautechniker
Beiträge: 770 Registriert: 11.10.2000 Xenon 3.2GHz 24GB Ram nVidia Quadro 4000 OSDM 17M050 & 18.1 SWX 2008 PHOENIX V10
|
erstellt am: 03. Mai. 2011 11:02 <-- editieren / zitieren --> Unities abgeben:
Hallo! Ich komme hier nicht alleine weiter. Mein Chef wünscht sich folgende Funktionalität. Rechtsklick auf Element im Browser, dann Befehl "Markieren" wählen (das hab ich schon). Gewähltes Element soll jetzt farbig hinterlegt werden (das hab ich auch) - aber nur dieses (das klappt nicht), die Funktion soll jetzt abgeschlossen sein. Entsprechenden Befehl um die Markierung eines gewählten Objektes wieder aufzuheben (Standardanzeige).
Kann/möchte mir hier jemand weiterhelfen? So stelle ich den Befehl zum markieren im Browser zur Verfügung: Code: (sd-browser-add-popup-entry "parcel-gbrowser" :entry-type :Push :label "Marker ROT" :is-entry-visible 'IsVisible_ShowDirect :menu-action 'MenuAction_MarkRed :new-group t );;sd-browser-add-popup-entry
...und hier die menu-action dazu: Code: (defun MenuAction_MarkRed (node name) (sd-browser-add-interrogator "parcel-gbrowser" :interrogator-type :border-color :interrogator-func 'border-color-red );; );;defun MenuAction_MarkRed(defun border-color-red (node name) "#ff0000" );;defun border-color-red
Im Moment verhält sich das ganze so, dass wenn ein Eintrag markiert wurde alle weiteren "besuchten" Elemente im Browser ebenfalls markiert werden... Das komplette LISP im Anhang wertet viele Attribute aus. Als Beispiel mal eine kleine Baugruppe dazu (V16.00). Gruß 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. ● PE60+80@home ● W10 Pro Build19044.2364 ● Drafting V17~V20.5.1 ● Modeling V17~V20.5.1
|
erstellt am: 03. Mai. 2011 21:37 <-- editieren / zitieren --> Unities abgeben: Nur für StephanWörz
Hallo Stephan, Ok, ich versuchts mal zu reklären was Du zusammen programmiert hast. Zur Erinnerung: Ein browser interrogator liefert für ein Object eine Eigenschaft/ eine Information zurück. Für den browser interrogator "Anzeige Name" sollte so ein interrogator (also eine List function= idealer weise den Teile/Baugruppen/was-auch-immer- NAME zurück lieferen. !!! und zwar für JEDES element das im Browser tree hängt. ------------ Stepan Du hast eine Menu action eingegügt die eine Funktion aufruft. So weit so gut. Diese funktion hängt nun in den Browser eine interrogator definition hinein. ABER: Dieser (Wie jeder andere) interrogator /und damit die dahinterliegende Funktion gilt ja FÜR JEDES object das im Browser dargestellt wird! Der effekt ist: nach dem ersten Klick (ganz egal auf welches Element im Browser) ist diese interrogator definition aktive und liefert brav, fuer jeden Aufruf die Farbe 'ROT' zurück.. und schwubs sind alle eintrage imBrowser ROT. ------------------ ● Seamonkey Firefox Thunderbird ● 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. ● PE60+80@home ● W10 Pro Build19044.2364 ● Drafting V17~V20.5.1 ● Modeling V17~V20.5.1
|
erstellt am: 03. Mai. 2011 22:02 <-- editieren / zitieren --> Unities abgeben: Nur für StephanWörz
Code: (sd-display-warning "Der folgende Beitrag ist fur LISP Anfänger unter 4.3 Jahren Erfahrung nicht geeignet")
Stephan, Du möchstest doch eigentlich Individuell füer X-beliebige Einträge in Deinem Browser eine Einfärung haben. Dann must DU aber auch dieses "welcher Eintrag soll rot werden" selbst verwalten. Ich erweitere mal: Du möchtest für den EIntrag X die Markierungsfarbe Y festlegen; also etwas flexibler als "rot oder default". a) Verwaltung 1) nimm eine Hashtable: der Key ist eine SysID, der value die Farbe 2) schreib einen Dialog, der ein Object (des Browsers) entgegennimmt und dem eine Farbe zuordnet - Das ist dann ein neuer Eintrag in der hashtable (in der OK-action) - Ein "Clear-All-Button" in dem Dialog wäre hilfreich 3) der dialog sollte noch ein [ ] aktive - check box haben zum ein/ausschalten speicher in globale variable, die sagt "markierungsfarbe ist aktiv" 4) diesen Dialog hängst Du als Aktion ins Browser menu
b) Ausführung das Hinzufügen der Interrogator Funktion machst Du direkt beim reinladen vom LISP Die funktion sagt nun nich einfach 'rot' sondern etwa wie folgt: (defun definable-color (obj name) 1) vom Obj den objname besorgen 2) mit dem object name das object (sd-pathname-to-obj) (achtung kann ja auch NIL sein) 3) vom object die sys-id erfragen 3a) contents or 3b) instance sysid je nach geschmack 4) mit der sysid in die Hashmap gucken, die Farbe bestimmen 5) den Farbwert (oder ggf. NIL) zurücklieferen das ganz nur wenn die globale variable sagt "markierungsfarbe ist aktiv" c) session übergreifend (erweiterung) 1) im sd-exit-event fügst Du eine funktion hinzu, die die Hashmap in ein LISP file dumpt (im sd-customize verzeichnis am besten) 2) in der sd_customize LÄDST du diese LISP datei um den Inhalt der Hashmap zu restaurieren ab und an muss man einen cleanup der hashtable machen.. ---> auch nach einem SD -restart und dem laden des Models von gestern wäre Deine Browser Markierungsfarbe wieder da.
---------------------------------------------------------------------- Ufff.. und das um diese Uhrzeit. Gruss Wolfgang
------------------ ● Seamonkey Firefox Thunderbird ● 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. ● PE60+80@home ● W10 Pro Build19044.2364 ● Drafting V17~V20.5.1 ● Modeling V17~V20.5.1
|
erstellt am: 03. Mai. 2011 22:04 <-- editieren / zitieren --> Unities abgeben: Nur für StephanWörz
|
StephanWörz Mitglied Maschinenbautechniker
Beiträge: 770 Registriert: 11.10.2000 Xenon 3.2GHz 24GB Ram nVidia Quadro 4000 OSDM 17M050 & 18.1 SWX 2008 PHOENIX V10
|
erstellt am: 04. Mai. 2011 08:12 <-- editieren / zitieren --> Unities abgeben:
Guten morgen Wolfgang! Herzlichen Dank für die aufgebrachte Mühe und die umfassenden Erklärungen/Hinweise. Zitat: !!! und zwar für JEDES element das im Browser tree hängt.
...zu was gibt man dann eigentlich neben dem Browser auch den node an?? Zitat: (sd-display-warning "Der folgende Beitrag ist fur LISP Anfänger unter 4.3 Jahren Erfahrung nicht geeignet")
...ich glaube hier fehlen mir noch ein paar Tage ;)
Zitat: Trace die funktion mal! Aber nicht erschrecken!!!
...erschreckend was hier abgeht. Da bekomm ich ja ein schlechtes Gewissen Zusammenfassend: PUUUUH
Mal sehen was ich draus machen kann Als Gelegenheits LISPler fang ich halt häufig nicht gerade bei Null aber dennoch immer wieder von vorne an... Das kann etwas dauern - ich halt Euch aber auf dem laufenden. Gruß Stephan
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: 04. Mai. 2011 09:21 <-- editieren / zitieren --> Unities abgeben: Nur für StephanWörz
Zitat: Original erstellt von StephanWörz: ...zu was gibt man dann eigentlich neben dem Browser auch den node an??
Wenn ich das richtig sehe, gibst Du beim Aufruf von sd-browser-add-interrogator nur den Browsernamen an, keinen Node: Code:
(sd-browser-add-interrogator "parcel-gbrowser" :interrogator-type :border-color :interrogator-func 'border-color-red );;
------------------ CoCreate Modeling FAQ: http://www.clausbrod.de/CoCreateModeling/ 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. ● PE60+80@home ● W10 Pro Build19044.2364 ● Drafting V17~V20.5.1 ● Modeling V17~V20.5.1
|
erstellt am: 04. Mai. 2011 19:45 <-- editieren / zitieren --> Unities abgeben: Nur für StephanWörz
Zitat: Original erstellt von StephanWörz: Guten morgen Wolfgang!
Moin moin, Zitat:
Herzlichen Dank für die aufgebrachte Mühe und die umfassenden Erklärungen/Hinweise.
büdde büdde. Zitat: ...ich glaube hier fehlen mir noch ein paar Tage ;)
ach.. Zitat: [QUOTE]Trace die funktion mal! Aber nicht erschrecken!!!
...erschreckend was hier abgeht. Da bekomm ich ja ein schlechtes Gewissen [/quote]Nun weisst Du endlich warum wir beim 'browser-interrogator' immer gleich "Performance" in die Waagschale werden. Man sollte einfach wissen was man hier tut sonst 'schnarchts' ------------------ ● Seamonkey Firefox Thunderbird ● 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. ● PE60+80@home ● W10 Pro Build19044.2364 ● Drafting V17~V20.5.1 ● Modeling V17~V20.5.1
|
erstellt am: 04. Mai. 2011 19:55 <-- editieren / zitieren --> Unities abgeben: Nur für StephanWörz
Zitat: Original erstellt von clausb: Wenn ich das richtig sehe, gibst Du beim Aufruf von sd-browser-add-interrogator nur den Browsernamen an, keinen Node:Code:
(sd-browser-add-interrogator "parcel-gbrowser" :interrogator-type :border-color :interrogator-func 'border-color-red );;
Stephan ging es wohl eher um die Parameter der Funktion border-color-xxx IKIT documentation sagt Zitat: supplied function will be passed two parameters, and must accept both. - The first parameter is the BrowserNode struct of the object for which the interrogator is to operate on.
- The second is the name of the browser calling the interrogator.
In der Regel nutzt man den ersten Parameter und leitet hiervon einiges ab (was man halt so braucht) siehe die ersten Zeilen in der Interrogator funtkion zb. in cvs-print-tree Code: (defun cvs-print-tree (node name) (declare (ignore name)) (let* ((objname (BrowserNode-objPname node)) (path (BrowserNode-objPath node)) (obj (oli:sd-pathname-to-obj path)) ).... usw...
Den zweiten Parameter ignoriert man geflissentlich.. weil man sehr selten EINEN interrogator fuer 2 Browser verwendet.In der genannten Funktion sieht man auch das diese mit jedem type von Obj klarkommen muss das als BrowserNode-Struktur herein gereicht wird. In diesem Beispiel unterscheidet man 3 Faelle: * 'root' macht ne Ueberschrift * wenn man ein Modeling Object in die Hand bekommt, kann man was rausschreiben * ansonsten.. anders [Diese Nachricht wurde von der_Wolfgang am 04. Mai. 2011 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
StephanWörz Mitglied Maschinenbautechniker
Beiträge: 770 Registriert: 11.10.2000 Xenon 3.2GHz 24GB Ram nVidia Quadro 4000 OSDM 17M050 & 18.1 SWX 2008 PHOENIX V10
|
erstellt am: 05. Mai. 2011 13:37 <-- editieren / zitieren --> Unities abgeben:
Hallo! Zitat: Stephan ging es wohl eher um die Parameter der Funktion border-color-xxx
...genau! Ich habe nun mal begonnen mich mit der Sache auseinander zu setzen. Ich habe einen Dialog gebaut: Code: ;********************************************************************************************* ; Dateiname : SD_TEST_3.lsp ; Autor : Stephan Wörz ; Erstellt : 04.05.2011 ; geändert : ;********************************************************************************************* (in-package :Teo) (use-package :OLI)
;(sd-hide-console-window) ;(sd-show-console-window) (setf si::*enter-break-handler* nil) ;;HashTable erzeugen (setq BrowserObjectColorTable (make-hash-table)) (sd-defdialog 'SD_TEST_3 :Dialog-title "BrowserMark" :toolbox-button t :after-initialization (setf HashTableEntryCounter (hash-table-count BrowserObjectColorTable)) :variables '( (BrowserObject :selection *sd-object-seltype* :initial-value nil :modifies nil :title (sd-multi-lang-string "OBJECT" :german "OBJEKT") :multiple-items nil :after-input (progn );;progn );;BrowserObject (BrowserObjectColor :value-type :rgb-color :title (sd-multi-lang-string "Color" :german "Farbe") :initial-value 16711680 );;BrowserObjectColor (ClearAll :toggle-type :wide-toggle :Push-action (progn (clrhash BrowserObjectColorTable) );;progn :title (sd-multi-lang-string "CLEAR ALL" :german "ZURÛCKSETZEN") );;ClearAll ("Optionen") (ShowMark :title (sd-multi-lang-string "show marks" :german "zeige markierte") :toggle-type :wide-toggle :value-type :boolean :initial-value t :after-input (progn );progn );;ShowMark (HashTableEntryCounter :title (sd-multi-lang-string "table entries" :german "Tabellenelemente") :value-type :Display-only );;HashTableEntryCounter );;variables :local-functions '( );;local-functions :Ok-action '(progn (setf BrowserObjectSysID (sd-inq-obj-sysid (sd-pathname-to-obj (sd-inq-obj-pathname BrowserObject)))) (setf (gethash 'BrowserObjectSysID BrowserObjectColorTable) 'red) );;progn :help-action '(sd-display-message HelpText :title "Create Thumbnails - Kurzanleitung" :Push "OK!"
);;sd-display-message ) ;; end defdialog
Eine Frage zu der Hash-Table: Wo bringe ich die unter? erzeuge ich die in der Datei SD_Schiller_Browserviews.lsp oder im Dialog? Das befüllen der Tabelle tut wohl im moment des Ablaufs, bei erneutem Aufruf gibt mmir die Variable HashTableEntryCounter aber nix zurück?? Die Variable ClearAll soll mir die Hash-Table leerputzen, passt das so?? Code: (ClearAll :toggle-type :wide-toggle :Push-action (progn (clrhash BrowserObjectColorTable) );;progn :title (sd-multi-lang-string "CLEAR ALL" :german "ZURÛCKSETZEN") );;ClearAll
Ich baue den Browserbefehl so auf:
Code: (sd-browser-add-popup-entry "parcel-gbrowser" :entry-type :Push :label "Marker" :is-entry-visible 'IsVisible_ShowDirect :menu-action 'MenuAction_MarkObject :new-group t );;sd-browser-add-popup-entry
...und hier die :menu-action: Code: (defun MenuAction_MarkObject (obj name) (declare (ignore name)) (sd-put-buffer (format nil "Teo::Call_SD_Test_3 :selection ~S complete"(BrowserNode-objPath obj))) );;defun
...bekomme ich den Dialog auch anders als mit sd-put-buffer aufgerufen? Zitat: Wolfgang: 3) der dialog sollte noch ein [ ] aktive - check box haben zum ein/ausschalten
Das möchte ich mit der Variable ShowMark realisieren ...da hab ich noch keinen Ansatz / verstanden was gemeint ist!?! Ich habee versucht eine Variable mit defVar zu definieren aber dieser Wert steht mir dann nicht mehr zu Verfügung??? Zitat: Wolfgang: b) Ausführung das Hinzufügen der Interrogator Funktion machst Du direkt beim reinladen vom LISP
...beim laden von welchem LISP (Browserfunktionen oder Dialog)?? An welcher Stelle rufe ich diese Funktion auf?? Und dann ist es doch wieder ein Interrogator. Wirkt der dann (warum?) nur auf das gewählte Objekt? Wie Ihr seht noch jede Menge Fragen... Ich hoffe Ihr unterstützt mich noch mal. gruß Stephan 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: 05. Mai. 2011 17:57 <-- editieren / zitieren --> Unities abgeben: Nur für StephanWörz
Immer langsam mit den jungen Pferden. Wenn ich den Code richtig interpretiere, willst Du in einer Hashtable die Abbildungen von SysID zu gewünschter Farbe speichern, und der Testdialog dient zum Manipulieren dieser Hashtable. Stimmt das so? Wenn ja, ist auch klar, wie die Lebenszeit der Hashtable ist und wo sie initial angelegt werden muss, nämlich ausserhalb des Testdialogs. (Übrigens heisst das NICHT, dass die Hashtable global sein muss oder auch nur sein sollte. Aber dazu vielleicht später.) Ich vermute weiterhin, dass Du den Inhalt der Hashtable dann in der Interrogator-Funktion benutzen willst, um die richtige Farbe pro Eintrag herauszufinden: Code:
(sd-browser-add-interrogator "parcel-gbrowser" :interrogator-type :border-color :interrogator-func 'border-color-fnc)(defun node-to-sysid(node) ;; weiss ich nicht auswendig, Wolfgang hilf :-) ) (let ((default-color "#424242") (defun border-color-fnc (node name) (gethash (node-to-sysid node) BrowserObjectColorTable default-color)))
Diesen Code kannst Du in der gleichen Datei verwenden, in der die Hashtable bekannt ist.
[Diese Nachricht wurde von clausb am 05. Mai. 2011 editiert.] 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. ● PE60+80@home ● W10 Pro Build19044.2364 ● Drafting V17~V20.5.1 ● Modeling V17~V20.5.1
|
erstellt am: 05. Mai. 2011 21:10 <-- editieren / zitieren --> Unities abgeben: Nur für StephanWörz
Zitat: Original erstellt von StephanWörz: Wie Ihr seht noch jede Menge Fragen...Ich hoffe Ihr unterstützt mich noch mal.
nööööööööö :D Heute nur 'ausmkopf' und theoretisch, und entschuldigt mal die größere anzahl an tip fehlern. Ist doch schon wunderbar was Du da zusammen gehämmerst hast. Wenn man erstmal 'nen Plan hat und ein paar knackpunkte ueberwunden.. ***** ÄrklärBär=an ***** Wir fangen mal hinten an.. bei der farbe des eintrags im Browser. 1) Woher weist der Browser in welcher Farbe er den jeweiligen Eintrage anzeigen soll? 2) Er hat ein browser object in der hand und befragt damit eine eingehängte interrogator funktion: gib mir mal die Farbe für dieses Object. Hier hast Du das Object und ich, BrowserName frage Dich, Funktion X. 3) die Interrogator funktion bekommt ein Browser Object. Nun stellen wir uns mal dumm:
Code: (defun get-color-for-browser (node name) ;; Karneval-Version (declare (ignore name)) (declare (ignore node)) ;; !!!! in diesem fall ;;return (format nil "#~6,'0X" (random 16777216)) )
damit gäbe es einen zufälligen Farbwert.Mit diesen 3 schritten würde es im browser schon ziemlich bunt werden! Aber in sich ist dies bereits schlüssig und komplett. 4) Nun wollen wir aber für bestimmte objekte bestimmte Farben anwenden. Deswegen die Hashmap. Also muss sich get-color-for-browser über den Browser-node aus der Hashtable den Farbwert raussuchen. Ok- auch kein echtes Problem.
5) wie kommt der Farbwert für eine sysid nun in die Hashtable? Das geht nicht ohne Hilfe. Dafür haben wir einen dialog. Ganz schnöde, grade runter programmiert. Der muss ja schon fast funktionieren. Ganz dumm hängt dieser (erstmal) in der toolbox. Dort kann er aufgerufen werden, man selektiert ein ~Part und eine Farbe und OK. Damit ist ein neuer eintrag in der Hashtable. 6) Damits komfortaber wird hängen wir den dialog ins context menu des Browser.. weil , dann können wir direkt das selektierte Object (ÜBER)nehmen. Das ist aber ein optionaler punkt.... es geht auch aus der Toolbox. Die hashtable definition lassen wir mal im moment 'global' in deinem Package hängen. Wir haben noch genug andere Problem, bzw. DU ;)
***** ÄrklärBär=aus ***** _______________________________________________________________ nun ein paar dinge, die mir aufgefallen sind:
Code: (setf (gethash 'BrowserObjectSysID BrowserObjectColorTable) 'red)
Warum quotest Du hier? BrowserObjectSysID ist ein String.. und damit der Key fuer die Hashtable. ROT... und da nehmen wir doch lieber die dafür vorgesehene Farbe: BrowserObjectColor; das ist eine farbe und damit gut. Damit's beim Auswerten performanter wirde sollten wir die farbe eine String verwandeln mit 6 hexziffern also "#FF0000" für rot, "00FF00" fuer grün.. (formal nil "#~6,'0X" (sd-color-to-sd ....)))) in etwa
Code: (setf (gethash BrowserObjectSysID BrowserObjectColorTable)(formal nil "#~6,'0X" (sd-color-to-sd BrowserObjectColor)))
Fein.. ob die farbe tatsächlich RGB-triple ist oder ein INT wert im dialog habe ich nicht im Kopf.Der Put-buffer:
Code: (defun MenuAction_MarkObject (obj name) (declare (ignore name)) (sd-put-buffer (format nil "Teo::Call_SD_Test_3 :selection ~S complete"(BrowserNode-objPath obj))) );;defun
a) wann imer Du eine aktion im browser rufen willst: sd-put-buffer , denn dann wird es recorded. b) schlecht is das "complete" in dem ge-put-buffered. Denn das schliest ja deine dialog direkt wieder. b1) ok.... wenn man NUR eine farbe haben will passt das b2) man kann aber auch den dialog interaktive werden lassen, Das object ist schon selktier, man wählt (nur) noch eine farbe aus und OK die dialog variable 'ShowMark' muesste in after-input noch eine 'globale' variable setzen (setq *show-browser-entries-with-defined-color* ShowMark). Die interrogator-funktion wuerde diesen zum globalen on-off abfragen.
eigentlich fehlt nicht mehr viel!!! [Diese Nachricht wurde von der_Wolfgang am 05. Mai. 2011 editiert.] 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. ● PE60+80@home ● W10 Pro Build19044.2364 ● Drafting V17~V20.5.1 ● Modeling V17~V20.5.1
|
erstellt am: 05. Mai. 2011 21:26 <-- editieren / zitieren --> Unities abgeben: Nur für StephanWörz
WO WELCHER CODE -- ud wie ist die Reihenfolge. vorschlag : alles mal in eine Datei.. denn alles hat miteinander verbindung. Du kannt eher aus 'schiller.lsp' heraus noch mal nen (load "BrowserObjectColor.lsp") aufrufen. BrowserObjectColor.lsp:
Code:
;; globale definitionen ;; die hashtable (defvar *show-browser-entries-with-defined-color* T) ;später NIL.. aber zum testen T ....;; fuellen der Hashtable: (sd-def-dialog..) ;; dialog vom browser aufrufen: (defun MenuAction_MarkObject (obj name) .... (sd-browser-add-popup-entry ..... ;;; -->>> hint definiere erst die funktion DANN den popup-entry aufruf ;; lesen der Hashtable (defun border-color-fnc (node name) (unless *show-browser-entries-with-defined-color* (let ((.... ;; get color from HT ))) )) ;; einhaengen !!!! HIER MUSS DIE FUNCTION DEFINIERT SEIN!!! (sd-browser-add-interrogator "parcel-gbrowser" :interrogator-type :border-color :interrogator-func 'border-color-fnc)
;; that's it!
------------------ ● Seamonkey Firefox Thunderbird ● 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. ● PE60+80@home ● W10 Pro Build19044.2364 ● Drafting V17~V20.5.1 ● Modeling V17~V20.5.1
|
erstellt am: 05. Mai. 2011 21:30 <-- editieren / zitieren --> Unities abgeben: Nur für StephanWörz
Zitat: Original erstellt von clausb: Immer langsam mit den jungen Pferden.
Claus, wir sind nicht mehr jung :( Zitat:
Code: (defun node-to-sysid(node)
wolfgang-hilf is unbound Na, wie das geht schrieb ich doch schon oben... siehe "cvs-print-tree" [Diese Nachricht wurde von der_Wolfgang am 05. Mai. 2011 editiert.] 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. ● PE60+80@home ● W10 Pro Build19044.2364 ● Drafting V17~V20.5.1 ● Modeling V17~V20.5.1
|
erstellt am: 05. Mai. 2011 21:38 <-- editieren / zitieren --> Unities abgeben: Nur für StephanWörz
Code: (defun border-color-fnc (node name) (declare (ignore name)) (when *show-browser-entries-with-defined-color* (let* ((obj (oli:sd-pathname-to-obj (BrowserNode-objPath node))) (sysid) ) (when obj (progn (setq sysid (sd-inq-obj-sysid obj)) ;; (when sysid ware paranoija ;-) (gethash sysid BrowserObjectColorTable) ))) ;; in case of nothing found function returns NIL -> browser choose the DEFAULT color ))
nur geschrieben, net getestet.[Diese Nachricht wurde von der_Wolfgang am 05. Mai. 2011 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
StephanWörz Mitglied Maschinenbautechniker
Beiträge: 770 Registriert: 11.10.2000 Xenon 3.2GHz 24GB Ram nVidia Quadro 4000 OSDM 17M050 & 18.1 SWX 2008 PHOENIX V10
|
erstellt am: 06. Mai. 2011 11:03 <-- editieren / zitieren --> Unities abgeben:
und nochmals Danke für die umfassende Hilfe Folgendes habe ich gemacht, ist mir noch nicht klar: Ich habe ALLES in das eine LISP gepackt. Zitat: 6) Damits komfortaber wird hängen wir den dialog ins context menu des Browser.. weil , dann können wir direkt das selektierte Object (ÜBER)nehmen. Das ist aber ein optionaler punkt.... es geht auch aus der Toolbox.
Das bekomme ich nicht gebacken - der node WIRD NICHT übernommen??? Code: (sd-put-buffer (format nil "BrowserMark :selection ~S "(BrowserNode-objPath obj)))
Zitat: b2) man kann aber auch den dialog interaktive werden lassen, Das object ist schon selktier, man wählt (nur) noch eine farbe aus und OK
...wie geht denn das?? Dann passt vermutlich mit der hashtable was nicht! Wenn ich im Dialog eine Farbe wähle, wird diese in die table geschrieben. Die Farbe steht in der border-color-fnc dann aber nicht mehr zur Verfügung?? Zitat: clausb: Wenn ich den Code richtig interpretiere, willst Du in einer Hashtable die Abbildungen von SysID zu gewünschter Farbe speichern, und der Testdialog dient zum Manipulieren dieser Hashtable. Stimmt das so? Wenn ja, ist auch klar, wie die Lebenszeit der Hashtable ist und wo sie initial angelegt werden muss, nämlich ausserhalb des Testdialogs. (Übrigens heisst das NICHT, dass die Hashtable global sein muss oder auch nur sein sollte. Aber dazu vielleicht später.)
...hab ich ausserhalb von "sd-defdialog" ??? Zitat: Fein.. ob die farbe tatsächlich RGB-triple ist oder ein INT wert im dialog habe ich nicht im Kopf.
Zitat: IKit: By default the selection of a color generates an integer.
...schreibe ich so in die Hashtable: Code: (setf (gethash BrowserObjectSysID BrowserObjectColorTable)(format nil "#~6,'0X" BrowserObjectColor))
Verstehen tu ich die Formatanweisung aber nicht Zitat: IKit sagt: Interrogator-type: :border-color Interrogator-func: function which accepts two parameters and returns a "#rrggbb" Color name {STRING}
...passt das zusammen? 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: 06. Mai. 2011 11:21 <-- editieren / zitieren --> Unities abgeben: Nur für StephanWörz
Mir ist nicht ganz klar, ob hinter BrowserObjectSysID letztlich ein String steckt. Wenn ja, musst Du die Hashtable mit einer entsprechenden Vergleichsfunktion anlegen, die auf Strings passt, beispielsweise: Code:
(setq BrowserObjectColorTable (make-hash-table :test 'equal))
Allgemein gesprochen würde ich Dir empfehlen, statt aller losen Enden gleichzeitig erst einmal Teilprobleme anzugehen. Ich habe den Eindruck, Du verwirrst Dich gerade selbst :-)
[Diese Nachricht wurde von clausb am 06. Mai. 2011 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: 06. Mai. 2011 13:08 <-- editieren / zitieren --> Unities abgeben: Nur für StephanWörz
Noch ein Nachtrag. Deine border-color-fnc sieht wohl gerade so aus: Code:
(defun border-color-fnc (node name) (declare (ignore name)) (progn (when *show-browser-entries-with-defined-color* (let* ( (obj (oli:sd-pathname-to-obj (BrowserNode-objPath node))) (BrowserObjectSysID) ) (when obj (progn (setq BrowserObjectSysID (sd-inq-obj-sysid obj)) (gethash BrowserObjectSysID BrowserObjectColorTable) (display (format nil "Farbwert in Hashtable [border-color-fnc] ~40T: ~A~%" (gethash BrowserObjectSysID BrowserObjectColorTable))) );;progn );;when obj );;let* ;; in case of nothing found function returns NIL -> browser choose the DEFAULT color );;when );;progn );;defun border-color-fnc
Vor lauter redundanten progns, lets, Klammern et cetera hast Du vielleicht übersehen, dass die Funktion keinen ordentlichen Rueckgabewert hat - sondern immer das zurückliefert, was (display) zurückgibt (vermutlich immer NIL).
------------------ CoCreate Modeling FAQ: http://www.clausbrod.de/CoCreateModeling/ 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. ● PE60+80@home ● W10 Pro Build19044.2364 ● Drafting V17~V20.5.1 ● Modeling V17~V20.5.1
|
erstellt am: 06. Mai. 2011 20:37 <-- editieren / zitieren --> Unities abgeben: Nur für StephanWörz
Zitat: Original erstellt von clausb: Noch ein Nachtrag. Deine border-color-fnc sieht wohl gerade so aus:
Code:
(defun border-color-fnc (node name) ... );;defun border-color-fnc
Vor lauter redundanten progns, lets, Klammern et cetera hast Du vielleicht übersehen, dass die Funktion keinen ordentlichen Rueckgabewert hat - sondern immer das zurückliefert, was (display) zurückgibt (vermutlich immer NIL).
keinen ordentlichen rückgabe wert MEHR hat.. ja der display ist hier sehr kontraproduktiv. ------------------ ● Seamonkey Firefox Thunderbird ● OSD Hilfeseite (de) / help page (en) ● NotePad++ ● Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
StephanWörz Mitglied Maschinenbautechniker
Beiträge: 770 Registriert: 11.10.2000 Xenon 3.2GHz 24GB Ram nVidia Quadro 4000 OSDM 17M050 & 18.1 SWX 2008 PHOENIX V10
|
erstellt am: 12. Mai. 2011 14:58 <-- editieren / zitieren --> Unities abgeben:
Hallo miteinander! ...das ganze läuft jetzt soweit Ich habe den Dialog jetzt doch weggelassen und setzte die Markierungen ohne Farbauswahlmögichkeit direkt. Es lässt sich nun eine gewählte Markierung wieder wegnehmen. Auch das wegnehmen ALLER Markierungen ist möglich. So hat sich der Boss das vorgestellt. Ein Problem ist jetzt beim testen aber aufgetaucht: Wird eine Baugruppe markiert, welche in Ihrer Struktur Pseudoordner hat, werden diese mitmarkiert Pseudoordner haben doch keine SysID??? Wie kann ich mich davor schützen??? Herzlichen Dank nochmals für die Unterstützung bis hierher!+ 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. ● PE60+80@home ● W10 Pro Build19044.2364 ● Drafting V17~V20.5.1 ● Modeling V17~V20.5.1
|
erstellt am: 12. Mai. 2011 21:42 <-- editieren / zitieren --> Unities abgeben: Nur für StephanWörz
Zitat: Original erstellt von StephanWörz: ...das ganze läuft jetzt soweit Ein Problem ist jetzt beim testen aber aufgetaucht: Wird eine Baugruppe markiert, welche in Ihrer Struktur Pseudoordner hat, werden diese mitmarkiert Herzlichen Dank nochmals für die Unterstützung bis hierher!+
bitte, gerne. .... Code: :is-entry-visible 'IsVisible_ShowDirect ;; -> nur wenn Objekt ein Teil oder eine Baugruppe ist
hmmm.. wie FÄNDE diese funktion heraus ob es ein pseudo Ordner ist.. aber oder, so ganz aus dem kopf.. verstehe ich es nicht. .. Na wenn die keine sysid haben dann darfst Du auch keinen eintrage in der Hashtable machen.. dann kannst Du es zumindest bei der Darstellung vermeiden: also Code: (when BrowserObjectSysID (setf (gethash BrowserObjectSysID BrowserObjectColorTable).. ratata )
ich würde MenuAction_MarkObject_BLUE/YELLOW/RED auf eine funktion mappen die sich um die details kümmert.:
Code: (defun MenuAction_MarkObject_BLUE (obj name) (MenuAction_MarkObject_COLOR obj "#4276F0")) (defun MenuAction_MarkObject_RED (obj name) (MenuAction_MarkObject_COLOR obj "#FF0000")) (defun MenuAction_MarkObject_YELLOW (obj name) (MenuAction_MarkObject_COLOR obj "#FFFF00"))(defun MenuAction_MarkObject_color (obj color) object-sys-id (when .. object-sys-id .... object-sys-id color.. )) )
und wenn du schon HARDCODIERTE farben nimmst.. dann vermeide das format nil an der Stelle (performance!!) ---------------------------------------------------------------- edit-13-mai-2011:Ah.. sorry.. das ist ja die interaktive MARKIER funktion das ist der Hinweis auf performance natuerlich nicht noetig. Performance ist in der Interrogator funktion gefragt. Aber das hast du ja mittlerweile eine speed-version vom Claus (siehe nextes Posting) [Diese Nachricht wurde von der_Wolfgang am 13. Mai. 2011 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: 12. Mai. 2011 23:12 <-- editieren / zitieren --> Unities abgeben: Nur für StephanWörz
Glückwunsch! :-D Kompaktere und leicht schnellere Version von border-color-fnc: Code:
(defun border-color-fnc (node name) (when *show-browser-entries-with-defined-color* (let ((obj (oli:sd-pathname-to-obj (BrowserNode-objPath node)))) (when obj (gethash (sd-inq-obj-sysid obj) BrowserObjectColorTable)))))
Erläuterungen:
- "(declare (ignore name))" bringt nur was, wenn Du Deinen Code durch den Lisp-Compiler jagst.
- (when) impliziert ohnehin ein (progn) - selbst ein (progn) einzufügen, ist also redundant.
- Gute alte Lisp-Regel: "Treat setf (and setq) as if there were a tax on its use" (http://www.cs.gmu.edu/~sean/lisp/LispTutorial.html) - (setq) und (setf) in Lisp-Code sind oft ein Hinweis auf Verbesserungsmöglichkeiten.
[Diese Nachricht wurde von clausb am 13. Mai. 2011 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
StephanWörz Mitglied Maschinenbautechniker
Beiträge: 770 Registriert: 11.10.2000 Xenon 3.2GHz 24GB Ram nVidia Quadro 4000 OSDM 17M050 & 18.1 SWX 2008 PHOENIX V10
|
erstellt am: 16. Mai. 2011 08:09 <-- editieren / zitieren --> Unities abgeben:
Zitat: Kompaktere und leicht schnellere Version von border-color-fnc:Code: -------------------------------------------------------------------------------- (defun border-color-fnc (node name) (when *show-browser-entries-with-defined-color* (let ((obj (oli:sd-pathname-to-obj (BrowserNode-objPath node)))) (when obj (gethash (sd-inq-obj-sysid obj) BrowserObjectColorTable))))) --------------------------------------------------------------------------------
...hab ich direkt so übernommen. Hat auf Anhieb funktioniert :D - Danke! Zitat: Code: -------------------------------------------------------------------------------- :is-entry-visible 'IsVisible_ShowDirect ;; -> nur wenn Objekt ein Teil oder eine Baugruppe ist --------------------------------------------------------------------------------hmmm.. wie FÄNDE diese funktion heraus ob es ein pseudo Ordner ist.. aber oder, so ganz aus dem kopf.. verstehe ich es nicht. .. Na wenn die keine sysid haben dann darfst Du auch keinen eintrage in der Hashtable machen.. dann kannst Du es zumindest bei der Darstellung vermeiden: also Code: -------------------------------------------------------------------------------- (when BrowserObjectSysID (setf (gethash BrowserObjectSysID BrowserObjectColorTable).. ratata ) --------------------------------------------------------------------------------
...da komm ich immer noch nicht mit. Ich hab die Abfrage mal eingebaut. Aber bei der Auswahl eines Pseudoordners ist der Menueintrag ja gar nicht sichtbar?! Wird ein Teil oder eine Bgr. markiert, dann bekommen ALLE Pseudordner UNTER dem gewählten Objekt immer noch die gleiche Markierung Wie kommt die Browserabfrage dazu meine Pseudoordner farbig zu markieren - eine Frechheit ist das In der Hashtable dürfte doch für die Pseudoordner kein Eintrag zu finden sen... Code: ;; Funktion zum auslesen der Hashtable in abhängikeit von *show-browser-entries-with-defined-color* (defun border-color-fnc (node name) (when *show-browser-entries-with-defined-color* (let ((obj (oli:sd-pathname-to-obj (BrowserNode-objPath node)))) (when obj (gethash (sd-inq-obj-sysid obj) BrowserObjectColorTable) );;when );;let );;when );;defun;;*************************************************************************** ;; BROWSERABFRAGE !!! wird permanent ausgeführt!!! * ;;*************************************************************************** (sd-browser-add-interrogator "parcel-gbrowser" :interrogator-type :border-color :interrogator-func 'border-color-fnc );;sd-browser-add-interrogator
Und noch eine Frage: Wenn ich (alle Markierungen lösche) muss ich den Browser einmal zu- und wieder aufklappen damit er aktualisiert wird. Kann ich das im Programm auslösen?? Ich hab da mal getrickst indem ich die Detailansicht aktiviere und gleich wieder deaktiviere - das tut soweit, geht aber bestimmt eleganter... 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. ● PE60+80@home ● W10 Pro Build19044.2364 ● Drafting V17~V20.5.1 ● Modeling V17~V20.5.1
|
erstellt am: 17. Mai. 2011 22:39 <-- editieren / zitieren --> Unities abgeben: Nur für StephanWörz
Zitat: Original erstellt von StephanWörz: Wie kommt die Browserabfrage dazu meine Pseudoordner farbig zu markieren - eine Frechheit ist das In der Hashtable dürfte doch für die Pseudoordner kein Eintrag zu finden sen...
Guck dir mal den objpath an wenn da so ein peudoorder dabei ist. vielleicht wird da 'einfach' ein (erstes) element des Pseudo ordners geliefert? Kontrolliere: 2 assemblles, 2 parts, 1 pseudo order -> wie lang ist die hashtable? wenn 5, dann: wie ist der inhalt? wenn länge = 4: welches obj geht 2 mal rein um die Farbe zurueckzuliefern. Wenn du die assemblies grün und die parts blau färbst: welche farbe hat dann der Pseudoordner? Zitat: wenn ich (alle Markierungen lösche) muss ich den Browser einmal zu- und wieder aufklappen damit er aktualisiert wird. Kann ich das im Programm auslösen??
ich meine der browser hat auch ein refresh event. das muesstes dann wohl mal feuern.. oder aber: (sd-browser-exec-cmd '..' :REFRESH-TREE) -> Force a redraw of the browser tree. This will cause all interrogators to be executed ----- sollte passen ------------------ ● Seamonkey Firefox Thunderbird ● OSD Hilfeseite (de) / help page (en) ● NotePad++ ● Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
StephanWörz Mitglied Maschinenbautechniker
Beiträge: 770 Registriert: 11.10.2000 Xenon 3.2GHz 24GB Ram nVidia Quadro 4000 OSDM 17M050 & 18.1 SWX 2008 PHOENIX V10
|
erstellt am: 18. Mai. 2011 06:49 <-- editieren / zitieren --> Unities abgeben:
Guten morgen! Zitat: Wenn du die assemblies grün und die parts blau färbst: welche farbe hat dann der Pseudoordner?
...der Pseudoordner wird immer in der Farbe des Besitzers der im Pseudordner zusammengefassten Objekte gezeigt! Wenn die "Testbaugruppe" markiert wird, werden die Pseudoordner auch markiert! --> Die Hashtable hat dann 1 Eintrag! Wenn die Pseudoordner deaktiviert werden funktioniert alles tadellos (möchte aber meine Pseudoordner ) [Diese Nachricht wurde von StephanWörz am 18. Mai. 2011 editiert.] 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. ● PE60+80@home ● W10 Pro Build19044.2364 ● Drafting V17~V20.5.1 ● Modeling V17~V20.5.1
|
erstellt am: 19. Mai. 2011 21:40 <-- editieren / zitieren --> Unities abgeben: Nur für StephanWörz
|
holt Mitglied Systembetreuer CAD
Beiträge: 713 Registriert: 07.08.2003 Corei7 3770K, Win7-64, 16GB PNY Quadro 2000K CoCreate Modeling 18.10 CoCreate Drafting 18.10 CoCreate ModelManager 18.10
|
erstellt am: 21. Jun. 2011 15:40 <-- editieren / zitieren --> Unities abgeben: Nur für StephanWörz
Hallo, Zitat: Original erstellt von clausb:
- Gute alte Lisp-Regel: "Treat setf (and setq) as if there were a tax on its use" (http://www.cs.gmu.edu/~sean/lisp/LispTutorial.html) - (setq) und (setf) in Lisp-Code sind oft ein Hinweis auf Verbesserungsmöglichkeiten.
Habe ich das richtig verstanden: Lieber in einem
Code: (let ((var-a (irgendwas)) (var-b (etwasanderes))) ... )
als
Code: (setq var-a (irgendwas)) (setq var-b (etwasanderes))
Oder liege ich falsch mit meiner Interpretation?------------------ Gruß aus dem Salzkammergut Thomas Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |