Editor3.py 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848
  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 json
  18. import time
  19. import sys
  20. import _thread as thread
  21. import tkinter
  22. import tkinter as tk
  23. from tkinter import font
  24. import lib.chat as chat
  25. import lib.motion as motion
  26. root = tk.Tk()
  27. root["bg"] = "grey" #white
  28. root.title( __file__)
  29. #default_font = font.Font(family='Helvetica', size=12, weight='bold')
  30. Font = font.Font(family='Helvetica', size=9, weight='normal')
  31. FontBold = font.Font(family='Helvetica', size=9, weight='bold')
  32. #default_font.configure(size=9)
  33. root.option_add("*Font", Font)
  34. from collections import OrderedDict
  35. show_name = "GloryCamp2021"
  36. show_name = "GloryCamp2021"
  37. CUES = OrderedDict()
  38. groups = OrderedDict()
  39. BLIND = 0
  40. STORE = 0
  41. POS = ["PAN","TILT","MOTION"]
  42. COLOR = ["RED","GREEN","BLUE","COLOR"]
  43. BEAM = ["GOBO","G-ROT","PRISMA","P-ROT","FOCUS","SPEED"]
  44. INT = ["DIM","SHUTTER","STROBE","FUNC"]
  45. client = chat.tcp_sender()
  46. def update_dmx(attr,data):
  47. global BLIND
  48. dmx = data["DMX"]
  49. val = None
  50. if attr == "VDIM":
  51. for attr in data["ATTRIBUT"]:
  52. dmx = data["DMX"]
  53. if data["ATTRIBUT"][attr]["NR"] < 0:
  54. continue
  55. dmx += data["ATTRIBUT"][attr]["NR"]
  56. #print(attr)
  57. val = data["ATTRIBUT"][attr]["VALUE"]
  58. if data["ATTRIBUT"][attr]["MASTER"]:
  59. val = val * (data["ATTRIBUT"]["VDIM"]["VALUE"] / 255.)
  60. if val is not None:
  61. cmd = "d{}:{}".format(dmx,int(val))
  62. #print("cmd",cmd)
  63. if not BLIND:
  64. client.send(cmd )
  65. else:
  66. pass#print("BLIND ! cmd",cmd)
  67. elif data["ATTRIBUT"][attr]["NR"] >= 0:
  68. dmx += data["ATTRIBUT"][attr]["NR"]
  69. val = data["ATTRIBUT"][attr]["VALUE"]
  70. if data["ATTRIBUT"][attr]["MASTER"]:
  71. if "VDIM" in data["ATTRIBUT"]:
  72. val = val * (data["ATTRIBUT"]["VDIM"]["VALUE"] / 255.)
  73. if val is not None:
  74. cmd = "d{}:{}".format(dmx,int(val))
  75. #print("cmd",cmd)
  76. if not BLIND:
  77. client.send(cmd )
  78. else:
  79. pass#print("BLIND ! cmd",cmd)
  80. class Worker():
  81. def __init__(self):
  82. self.fade = OrderedDict()
  83. self.timer = time.time()
  84. def loop(self):
  85. while 1:
  86. self.next()
  87. def next(self):
  88. if self.timer+(1/30.) < time.time():
  89. try:
  90. lock.acquire()
  91. #if self.timer+1 < time.time():
  92. self.timer = time.time()
  93. #print("next")
  94. for fix in self.fade:
  95. for attr in self.fade[fix]:
  96. if 1:#len(self.fade[])>=2:
  97. fd=self.fade[fix][attr][0]
  98. xx=fd.next()
  99. if xx:
  100. x=fd.value
  101. #print("fade",xx,xx)
  102. data=self.fade[fix][attr][1]
  103. try:
  104. data["ATTRIBUT"][attr]["VALUE"] = x
  105. update_dmx(attr,data)
  106. except Exception as e:
  107. print("next EXCEPTION",e)
  108. finally:
  109. #lock.acquire()
  110. lock.release()
  111. else:
  112. time.sleep(0.1)
  113. def fade_dmx(self,fix,attr,data,v,v2,ft=None):
  114. if ft is None:
  115. ft = 4
  116. if data["ATTRIBUT"][attr]["MODE"] == "S":
  117. ft=0
  118. #print("fade_dmx",fix,attr,v,v2)
  119. try:
  120. lock.acquire()
  121. if fix not in self.fade:
  122. self.fade[fix] = OrderedDict()
  123. if attr not in self.fade[fix]:
  124. self.fade[fix][attr] = OrderedDict()
  125. self.fade[fix][attr] = [motion.FadeFast(v,v2,ft),data]
  126. finally:
  127. #lock.acquire()
  128. lock.release()
  129. worker = Worker()
  130. lock = thread.allocate_lock()
  131. thread.start_new_thread(worker.loop,())
  132. class Xevent():
  133. def __init__(self,fix,elem,attr=None,data=None,mode=None):
  134. self.data=data
  135. self.attr = attr
  136. self.elem = elem
  137. self.mode = mode
  138. def encoder(self,fix,attr,data,elem,action=""):
  139. if action == "click":
  140. if self.data["ATTRIBUT"][attr]["ACTIVE"]:
  141. self.data["ATTRIBUT"][attr]["ACTIVE"] = 0
  142. self.elem["bg"] = "grey"
  143. else:
  144. self.data["ATTRIBUT"][attr]["ACTIVE"] = 1
  145. self.elem["bg"] = "yellow"
  146. return 1
  147. v=data["ATTRIBUT"][attr]["VALUE"]
  148. change=0
  149. if action == "+":
  150. v+= 4.11
  151. change=1
  152. elif action == "-":
  153. v-= 4.11
  154. change=1
  155. if v < 0:
  156. v=0
  157. elif v > 256:
  158. v=256
  159. if change:
  160. data["ATTRIBUT"][attr]["ACTIVE"] = 1
  161. elem["bg"] = "yellow"
  162. v2 = v
  163. v = data["ATTRIBUT"][attr]["VALUE"]
  164. data["ATTRIBUT"][attr]["VALUE"] = v2
  165. elem["text"] = str(attr)+' '+str(round(v2,2))
  166. worker.fade_dmx(fix,attr,data,v,v2,ft=0)
  167. #update_dmx(attr=attr,data=data)
  168. def cb(self,event):
  169. #print("cb",self,event,data)
  170. print("cb",self.attr,self.mode,event)
  171. #print(self.obj.keys())
  172. try:
  173. #v = self.data["ATTRIBUT"][self.attr]
  174. global STORE
  175. global BLIND
  176. change = 0
  177. if self.mode == "COMMAND":
  178. if self.attr == "CLEAR":
  179. if event.num == 1:
  180. if STORE:
  181. self.data.val_commands["STORE"] = 0
  182. STORE = 0
  183. self.data.elem_commands["STORE"]["bg"] = "lightgrey"
  184. else:
  185. for fix in self.data.fixtures:
  186. print( "clr",fix)
  187. data = self.data.fixtures[fix]
  188. #print("elm",self.data.elem_attr[fix])
  189. for attr in data["ATTRIBUT"]:
  190. if attr.endswith("-FINE"):
  191. continue
  192. self.data.elem_attr[fix][attr]["bg"] = "grey"
  193. data["ATTRIBUT"][attr]["ACTIVE"] = 0
  194. #print(data["ATTRIBUT"])
  195. elif self.attr == "BLIND":
  196. if event.num == 1:
  197. if self.data.val_commands[self.attr]:
  198. self.data.val_commands[self.attr] = 0
  199. BLIND = 0
  200. self.data.elem_commands[self.attr]["bg"] = "lightgrey"
  201. else:
  202. self.data.val_commands[self.attr] = 1
  203. BLIND = 1
  204. self.data.elem_commands[self.attr]["bg"] = "red"
  205. print("BLIND",self.data.val_commands)
  206. elif self.attr == "STORE":
  207. if event.num == 1:
  208. if self.data.val_commands[self.attr]:
  209. self.data.val_commands[self.attr] = 0
  210. STORE = 0
  211. self.data.elem_commands[self.attr]["bg"] = "lightgrey"
  212. else:
  213. self.data.val_commands[self.attr] = 1
  214. STORE = 1
  215. self.data.elem_commands[self.attr]["bg"] = "red"
  216. print("BLIND",self.data.val_commands)
  217. elif self.attr == "BACKUP":
  218. self.data.backup_presets()
  219. return 0
  220. elif self.mode == "PRESET":
  221. nr = self.attr #int(self.attr.split(":")[1])-1
  222. if event.num == 1:
  223. if STORE:
  224. print("STORE PRESET")
  225. sdata = {}
  226. for fix in self.data.fixtures:
  227. data = self.data.fixtures[fix]
  228. for attr in data["ATTRIBUT"]:
  229. if data["ATTRIBUT"][attr]["ACTIVE"]:
  230. if fix not in sdata:
  231. sdata[fix] = {}
  232. if attr not in sdata[fix]:
  233. sdata[fix][attr] = data["ATTRIBUT"][attr]["VALUE"]
  234. print(sdata)
  235. self.data.val_presets[nr] = sdata
  236. if len(sdata):
  237. self.data.elem_presets[nr]["bg"] = "yellow"
  238. else:
  239. self.data.elem_presets[nr]["bg"] = "grey"
  240. #self.data.elem_presets[nr].option_add("*Font", FontBold)
  241. label = ""
  242. if nr in self.data.label_presets:
  243. #print(dir(self.data))
  244. label = self.data.label_presets[nr]
  245. self.data.elem_presets[nr]["text"] = "Preset:"+str(nr)+":\n"+str(len(sdata))+":"+label
  246. print(self.data.val_presets)
  247. self.data.val_commands["STORE"] = 0
  248. STORE = 0
  249. self.data.elem_commands["STORE"]["bg"] = "lightgrey"
  250. else:
  251. print("GO PRESET")
  252. if nr not in self.data.val_presets:
  253. self.data.val_presets[nr] = OrderedDict()
  254. sdata = self.data.val_presets[nr]
  255. for fix in sdata:
  256. for attr in sdata[fix]:
  257. v2 = sdata[fix][attr]
  258. #print(fix,attr,v)
  259. if fix in self.data.fixtures:
  260. #print("==",self.data.fixtures[fix]["ATTRIBUT"])
  261. if attr in self.data.fixtures[fix]["ATTRIBUT"]:
  262. data = self.data.fixtures[fix]
  263. v=self.data.fixtures[fix]["ATTRIBUT"][attr]["VALUE"]
  264. self.data.fixtures[fix]["ATTRIBUT"][attr]["VALUE"] = v2
  265. self.data.elem_attr[fix][attr]["text"] = str(attr)+' '+str(round(v,2))
  266. #update_dmx(attr,data)
  267. worker.fade_dmx(fix,attr,data,v,v2)
  268. print(sdata)
  269. if event.num == 3:
  270. if not STORE:
  271. print("GO PRESET 3")
  272. if nr not in self.data.val_presets:
  273. self.data.val_presets[nr] = OrderedDict()
  274. sdata = self.data.val_presets[nr]
  275. for fix in sdata:
  276. for attr in sdata[fix]:
  277. v2 = sdata[fix][attr]
  278. #print(fix,attr,v)
  279. if fix in self.data.fixtures:
  280. #print("==",self.data.fixtures[fix]["ATTRIBUT"])
  281. if attr in self.data.fixtures[fix]["ATTRIBUT"]:
  282. data = self.data.fixtures[fix]
  283. v=self.data.fixtures[fix]["ATTRIBUT"][attr]["VALUE"]
  284. #self.data.fixtures[fix]["ATTRIBUT"][attr]["VALUE"] = v
  285. #print(str(attr)+' '+str(round(v,2)))
  286. #self.data.elem_attr[fix][attr]["text"] = str(attr)+' '+str(round(v,2))
  287. #update_dmx(attr,data)
  288. print("go",fix,attr,v,v2)
  289. worker.fade_dmx(fix,attr,data,v,v2,ft=0)
  290. return 0
  291. elif self.mode == "INPUT":
  292. return 0
  293. if self.mode == "ENCODER":
  294. #if self.attr == "VDIM":
  295. # self.attr = "DIM"
  296. for fix in self.data.fixtures:
  297. data = self.data.fixtures[fix]
  298. for attr in data["ATTRIBUT"]:
  299. if attr.endswith("-FINE"):
  300. continue
  301. elem = self.data.elem_attr[fix][attr]
  302. if self.attr != attr:
  303. continue
  304. if event.num == 1:
  305. #self.encoder(attr=attr,data=data,elem=elem,action="click")
  306. data["ATTRIBUT"][attr]["ACTIVE"] = 1
  307. elem["bg"] = "yellow"
  308. if not data["ATTRIBUT"][attr]["ACTIVE"]:
  309. continue
  310. if event.num == 4:
  311. self.encoder(fix=fix,attr=attr,data=data,elem=elem,action="+")
  312. #if attr == "DIM":
  313. # self.encoder(attr="VDIM",data=data,elem=elem,action="+")
  314. elif event.num == 5:
  315. self.encoder(fix=fix,attr=attr,data=data,elem=elem,action="-")
  316. #if attr == "DIM":
  317. # self.encoder(attr="VDIM",data=data,elem=elem,action="-")
  318. return 0
  319. if event.num == 1:
  320. self.encoder(fix=0,attr=self.attr,data=self.data,elem=self.elem,action="click")
  321. elif event.num == 4:
  322. self.encoder(fix=0,attr=self.attr,data=self.data,elem=self.elem,action="+")
  323. elif event.num == 5:
  324. self.encoder(fix=0,attr=self.attr,data=self.data,elem=self.elem,action="-")
  325. except Exception as e:
  326. print("== cb EXCEPT",e)
  327. print("Error on line {}".format(sys.exc_info()[-1].tb_lineno))
  328. #print(self.elem["text"],self.attr,self.data)
  329. def wheel(event,d=None):
  330. print("wheel",event,d)
  331. import copy
  332. class Master():
  333. def __init__(self):
  334. self.load()
  335. self.all_attr =["DIM","VDIM","PAN","TILT"]
  336. self.elem_attr = {}
  337. self.commands =["BLIND","CLEAR","STORE","EDIT","","","","BACKUP","SET","","SELECT","ACTIVATE","","","",]
  338. self.elem_commands = {}
  339. self.val_commands = {}
  340. self.elem_presets = {}
  341. self.load_presets()
  342. for i in range(8*6):
  343. if i not in self.val_presets:
  344. name = "Preset:"+str(i+1)+":\nXYZ"
  345. #self.presets[i] = [i]
  346. self.val_presets[i] = OrderedDict()
  347. self.label_presets[i] = "-"
  348. def load(self):
  349. fixture = OrderedDict()
  350. DATA = OrderedDict()
  351. DATA["DIM"] = {"NR": 0, "MASTER": "1", "MODE": "F", "VALUE": 0.0,"ACTIVE":0}
  352. fix = {"DMX": 20, "UNIVERS": 2, "NAME": "D", "ATTRIBUT": DATA}
  353. fi = copy.deepcopy(fix)
  354. fi["DMX"] = 1
  355. fi["NAME"] = "F1"
  356. fixture["1"] = fi
  357. fi = copy.deepcopy(fix)
  358. fi["DMX"] = 2
  359. fi["NAME"] = "F2"
  360. fixture["2"] = fi
  361. fi = copy.deepcopy(fix)
  362. fi["DMX"] = 3
  363. fi["NAME"] = "F3"
  364. fixture["3"] = fi
  365. fi = copy.deepcopy(fix)
  366. fi["DMX"] = 4
  367. fi["NAME"] = "F4"
  368. fixture["4"] = fi
  369. fi = copy.deepcopy(fix)
  370. fi["DMX"] = 11
  371. fi["NAME"] = "FL"
  372. fixture["11"] = fi
  373. fi = copy.deepcopy(fix)
  374. fi["DMX"] = 24
  375. fi["NAME"] = "P"
  376. fixture["24"] = fi
  377. DATA = OrderedDict()
  378. DATA["DIM"] = {"NR": 0, "MASTER": "1", "MODE": "F", "VALUE": 0.0,"ACTIVE":0}
  379. DATA["RED"] = {"NR": 3, "MASTER": "", "MODE": "F", "VALUE": 255.0,"ACTIVE":0}
  380. DATA["GREEN"] = {"NR": 4, "MASTER": "", "MODE": "F", "VALUE": 255.0,"ACTIVE":0}
  381. DATA["BLUE"] = {"NR": 5, "MASTER": "", "MODE": "F", "VALUE": 127.0,"ACTIVE":0}
  382. fix = {"DMX": 20, "UNIVERS": 2, "NAME": "IRGB", "ATTRIBUT": DATA}
  383. fi = copy.deepcopy(fix)
  384. fi["DMX"] = 401
  385. #fixture["1001"] = fi
  386. fi = copy.deepcopy(fix)
  387. fi["DMX"] = 421
  388. fi["ATTRIBUT"]["BLUE"]["VALUE"] = 22
  389. #fixture["1002"] = fi
  390. fi = copy.deepcopy(fix)
  391. fi["DMX"] = 441
  392. fi["ATTRIBUT"]["BLUE"]["VALUE"] = 22
  393. #fixture["1003"] = fi
  394. DATA = OrderedDict()
  395. DATA["VDIM"] = {"NR": -1, "MASTER": "", "MODE": "F", "VALUE": 0.0,"ACTIVE":0}
  396. DATA["RED"] = {"NR": 2, "MASTER": "1", "MODE": "F", "VALUE": 255.0,"ACTIVE":0}
  397. DATA["GREEN"] = {"NR": 1, "MASTER": "1", "MODE": "F", "VALUE": 255.0,"ACTIVE":0}
  398. DATA["BLUE"] = {"NR": 0, "MASTER": "1", "MODE": "F", "VALUE": 127.0,"ACTIVE":0}
  399. fix3 = {"DMX": 20, "UNIVERS": 2, "NAME": "V+RGB", "ATTRIBUT": DATA}
  400. fi = copy.deepcopy(fix3)
  401. fi["DMX"] = 330
  402. #fixture["2001"] = fi
  403. fi = copy.deepcopy(fix3)
  404. fi["DMX"] = 335
  405. #fixture["2002"] = fi
  406. fi = copy.deepcopy(fix3)
  407. fi["DMX"] = 240
  408. #fixture["2003"] = fi
  409. fi = copy.deepcopy(fix3)
  410. fi["DMX"] = 245
  411. #fixture["2004"] = fi
  412. fi = copy.deepcopy(fix3)
  413. fi["DMX"] = 250
  414. #fixture["2005"] = fi
  415. fi = copy.deepcopy(fix3)
  416. fi["DMX"] = 355
  417. #fixture["2006"] = fi
  418. DATA = OrderedDict()
  419. DATA["DIM-FINE"] = {"NR": 8, "MASTER": "", "MODE": "F", "VALUE": 5.0,"ACTIVE":0}
  420. DATA["VDIM"] = {"NR": -1, "MASTER": "", "MODE": "F", "VALUE": 0.0,"ACTIVE":0}
  421. DATA["PAN"] = {"NR": 0, "MASTER": "", "MODE": "F", "VALUE": 127.0,"ACTIVE":0}
  422. DATA["PAN-FINE"] = {"NR": 1, "MASTER": "", "MODE": "F", "VALUE": 127.0,"ACTIVE":0}
  423. DATA["TILT"] = {"NR": 2, "MASTER": "", "MODE": "F", "VALUE": 127.0,"ACTIVE":0}
  424. DATA["TILT-FINE"] = {"NR": 3, "MASTER": "", "MODE": "F", "VALUE": 127.0,"ACTIVE":0}
  425. DATA["RED"] = {"NR": 6, "MASTER": "1", "MODE": "F", "VALUE": 255.0,"ACTIVE":0}
  426. DATA["GREEN"] = {"NR": 7, "MASTER": "1", "MODE": "F", "VALUE": 255.0,"ACTIVE":0}
  427. DATA["BLUE"] = {"NR": 8, "MASTER": "1", "MODE": "F", "VALUE": 127.0,"ACTIVE":0}
  428. fixTMH = {"DMX": 20, "UNIVERS": 2, "NAME": "MH-BEAM", "ATTRIBUT": DATA}
  429. fi = copy.deepcopy(fixTMH)
  430. fi["DMX"] = 241
  431. fixture["3001"] = fi
  432. fi = copy.deepcopy(fixTMH)
  433. fi["DMX"] = 461
  434. fixture["3002"] = fi
  435. DATA = OrderedDict()
  436. DATA["DIM"] = {"NR": 17, "MASTER": "1", "MODE": "F", "VALUE": 0.0,"ACTIVE":0}
  437. DATA["PAN"] = {"NR": 0, "MASTER": "", "MODE": "F", "VALUE": 127.0,"ACTIVE":0}
  438. DATA["PAN-FINE"] = {"NR": 1, "MASTER": "", "MODE": "F", "VALUE": 127.0,"ACTIVE":0}
  439. DATA["TILT"] = {"NR": 2, "MASTER": "", "MODE": "F", "VALUE": 127.0,"ACTIVE":0}
  440. DATA["TILT-FINE"] = {"NR": 3, "MASTER": "", "MODE": "F", "VALUE": 127.0,"ACTIVE":0}
  441. DATA["COLOR"] = {"NR": 8, "MASTER": "", "MODE": "S", "VALUE": 0.0,"ACTIVE":0}
  442. DATA["GOBO"] = {"NR": 9, "MASTER": "", "MODE": "S", "VALUE": 0.0,"ACTIVE":0}
  443. DATA["G-ROT"] = {"NR": 8, "MASTER": "", "MODE": "S", "VALUE": 192.0,"ACTIVE":0}
  444. DATA["PRINSMA"] = {"NR": 10, "MASTER": "", "MODE": "S", "VALUE": 0.0,"ACTIVE":0}
  445. DATA["P-ROT"] = {"NR": 11, "MASTER": "", "MODE": "S", "VALUE": 0.0,"ACTIVE":0}
  446. DATA["FOCUS"] = {"NR": 14, "MASTER": "", "MODE": "F", "VALUE": 0.0,"ACTIVE":0}
  447. DATA["ZOOM"] = {"NR": 13, "MASTER": "", "MODE": "F", "VALUE": 0.0,"ACTIVE":0}
  448. DATA["FROST"] = {"NR": 15, "MASTER": "", "MODE": "F", "VALUE": 0.0,"ACTIVE":0}
  449. DATA["CONTROL"] = {"NR": 5, "MASTER": "", "MODE": "S", "VALUE": 5.0,"ACTIVE":0}
  450. fixREUSH = {"DMX": 300, "UNIVERS": 2, "NAME": "RUSH-BEAM", "ATTRIBUT": DATA}
  451. fi = copy.deepcopy(fixREUSH)
  452. fi["DMX"] = 201
  453. fixture["701"] = fi
  454. fi = copy.deepcopy(fixREUSH)
  455. fi["DMX"] = 220
  456. #fixture["702"] = fi
  457. fi = copy.deepcopy(fixREUSH)
  458. fi["DMX"] = 239
  459. #fixture["703"] = fi
  460. fi = copy.deepcopy(fixREUSH)
  461. fi["DMX"] = 258
  462. #fixture["704"] = fi
  463. fi = copy.deepcopy(fixREUSH)
  464. fi["DMX"] = 277
  465. #fixture["705"] = fi
  466. fi = copy.deepcopy(fixREUSH)
  467. fi["DMX"] = 296
  468. #fixture["706"] = fi
  469. self.fixtures = fixture
  470. def load_presets(self):
  471. filename="presets"
  472. d,l = self._load(filename)
  473. self.val_presets = d
  474. self.label_presets = l
  475. def _load(self,filename):
  476. xfname = "show/"+show_name+"/"+str(filename)+".sav"
  477. print("load",xfname)
  478. f = open(xfname,"r")
  479. lines = f.readlines()
  480. f.close()
  481. data = OrderedDict()
  482. labels = OrderedDict()
  483. for line in lines:
  484. key,label,rdata = line.split("\t",2)
  485. key = int(key)
  486. print(xfname,"load",key,label)
  487. jdata = json.loads(rdata,object_pairs_hook=OrderedDict)
  488. data[key] = jdata
  489. labels[key] = label
  490. return data,labels
  491. def backup_presets(self):
  492. filename = "presets"
  493. data = self.val_presets
  494. labels = self.label_presets
  495. self._backup(filename,data,labels)
  496. def _backup(self,filename,data,labels):
  497. #fixture
  498. xfname = "show/"+show_name+"/"+str(filename)+".sav"
  499. print("backup",xfname)
  500. f = open(xfname,"w")
  501. for key in data:
  502. line = data[key]
  503. label = "label"
  504. if key in labels:
  505. label = labels[key]
  506. if label == "Name-"+str(key):
  507. label = ""
  508. print(xfname,"load",key,label,len(line))
  509. f.write(str(key)+"\t"+label+"\t"+json.dumps(line)+"\n")
  510. f.close()
  511. def draw_dim(self,fix,data,c=0,r=0,frame=None):
  512. i=0
  513. if frame is None:
  514. frame = tk.Frame(root,bg="black")
  515. frame.pack(fill=tk.X, side=tk.TOP)
  516. #b = tk.Button(frame,bg="lightblue", text="FIX:"+str(fix)+" "+data["NAME"],width=20)
  517. #b.bind("<Button>",Xevent(fix=fix,elem=b).cb)
  518. #b.grid(row=r, column=c, sticky=tk.W+tk.E)
  519. #c+=1
  520. #r+=1
  521. if fix not in self.elem_attr:
  522. self.elem_attr[fix] = {}
  523. for attr in data["ATTRIBUT"]:
  524. if attr not in self.all_attr:
  525. self.all_attr.append(attr)
  526. if attr not in self.elem_attr[fix]:
  527. self.elem_attr[fix][attr] = []
  528. if attr.endswith("-FINE"):
  529. continue
  530. v= data["ATTRIBUT"][attr]["VALUE"]
  531. b = tk.Button(frame,bg="lightblue", text=""+str(fix)+" "+data["NAME"],width=4)
  532. #b.bind("<Button>",Xevent(fix=fix,elem=b).cb)
  533. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  534. c+=1
  535. b = tk.Button(frame,bg="grey", text=str(attr)+' '+str(round(v,2)),width=6)
  536. self.elem_attr[fix][attr] = b
  537. b.bind("<Button>",Xevent(fix=fix,elem=b,attr=attr,data=data).cb)
  538. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  539. c+=1
  540. if c >=12:
  541. c=0
  542. r+=1
  543. return c,r
  544. def draw_fix(self,fix,data):
  545. i=0
  546. c=0
  547. r=0
  548. frame = tk.Frame(root,bg="black")
  549. frame.pack(fill=tk.X, side=tk.TOP)
  550. b = tk.Button(frame,bg="lightblue", text="FIX:"+str(fix)+" "+data["NAME"],width=20)
  551. b.bind("<Button>",Xevent(fix=fix,elem=b).cb)
  552. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  553. c+=1
  554. #r+=1
  555. if fix not in self.elem_attr:
  556. self.elem_attr[fix] = {}
  557. for attr in data["ATTRIBUT"]:
  558. if attr not in self.all_attr:
  559. self.all_attr.append(attr)
  560. if attr not in self.elem_attr[fix]:
  561. self.elem_attr[fix][attr] = []
  562. if attr.endswith("-FINE"):
  563. continue
  564. v= data["ATTRIBUT"][attr]["VALUE"]
  565. b = tk.Button(frame,bg="grey", text=str(attr)+' '+str(round(v,2)),width=8)
  566. self.elem_attr[fix][attr] = b
  567. b.bind("<Button>",Xevent(fix=fix,elem=b,attr=attr,data=data).cb)
  568. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  569. c+=1
  570. if c >=14:
  571. c=1
  572. r+=1
  573. def draw_enc(self):
  574. i=0
  575. c=0
  576. r=0
  577. #frame = tk.Frame(root,bg="black")
  578. #frame.pack(fill=tk.X, side=tk.TOP)
  579. #b = tk.Label(frame,bg="black", text="--------------------------------------- ---------------------------------------")
  580. #b.grid(row=r, column=c, sticky=tk.W+tk.E)
  581. #r=0
  582. frame = tk.Frame(root,bg="black")
  583. frame.pack(fill=tk.X, side=tk.TOP)
  584. b = tk.Button(frame,bg="lightblue", text="ENCODER",width=10)
  585. #b.bind("<Button>",Xevent(fix=fix,elem=b).cb)
  586. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  587. #r+=1
  588. c+=1
  589. for attr in self.all_attr:
  590. if attr.endswith("-FINE"):
  591. continue
  592. v=0
  593. b = tk.Button(frame,bg="orange", text=str(attr)+'',width=10)
  594. b.bind("<Button>",Xevent(fix=0,elem=b,attr=attr,data=self,mode="ENCODER").cb)
  595. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  596. c+=1
  597. if c >=10:
  598. c=0
  599. r+=1
  600. def draw_command(self):
  601. i=0
  602. c=0
  603. r=0
  604. #frame = tk.Frame(root,bg="black")
  605. #frame.pack(fill=tk.X, side=tk.TOP)
  606. #b = tk.Label(frame,bg="black", text="--------------------------------------- ---------------------------------------")
  607. #b.grid(row=r, column=c, sticky=tk.W+tk.E)
  608. #r=0
  609. frame = tk.Frame(root,bg="black")
  610. frame.pack(fill=tk.X, side=tk.TOP)
  611. b = tk.Button(frame,bg="lightblue", text="COMMANDS",width=10)
  612. #b.bind("<Button>",Xevent(fix=fix,elem=b).cb)
  613. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  614. #r+=1
  615. c+=1
  616. for comm in self.commands:
  617. v=0
  618. b = tk.Button(frame,bg="lightgrey", text=str(comm),width=10)
  619. if comm not in self.elem_commands:
  620. self.elem_commands[comm] = b
  621. self.val_commands[comm] = 0
  622. b.bind("<Button>",Xevent(fix=0,elem=b,attr=comm,data=self,mode="COMMAND").cb)
  623. if comm:
  624. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  625. c+=1
  626. if c >=8:
  627. c=0
  628. r+=1
  629. def draw_preset(self):
  630. i=0
  631. c=0
  632. r=0
  633. frame = tk.Frame(root,bg="black")
  634. frame.pack(fill=tk.X, side=tk.TOP)
  635. b = tk.Label(frame,bg="black", text="--------------------------------------- ---------------------------------------")
  636. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  637. r=0
  638. frame = tk.Frame(root,bg="black")
  639. frame.pack(fill=tk.X, side=tk.TOP)
  640. b = tk.Button(frame,bg="lightblue", text="PRESET")
  641. #b.bind("<Button>",Xevent(elem=b).cb)
  642. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  643. r+=1
  644. for k in self.val_presets:
  645. v=0
  646. label = ""
  647. if k in self.label_presets:
  648. label = self.label_presets[k]
  649. print([label])
  650. b = tk.Button(frame,bg="grey", text="Preset:"+str(k)+"\n"+str(len(self.val_presets[k]))+":"+label,width=8,height=2)
  651. b.bind("<Button>",Xevent(fix=0,elem=b,attr=k,data=self,mode="PRESET").cb)
  652. if k in self.val_presets and len(self.val_presets[k]) :
  653. b["bg"] = "yellow"
  654. if k not in self.elem_presets:
  655. self.elem_presets[k] = b
  656. #self.val_presets[preset] = 0
  657. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  658. c+=1
  659. if c >=8:
  660. c=0
  661. r+=1
  662. def draw_input(self):
  663. i=0
  664. c=0
  665. r=0
  666. frame = tk.Frame(root,bg="black")
  667. frame.pack(fill=tk.X, side=tk.TOP)
  668. b = tk.Label(frame,bg="black", text="--------------------------------------- ---------------------------------------")
  669. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  670. r=0
  671. frame = tk.Frame(root,bg="black")
  672. frame.pack(fill=tk.X, side=tk.TOP)
  673. b = tk.Label(frame, text="send:")
  674. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  675. c+=1
  676. b = tk.Entry(frame,bg="grey", text="",width=39)
  677. b.bind("<Button>",Xevent(fix=0,elem=b,attr="INPUT",data=self,mode="INPUT").cb)
  678. b.bind("<Key>",Xevent(fix=0,elem=b,attr="INPUT",data=self,mode="INPUT").cb)
  679. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  680. def render(self):
  681. r=0
  682. c=0
  683. dim_frame = tk.Frame(root,bg="black")
  684. dim_frame.pack(fill=tk.X, side=tk.TOP)
  685. for fix in self.fixtures:
  686. data = self.fixtures[fix]
  687. print( fix )
  688. if(len(data["ATTRIBUT"].keys()) <= 1):
  689. c,r=self.draw_dim(fix,data,c=c,r=r,frame=dim_frame)
  690. else:
  691. self.draw_fix(fix,data)
  692. self.draw_enc()
  693. self.draw_command()
  694. self.draw_input()
  695. self.draw_preset()
  696. master =Master()
  697. master.render()
  698. root.mainloop()
  699. sys.exit()