Editor3.py 31 KB

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