Editor3.py 53 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330
  1. #! /usr/bin/python
  2. # -*- coding: utf-8 -*-
  3. """
  4. This file is part of LibreLight.
  5. LibreLight is free software: you can redistribute it and/or modify
  6. it under the terms of the GNU General Public License as published by
  7. the Free Software Foundation, either version 2 of the License, or
  8. (at your option) any later version.
  9. LibreLight is distributed in the hope that it will be useful,
  10. but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. GNU General Public License for more details.
  13. You should have received a copy of the GNU General Public License
  14. along with LibreLight. If not, see <http://www.gnu.org/licenses/>.
  15. (c) 2012 micha.rathfelder@gmail.com
  16. """
  17. import sys
  18. if "__file__" in dir():
  19. sys.stdout.write("\x1b]2;"+str(__file__)+"\x07") # terminal title
  20. else:
  21. sys.stdout.write("\x1b]2;"+str("__file__")+"\x07") # terminal title
  22. import json
  23. import time
  24. import sys
  25. import _thread as thread
  26. import tkinter
  27. import tkinter as tk
  28. from tkinter import font
  29. import lib.chat as chat
  30. import lib.motion as motion
  31. Xroot = tk.Tk()
  32. Xroot["bg"] = "black" #white
  33. Xroot.title( __file__)
  34. root = tk.Frame(Xroot,bg="black",width="100px")
  35. root.pack(fill=tk.BOTH, side=tk.LEFT)
  36. root3 = tk.Frame(Xroot,bg="black",width="20px")
  37. root3.pack(fill=tk.BOTH, side=tk.LEFT)
  38. root2 = tk.Frame(Xroot,bg="black",width="1px")
  39. root2.pack(fill=tk.BOTH, side=tk.LEFT)
  40. #default_font = font.Font(family='Helvetica', size=12, weight='bold')
  41. Font = font.Font(family='Helvetica', size=9, weight='normal')
  42. FontBold = font.Font(family='Helvetica', size=10, weight='bold')
  43. #default_font.configure(size=9)
  44. Xroot.option_add("*Font", FontBold)
  45. from collections import OrderedDict
  46. show_name = "GloryCamp2021"
  47. show_name = "GloryCamp2021"
  48. #show_name = "Dimmer"
  49. CUES = OrderedDict()
  50. groups = OrderedDict()
  51. BLIND = 0
  52. STORE = 0
  53. FLASH = 0
  54. STONY_FX = 0
  55. LABEL = 0
  56. CFG_BTN = 0
  57. POS = ["PAN","TILT","MOTION"]
  58. COLOR = ["RED","GREEN","BLUE","COLOR"]
  59. BEAM = ["GOBO","G-ROT","PRISMA","P-ROT","FOCUS","SPEED"]
  60. INT = ["DIM","SHUTTER","STROBE","FUNC"]
  61. client = chat.tcp_sender()
  62. fade = 2 #2 #0.1 #1.13
  63. fade_on = 1
  64. fx_prm = {"SIZE":20,"SPEED":100,"OFFSET":50}
  65. def build_cmd(dmx,val,args=[fade],flash=0,xpfx="",attr=""):
  66. cmd=""
  67. if xpfx:
  68. pfx=xpfx
  69. elif flash:
  70. pfx ="df"
  71. else:
  72. pfx ="d"
  73. if type(val) is float or type(val) is int:
  74. cmd += ",{}{}:{:0.4f}".format(pfx,dmx,val)
  75. else:
  76. cmd += ",{}{}:{}".format(pfx,dmx,val)
  77. if flash:
  78. cmd += ":0:0"#.format(val)
  79. else:
  80. for val in args:
  81. if type(val) is float or type(val) is int:
  82. cmd += ":{:0.4f}".format(val)
  83. else:
  84. cmd += ":{}".format(val)
  85. if attr:
  86. cmd += ":"+str(attr)
  87. return cmd
  88. def update_dmx(attr,data,value=None,args=[fade],flash=0,pfx=""):
  89. global BLIND
  90. dmx = data["DMX"]
  91. val = None
  92. cmd=""
  93. if attr == "VDIM":
  94. for attr in data["ATTRIBUT"]:
  95. dmx = data["DMX"]
  96. if data["ATTRIBUT"][attr]["NR"] < 0: #virtual channels
  97. continue
  98. dmx += data["ATTRIBUT"][attr]["NR"]-1
  99. mode = ""
  100. if "MODE" in data["ATTRIBUT"][attr]:
  101. mode = data["ATTRIBUT"][attr]["MODE"]
  102. #print(attr)
  103. val = data["ATTRIBUT"][attr]["VALUE"]
  104. if data["ATTRIBUT"][attr]["MASTER"]:
  105. val = val * (data["ATTRIBUT"]["VDIM"]["VALUE"] / 255.)
  106. if val is not None:
  107. #cmd += ",d{}:{:0.4f}".format(dmx,int(val))
  108. if value is not None:
  109. val = value
  110. if mode == "F": #FADE
  111. cmd += build_cmd(dmx,val,args=args,flash=flash,xpfx=pfx,attr=attr)
  112. else:
  113. cmd += build_cmd(dmx,val,args=[0],flash=flash,xpfx=pfx,attr=attr)
  114. #print("cmd",cmd)
  115. elif data["ATTRIBUT"][attr]["NR"] > 0:
  116. dmx += data["ATTRIBUT"][attr]["NR"]-1
  117. val = data["ATTRIBUT"][attr]["VALUE"]
  118. mode = ""
  119. if "MODE" in data["ATTRIBUT"][attr]:
  120. mode = data["ATTRIBUT"][attr]["MODE"]
  121. if data["ATTRIBUT"][attr]["MASTER"]:
  122. if "VDIM" in data["ATTRIBUT"]:
  123. val = val * (data["ATTRIBUT"]["VDIM"]["VALUE"] / 255.)
  124. if val is not None:
  125. #cmd += ",d{}:{}".format(dmx,int(val))
  126. if value is not None:
  127. val = value
  128. if mode == "F": #FADE
  129. cmd += build_cmd(dmx,val,args=args,flash=flash,xpfx=pfx,attr=attr)
  130. else:
  131. cmd += build_cmd(dmx,val,args=[0],flash=flash,xpfx=pfx,attr=attr)
  132. #print("cmd",cmd)
  133. if not BLIND:
  134. #client.send(cmd )
  135. pass
  136. else:
  137. cmd=""
  138. return cmd
  139. class dummy_event():
  140. def __init__(self):
  141. self.num =0
  142. class Xevent():
  143. def __init__(self,fix,elem,attr=None,data=None,mode=None):
  144. self.data=data
  145. self.attr = attr
  146. self.elem = elem
  147. self.mode = mode
  148. def encoder(self,fix,attr,data,elem,action=""):
  149. if action == "click":
  150. if self.data["ATTRIBUT"][attr]["ACTIVE"]:
  151. self.data["ATTRIBUT"][attr]["ACTIVE"] = 0
  152. self.elem["bg"] = "grey"
  153. else:
  154. self.data["ATTRIBUT"][attr]["ACTIVE"] = 1
  155. self.elem["bg"] = "yellow"
  156. return 1
  157. v2=data["ATTRIBUT"][attr]["VALUE"]
  158. change=0
  159. increment = 4.11
  160. if action == "+":
  161. v2+= increment
  162. v = "+{:0.4f}".format( increment ) #) #4.11"
  163. change=1
  164. elif action == "-":
  165. v2-= 4.11
  166. v = "-{:0.4f}".format( increment ) #) #4.11"
  167. change=1
  168. if v2 < 0:
  169. v2=0
  170. elif v2 > 256:
  171. v2=256
  172. if change:
  173. data["ATTRIBUT"][attr]["ACTIVE"] = 1
  174. elem["bg"] = "yellow"
  175. #v2 = v
  176. #v = data["ATTRIBUT"][attr]["VALUE"]
  177. data["ATTRIBUT"][attr]["VALUE"] = v2
  178. elem["text"] = "{} {:0.2f}".format(attr,v2)
  179. #worker.fade_dmx(fix,attr,data,v,v2,ft=0)
  180. cmd=update_dmx(attr=attr,data=data,args=[0])
  181. #data["ATTRIBUT"][attr]["VALUE"] = v2
  182. client.send(cmd)
  183. def cb(self,event):
  184. #print("cb",self,event,data)
  185. print("cb",self.attr,self.mode,event)
  186. #print(dir(event),[str(event.type)])#.keys())
  187. try:
  188. #v = self.data["ATTRIBUT"][self.attr]
  189. global STORE
  190. global BLIND
  191. global FLASH
  192. global STONY_FX
  193. global LABEL
  194. global CFG_BTN
  195. change = 0
  196. if self.mode == "COMMAND":
  197. if self.attr == "CLEAR":
  198. if event.num == 1:
  199. if STORE:
  200. self.data.val_commands["STORE"] = 0
  201. STORE = 0
  202. self.data.elem_commands["STORE"]["bg"] = "grey"
  203. else:
  204. for fix in self.data.fixtures:
  205. print( "clr",fix)
  206. data = self.data.fixtures[fix]
  207. #print("elm",self.data.elem_attr[fix])
  208. for attr in data["ATTRIBUT"]:
  209. if attr.endswith("-FINE"):
  210. continue
  211. self.data.elem_attr[fix][attr]["bg"] = "grey"
  212. data["ATTRIBUT"][attr]["ACTIVE"] = 0
  213. #print(data["ATTRIBUT"])
  214. print( "CB CLEAR" )
  215. if self.attr.startswith("SZ:"):#SIN":
  216. #global fx_prm
  217. k = "SIZE"
  218. if event.num == 1:
  219. pass
  220. elif event.num == 2:
  221. pass
  222. elif event.num == 4:
  223. if fx_prm[k] <= 0:
  224. fx_prm[k] = 1
  225. fx_prm[k] *=1.2
  226. elif event.num == 5:
  227. fx_prm[k] /=1.2
  228. #fx_prm[k] =int(fx_prm[k])
  229. if fx_prm[k] > 4000:
  230. fx_prm[k] = 4000
  231. if fx_prm[k] < 0:
  232. fx_prm[k] =0
  233. self.data.elem_commands[self.attr]["text"] = "SZ:{:0.0f}".format(fx_prm[k])
  234. if self.attr.startswith("SP:"):#SIN":
  235. #global fx_prm
  236. k = "SPEED"
  237. if event.num == 1:
  238. pass
  239. elif event.num == 2:
  240. pass
  241. elif event.num == 4:
  242. if fx_prm[k] <= 0:
  243. fx_prm[k] = 1
  244. fx_prm[k] *=1.2
  245. elif event.num == 5:
  246. fx_prm[k] /=1.2
  247. #fx_prm[k] =int(fx_prm[k])
  248. if fx_prm[k] > 4000:
  249. fx_prm[k] = 4000
  250. if fx_prm[k] < 0:
  251. fx_prm[k] =0
  252. self.data.elem_commands[self.attr]["text"] = "SP:{:0.0f}".format(fx_prm[k])
  253. if self.attr.startswith("OF:"):#SIN":
  254. #global fx_prm
  255. k = "OFFSET"
  256. if event.num == 1:
  257. pass
  258. elif event.num == 2:
  259. pass
  260. elif event.num == 4:
  261. if fx_prm[k] <= 0:
  262. fx_prm[k] = 1
  263. fx_prm[k] *=1.2
  264. elif event.num == 5:
  265. fx_prm[k] /=1.2
  266. #fx_prm[k] =int(fx_prm[k])
  267. if fx_prm[k] > 1024:
  268. fx_prm[k] = 1024
  269. if fx_prm[k] < 0:
  270. fx_prm[k] =0
  271. self.data.elem_commands[self.attr]["text"] = "OF:{:0.0f}".format(fx_prm[k])
  272. if self.attr.startswith("FX:"):#SIN":
  273. if event.num == 1:
  274. cmd = ""
  275. offset = 0
  276. for fix in self.data.fixtures:
  277. data = self.data.fixtures[fix]
  278. #print( "ADD FX",fix)
  279. for attr in data["ATTRIBUT"]:
  280. if attr.endswith("-FINE"):
  281. continue
  282. fx=""
  283. if "SIN" in self.attr:
  284. fx = "sinus:{:0.0f}:{:0.0f}:{:0.0f}".format(fx_prm["SIZE"],fx_prm["SPEED"],offset)#fx_prm["OFFSET"])
  285. elif "COS" in self.attr:
  286. fx = "cosinus:{:0.0f}:{:0.0f}:{:0.0f}".format(fx_prm["SIZE"],fx_prm["SPEED"],offset)#fx_prm["OFFSET"])
  287. elif "CIR" in self.attr:
  288. if attr == "PAN":
  289. fx = "cosinus:{:0.0f}:{:0.0f}:{:0.0f}".format(fx_prm["SIZE"],fx_prm["SPEED"],offset)#fx_prm["OFFSET"])
  290. if attr == "TILT":
  291. fx = "sinus:{:0.0f}:{:0.0f}:{:0.0f}".format(fx_prm["SIZE"],fx_prm["SPEED"],offset)#fx_prm["OFFSET"])
  292. if "FX" not in data["ATTRIBUT"][attr]:
  293. data["ATTRIBUT"][attr]["FX"] =""
  294. print("ADD FX",fix,attr,fx,data["ATTRIBUT"][attr]["ACTIVE"])
  295. if data["ATTRIBUT"][attr]["ACTIVE"]:
  296. print("++ADD FX",fix,attr,fx)
  297. data["ATTRIBUT"][attr]["FX"] = fx #"sinus:40:100:10"
  298. cmd+=update_dmx(attr,data,pfx="fx",value=fx)#,flash=FLASH)
  299. if fx_prm["OFFSET"] > 0.5:
  300. offset += fx_prm["OFFSET"] # add offset on next fixture
  301. #print("offset",offset)
  302. if cmd and not BLIND:
  303. client.send(cmd)
  304. elif self.attr == "FX OFF":
  305. if event.num == 1:
  306. client.send("fx0:alloff:,fxf:alloff:")
  307. self.data.elem_commands[self.attr]["bg"] = "magenta"
  308. for fix in self.data.fixtures:
  309. data = self.data.fixtures[fix]
  310. for attr in data["ATTRIBUT"]:
  311. data["ATTRIBUT"][attr]["FX"] = ""
  312. elif self.attr == "FLASH":
  313. if event.num == 1:
  314. if FLASH:
  315. FLASH = 0
  316. self.data.elem_commands[self.attr]["bg"] = "grey"
  317. else:
  318. FLASH = 1
  319. self.data.elem_commands[self.attr]["bg"] = "green"
  320. elif self.attr == "BLIND":
  321. if event.num == 1:
  322. if self.data.val_commands[self.attr]:
  323. self.data.val_commands[self.attr] = 0
  324. BLIND = 0
  325. self.data.elem_commands[self.attr]["bg"] = "grey"
  326. else:
  327. self.data.val_commands[self.attr] = 1
  328. BLIND = 1
  329. self.data.elem_commands[self.attr]["bg"] = "red"
  330. print("BLIND",self.data.val_commands)
  331. elif self.attr == "FADE":
  332. global fade
  333. global fade_on
  334. if fade < 0.01:
  335. fade = 0.01
  336. elif fade > 100.0:
  337. fade = 100
  338. if event.num == 4:
  339. fade *= 1.1
  340. elif event.num == 5:
  341. fade /= 1.1
  342. elif event.num == 1:
  343. if fade_on:
  344. fade_on = 0
  345. self.data.elem_commands[self.attr]["bg"] = "grey"
  346. else:
  347. fade_on = 1
  348. self.data.elem_commands[self.attr]["bg"] = "green"
  349. elif event.num == 2:
  350. if fade > 1 and fade < 4:
  351. fade = 4
  352. elif fade > 3 and fade < 6:
  353. fade = 6
  354. elif fade > 5 and fade < 7:
  355. fade = 8
  356. elif fade > 7 and fade < 9:
  357. fade = 10
  358. elif fade > 9:
  359. fade = 0.01
  360. elif fade < 1:
  361. fade = 1.1
  362. self.data.elem_commands[self.attr]["text"] = "Fade{:0.2f}".format(fade)
  363. elif self.attr == "CFG-BTN":
  364. global CFG_BTN
  365. if event.num == 1:
  366. if CFG_BTN:
  367. CFG_BTN = 0
  368. self.data.elem_commands[self.attr]["bg"] = "lightgrey"
  369. else:
  370. CFG_BTN = 1
  371. self.data.elem_commands[self.attr]["bg"] = "red"
  372. elif self.attr == "LABEL":
  373. global LABEL
  374. #global CFG_BTN
  375. if event.num == 1:
  376. if LABEL:
  377. LABEL = 0
  378. self.data.elem_commands[self.attr]["bg"] = "lightgrey"
  379. else:
  380. LABEL = 1
  381. self.data.elem_commands[self.attr]["bg"] = "red"
  382. elif self.attr == "STONY_FX":
  383. if event.num == 1:
  384. if STONY_FX:
  385. STONY_FX = 0
  386. self.data.elem_commands[self.attr]["bg"] = "grey"
  387. else:
  388. STONY_FX = 1
  389. self.data.elem_commands[self.attr]["bg"] = "red"
  390. elif self.attr == "STORE":
  391. if event.num == 1:
  392. if self.data.val_commands[self.attr]:
  393. self.data.val_commands[self.attr] = 0
  394. STORE = 0
  395. self.data.elem_commands[self.attr]["bg"] = "lightgrey"
  396. else:
  397. self.data.val_commands[self.attr] = 1
  398. STORE = 1
  399. self.data.elem_commands[self.attr]["bg"] = "red"
  400. print("BLIND",self.data.val_commands)
  401. elif self.attr == "BACKUP":
  402. self.data.backup_presets()
  403. self.data.backup_patch()
  404. return 0
  405. elif self.mode == "INPUT":
  406. print(self.data.entry.get())
  407. if event.keycode == 36:
  408. x=self.data.entry.get()
  409. client.send(x)
  410. #self.data.entry.clean()
  411. #self.data
  412. #chat.send("")
  413. elif self.mode == "INPUT2":
  414. print(self.data.entry2.get())
  415. if event.keycode == 36:
  416. x=self.data.entry2.get()
  417. client.send(x)
  418. #self.data.entry.clean()
  419. elif self.mode == "INPUT3":
  420. print(self.data.entry3.get())
  421. if event.keycode == 36:
  422. x=self.data.entry3.get()
  423. client.send(x)
  424. #self.data.entry.clean()
  425. #self.data
  426. #chat.send("")
  427. elif self.mode == "PRESET":
  428. nr = self.attr #int(self.attr.split(":")[1])-1
  429. if event.num == 1:
  430. if STORE:
  431. print("STORE PRESET")
  432. sdata = {}
  433. sdata["CFG"] = OrderedDict()
  434. sdata["CFG"]["FADE"] = fade
  435. sdata["CFG"]["DEALY"] = 0
  436. sdata["CFG"]["BUTTON"] = "GO"
  437. for fix in self.data.fixtures:
  438. data = self.data.fixtures[fix]
  439. for attr in data["ATTRIBUT"]:
  440. if data["ATTRIBUT"][attr]["ACTIVE"]:
  441. if fix not in sdata:
  442. sdata[fix] = {}
  443. if attr not in sdata[fix]:
  444. sdata[fix][attr] = OrderedDict()
  445. if not STONY_FX:
  446. sdata[fix][attr]["VALUE"] = data["ATTRIBUT"][attr]["VALUE"]
  447. #sdata[fix][attr]["FADE"] = fade
  448. else:
  449. sdata[fix][attr]["VALUE"] = None #data["ATTRIBUT"][attr]["VALUE"]
  450. if "FX" not in data["ATTRIBUT"][attr]:
  451. data["ATTRIBUT"][attr]["FX"] =""
  452. sdata[fix][attr]["FX"] = data["ATTRIBUT"][attr]["FX"]
  453. print(sdata)
  454. self.data.val_presets[nr] = sdata
  455. if len(sdata) > 1:
  456. fx_color = 0
  457. val_color = 0
  458. for fix in sdata:
  459. if fix == "CFG":
  460. continue
  461. print( "$$$$",fix,sdata[fix])
  462. for attr in sdata[fix]:
  463. if "FX" in sdata[fix][attr]:
  464. if sdata[fix][attr]["FX"]:
  465. fx_color = 1
  466. if "VALUE" in sdata[fix][attr]:
  467. if sdata[fix][attr]["VALUE"] is not None:
  468. val_color = 1
  469. self.data.elem_presets[nr]["fg"] = "black"
  470. if val_color:
  471. self.data.elem_presets[nr]["bg"] = "yellow"
  472. if fx_color:
  473. self.data.elem_presets[nr]["fg"] = "blue"
  474. else:
  475. if fx_color:
  476. self.data.elem_presets[nr]["bg"] = "cyan"
  477. else:
  478. self.data.elem_presets[nr]["fg"] = "black"
  479. self.data.elem_presets[nr]["bg"] = "grey"
  480. #self.data.elem_presets[nr].option_add("*Font", FontBold)
  481. label = ""
  482. if nr in self.data.label_presets:
  483. #print(dir(self.data))
  484. label = self.data.label_presets[nr]
  485. BTN="go"
  486. if "CFG" in sdata:#["BUTTON"] = "GO"
  487. if "BUTTON" in sdata["CFG"]:
  488. BTN = sdata["CFG"]["BUTTON"]
  489. txt = str(nr)+":"+str(BTN)+":"+str(len(sdata)-1)+"\n"+label
  490. self.data.elem_presets[nr]["text"] = txt
  491. print(self.data.val_presets)
  492. self.data.val_commands["STORE"] = 0
  493. STORE = 0
  494. self.data.elem_commands["STORE"]["bg"] = "lightgrey"
  495. elif CFG_BTN:
  496. import tkinter.simpledialog
  497. txt = tkinter.simpledialog.askstring("CFG-BTN","GO,FLASH,TOGGLE,SWOP\n EXE:"+str(nr))
  498. if "CFG" not in self.data.val_presets[nr]:
  499. self.data.val_presets[nr]["CFG"] = OrderedDict()
  500. if "BUTTON" not in self.data.val_presets[nr]["CFG"]:
  501. self.data.val_presets[nr]["CFG"]["BUTTON"] = ""
  502. self.data.val_presets[nr]["CFG"]["BUTTON"] = txt
  503. sdata=self.data.val_presets[nr]
  504. BTN="go"
  505. if "CFG" in sdata:#["BUTTON"] = "GO"
  506. if "BUTTON" in sdata["CFG"]:
  507. BTN = sdata["CFG"]["BUTTON"]
  508. label = self.data.label_presets[nr] # = label
  509. txt=str(nr)+":"+str(BTN)+":"+str(len(sdata)-1)+"\n"+label
  510. self.data.elem_presets[nr]["text"] = txt
  511. CFG_BTN = 0
  512. self.data.elem_commands["CFG-BTN"]["bg"] = "grey"
  513. elif LABEL:#else:
  514. label = "lalaal"
  515. import tkinter.simpledialog
  516. label = tkinter.simpledialog.askstring("LABEL","Preset "+str(nr))
  517. self.data.elem_presets[nr]["text"] = label
  518. self.data.label_presets[nr] = label
  519. sdata=self.data.val_presets[nr]
  520. BTN="go"
  521. if "CFG" in sdata:#["BUTTON"] = "GO"
  522. if "BUTTON" in sdata["CFG"]:
  523. BTN = sdata["CFG"]["BUTTON"]
  524. txt=str(nr)+":"+str(BTN)+":"+str(len(sdata)-1)+"\n"+label
  525. #txt = "Preset:"+str(nr)+":\n"+str(len(l))+":"+label
  526. self.data.elem_presets[nr]["text"] = txt
  527. LABEL = 0
  528. self.data.elem_commands["LABEL"]["bg"] = "lightgrey"
  529. else:
  530. print("GO PRESET")
  531. if nr not in self.data.val_presets:
  532. self.data.val_presets[nr] = OrderedDict()
  533. self.data.val_presets[nr]["VALUE"] = 0
  534. self.data.val_presets[nr]["FX"] = ""
  535. sdata = self.data.val_presets[nr]
  536. cmd = ""
  537. for fix in sdata:
  538. if fix == "CFG":
  539. continue
  540. for attr in sdata[fix]:
  541. v2 = sdata[fix][attr]["VALUE"]
  542. v2_fx = sdata[fix][attr]["FX"]
  543. #print(fix,attr,v2, fix in self.data.fixtures,self.data.fixtures.keys(),2)
  544. if fix in self.data.fixtures:
  545. #print("==",self.data.fixtures[fix]["ATTRIBUT"])
  546. #print( "==", attr, self.data.fixtures[fix], self.data.fixtures.keys(),4 )
  547. if attr in self.data.fixtures[fix]["ATTRIBUT"]:
  548. #print( attr)
  549. data = self.data.fixtures[fix]
  550. v=self.data.fixtures[fix]["ATTRIBUT"][attr]["VALUE"]
  551. if v2 is not None:
  552. self.data.fixtures[fix]["ATTRIBUT"][attr]["VALUE"] = v2
  553. self.data.elem_attr[fix][attr]["text"] = str(attr)+' '+str(round(v,2))
  554. xFLASH = 0
  555. if FLASH or sdata["CFG"]["BUTTON"] == "FL": #FLASH
  556. xFLASH = 1
  557. if str(event.type) == "ButtonRelease":
  558. if xFLASH:
  559. cmd+=update_dmx(attr,data,value="off",flash=xFLASH)
  560. if v2_fx:
  561. cmd+=update_dmx(attr,data,pfx="fxf",value="off",flash=xFLASH)#,flash=FLASH)
  562. else:
  563. if fade_on:
  564. xfade = fade
  565. else:
  566. xfade = 0
  567. cmd+=update_dmx(attr,data,args=[xfade],flash=xFLASH)
  568. if v2_fx:
  569. cmd+=update_dmx(attr,data,pfx="fx",value=v2_fx,flash=xFLASH)#,flash=FLASH)
  570. #worker.fade_dmx(fix,attr,data,v,v2)
  571. print("cmd",cmd)
  572. if cmd:
  573. client.send(cmd )
  574. #print(sdata)
  575. if event.num == 3:
  576. if not STORE:
  577. print("GO PRESET")
  578. if nr not in self.data.val_presets:
  579. self.data.val_presets[nr] = OrderedDict()
  580. self.data.val_presets[nr]["VALUE"] = None
  581. self.data.val_presets[nr]["FX"] = ""
  582. sdata = self.data.val_presets[nr]
  583. cmd = ""
  584. for fix in sdata:
  585. if fix == "CFG":
  586. continue
  587. for attr in sdata[fix]:
  588. v2 = sdata[fix][attr]["VALUE"]
  589. v2_fx = sdata[fix][attr]["FX"]
  590. #print(fix,attr,v)
  591. if fix in self.data.fixtures:
  592. #print("==",self.data.fixtures[fix]["ATTRIBUT"])
  593. if attr in self.data.fixtures[fix]["ATTRIBUT"]:
  594. data = self.data.fixtures[fix]
  595. v=self.data.fixtures[fix]["ATTRIBUT"][attr]["VALUE"]
  596. if v2 is not None:
  597. self.data.fixtures[fix]["ATTRIBUT"][attr]["VALUE"] = v2
  598. self.data.elem_attr[fix][attr]["text"] = str(attr)+' '+str(round(v,2))
  599. if str(event.type) == "ButtonRelease":
  600. if FLASH :
  601. cmd+=update_dmx(attr,data,value="off",flash=FLASH)
  602. if v2_fx:
  603. cmd+=update_dmx(attr,data,pfx="fxf",value="off",flash=FLASH)#,flash=FLASH)
  604. else:
  605. cmd+=update_dmx(attr,data,args=[0],flash=FLASH)
  606. if v2_fx:
  607. cmd+=update_dmx(attr,data,pfx="fx",value=v2_fx,flash=FLASH)#,flash=FLASH)
  608. #worker.fade_dmx(fix,attr,data,v,v2)
  609. if cmd:
  610. client.send(cmd )
  611. return 0
  612. elif self.mode == "INPUT":
  613. return 0
  614. if self.mode == "ENCODER":
  615. #if self.attr == "VDIM":
  616. # self.attr = "DIM"
  617. for fix in self.data.fixtures:
  618. data = self.data.fixtures[fix]
  619. for attr in data["ATTRIBUT"]:
  620. if attr.endswith("-FINE"):
  621. continue
  622. elem = self.data.elem_attr[fix][attr]
  623. if self.attr != attr:
  624. continue
  625. if event.num == 1:
  626. #self#encoder(attr=attr,data=data,elem=elem,action="click")
  627. data["ATTRIBUT"][attr]["ACTIVE"] = 1
  628. elem["bg"] = "yellow"
  629. if "FX" in data["ATTRIBUT"][attr]:#["FX"]:# = 1
  630. if data["ATTRIBUT"][attr]["FX"]:# = 1
  631. elem["fg"] = "blue"
  632. else:
  633. elem["fg"] = "blue"
  634. elem["fg"] = "black"
  635. if not data["ATTRIBUT"][attr]["ACTIVE"]:
  636. continue
  637. if event.num == 4:
  638. self.encoder(fix=fix,attr=attr,data=data,elem=elem,action="+")
  639. #if attr == "DIM":
  640. # self.encoder(attr="VDIM",data=data,elem=elem,action="+")
  641. elif event.num == 5:
  642. self.encoder(fix=fix,attr=attr,data=data,elem=elem,action="-")
  643. #if attr == "DIM":
  644. # self.encoder(attr="VDIM",data=data,elem=elem,action="-")
  645. return 0
  646. if event.num == 1:
  647. self.encoder(fix=0,attr=self.attr,data=self.data,elem=self.elem,action="click")
  648. elif event.num == 4:
  649. self.encoder(fix=0,attr=self.attr,data=self.data,elem=self.elem,action="+")
  650. elif event.num == 5:
  651. self.encoder(fix=0,attr=self.attr,data=self.data,elem=self.elem,action="-")
  652. #finally:
  653. # pass
  654. except Exception as e:
  655. print("== cb EXCEPT",e)
  656. print("Error on line {}".format(sys.exc_info()[-1].tb_lineno))
  657. #print(self.elem["text"],self.attr,self.data)
  658. def wheel(event,d=None):
  659. print("wheel",event,d)
  660. import copy
  661. frame_fix = tk.Frame(root,bg="lightblue",width="100px")
  662. frame_fix.pack(fill=tk.BOTH, side=tk.TOP)
  663. class Master():
  664. def __init__(self):
  665. self.load()
  666. self.all_attr =["DIM","VDIM","PAN","TILT"]
  667. self.elem_attr = {}
  668. self.commands =["BLIND","CLEAR","STORE","EDIT","","CFG-BTN","LABEL"
  669. ,"BACKUP","SET","","","SELECT","ACTIVATE","FLASH","FADE",
  670. "STONY_FX","FX OFF", "FX:SIN","FX:COS","FX:CIR","SZ:","SP:","OF:"]
  671. self.elem_commands = {}
  672. self.val_commands = {}
  673. self.elem_presets = {}
  674. self.load_presets()
  675. self.load_patch()
  676. for i in range(8*8):
  677. if i not in self.val_presets:
  678. name = "Preset:"+str(i+1)+":\nXYZ"
  679. #self.presets[i] = [i]
  680. self.val_presets[i] = OrderedDict() # FIX
  681. self.val_presets[i]["CFG"] = OrderedDict() # CONFIG
  682. self.label_presets[i] = "-"
  683. def exit(self):
  684. print("__del__",self)
  685. self.backup_presets()
  686. print("********************************************************")
  687. self.backup_patch()
  688. print("*********del",self,"***********************************************")
  689. def load(self):
  690. fixture = OrderedDict()
  691. DATA = OrderedDict()
  692. DATA["DIM"] = {"NR": 0, "MASTER": "1", "MODE": "F", "VALUE": 0.0,"ACTIVE":0}
  693. fix = {"DMX": 20, "UNIVERS": 2, "NAME": "D", "ATTRIBUT": DATA}
  694. fi = copy.deepcopy(fix)
  695. fi["DMX"] = 1
  696. fi["NAME"] = "F1"
  697. fixture["1"] = fi
  698. fi = copy.deepcopy(fix)
  699. fi["DMX"] = 2
  700. fi["NAME"] = "F2"
  701. fixture["2"] = fi
  702. fi = copy.deepcopy(fix)
  703. fi["DMX"] = 3
  704. fi["NAME"] = "F3"
  705. fixture["3"] = fi
  706. fi = copy.deepcopy(fix)
  707. fi["DMX"] = 4
  708. fi["NAME"] = "F4"
  709. fixture["4"] = fi
  710. fi = copy.deepcopy(fix)
  711. fi["DMX"] = 11
  712. fi["NAME"] = "FL"
  713. fixture["11"] = fi
  714. fi = copy.deepcopy(fix)
  715. fi["DMX"] = 24
  716. fi["NAME"] = "P"
  717. fixture["24"] = fi
  718. DATA = OrderedDict()
  719. DATA["DIM"] = {"NR": 0, "MASTER": "1", "MODE": "F", "VALUE": 0.0,"ACTIVE":0}
  720. DATA["RED"] = {"NR": 3, "MASTER": "", "MODE": "F", "VALUE": 255.0,"ACTIVE":0}
  721. DATA["GREEN"] = {"NR": 4, "MASTER": "", "MODE": "F", "VALUE": 255.0,"ACTIVE":0}
  722. DATA["BLUE"] = {"NR": 5, "MASTER": "", "MODE": "F", "VALUE": 127.0,"ACTIVE":0}
  723. fix = {"DMX": 20, "UNIVERS": 2, "NAME": "IRGB", "ATTRIBUT": DATA}
  724. fi = copy.deepcopy(fix)
  725. fi["DMX"] = 401
  726. fixture["1001"] = fi
  727. fi = copy.deepcopy(fix)
  728. fi["DMX"] = 421
  729. #fi["ATTRIBUT"]["BLUE"]["VALUE"] = 22
  730. #fixture["1002"] = fi
  731. fi = copy.deepcopy(fix)
  732. fi["DMX"] = 441
  733. #fi["ATTRIBUT"]["BLUE"]["VALUE"] = 22
  734. #fixture["1003"] = fi
  735. DATA = OrderedDict()
  736. DATA["VDIM"] = {"NR": -1, "MASTER": "", "MODE": "F", "VALUE": 0.0,"ACTIVE":0}
  737. DATA["RED"] = {"NR": 2, "MASTER": "1", "MODE": "F", "VALUE": 255.0,"ACTIVE":0}
  738. DATA["GREEN"] = {"NR": 1, "MASTER": "1", "MODE": "F", "VALUE": 255.0,"ACTIVE":0}
  739. DATA["BLUE"] = {"NR": 0, "MASTER": "1", "MODE": "F", "VALUE": 127.0,"ACTIVE":0}
  740. fix3 = {"DMX": 20, "UNIVERS": 2, "NAME": "V+RGB", "ATTRIBUT": DATA}
  741. fi = copy.deepcopy(fix3)
  742. fi["DMX"] = 330
  743. #fixture["2001"] = fi
  744. fi = copy.deepcopy(fix3)
  745. fi["DMX"] = 335
  746. #fixture["2002"] = fi
  747. fi = copy.deepcopy(fix3)
  748. fi["DMX"] = 240
  749. #fixture["2003"] = fi
  750. fi = copy.deepcopy(fix3)
  751. fi["DMX"] = 245
  752. #fixture["2004"] = fi
  753. fi = copy.deepcopy(fix3)
  754. fi["DMX"] = 250
  755. #fixture["2005"] = fi
  756. fi = copy.deepcopy(fix3)
  757. fi["DMX"] = 355
  758. #fixture["2006"] = fi
  759. DATA = OrderedDict()
  760. DATA["SHUTTER"] = {"NR": 5, "MASTER": "", "MODE": "S", "VALUE": 5.0,"ACTIVE":0}
  761. DATA["VDIM"] = {"NR": -1, "MASTER": "", "MODE": "F", "VALUE": 0.0,"ACTIVE":0}
  762. DATA["PAN"] = {"NR": 0, "MASTER": "", "MODE": "F", "VALUE": 127.0,"ACTIVE":0}
  763. DATA["PAN-FINE"] = {"NR": 1, "MASTER": "", "MODE": "F", "VALUE": 127.0,"ACTIVE":0}
  764. DATA["TILT"] = {"NR": 2, "MASTER": "", "MODE": "F", "VALUE": 127.0,"ACTIVE":0}
  765. DATA["TILT-FINE"]= {"NR": 3, "MASTER": "", "MODE": "F", "VALUE": 127.0,"ACTIVE":0}
  766. DATA["RED"] = {"NR": 6, "MASTER": "1", "MODE": "F", "VALUE": 255.0,"ACTIVE":0}
  767. DATA["GREEN"] = {"NR": 7, "MASTER": "1", "MODE": "F", "VALUE": 255.0,"ACTIVE":0}
  768. DATA["BLUE"] = {"NR": 8, "MASTER": "1", "MODE": "F", "VALUE": 127.0,"ACTIVE":0}
  769. fixTMH = {"DMX": 20, "UNIVERS": 2, "NAME": "MH-BEAM", "ATTRIBUT": DATA}
  770. fi = copy.deepcopy(fixTMH)
  771. fi["DMX"] = 241
  772. fixture["3001"] = fi
  773. fi = copy.deepcopy(fixTMH)
  774. fi["DMX"] = 261
  775. fixture["3002"] = fi
  776. DATA = OrderedDict()
  777. DATA["DIM"] = {"NR": 17, "MASTER": "1", "MODE": "F", "VALUE": 0.0,"ACTIVE":0}
  778. DATA["PAN"] = {"NR": 0, "MASTER": "", "MODE": "F", "VALUE": 127.0,"ACTIVE":0}
  779. DATA["PAN-FINE"] = {"NR": 1, "MASTER": "", "MODE": "F", "VALUE": 127.0,"ACTIVE":0}
  780. DATA["TILT"] = {"NR": 2, "MASTER": "", "MODE": "F", "VALUE": 127.0,"ACTIVE":0}
  781. DATA["TILT-FINE"] = {"NR": 3, "MASTER": "", "MODE": "F", "VALUE": 127.0,"ACTIVE":0}
  782. DATA["COLOR"] = {"NR": 8, "MASTER": "", "MODE": "S", "VALUE": 0.0,"ACTIVE":0}
  783. DATA["GOBO"] = {"NR": 9, "MASTER": "", "MODE": "S", "VALUE": 0.0,"ACTIVE":0}
  784. DATA["G-ROT"] = {"NR": 8, "MASTER": "", "MODE": "S", "VALUE": 192.0,"ACTIVE":0}
  785. DATA["PRISMA"] = {"NR": 10, "MASTER": "", "MODE": "S", "VALUE": 0.0,"ACTIVE":0}
  786. DATA["P-ROT"] = {"NR": 11, "MASTER": "", "MODE": "S", "VALUE": 0.0,"ACTIVE":0}
  787. DATA["FOCUS"] = {"NR": 14, "MASTER": "", "MODE": "F", "VALUE": 0.0,"ACTIVE":0}
  788. DATA["ZOOM"] = {"NR": 13, "MASTER": "", "MODE": "F", "VALUE": 0.0,"ACTIVE":0}
  789. DATA["FROST"] = {"NR": 15, "MASTER": "", "MODE": "F", "VALUE": 0.0,"ACTIVE":0}
  790. DATA["SHUTTER"] = {"NR": 16, "MASTER": "", "MODE": "S", "VALUE": 0.0,"ACTIVE":0}
  791. DATA["CONTROL"] = {"NR": 5, "MASTER": "", "MODE": "S", "VALUE": 5.0,"ACTIVE":0}
  792. fixREUSH = {"DMX": 300, "UNIVERS": 2, "NAME": "RUSH-BEAM", "ATTRIBUT": DATA}
  793. fi = copy.deepcopy(fixREUSH)
  794. fi["DMX"] = 220
  795. fixture["701"] = fi
  796. fi = copy.deepcopy(fixREUSH)
  797. fi["DMX"] = 201
  798. fixture["702"] = fi
  799. fi = copy.deepcopy(fixREUSH)
  800. fi["DMX"] = 277
  801. fixture["703"] = fi
  802. fi = copy.deepcopy(fixREUSH)
  803. fi["DMX"] = 296
  804. fixture["704"] = fi
  805. fi = copy.deepcopy(fixREUSH)
  806. fi["DMX"] = 239
  807. fixture["705"] = fi
  808. fi = copy.deepcopy(fixREUSH)
  809. fi["DMX"] = 258
  810. fixture["706"] = fi
  811. #self.fixtures = fixture
  812. def load_patch(self):
  813. filename="patch"
  814. d,l = self._load(filename)
  815. self.fixtures = OrderedDict()
  816. for i in l:
  817. sdata = d[i]
  818. for attr in sdata["ATTRIBUT"]:
  819. sdata["ATTRIBUT"][attr]["ACTIVE"] = 0
  820. print("load",filename,sdata)
  821. #if "CFG" not in sdata:
  822. # sdata["CFG"] = OrderedDict()
  823. self.fixtures[str(i)] = sdata
  824. #self.label_presets = l
  825. def load_presets(self):
  826. filename="presets"
  827. d,l = self._load(filename)
  828. for i in d:
  829. sdata = d[i]
  830. if "CFG" not in sdata:
  831. sdata["CFG"] = OrderedDict()
  832. if "FADE" not in sdata["CFG"]:
  833. sdata["CFG"]["FADE"] = 4
  834. if "DELAY" not in sdata["CFG"]:
  835. sdata["CFG"]["DELAY"] = 0
  836. if "BUTTON" not in sdata["CFG"]:
  837. sdata["CFG"]["BUTTON"] = "GO"
  838. self.val_presets = d
  839. self.label_presets = l
  840. def _load(self,filename):
  841. xfname = "show/"+show_name+"/"+str(filename)+".sav"
  842. print("load",xfname)
  843. f = open(xfname,"r")
  844. lines = f.readlines()
  845. f.close()
  846. data = OrderedDict()
  847. labels = OrderedDict()
  848. for line in lines:
  849. key,label,rdata = line.split("\t",2)
  850. key = int(key)
  851. #print(xfname,"load",key,label)
  852. #print(line)
  853. jdata = json.loads(rdata,object_pairs_hook=OrderedDict)
  854. nrnull = 0
  855. if "ATTRIBUT" in jdata: # translate old fixtures start with 0 to 1
  856. for attr in jdata["ATTRIBUT"]:
  857. if "NR" in jdata["ATTRIBUT"][attr]:
  858. nr = jdata["ATTRIBUT"][attr]["NR"]
  859. if nr == 0:
  860. nrnull = 1
  861. break
  862. if nrnull:
  863. print("DMX NR IS NULL",attr,"CHANGE +1")
  864. for attr in jdata["ATTRIBUT"]:
  865. if "NR" in jdata["ATTRIBUT"][attr]:
  866. nr = jdata["ATTRIBUT"][attr]["NR"]
  867. if nr >= 0:
  868. jdata["ATTRIBUT"][attr]["NR"] +=1
  869. data[key] = jdata
  870. labels[key] = label
  871. return data,labels
  872. def backup_patch(self):
  873. filename = "patch"
  874. data = self.fixtures
  875. labels = {}
  876. for k in data:
  877. labels[k] = k
  878. self._backup(filename,data,labels)
  879. def backup_presets(self):
  880. filename = "presets"
  881. data = self.val_presets
  882. labels = self.label_presets
  883. self._backup(filename,data,labels)
  884. def _backup(self,filename,data,labels):
  885. #fixture
  886. xfname = "show/"+show_name+"/"+str(filename)+".sav"
  887. print("backup",xfname)
  888. f = open(xfname,"w")
  889. for key in data:
  890. line = data[key]
  891. print(line)
  892. label = "label"
  893. if key in labels:
  894. label = labels[key]
  895. if label == "Name-"+str(key):
  896. label = ""
  897. print(xfname,"load",key,label,len(line))
  898. f.write( "{}\t{}\t{}\n".format( key,label,json.dumps(line) ) )
  899. f.close()
  900. def draw_dim(self,fix,data,c=0,r=0,frame=None):
  901. i=0
  902. if frame is None:
  903. frame = tk.Frame(root,bg="black")
  904. frame.pack(fill=tk.X, side=tk.TOP)
  905. #b = tk.Button(frame,bg="lightblue", text="FIX:"+str(fix)+" "+data["NAME"],width=20)
  906. #b.bind("<Button>",Xevent(fix=fix,elem=b).cb)
  907. #b.grid(row=r, column=c, sticky=tk.W+tk.E)
  908. #c+=1
  909. #r+=1
  910. if fix not in self.elem_attr:
  911. self.elem_attr[fix] = {}
  912. for attr in data["ATTRIBUT"]:
  913. if attr not in self.all_attr:
  914. self.all_attr.append(attr)
  915. if attr not in self.elem_attr[fix]:
  916. self.elem_attr[fix][attr] = []
  917. if attr.endswith("-FINE"):
  918. continue
  919. v= data["ATTRIBUT"][attr]["VALUE"]
  920. b = tk.Button(frame,bg="lightblue", text=""+str(fix)+" "+data["NAME"],width=4)
  921. #b.bind("<Button>",Xevent(fix=fix,elem=b).cb)
  922. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  923. c+=1
  924. b = tk.Button(frame,bg="grey", text=str(attr)+' '+str(round(v,2)),width=6)
  925. self.elem_attr[fix][attr] = b
  926. b.bind("<Button>",Xevent(fix=fix,elem=b,attr=attr,data=data).cb)
  927. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  928. c+=1
  929. if c >=12:
  930. c=0
  931. r+=1
  932. return c,r
  933. def draw_fix(self,fix,data):
  934. i=0
  935. c=0
  936. r=0
  937. frame = tk.Frame(frame_fix,bg="black")
  938. frame.pack(fill=tk.X, side=tk.TOP)
  939. b = tk.Button(frame,bg="lightblue", text="FIX:"+str(fix)+" "+data["NAME"],width=20)
  940. b.bind("<Button>",Xevent(fix=fix,elem=b).cb)
  941. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  942. c+=1
  943. #r+=1
  944. if fix not in self.elem_attr:
  945. self.elem_attr[fix] = {}
  946. for attr in data["ATTRIBUT"]:
  947. if attr not in self.all_attr:
  948. self.all_attr.append(attr)
  949. if attr not in self.elem_attr[fix]:
  950. self.elem_attr[fix][attr] = []
  951. if attr.endswith("-FINE"):
  952. continue
  953. v= data["ATTRIBUT"][attr]["VALUE"]
  954. b = tk.Button(frame,bg="grey", text=str(attr)+' '+str(round(v,2)),width=8)
  955. self.elem_attr[fix][attr] = b
  956. b.bind("<Button>",Xevent(fix=fix,elem=b,attr=attr,data=data).cb)
  957. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  958. c+=1
  959. if c >=8:
  960. c=1
  961. r+=1
  962. def draw_enc(self):
  963. i=0
  964. c=0
  965. r=0
  966. #frame = tk.Frame(root,bg="black")
  967. #frame.pack(fill=tk.X, side=tk.TOP)
  968. #b = tk.Label(frame,bg="black", text="--------------------------------------- ---------------------------------------")
  969. #b.grid(row=r, column=c, sticky=tk.W+tk.E)
  970. #r=0
  971. frame = tk.Frame(root2,bg="black")
  972. frame.pack(fill=tk.X, side=tk.TOP)
  973. b = tk.Button(frame,bg="lightblue", text="ENCODER",width=6)
  974. #b.bind("<Button>",Xevent(fix=fix,elem=b).cb)
  975. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  976. #r+=1
  977. c+=1
  978. for attr in self.all_attr:
  979. if attr.endswith("-FINE"):
  980. continue
  981. v=0
  982. b = tk.Button(frame,bg="orange", text=str(attr)+'',width=6)
  983. b.bind("<Button>",Xevent(fix=0,elem=b,attr=attr,data=self,mode="ENCODER").cb)
  984. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  985. c+=1
  986. if c >=7:
  987. c=0
  988. r+=1
  989. def draw_command(self):
  990. i=0
  991. c=0
  992. r=0
  993. #frame = tk.Frame(root,bg="black")
  994. #frame.pack(fill=tk.X, side=tk.TOP)
  995. #b = tk.Label(frame,bg="black", text="--------------------------------------- ---------------------------------------")
  996. #b.grid(row=r, column=c, sticky=tk.W+tk.E)
  997. #r=0
  998. frame = tk.Frame(root2,bg="black")
  999. frame.pack(fill=tk.X, side=tk.TOP)
  1000. b = tk.Button(frame,bg="lightblue", text="COMM.",width=6)
  1001. #b.bind("<Button>",Xevent(fix=fix,elem=b).cb)
  1002. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1003. #r+=1
  1004. c+=1
  1005. for comm in self.commands:
  1006. v=0
  1007. b = tk.Button(frame,bg="lightgrey", text=str(comm),width=6)
  1008. if comm not in self.elem_commands:
  1009. self.elem_commands[comm] = b
  1010. self.val_commands[comm] = 0
  1011. b.bind("<Button>",Xevent(fix=0,elem=b,attr=comm,data=self,mode="COMMAND").cb)
  1012. if comm == "BLIND":
  1013. b["bg"] = "grey"
  1014. if comm == "CLEAR":
  1015. b["bg"] = "grey"
  1016. if comm == "STONY_FX":
  1017. b["bg"] = "grey"
  1018. if comm == "FADE":
  1019. b["bg"] = "green"
  1020. if comm == "FX OFF":
  1021. b["bg"] = "magenta"
  1022. if comm == "SZ:":
  1023. b["text"] = "SZ:{:0.0f}".format(fx_prm["SIZE"])
  1024. if comm == "SP:":
  1025. b["text"] = "SP:{:0.0f}".format(fx_prm["SPEED"])
  1026. if comm == "OF:":
  1027. b["text"] = "OF:{:0.0f}".format(fx_prm["OFFSET"])
  1028. if comm:
  1029. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1030. c+=1
  1031. if c >=6:
  1032. c=0
  1033. r+=1
  1034. def draw_preset(self):
  1035. i=0
  1036. c=0
  1037. r=0
  1038. frame = tk.Frame(root,bg="black")
  1039. frame.pack(fill=tk.X, side=tk.TOP)
  1040. b = tk.Label(frame,bg="black", text="--------------------------------------- ---------------------------------------")
  1041. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1042. r=0
  1043. frame = tk.Frame(root,bg="black")
  1044. frame.pack(fill=tk.X, side=tk.TOP)
  1045. b = tk.Button(frame,bg="lightblue", text="EXEC")
  1046. #b.bind("<Button>",Xevent(elem=b).cb)
  1047. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1048. r+=1
  1049. for k in self.val_presets:
  1050. v=0
  1051. label = ""
  1052. if k in self.label_presets:
  1053. label = self.label_presets[k]
  1054. print([label])
  1055. sdata=self.val_presets[k]
  1056. BTN="go"
  1057. if "CFG" in sdata:#["BUTTON"] = "GO"
  1058. if "BUTTON" in sdata["CFG"]:
  1059. BTN = sdata["CFG"]["BUTTON"]
  1060. txt=str(k)+":"+str(BTN)+":"+str(len(sdata)-1)+"\n"+label
  1061. b = tk.Button(frame,bg="grey", text=txt,width=8,height=2)
  1062. b.bind("<Button>",Xevent(fix=0,elem=b,attr=k,data=self,mode="PRESET").cb)
  1063. b.bind("<ButtonRelease>",Xevent(fix=0,elem=b,attr=k,data=self,mode="PRESET").cb)
  1064. if k in self.val_presets and len(self.val_presets[k]) :
  1065. b["bg"] = "yellow"
  1066. sdata = self.val_presets[k]
  1067. if len(sdata) > 1:
  1068. fx_color = 0
  1069. val_color = 0
  1070. for fix in sdata:
  1071. if fix == "CFG":
  1072. continue
  1073. print( "$$$$",fix,sdata[fix])
  1074. for attr in sdata[fix]:
  1075. if "FX" in sdata[fix][attr]:
  1076. if sdata[fix][attr]["FX"]:
  1077. fx_color = 1
  1078. if "VALUE" in sdata[fix][attr]:
  1079. if sdata[fix][attr]["VALUE"] is not None:
  1080. val_color = 1
  1081. b["fg"] = "black"
  1082. if val_color:
  1083. b["bg"] = "gold"
  1084. if fx_color:
  1085. b["fg"] = "blue"
  1086. else:
  1087. if fx_color:
  1088. b["bg"] = "cyan"
  1089. else:
  1090. b["bg"] = "grey"
  1091. if k not in self.elem_presets:
  1092. self.elem_presets[k] = b
  1093. #self.val_presets[preset] = 0
  1094. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1095. c+=1
  1096. if c >=8:
  1097. c=0
  1098. r+=1
  1099. def draw_input(self):
  1100. i=0
  1101. c=0
  1102. r=0
  1103. frame = tk.Frame(root2,bg="black")
  1104. frame.pack(fill=tk.X, side=tk.TOP)
  1105. b = tk.Label(frame,bg="black", text="--------------------------------------- ---------------------------------------")
  1106. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1107. r=0
  1108. frame = tk.Frame(root2,bg="black")
  1109. frame.pack(fill=tk.X, side=tk.TOP)
  1110. b = tk.Label(frame, text="send:")
  1111. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1112. c+=1
  1113. b = tk.Entry(frame,bg="grey", text="",width=50)
  1114. self.entry = b
  1115. b.bind("<Button>",Xevent(fix=0,elem=b,attr="INPUT",data=self,mode="INPUT").cb)
  1116. b.bind("<Key>",Xevent(fix=0,elem=b,attr="INPUT",data=self,mode="INPUT").cb)
  1117. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1118. b.insert("end","d0:127,fx241:sinus:50:50:10,fx243:cosinus:50:50:10,d201:127,fx201:sinus:50:300:10")
  1119. r+=1
  1120. b = tk.Entry(frame,bg="grey", text="",width=20)
  1121. self.entry2 = b
  1122. b.bind("<Button>",Xevent(fix=0,elem=b,attr="INPUT",data=self,mode="INPUT2").cb)
  1123. b.bind("<Key>",Xevent(fix=0,elem=b,attr="INPUT",data=self,mode="INPUT2").cb)
  1124. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1125. b.insert("end","d1:0:4")
  1126. r+=1
  1127. b = tk.Entry(frame,bg="grey", text="",width=20)
  1128. self.entry3 = b
  1129. b.bind("<Button>",Xevent(fix=0,elem=b,attr="INPUT",data=self,mode="INPUT3").cb)
  1130. b.bind("<Key>",Xevent(fix=0,elem=b,attr="INPUT",data=self,mode="INPUT3").cb)
  1131. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1132. b.insert("end","fx:alloff:::")
  1133. def render(self):
  1134. r=0
  1135. c=0
  1136. dim_frame = tk.Frame(frame_fix,bg="black")
  1137. dim_frame.pack(fill=tk.X, side=tk.TOP)
  1138. for fix in self.fixtures:
  1139. data = self.fixtures[fix]
  1140. print( fix )
  1141. if(len(data["ATTRIBUT"].keys()) <= 1):
  1142. c,r=self.draw_dim(fix,data,c=c,r=r,frame=dim_frame)
  1143. else:
  1144. self.draw_fix(fix,data)
  1145. self.draw_enc()
  1146. self.draw_command()
  1147. self.draw_input()
  1148. self.draw_preset()
  1149. try:
  1150. master =Master()
  1151. master.render()
  1152. root.mainloop()
  1153. finally:
  1154. master.exit()