Editor3.py 31 KB

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