Ankündigung

Einklappen
Keine Ankündigung bisher.

Logic und Items verknüpfen

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    Logic und Items verknüpfen

    Mittels watch_item kann ich eine Logik triggern, wenn das item verändert wird. Das Item verändere ich hier in dem Beispiel mit on_change. convert_color nimmt nun den Wert des Items und verändert diesen. Nun möchte ich aber, dass das zum einen die Logik nicht ständig aufgerufen wird, wenn ich den konvertierten Wert zurück schreibe und irgendwie ist es ja auch blöd erst einen falschen Wert zu schreiben und dann die Änderung danach vorzunehmen. Gibt es einen eleganteen Weg das zu lössen? Das Ziel ist also einen HSB-Wert aus einem Item per Logik umwandeln zu lassen und diesen dann in ein anderes Item zu schreiben.

    Code:
        Farbtest_HSBtoRGB:
            HSB:
                type: list
                eval: list([sh..H(), sh..S(), sh..B()])
                eval_trigger:
                    - .H
                    - .S
                    - .B
                on_change:
                    - ..RGB = value
                H:
                    type: num
                S:
                    type: num
                B:
                    type: num
            RGB:
                type: list
                convert_color: HSBtoRGB
    Lassen sich evtl. auch Funktionen aus Logiken aufrufen?

    #2
    Zitat von Cannon Beitrag anzeigen
    Lassen sich evtl. auch Funktionen aus Logiken aufrufen?
    Nein, Funktionen die Du in Logiken definierst sind nur lokal innerhalb der Logik bekannt.
    Viele Grüße
    Martin

    There is no cloud. It's only someone else's computer.

    Kommentar


      #3
      Jetzt gehts. Ich schreibe das dann einfach in Unteritems.

      Code:
          Farbtest_HSVtoRGB:
              HSV:
                  type: list
                  convert_color: HSBtoRGB
                  eval: "[sh..H(), sh..S(), sh..B()]"
                  eval_trigger:
                      - .H
                      - .S
                      - .B
                  H:
                      type: num
                      initial_value: 0
                  S:
                      type: num
                      initial_value: 0
                  B:
                      type: num
                      initial_value: 0
                  RGB:
                      type: list
                      eval: "[sh..R(), sh..G(), sh..B()]"
                      eval_trigger:
                          - .R
                          - .G
                          - .B
                      R:
                          type: num
                          initial_value: 0
                      G:
                          type: num
                          initial_value: 0
                      B:
                          type: num
                          initial_value: 0

      Kommentar


        #4
        Zitat von Msinn Beitrag anzeigen
        Nein, Funktionen die Du in Logiken definierst sind nur lokal innerhalb der Logik bekannt.
        Ist sowas mal vorgesehen? Das muss ja nicht Logik heißen, aber so wie es eine Datei für alle structs gibt, wäre eine Datei mit nützlichen Funktionen sinnvoll, ohne gleich ein plugin schreiben zu müssen. Die könnte man dann leicht in ein eval einbinden. Was die Items in diesem Beispiel hier erheblich kürzer machen würde.

        Kommentar


          #5
          Ist bisher nicht vorgesehen. Ich habe das aber mal in's Backlog aufgenommen darauf rum zu denken.
          Viele Grüße
          Martin

          There is no cloud. It's only someone else's computer.

          Kommentar


            #6
            Zitat von Msinn Beitrag anzeigen
            Ich habe das aber mal in's Backlog aufgenommen darauf rum zu denken.
            Danke.

            Kommentar


              #7
              Finde den Vorschlag sehr cool. Ein kleines bisschen wird das ja über sh.tools bzw. die utils lib so angeboten. Die Funktionen sind aber nicht so üppig. Ein erster Schritt könnte durchaus sein, eine rgb2hsv und umgekehrt Berechnung dort zu integrieren - wird ja öfters für versch. Dinge gebraucht. Da tools aber eher deprecated ist, weiß ich nicht, was da der vernünftige Ansatz wäre.

              Kommentar


                #8
                Ich würde so eine Möglichkeit eher für den Endanwender sehen. Die Tools sollten ja weiter bestehen bleiben und man könnte sicherlich auch in den Tools weitere Dinge, die immer wieder gebraucht werden, wie rgb2hsv usw. mit einpflegen.

                Kommentar


                  #9
                  Ach ja, du könntest auch noch was probieren.. Prinzipiell funktionierts - ob das Ergebnis stimmt, musst du anhand deiner Items (0-100 oder 0-255), etc. selbst sehen. Hab auch das Gefühl, dass Hue um 180° falsch ist, aber keine Ahnung
                  Code:
                  tuple(round(i * 100) for i in __import__('colorsys').rgb_to_hsv(sh...RGB.R()/100, sh...RGB.G.dimmen()/100, sh...RGB.B.dimmen()/100))

                  Kommentar


                    #10
                    Zitat von Onkelandy Beitrag anzeigen
                    Ach ja, du könntest auch noch was probieren.. Prinzipiell funktionierts - ob das Ergebnis stimmt, musst du anhand deiner Items (0-100 oder 0-255), etc. selbst sehen. Hab auch das Gefühl, dass Hue um 180° falsch ist, aber keine Ahnung
                    Code:
                    tuple(round(i * 100) for i in __import__('colorsys').rgb_to_hsv(sh...RGB.R()/100, sh...RGB.G.dimmen()/100, sh...RGB.B.dimmen()/100))

                    Was macht das und wo setzte ich das ein? Direkt im eval eines Items? Die Quelle sind aber HSB bzw. HSV-Werte und nicht RGB.

                    Kommentar


                      #11
                      Ja im eval. Es gibt natürlich auch die umgekehrte Funktion, siehe doku von colorsys

                      Kommentar


                        #12
                        Zitat von Onkelandy Beitrag anzeigen
                        natürlich auch die umgekehrte Funktion, siehe doku von colorsys
                        ja die colorsys ist mir klar. Ich weiß nur nicht was das hier macht "tuple(round(i * 100) for i"? Ein Tuple ist doch eigentlich nur eine fixe Liste. Fügt dieses "for i" die Elemente in das tuple ein?

                        Kommentar


                          #13
                          das for i geht einfach durch alle Teile des Ergebnisses und multipliziert sie mit 100, weil die lib imho nur Werte von 0 bis 1 ausspuckt. Aber da kannst ja noch experimentieren. Es ging mir eher drum, dass du mit dem import zumindest module im Eval nutzen kannst.

                          Kommentar


                            #14
                            Zitat von Onkelandy Beitrag anzeigen
                            Es ging mir eher drum, dass du mit dem import zumindest module im Eval nutzen kannst
                            Danke. Dennoch will ich ja verstehen was das macht. :-)

                            Kommentar

                            Lädt...
                            X