Editor3.py 56 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564
  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 random
  18. rnd_id = random.randint(1000,9000)
  19. try:
  20. xtitle = __file__
  21. except:
  22. xtitle = "__file__"
  23. if "/" in xtitle:
  24. xtitle = xtitle.split("/")[-1]
  25. import sys
  26. sys.stdout.write("\x1b]2;"+str(xtitle)+" "+str(rnd_id)+"\x07") # terminal title
  27. import json
  28. import time
  29. import sys
  30. import _thread as thread
  31. import traceback
  32. import tkinter
  33. import tkinter as tk
  34. from tkinter import font
  35. import lib.chat as chat
  36. import lib.motion as motion
  37. from collections import OrderedDict
  38. show_name = "GloryCamp2021"
  39. show_name = "GloryCamp2021"
  40. #show_name = "Dimmer"
  41. CUES = OrderedDict()
  42. groups = OrderedDict()
  43. BLIND = 0
  44. STORE = 0
  45. FLASH = 0
  46. STONY_FX = 0
  47. LABEL = 0
  48. SELECT = 0
  49. ACTIVATE = 0
  50. CFG_BTN = 0
  51. POS = ["PAN","TILT","MOTION"]
  52. COLOR = ["RED","GREEN","BLUE","COLOR"]
  53. BEAM = ["GOBO","G-ROT","PRISMA","P-ROT","FOCUS","SPEED"]
  54. INT = ["DIM","SHUTTER","STROBE","FUNC"]
  55. client = chat.tcp_sender()
  56. fade = 2 #2 #0.1 #1.13
  57. fade_on = 1
  58. fx_prm = {"SIZE":20,"SPEED":100,"OFFSET":50}
  59. def build_cmd(dmx,val,args=[fade],flash=0,xpfx="",attr=""):
  60. cmd=""
  61. if xpfx:
  62. pfx=xpfx
  63. elif flash:
  64. pfx ="df"
  65. else:
  66. pfx ="d"
  67. if type(val) is float or type(val) is int:
  68. cmd += ",{}{}:{:0.4f}".format(pfx,dmx,val)
  69. else:
  70. cmd += ",{}{}:{}".format(pfx,dmx,val)
  71. if flash:
  72. cmd += ":0:0"#.format(val)
  73. else:
  74. for val in args:
  75. if type(val) is float or type(val) is int:
  76. cmd += ":{:0.4f}".format(val)
  77. else:
  78. cmd += ":{}".format(val)
  79. if attr:
  80. cmd += ":"+str(attr)
  81. return cmd
  82. def update_raw_dmx(data ,value=None,args=[fade],flash=0,pfx="d",fx=0):
  83. cmd = []
  84. if flash:
  85. pfx += "f"
  86. for row in data:
  87. if fx:
  88. if value is not None:
  89. # z.b. flush off
  90. xcmd = str(value)+":"+row["FX"].split(":",1)[-1]
  91. else:
  92. xcmd = row["FX"]
  93. else:
  94. if row["VALUE"] is None:
  95. xcmd = ""
  96. else:
  97. if value is not None:
  98. if type(value) is float:
  99. xcmd = "{:0.4f}".format(value)
  100. else:
  101. xcmd = "{}".format(value)
  102. else:
  103. xcmd = "{:0.4f}".format(row["VALUE"])
  104. for arg in args:
  105. if type(arg) is float:
  106. xcmd += ":{}".format(arg)
  107. else:
  108. xcmd += ":{:0.4f}".format(arg)
  109. #print( "pack: FIX",row["FIX"],row["ATTR"], xcmd)
  110. #xcmd += ":{}".format(row["ATTR"])
  111. cmd.append( xcmd)
  112. return cmd
  113. def update_dmx(attr,data,value=None,args=[fade],flash=0,pfx=""):
  114. global BLIND
  115. dmx = data["DMX"]
  116. val = None
  117. cmd=""
  118. try:
  119. if attr == "DIM" and data["ATTRIBUT"][attr]["NR"] < 0: #VDIM
  120. #print( "VDIM")
  121. for attr in data["ATTRIBUT"]:
  122. dmx = data["DMX"]
  123. if data["ATTRIBUT"][attr]["NR"] < 0: #virtual channels
  124. continue
  125. dmx += data["ATTRIBUT"][attr]["NR"]-1
  126. mode = ""
  127. if "MODE" in data["ATTRIBUT"][attr]:
  128. mode = data["ATTRIBUT"][attr]["MODE"]
  129. #print(attr)
  130. val = data["ATTRIBUT"][attr]["VALUE"]
  131. if data["ATTRIBUT"][attr]["MASTER"]:
  132. val = val * (data["ATTRIBUT"]["DIM"]["VALUE"] / 255.)
  133. if val is not None:
  134. #cmd += ",d{}:{:0.4f}".format(dmx,int(val))
  135. if value is not None:
  136. val = value
  137. if mode == "F": #FADE
  138. cmd += build_cmd(dmx,val,args=args,flash=flash,xpfx=pfx,attr=attr)
  139. else:
  140. cmd += build_cmd(dmx,val,args=[0],flash=flash,xpfx=pfx,attr=attr)
  141. #print("cmd",cmd)
  142. elif data["ATTRIBUT"][attr]["NR"] > 0:
  143. dmx += data["ATTRIBUT"][attr]["NR"]-1
  144. val = data["ATTRIBUT"][attr]["VALUE"]
  145. mode = ""
  146. if "MODE" in data["ATTRIBUT"][attr]:
  147. mode = data["ATTRIBUT"][attr]["MODE"]
  148. if data["ATTRIBUT"][attr]["MASTER"]:
  149. #if "VDIM" in data["ATTRIBUT"]:
  150. if "DIM" in data["ATTRIBUT"] and data["ATTRIBUT"]["DIM"]["NR"] < 0: #VDIM
  151. val = val * (data["ATTRIBUT"]["DIM"]["VALUE"] / 255.)
  152. if val is not None:
  153. #cmd += ",d{}:{}".format(dmx,int(val))
  154. if value is not None:
  155. val = value
  156. if mode == "F": #FADE
  157. cmd += build_cmd(dmx,val,args=args,flash=flash,xpfx=pfx,attr=attr)
  158. else:
  159. cmd += build_cmd(dmx,val,args=[0],flash=flash,xpfx=pfx,attr=attr)
  160. #print("cmd",cmd)
  161. if BLIND:
  162. cmd=""
  163. return cmd
  164. except Exception as e:
  165. print("== cb EXCEPT",e)
  166. print("Error on line {}".format(sys.exc_info()[-1].tb_lineno))
  167. raise e
  168. class dummy_event():
  169. def __init__(self):
  170. self.num =0
  171. class Xevent():
  172. def __init__(self,fix,elem,attr=None,data=None,mode=None):
  173. self.data=data
  174. self.attr = attr
  175. self.elem = elem
  176. self.mode = mode
  177. def encoder(self,fix,attr,data,elem,action=""):
  178. if action == "click":
  179. if self.data["ATTRIBUT"][attr]["ACTIVE"]:
  180. self.data["ATTRIBUT"][attr]["ACTIVE"] = 0
  181. self.elem["bg"] = "grey"
  182. else:
  183. self.data["ATTRIBUT"][attr]["ACTIVE"] = 1
  184. self.elem["bg"] = "yellow"
  185. return 1
  186. v2=data["ATTRIBUT"][attr]["VALUE"]
  187. change=0
  188. increment = 4.11
  189. if action == "+":
  190. v2+= increment
  191. v = "+{:0.4f}".format( increment ) #) #4.11"
  192. change=1
  193. elif action == "-":
  194. v2-= 4.11
  195. v = "-{:0.4f}".format( increment ) #) #4.11"
  196. change=1
  197. if v2 < 0:
  198. v2=0
  199. elif v2 > 256:
  200. v2=256
  201. if change:
  202. data["ATTRIBUT"][attr]["ACTIVE"] = 1
  203. elem["bg"] = "yellow"
  204. #v2 = v
  205. #v = data["ATTRIBUT"][attr]["VALUE"]
  206. data["ATTRIBUT"][attr]["VALUE"] = v2
  207. elem["text"] = "{} {:0.2f}".format(attr,v2)
  208. #worker.fade_dmx(fix,attr,data,v,v2,ft=0)
  209. cmd=update_dmx(attr=attr,data=data,args=[0])
  210. #data["ATTRIBUT"][attr]["VALUE"] = v2
  211. if cmd and not BLIND:
  212. client.send(cmd)
  213. def cb(self,event):
  214. #print("cb",self,event,data)
  215. print("cb",self.attr,self.mode,event)
  216. #print(dir(event),[str(event.type)])#.keys())
  217. try:
  218. #v = self.data["ATTRIBUT"][self.attr]
  219. global STORE
  220. global BLIND
  221. global FLASH
  222. global STONY_FX
  223. global LABEL
  224. global SELECT
  225. global ACTIVATE
  226. global CFG_BTN
  227. change = 0
  228. if self.mode == "COMMAND":
  229. if self.attr == "CLEAR":
  230. if event.num == 1:
  231. if STORE:
  232. self.data.val_commands["STORE"] = 0
  233. STORE = 0
  234. self.data.elem_commands["STORE"]["bg"] = "grey"
  235. else:
  236. for fix in self.data.FIXTURES.fixtures:
  237. print( "clr",fix)
  238. data = self.data.FIXTURES.fixtures[fix]
  239. #print("elm",self.data.elem_attr[fix])
  240. for attr in data["ATTRIBUT"]:
  241. if attr.endswith("-FINE"):
  242. continue
  243. self.data.elem_attr[fix][attr]["bg"] = "grey"
  244. data["ATTRIBUT"][attr]["ACTIVE"] = 0
  245. #print(data["ATTRIBUT"])
  246. print( "CB CLEAR" )
  247. if self.attr.startswith("SZ:"):#SIN":
  248. #global fx_prm
  249. k = "SIZE"
  250. if event.num == 1:
  251. pass
  252. elif event.num == 2:
  253. pass
  254. elif event.num == 4:
  255. if fx_prm[k] <= 0:
  256. fx_prm[k] = 1
  257. fx_prm[k] *=1.2
  258. elif event.num == 5:
  259. fx_prm[k] /=1.2
  260. #fx_prm[k] =int(fx_prm[k])
  261. if fx_prm[k] > 4000:
  262. fx_prm[k] = 4000
  263. if fx_prm[k] < 0:
  264. fx_prm[k] =0
  265. self.data.elem_commands[self.attr]["text"] = "SZ:{:0.0f}".format(fx_prm[k])
  266. if self.attr.startswith("SP:"):#SIN":
  267. #global fx_prm
  268. k = "SPEED"
  269. if event.num == 1:
  270. pass
  271. elif event.num == 2:
  272. pass
  273. elif event.num == 4:
  274. if fx_prm[k] <= 0:
  275. fx_prm[k] = 1
  276. fx_prm[k] *=1.2
  277. elif event.num == 5:
  278. fx_prm[k] /=1.2
  279. #fx_prm[k] =int(fx_prm[k])
  280. if fx_prm[k] > 4000:
  281. fx_prm[k] = 4000
  282. if fx_prm[k] < 0:
  283. fx_prm[k] =0
  284. self.data.elem_commands[self.attr]["text"] = "SP:{:0.0f}".format(fx_prm[k])
  285. if self.attr.startswith("OF:"):#SIN":
  286. #global fx_prm
  287. k = "OFFSET"
  288. if event.num == 1:
  289. pass
  290. elif event.num == 2:
  291. pass
  292. elif event.num == 4:
  293. if fx_prm[k] <= 0:
  294. fx_prm[k] = 1
  295. fx_prm[k] *=1.2
  296. elif event.num == 5:
  297. fx_prm[k] /=1.2
  298. #fx_prm[k] =int(fx_prm[k])
  299. if fx_prm[k] > 1024:
  300. fx_prm[k] = 1024
  301. if fx_prm[k] < 0:
  302. fx_prm[k] =0
  303. self.data.elem_commands[self.attr]["text"] = "OF:{:0.0f}".format(fx_prm[k])
  304. if self.attr.startswith("FX:"):#SIN":
  305. if event.num == 1:
  306. cmd = ""
  307. offset = 0
  308. for fix in self.data.FIXTURES.fixtures:
  309. data = self.data.FIXTURES.fixtures[fix]
  310. #print( "ADD FX",fix)
  311. for attr in data["ATTRIBUT"]:
  312. if attr.endswith("-FINE"):
  313. continue
  314. fx=""
  315. if "SIN" in self.attr:
  316. fx = "sinus"
  317. elif "FD" in self.attr:
  318. fx = "fade"
  319. elif "ON2-" in self.attr:
  320. fx = "on2-"
  321. elif "ON-" in self.attr:
  322. fx = "on-"
  323. elif "ON2" in self.attr:
  324. fx = "on2"
  325. elif "ON" in self.attr:
  326. fx = "on"
  327. elif "BUM-" in self.attr:
  328. fx = "bump-"
  329. elif "BUM" in self.attr:
  330. fx = "bump"
  331. elif "COS" in self.attr:
  332. fx = "cosinus"
  333. if fx:
  334. fx += ":{:0.0f}:{:0.0f}:{:0.0f}".format(fx_prm["SIZE"],fx_prm["SPEED"],offset)#fx_prm["OFFSET"])
  335. else:
  336. if "CIR" in self.attr:
  337. if attr == "PAN":
  338. fx = "cosinus:{:0.0f}:{:0.0f}:{:0.0f}".format(fx_prm["SIZE"],fx_prm["SPEED"],offset)#fx_prm["OFFSET"])
  339. if attr == "TILT":
  340. fx = "sinus:{:0.0f}:{:0.0f}:{:0.0f}".format(fx_prm["SIZE"],fx_prm["SPEED"],offset)#fx_prm["OFFSET"])
  341. if "FX" not in data["ATTRIBUT"][attr]:
  342. data["ATTRIBUT"][attr]["FX"] =""
  343. print("ADD FX",fix,attr,fx,data["ATTRIBUT"][attr]["ACTIVE"])
  344. if data["ATTRIBUT"][attr]["ACTIVE"]:
  345. print("++ADD FX",fix,attr,fx)
  346. data["ATTRIBUT"][attr]["FX"] = fx #"sinus:40:100:10"
  347. cmd+=update_dmx(attr,data,pfx="fx",value=fx)#,flash=FLASH)
  348. if fx_prm["OFFSET"] > 0.5:
  349. offset += fx_prm["OFFSET"] # add offset on next fixture
  350. #print("offset",offset)
  351. if cmd and not BLIND:
  352. client.send(cmd)
  353. elif self.attr == "FX OFF":
  354. if event.num == 1:
  355. client.send("fx0:alloff:,fxf:alloff:")
  356. self.data.elem_commands[self.attr]["bg"] = "magenta"
  357. for fix in self.data.FIXTURES.fixtures:
  358. data = self.data.FIXTURES.fixtures[fix]
  359. for attr in data["ATTRIBUT"]:
  360. data["ATTRIBUT"][attr]["FX"] = ""
  361. elif self.attr == "FLASH":
  362. if event.num == 1:
  363. if FLASH:
  364. FLASH = 0
  365. self.data.elem_commands[self.attr]["bg"] = "grey"
  366. else:
  367. FLASH = 1
  368. self.data.elem_commands[self.attr]["bg"] = "green"
  369. elif self.attr == "BLIND":
  370. if event.num == 1:
  371. if self.data.val_commands[self.attr]:
  372. self.data.val_commands[self.attr] = 0
  373. BLIND = 0
  374. self.data.elem_commands[self.attr]["bg"] = "grey"
  375. else:
  376. self.data.val_commands[self.attr] = 1
  377. BLIND = 1
  378. self.data.elem_commands[self.attr]["bg"] = "red"
  379. print("BLIND",self.data.val_commands)
  380. elif self.attr == "FADE":
  381. global fade
  382. global fade_on
  383. if fade < 0.01:
  384. fade = 0.01
  385. elif fade > 100.0:
  386. fade = 100
  387. if event.num == 4:
  388. fade *= 1.1
  389. elif event.num == 5:
  390. fade /= 1.1
  391. elif event.num == 1:
  392. if fade_on:
  393. fade_on = 0
  394. self.data.elem_commands[self.attr]["bg"] = "grey"
  395. else:
  396. fade_on = 1
  397. self.data.elem_commands[self.attr]["bg"] = "green"
  398. elif event.num == 2:
  399. if fade > 1 and fade < 4:
  400. fade = 4
  401. elif fade > 3 and fade < 6:
  402. fade = 6
  403. elif fade > 5 and fade < 7:
  404. fade = 8
  405. elif fade > 7 and fade < 9:
  406. fade = 10
  407. elif fade > 9:
  408. fade = 0.01
  409. elif fade < 1:
  410. fade = 1.1
  411. self.data.elem_commands[self.attr]["text"] = "Fade{:0.2f}".format(fade)
  412. elif self.attr == "CFG-BTN":
  413. global CFG_BTN
  414. if event.num == 1:
  415. if CFG_BTN:
  416. CFG_BTN = 0
  417. self.data.elem_commands[self.attr]["bg"] = "lightgrey"
  418. else:
  419. CFG_BTN = 1
  420. self.data.elem_commands[self.attr]["bg"] = "red"
  421. elif self.attr == "ACTIVATE":
  422. global ACTIVATE
  423. if event.num == 1:
  424. if ACTIVATE:
  425. ACTIVATE = 0
  426. self.data.elem_commands[self.attr]["bg"] = "lightgrey"
  427. else:
  428. ACTIVATE = 1
  429. self.data.elem_commands[self.attr]["bg"] = "red"
  430. elif self.attr == "SELECT":
  431. global SELECT
  432. #global CFG_BTN
  433. if event.num == 1:
  434. if SELECT:
  435. SELECT = 0
  436. self.data.elem_commands[self.attr]["bg"] = "lightgrey"
  437. else:
  438. SELECT = 1
  439. self.data.elem_commands[self.attr]["bg"] = "red"
  440. elif self.attr == "LABEL":
  441. global LABEL
  442. #global CFG_BTN
  443. if event.num == 1:
  444. if LABEL:
  445. LABEL = 0
  446. self.data.elem_commands[self.attr]["bg"] = "lightgrey"
  447. else:
  448. LABEL = 1
  449. self.data.elem_commands[self.attr]["bg"] = "red"
  450. elif self.attr == "STONY_FX":
  451. if event.num == 1:
  452. if STONY_FX:
  453. STONY_FX = 0
  454. self.data.elem_commands[self.attr]["bg"] = "grey"
  455. else:
  456. STONY_FX = 1
  457. self.data.elem_commands[self.attr]["bg"] = "red"
  458. elif self.attr == "STORE":
  459. if event.num == 1:
  460. if self.data.val_commands[self.attr]:
  461. self.data.val_commands[self.attr] = 0
  462. STORE = 0
  463. self.data.elem_commands[self.attr]["bg"] = "lightgrey"
  464. else:
  465. self.data.val_commands[self.attr] = 1
  466. STORE = 1
  467. self.data.elem_commands[self.attr]["bg"] = "red"
  468. print("BLIND",self.data.val_commands)
  469. elif self.attr == "BACKUP":
  470. self.data.PRESETS.backup_presets()
  471. self.data.FIXTURES.backup_patch()
  472. return 0
  473. elif self.mode == "ROOT":
  474. if event.keysym=="Escape":
  475. pass
  476. #STORE = 0
  477. #LABEL = 0
  478. elif self.mode == "INPUT":
  479. print("INP",self.data.entry.get())
  480. if event.keycode == 36:
  481. x=self.data.entry.get()
  482. client.send(x)
  483. #self.data.entry.clean()
  484. #self.data
  485. #chat.send("")
  486. elif self.mode == "INPUT2":
  487. print("INP2",self.data.entry2.get())
  488. if event.keycode == 36:
  489. x=self.data.entry2.get()
  490. client.send(x)
  491. #self.data.entry.clean()
  492. elif self.mode == "INPUT3":
  493. print("INP3",self.data.entry3.get())
  494. if event.keycode == 36:
  495. x=self.data.entry3.get()
  496. client.send(x)
  497. #self.data.entry.clean()
  498. #self.data
  499. #chat.send("")
  500. elif self.mode == "PRESET":
  501. nr = self.attr #int(self.attr.split(":")[1])-1
  502. if event.num == 1:
  503. if STORE:
  504. self.data.preset_store(nr)
  505. elif CFG_BTN:
  506. import tkinter.simpledialog
  507. txt = tkinter.simpledialog.askstring("CFG-BTN","GO,FLASH,TOGGLE,SWOP\n EXE:"+str(nr))
  508. if "CFG" not in self.data.PRESETS.val_presets[nr]:
  509. self.data.PRESETS.val_presets[nr]["CFG"] = OrderedDict()
  510. if "BUTTON" not in self.data.PRESETS.val_presets[nr]["CFG"]:
  511. self.data.PRESETS.val_presets[nr]["CFG"]["BUTTON"] = ""
  512. self.data.PRESETS.val_presets[nr]["CFG"]["BUTTON"] = txt
  513. sdata=self.data.PRESETS.val_presets[nr]
  514. BTN="go"
  515. if "CFG" in sdata:#["BUTTON"] = "GO"
  516. if "BUTTON" in sdata["CFG"]:
  517. BTN = sdata["CFG"]["BUTTON"]
  518. label = self.data.PRESETS.label_presets[nr] # = label
  519. txt=str(nr)+":"+str(BTN)+":"+str(len(sdata)-1)+"\n"+label
  520. self.data.elem_presets[nr]["text"] = txt
  521. CFG_BTN = 0
  522. self.data.elem_commands["CFG-BTN"]["bg"] = "grey"
  523. elif LABEL:#else:
  524. label = "lalaal"
  525. import tkinter.simpledialog
  526. label = tkinter.simpledialog.askstring("LABEL","Preset "+str(nr))
  527. self.data.elem_presets[nr]["text"] = label
  528. self.data.PRESETS.label_presets[nr] = label
  529. sdata=self.data.PRESETS.val_presets[nr]
  530. BTN="go"
  531. if "CFG" in sdata:#["BUTTON"] = "GO"
  532. if "BUTTON" in sdata["CFG"]:
  533. BTN = sdata["CFG"]["BUTTON"]
  534. txt=str(nr)+":"+str(BTN)+":"+str(len(sdata)-1)+"\n"+label
  535. #txt = "Preset:"+str(nr)+":\n"+str(len(l))+":"+label
  536. self.data.elem_presets[nr]["text"] = txt
  537. LABEL = 0
  538. self.data.elem_commands["LABEL"]["bg"] = "lightgrey"
  539. elif ACTIVATE:
  540. self.data.preset_select(nr)
  541. self.data.preset_go(nr,xfade=0,event=event)
  542. ACTIVATE = 0
  543. self.data.elem_commands["ACTIVATE"]["bg"] = "lightgrey"
  544. elif SELECT:
  545. self.data.preset_select(nr)
  546. else:
  547. self.data.preset_go(nr,event=event)
  548. if event.num == 3:
  549. if not STORE:
  550. self.data.preset_go(nr,xfade=0,event=event)
  551. return 0
  552. elif self.mode == "INPUT":
  553. return 0
  554. if self.mode == "ENCODER":
  555. #if self.attr == "VDIM":
  556. # self.attr = "DIM"
  557. for fix in self.data.FIXTURES.fixtures:
  558. data = self.data.FIXTURES.fixtures[fix]
  559. for attr in data["ATTRIBUT"]:
  560. if attr.endswith("-FINE"):
  561. continue
  562. elem = self.data.elem_attr[fix][attr]
  563. if self.attr != attr:
  564. continue
  565. if event.num == 1:
  566. #self#encoder(attr=attr,data=data,elem=elem,action="click")
  567. data["ATTRIBUT"][attr]["ACTIVE"] = 1
  568. elem["bg"] = "yellow"
  569. if "FX" in data["ATTRIBUT"][attr]:#["FX"]:# = 1
  570. if data["ATTRIBUT"][attr]["FX"]:# = 1
  571. elem["fg"] = "blue"
  572. else:
  573. elem["fg"] = "blue"
  574. elem["fg"] = "black"
  575. if not data["ATTRIBUT"][attr]["ACTIVE"]:
  576. continue
  577. if event.num == 4:
  578. self.encoder(fix=fix,attr=attr,data=data,elem=elem,action="+")
  579. #if attr == "DIM":
  580. # self.encoder(attr="VDIM",data=data,elem=elem,action="+")
  581. elif event.num == 5:
  582. self.encoder(fix=fix,attr=attr,data=data,elem=elem,action="-")
  583. #if attr == "DIM":
  584. # self.encoder(attr="VDIM",data=data,elem=elem,action="-")
  585. return 0
  586. if event.num == 1:
  587. self.encoder(fix=0,attr=self.attr,data=self.data,elem=self.elem,action="click")
  588. elif event.num == 4:
  589. self.encoder(fix=0,attr=self.attr,data=self.data,elem=self.elem,action="+")
  590. elif event.num == 5:
  591. self.encoder(fix=0,attr=self.attr,data=self.data,elem=self.elem,action="-")
  592. #finally:
  593. # pass
  594. except Exception as e:
  595. print("== cb EXCEPT",e)
  596. print("Error on line {}".format(sys.exc_info()[-1].tb_lineno))
  597. traceback.print_exc()
  598. #print(self.elem["text"],self.attr,self.data)
  599. def wheel(event,d=None):
  600. print("wheel",event,d)
  601. import copy
  602. class Element():
  603. def __init__(self):
  604. self.__data = {}
  605. def set(self,key,val):
  606. self.__data[key] = val
  607. class Base():
  608. def __init__(self):
  609. pass
  610. def _load(self,filename):
  611. xfname = "show/"+show_name+"/"+str(filename)+".sav"
  612. print("load",xfname)
  613. f = open(xfname,"r")
  614. lines = f.readlines()
  615. f.close()
  616. data = OrderedDict()
  617. labels = OrderedDict()
  618. for line in lines:
  619. key,label,rdata = line.split("\t",2)
  620. key = int(key)
  621. #print(xfname,"load",key,label)
  622. #print(line)
  623. jdata = json.loads(rdata,object_pairs_hook=OrderedDict)
  624. nrnull = 0
  625. if "ATTRIBUT" in jdata: # translate old FIXTURES.fixtures start with 0 to 1
  626. for attr in jdata["ATTRIBUT"]:
  627. if "NR" in jdata["ATTRIBUT"][attr]:
  628. nr = jdata["ATTRIBUT"][attr]["NR"]
  629. if nr == 0:
  630. nrnull = 1
  631. break
  632. if nrnull:
  633. print("DMX NR IS NULL",attr,"CHANGE +1")
  634. for attr in jdata["ATTRIBUT"]:
  635. if "NR" in jdata["ATTRIBUT"][attr]:
  636. nr = jdata["ATTRIBUT"][attr]["NR"]
  637. if nr >= 0:
  638. jdata["ATTRIBUT"][attr]["NR"] +=1
  639. data[key] = jdata
  640. labels[key] = label
  641. return data,labels
  642. def _backup(self,filename,data,labels):
  643. #fixture
  644. xfname = "show/"+show_name+"/"+str(filename)+".sav"
  645. print("backup",xfname)
  646. f = open(xfname,"w")
  647. for key in data:
  648. line = data[key]
  649. #print(line)
  650. label = "label"
  651. if key in labels:
  652. label = labels[key]
  653. if label == "Name-"+str(key):
  654. label = ""
  655. #print(xfname,"load",key,label,len(line))
  656. f.write( "{}\t{}\t{}\n".format( key,label,json.dumps(line) ) )
  657. f.close()
  658. class GUIHandler():
  659. def __init__(self):
  660. pass
  661. def update(self,fix,attr,args={}):
  662. #print("GUIHandler",fix,attr,args)
  663. for i,k in enumerate(args):
  664. v = args[k]
  665. #print("GUI-H", i,k,v)
  666. class Fixtures(Base):
  667. def __init__(self):
  668. super().__init__()
  669. #self.load()
  670. self.fixtures = OrderedDict()
  671. self.gui = GUIHandler()
  672. def load_patch(self):
  673. filename="patch"
  674. d,l = self._load(filename)
  675. self.fixtures = OrderedDict()
  676. for i in l:
  677. sdata = d[i]
  678. for attr in sdata["ATTRIBUT"]:
  679. sdata["ATTRIBUT"][attr]["ACTIVE"] = 0
  680. print("load",filename,sdata)
  681. #if "CFG" not in sdata:
  682. # sdata["CFG"] = OrderedDict()
  683. self.fixtures[str(i)] = sdata
  684. #self.PRESETS.label_presets = l
  685. def backup_patch(self):
  686. filename = "patch"
  687. data = self.fixtures
  688. labels = {}
  689. for k in data:
  690. labels[k] = k
  691. self._backup(filename,data,labels)
  692. def update_raw(self,rdata):
  693. #print("update_raw",rdata)
  694. cmd = []
  695. for i,d in enumerate(rdata):
  696. xcmd = {"DMX":""}
  697. #print("fix:",i,d)
  698. fix = d["FIX"]
  699. attr = d["ATTR"]
  700. v2 = d["VALUE"]
  701. v2_fx = d["FX"]
  702. if fix not in self.fixtures:
  703. continue
  704. sdata = self.fixtures[fix] #shortcat
  705. ATTR = sdata["ATTRIBUT"]
  706. sDMX = 0
  707. if sdata["DMX"] > 0:
  708. sDMX = sdata["DMX"]
  709. if attr not in ATTR:
  710. continue
  711. if ATTR[attr]["NR"] >= 0:
  712. DMX = sDMX+ATTR[attr]["NR"]-1
  713. xcmd["DMX"] = str(DMX)
  714. else:
  715. if attr == "DIM" and ATTR[attr]["NR"] < 0:
  716. xcmd["VIRTUAL"] = {}
  717. for a in ATTR:
  718. if ATTR[a]["MASTER"]:
  719. xcmd["VIRTUAL"][a] = sDMX+ATTR[a]["NR"]-1
  720. #print( "VIRTUAL",xcmd)
  721. cmd.append(xcmd)
  722. v=ATTR[attr]["VALUE"]
  723. if v2 is not None:
  724. ATTR[attr]["VALUE"] = v2
  725. #self.data.elem_attr[fix][attr]["text"] = str(attr)+' '+str(round(v,2))
  726. text = str(attr)+' '+str(round(v,2))
  727. self.gui.update(fix,attr,args={"text":text})
  728. return cmd
  729. class Presets(Base):
  730. def __init__(self):
  731. super().__init__()
  732. #self.load()
  733. def load_presets(self):
  734. filename="presets"
  735. d,l = self._load(filename)
  736. for i in d:
  737. sdata = d[i]
  738. if "CFG" not in sdata:
  739. sdata["CFG"] = OrderedDict()
  740. if "FADE" not in sdata["CFG"]:
  741. sdata["CFG"]["FADE"] = 4
  742. if "DELAY" not in sdata["CFG"]:
  743. sdata["CFG"]["DELAY"] = 0
  744. if "BUTTON" not in sdata["CFG"]:
  745. sdata["CFG"]["BUTTON"] = "GO"
  746. self.val_presets = d
  747. self.label_presets = l
  748. def backup_presets(self):
  749. filename = "presets"
  750. data = self.val_presets
  751. labels = self.label_presets
  752. self._backup(filename,data,labels)
  753. def get_cfg(self,nr):
  754. if nr not in self.val_presets:
  755. print(self,"error get_cfg no nr:",nr)
  756. return {}
  757. if "CFG" in self.val_presets[nr]:
  758. return self.val_presets[nr]["CFG"]
  759. def get_raw_map(self,nr):
  760. print("get_raw_map",nr)
  761. if nr not in self.val_presets:
  762. self.val_presets[nr] = OrderedDict()
  763. self.val_presets[nr]["VALUE"] = 0
  764. self.val_presets[nr]["FX"] = ""
  765. sdata = self.val_presets[nr]
  766. cmd = ""
  767. out = []
  768. dmx=-1
  769. for fix in sdata:
  770. if fix == "CFG":
  771. #print("CFG",nr,sdata[fix])
  772. continue
  773. for attr in sdata[fix]:
  774. x = {}
  775. #print("RAW",attr)
  776. x["FIX"] = fix
  777. x["ATTR"] = attr
  778. x["VALUE"] = sdata[fix][attr]["VALUE"]
  779. x["FX"] = sdata[fix][attr]["FX"]
  780. #x["DMX"] = sdata[fix][attr]["NR"]
  781. out.append(x)
  782. return out
  783. class GUI_grid():
  784. def __init__(self,root,data,title="tilte",width=800):
  785. self.data = data
  786. self.frame = tk.Frame(root,bg="black",width=width)
  787. self.frame.pack(fill=tk.BOTH, side=tk.LEFT)
  788. r=0
  789. c=0
  790. i=1
  791. for row in data:
  792. self.b = tk.Button(self.frame,bg="lightblue", text=row["text"],width=11,height=4)
  793. #self.b.bind("<Button>",Xevent(fix=fix,elem=b).cb)
  794. self.b.grid(row=r, column=c, sticky=tk.W+tk.E)#,anchor="w")
  795. c+=1
  796. if c % 8 == 0:
  797. r+=1
  798. c=0
  799. i+=1
  800. self.frame.pack()
  801. class BEvent():
  802. def __init__(self,data,cb):
  803. self._data = data
  804. self._cb = cb
  805. def cb(self,event):
  806. #print(self,event)
  807. self._cb(event,self._data)
  808. class GUI_menu():
  809. def __init__(self,root,data,title="tilte",width=800):
  810. global tk
  811. self.data = data
  812. self.frame = tk.Frame(root,bg="black",width=width)
  813. self.frame.pack(fill=tk.BOTH, side=tk.LEFT)
  814. r=0
  815. c=0
  816. i=1
  817. self.b = tk.Label(self.frame,bg="blue", text="MAIN:MENU",width=11,height=1)
  818. self.b.grid(row=r, column=c, sticky=tk.W+tk.E)#,anchor="w")
  819. r+=1
  820. for row in data:
  821. #print(i)
  822. #row = data[i]
  823. self.b = tk.Button(self.frame,bg="lightblue", text=row["text"],width=11,height=3)
  824. self.b.bind("<Button>",BEvent({"NR":i},self.callback).cb)
  825. self.b.grid(row=r, column=c, sticky=tk.W+tk.E)#,anchor="w")
  826. r+=1
  827. i+=1
  828. self.frame.pack()
  829. def callback(self,event,data={}):
  830. print(self,event,data)
  831. window_manager.top(data["NR"])# = WindowManager()
  832. class GUIWindow():
  833. def __init__(self,title="tilte",master=0,width=100,height=100,left=None,top=None):
  834. if master:
  835. self.tk = tkinter.Tk() #Toplevel()
  836. else:
  837. self.tk = tkinter.Toplevel()
  838. self.tk.title(""+str(title)+" "+str(rnd_id))
  839. #self.tk.geometry("270x600+0+65")
  840. geo ="{}x{}".format(width,height)
  841. if left is not None:
  842. geo += "+{}".format(left)
  843. if top is not None:
  844. geo += "+{}".format(top)
  845. self.tk.geometry(geo)
  846. def show(self):
  847. pass
  848. #self.frame.pack()
  849. def mainloop(self):
  850. self.tk.mainloop()
  851. def callback(self,event,data={}):
  852. print(self,event,data)
  853. class WindowManager():
  854. def __init__(self):
  855. self.windows = []
  856. def new(self,w):
  857. #w = GUIWindow(name)
  858. self.windows.append(w)
  859. #w.show()
  860. def mainloop(self):
  861. self.windows[0].mainloop()
  862. def top(self,nr):
  863. nr += 1
  864. if len(self.windows) > nr:
  865. self.windows[nr].tk.attributes('-topmost',True)
  866. self.windows[nr].tk.attributes('-topmost',False)
  867. window_manager = WindowManager()
  868. w = GUIWindow("MAIN",master=1,width=135,height=500,left=0,top=65)
  869. data = []
  870. data.append({"text":"Command"})
  871. data.append({"text":"Executer"})
  872. data.append({"text":"Dimmer"})
  873. data.append({"text":"Fixtures"})
  874. data.append({"text":"Preset"})
  875. f = GUI_menu(w.tk,data)
  876. window_manager.new(w)
  877. w = GUIWindow("GRID",master=0,width=1000,height=200,left=232,top=65)
  878. data = []
  879. for i in range(10):
  880. data.append({"text":"P {:02}".format(i+1)})
  881. w = GUI_grid(w.tk,data)
  882. window_manager.new(w)
  883. w = GUIWindow("COMMAND",master=0,width=800,height=140,left=140,top=610)
  884. frame_cmd = w.tk
  885. window_manager.new(w)
  886. w = GUIWindow("EXEC",master=0,width=800,height=550,left=140,top=65)
  887. frame_exe = w.tk
  888. window_manager.new(w)
  889. w = GUIWindow("DIMMER",master=0,width=800,height=550,left=140,top=65)
  890. frame_dim = w.tk
  891. window_manager.new(w)
  892. w = GUIWindow("FIXTURS",master=0,width=800,height=550,left=140,top=65)
  893. frame_fix = w.tk
  894. window_manager.new(w)
  895. #Xroot = tk.Tk()
  896. #Xroot["bg"] = "black" #white
  897. #Xroot.title( xtitle+" "+str(rnd_id) )
  898. #Xroot.geometry("1024x800+130+65")
  899. ww = GUIWindow("OLD",master=0,width=600,height=200,left=135,top=75)
  900. Xroot = ww.tk
  901. w = None
  902. root = tk.Frame(Xroot,bg="black",width="10px")
  903. root.pack(fill=tk.BOTH, side=tk.LEFT)
  904. root3 = tk.Frame(Xroot,bg="black",width="20px")
  905. root3.pack(fill=tk.BOTH, side=tk.LEFT)
  906. root2 = tk.Frame(Xroot,bg="black",width="1px")
  907. root2.pack(fill=tk.BOTH, side=tk.LEFT)
  908. #default_font = font.Font(family='Helvetica', size=12, weight='bold')
  909. Font = font.Font(family='Helvetica', size=9, weight='normal')
  910. FontBold = font.Font(family='Helvetica', size=10, weight='bold')
  911. #default_font.configure(size=9)
  912. Xroot.option_add("*Font", FontBold)
  913. #w = frame_fix #GUIWindow("OLD",master=0,width=800,height=500,left=130,top=65)
  914. window_manager.new(w)
  915. class GUI(Base):
  916. def __init__(self):
  917. super().__init__()
  918. self.load()
  919. self.all_attr =["DIM","VDIM","PAN","TILT"]
  920. self.elem_attr = {}
  921. self.commands =["BLIND","CLEAR","STORE","EDIT","","CFG-BTN","LABEL"
  922. ,"BACKUP","SET","","","SELECT","ACTIVATE","FLASH","FADE"
  923. ,"STONY_FX","FX OFF", "FX:SIN","FX:COS","FX:CIR","SZ:","SP:","OF:"
  924. ,"FX:BUM","FX:BUM-","FX:FD","FX:ON","FX:ON-","FX:ON2","FX:ON2-" ]
  925. self.elem_commands = {}
  926. self.val_commands = {}
  927. self.elem_presets = {}
  928. self.PRESETS = Presets()
  929. self.PRESETS.load_presets()
  930. self.FIXTURES = Fixtures()
  931. self.FIXTURES.load_patch()
  932. for i in range(8*8):
  933. if i not in self.PRESETS.val_presets:
  934. name = "Preset:"+str(i+1)+":\nXYZ"
  935. #self.presets[i] = [i]
  936. self.PRESETS.val_presets[i] = OrderedDict() # FIX
  937. self.PRESETS.val_presets[i]["CFG"] = OrderedDict() # CONFIG
  938. self.PRESETS.label_presets[i] = "-"
  939. def load(self,fname=""):
  940. pass
  941. def exit(self):
  942. print("__del__",self)
  943. self.PRESETS.backup_presets()
  944. print("********************************************************")
  945. self.FIXTURES.backup_patch()
  946. print("*********del",self,"***********************************************")
  947. def refresh_gui(self):
  948. for fix in self.FIXTURES.fixtures:
  949. sdata = self.FIXTURES.fixtures[fix]
  950. for attr in sdata["ATTRIBUT"]:
  951. if "FINE" in attr:
  952. continue
  953. v2 = sdata["ATTRIBUT"][attr]["VALUE"]
  954. if fix in self.elem_attr:
  955. elem = self.elem_attr[fix][attr]
  956. #print( attr,v2)
  957. elem["text"] = "{} {:0.2f}".format(attr,v2)
  958. if sdata["ATTRIBUT"][attr]["ACTIVE"]:
  959. elem["bg"] = "yellow"
  960. else:
  961. elem["bg"] = "grey"
  962. def preset_store(self,nr):
  963. print("STORE PRESET")
  964. self.val_commands["STORE"] = 0
  965. global STORE
  966. STORE = 0
  967. self.elem_commands["STORE"]["bg"] = "lightgrey"
  968. CFG = OrderedDict()
  969. if "CFG" in self.PRESETS.val_presets[nr]: #["CFG"]
  970. CFG = self.PRESETS.val_presets[nr]["CFG"]
  971. sdata = {}
  972. sdata["CFG"] = CFG # OrderedDict()
  973. sdata["CFG"]["FADE"] = fade
  974. sdata["CFG"]["DEALY"] = 0
  975. #sdata["CFG"]["BUTTON"] = "GO"
  976. for fix in self.FIXTURES.fixtures:
  977. data = self.FIXTURES.fixtures[fix]
  978. for attr in data["ATTRIBUT"]:
  979. if data["ATTRIBUT"][attr]["ACTIVE"]:
  980. if fix not in sdata:
  981. sdata[fix] = {}
  982. if attr not in sdata[fix]:
  983. sdata[fix][attr] = OrderedDict()
  984. if not STONY_FX:
  985. sdata[fix][attr]["VALUE"] = data["ATTRIBUT"][attr]["VALUE"]
  986. #sdata[fix][attr]["FADE"] = fade
  987. else:
  988. sdata[fix][attr]["VALUE"] = None #data["ATTRIBUT"][attr]["VALUE"]
  989. if "FX" not in data["ATTRIBUT"][attr]:
  990. data["ATTRIBUT"][attr]["FX"] =""
  991. sdata[fix][attr]["FX"] = data["ATTRIBUT"][attr]["FX"]
  992. print("sdata",len(sdata))
  993. self.PRESETS.val_presets[nr] = sdata
  994. if len(sdata) > 1:
  995. fx_color = 0
  996. val_color = 0
  997. for fix in sdata:
  998. if fix == "CFG":
  999. continue
  1000. print( "$$$$",fix,sdata[fix])
  1001. for attr in sdata[fix]:
  1002. if "FX" in sdata[fix][attr]:
  1003. if sdata[fix][attr]["FX"]:
  1004. fx_color = 1
  1005. if "VALUE" in sdata[fix][attr]:
  1006. if sdata[fix][attr]["VALUE"] is not None:
  1007. val_color = 1
  1008. self.elem_presets[nr]["fg"] = "black"
  1009. if val_color:
  1010. self.elem_presets[nr]["bg"] = "yellow"
  1011. if fx_color:
  1012. self.elem_presets[nr]["fg"] = "blue"
  1013. else:
  1014. if fx_color:
  1015. self.elem_presets[nr]["bg"] = "cyan"
  1016. else:
  1017. self.elem_presets[nr]["fg"] = "black"
  1018. self.elem_presets[nr]["bg"] = "grey"
  1019. #self.elem_presets[nr].option_add("*Font", FontBold)
  1020. label = ""
  1021. if nr in self.PRESETS.label_presets:
  1022. #print(dir(self.data))
  1023. label = self.PRESETS.label_presets[nr]
  1024. BTN="go"
  1025. if "CFG" in sdata:#["BUTTON"] = "GO"
  1026. if "BUTTON" in sdata["CFG"]:
  1027. BTN = sdata["CFG"]["BUTTON"]
  1028. txt = str(nr)+":"+str(BTN)+":"+str(len(sdata)-1)+"\n"+label
  1029. self.elem_presets[nr]["text"] = txt
  1030. #print("GO CFG ",self.PRESETS.val_presets)
  1031. def preset_select(self,nr):
  1032. print("SELECT PRESET")
  1033. sdata = self.PRESETS.val_presets[nr]
  1034. cmd = ""
  1035. for fix in sdata:
  1036. if fix == "CFG":
  1037. continue
  1038. for attr in sdata[fix]:
  1039. v2 = sdata[fix][attr]["VALUE"]
  1040. v2_fx = sdata[fix][attr]["FX"]
  1041. #print( self.data.elem_attr)
  1042. if fix in self.elem_attr:
  1043. elem = self.elem_attr[fix][attr]
  1044. #self#encoder(attr=attr,data=data,elem=elem,action="click")
  1045. self.FIXTURES.fixtures[fix]["ATTRIBUT"][attr]["ACTIVE"] = 1
  1046. elem["bg"] = "yellow"
  1047. def preset_go(self,nr,xfade=fade,event=None):
  1048. print("GO PRESET FADE",nr)
  1049. rdata = self.PRESETS.get_raw_map(nr)
  1050. cfg = self.PRESETS.get_cfg(nr)
  1051. fcmd = self.FIXTURES.update_raw(rdata)
  1052. #virtcmd = self.data.FIXTURES.get_virtual(rdata)
  1053. xFLASH = 0
  1054. value=None
  1055. #xfade = fade
  1056. if FLASH or ( "BUTTON" in cfg and cfg["BUTTON"] == "SEL"): #FLASH
  1057. self.preset_select(nr)
  1058. return 0
  1059. elif FLASH or ( "BUTTON" in cfg and cfg["BUTTON"] == "FL"): #FLASH
  1060. xFLASH = 1
  1061. xfade = 0
  1062. if event:
  1063. if str(event.type) == "ButtonRelease":
  1064. if xFLASH:
  1065. value = "off"
  1066. vvcmd = update_raw_dmx( rdata ,value,[xfade] )
  1067. fxcmd = update_raw_dmx( rdata ,value,[xfade],fx=1)
  1068. cmd = []
  1069. for vcmd,d in [[vvcmd,"d"],[fxcmd,"fx"]]:
  1070. if xFLASH:
  1071. d+="f"
  1072. for i,v in enumerate(fcmd):
  1073. DMX = fcmd[i]["DMX"]
  1074. if DMX and vcmd[i]:
  1075. xcmd = ",{}{}:{}".format(d,DMX,vcmd[i])
  1076. cmd.append( xcmd )
  1077. if "VIRTUAL" in fcmd[i]:
  1078. for a in fcmd[i]["VIRTUAL"]:
  1079. DMX = fcmd[i]["VIRTUAL"][a]
  1080. if DMX and vcmd[i]:
  1081. xcmd = ",{}{}:{}".format(d,DMX,vcmd[i])
  1082. cmd.append( xcmd )
  1083. cmd = "".join(cmd)
  1084. print("cmd",cmd)
  1085. if cmd and not BLIND:
  1086. client.send(cmd )
  1087. self.refresh_gui()
  1088. def draw_dim(self,fix,data,c=0,r=0,frame=None):
  1089. i=0
  1090. if frame is None:
  1091. frame = tk.Frame(root,bg="black")
  1092. frame.pack(fill=tk.X, side=tk.TOP)
  1093. #b = tk.Button(frame,bg="lightblue", text="FIX:"+str(fix)+" "+data["NAME"],width=20)
  1094. #b.bind("<Button>",Xevent(fix=fix,elem=b).cb)
  1095. #b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1096. #c+=1
  1097. #r+=1
  1098. if fix not in self.elem_attr:
  1099. self.elem_attr[fix] = {}
  1100. for attr in data["ATTRIBUT"]:
  1101. if attr not in self.all_attr:
  1102. self.all_attr.append(attr)
  1103. if attr not in self.elem_attr[fix]:
  1104. self.elem_attr[fix][attr] = []
  1105. if attr.endswith("-FINE"):
  1106. continue
  1107. v= data["ATTRIBUT"][attr]["VALUE"]
  1108. b = tk.Button(frame,bg="lightblue", text=""+str(fix)+" "+data["NAME"],width=4)
  1109. #b.bind("<Button>",Xevent(fix=fix,elem=b).cb)
  1110. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1111. c+=1
  1112. b = tk.Button(frame,bg="grey", text=str(attr)+' '+str(round(v,2)),width=6)
  1113. self.elem_attr[fix][attr] = b
  1114. b.bind("<Button>",Xevent(fix=fix,elem=b,attr=attr,data=data).cb)
  1115. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1116. c+=1
  1117. if c >=12:
  1118. c=0
  1119. r+=1
  1120. return c,r
  1121. def draw_fix(self):
  1122. r=0
  1123. c=0
  1124. root = frame_dim
  1125. dim_frame = tk.Frame(root,bg="black")
  1126. dim_frame.pack(fill=tk.X, side=tk.TOP)
  1127. root = frame_fix
  1128. fix_frame = tk.Frame(root,bg="black")
  1129. fix_frame.pack(fill=tk.X, side=tk.TOP)
  1130. i=0
  1131. c=0
  1132. r=0
  1133. for fix in self.FIXTURES.fixtures:
  1134. i+=1
  1135. data = self.FIXTURES.fixtures[fix]
  1136. print( fix ,data )
  1137. if(len(data["ATTRIBUT"].keys()) <= 1):
  1138. c,r=self.draw_dim(fix,data,c=c,r=r,frame=dim_frame)
  1139. else:
  1140. #self._draw_fix(fix,data,root=fix_frame)
  1141. frame = fix_frame
  1142. b = tk.Button(frame,bg="lightblue", text="FIX:"+str(fix)+" "+data["NAME"],width=20)
  1143. b.bind("<Button>",Xevent(fix=fix,elem=b).cb)
  1144. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1145. c+=1
  1146. #r+=1
  1147. if fix not in self.elem_attr:
  1148. self.elem_attr[fix] = {}
  1149. for attr in data["ATTRIBUT"]:
  1150. if attr not in self.all_attr:
  1151. self.all_attr.append(attr)
  1152. if attr not in self.elem_attr[fix]:
  1153. self.elem_attr[fix][attr] = []
  1154. if attr.endswith("-FINE"):
  1155. continue
  1156. v= data["ATTRIBUT"][attr]["VALUE"]
  1157. b = tk.Button(frame,bg="grey", text=str(attr)+' '+str(round(v,2)),width=8)
  1158. self.elem_attr[fix][attr] = b
  1159. b.bind("<Button>",Xevent(fix=fix,elem=b,attr=attr,data=data).cb)
  1160. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1161. c+=1
  1162. if c >=8:
  1163. c=1
  1164. r+=1
  1165. c=0
  1166. r+=1
  1167. def draw_enc(self):
  1168. i=0
  1169. c=0
  1170. r=0
  1171. #frame = tk.Frame(root,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.Button(frame,bg="lightblue", text="ENCODER",width=6)
  1179. #b.bind("<Button>",Xevent(fix=fix,elem=b).cb)
  1180. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1181. #r+=1
  1182. c+=1
  1183. for attr in self.all_attr:
  1184. if attr.endswith("-FINE"):
  1185. continue
  1186. v=0
  1187. b = tk.Button(frame,bg="orange", text=str(attr)+'',width=6)
  1188. b.bind("<Button>",Xevent(fix=0,elem=b,attr=attr,data=self,mode="ENCODER").cb)
  1189. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1190. c+=1
  1191. if c >=7:
  1192. c=0
  1193. r+=1
  1194. def draw_command(self):
  1195. i=0
  1196. c=0
  1197. r=0
  1198. #frame = tk.Frame(root,bg="black")
  1199. #frame.pack(fill=tk.X, side=tk.TOP)
  1200. #b = tk.Label(frame,bg="black", text="------------------------------ ---------------------------------------")
  1201. #b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1202. #r=0
  1203. #frame = tk.Frame(root2,bg="black")
  1204. frame = tk.Frame(frame_cmd,bg="black")
  1205. frame.pack(fill=tk.X, side=tk.TOP)
  1206. b = tk.Button(frame,bg="lightblue", text="COMM.",width=6)
  1207. #b.bind("<Button>",Xevent(fix=fix,elem=b).cb)
  1208. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1209. #r+=1
  1210. c+=1
  1211. for comm in self.commands:
  1212. v=0
  1213. b = tk.Button(frame,bg="lightgrey", text=str(comm),width=6,height=2)
  1214. if comm not in self.elem_commands:
  1215. self.elem_commands[comm] = b
  1216. self.val_commands[comm] = 0
  1217. b.bind("<Button>",Xevent(fix=0,elem=b,attr=comm,data=self,mode="COMMAND").cb)
  1218. if comm == "BLIND":
  1219. b["bg"] = "grey"
  1220. if comm == "CLEAR":
  1221. b["bg"] = "grey"
  1222. if comm == "STONY_FX":
  1223. b["bg"] = "grey"
  1224. if comm == "FADE":
  1225. b["bg"] = "green"
  1226. if comm == "FX OFF":
  1227. b["bg"] = "magenta"
  1228. if comm == "SZ:":
  1229. b["text"] = "SZ:{:0.0f}".format(fx_prm["SIZE"])
  1230. if comm == "SP:":
  1231. b["text"] = "SP:{:0.0f}".format(fx_prm["SPEED"])
  1232. if comm == "OF:":
  1233. b["text"] = "OF:{:0.0f}".format(fx_prm["OFFSET"])
  1234. if comm:
  1235. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1236. c+=1
  1237. if c >=12:
  1238. c=0
  1239. r+=1
  1240. def draw_preset(self):
  1241. i=0
  1242. c=0
  1243. r=0
  1244. root = frame_exe
  1245. frame = tk.Frame(root,bg="black")
  1246. frame.pack(fill=tk.X, side=tk.TOP)
  1247. b = tk.Button(frame,bg="lightblue", text="EXEC")
  1248. #b.bind("<Button>",Xevent(elem=b).cb)
  1249. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1250. r+=1
  1251. for k in self.PRESETS.val_presets:
  1252. v=0
  1253. label = ""
  1254. if k in self.PRESETS.label_presets:
  1255. label = self.PRESETS.label_presets[k]
  1256. print([label])
  1257. sdata=self.PRESETS.val_presets[k]
  1258. BTN="go"
  1259. if "CFG" in sdata:#["BUTTON"] = "GO"
  1260. if "BUTTON" in sdata["CFG"]:
  1261. BTN = sdata["CFG"]["BUTTON"]
  1262. txt=str(k)+":"+str(BTN)+":"+str(len(sdata)-1)+"\n"+label
  1263. b = tk.Button(frame,bg="grey", text=txt,width=8,height=2)
  1264. b.bind("<Button>",Xevent(fix=0,elem=b,attr=k,data=self,mode="PRESET").cb)
  1265. b.bind("<ButtonRelease>",Xevent(fix=0,elem=b,attr=k,data=self,mode="PRESET").cb)
  1266. if k in self.PRESETS.val_presets and len(self.PRESETS.val_presets[k]) :
  1267. b["bg"] = "yellow"
  1268. sdata = self.PRESETS.val_presets[k]
  1269. if len(sdata) > 1:
  1270. fx_color = 0
  1271. val_color = 0
  1272. for fix in sdata:
  1273. if fix == "CFG":
  1274. continue
  1275. print( "$$$$",fix,sdata[fix])
  1276. for attr in sdata[fix]:
  1277. if "FX" in sdata[fix][attr]:
  1278. if sdata[fix][attr]["FX"]:
  1279. fx_color = 1
  1280. if "VALUE" in sdata[fix][attr]:
  1281. if sdata[fix][attr]["VALUE"] is not None:
  1282. val_color = 1
  1283. b["fg"] = "black"
  1284. if val_color:
  1285. b["bg"] = "gold"
  1286. if fx_color:
  1287. b["fg"] = "blue"
  1288. else:
  1289. if fx_color:
  1290. b["bg"] = "cyan"
  1291. else:
  1292. b["bg"] = "grey"
  1293. if k not in self.elem_presets:
  1294. self.elem_presets[k] = b
  1295. #self.PRESETS.val_presets[preset] = 0
  1296. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1297. c+=1
  1298. if c >=8:
  1299. c=0
  1300. r+=1
  1301. def draw_input(self):
  1302. i=0
  1303. c=0
  1304. r=0
  1305. frame = tk.Frame(root2,bg="black")
  1306. frame.pack(fill=tk.X, side=tk.TOP)
  1307. b = tk.Label(frame,bg="black", text="------------------------ ---------------------------------------")
  1308. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1309. r=0
  1310. frame = tk.Frame(root2,bg="black")
  1311. frame.pack(fill=tk.X, side=tk.TOP)
  1312. b = tk.Label(frame, text="send:")
  1313. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1314. c+=1
  1315. b = tk.Entry(frame,bg="grey", text="",width=50)
  1316. self.entry = b
  1317. b.bind("<Button>",Xevent(fix=0,elem=b,attr="INPUT",data=self,mode="INPUT").cb)
  1318. b.bind("<Key>",Xevent(fix=0,elem=b,attr="INPUT",data=self,mode="INPUT").cb)
  1319. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1320. b.insert("end","d0:127,fx241:sinus:50:50:10,fx243:cosinus:50:50:10,d201:127,fx201:sinus:50:300:10")
  1321. r+=1
  1322. b = tk.Entry(frame,bg="grey", text="",width=20)
  1323. self.entry2 = b
  1324. b.bind("<Button>",Xevent(fix=0,elem=b,attr="INPUT",data=self,mode="INPUT2").cb)
  1325. b.bind("<Key>",Xevent(fix=0,elem=b,attr="INPUT",data=self,mode="INPUT2").cb)
  1326. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1327. b.insert("end","d1:0:4")
  1328. r+=1
  1329. b = tk.Entry(frame,bg="grey", text="",width=20)
  1330. self.entry3 = b
  1331. b.bind("<Button>",Xevent(fix=0,elem=b,attr="INPUT",data=self,mode="INPUT3").cb)
  1332. b.bind("<Key>",Xevent(fix=0,elem=b,attr="INPUT",data=self,mode="INPUT3").cb)
  1333. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1334. b.insert("end","fx:alloff:::")
  1335. def render(self):
  1336. Xroot.bind("<Key>",Xevent(fix=0,elem=None,attr="ROOT",data=self,mode="ROOT").cb)
  1337. self.draw_fix()
  1338. #input()
  1339. self.draw_enc()
  1340. self.draw_command()
  1341. self.draw_input()
  1342. self.draw_preset()
  1343. try:
  1344. master =GUI()
  1345. master.render()
  1346. #root.mainloop()
  1347. #tk.mainloop()
  1348. window_manager.mainloop()
  1349. finally:
  1350. master.exit()