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. # z.b. flush off
  98. xcmd = str(value)+":"+row["FX"].split(":",1)[-1]
  99. else:
  100. xcmd = row["FX"]
  101. else:
  102. if row["VALUE"] is None:
  103. xcmd = ""
  104. else:
  105. if value is not None:
  106. if type(value) is float:
  107. xcmd = "{:0.4f}".format(value)
  108. else:
  109. xcmd = "{}".format(value)
  110. else:
  111. xcmd = "{:0.4f}".format(row["VALUE"])
  112. for arg in args:
  113. if type(arg) is float:
  114. xcmd += ":{}".format(arg)
  115. else:
  116. xcmd += ":{:0.4f}".format(arg)
  117. #print( "pack: FIX",row["FIX"],row["ATTR"], xcmd)
  118. #xcmd += ":{}".format(row["ATTR"])
  119. cmd.append( xcmd)
  120. return cmd
  121. def update_dmx(attr,data,value=None,args=[fade],flash=0,pfx=""):
  122. global BLIND
  123. dmx = data["DMX"]
  124. val = None
  125. cmd=""
  126. try:
  127. if attr == "DIM" and data["ATTRIBUT"][attr]["NR"] < 0: #VDIM
  128. #print( "VDIM")
  129. for attr in data["ATTRIBUT"]:
  130. dmx = data["DMX"]
  131. if data["ATTRIBUT"][attr]["NR"] < 0: #virtual channels
  132. continue
  133. dmx += data["ATTRIBUT"][attr]["NR"]-1
  134. mode = ""
  135. if "MODE" in data["ATTRIBUT"][attr]:
  136. mode = data["ATTRIBUT"][attr]["MODE"]
  137. #print(attr)
  138. val = data["ATTRIBUT"][attr]["VALUE"]
  139. if data["ATTRIBUT"][attr]["MASTER"]:
  140. val = val * (data["ATTRIBUT"]["DIM"]["VALUE"] / 255.)
  141. if val is not None:
  142. #cmd += ",d{}:{:0.4f}".format(dmx,int(val))
  143. if value is not None:
  144. val = value
  145. if mode == "F": #FADE
  146. cmd += build_cmd(dmx,val,args=args,flash=flash,xpfx=pfx,attr=attr)
  147. else:
  148. cmd += build_cmd(dmx,val,args=[0],flash=flash,xpfx=pfx,attr=attr)
  149. #print("cmd",cmd)
  150. elif data["ATTRIBUT"][attr]["NR"] > 0:
  151. dmx += data["ATTRIBUT"][attr]["NR"]-1
  152. val = data["ATTRIBUT"][attr]["VALUE"]
  153. mode = ""
  154. if "MODE" in data["ATTRIBUT"][attr]:
  155. mode = data["ATTRIBUT"][attr]["MODE"]
  156. if data["ATTRIBUT"][attr]["MASTER"]:
  157. #if "VDIM" in data["ATTRIBUT"]:
  158. if "DIM" in data["ATTRIBUT"] and data["ATTRIBUT"]["DIM"]["NR"] < 0: #VDIM
  159. val = val * (data["ATTRIBUT"]["DIM"]["VALUE"] / 255.)
  160. if val is not None:
  161. #cmd += ",d{}:{}".format(dmx,int(val))
  162. if value is not None:
  163. val = value
  164. if mode == "F": #FADE
  165. cmd += build_cmd(dmx,val,args=args,flash=flash,xpfx=pfx,attr=attr)
  166. else:
  167. cmd += build_cmd(dmx,val,args=[0],flash=flash,xpfx=pfx,attr=attr)
  168. #print("cmd",cmd)
  169. if BLIND:
  170. cmd=""
  171. return cmd
  172. except Exception as e:
  173. print("== cb EXCEPT",e)
  174. print("Error on line {}".format(sys.exc_info()[-1].tb_lineno))
  175. raise e
  176. class dummy_event():
  177. def __init__(self):
  178. self.num =0
  179. class Xevent():
  180. def __init__(self,fix,elem,attr=None,data=None,mode=None):
  181. self.data=data
  182. self.attr = attr
  183. self.elem = elem
  184. self.mode = mode
  185. def encoder(self,fix,attr,data,elem,action=""):
  186. if action == "click":
  187. if self.data["ATTRIBUT"][attr]["ACTIVE"]:
  188. self.data["ATTRIBUT"][attr]["ACTIVE"] = 0
  189. self.elem["bg"] = "grey"
  190. else:
  191. self.data["ATTRIBUT"][attr]["ACTIVE"] = 1
  192. self.elem["bg"] = "yellow"
  193. return 1
  194. v2=data["ATTRIBUT"][attr]["VALUE"]
  195. change=0
  196. increment = 4.11
  197. if action == "+":
  198. v2+= increment
  199. v = "+{:0.4f}".format( increment ) #) #4.11"
  200. change=1
  201. elif action == "-":
  202. v2-= 4.11
  203. v = "-{:0.4f}".format( increment ) #) #4.11"
  204. change=1
  205. if v2 < 0:
  206. v2=0
  207. elif v2 > 256:
  208. v2=256
  209. if change:
  210. data["ATTRIBUT"][attr]["ACTIVE"] = 1
  211. elem["bg"] = "yellow"
  212. #v2 = v
  213. #v = data["ATTRIBUT"][attr]["VALUE"]
  214. data["ATTRIBUT"][attr]["VALUE"] = v2
  215. elem["text"] = "{} {:0.2f}".format(attr,v2)
  216. #worker.fade_dmx(fix,attr,data,v,v2,ft=0)
  217. cmd=update_dmx(attr=attr,data=data,args=[0])
  218. #data["ATTRIBUT"][attr]["VALUE"] = v2
  219. client.send(cmd)
  220. def cb(self,event):
  221. #print("cb",self,event,data)
  222. print("cb",self.attr,self.mode,event)
  223. #print(dir(event),[str(event.type)])#.keys())
  224. try:
  225. #v = self.data["ATTRIBUT"][self.attr]
  226. global STORE
  227. global BLIND
  228. global FLASH
  229. global STONY_FX
  230. global LABEL
  231. global SELECT
  232. global CFG_BTN
  233. change = 0
  234. if self.mode == "COMMAND":
  235. if self.attr == "CLEAR":
  236. if event.num == 1:
  237. if STORE:
  238. self.data.val_commands["STORE"] = 0
  239. STORE = 0
  240. self.data.elem_commands["STORE"]["bg"] = "grey"
  241. else:
  242. for fix in self.data.FIXTURES.fixtures:
  243. print( "clr",fix)
  244. data = self.data.FIXTURES.fixtures[fix]
  245. #print("elm",self.data.elem_attr[fix])
  246. for attr in data["ATTRIBUT"]:
  247. if attr.endswith("-FINE"):
  248. continue
  249. self.data.elem_attr[fix][attr]["bg"] = "grey"
  250. data["ATTRIBUT"][attr]["ACTIVE"] = 0
  251. #print(data["ATTRIBUT"])
  252. print( "CB CLEAR" )
  253. if self.attr.startswith("SZ:"):#SIN":
  254. #global fx_prm
  255. k = "SIZE"
  256. if event.num == 1:
  257. pass
  258. elif event.num == 2:
  259. pass
  260. elif event.num == 4:
  261. if fx_prm[k] <= 0:
  262. fx_prm[k] = 1
  263. fx_prm[k] *=1.2
  264. elif event.num == 5:
  265. fx_prm[k] /=1.2
  266. #fx_prm[k] =int(fx_prm[k])
  267. if fx_prm[k] > 4000:
  268. fx_prm[k] = 4000
  269. if fx_prm[k] < 0:
  270. fx_prm[k] =0
  271. self.data.elem_commands[self.attr]["text"] = "SZ:{:0.0f}".format(fx_prm[k])
  272. if self.attr.startswith("SP:"):#SIN":
  273. #global fx_prm
  274. k = "SPEED"
  275. if event.num == 1:
  276. pass
  277. elif event.num == 2:
  278. pass
  279. elif event.num == 4:
  280. if fx_prm[k] <= 0:
  281. fx_prm[k] = 1
  282. fx_prm[k] *=1.2
  283. elif event.num == 5:
  284. fx_prm[k] /=1.2
  285. #fx_prm[k] =int(fx_prm[k])
  286. if fx_prm[k] > 4000:
  287. fx_prm[k] = 4000
  288. if fx_prm[k] < 0:
  289. fx_prm[k] =0
  290. self.data.elem_commands[self.attr]["text"] = "SP:{:0.0f}".format(fx_prm[k])
  291. if self.attr.startswith("OF:"):#SIN":
  292. #global fx_prm
  293. k = "OFFSET"
  294. if event.num == 1:
  295. pass
  296. elif event.num == 2:
  297. pass
  298. elif event.num == 4:
  299. if fx_prm[k] <= 0:
  300. fx_prm[k] = 1
  301. fx_prm[k] *=1.2
  302. elif event.num == 5:
  303. fx_prm[k] /=1.2
  304. #fx_prm[k] =int(fx_prm[k])
  305. if fx_prm[k] > 1024:
  306. fx_prm[k] = 1024
  307. if fx_prm[k] < 0:
  308. fx_prm[k] =0
  309. self.data.elem_commands[self.attr]["text"] = "OF:{:0.0f}".format(fx_prm[k])
  310. if self.attr.startswith("FX:"):#SIN":
  311. if event.num == 1:
  312. cmd = ""
  313. offset = 0
  314. for fix in self.data.FIXTURES.fixtures:
  315. data = self.data.FIXTURES.fixtures[fix]
  316. #print( "ADD FX",fix)
  317. for attr in data["ATTRIBUT"]:
  318. if attr.endswith("-FINE"):
  319. continue
  320. fx=""
  321. if "SIN" in self.attr:
  322. fx = "sinus"
  323. elif "FD" in self.attr:
  324. fx = "fade"
  325. elif "ON2-" in self.attr:
  326. fx = "on2-"
  327. elif "ON-" in self.attr:
  328. fx = "on-"
  329. elif "ON2" in self.attr:
  330. fx = "on2"
  331. elif "ON" in self.attr:
  332. fx = "on"
  333. elif "BUM-" in self.attr:
  334. fx = "bump-"
  335. elif "BUM" in self.attr:
  336. fx = "bump"
  337. elif "COS" in self.attr:
  338. fx = "cosinus"
  339. if fx:
  340. fx += ":{:0.0f}:{:0.0f}:{:0.0f}".format(fx_prm["SIZE"],fx_prm["SPEED"],offset)#fx_prm["OFFSET"])
  341. else:
  342. if "CIR" in self.attr:
  343. if attr == "PAN":
  344. fx = "cosinus:{:0.0f}:{:0.0f}:{:0.0f}".format(fx_prm["SIZE"],fx_prm["SPEED"],offset)#fx_prm["OFFSET"])
  345. if attr == "TILT":
  346. fx = "sinus:{:0.0f}:{:0.0f}:{:0.0f}".format(fx_prm["SIZE"],fx_prm["SPEED"],offset)#fx_prm["OFFSET"])
  347. if "FX" not in data["ATTRIBUT"][attr]:
  348. data["ATTRIBUT"][attr]["FX"] =""
  349. print("ADD FX",fix,attr,fx,data["ATTRIBUT"][attr]["ACTIVE"])
  350. if data["ATTRIBUT"][attr]["ACTIVE"]:
  351. print("++ADD FX",fix,attr,fx)
  352. data["ATTRIBUT"][attr]["FX"] = fx #"sinus:40:100:10"
  353. cmd+=update_dmx(attr,data,pfx="fx",value=fx)#,flash=FLASH)
  354. if fx_prm["OFFSET"] > 0.5:
  355. offset += fx_prm["OFFSET"] # add offset on next fixture
  356. #print("offset",offset)
  357. if cmd and not BLIND:
  358. client.send(cmd)
  359. elif self.attr == "FX OFF":
  360. if event.num == 1:
  361. client.send("fx0:alloff:,fxf:alloff:")
  362. self.data.elem_commands[self.attr]["bg"] = "magenta"
  363. for fix in self.data.FIXTURES.fixtures:
  364. data = self.data.FIXTURES.fixtures[fix]
  365. for attr in data["ATTRIBUT"]:
  366. data["ATTRIBUT"][attr]["FX"] = ""
  367. elif self.attr == "FLASH":
  368. if event.num == 1:
  369. if FLASH:
  370. FLASH = 0
  371. self.data.elem_commands[self.attr]["bg"] = "grey"
  372. else:
  373. FLASH = 1
  374. self.data.elem_commands[self.attr]["bg"] = "green"
  375. elif self.attr == "BLIND":
  376. if event.num == 1:
  377. if self.data.val_commands[self.attr]:
  378. self.data.val_commands[self.attr] = 0
  379. BLIND = 0
  380. self.data.elem_commands[self.attr]["bg"] = "grey"
  381. else:
  382. self.data.val_commands[self.attr] = 1
  383. BLIND = 1
  384. self.data.elem_commands[self.attr]["bg"] = "red"
  385. print("BLIND",self.data.val_commands)
  386. elif self.attr == "FADE":
  387. global fade
  388. global fade_on
  389. if fade < 0.01:
  390. fade = 0.01
  391. elif fade > 100.0:
  392. fade = 100
  393. if event.num == 4:
  394. fade *= 1.1
  395. elif event.num == 5:
  396. fade /= 1.1
  397. elif event.num == 1:
  398. if fade_on:
  399. fade_on = 0
  400. self.data.elem_commands[self.attr]["bg"] = "grey"
  401. else:
  402. fade_on = 1
  403. self.data.elem_commands[self.attr]["bg"] = "green"
  404. elif event.num == 2:
  405. if fade > 1 and fade < 4:
  406. fade = 4
  407. elif fade > 3 and fade < 6:
  408. fade = 6
  409. elif fade > 5 and fade < 7:
  410. fade = 8
  411. elif fade > 7 and fade < 9:
  412. fade = 10
  413. elif fade > 9:
  414. fade = 0.01
  415. elif fade < 1:
  416. fade = 1.1
  417. self.data.elem_commands[self.attr]["text"] = "Fade{:0.2f}".format(fade)
  418. elif self.attr == "CFG-BTN":
  419. global CFG_BTN
  420. if event.num == 1:
  421. if CFG_BTN:
  422. CFG_BTN = 0
  423. self.data.elem_commands[self.attr]["bg"] = "lightgrey"
  424. else:
  425. CFG_BTN = 1
  426. self.data.elem_commands[self.attr]["bg"] = "red"
  427. elif self.attr == "SELECT":
  428. global SELECT
  429. #global CFG_BTN
  430. if event.num == 1:
  431. if SELECT:
  432. SELECT = 0
  433. self.data.elem_commands[self.attr]["bg"] = "lightgrey"
  434. else:
  435. SELECT = 1
  436. self.data.elem_commands[self.attr]["bg"] = "red"
  437. elif self.attr == "LABEL":
  438. global LABEL
  439. #global CFG_BTN
  440. if event.num == 1:
  441. if LABEL:
  442. LABEL = 0
  443. self.data.elem_commands[self.attr]["bg"] = "lightgrey"
  444. else:
  445. LABEL = 1
  446. self.data.elem_commands[self.attr]["bg"] = "red"
  447. elif self.attr == "STONY_FX":
  448. if event.num == 1:
  449. if STONY_FX:
  450. STONY_FX = 0
  451. self.data.elem_commands[self.attr]["bg"] = "grey"
  452. else:
  453. STONY_FX = 1
  454. self.data.elem_commands[self.attr]["bg"] = "red"
  455. elif self.attr == "STORE":
  456. if event.num == 1:
  457. if self.data.val_commands[self.attr]:
  458. self.data.val_commands[self.attr] = 0
  459. STORE = 0
  460. self.data.elem_commands[self.attr]["bg"] = "lightgrey"
  461. else:
  462. self.data.val_commands[self.attr] = 1
  463. STORE = 1
  464. self.data.elem_commands[self.attr]["bg"] = "red"
  465. print("BLIND",self.data.val_commands)
  466. elif self.attr == "BACKUP":
  467. self.data.PRESETS.backup_presets()
  468. self.data.FIXTURES.backup_patch()
  469. return 0
  470. elif self.mode == "ROOT":
  471. if event.keysym=="Escape":
  472. pass
  473. #STORE = 0
  474. #LABEL = 0
  475. elif self.mode == "INPUT":
  476. print("INP",self.data.entry.get())
  477. if event.keycode == 36:
  478. x=self.data.entry.get()
  479. client.send(x)
  480. #self.data.entry.clean()
  481. #self.data
  482. #chat.send("")
  483. elif self.mode == "INPUT2":
  484. print("INP2",self.data.entry2.get())
  485. if event.keycode == 36:
  486. x=self.data.entry2.get()
  487. client.send(x)
  488. #self.data.entry.clean()
  489. elif self.mode == "INPUT3":
  490. print("INP3",self.data.entry3.get())
  491. if event.keycode == 36:
  492. x=self.data.entry3.get()
  493. client.send(x)
  494. #self.data.entry.clean()
  495. #self.data
  496. #chat.send("")
  497. elif self.mode == "PRESET":
  498. nr = self.attr #int(self.attr.split(":")[1])-1
  499. if event.num == 1:
  500. if STORE:
  501. print("STORE PRESET")
  502. sdata = {}
  503. sdata["CFG"] = OrderedDict()
  504. sdata["CFG"]["FADE"] = fade
  505. sdata["CFG"]["DEALY"] = 0
  506. sdata["CFG"]["BUTTON"] = "GO"
  507. for fix in self.data.FIXTURES.fixtures:
  508. data = self.data.FIXTURES.fixtures[fix]
  509. for attr in data["ATTRIBUT"]:
  510. if data["ATTRIBUT"][attr]["ACTIVE"]:
  511. if fix not in sdata:
  512. sdata[fix] = {}
  513. if attr not in sdata[fix]:
  514. sdata[fix][attr] = OrderedDict()
  515. if not STONY_FX:
  516. sdata[fix][attr]["VALUE"] = data["ATTRIBUT"][attr]["VALUE"]
  517. #sdata[fix][attr]["FADE"] = fade
  518. else:
  519. sdata[fix][attr]["VALUE"] = None #data["ATTRIBUT"][attr]["VALUE"]
  520. if "FX" not in data["ATTRIBUT"][attr]:
  521. data["ATTRIBUT"][attr]["FX"] =""
  522. sdata[fix][attr]["FX"] = data["ATTRIBUT"][attr]["FX"]
  523. print("sdata",sdata)
  524. self.data.PRESETS.val_presets[nr] = sdata
  525. if len(sdata) > 1:
  526. fx_color = 0
  527. val_color = 0
  528. for fix in sdata:
  529. if fix == "CFG":
  530. continue
  531. print( "$$$$",fix,sdata[fix])
  532. for attr in sdata[fix]:
  533. if "FX" in sdata[fix][attr]:
  534. if sdata[fix][attr]["FX"]:
  535. fx_color = 1
  536. if "VALUE" in sdata[fix][attr]:
  537. if sdata[fix][attr]["VALUE"] is not None:
  538. val_color = 1
  539. self.data.elem_presets[nr]["fg"] = "black"
  540. if val_color:
  541. self.data.elem_presets[nr]["bg"] = "yellow"
  542. if fx_color:
  543. self.data.elem_presets[nr]["fg"] = "blue"
  544. else:
  545. if fx_color:
  546. self.data.elem_presets[nr]["bg"] = "cyan"
  547. else:
  548. self.data.elem_presets[nr]["fg"] = "black"
  549. self.data.elem_presets[nr]["bg"] = "grey"
  550. #self.data.elem_presets[nr].option_add("*Font", FontBold)
  551. label = ""
  552. if nr in self.data.PRESETS.label_presets:
  553. #print(dir(self.data))
  554. label = self.data.PRESETS.label_presets[nr]
  555. BTN="go"
  556. if "CFG" in sdata:#["BUTTON"] = "GO"
  557. if "BUTTON" in sdata["CFG"]:
  558. BTN = sdata["CFG"]["BUTTON"]
  559. txt = str(nr)+":"+str(BTN)+":"+str(len(sdata)-1)+"\n"+label
  560. self.data.elem_presets[nr]["text"] = txt
  561. print("GO CFG ",self.data.PRESETS.val_presets)
  562. self.data.val_commands["STORE"] = 0
  563. STORE = 0
  564. self.data.elem_commands["STORE"]["bg"] = "lightgrey"
  565. elif CFG_BTN:
  566. import tkinter.simpledialog
  567. txt = tkinter.simpledialog.askstring("CFG-BTN","GO,FLASH,TOGGLE,SWOP\n EXE:"+str(nr))
  568. if "CFG" not in self.data.PRESETS.val_presets[nr]:
  569. self.data.PRESETS.val_presets[nr]["CFG"] = OrderedDict()
  570. if "BUTTON" not in self.data.PRESETS.val_presets[nr]["CFG"]:
  571. self.data.PRESETS.val_presets[nr]["CFG"]["BUTTON"] = ""
  572. self.data.PRESETS.val_presets[nr]["CFG"]["BUTTON"] = txt
  573. sdata=self.data.PRESETS.val_presets[nr]
  574. BTN="go"
  575. if "CFG" in sdata:#["BUTTON"] = "GO"
  576. if "BUTTON" in sdata["CFG"]:
  577. BTN = sdata["CFG"]["BUTTON"]
  578. label = self.data.PRESETS.label_presets[nr] # = label
  579. txt=str(nr)+":"+str(BTN)+":"+str(len(sdata)-1)+"\n"+label
  580. self.data.elem_presets[nr]["text"] = txt
  581. CFG_BTN = 0
  582. self.data.elem_commands["CFG-BTN"]["bg"] = "grey"
  583. elif LABEL:#else:
  584. label = "lalaal"
  585. import tkinter.simpledialog
  586. label = tkinter.simpledialog.askstring("LABEL","Preset "+str(nr))
  587. self.data.elem_presets[nr]["text"] = label
  588. self.data.PRESETS.label_presets[nr] = label
  589. sdata=self.data.PRESETS.val_presets[nr]
  590. BTN="go"
  591. if "CFG" in sdata:#["BUTTON"] = "GO"
  592. if "BUTTON" in sdata["CFG"]:
  593. BTN = sdata["CFG"]["BUTTON"]
  594. txt=str(nr)+":"+str(BTN)+":"+str(len(sdata)-1)+"\n"+label
  595. #txt = "Preset:"+str(nr)+":\n"+str(len(l))+":"+label
  596. self.data.elem_presets[nr]["text"] = txt
  597. LABEL = 0
  598. self.data.elem_commands["LABEL"]["bg"] = "lightgrey"
  599. elif SELECT:
  600. print("SELECT PRESET")
  601. sdata = self.data.PRESETS.val_presets[nr]
  602. cmd = ""
  603. for fix in sdata:
  604. if fix == "CFG":
  605. continue
  606. for attr in sdata[fix]:
  607. v2 = sdata[fix][attr]["VALUE"]
  608. v2_fx = sdata[fix][attr]["FX"]
  609. #print( self.data.elem_attr)
  610. elem = self.data.elem_attr[fix][attr]
  611. #self#encoder(attr=attr,data=data,elem=elem,action="click")
  612. self.data.FIXTURES.fixtures[fix]["ATTRIBUT"][attr]["ACTIVE"] = 1
  613. elem["bg"] = "yellow"
  614. else:
  615. print("GO PRESET FADE",nr)
  616. rdata = self.data.PRESETS.get_raw_map(nr)
  617. cfg = self.data.PRESETS.get_cfg(nr)
  618. fcmd = self.data.FIXTURES.update_raw(rdata)
  619. #virtcmd = self.data.FIXTURES.get_virtual(rdata)
  620. xFLASH = 0
  621. value=None
  622. xfade = fade
  623. if FLASH or ( "BUTTON" in cfg and cfg["BUTTON"] == "FL"): #FLASH
  624. xFLASH = 1
  625. xfade = 0
  626. if str(event.type) == "ButtonRelease":
  627. if xFLASH:
  628. value = "off"
  629. vvcmd = update_raw_dmx( rdata ,value,[xfade] )
  630. fxcmd = update_raw_dmx( rdata ,value,[xfade],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",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("GUI-H", 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()