Editor3.py 55 KB

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