meta.py 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403
  1. #!/usr/bin/python3
  2. def ValueBuffer_create_data(val=2,_min=0,_max=255,_inc=1,cycle=[0,127,255]):
  3. data = {}
  4. data["value"] = val
  5. data["init_value"] = val
  6. data["state"] = 1
  7. data["inc"] = _inc
  8. data["min"] = _min
  9. data["max"] = _max
  10. data["cycle"] = cycle
  11. data["cycle_idx"] = 0
  12. data["format"] = "<format>{}"
  13. data["name"] = "<name>"
  14. return data
  15. def Buffer_clean(data,default={}):
  16. #print( "ValueBuffer_clean(data)" )
  17. a = ValueBuffer_create_data()
  18. #for k,v in data.items():
  19. # print(" ",id(data),[k,v])
  20. for k,v in a.items():
  21. #print(" ",id(data),[k,v])
  22. if k not in data:
  23. print("ValueBuffer_clear key does not exist; adding key ",[k]," !")
  24. data[k] = v
  25. def ValueBuffer_clean(data):
  26. default=ValueBuffer_create_data()
  27. return Buffer_clean(data,default)
  28. def ValueBuffer_check(data):
  29. ValueBuffer_clean(data)
  30. #print(":::",data["value"],data["min"],data["max"])
  31. if data["value"] < data["min"]:
  32. data["value"] = data["min"]
  33. print("MIN !")
  34. if data["value"] > data["max"]:
  35. data["value"] = data["max"]
  36. print("MAX !")
  37. def ValueBuffer_cycle(data): # middel mouse click
  38. ValueBuffer_clean(data)
  39. _len = len(data["cycle"])
  40. idx=data["cycle_idx"]
  41. if idx >= _len:
  42. idx = _len-1
  43. else:
  44. idx += 1
  45. data["cycle_idx"]=idx
  46. data["value"] = data["cycle"][idx]
  47. ValueBuffer_check(data)
  48. return data["value"]
  49. def ValueBuffer_dec(data,value=None): #Mouse Wheel down
  50. ValueBuffer_clean(data)
  51. if value is None:
  52. value = data["inc"]
  53. if type(value) is float:
  54. value = round(value,4)
  55. data["value"] -= value
  56. ValueBuffer_check(data)
  57. return data["value"]
  58. def ValueBuffer_inc(data,value=None): #Mouse Wheel up
  59. ValueBuffer_clean(data)
  60. if value is None:
  61. value = data["inc"]
  62. if type(value) is float:
  63. value = round(value,4)
  64. data["value"] += value
  65. ValueBuffer_check(data)
  66. return data["value"]
  67. def ValueBuffer_val(data,value=None): # get or set value
  68. ValueBuffer_clean(data)
  69. if value is None:
  70. return float(data["value"])
  71. if type(value) is float:
  72. data["value"] = round(value,4)
  73. data["value"] = value
  74. ValueBuffer_check(data)
  75. return float(data["value"])
  76. def ValueBuffer_reset(data): # right click
  77. ValueBuffer_clean(data)
  78. data["value"] = data["init_value"]
  79. ValueBuffer_check(data)
  80. return 1
  81. def ValueBuffer_on(data): # left click
  82. ValueBuffer_clean(data)
  83. data["state"] = 1
  84. def ValueBuffer_off(data): # left click
  85. ValueBuffer_clean(data)
  86. data["state"] = 0
  87. def ValueBuffer_toggle(data):
  88. ValueBuffer_clean(data)
  89. v = data["state"]
  90. if v:v = 0
  91. else:v = 1
  92. data["state"] = v
  93. return v
  94. def ValueBuffer_invert(data):
  95. ValueBuffer_clean(data)
  96. data["value"] *=-1
  97. ValueBuffer_check(data)
  98. def ValueBuffer_is(data):
  99. ValueBuffer_clean(data)
  100. if data["state"]:
  101. return 1
  102. return 0
  103. def ValueBuffer_format(data):
  104. ValueBuffer_clean(data)
  105. fm = data["format"]
  106. print("ValueBuffer_format", fm,data)
  107. try:
  108. if "{val" in fm and "{state" in fm:
  109. return fm.format(val=data["value"],state=data["state"])
  110. if "{val" in fm:
  111. return fm.format(val=data["value"])
  112. if "{state" in fm:
  113. return fm.format(state=data["state"])
  114. return
  115. except Exception as e:
  116. print(fm,data)
  117. raise e
  118. # warp function to object
  119. class ValueBuffer():
  120. def __init__(self,val=2,_min=0,_max=255,_inc=1,cycle=[0,127,255]):
  121. self.data = ValueBuffer_create_data(val=val,_min=_min,_max=_max,_inc=_inc,cycle=cycle)
  122. def cycle(self): # middel mouse click
  123. return ValueBuffer_cycle(self.data)
  124. def check(self):
  125. return ValueBuffer_check(self.data)
  126. def dec(self,value=None): #Mouse Wheel down
  127. return ValueBuffer_dec(self.data,value)
  128. def inc(self,value=None): #Mouse Wheel up
  129. return ValueBuffer_inc(self.data,value)
  130. def val(self,value=None): # get or set value
  131. return ValueBuffer_val(self.data,value)
  132. def reset(self): # right click
  133. return ValueBuffer_reset(self.data)
  134. def on(self): # left click
  135. return ValueBuffer_on(self.data)
  136. def off(self): # left click
  137. return ValueBuffer_off(self.data)
  138. def toggle(self):
  139. return ValueBuffer_toggle(self.data)
  140. def invert(self):
  141. return ValueBuffer_invert(self.data)
  142. def _is(self):
  143. return ValueBuffer_is(self.data)
  144. def format(self):
  145. return ValueBuffer_format(self.data)
  146. def create_default_FadeBuffer():
  147. return ValueBuffer(val=2,_min=0,_max=20,_inc=0.1)
  148. def create_default_DelayBuffer():
  149. return ValueBuffer(val=0.04,_min=-1,_max=1,_inc=0.01,cycle=[0.1,0.2,0.3,0.4,0.5])
  150. FADE = create_default_FadeBuffer()
  151. FADE.data["name"] = "FADE"
  152. FADE.data["format"] = "FADE:\n{val:0.2f}"
  153. DELAY = create_default_DelayBuffer()
  154. DELAY.data["name"] = "DELAY"
  155. DELAY.data["format"] = "DELAY:\n{val:0.2f}"
  156. DELAY.off()
  157. FADE_move = create_default_FadeBuffer()
  158. FADE_move.data["name"] = "FADE_move"
  159. FADE_move.data["format"] = "PAN/TILT\nFADE:{val:0.2f}"
  160. FADE_move.data["init_value"] = 4.0
  161. FADE_move.reset()
  162. FADE_move_delay = create_default_DelayBuffer()
  163. FADE_move.data["name"] = "FADE_move_delay"
  164. FADE_move.data["format"] = "PAN/TILT\nD:{val:0.2f}"
  165. def OptionBuffer_create_data(val="",options=None):
  166. if not options:
  167. options = ["option1","option2"]
  168. data = {}
  169. data["options"] = options
  170. data["init_idx"] = 0
  171. data["idx"] = 0
  172. data["wrap"] = 0 #start from begining
  173. OptionBuffer_set_init(data,val)
  174. return data
  175. def OptionBuffer_set_init(data,val):
  176. idx=0
  177. if val in data:
  178. idx = data.index(val)
  179. data["init_idx"] = idx
  180. def ValueBuffer_clean(data):
  181. default=OptionBuffer_create_data()
  182. return Buffer_clean(data,default)
  183. def OptionBuffer_check(data):
  184. _len = len(data["options"])
  185. if data["wrap"]:
  186. if data["idx"] >= _len:
  187. data["idx"] = 0
  188. if data["idx"] < 0:
  189. data["idx"] = _len-1
  190. else:
  191. if data["idx"] >= _len:
  192. data["idx"] = _len-1
  193. if data["idx"] < 0:
  194. data["idx"] = 0
  195. def OptionBuffer_reset(data):
  196. ValueBuffer_clean(data)
  197. data["idx"] = data["init_idx"]
  198. OptionBuffer_check(data)
  199. def OptionBuffer_inc(data):
  200. ValueBuffer_clean(data)
  201. data["idx"] += 1
  202. OptionBuffer_check(data)
  203. def OptionBuffer_dec(data):
  204. ValueBuffer_clean(data)
  205. data["idx"] -= 1
  206. OptionBuffer_check(data)
  207. def OptionBuffer_val(data,val=None):
  208. ValueBuffer_clean(data)
  209. OptionBuffer_check(data)
  210. #val = "RGB"
  211. if val in data["options"]:
  212. print("set",val)
  213. idx = data["options"].index(val)
  214. data["idx"] = idx
  215. idx= data["idx"]
  216. return data["options"][idx]
  217. class OptionBuffer():# wrap function to object
  218. def __init__(self,val="",options=[]):
  219. self.data = OptionBuffer_create_data(val="",options=options)
  220. #self._rep = self.__repr__()
  221. def reset(self):
  222. return OptionBuffer_reset(self.data)
  223. def inc(self):
  224. return OptionBuffer_inc(self.data)
  225. def __repr__(self):
  226. return "<lib.meta.OptionBuffer {} '{}'>".format(id(self),self.val())
  227. def dec(self):
  228. return OptionBuffer_dec(self.data)
  229. def val(self,val=None):
  230. return OptionBuffer_val(self.data,val=val)
  231. def set_init(self,val):
  232. return OptionBuffer_set_init(self.data,val)
  233. class Elem_Container():
  234. def __init__(self):
  235. #self.commands = []
  236. self.labels = []
  237. self.val = {}
  238. self.elem = {}
  239. ATTR_GRP = {}
  240. ATTR_GRP["POS"] = ["PAN","TILT"]
  241. ATTR_GRP["RGB"] = ["RED","GREEN","BLUE","AMBER","WHITE"]
  242. #ATTR_GRP["CMY"] = ["CYAN","MAGENTA","YELLOW"]
  243. ATTR_GRP["BEAM"] = ["DIM","FOCUS","ZOOM","IRIS"] # GOBO1
  244. def Optionbuffer_create_ATTR_GRP(val=""):
  245. options = list(ATTR_GRP.keys())
  246. return OptionBuffer(val,options)
  247. FX_FUNC = ["SIN","COS","RAMP","RAMP2","FD","ON","STATIC"]
  248. def Optionbuffer_create_FX_FUNC(val=""):
  249. options = FX_FUNC
  250. return OptionBuffer(val,options)
  251. def Optionbuffer_create_ATTR(attr_grp="",val=""):
  252. options = ["none1","none2"]
  253. if attr_grp in ATTR_GRP:
  254. options = ATTR_GRP[attr_grp]
  255. #options.append(" ")
  256. if " " not in options:
  257. options.insert(0," ")
  258. ob = OptionBuffer(val,options)
  259. #ob.set_init(" ")
  260. ob.reset()
  261. return ob
  262. fx_func_grp = Optionbuffer_create_ATTR_GRP()
  263. fx_func_attr = Optionbuffer_create_ATTR("POS")
  264. fx_func_func = Optionbuffer_create_FX_FUNC()
  265. fx_prm_main = {}
  266. fx_prm_move = {"SIZE":40,"SPEED":8,"OFFSET":100,"BASE":"0","START":0,"MODE":0,"MO":0,"DIR":1,"INVERT":0,"SHUFFLE":0,"WING":2,"WIDTH":100}
  267. live_prm = Elem_Container()
  268. live_prm.labels = ["FADE","DELAY","PAN/TILT\nFADE","PAN/TILT\nDELAY","-","-"]
  269. live_prm.labels = ["FADE","DELAY","PAN/TILT\nFADE","-","-","-"]
  270. #fx_color = {"A":"red","B":"blue"}
  271. fx_prm = {"SIZE":255,"SPEED":10,"OFFSET":100,"BASE":"-","START":0,"MODE":0,"MO":0,"DIR":1,"INVERT":1,"SHUFFLE":0,"WING":2,"WIDTH":25,"2D-X":1,"2D:MODE":0}
  272. fx_x_modes = ["spiral","left","right","up","down","left_right","up_down"]
  273. fx_modes = ["RED","GREEN","BLUE","MAG","YELLOW","CYAN"]
  274. fx_mo = ["fade","on","rnd","ramp","ramp2","cosinus","sinus","static"]
  275. # MASTER --------
  276. setup = Elem_Container()
  277. #setup.labels = ["SAVE\nSHOW","LOAD\nSHOW","NEW\nSHOW","SAVE\nSHOW AS","SAVE &\nRESTART","DRAW\nGUI","PRO\nMODE"]
  278. setup.labels = ["SAVE\nSHOW","LOAD\nSHOW","NEW\nSHOW","SAVE\nSHOW AS","SAVE &\nRESTART","PRO\nMODE"]
  279. fx_main = Elem_Container()
  280. fx_main.labels =["REC-FX","FX OFF","\n"]
  281. fx_moves = Elem_Container()
  282. fx_moves.labels =[
  283. "FX:CIR","FX:PAN","FX:TILT", "WIDTH:\n100","DIR:\n0","INVERT:\n0","\n",
  284. "SHUFFLE:\n0","SIZE:\n","SPEED:\n","START:\n","OFFSET:\n","\n"
  285. ]
  286. fx3 = Elem_Container()
  287. fx3_prm = {}
  288. fx3_grid = {}
  289. #{"SIZE":40,"SPEED":8,"OFFSET":100,"BASE":"0","START":0,"MODE":0,"MO":0,"DIR":1,"INVERT":0,"WING":2,"WIDTH":100}
  290. fx3_grid_cfg = {}
  291. fx3_grid_cfg["GRP:"] = Optionbuffer_create_ATTR_GRP
  292. fx3_grid_cfg["ATTR:"] = Optionbuffer_create_ATTR #("POS")
  293. fx3_grid_cfg["TYPE:"] = Optionbuffer_create_FX_FUNC #()
  294. fx3_grid_cfg["WIDTH:"] = ValueBuffer #(val=2,_min=0,_max=20,_inc=0.1)
  295. fx3_grid_cfg["SIZE:"] = ValueBuffer
  296. fx3_grid_cfg["SPEED:"] = ValueBuffer
  297. fx3_grid_cfg["OFFSET:"] = ValueBuffer
  298. fx3_grid_cfg["START:"] = ValueBuffer
  299. fx3_grid_cfg["SHUFFLE:"] = ValueBuffer
  300. fx3_grid_cfg["DIR:"] = ValueBuffer
  301. fx3_grid_cfg["INVERT:"] = ValueBuffer
  302. fx3.labels =[]
  303. for i,f in fx3_grid_cfg.items():
  304. x=[]
  305. x.append(i)
  306. for j in range(4):
  307. k="{}{}".format(i,j+1)
  308. x.append(k)
  309. fx3_grid[k] = f()
  310. x.append("\n")
  311. print(":",x)
  312. fx3.labels.extend(x)
  313. #print("__ "*22)
  314. #fx3_grid["GRP:1"].val("RGB")
  315. #print([fx3_grid["GRP:1"].val()])
  316. #print("_ _ "*22)
  317. #fx3_grid["ATTR:1"].val("PAN")
  318. #print([fx3_grid["ATTR:1"].val()])
  319. #print("__ "*22)
  320. fx3.labels.extend([" "," "," "," "," ","\n"])
  321. fx3.labels.extend(["\n"])
  322. fx3.labels.extend([" ","PLAY","STOP","OFF"," ","\n"])
  323. fx3.labels.extend(["SPEED:","SLOW","MID","FAST","TURBO","\n"])
  324. fx3.labels.extend(["SIZE:","MINI","SMALL","NORMAL","BIG","\n"])
  325. fx3.labels.extend([" ","CIRCLE","PAN","TILT","FLAY","\n"])
  326. fx3.labels.extend([" ","RED","GREEN","BLUE","MAGENTA","\n"])
  327. fx_cfg = Elem_Container()
  328. fx_cfg.labels =[
  329. "FX:DIM"," ", "WIDTH:\n25","WING:\n2","DIR:\n1","INVERT:\n1","\n","SHUFFLE:\n0"
  330. ,"SIZE:\n","SPEED:\n","START:\n","OFFSET:\n","BASE:\n-","2D-X:\n-","2D:MODE"
  331. ]
  332. fx_generic = Elem_Container()
  333. fx_generic.labels =["FX:SIN","FX:COS","FX:RAMP","FX:RAMP2","FX:FD","FX:ON","FX:STATIC"]
  334. fx_color = Elem_Container()
  335. fx_color.labels =["FX:RED","FX-C:A","FX-C:B"]
  336. commands = Elem_Container()
  337. commands.labels =["\n","ESC","CFG-BTN","LABEL","-","DEL","-","\n"
  338. ,"SELECT","FLASH","GO","-","MOVE","S-KEY","\n"
  339. ,"BLIND","CLEAR","REC","EDIT","COPY",".","\n"
  340. ]