Parcourir la source

refactor: split Master into Fixtures, Presets and GUI

micha il y a 3 ans
Parent
commit
838a13140e
1 fichiers modifiés avec 175 ajouts et 287 suppressions
  1. 175 287
      Editor3.py

+ 175 - 287
Editor3.py

@@ -255,9 +255,9 @@ class Xevent():
                             self.data.elem_commands["STORE"]["bg"] = "grey"
 
                         else: 
-                            for fix in self.data.fixtures:
+                            for fix in self.data.FIXTURES.fixtures:
                                 print( "clr",fix)
-                                data = self.data.fixtures[fix]
+                                data = self.data.FIXTURES.fixtures[fix]
                                 #print("elm",self.data.elem_attr[fix])
                                 for attr in data["ATTRIBUT"]:
                                     if attr.endswith("-FINE"):
@@ -333,8 +333,8 @@ class Xevent():
                     if event.num == 1:
                         cmd = ""
                         offset = 0
-                        for fix in self.data.fixtures:
-                            data = self.data.fixtures[fix]
+                        for fix in self.data.FIXTURES.fixtures:
+                            data = self.data.FIXTURES.fixtures[fix]
                             #print( "ADD FX",fix)
                             for attr in data["ATTRIBUT"]:
                                 if attr.endswith("-FINE"):
@@ -386,8 +386,8 @@ class Xevent():
                     if event.num == 1:
                         client.send("fx0:alloff:,fxf:alloff:")
                         self.data.elem_commands[self.attr]["bg"] = "magenta"
-                        for fix in self.data.fixtures:
-                            data = self.data.fixtures[fix]
+                        for fix in self.data.FIXTURES.fixtures:
+                            data = self.data.FIXTURES.fixtures[fix]
                             for attr in data["ATTRIBUT"]:
                                 data["ATTRIBUT"][attr]["FX"] = ""
 
@@ -498,8 +498,8 @@ class Xevent():
                             self.data.elem_commands[self.attr]["bg"] = "red"
                         print("BLIND",self.data.val_commands)
                 elif self.attr == "BACKUP":
-                    self.data.backup_presets()
-                    self.data.backup_patch()
+                    self.data.PRESETS.backup_presets()
+                    self.data.FIXTURES.backup_patch()
                 return 0
             elif self.mode == "ROOT":
                 if event.keysym=="Escape":
@@ -543,8 +543,8 @@ class Xevent():
                         sdata["CFG"]["FADE"] = fade
                         sdata["CFG"]["DEALY"] = 0
                         sdata["CFG"]["BUTTON"] = "GO"
-                        for fix in self.data.fixtures:                            
-                            data = self.data.fixtures[fix]
+                        for fix in self.data.FIXTURES.fixtures:                            
+                            data = self.data.FIXTURES.fixtures[fix]
                             for attr in data["ATTRIBUT"]:
                                 if data["ATTRIBUT"][attr]["ACTIVE"]:
                                     if fix not in sdata:
@@ -564,7 +564,7 @@ class Xevent():
                     
                         print(sdata)
                         
-                        self.data.val_presets[nr] = sdata
+                        self.data.PRESETS.val_presets[nr] = sdata
                         if len(sdata) > 1:
                             fx_color = 0
                             val_color = 0
@@ -593,9 +593,9 @@ class Xevent():
                             self.data.elem_presets[nr]["bg"] = "grey"
                         #self.data.elem_presets[nr].option_add("*Font", FontBold)
                         label = ""
-                        if nr in self.data.label_presets:
+                        if nr in self.data.PRESETS.label_presets:
                             #print(dir(self.data))
-                            label = self.data.label_presets[nr]
+                            label = self.data.PRESETS.label_presets[nr]
 
                         BTN="go"
                         if "CFG" in sdata:#["BUTTON"] = "GO"
@@ -603,7 +603,7 @@ class Xevent():
                                 BTN = sdata["CFG"]["BUTTON"]
                         txt = str(nr)+":"+str(BTN)+":"+str(len(sdata)-1)+"\n"+label 
                         self.data.elem_presets[nr]["text"] = txt 
-                        print(self.data.val_presets)
+                        print(self.data.PRESETS.val_presets)
                            
                         self.data.val_commands["STORE"] = 0
                         STORE = 0
@@ -611,18 +611,18 @@ class Xevent():
                     elif CFG_BTN:
                         import tkinter.simpledialog
                         txt = tkinter.simpledialog.askstring("CFG-BTN","GO,FLASH,TOGGLE,SWOP\n EXE:"+str(nr))
-                        if "CFG" not in self.data.val_presets[nr]:
-                            self.data.val_presets[nr]["CFG"] = OrderedDict()
-                        if "BUTTON" not in self.data.val_presets[nr]["CFG"]:
-                            self.data.val_presets[nr]["CFG"]["BUTTON"] = ""
+                        if "CFG" not in self.data.PRESETS.val_presets[nr]:
+                            self.data.PRESETS.val_presets[nr]["CFG"] = OrderedDict()
+                        if "BUTTON" not in self.data.PRESETS.val_presets[nr]["CFG"]:
+                            self.data.PRESETS.val_presets[nr]["CFG"]["BUTTON"] = ""
 
-                        self.data.val_presets[nr]["CFG"]["BUTTON"] = txt
-                        sdata=self.data.val_presets[nr]
+                        self.data.PRESETS.val_presets[nr]["CFG"]["BUTTON"] = txt
+                        sdata=self.data.PRESETS.val_presets[nr]
                         BTN="go"
                         if "CFG" in sdata:#["BUTTON"] = "GO"
                             if "BUTTON" in sdata["CFG"]:
                                 BTN = sdata["CFG"]["BUTTON"]
-                        label = self.data.label_presets[nr] # = label
+                        label = self.data.PRESETS.label_presets[nr] # = label
                         txt=str(nr)+":"+str(BTN)+":"+str(len(sdata)-1)+"\n"+label
                         self.data.elem_presets[nr]["text"] = txt
                         CFG_BTN = 0
@@ -632,8 +632,8 @@ class Xevent():
                         import tkinter.simpledialog
                         label = tkinter.simpledialog.askstring("LABEL","Preset "+str(nr))
                         self.data.elem_presets[nr]["text"] = label
-                        self.data.label_presets[nr] = label
-                        sdata=self.data.val_presets[nr]
+                        self.data.PRESETS.label_presets[nr] = label
+                        sdata=self.data.PRESETS.val_presets[nr]
                         BTN="go"
                         if "CFG" in sdata:#["BUTTON"] = "GO"
                             if "BUTTON" in sdata["CFG"]:
@@ -645,7 +645,7 @@ class Xevent():
                         self.data.elem_commands["LABEL"]["bg"] = "lightgrey"
                     elif SELECT:
                         print("SELECT PRESET")
-                        sdata = self.data.val_presets[nr]
+                        sdata = self.data.PRESETS.val_presets[nr]
                         cmd = ""
                         for fix in sdata:
                             if fix == "CFG":
@@ -656,15 +656,15 @@ class Xevent():
                                 #print( self.data.elem_attr)
                                 elem = self.data.elem_attr[fix][attr]
                                 #self#encoder(attr=attr,data=data,elem=elem,action="click")
-                                self.data.fixtures[fix]["ATTRIBUT"][attr]["ACTIVE"] = 1
+                                self.data.FIXTURES.fixtures[fix]["ATTRIBUT"][attr]["ACTIVE"] = 1
                                 elem["bg"] = "yellow"
                     else:
                         print("GO PRESET")
-                        if nr not in self.data.val_presets:
-                            self.data.val_presets[nr] = OrderedDict()
-                            self.data.val_presets[nr]["VALUE"] = 0
-                            self.data.val_presets[nr]["FX"] = ""
-                        sdata = self.data.val_presets[nr]
+                        if nr not in self.data.PRESETS.val_presets:
+                            self.data.PRESETS.val_presets[nr] = OrderedDict()
+                            self.data.PRESETS.val_presets[nr]["VALUE"] = 0
+                            self.data.PRESETS.val_presets[nr]["FX"] = ""
+                        sdata = self.data.PRESETS.val_presets[nr]
                         cmd = ""
                         for fix in sdata:
                             if fix == "CFG":
@@ -672,20 +672,20 @@ class Xevent():
                             for attr in sdata[fix]:
                                 v2 = sdata[fix][attr]["VALUE"]
                                 v2_fx = sdata[fix][attr]["FX"]
-                                #print(fix,attr,v2, fix in self.data.fixtures,self.data.fixtures.keys(),2)
-                                if fix in self.data.fixtures:
-                                    #print("==",self.data.fixtures[fix]["ATTRIBUT"])
-                                    #print( "==", attr, self.data.fixtures[fix], self.data.fixtures.keys(),4 )
-                                    if attr in self.data.fixtures[fix]["ATTRIBUT"]:
+                                #print(fix,attr,v2, fix in self.data.FIXTURES.fixtures,self.data.FIXTURES.fixtures.keys(),2)
+                                if fix in self.data.FIXTURES.fixtures:
+                                    #print("==",self.data.FIXTURES.fixtures[fix]["ATTRIBUT"])
+                                    #print( "==", attr, self.data.FIXTURES.fixtures[fix], self.data.FIXTURES.fixtures.keys(),4 )
+                                    if attr in self.data.FIXTURES.fixtures[fix]["ATTRIBUT"]:
                                         #print( attr)
-                                        data = self.data.fixtures[fix]
-                                        v=self.data.fixtures[fix]["ATTRIBUT"][attr]["VALUE"]
+                                        data = self.data.FIXTURES.fixtures[fix]
+                                        v=self.data.FIXTURES.fixtures[fix]["ATTRIBUT"][attr]["VALUE"]
                                         if v2 is not None:
-                                            self.data.fixtures[fix]["ATTRIBUT"][attr]["VALUE"] = v2
+                                            self.data.FIXTURES.fixtures[fix]["ATTRIBUT"][attr]["VALUE"] = v2
                                         self.data.elem_attr[fix][attr]["text"] = str(attr)+' '+str(round(v,2))
                                         if sdata["CFG"]["BUTTON"] == "SEL": #FLASH
 
-                                            pdata = self.data.val_presets[nr]
+                                            pdata = self.data.PRESETS.val_presets[nr]
                                             cmd = ""
                                             for fix in pdata:
                                                 if fix == "CFG":
@@ -696,7 +696,7 @@ class Xevent():
                                                     #print( self.data.elem_attr)
                                                     elem = self.data.elem_attr[fix][attr]
                                                     #self#encoder(attr=attr,data=data,elem=elem,action="click")
-                                                    self.data.fixtures[fix]["ATTRIBUT"][attr]["ACTIVE"] = 1
+                                                    self.data.FIXTURES.fixtures[fix]["ATTRIBUT"][attr]["ACTIVE"] = 1
                                                     elem["bg"] = "yellow"
 
 
@@ -727,11 +727,11 @@ class Xevent():
                 if event.num == 3:
                     if not STORE:
                         print("GO PRESET")
-                        if nr not in self.data.val_presets:
-                            self.data.val_presets[nr] = OrderedDict()
-                            self.data.val_presets[nr]["VALUE"] = None
-                            self.data.val_presets[nr]["FX"] = ""
-                        sdata = self.data.val_presets[nr]
+                        if nr not in self.data.PRESETS.val_presets:
+                            self.data.PRESETS.val_presets[nr] = OrderedDict()
+                            self.data.PRESETS.val_presets[nr]["VALUE"] = None
+                            self.data.PRESETS.val_presets[nr]["FX"] = ""
+                        sdata = self.data.PRESETS.val_presets[nr]
                         cmd = ""
                         for fix in sdata:
                             if fix == "CFG":
@@ -740,13 +740,13 @@ class Xevent():
                                 v2 = sdata[fix][attr]["VALUE"]
                                 v2_fx = sdata[fix][attr]["FX"]
                                 #print(fix,attr,v)
-                                if fix in self.data.fixtures:
-                                    #print("==",self.data.fixtures[fix]["ATTRIBUT"])
-                                    if attr in self.data.fixtures[fix]["ATTRIBUT"]:
-                                        data = self.data.fixtures[fix]
-                                        v=self.data.fixtures[fix]["ATTRIBUT"][attr]["VALUE"]
+                                if fix in self.data.FIXTURES.fixtures:
+                                    #print("==",self.data.FIXTURES.fixtures[fix]["ATTRIBUT"])
+                                    if attr in self.data.FIXTURES.fixtures[fix]["ATTRIBUT"]:
+                                        data = self.data.FIXTURES.fixtures[fix]
+                                        v=self.data.FIXTURES.fixtures[fix]["ATTRIBUT"][attr]["VALUE"]
                                         if v2 is not None:
-                                            self.data.fixtures[fix]["ATTRIBUT"][attr]["VALUE"] = v2
+                                            self.data.FIXTURES.fixtures[fix]["ATTRIBUT"][attr]["VALUE"] = v2
                                         self.data.elem_attr[fix][attr]["text"] = str(attr)+' '+str(round(v,2))
                                         if str(event.type) == "ButtonRelease":
                                             if FLASH :
@@ -771,8 +771,8 @@ class Xevent():
             if self.mode == "ENCODER":
                 #if self.attr == "VDIM":
                 #    self.attr = "DIM"
-                for fix in self.data.fixtures:
-                    data = self.data.fixtures[fix]
+                for fix in self.data.FIXTURES.fixtures:
+                    data = self.data.FIXTURES.fixtures[fix]
                     
                     for attr in data["ATTRIBUT"]:
                         if attr.endswith("-FINE"):
@@ -835,219 +835,18 @@ import copy
 frame_fix = tk.Frame(root,bg="lightblue",width="100px")
 frame_fix.pack(fill=tk.BOTH, side=tk.TOP)
 
-class Master():
-    def __init__(self):
-        self.load()
-        self.all_attr =["DIM","VDIM","PAN","TILT"]
-        self.elem_attr = {}
-        
-        self.commands =["BLIND","CLEAR","STORE","EDIT","","CFG-BTN","LABEL","SELECT"
-                ,"BACKUP","SET","","","SELECT","ACTIVATE","FLASH","FADE"
-                ,"STONY_FX","FX OFF", "FX:SIN","FX:COS","FX:CIR","SZ:","SP:","OF:"
-                ,"FX:BUM","FX:BUM-","FX:FD","FX:ON","FX:ON-","FX:ON2","FX:ON2-" ]
-        self.elem_commands = {}
-        self.val_commands = {}
-
-        self.elem_presets = {}
-        self.load_presets()
-        self.load_patch()
-        
-        for i in range(8*8):
-            if i not in self.val_presets:
-                name = "Preset:"+str(i+1)+":\nXYZ"
-                #self.presets[i] = [i]
-                self.val_presets[i] = OrderedDict() # FIX 
-                self.val_presets[i]["CFG"] =  OrderedDict() # CONFIG 
-                self.label_presets[i] = "-"
-
-  
-    def exit(self):
-        print("__del__",self)
-        self.backup_presets()
-        print("********************************************************")
-        self.backup_patch()
-        print("*********del",self,"***********************************************")
-    def load(self):
-        fixture = OrderedDict()
-
-        DATA = OrderedDict()
-        DATA["DIM"]   = {"NR": 0, "MASTER": "1", "MODE": "F", "VALUE": 0.0,"ACTIVE":0}
-        fix = {"DMX": 20, "UNIVERS": 2, "NAME": "D", "ATTRIBUT": DATA}
-
-        fi = copy.deepcopy(fix)
-        fi["DMX"] = 1
-        fi["NAME"] = "F1"
-        fixture["1"] = fi
-        fi = copy.deepcopy(fix)
-        fi["DMX"] = 2
-        fi["NAME"] = "F2"
-        fixture["2"] = fi
-        fi = copy.deepcopy(fix)
-        fi["DMX"] = 3
-        fi["NAME"] = "F3"        
-        fixture["3"] = fi
-        fi = copy.deepcopy(fix)
-        fi["DMX"] = 4
-        fi["NAME"] = "F4"        
-        fixture["4"] = fi
-        fi = copy.deepcopy(fix)
-        fi["DMX"] = 11
-        fi["NAME"] = "FL"
-        fixture["11"] = fi
-        fi = copy.deepcopy(fix)
-        fi["DMX"] = 24
-        fi["NAME"] = "P"
-        fixture["24"] = fi
-        
-        DATA = OrderedDict()
-        DATA["DIM"]   = {"NR": 0, "MASTER": "1", "MODE": "F", "VALUE": 0.0,"ACTIVE":0}
-        DATA["RED"]   = {"NR": 3, "MASTER": "", "MODE": "F", "VALUE": 255.0,"ACTIVE":0}
-        DATA["GREEN"] = {"NR": 4, "MASTER": "", "MODE": "F", "VALUE": 255.0,"ACTIVE":0}
-        DATA["BLUE"]  = {"NR": 5, "MASTER": "", "MODE": "F", "VALUE": 127.0,"ACTIVE":0}
-        fix = {"DMX": 20, "UNIVERS": 2, "NAME": "IRGB", "ATTRIBUT": DATA}
-
-        fi = copy.deepcopy(fix)
-        fi["DMX"] = 401
-        fixture["1001"] = fi
-        
-        fi = copy.deepcopy(fix)
-        fi["DMX"] = 421
-        #fi["ATTRIBUT"]["BLUE"]["VALUE"] = 22
-        #fixture["1002"] = fi
-
-        fi = copy.deepcopy(fix)
-        fi["DMX"] = 441
-        #fi["ATTRIBUT"]["BLUE"]["VALUE"] = 22
-        #fixture["1003"] = fi
-        
-        DATA = OrderedDict()
-        DATA["VDIM"]  = {"NR": -1, "MASTER": "", "MODE": "F", "VALUE": 0.0,"ACTIVE":0}
-        DATA["RED"]   = {"NR": 2, "MASTER": "1", "MODE": "F", "VALUE": 255.0,"ACTIVE":0}
-        DATA["GREEN"] = {"NR": 1, "MASTER": "1", "MODE": "F", "VALUE": 255.0,"ACTIVE":0}
-        DATA["BLUE"]  = {"NR": 0, "MASTER": "1", "MODE": "F", "VALUE": 127.0,"ACTIVE":0}
-        fix3 = {"DMX": 20, "UNIVERS": 2, "NAME": "V+RGB", "ATTRIBUT": DATA}
-
-
-        fi = copy.deepcopy(fix3)
-        fi["DMX"] = 330
-        #fixture["2001"] = fi
-        fi = copy.deepcopy(fix3)
-        fi["DMX"] = 335
-        #fixture["2002"] = fi
-        fi = copy.deepcopy(fix3)
-        fi["DMX"] = 240
-        #fixture["2003"] = fi
-        fi = copy.deepcopy(fix3)
-        fi["DMX"] = 245
-        #fixture["2004"] = fi
-        fi = copy.deepcopy(fix3)
-        fi["DMX"] = 250
-        #fixture["2005"] = fi
-        fi = copy.deepcopy(fix3)
-        fi["DMX"] = 355
-        #fixture["2006"] = fi
 
 
-        
-        DATA = OrderedDict()
-        DATA["SHUTTER"]  = {"NR": 5,  "MASTER": "", "MODE": "S", "VALUE": 5.0,"ACTIVE":0}
-        DATA["VDIM"]     = {"NR": -1, "MASTER": "", "MODE": "F", "VALUE": 0.0,"ACTIVE":0}
-        DATA["PAN"]      = {"NR": 0, "MASTER": "", "MODE": "F", "VALUE": 127.0,"ACTIVE":0}
-        DATA["PAN-FINE"] = {"NR": 1, "MASTER": "", "MODE": "F", "VALUE": 127.0,"ACTIVE":0}
-        DATA["TILT"]     = {"NR": 2, "MASTER": "", "MODE": "F", "VALUE": 127.0,"ACTIVE":0}
-        DATA["TILT-FINE"]= {"NR": 3, "MASTER": "", "MODE": "F", "VALUE": 127.0,"ACTIVE":0}
-        DATA["RED"]      = {"NR": 6, "MASTER": "1", "MODE": "F", "VALUE": 255.0,"ACTIVE":0}
-        DATA["GREEN"]    = {"NR": 7, "MASTER": "1", "MODE": "F", "VALUE": 255.0,"ACTIVE":0}
-        DATA["BLUE"]     = {"NR": 8, "MASTER": "1", "MODE": "F", "VALUE": 127.0,"ACTIVE":0}
-        fixTMH = {"DMX": 20, "UNIVERS": 2, "NAME": "MH-BEAM", "ATTRIBUT": DATA}
-
-        fi = copy.deepcopy(fixTMH)
-        fi["DMX"] = 241
-        fixture["3001"] = fi
-
-        fi = copy.deepcopy(fixTMH)
-        fi["DMX"] = 261
-        fixture["3002"] = fi
-
-         
-        DATA = OrderedDict()
-        DATA["DIM"]  = {"NR": 17, "MASTER": "1", "MODE": "F", "VALUE": 0.0,"ACTIVE":0}
-        DATA["PAN"]   = {"NR": 0, "MASTER": "", "MODE": "F", "VALUE": 127.0,"ACTIVE":0}
-        DATA["PAN-FINE"]   = {"NR": 1, "MASTER": "", "MODE": "F", "VALUE": 127.0,"ACTIVE":0}
-        DATA["TILT"]  = {"NR": 2, "MASTER": "", "MODE": "F", "VALUE": 127.0,"ACTIVE":0}
-        DATA["TILT-FINE"]  = {"NR": 3, "MASTER": "", "MODE": "F", "VALUE": 127.0,"ACTIVE":0}
-        DATA["COLOR"]   = {"NR": 8, "MASTER": "", "MODE": "S", "VALUE": 0.0,"ACTIVE":0}
-        DATA["GOBO"] = {"NR": 9, "MASTER": "", "MODE": "S", "VALUE": 0.0,"ACTIVE":0}
-        DATA["G-ROT"]  = {"NR": 8, "MASTER": "", "MODE": "S", "VALUE": 192.0,"ACTIVE":0}
-        DATA["PRISMA"] = {"NR": 10, "MASTER": "", "MODE": "S", "VALUE": 0.0,"ACTIVE":0}
-        DATA["P-ROT"] = {"NR": 11, "MASTER": "", "MODE": "S", "VALUE": 0.0,"ACTIVE":0}
-        DATA["FOCUS"] = {"NR": 14, "MASTER": "", "MODE": "F", "VALUE": 0.0,"ACTIVE":0}
-        DATA["ZOOM"] = {"NR": 13, "MASTER": "", "MODE": "F", "VALUE": 0.0,"ACTIVE":0}
-        DATA["FROST"] = {"NR": 15, "MASTER": "", "MODE": "F", "VALUE": 0.0,"ACTIVE":0}
-        DATA["SHUTTER"] = {"NR": 16, "MASTER": "", "MODE": "S", "VALUE": 0.0,"ACTIVE":0}
-        DATA["CONTROL"]  = {"NR": 5, "MASTER": "", "MODE": "S", "VALUE": 5.0,"ACTIVE":0}
-        fixREUSH = {"DMX": 300, "UNIVERS": 2, "NAME": "RUSH-BEAM", "ATTRIBUT": DATA}
-
-        fi = copy.deepcopy(fixREUSH)
-        fi["DMX"] = 220
-        fixture["701"] = fi
-
-        fi = copy.deepcopy(fixREUSH)
-        fi["DMX"] = 201
-        fixture["702"] = fi
-
-        fi = copy.deepcopy(fixREUSH)
-        fi["DMX"] = 277
-        fixture["703"] = fi
-
-        fi = copy.deepcopy(fixREUSH)
-        fi["DMX"] = 296
-        fixture["704"] = fi
-
-        fi = copy.deepcopy(fixREUSH)
-        fi["DMX"] = 239
-        fixture["705"] = fi
-
-        fi = copy.deepcopy(fixREUSH)
-        fi["DMX"] = 258
-        fixture["706"] = fi
-        
+class Element():
+    def __init__(self):
+        self.__data = {}
+    def set(self,key,val):
+        self.__data[key] = val
 
         
-       
-        #self.fixtures = fixture
-        
-        
-    def load_patch(self):
-        filename="patch"
-        d,l = self._load(filename)
-        self.fixtures = OrderedDict()
-        for i in l:
-            sdata = d[i]
-            for attr in sdata["ATTRIBUT"]:
-                sdata["ATTRIBUT"][attr]["ACTIVE"] = 0
-            print("load",filename,sdata)
-            #if "CFG" not in sdata:
-            #    sdata["CFG"] = OrderedDict()
-            self.fixtures[str(i)] = sdata
-        #self.label_presets = l
-        
-    def load_presets(self):
-        filename="presets"
-        d,l = self._load(filename)
-        for i in d:
-            sdata = d[i]
-            if "CFG" not in sdata:
-                sdata["CFG"] = OrderedDict()
-            if "FADE" not in sdata["CFG"]:
-                sdata["CFG"]["FADE"] = 4
-            if "DELAY" not in sdata["CFG"]:
-                sdata["CFG"]["DELAY"] = 0
-            if "BUTTON" not in sdata["CFG"]:
-                sdata["CFG"]["BUTTON"] = "GO"
-        self.val_presets = d
-        self.label_presets = l
-        
+class Base():
+    def __init__(self):
+        pass
     def _load(self,filename):
         xfname = "show/"+show_name+"/"+str(filename)+".sav"
         print("load",xfname)
@@ -1065,7 +864,7 @@ class Master():
             #print(line)
             jdata = json.loads(rdata,object_pairs_hook=OrderedDict)
             nrnull = 0
-            if "ATTRIBUT" in jdata:  # translate old fixtures start with 0 to 1          
+            if "ATTRIBUT" in jdata:  # translate old FIXTURES.fixtures start with 0 to 1          
                 for attr in jdata["ATTRIBUT"]:
                     if "NR" in jdata["ATTRIBUT"][attr]:
                         nr = jdata["ATTRIBUT"][attr]["NR"]
@@ -1085,20 +884,7 @@ class Master():
             labels[key] = label
             
         return data,labels
-        
-    def backup_patch(self):
-        filename = "patch"
-        data  = self.fixtures
-        labels = {}
-        for k in data:
-            labels[k] = k
-        self._backup(filename,data,labels)
-    def backup_presets(self):
-        filename = "presets"
-        data   = self.val_presets
-        labels = self.label_presets
-        self._backup(filename,data,labels)
-        
+
     def _backup(self,filename,data,labels):
         #fixture
         xfname = "show/"+show_name+"/"+str(filename)+".sav"
@@ -1116,6 +902,108 @@ class Master():
             f.write( "{}\t{}\t{}\n".format( key,label,json.dumps(line) ) )
         f.close()
             
+
+class Fixtures(Base):
+    def __init__(self):
+        super().__init__() 
+        #self.load()
+        self.fixtures = OrderedDict()
+
+        
+    def load_patch(self):
+        filename="patch"
+        d,l = self._load(filename)
+        self.fixtures = OrderedDict()
+        for i in l:
+            sdata = d[i]
+            for attr in sdata["ATTRIBUT"]:
+                sdata["ATTRIBUT"][attr]["ACTIVE"] = 0
+            print("load",filename,sdata)
+            #if "CFG" not in sdata:
+            #    sdata["CFG"] = OrderedDict()
+            self.fixtures[str(i)] = sdata
+        #self.PRESETS.label_presets = l
+
+    def backup_patch(self):
+        filename = "patch"
+        data  = self.fixtures
+        labels = {}
+        for k in data:
+            labels[k] = k
+        self._backup(filename,data,labels)
+
+
+class Presets(Base):
+    def __init__(self):
+        super().__init__() 
+        #self.load()
+        self.fixtures = OrderedDict()
+
+    def load_presets(self):
+        filename="presets"
+        d,l = self._load(filename)
+        for i in d:
+            sdata = d[i]
+            if "CFG" not in sdata:
+                sdata["CFG"] = OrderedDict()
+            if "FADE" not in sdata["CFG"]:
+                sdata["CFG"]["FADE"] = 4
+            if "DELAY" not in sdata["CFG"]:
+                sdata["CFG"]["DELAY"] = 0
+            if "BUTTON" not in sdata["CFG"]:
+                sdata["CFG"]["BUTTON"] = "GO"
+        self.val_presets = d
+        self.label_presets = l
+        
+        
+    def backup_presets(self):
+        filename = "presets"
+        data   = self.val_presets
+        labels = self.label_presets
+        self._backup(filename,data,labels)
+        
+
+
+
+class GUI(Base):
+    def __init__(self):
+        super().__init__() 
+        self.load()
+
+        self.all_attr =["DIM","VDIM","PAN","TILT"]
+        self.elem_attr = {}
+        
+        self.commands =["BLIND","CLEAR","STORE","EDIT","","CFG-BTN","LABEL","SELECT"
+                ,"BACKUP","SET","","","SELECT","ACTIVATE","FLASH","FADE"
+                ,"STONY_FX","FX OFF", "FX:SIN","FX:COS","FX:CIR","SZ:","SP:","OF:"
+                ,"FX:BUM","FX:BUM-","FX:FD","FX:ON","FX:ON-","FX:ON2","FX:ON2-" ]
+        self.elem_commands = {}
+        self.val_commands = {}
+
+        self.elem_presets = {}
+        self.PRESETS = Presets()
+        self.PRESETS.load_presets()
+        self.FIXTURES = Fixtures()
+        self.FIXTURES.load_patch()
+        
+        for i in range(8*8):
+            if i not in self.PRESETS.val_presets:
+                name = "Preset:"+str(i+1)+":\nXYZ"
+                #self.presets[i] = [i]
+                self.PRESETS.val_presets[i] = OrderedDict() # FIX 
+                self.PRESETS.val_presets[i]["CFG"] =  OrderedDict() # CONFIG 
+                self.PRESETS.label_presets[i] = "-"
+
+  
+    def load(self,fname=""):
+        pass
+    def exit(self):
+        print("__del__",self)
+        self.PRESETS.backup_presets()
+        print("********************************************************")
+        self.FIXTURES.backup_patch()
+        print("*********del",self,"***********************************************")
+        
     def draw_dim(self,fix,data,c=0,r=0,frame=None):
         i=0
         if frame is None:
@@ -1285,14 +1173,14 @@ class Master():
         #b.bind("<Button>",Xevent(elem=b).cb)
         b.grid(row=r, column=c, sticky=tk.W+tk.E)
         r+=1      
-        for k in self.val_presets:
+        for k in self.PRESETS.val_presets:
             v=0
             label = ""
-            if k in self.label_presets:
-                label = self.label_presets[k]
+            if k in self.PRESETS.label_presets:
+                label = self.PRESETS.label_presets[k]
                 print([label])
 
-            sdata=self.val_presets[k]
+            sdata=self.PRESETS.val_presets[k]
             BTN="go"
             if "CFG" in sdata:#["BUTTON"] = "GO"
                 if "BUTTON" in sdata["CFG"]:
@@ -1302,9 +1190,9 @@ class Master():
             b.bind("<Button>",Xevent(fix=0,elem=b,attr=k,data=self,mode="PRESET").cb)
             b.bind("<ButtonRelease>",Xevent(fix=0,elem=b,attr=k,data=self,mode="PRESET").cb)
             
-            if k in self.val_presets and len(self.val_presets[k]) :
+            if k in self.PRESETS.val_presets and len(self.PRESETS.val_presets[k]) :
                 b["bg"] = "yellow"
-                sdata = self.val_presets[k]
+                sdata = self.PRESETS.val_presets[k]
                 if len(sdata) > 1:
                     fx_color = 0
                     val_color = 0
@@ -1333,7 +1221,7 @@ class Master():
             
             if k not in self.elem_presets:
                 self.elem_presets[k] = b
-                #self.val_presets[preset] = 0
+                #self.PRESETS.val_presets[preset] = 0
             b.grid(row=r, column=c, sticky=tk.W+tk.E)
             c+=1
             if c >=8:
@@ -1382,8 +1270,8 @@ class Master():
         Xroot.bind("<Key>",Xevent(fix=0,elem=None,attr="ROOT",data=self,mode="ROOT").cb)
         dim_frame = tk.Frame(frame_fix,bg="black")
         dim_frame.pack(fill=tk.X, side=tk.TOP)
-        for fix in self.fixtures:
-            data = self.fixtures[fix]
+        for fix in self.FIXTURES.fixtures:
+            data = self.FIXTURES.fixtures[fix]
             print( fix )
             
             if(len(data["ATTRIBUT"].keys()) <= 1):
@@ -1396,7 +1284,7 @@ class Master():
         self.draw_preset()
         
 try:
-    master =Master()
+    master =GUI()
     master.render()
 
     root.mainloop()