ソースを参照

extend: FIXTURE-EDITOR open-dialog, cleanup

micha 1 年間 前
コミット
7480afbfa4
3 ファイル変更138 行追加15 行削除
  1. 9 0
      _LibreLightDesk.py
  2. 36 4
      fixtures/JB-Lighting_Sparx7_27ch-3sub.json
  3. 93 11
      tkgui/GUI.py

+ 9 - 0
_LibreLightDesk.py

@@ -1504,6 +1504,9 @@ class Xevent():
 
                 #def _cb(fname):
                 def _cb(data):
+                    if not data:
+                        print("err443",self,"_cb",data)
+                        return None
                     fname = data["Value"]
                     print(self,"save_show._cb()",fname)
                     fpath,fname = base.build_path(fname)
@@ -2139,6 +2142,9 @@ class MASTER():
         label  = PRESETS.label(nr) 
 
         def _cb(data):
+            if not data:
+                print("err443",self,"_cb",data)
+                return None
             print(self,"btn_cfg._cb()",data)
             if data:
 
@@ -2164,6 +2170,9 @@ class MASTER():
     def label(self,nr):
         txt = PRESETS.label(nr) 
         def _cb(data):
+            if not data:
+                print("err443",self,"_cb",data)
+                return None
             txt = data["Value"]
             print(self,"label._cb()",nr,txt)
             if txt:

+ 36 - 4
fixtures/JB-Lighting_Sparx7_27ch-3sub.json

@@ -1,4 +1,36 @@
-50101	50101	{"DMX": 1, "UNIVERS": 1, "NAME": "SPX__50101", "TYPE": "MOVER", "VENDOR": "JB", "ATTRIBUT": {"PAN": {"NR": 1, "MASTER": "0", "MODE": "F", "VALUE": 139.74, "ACTIVE": 0, "FX": "", "FX2": {}}, "PAN-FINE": {"NR": 2, "MASTER": "0", "MODE": "S", "VALUE": 0, "ACTIVE": 0, "FX": "", "FX2": {}}, "TILT": {"NR": 3, "MASTER": "0", "MODE": "S", "VALUE": 119.19, "ACTIVE": 0, "FX": "", "FX2": {}}, "TILT-FINE": {"NR": 4, "MASTER": "0", "MODE": "S", "VALUE": 0, "ACTIVE": 0, "FX": "", "FX2": {}}, "SHUTTER": {"NR": 6, "MASTER": "0", "MODE": "S", "VALUE": 0, "ACTIVE": 0, "FX": "", "FX2": {}}, "DIM": {"NR": 7, "MASTER": "0", "MODE": "F", "VALUE": 256, "ACTIVE": 0, "FX": "", "FX2": {}}, "ZOOM": {"NR": 8, "MASTER": "0", "MODE": "F", "VALUE": 0, "ACTIVE": 0, "FX": "", "FX2": {}}, "GOBO": {"NR": 9, "MASTER": "0", "MODE": "S", "VALUE": 41.1, "ACTIVE": 0, "FX": "", "FX2": {}}, "GOBO2": {"NR": 11, "MASTER": "0", "MODE": "S", "VALUE": 36.99, "ACTIVE": 0, "FX": "", "FX2": {}}, "G-ROT": {"NR": 12, "MASTER": "0", "MODE": "S", "VALUE": 0, "ACTIVE": 0, "FX": "", "FX2": {}}, "PRISMA": {"NR": 14, "MASTER": "0", "MODE": "S", "VALUE": 0, "ACTIVE": 0, "FX": "", "FX2": {}}, "P-ROT": {"NR": 15, "MASTER": "0", "MODE": "S", "VALUE": 0, "ACTIVE": 0, "FX": "", "FX2": {}}}, "ACTIVE": 0}
-50102	50102	{"DMX": 21, "UNIVERS": 1, "NAME": "SPX__50102", "TYPE": "MOVER", "VENDOR": "JB", "ATTRIBUT": {"RED": {"NR": 1, "MASTER": "0", "MODE": "F", "VALUE": 0, "ACTIVE": 0, "FX": "", "FX2": {}}, "GREEN": {"NR": 2, "MASTER": "0", "MODE": "F", "VALUE": 0, "ACTIVE": 0, "FX": "", "FX2": {}}, "BLUE": {"NR": 3, "MASTER": "0", "MODE": "F", "VALUE": 0, "ACTIVE": 0, "FX": "", "FX2": {}}, "WHITE": {"NR": 4, "MASTER": "0", "MODE": "S", "VALUE": 0, "ACTIVE": 0, "FX": "", "FX2": {}}}, "ACTIVE": 0}
-50103	50103	{"DMX": 25, "UNIVERS": 1, "NAME": "SPX__50103", "TYPE": "MOVER", "VENDOR": "JB", "ATTRIBUT": {"RED": {"NR": 1, "MASTER": "0", "MODE": "F", "VALUE": 63, "ACTIVE": 0, "FX": "", "FX2": {}}, "GREEN": {"NR": 2, "MASTER": "0", "MODE": "F", "VALUE": 255, "ACTIVE": 0, "FX": "", "FX2": {}}, "BLUE": {"NR": 3, "MASTER": "0", "MODE": "F", "VALUE": 0, "ACTIVE": 0, "FX": "", "FX2": {}}, "WHITE": {"NR": 4, "MASTER": "0", "MODE": "S", "VALUE": 0, "ACTIVE": 0, "FX": "", "FX2": {}}}, "ACTIVE": 0}
-50104	50104	{"DMX": 29, "UNIVERS": 1, "NAME": "SPX__50104", "TYPE": "MOVER", "VENDOR": "JB", "ATTRIBUT": {"RED": {"NR": 1, "MASTER": "0", "MODE": "F", "VALUE": 255, "ACTIVE": 0, "FX": "", "FX2": {}}, "GREEN": {"NR": 2, "MASTER": "0", "MODE": "F", "VALUE": 0, "ACTIVE": 0, "FX": "", "FX2": {}}, "BLUE": {"NR": 3, "MASTER": "0", "MODE": "F", "VALUE": 0, "ACTIVE": 0, "FX": "", "FX2": {}}, "WHITE": {"NR": 4, "MASTER": "0", "MODE": "S", "VALUE": 0, "ACTIVE": 0, "FX": "", "FX2": {}}}, "ACTIVE": 0}
+50101	50101	{"DMX": 1, "UNIVERS": 1, "NAME": "SPX__50101", "TYPE": "MOVER", "VENDOR": "JB", "ATTRIBUT": {
+"PAN": {"NR": 1, "MASTER": "0", "MODE": "F", "VALUE": 139.74, "ACTIVE": 0, "FX": "", "FX2": {}}
+, "PAN-FINE": {"NR": 2, "MASTER": "0", "MODE": "S", "VALUE": 0, "ACTIVE": 0, "FX": "", "FX2": {}}
+, "TILT": {"NR": 3, "MASTER": "0", "MODE": "S", "VALUE": 119.19, "ACTIVE": 0, "FX": "", "FX2": {}}
+, "TILT-FINE": {"NR": 4, "MASTER": "0", "MODE": "S", "VALUE": 0, "ACTIVE": 0, "FX": "", "FX2": {}}
+, "SHUTTER": {"NR": 6, "MASTER": "0", "MODE": "S", "VALUE": 0, "ACTIVE": 0, "FX": "", "FX2": {}}
+, "DIM": {"NR": 7, "MASTER": "0", "MODE": "F", "VALUE": 256, "ACTIVE": 0, "FX": "", "FX2": {}}
+, "ZOOM": {"NR": 8, "MASTER": "0", "MODE": "F", "VALUE": 0, "ACTIVE": 0, "FX": "", "FX2": {}}
+, "GOBO": {"NR": 9, "MASTER": "0", "MODE": "S", "VALUE": 41.1, "ACTIVE": 0, "FX": "", "FX2": {}}
+, "GOBO2": {"NR": 11, "MASTER": "0", "MODE": "S", "VALUE": 36.99, "ACTIVE": 0, "FX": "", "FX2": {}}
+, "G-ROT": {"NR": 12, "MASTER": "0", "MODE": "S", "VALUE": 0, "ACTIVE": 0, "FX": "", "FX2": {}}
+, "PRISMA": {"NR": 14, "MASTER": "0", "MODE": "S", "VALUE": 0, "ACTIVE": 0, "FX": "", "FX2": {}}
+, "P-ROT": {"NR": 15, "MASTER": "0", "MODE": "S", "VALUE": 0, "ACTIVE": 0, "FX": "", "FX2": {}}
+}, "ACTIVE": 0}
+
+50102	50102	{"DMX": 21, "UNIVERS": 1, "NAME": "SPX__50102", "TYPE": "MOVER", "VENDOR": "JB", "ATTRIBUT": 
+{"RED": {"NR": 1, "MASTER": "0", "MODE": "F", "VALUE": 0, "ACTIVE": 0, "FX": "", "FX2": {}}
+, "GREEN": {"NR": 2, "MASTER": "0", "MODE": "F", "VALUE": 0, "ACTIVE": 0, "FX": "", "FX2": {}}
+, "BLUE": {"NR": 3, "MASTER": "0", "MODE": "F", "VALUE": 0, "ACTIVE": 0, "FX": "", "FX2": {}}
+, "WHITE": {"NR": 4, "MASTER": "0", "MODE": "S", "VALUE": 0, "ACTIVE": 0, "FX": "", "FX2": {}}
+}, "ACTIVE": 0}
+
+50103	50103	{"DMX": 25, "UNIVERS": 1, "NAME": "SPX__50103", "TYPE": "MOVER", "VENDOR": "JB", "ATTRIBUT": 
+{"RED": {"NR": 1, "MASTER": "0", "MODE": "F", "VALUE": 63, "ACTIVE": 0, "FX": "", "FX2": {}}
+, "GREEN": {"NR": 2, "MASTER": "0", "MODE": "F", "VALUE": 255, "ACTIVE": 0, "FX": "", "FX2": {}}
+, "BLUE": {"NR": 3, "MASTER": "0", "MODE": "F", "VALUE": 0, "ACTIVE": 0, "FX": "", "FX2": {}}
+, "WHITE": {"NR": 4, "MASTER": "0", "MODE": "S", "VALUE": 0, "ACTIVE": 0, "FX": "", "FX2": {}}
+}, "ACTIVE": 0}
+
+50104	50104	{"DMX": 29, "UNIVERS": 1, "NAME": "SPX__50104", "TYPE": "MOVER", "VENDOR": "JB", "ATTRIBUT": 
+{"RED": {"NR": 1, "MASTER": "0", "MODE": "F", "VALUE": 255, "ACTIVE": 0, "FX": "", "FX2": {}}
+, "GREEN": {"NR": 2, "MASTER": "0", "MODE": "F", "VALUE": 0, "ACTIVE": 0, "FX": "", "FX2": {}}
+, "BLUE": {"NR": 3, "MASTER": "0", "MODE": "F", "VALUE": 0, "ACTIVE": 0, "FX": "", "FX2": {}}
+, "WHITE": {"NR": 4, "MASTER": "0", "MODE": "S", "VALUE": 0, "ACTIVE": 0, "FX": "", "FX2": {}}
+}, "ACTIVE": 0}
+

+ 93 - 11
tkgui/GUI.py

@@ -30,7 +30,9 @@ class LOAD_FIXTURE():
         if self.master is not None:
             #for i in dir(self.master): #.load_MH2()
             #    print(i)
-            if "SPARX" in self.name:
+            if "SPARX" in self.name.upper():
+                self.master.load_MH2()
+            elif "MH" in self.name.upper():
                 self.master.load_MH2()
             else:
                 self.master.load_DIM()
@@ -402,6 +404,9 @@ class _SET_PATCH():
             val = self.data[k]
         #txt = dialog.askstring("SET","SET: {}={}".format(self.k,self.v),initialvalue=val)
         def _cb(data):
+            if not data:
+                print("err443",self,"_cb",data)
+                return None
             txt = data["Value"]
             print("_SET.attr",txt)
             v = txt
@@ -535,17 +540,31 @@ class GUI_PATCH():
             c+=1
 
             command = _SET_PATCH("NAME",data["NAME"],fix,data)
-            b = tk.Button(xframe,bg="lightblue", text=data["NAME"],width=14,anchor="w",command=command.attr)
+            b = tk.Button(xframe,bg="grey", text=data["NAME"],width=14,anchor="w",command=command.attr)
             command.set_button(b)
             #b.bind("<Button>",Xevent(fix=fix,elem=b).cb)
             b.grid(row=r, column=c, sticky=tk.W+tk.E)
             c+=1
+            LABEL = ""
             if len(data["ATTRIBUT"]) == 1:
-                b = tk.Button(xframe,bg="#ddd", text="DIMMER",width=8,anchor="w")
-            elif "PAN" in data["ATTRIBUT"] or  "TILT" in data["ATTRIBUT"] :
-                b = tk.Button(xframe,bg="#ddd", text="MOVER",width=8,anchor="w")
+                LABEL = "DIMMER"
+            elif  "PAN" in data["ATTRIBUT"] or  "TILT" in data["ATTRIBUT"] :
+                LABEL = "MOVER"
             else:
-                b = tk.Button(xframe,bg="#ddd", text="",width=8,anchor="w")
+                LABEL = {}
+                for a in data["ATTRIBUT"]:
+                    nr = data["ATTRIBUT"][a]["NR"]
+                    if a[0] != "_":
+                        LABEL[nr] = a[0]
+                keys = list(LABEL.keys())
+                keys.sort()
+                L2 =""
+                for k in keys:
+                    L2 += LABEL[k]
+                LABEL = L2
+
+                    
+            b = tk.Button(xframe,bg="#aaa", text=LABEL,width=8,anchor="w")
             #b.bind("<Button>",Xevent(fix=fix,elem=b).cb)
             b.grid(row=r, column=c, sticky=tk.W+tk.E)
             c+=1
@@ -588,11 +607,12 @@ class GUI_PATCH():
                 if k in dmx_collision:
                     if dmx_collision[k]:
                         collision.append(k)
-
-            b = tk.Button(xframe,bg="grey", text="{:3} ({})".format(max_dmx[1] , max_dmx[0]),width=4) #a,anchor="w")
+            # CH's
+            b = tk.Button(xframe,bg="#aaa", text="{:3} ({})".format(max_dmx[1] , max_dmx[0]),width=4) #a,anchor="w")
             b.grid(row=r, column=c, sticky=tk.W+tk.E)
             c+=1
-            #b = tk.Button(xframe,bg="#aaa", text="{:03}-{:03}".format(data["DMX"],len(data["ATTRIBUT"])+(data["DMX"])-1),width=6,anchor="w")
+                
+            # from - to    
             b = tk.Button(xframe,bg="#aaa", text="{:03} - {:03}".format(data["DMX"],max_dmx[1]+(data["DMX"]-1)),width=8,anchor="w")
             b.grid(row=r, column=c, sticky=tk.W+tk.E)
 
@@ -613,7 +633,8 @@ class GUI_PATCH():
                 return xx
 
             #print(fix)
-            b = tk.Button(xframe,bg="#aaa",fg="#225", text="TEST",width=4,anchor="w",command=x(fix))
+            #TEST BTN
+            b = tk.Button(xframe,bg="grey",fg="#000", text="TEST",width=4,anchor="w",command=x(fix))
             myTip = Hovertip(b,'BLINK DIMMER')
             b.grid(row=r, column=c, sticky=tk.W+tk.E)
             #b.command = x
@@ -651,6 +672,14 @@ class GUI_FaderLayout():
 
         self.b = tk.Label(self.frame,bg="#fff",text="Fixture Editor") #,font=font8 )
         self.b.pack(fill=None, side=tk.LEFT)
+
+        self.b = tk.Label(self.frame,bg="#aaa",text="FILE:") #,font=font8 )
+        self.b.pack(fill=None, side=tk.LEFT)
+
+        self.b = tk.Label(self.frame,bg="#fff",text="~/LibreLight/fixtures/lalla.json") #,font=font8 )
+        self.b_path = self.b
+        self.b.pack(fill=None, side=tk.LEFT)
+
         self.frame = tk.Frame(root,bg="black",width=width)
         self.frame.pack(fill=tk.BOTH, side=tk.TOP)
         self.b = tk.Label(self.frame,bg="#ddd",text="NAME:")
@@ -683,9 +712,16 @@ class GUI_FaderLayout():
         self.b = tk.Label(self.frame,bg="#ddd",text="TYPE:")
         self.b.pack(fill=None, side=tk.LEFT)
 
-        self.b = tk.Button(self.frame,bg="lightblue",text="LIST", width=5)#,command=self.event) #bv.change_dmx)
+        self.b = tk.Button(self.frame,bg="lightblue",text="OPEN", width=5)#,command=self.event) #bv.change_dmx)
         self.b["command"] = self.open_fixture_list
         self.b.pack( side=tk.LEFT)
+
+        self.b = tk.Label(self.frame,bg="#ddd",text=":")
+        self.b.pack(fill=None, side=tk.LEFT)
+
+        self.b = tk.Button(self.frame,bg="lightblue",text="SAVE", width=5)#,command=self.event) #bv.change_dmx)
+        self.b["command"] = self.save_fixture
+        self.b.pack( side=tk.LEFT)
         
         self.b = tk.Label(self.frame,bg="black",text="") # spacer
         self.b.pack(fill=tk.Y, side=tk.LEFT)
@@ -727,6 +763,9 @@ class GUI_FaderLayout():
     def set_name(self,_event=None):
         txt = self.name["text"]
         def _cb(data):
+            if not data:
+                print("err443",self,"_cb",data)
+                return None
             txt = data["Value"]
             print(self,"._cb()",txt)
             self.name["text"] = "{}".format(txt)
@@ -736,14 +775,25 @@ class GUI_FaderLayout():
         dialog.askstring("FIXTURE NAME:","NAME:",initialvalue=txt)
 
 
+    def save_fixture(self,event=None):
+        print("save_fix",self,event)
     def open_fixture_list(self):
         name = "FIXTURE-LIB"
         line1="Fixture Library"
         line2="CHOOS to EDIT >> DEMO MODUS"
         cb = LOAD_FIXTURE
         pw = _M.PopupList(name,width=600,cb=cb,left=_M._POS_LEFT+620,bg="#333")
+        self.pw = pw
+        print(dir(pw.w))
+        print(dir(pw))
         frame = pw.sframe(line1=line1,line2=line2)
         r=_M._load_fixture_list(frame,cb=cb,master=self,bg="#333")
+    def close_fixture_list(self):
+        if self.pw:
+            print("*._"*30)
+            print(dir(self.pw.w.tk))
+            #self.pw.w.tk.quit()
+            self.pw.w.tk.destroy()
 
     def load_EMPTY(self,_event=None,attr=[]):
         #attr = [,"RED","GREEN","BLUE"]
@@ -753,18 +803,26 @@ class GUI_FaderLayout():
         attr = ["DIM"]
         mode = ["F"]
         self._load_fix(None,attr,mode)
+        self.b_path["text"] = "load_DIM"
+        self.close_fixture_list()
     def load_LED(self,_event=None,attr=[]):
         attr = ["DIM","RED","GREEN","BLUE"]
         mode = ["F","F","F","F"]
         self._load_fix(None,attr,mode)
+        self.b_path["text"] = "load_LED"
+        self.close_fixture_list()
     def load_MH(self,_event=None,attr=[]):
         attr = ["PAN","PAN-FINE","TILT","TILT-FINE","SHUTTER","DIM","RED","GREEN","BLUE","GOBO"]
         mode = ["F","F","F","F","S","F","F","F","F","S"]
         self._load_fix(None,attr,mode)
+        self.b_path["text"] = "load_MH"
+        self.close_fixture_list()
     def load_MH2(self,_event=None,attr=[]):
         attr = ["PAN","PAN-FINE","TILT","TILT-FINE","SHUTTER","DIM","RED","GREEN","BLUE","GOBO","G-ROT","PRISM","P-ROT","ZOOM","CONTR"]
         mode = ["F","F","F","F","S","F","F","F","F","S","S","S","S","F","S"]
+        self.b_path["text"] = "load_MH2"
         self._load_fix(None,attr,mode)
+        self.close_fixture_list()
 
     def _load_fix(self,_event=None,attr=[],mode=[]):
         print("load_fixture",[_event,self])
@@ -784,6 +842,9 @@ class GUI_FaderLayout():
         txt= self.entry_univ["text"]
         #def _cb(txt):
         def _cb(data):
+            if not data:
+                print("err443",self,"_cb",data)
+                return None
             txt = data["Value"]
             print(self,"event_univ._cb()",txt)
             try:
@@ -802,6 +863,9 @@ class GUI_FaderLayout():
         #txt = dialog.askstring("DMX","ArtNet 1-512 (7680 max)",initialvalue=txt)
         #def _cb(txt):
         def _cb(data):
+            if not data:
+                print("err443",self,"_cb",data)
+                return None
             txt = data["Value"]
             print(self,"event_dmx._cb()",txt)
             try:
@@ -896,6 +960,9 @@ class ELEM_FADER():
     def set_attr(self,_event=None):
         txt= self.attr["text"]
         def _cb(data):
+            if not data:
+                print("err443",self,"_cb",data)
+                return None
             txt = data["Value"]
             print(self,"set_attr._cb()",txt)
             self._set_attr(txt)
@@ -912,6 +979,9 @@ class ELEM_FADER():
     def set_mode(self,_event=None):
         txt= self.mode["text"]
         def _cb(data):
+            if not data:
+                print("err443",self,"_cb",data)
+                return None
             txt = data["Value"]
             print(self,"set_mode._cb()",txt)
             w = Window("config",master=1,width=200,height=140,left=L1,top=TOP)
@@ -1003,6 +1073,9 @@ class EXEC_FADER():
     def set_attr(self,_event=None):
         txt= self.attr["text"]
         def _cb(data):
+            if not data:
+                print("err443",self,"_cb",data)
+                return None
             print(self,"set_attr._cb()",data)
             if "Value" in data and type( data["Value"]) is str:
                 txt = data["Value"]
@@ -1020,6 +1093,9 @@ class EXEC_FADER():
     def set_mode(self,_event=None):
         txt= self.mode["text"]
         def _cb(data):
+            if not data:
+                print("err443",self,"_cb",data)
+                return None
             txt = data["Value"]
             print(self,"set_mode._cb()",txt)
             w = Window("config",master=1,width=200,height=140,left=L1,top=TOP)
@@ -1191,6 +1267,9 @@ class GUI_ExecWingLayout():
     def set_name(self,_event=None):
         txt = self.name["text"]
         def _cb(data):
+            if not data:
+                print("err443",self,"_cb",data)
+                return None
             txt = data["Value"]
             print(self,"._cb()",txt)
             self.name["text"] = "{}".format(txt)
@@ -1307,6 +1386,9 @@ class GUI_MasterWingLayout():
     def set_name(self,_event=None):
         txt = self.name["text"]
         def _cb(data):
+            if not data:
+                print("err443",self,"_cb",data)
+                return None
             txt = data["Value"]
             print(self,"._cb()",txt)
             self.name["text"] = "{}".format(txt)