Editor3.py 57 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406
  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:
  211. print( "clr",fix)
  212. data = self.data.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:
  283. data = self.data.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:
  332. data = self.data.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.backup_presets()
  436. self.data.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:
  476. data = self.data.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.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.label_presets:
  521. #print(dir(self.data))
  522. label = self.data.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.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.val_presets[nr]:
  537. self.data.val_presets[nr]["CFG"] = OrderedDict()
  538. if "BUTTON" not in self.data.val_presets[nr]["CFG"]:
  539. self.data.val_presets[nr]["CFG"]["BUTTON"] = ""
  540. self.data.val_presets[nr]["CFG"]["BUTTON"] = txt
  541. sdata=self.data.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.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.label_presets[nr] = label
  557. sdata=self.data.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.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[fix]["ATTRIBUT"][attr]["ACTIVE"] = 1
  581. elem["bg"] = "yellow"
  582. else:
  583. print("GO PRESET")
  584. if nr not in self.data.val_presets:
  585. self.data.val_presets[nr] = OrderedDict()
  586. self.data.val_presets[nr]["VALUE"] = 0
  587. self.data.val_presets[nr]["FX"] = ""
  588. sdata = self.data.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,self.data.fixtures.keys(),2)
  597. if fix in self.data.fixtures:
  598. #print("==",self.data.fixtures[fix]["ATTRIBUT"])
  599. #print( "==", attr, self.data.fixtures[fix], self.data.fixtures.keys(),4 )
  600. if attr in self.data.fixtures[fix]["ATTRIBUT"]:
  601. #print( attr)
  602. data = self.data.fixtures[fix]
  603. v=self.data.fixtures[fix]["ATTRIBUT"][attr]["VALUE"]
  604. if v2 is not None:
  605. self.data.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.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[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.val_presets:
  646. self.data.val_presets[nr] = OrderedDict()
  647. self.data.val_presets[nr]["VALUE"] = None
  648. self.data.val_presets[nr]["FX"] = ""
  649. sdata = self.data.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:
  659. #print("==",self.data.fixtures[fix]["ATTRIBUT"])
  660. if attr in self.data.fixtures[fix]["ATTRIBUT"]:
  661. data = self.data.fixtures[fix]
  662. v=self.data.fixtures[fix]["ATTRIBUT"][attr]["VALUE"]
  663. if v2 is not None:
  664. self.data.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:
  685. data = self.data.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 Master():
  731. def __init__(self):
  732. self.load()
  733. self.all_attr =["DIM","VDIM","PAN","TILT"]
  734. self.elem_attr = {}
  735. self.commands =["BLIND","CLEAR","STORE","EDIT","","CFG-BTN","LABEL","SELECT"
  736. ,"BACKUP","SET","","","SELECT","ACTIVATE","FLASH","FADE"
  737. ,"STONY_FX","FX OFF", "FX:SIN","FX:COS","FX:CIR","SZ:","SP:","OF:"
  738. ,"FX:BUM","FX:BUM-","FX:FD","FX:ON","FX:ON-","FX:ON2","FX:ON2-" ]
  739. self.elem_commands = {}
  740. self.val_commands = {}
  741. self.elem_presets = {}
  742. self.load_presets()
  743. self.load_patch()
  744. for i in range(8*8):
  745. if i not in self.val_presets:
  746. name = "Preset:"+str(i+1)+":\nXYZ"
  747. #self.presets[i] = [i]
  748. self.val_presets[i] = OrderedDict() # FIX
  749. self.val_presets[i]["CFG"] = OrderedDict() # CONFIG
  750. self.label_presets[i] = "-"
  751. def exit(self):
  752. print("__del__",self)
  753. self.backup_presets()
  754. print("********************************************************")
  755. self.backup_patch()
  756. print("*********del",self,"***********************************************")
  757. def load(self):
  758. fixture = OrderedDict()
  759. DATA = OrderedDict()
  760. DATA["DIM"] = {"NR": 0, "MASTER": "1", "MODE": "F", "VALUE": 0.0,"ACTIVE":0}
  761. fix = {"DMX": 20, "UNIVERS": 2, "NAME": "D", "ATTRIBUT": DATA}
  762. fi = copy.deepcopy(fix)
  763. fi["DMX"] = 1
  764. fi["NAME"] = "F1"
  765. fixture["1"] = fi
  766. fi = copy.deepcopy(fix)
  767. fi["DMX"] = 2
  768. fi["NAME"] = "F2"
  769. fixture["2"] = fi
  770. fi = copy.deepcopy(fix)
  771. fi["DMX"] = 3
  772. fi["NAME"] = "F3"
  773. fixture["3"] = fi
  774. fi = copy.deepcopy(fix)
  775. fi["DMX"] = 4
  776. fi["NAME"] = "F4"
  777. fixture["4"] = fi
  778. fi = copy.deepcopy(fix)
  779. fi["DMX"] = 11
  780. fi["NAME"] = "FL"
  781. fixture["11"] = fi
  782. fi = copy.deepcopy(fix)
  783. fi["DMX"] = 24
  784. fi["NAME"] = "P"
  785. fixture["24"] = fi
  786. DATA = OrderedDict()
  787. DATA["DIM"] = {"NR": 0, "MASTER": "1", "MODE": "F", "VALUE": 0.0,"ACTIVE":0}
  788. DATA["RED"] = {"NR": 3, "MASTER": "", "MODE": "F", "VALUE": 255.0,"ACTIVE":0}
  789. DATA["GREEN"] = {"NR": 4, "MASTER": "", "MODE": "F", "VALUE": 255.0,"ACTIVE":0}
  790. DATA["BLUE"] = {"NR": 5, "MASTER": "", "MODE": "F", "VALUE": 127.0,"ACTIVE":0}
  791. fix = {"DMX": 20, "UNIVERS": 2, "NAME": "IRGB", "ATTRIBUT": DATA}
  792. fi = copy.deepcopy(fix)
  793. fi["DMX"] = 401
  794. fixture["1001"] = fi
  795. fi = copy.deepcopy(fix)
  796. fi["DMX"] = 421
  797. #fi["ATTRIBUT"]["BLUE"]["VALUE"] = 22
  798. #fixture["1002"] = fi
  799. fi = copy.deepcopy(fix)
  800. fi["DMX"] = 441
  801. #fi["ATTRIBUT"]["BLUE"]["VALUE"] = 22
  802. #fixture["1003"] = fi
  803. DATA = OrderedDict()
  804. DATA["VDIM"] = {"NR": -1, "MASTER": "", "MODE": "F", "VALUE": 0.0,"ACTIVE":0}
  805. DATA["RED"] = {"NR": 2, "MASTER": "1", "MODE": "F", "VALUE": 255.0,"ACTIVE":0}
  806. DATA["GREEN"] = {"NR": 1, "MASTER": "1", "MODE": "F", "VALUE": 255.0,"ACTIVE":0}
  807. DATA["BLUE"] = {"NR": 0, "MASTER": "1", "MODE": "F", "VALUE": 127.0,"ACTIVE":0}
  808. fix3 = {"DMX": 20, "UNIVERS": 2, "NAME": "V+RGB", "ATTRIBUT": DATA}
  809. fi = copy.deepcopy(fix3)
  810. fi["DMX"] = 330
  811. #fixture["2001"] = fi
  812. fi = copy.deepcopy(fix3)
  813. fi["DMX"] = 335
  814. #fixture["2002"] = fi
  815. fi = copy.deepcopy(fix3)
  816. fi["DMX"] = 240
  817. #fixture["2003"] = fi
  818. fi = copy.deepcopy(fix3)
  819. fi["DMX"] = 245
  820. #fixture["2004"] = fi
  821. fi = copy.deepcopy(fix3)
  822. fi["DMX"] = 250
  823. #fixture["2005"] = fi
  824. fi = copy.deepcopy(fix3)
  825. fi["DMX"] = 355
  826. #fixture["2006"] = fi
  827. DATA = OrderedDict()
  828. DATA["SHUTTER"] = {"NR": 5, "MASTER": "", "MODE": "S", "VALUE": 5.0,"ACTIVE":0}
  829. DATA["VDIM"] = {"NR": -1, "MASTER": "", "MODE": "F", "VALUE": 0.0,"ACTIVE":0}
  830. DATA["PAN"] = {"NR": 0, "MASTER": "", "MODE": "F", "VALUE": 127.0,"ACTIVE":0}
  831. DATA["PAN-FINE"] = {"NR": 1, "MASTER": "", "MODE": "F", "VALUE": 127.0,"ACTIVE":0}
  832. DATA["TILT"] = {"NR": 2, "MASTER": "", "MODE": "F", "VALUE": 127.0,"ACTIVE":0}
  833. DATA["TILT-FINE"]= {"NR": 3, "MASTER": "", "MODE": "F", "VALUE": 127.0,"ACTIVE":0}
  834. DATA["RED"] = {"NR": 6, "MASTER": "1", "MODE": "F", "VALUE": 255.0,"ACTIVE":0}
  835. DATA["GREEN"] = {"NR": 7, "MASTER": "1", "MODE": "F", "VALUE": 255.0,"ACTIVE":0}
  836. DATA["BLUE"] = {"NR": 8, "MASTER": "1", "MODE": "F", "VALUE": 127.0,"ACTIVE":0}
  837. fixTMH = {"DMX": 20, "UNIVERS": 2, "NAME": "MH-BEAM", "ATTRIBUT": DATA}
  838. fi = copy.deepcopy(fixTMH)
  839. fi["DMX"] = 241
  840. fixture["3001"] = fi
  841. fi = copy.deepcopy(fixTMH)
  842. fi["DMX"] = 261
  843. fixture["3002"] = fi
  844. DATA = OrderedDict()
  845. DATA["DIM"] = {"NR": 17, "MASTER": "1", "MODE": "F", "VALUE": 0.0,"ACTIVE":0}
  846. DATA["PAN"] = {"NR": 0, "MASTER": "", "MODE": "F", "VALUE": 127.0,"ACTIVE":0}
  847. DATA["PAN-FINE"] = {"NR": 1, "MASTER": "", "MODE": "F", "VALUE": 127.0,"ACTIVE":0}
  848. DATA["TILT"] = {"NR": 2, "MASTER": "", "MODE": "F", "VALUE": 127.0,"ACTIVE":0}
  849. DATA["TILT-FINE"] = {"NR": 3, "MASTER": "", "MODE": "F", "VALUE": 127.0,"ACTIVE":0}
  850. DATA["COLOR"] = {"NR": 8, "MASTER": "", "MODE": "S", "VALUE": 0.0,"ACTIVE":0}
  851. DATA["GOBO"] = {"NR": 9, "MASTER": "", "MODE": "S", "VALUE": 0.0,"ACTIVE":0}
  852. DATA["G-ROT"] = {"NR": 8, "MASTER": "", "MODE": "S", "VALUE": 192.0,"ACTIVE":0}
  853. DATA["PRISMA"] = {"NR": 10, "MASTER": "", "MODE": "S", "VALUE": 0.0,"ACTIVE":0}
  854. DATA["P-ROT"] = {"NR": 11, "MASTER": "", "MODE": "S", "VALUE": 0.0,"ACTIVE":0}
  855. DATA["FOCUS"] = {"NR": 14, "MASTER": "", "MODE": "F", "VALUE": 0.0,"ACTIVE":0}
  856. DATA["ZOOM"] = {"NR": 13, "MASTER": "", "MODE": "F", "VALUE": 0.0,"ACTIVE":0}
  857. DATA["FROST"] = {"NR": 15, "MASTER": "", "MODE": "F", "VALUE": 0.0,"ACTIVE":0}
  858. DATA["SHUTTER"] = {"NR": 16, "MASTER": "", "MODE": "S", "VALUE": 0.0,"ACTIVE":0}
  859. DATA["CONTROL"] = {"NR": 5, "MASTER": "", "MODE": "S", "VALUE": 5.0,"ACTIVE":0}
  860. fixREUSH = {"DMX": 300, "UNIVERS": 2, "NAME": "RUSH-BEAM", "ATTRIBUT": DATA}
  861. fi = copy.deepcopy(fixREUSH)
  862. fi["DMX"] = 220
  863. fixture["701"] = fi
  864. fi = copy.deepcopy(fixREUSH)
  865. fi["DMX"] = 201
  866. fixture["702"] = fi
  867. fi = copy.deepcopy(fixREUSH)
  868. fi["DMX"] = 277
  869. fixture["703"] = fi
  870. fi = copy.deepcopy(fixREUSH)
  871. fi["DMX"] = 296
  872. fixture["704"] = fi
  873. fi = copy.deepcopy(fixREUSH)
  874. fi["DMX"] = 239
  875. fixture["705"] = fi
  876. fi = copy.deepcopy(fixREUSH)
  877. fi["DMX"] = 258
  878. fixture["706"] = fi
  879. #self.fixtures = fixture
  880. def load_patch(self):
  881. filename="patch"
  882. d,l = self._load(filename)
  883. self.fixtures = OrderedDict()
  884. for i in l:
  885. sdata = d[i]
  886. for attr in sdata["ATTRIBUT"]:
  887. sdata["ATTRIBUT"][attr]["ACTIVE"] = 0
  888. print("load",filename,sdata)
  889. #if "CFG" not in sdata:
  890. # sdata["CFG"] = OrderedDict()
  891. self.fixtures[str(i)] = sdata
  892. #self.label_presets = l
  893. def load_presets(self):
  894. filename="presets"
  895. d,l = self._load(filename)
  896. for i in d:
  897. sdata = d[i]
  898. if "CFG" not in sdata:
  899. sdata["CFG"] = OrderedDict()
  900. if "FADE" not in sdata["CFG"]:
  901. sdata["CFG"]["FADE"] = 4
  902. if "DELAY" not in sdata["CFG"]:
  903. sdata["CFG"]["DELAY"] = 0
  904. if "BUTTON" not in sdata["CFG"]:
  905. sdata["CFG"]["BUTTON"] = "GO"
  906. self.val_presets = d
  907. self.label_presets = l
  908. def _load(self,filename):
  909. xfname = "show/"+show_name+"/"+str(filename)+".sav"
  910. print("load",xfname)
  911. f = open(xfname,"r")
  912. lines = f.readlines()
  913. f.close()
  914. data = OrderedDict()
  915. labels = OrderedDict()
  916. for line in lines:
  917. key,label,rdata = line.split("\t",2)
  918. key = int(key)
  919. #print(xfname,"load",key,label)
  920. #print(line)
  921. jdata = json.loads(rdata,object_pairs_hook=OrderedDict)
  922. nrnull = 0
  923. if "ATTRIBUT" in jdata: # translate old fixtures start with 0 to 1
  924. for attr in jdata["ATTRIBUT"]:
  925. if "NR" in jdata["ATTRIBUT"][attr]:
  926. nr = jdata["ATTRIBUT"][attr]["NR"]
  927. if nr == 0:
  928. nrnull = 1
  929. break
  930. if nrnull:
  931. print("DMX NR IS NULL",attr,"CHANGE +1")
  932. for attr in jdata["ATTRIBUT"]:
  933. if "NR" in jdata["ATTRIBUT"][attr]:
  934. nr = jdata["ATTRIBUT"][attr]["NR"]
  935. if nr >= 0:
  936. jdata["ATTRIBUT"][attr]["NR"] +=1
  937. data[key] = jdata
  938. labels[key] = label
  939. return data,labels
  940. def backup_patch(self):
  941. filename = "patch"
  942. data = self.fixtures
  943. labels = {}
  944. for k in data:
  945. labels[k] = k
  946. self._backup(filename,data,labels)
  947. def backup_presets(self):
  948. filename = "presets"
  949. data = self.val_presets
  950. labels = self.label_presets
  951. self._backup(filename,data,labels)
  952. def _backup(self,filename,data,labels):
  953. #fixture
  954. xfname = "show/"+show_name+"/"+str(filename)+".sav"
  955. print("backup",xfname)
  956. f = open(xfname,"w")
  957. for key in data:
  958. line = data[key]
  959. print(line)
  960. label = "label"
  961. if key in labels:
  962. label = labels[key]
  963. if label == "Name-"+str(key):
  964. label = ""
  965. print(xfname,"load",key,label,len(line))
  966. f.write( "{}\t{}\t{}\n".format( key,label,json.dumps(line) ) )
  967. f.close()
  968. def draw_dim(self,fix,data,c=0,r=0,frame=None):
  969. i=0
  970. if frame is None:
  971. frame = tk.Frame(root,bg="black")
  972. frame.pack(fill=tk.X, side=tk.TOP)
  973. #b = tk.Button(frame,bg="lightblue", text="FIX:"+str(fix)+" "+data["NAME"],width=20)
  974. #b.bind("<Button>",Xevent(fix=fix,elem=b).cb)
  975. #b.grid(row=r, column=c, sticky=tk.W+tk.E)
  976. #c+=1
  977. #r+=1
  978. if fix not in self.elem_attr:
  979. self.elem_attr[fix] = {}
  980. for attr in data["ATTRIBUT"]:
  981. if attr not in self.all_attr:
  982. self.all_attr.append(attr)
  983. if attr not in self.elem_attr[fix]:
  984. self.elem_attr[fix][attr] = []
  985. if attr.endswith("-FINE"):
  986. continue
  987. v= data["ATTRIBUT"][attr]["VALUE"]
  988. b = tk.Button(frame,bg="lightblue", text=""+str(fix)+" "+data["NAME"],width=4)
  989. #b.bind("<Button>",Xevent(fix=fix,elem=b).cb)
  990. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  991. c+=1
  992. b = tk.Button(frame,bg="grey", text=str(attr)+' '+str(round(v,2)),width=6)
  993. self.elem_attr[fix][attr] = b
  994. b.bind("<Button>",Xevent(fix=fix,elem=b,attr=attr,data=data).cb)
  995. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  996. c+=1
  997. if c >=12:
  998. c=0
  999. r+=1
  1000. return c,r
  1001. def draw_fix(self,fix,data):
  1002. i=0
  1003. c=0
  1004. r=0
  1005. frame = tk.Frame(frame_fix,bg="black")
  1006. frame.pack(fill=tk.X, side=tk.TOP)
  1007. b = tk.Button(frame,bg="lightblue", text="FIX:"+str(fix)+" "+data["NAME"],width=20)
  1008. b.bind("<Button>",Xevent(fix=fix,elem=b).cb)
  1009. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1010. c+=1
  1011. #r+=1
  1012. if fix not in self.elem_attr:
  1013. self.elem_attr[fix] = {}
  1014. for attr in data["ATTRIBUT"]:
  1015. if attr not in self.all_attr:
  1016. self.all_attr.append(attr)
  1017. if attr not in self.elem_attr[fix]:
  1018. self.elem_attr[fix][attr] = []
  1019. if attr.endswith("-FINE"):
  1020. continue
  1021. v= data["ATTRIBUT"][attr]["VALUE"]
  1022. b = tk.Button(frame,bg="grey", text=str(attr)+' '+str(round(v,2)),width=8)
  1023. self.elem_attr[fix][attr] = b
  1024. b.bind("<Button>",Xevent(fix=fix,elem=b,attr=attr,data=data).cb)
  1025. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1026. c+=1
  1027. if c >=8:
  1028. c=1
  1029. r+=1
  1030. def draw_enc(self):
  1031. i=0
  1032. c=0
  1033. r=0
  1034. #frame = tk.Frame(root,bg="black")
  1035. #frame.pack(fill=tk.X, side=tk.TOP)
  1036. #b = tk.Label(frame,bg="black", text="--------------------------------------- ---------------------------------------")
  1037. #b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1038. #r=0
  1039. frame = tk.Frame(root2,bg="black")
  1040. frame.pack(fill=tk.X, side=tk.TOP)
  1041. b = tk.Button(frame,bg="lightblue", text="ENCODER",width=6)
  1042. #b.bind("<Button>",Xevent(fix=fix,elem=b).cb)
  1043. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1044. #r+=1
  1045. c+=1
  1046. for attr in self.all_attr:
  1047. if attr.endswith("-FINE"):
  1048. continue
  1049. v=0
  1050. b = tk.Button(frame,bg="orange", text=str(attr)+'',width=6)
  1051. b.bind("<Button>",Xevent(fix=0,elem=b,attr=attr,data=self,mode="ENCODER").cb)
  1052. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1053. c+=1
  1054. if c >=7:
  1055. c=0
  1056. r+=1
  1057. def draw_command(self):
  1058. i=0
  1059. c=0
  1060. r=0
  1061. #frame = tk.Frame(root,bg="black")
  1062. #frame.pack(fill=tk.X, side=tk.TOP)
  1063. #b = tk.Label(frame,bg="black", text="--------------------------------------- ---------------------------------------")
  1064. #b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1065. #r=0
  1066. frame = tk.Frame(root2,bg="black")
  1067. frame.pack(fill=tk.X, side=tk.TOP)
  1068. b = tk.Button(frame,bg="lightblue", text="COMM.",width=6)
  1069. #b.bind("<Button>",Xevent(fix=fix,elem=b).cb)
  1070. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1071. #r+=1
  1072. c+=1
  1073. for comm in self.commands:
  1074. v=0
  1075. b = tk.Button(frame,bg="lightgrey", text=str(comm),width=6)
  1076. if comm not in self.elem_commands:
  1077. self.elem_commands[comm] = b
  1078. self.val_commands[comm] = 0
  1079. b.bind("<Button>",Xevent(fix=0,elem=b,attr=comm,data=self,mode="COMMAND").cb)
  1080. if comm == "BLIND":
  1081. b["bg"] = "grey"
  1082. if comm == "CLEAR":
  1083. b["bg"] = "grey"
  1084. if comm == "STONY_FX":
  1085. b["bg"] = "grey"
  1086. if comm == "FADE":
  1087. b["bg"] = "green"
  1088. if comm == "FX OFF":
  1089. b["bg"] = "magenta"
  1090. if comm == "SZ:":
  1091. b["text"] = "SZ:{:0.0f}".format(fx_prm["SIZE"])
  1092. if comm == "SP:":
  1093. b["text"] = "SP:{:0.0f}".format(fx_prm["SPEED"])
  1094. if comm == "OF:":
  1095. b["text"] = "OF:{:0.0f}".format(fx_prm["OFFSET"])
  1096. if comm:
  1097. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1098. c+=1
  1099. if c >=6:
  1100. c=0
  1101. r+=1
  1102. def draw_preset(self):
  1103. i=0
  1104. c=0
  1105. r=0
  1106. frame = tk.Frame(root,bg="black")
  1107. frame.pack(fill=tk.X, side=tk.TOP)
  1108. b = tk.Label(frame,bg="black", text="--------------------------------------- ---------------------------------------")
  1109. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1110. r=0
  1111. frame = tk.Frame(root,bg="black")
  1112. frame.pack(fill=tk.X, side=tk.TOP)
  1113. b = tk.Button(frame,bg="lightblue", text="EXEC")
  1114. #b.bind("<Button>",Xevent(elem=b).cb)
  1115. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1116. r+=1
  1117. for k in self.val_presets:
  1118. v=0
  1119. label = ""
  1120. if k in self.label_presets:
  1121. label = self.label_presets[k]
  1122. print([label])
  1123. sdata=self.val_presets[k]
  1124. BTN="go"
  1125. if "CFG" in sdata:#["BUTTON"] = "GO"
  1126. if "BUTTON" in sdata["CFG"]:
  1127. BTN = sdata["CFG"]["BUTTON"]
  1128. txt=str(k)+":"+str(BTN)+":"+str(len(sdata)-1)+"\n"+label
  1129. b = tk.Button(frame,bg="grey", text=txt,width=8,height=2)
  1130. b.bind("<Button>",Xevent(fix=0,elem=b,attr=k,data=self,mode="PRESET").cb)
  1131. b.bind("<ButtonRelease>",Xevent(fix=0,elem=b,attr=k,data=self,mode="PRESET").cb)
  1132. if k in self.val_presets and len(self.val_presets[k]) :
  1133. b["bg"] = "yellow"
  1134. sdata = self.val_presets[k]
  1135. if len(sdata) > 1:
  1136. fx_color = 0
  1137. val_color = 0
  1138. for fix in sdata:
  1139. if fix == "CFG":
  1140. continue
  1141. print( "$$$$",fix,sdata[fix])
  1142. for attr in sdata[fix]:
  1143. if "FX" in sdata[fix][attr]:
  1144. if sdata[fix][attr]["FX"]:
  1145. fx_color = 1
  1146. if "VALUE" in sdata[fix][attr]:
  1147. if sdata[fix][attr]["VALUE"] is not None:
  1148. val_color = 1
  1149. b["fg"] = "black"
  1150. if val_color:
  1151. b["bg"] = "gold"
  1152. if fx_color:
  1153. b["fg"] = "blue"
  1154. else:
  1155. if fx_color:
  1156. b["bg"] = "cyan"
  1157. else:
  1158. b["bg"] = "grey"
  1159. if k not in self.elem_presets:
  1160. self.elem_presets[k] = b
  1161. #self.val_presets[preset] = 0
  1162. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1163. c+=1
  1164. if c >=8:
  1165. c=0
  1166. r+=1
  1167. def draw_input(self):
  1168. i=0
  1169. c=0
  1170. r=0
  1171. frame = tk.Frame(root2,bg="black")
  1172. frame.pack(fill=tk.X, side=tk.TOP)
  1173. b = tk.Label(frame,bg="black", text="--------------------------------------- ---------------------------------------")
  1174. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1175. r=0
  1176. frame = tk.Frame(root2,bg="black")
  1177. frame.pack(fill=tk.X, side=tk.TOP)
  1178. b = tk.Label(frame, text="send:")
  1179. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1180. c+=1
  1181. b = tk.Entry(frame,bg="grey", text="",width=50)
  1182. self.entry = b
  1183. b.bind("<Button>",Xevent(fix=0,elem=b,attr="INPUT",data=self,mode="INPUT").cb)
  1184. b.bind("<Key>",Xevent(fix=0,elem=b,attr="INPUT",data=self,mode="INPUT").cb)
  1185. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1186. b.insert("end","d0:127,fx241:sinus:50:50:10,fx243:cosinus:50:50:10,d201:127,fx201:sinus:50:300:10")
  1187. r+=1
  1188. b = tk.Entry(frame,bg="grey", text="",width=20)
  1189. self.entry2 = b
  1190. b.bind("<Button>",Xevent(fix=0,elem=b,attr="INPUT",data=self,mode="INPUT2").cb)
  1191. b.bind("<Key>",Xevent(fix=0,elem=b,attr="INPUT",data=self,mode="INPUT2").cb)
  1192. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1193. b.insert("end","d1:0:4")
  1194. r+=1
  1195. b = tk.Entry(frame,bg="grey", text="",width=20)
  1196. self.entry3 = b
  1197. b.bind("<Button>",Xevent(fix=0,elem=b,attr="INPUT",data=self,mode="INPUT3").cb)
  1198. b.bind("<Key>",Xevent(fix=0,elem=b,attr="INPUT",data=self,mode="INPUT3").cb)
  1199. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1200. b.insert("end","fx:alloff:::")
  1201. def render(self):
  1202. r=0
  1203. c=0
  1204. Xroot.bind("<Key>",Xevent(fix=0,elem=None,attr="ROOT",data=self,mode="ROOT").cb)
  1205. dim_frame = tk.Frame(frame_fix,bg="black")
  1206. dim_frame.pack(fill=tk.X, side=tk.TOP)
  1207. for fix in self.fixtures:
  1208. data = self.fixtures[fix]
  1209. print( fix )
  1210. if(len(data["ATTRIBUT"].keys()) <= 1):
  1211. c,r=self.draw_dim(fix,data,c=c,r=r,frame=dim_frame)
  1212. else:
  1213. self.draw_fix(fix,data)
  1214. self.draw_enc()
  1215. self.draw_command()
  1216. self.draw_input()
  1217. self.draw_preset()
  1218. try:
  1219. master =Master()
  1220. master.render()
  1221. root.mainloop()
  1222. finally:
  1223. master.exit()