Editor3.py 57 KB

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