Editor3.py 33 KB

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