Editor3.py 57 KB

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