Editor3.py 51 KB

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