|
@@ -1,72 +1,263 @@
|
|
|
#!/usr/bin/python3
|
|
|
|
|
|
-class ValueBuffer():
|
|
|
- def __init__(self,val=2,_min=0,_max=255,_inc=1):
|
|
|
- self._value = val
|
|
|
- self._init_value = val
|
|
|
- self._on = 1
|
|
|
- self._inc = _inc
|
|
|
- self._min=_min
|
|
|
- self._max=_max
|
|
|
- print(self,val)
|
|
|
- def check(self):
|
|
|
- #print(":::",self,self._value,self._min,self._max)
|
|
|
- if self._value < self._min:
|
|
|
- self._value = self._min
|
|
|
- print(self,"MIN !")
|
|
|
- if self._value > self._max:
|
|
|
- self._value = self._max
|
|
|
- print(self,"MAX !")
|
|
|
-
|
|
|
- def dec(self,value=None):
|
|
|
- if value is None:
|
|
|
- value = self._inc
|
|
|
- if type(value) is float:
|
|
|
- value = round(value,4)
|
|
|
- self._value -= value
|
|
|
- self.check()
|
|
|
- return self._value
|
|
|
-
|
|
|
- def inc(self,value=None):
|
|
|
- if value is None:
|
|
|
- value = self._inc
|
|
|
- if type(value) is float:
|
|
|
- value = round(value,4)
|
|
|
- self._value += value
|
|
|
- self.check()
|
|
|
- return self._value
|
|
|
-
|
|
|
- def val(self,value=None):
|
|
|
- if value is None:
|
|
|
- return float(self._value)
|
|
|
-
|
|
|
- if type(value) is float:
|
|
|
- self._value = round(value,4)
|
|
|
- self._value = value
|
|
|
- self.check()
|
|
|
- return float(self._value)
|
|
|
- def reset(self):
|
|
|
- self._value = self._init_value
|
|
|
- self.check()
|
|
|
+def ValueBuffer_create_data(val=2,_min=0,_max=255,_inc=1,cycle=[0,127,255]):
|
|
|
+ data = {}
|
|
|
+ data["value"] = val
|
|
|
+ data["init_value"] = val
|
|
|
+ data["state"] = 1
|
|
|
+ data["inc"] = _inc
|
|
|
+ data["min"] = _min
|
|
|
+ data["max"] = _max
|
|
|
+ data["cycle"] = cycle
|
|
|
+ data["cycle_idx"] = 0
|
|
|
+ data["format"] = "<format>{}"
|
|
|
+ data["name"] = "<name>"
|
|
|
+ return data
|
|
|
+
|
|
|
+def Buffer_clean(data,default={}):
|
|
|
+ print( "ValueBuffer_clean(data)" )
|
|
|
+ a = ValueBuffer_create_data()
|
|
|
+ for k,v in a.items():
|
|
|
+ print(" ",id(data),[k,v])
|
|
|
+ if k not in data:
|
|
|
+ print("ValueBuffer_clear key does not exist; adding key ",[k]," !")
|
|
|
+ data[k] = v
|
|
|
+
|
|
|
+def ValueBuffer_clean(data):
|
|
|
+ default=ValueBuffer_create_data()
|
|
|
+ return Buffer_clean(data,default)
|
|
|
+
|
|
|
+def ValueBuffer_check(data):
|
|
|
+ ValueBuffer_clean(data)
|
|
|
+ #print(":::",data["value"],data["min"],data["max"])
|
|
|
+ if data["value"] < data["min"]:
|
|
|
+ data["value"] = data["min"]
|
|
|
+ print("MIN !")
|
|
|
+ if data["value"] > data["max"]:
|
|
|
+ data["value"] = data["max"]
|
|
|
+ print("MAX !")
|
|
|
+
|
|
|
+def ValueBuffer_cycle(data): # middel mouse click
|
|
|
+ ValueBuffer_clean(data)
|
|
|
+ _len = len(data["cycle"])
|
|
|
+ idx=data["cycle_idx"]
|
|
|
+ if idx >= _len:
|
|
|
+ idx = _len-1
|
|
|
+ else:
|
|
|
+ idx += 1
|
|
|
+ data["cycle_idx"]=idx
|
|
|
+ data["value"] = data["cycle"][idx]
|
|
|
+ ValueBuffer_check(data)
|
|
|
+ return data["value"]
|
|
|
+
|
|
|
+def ValueBuffer_dec(data,value=None): #Mouse Wheel down
|
|
|
+ ValueBuffer_clean(data)
|
|
|
+ if value is None:
|
|
|
+ value = data["inc"]
|
|
|
+ if type(value) is float:
|
|
|
+ value = round(value,4)
|
|
|
+ data["value"] -= value
|
|
|
+ ValueBuffer_check(data)
|
|
|
+ return data["value"]
|
|
|
+
|
|
|
+def ValueBuffer_inc(data,value=None): #Mouse Wheel up
|
|
|
+ ValueBuffer_clean(data)
|
|
|
+ if value is None:
|
|
|
+ value = data["inc"]
|
|
|
+ if type(value) is float:
|
|
|
+ value = round(value,4)
|
|
|
+ data["value"] += value
|
|
|
+ ValueBuffer_check(data)
|
|
|
+ return data["value"]
|
|
|
+
|
|
|
+def ValueBuffer_val(data,value=None): # get or set value
|
|
|
+ ValueBuffer_clean(data)
|
|
|
+ if value is None:
|
|
|
+ return float(data["value"])
|
|
|
+
|
|
|
+ if type(value) is float:
|
|
|
+ data["value"] = round(value,4)
|
|
|
+ data["value"] = value
|
|
|
+ ValueBuffer_check(data)
|
|
|
+ return float(data["value"])
|
|
|
+
|
|
|
+def ValueBuffer_reset(data): # right click
|
|
|
+ ValueBuffer_clean(data)
|
|
|
+ data["value"] = data["init_value"]
|
|
|
+ ValueBuffer_check(data)
|
|
|
+ return 1
|
|
|
+
|
|
|
+def ValueBuffer_on(data): # left click
|
|
|
+ ValueBuffer_clean(data)
|
|
|
+ data["state"] = 1
|
|
|
+
|
|
|
+def ValueBuffer_off(data): # left click
|
|
|
+ ValueBuffer_clean(data)
|
|
|
+ data["state"] = 0
|
|
|
+
|
|
|
+def ValueBuffer_toggle(data):
|
|
|
+ ValueBuffer_clean(data)
|
|
|
+ v = data["state"]
|
|
|
+ if v:v = 0
|
|
|
+ else:v = 1
|
|
|
+ data["state"] = v
|
|
|
+ return v
|
|
|
+
|
|
|
+def ValueBuffer_invert(data):
|
|
|
+ ValueBuffer_clean(data)
|
|
|
+ data["value"] *=-1
|
|
|
+ ValueBuffer_check(data)
|
|
|
+
|
|
|
+def ValueBuffer_is(data):
|
|
|
+ ValueBuffer_clean(data)
|
|
|
+ if data["state"]:
|
|
|
return 1
|
|
|
- def on(self):
|
|
|
- self._on = 1
|
|
|
+ return 0
|
|
|
+
|
|
|
+def ValueBuffer_format(data):
|
|
|
+ ValueBuffer_clean(data)
|
|
|
+ fm = data["format"]
|
|
|
+ print(fm,data)
|
|
|
+ try:
|
|
|
+ if "{val" in fm and "{state" in fm:
|
|
|
+ return fm.format(val=data["value"],state=data["state"])
|
|
|
+ if "{val" in fm:
|
|
|
+ return fm.format(val=data["value"])
|
|
|
+ if "{state" in fm:
|
|
|
+ return fm.format(state=data["state"])
|
|
|
+ return
|
|
|
+ except Exception as e:
|
|
|
+ print(fm,data)
|
|
|
+ raise e
|
|
|
|
|
|
- def off(self):
|
|
|
- self._on = 0
|
|
|
|
|
|
+# warp function to object
|
|
|
+class ValueBuffer():
|
|
|
+ def __init__(self,val=2,_min=0,_max=255,_inc=1,cycle=[0,127,255]):
|
|
|
+ self.data = ValueBuffer_create_data(val=val,_min=_min,_max=_max,_inc=_inc,cycle=cycle)
|
|
|
+ def cycle(self): # middel mouse click
|
|
|
+ return ValueBuffer_cycle(self.data)
|
|
|
+ def check(self):
|
|
|
+ return ValueBuffer_check(self.data)
|
|
|
+ def dec(self,value=None): #Mouse Wheel down
|
|
|
+ return ValueBuffer_dec(self.data,value)
|
|
|
+ def inc(self,value=None): #Mouse Wheel up
|
|
|
+ return ValueBuffer_inc(self.data,value)
|
|
|
+ def val(self,value=None): # get or set value
|
|
|
+ return ValueBuffer_val(self.data,value)
|
|
|
+ def reset(self): # right click
|
|
|
+ return ValueBuffer_reset(self.data)
|
|
|
+ def on(self): # left click
|
|
|
+ return ValueBuffer_on(self.data)
|
|
|
+ def off(self): # left click
|
|
|
+ return ValueBuffer_off(self.data)
|
|
|
+ def toggle(self):
|
|
|
+ return ValueBuffer_toggle(self.data)
|
|
|
+ def invert(self):
|
|
|
+ return ValueBuffer_invert(self.data)
|
|
|
def _is(self):
|
|
|
- if self._on:
|
|
|
- return 1
|
|
|
- return 0
|
|
|
+ return ValueBuffer_is(self.data)
|
|
|
+ def format(self):
|
|
|
+ return ValueBuffer_format(self.data)
|
|
|
+
|
|
|
+
|
|
|
+def create_default_FadeBuffer():
|
|
|
+ return ValueBuffer(val=2,_min=0,_max=20,_inc=0.1)
|
|
|
+
|
|
|
+def create_default_DelayBuffer():
|
|
|
+ return ValueBuffer(val=0.04,_min=-1,_max=1,_inc=0.01,cycle=[0.1,0.2,0.3,0.4,0.5])
|
|
|
+
|
|
|
|
|
|
-FADE = ValueBuffer(val=2,_min=0,_max=10,_inc=0.1) #2 #0.1 #1.13
|
|
|
-DELAY = ValueBuffer(val=0.04,_min=-1,_max=1,_inc=0.01)
|
|
|
+FADE = create_default_FadeBuffer()
|
|
|
+FADE.data["name"] = "FADE"
|
|
|
+FADE.data["format"] = "FADE:\n{val:0.2f}"
|
|
|
+
|
|
|
+DELAY = create_default_DelayBuffer()
|
|
|
+DELAY.data["name"] = "DELAY"
|
|
|
+DELAY.data["format"] = "DELAY:\n{val:0.2f}"
|
|
|
DELAY.off()
|
|
|
|
|
|
-FADE_move = ValueBuffer(val=4.0) #2 #0.1 #1.13
|
|
|
-FADE_move_delay = ValueBuffer(val=0.2,_min=-10,_max=10,_inc=0.1)
|
|
|
+FADE_move = create_default_FadeBuffer()
|
|
|
+FADE_move.data["name"] = "FADE_move"
|
|
|
+FADE_move.data["format"] = "PAN/TILT\nFADE:{val:0.2f}"
|
|
|
+FADE_move.data["init_value"] = 4.0
|
|
|
+FADE_move.reset()
|
|
|
+
|
|
|
+FADE_move_delay = create_default_DelayBuffer()
|
|
|
+FADE_move.data["name"] = "FADE_move_delay"
|
|
|
+FADE_move.data["format"] = "PAN/TILT\nD:{val:0.2f}"
|
|
|
+
|
|
|
+def OptionBuffer_create_data(val="",options=None):
|
|
|
+ if not options:
|
|
|
+ options = ["option1","option2"]
|
|
|
+ data = {}
|
|
|
+ data["options"] = options
|
|
|
+ data["init_idx"] = 0
|
|
|
+ data["idx"] = 0
|
|
|
+ data["wrap"] = 0 #start from begining
|
|
|
+
|
|
|
+ OptionBuffer_set_init(data,val)
|
|
|
+ return data
|
|
|
+
|
|
|
+def OptionBuffer_set_init(data,val):
|
|
|
+ idx=0
|
|
|
+ if val in data:
|
|
|
+ idx = data.index(val)
|
|
|
+ data["init_idx"] = idx
|
|
|
+
|
|
|
+
|
|
|
+def ValueBuffer_clean(data):
|
|
|
+ default=OptionBuffer_create_data()
|
|
|
+ return Buffer_clean(data,default)
|
|
|
|
|
|
+def OptionBuffer_check(data):
|
|
|
+ _len = len(data["options"])
|
|
|
+ if data["wrap"]:
|
|
|
+ if data["idx"] >= _len:
|
|
|
+ data["idx"] = 0
|
|
|
+ if data["idx"] < 0:
|
|
|
+ data["idx"] = _len-1
|
|
|
+ else:
|
|
|
+ if data["idx"] >= _len:
|
|
|
+ data["idx"] = _len-1
|
|
|
+ if data["idx"] < 0:
|
|
|
+ data["idx"] = 0
|
|
|
+
|
|
|
+
|
|
|
+def OptionBuffer_reset(data):
|
|
|
+ ValueBuffer_clean(data)
|
|
|
+ data["idx"] = data["init_idx"]
|
|
|
+ OptionBuffer_check(data)
|
|
|
+
|
|
|
+def OptionBuffer_inc(data):
|
|
|
+ ValueBuffer_clean(data)
|
|
|
+ data["idx"] += 1
|
|
|
+ OptionBuffer_check(data)
|
|
|
+
|
|
|
+def OptionBuffer_dec(data):
|
|
|
+ ValueBuffer_clean(data)
|
|
|
+ data["idx"] -= 1
|
|
|
+ OptionBuffer_check(data)
|
|
|
+
|
|
|
+def OptionBuffer_val(data):
|
|
|
+ ValueBuffer_clean(data)
|
|
|
+ OptionBuffer_check(data)
|
|
|
+ idx= data["idx"]
|
|
|
+ return data["options"][idx]
|
|
|
+
|
|
|
+class OptionBuffer():
|
|
|
+ def __init__(self,val="",options=[]):
|
|
|
+ self.data = OptionBuffer_create_data(val="",options=options)
|
|
|
+ def reset(self):
|
|
|
+ return OptionBuffer_reset(self.data)
|
|
|
+ def inc(self):
|
|
|
+ return OptionBuffer_inc(self.data)
|
|
|
+ def dec(self):
|
|
|
+ return OptionBuffer_dec(self.data)
|
|
|
+ def val(self,val=""):
|
|
|
+ return OptionBuffer_val(self.data)
|
|
|
+ def set_init(self,val):
|
|
|
+ return OptionBuffer_set_init(self.data,val)
|
|
|
|
|
|
class Elem_Container():
|
|
|
def __init__(self):
|
|
@@ -75,9 +266,33 @@ class Elem_Container():
|
|
|
self.val = {}
|
|
|
self.elem = {}
|
|
|
|
|
|
+ATTR_GRP = {}
|
|
|
+ATTR_GRP["POS"] = ["PAN","TILT"]
|
|
|
+ATTR_GRP["RGB"] = ["RED","GREEN","BLUE","AMBER","WHITE"]
|
|
|
+#ATTR_GRP["CMY"] = ["CYAN","MAGENTA","YELLOW"]
|
|
|
+ATTR_GRP["BEAM"] = ["FOCUS","ZOOM","IRIS"] # GOBO1
|
|
|
+
|
|
|
+def Optionbuffer_create_ATTR_GRP(val=""):
|
|
|
+ options = list(ATTR_GRP.keys())
|
|
|
+ return OptionBuffer(val,options)
|
|
|
+
|
|
|
+FX_FUNC = ["SIN","COS","RAMP","RAMP2","FD","ON","STATIC"]
|
|
|
+def Optionbuffer_create_FX_FUNC(val=""):
|
|
|
+ options = FX_FUNC
|
|
|
+ return OptionBuffer(val,options)
|
|
|
+
|
|
|
+def Optionbuffer_create_ATTR(attr_grp="",val=""):
|
|
|
+ options = ["none1","none2"]
|
|
|
+ if attr_grp in ATTR_GRP:
|
|
|
+ options = ATTR_GRP[attr_grp]
|
|
|
+ return OptionBuffer(val,options)
|
|
|
+
|
|
|
+fx_func_grp = Optionbuffer_create_ATTR_GRP()
|
|
|
+fx_func_attr = Optionbuffer_create_ATTR("POS")
|
|
|
+fx_func_func = Optionbuffer_create_FX_FUNC()
|
|
|
+
|
|
|
fx_prm_main = {}
|
|
|
fx_prm_move = {"SIZE":40,"SPEED":8,"OFFSET":100,"BASE":"0","START":0,"MODE":0,"MO":0,"DIR":1,"INVERT":0,"WING":2,"WIDTH":100}
|
|
|
-fx_prm_3 = {"SIZE":40,"SPEED":8,"OFFSET":100,"BASE":"0","START":0,"MODE":0,"MO":0,"DIR":1,"INVERT":0,"WING":2,"WIDTH":100}
|
|
|
|
|
|
live_prm = Elem_Container()
|
|
|
live_prm.labels = ["FADE","DELAY","PAN/TILT\nFADE","PAN/TILT\nDELAY","-","-"]
|
|
@@ -91,6 +306,9 @@ fx_modes = ["RED","GREEN","BLUE","MAG","YELLOW","CYAN"]
|
|
|
fx_mo = ["fade","on","rnd","ramp","ramp2","cosinus","sinus","static"]
|
|
|
|
|
|
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
# MASTER --------
|
|
|
setup = Elem_Container()
|
|
|
#setup.labels = ["SAVE\nSHOW","LOAD\nSHOW","NEW\nSHOW","SAVE\nSHOW AS","SAVE &\nRESTART","DRAW\nGUI","PRO\nMODE"]
|
|
@@ -103,25 +321,39 @@ fx_moves.labels =[
|
|
|
"FX:CIR","FX:PAN","FX:TILT", "WIDTH:\n100","DIR:\n0","INVERT:\n0","\n",
|
|
|
"SHUFFLE:\n0","SIZE:\n","SPEED:\n","START:\n","OFFSET:\n","\n"
|
|
|
]
|
|
|
-fx_3 = Elem_Container()
|
|
|
-fx_3.labels =[
|
|
|
- "FX:ATTR","PAN","TILT","ATTR3","ATTR4","\n",
|
|
|
- "TYPE:","SIN","COS"," "," ","\n",
|
|
|
- "WIDTH:","25","25","25","25","\n",
|
|
|
- "SIZE:","255","255","255","255","\n",
|
|
|
- "SPEED:","10","10","10","10","\n",
|
|
|
- "OFFSET:","100","100","100","100","\n",
|
|
|
- "START:","0","0","0","0","\n",
|
|
|
- "SHUFFLE:","0","0","0","0","\n",
|
|
|
- "DIR:","1","1","1","1","\n",
|
|
|
- "INVERT:","1","1","1","1","\n",
|
|
|
- " ","\n",
|
|
|
- " ","PLAY","STOP","OFF","\n",
|
|
|
- " ","CIRCL","PAN","TILT","FLAY","\n",
|
|
|
- " ","RED","GREEN","BLUE","MAGENTA","\n",
|
|
|
- "\n",
|
|
|
- ]
|
|
|
- #, "FX:SIN","FX:COS","FX:RAMP","FX:RAMP2","FX:FD","FX:ON","BASE:\n-"] #,"FX:RND" ]
|
|
|
+fx3 = Elem_Container()
|
|
|
+fx3_prm = {}
|
|
|
+fx3_grid = {}
|
|
|
+#{"SIZE":40,"SPEED":8,"OFFSET":100,"BASE":"0","START":0,"MODE":0,"MO":0,"DIR":1,"INVERT":0,"WING":2,"WIDTH":100}
|
|
|
+fx3_grid_cfg = {}
|
|
|
+fx3_grid_cfg["GRP:"] = Optionbuffer_create_ATTR_GRP
|
|
|
+fx3_grid_cfg["ATTR:"] = Optionbuffer_create_ATTR #("POS")
|
|
|
+fx3_grid_cfg["TYPE:"] = Optionbuffer_create_FX_FUNC #()
|
|
|
+fx3_grid_cfg["WIDTH:"] = ValueBuffer #(val=2,_min=0,_max=20,_inc=0.1)
|
|
|
+fx3_grid_cfg["SIZE:"] = ValueBuffer
|
|
|
+fx3_grid_cfg["SPEED:"] = ValueBuffer
|
|
|
+fx3_grid_cfg["OFFSET:"] = ValueBuffer
|
|
|
+fx3_grid_cfg["START:"] = ValueBuffer
|
|
|
+fx3_grid_cfg["SHUFFLE:"] = ValueBuffer
|
|
|
+fx3_grid_cfg["DIR:"] = ValueBuffer
|
|
|
+fx3_grid_cfg["INVERT:"] = ValueBuffer
|
|
|
+
|
|
|
+fx3.labels =[]
|
|
|
+for i,f in fx3_grid_cfg.items():
|
|
|
+ x=[]
|
|
|
+ x.append(i)
|
|
|
+ for j in range(4):
|
|
|
+ k="{}{}".format(i,j+1)
|
|
|
+ x.append(k)
|
|
|
+ fx3_grid[k] = f()
|
|
|
+
|
|
|
+ x.append("\n")
|
|
|
+ print(":",x)
|
|
|
+ fx3.labels.extend(x)
|
|
|
+fx3.labels.extend(["\n"])
|
|
|
+fx3.labels.extend([" ","PLAY","STOP","OFF","\n"])
|
|
|
+fx3.labels.extend([" ","CIRCL","PAN","TILT","FLAY","\n"])
|
|
|
+fx3.labels.extend([" ","RED","GREEN","BLUE","MAGENTA","\n"])
|
|
|
|
|
|
fx_cfg = Elem_Container()
|
|
|
fx_cfg.labels =[
|