Editor3.py 45 KB

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