Editor3.py 57 KB

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