Editor3.py 51 KB

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