Editor3.py 52 KB

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