Editor3.py 52 KB

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