Editor2.py 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528
  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 time
  18. import tkinter
  19. import sys
  20. import _thread as thread
  21. import tkinter as tk
  22. from tkinter import font
  23. import lib.chat as chat
  24. root = tk.Tk()
  25. root["bg"] = "red"
  26. #default_font = font.Font(family='Helvetica', size=12, weight='bold')
  27. default_font = font.Font(family='Helvetica', size=10, weight='normal')
  28. #default_font.configure(size=9)
  29. root.option_add("*Font", default_font)
  30. from collections import OrderedDict
  31. CUES = OrderedDict()
  32. groups = OrderedDict()
  33. BLIND = 0
  34. POS = ["PAN","TILT","MOTION"]
  35. COLOR = ["RED","GREEN","BLUE","COLOR"]
  36. BEAM = ["GOBO","G-ROT","PRISMA","P-ROT","FOCUS","SPEED"]
  37. INT = ["DIM","SHUTTER","STROBE","FUNC"]
  38. client = chat.tcp_sender()
  39. class Xevent():
  40. def __init__(self,elem,attr=None,data=None,mode=None):
  41. self.data=data
  42. self.attr = attr
  43. self.elem = elem
  44. self.mode = mode
  45. def encoder(self,attr,data,elem,action=""):
  46. if action == "click":
  47. if self.data["ATTRIBUT"][attr]["ACTIVE"]:
  48. self.data["ATTRIBUT"][attr]["ACTIVE"] = 0
  49. self.elem["bg"] = "grey"
  50. else:
  51. self.data["ATTRIBUT"][attr]["ACTIVE"] = 1
  52. self.elem["bg"] = "yellow"
  53. return 1
  54. v=data["ATTRIBUT"][attr]["VALUE"]
  55. change=0
  56. if action == "+":
  57. v+= 4.11
  58. change=1
  59. elif action == "-":
  60. v-= 4.11
  61. change=1
  62. if v < 0:
  63. v=0
  64. elif v > 256:
  65. v=256
  66. if change:
  67. data["ATTRIBUT"][attr]["ACTIVE"] = 1
  68. elem["bg"] = "yellow"
  69. data["ATTRIBUT"][attr]["VALUE"] = v
  70. elem["text"] = str(attr)+' '+str(round(v,2))
  71. self.update_dmx(attr=attr,data=data)
  72. def update_dmx(self,attr,data):
  73. global BLIND
  74. dmx = data["DMX"]
  75. val = None
  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{}:{}".format(dmx,int(val))
  88. #print("cmd",cmd)
  89. if not BLIND:
  90. client.send(cmd )
  91. else:
  92. pass#print("BLIND ! cmd",cmd)
  93. elif data["ATTRIBUT"][attr]["NR"] >= 0:
  94. dmx += data["ATTRIBUT"][attr]["NR"]
  95. val = data["ATTRIBUT"][attr]["VALUE"]
  96. if data["ATTRIBUT"][attr]["MASTER"]:
  97. if "VDIM" in data["ATTRIBUT"]:
  98. val = val * (data["ATTRIBUT"]["VDIM"]["VALUE"] / 255.)
  99. if val is not None:
  100. cmd = "d{}:{}".format(dmx,int(val))
  101. #print("cmd",cmd)
  102. if not BLIND:
  103. client.send(cmd )
  104. else:
  105. pass#print("BLIND ! cmd",cmd)
  106. def cb(self,event):
  107. #print("cb",self,event,data)
  108. print("cb",self.attr,self.mode,event)
  109. #print(self.obj.keys())
  110. try:
  111. #v = self.data["ATTRIBUT"][self.attr]
  112. change = 0
  113. if self.mode == "COMMAND":
  114. if self.attr == "CLEAR":
  115. if event.num == 1:
  116. for fix in self.data.fixtures:
  117. print( "clr",fix)
  118. data = self.data.fixtures[fix]
  119. #print("elm",self.data.elem_attr[fix])
  120. for attr in data["ATTRIBUT"]:
  121. if attr.endswith("-FINE"):
  122. continue
  123. self.data.elem_attr[fix][attr]["bg"] = "grey"
  124. data["ATTRIBUT"][attr]["ACTIVE"] = 0
  125. #print(data["ATTRIBUT"])
  126. if self.attr == "BLIND":
  127. global BLIND
  128. if event.num == 1:
  129. if self.data.val_commands[self.attr]:
  130. self.data.val_commands[self.attr] = 0
  131. BLIND = 0
  132. self.data.elem_command[self.attr]["bg"] = "green"
  133. else:
  134. self.data.val_commands[self.attr] = 1
  135. BLIND = 1
  136. self.data.elem_command[self.attr]["bg"] = "red"
  137. print("BLIND",self.data.val_commands)
  138. return 0
  139. if self.mode == "ENCODER":
  140. #if self.attr == "VDIM":
  141. # self.attr = "DIM"
  142. for fix in self.data.fixtures:
  143. data = self.data.fixtures[fix]
  144. for attr in data["ATTRIBUT"]:
  145. if attr.endswith("-FINE"):
  146. continue
  147. elem = self.data.elem_attr[fix][attr]
  148. if self.attr != attr:
  149. continue
  150. if event.num == 1:
  151. #self.encoder(attr=attr,data=data,elem=elem,action="click")
  152. data["ATTRIBUT"][attr]["ACTIVE"] = 1
  153. elem["bg"] = "yellow"
  154. if not data["ATTRIBUT"][attr]["ACTIVE"]:
  155. continue
  156. if event.num == 4:
  157. self.encoder(attr=attr,data=data,elem=elem,action="+")
  158. #if attr == "DIM":
  159. # self.encoder(attr="VDIM",data=data,elem=elem,action="+")
  160. elif event.num == 5:
  161. self.encoder(attr=attr,data=data,elem=elem,action="-")
  162. #if attr == "DIM":
  163. # self.encoder(attr="VDIM",data=data,elem=elem,action="-")
  164. return 0
  165. if event.num == 1:
  166. self.encoder(attr=self.attr,data=self.data,elem=self.elem,action="click")
  167. elif event.num == 4:
  168. self.encoder(attr=self.attr,data=self.data,elem=self.elem,action="+")
  169. elif event.num == 5:
  170. self.encoder(attr=self.attr,data=self.data,elem=self.elem,action="-")
  171. except Exception as e:
  172. print("== cb EXCEPT",e)
  173. print("Error on line {}".format(sys.exc_info()[-1].tb_lineno))
  174. #print(self.elem["text"],self.attr,self.data)
  175. def wheel(event,d=None):
  176. print("wheel",event,d)
  177. import copy
  178. class Master():
  179. def __init__(self):
  180. self.load()
  181. self.all_attr =[]
  182. self.elem_attr = {}
  183. self.commands =["BLIND","CLEAR","STORE"]
  184. self.elem_command = {}
  185. self.val_commands = {}
  186. def load(self):
  187. fixture = OrderedDict()
  188. DATA = OrderedDict()
  189. DATA["DIM"] = {"NR": 0, "MASTER": "1", "MODE": "F", "VALUE": 0.0,"ACTIVE":0}
  190. DATA["RED"] = {"NR": 3, "MASTER": "", "MODE": "F", "VALUE": 255.0,"ACTIVE":0}
  191. DATA["GREEN"] = {"NR": 4, "MASTER": "", "MODE": "F", "VALUE": 255.0,"ACTIVE":0}
  192. DATA["BLUE"] = {"NR": 5, "MASTER": "", "MODE": "F", "VALUE": 127.0,"ACTIVE":0}
  193. fix = {"DMX": 20, "UNIVERS": 2, "NAME": "IRGB", "ATTRIBUT": DATA}
  194. DATA = OrderedDict()
  195. DATA["VDIM"] = {"NR": -1, "MASTER": "", "MODE": "F", "VALUE": 0.0,"ACTIVE":0}
  196. DATA["RED"] = {"NR": 2, "MASTER": "1", "MODE": "F", "VALUE": 255.0,"ACTIVE":0}
  197. DATA["GREEN"] = {"NR": 1, "MASTER": "1", "MODE": "F", "VALUE": 255.0,"ACTIVE":0}
  198. DATA["BLUE"] = {"NR": 0, "MASTER": "1", "MODE": "F", "VALUE": 127.0,"ACTIVE":0}
  199. fix3 = {"DMX": 20, "UNIVERS": 2, "NAME": "VRGB", "ATTRIBUT": DATA}
  200. DATA = OrderedDict()
  201. DATA["DIM-FINE"] = {"NR": 8, "MASTER": "", "MODE": "F", "VALUE": 5.0,"ACTIVE":0}
  202. DATA["VDIM"] = {"NR": -1, "MASTER": "", "MODE": "F", "VALUE": 0.0,"ACTIVE":0}
  203. DATA["PAN"] = {"NR": 0, "MASTER": "", "MODE": "F", "VALUE": 127.0,"ACTIVE":0}
  204. DATA["PAN-FINE"] = {"NR": 1, "MASTER": "", "MODE": "F", "VALUE": 127.0,"ACTIVE":0}
  205. DATA["TILT"] = {"NR": 2, "MASTER": "", "MODE": "F", "VALUE": 127.0,"ACTIVE":0}
  206. DATA["TILT-FINE"] = {"NR": 3, "MASTER": "", "MODE": "F", "VALUE": 127.0,"ACTIVE":0}
  207. DATA["RED"] = {"NR": 6, "MASTER": "1", "MODE": "F", "VALUE": 255.0,"ACTIVE":0}
  208. DATA["GREEN"] = {"NR": 7, "MASTER": "1", "MODE": "F", "VALUE": 255.0,"ACTIVE":0}
  209. DATA["BLUE"] = {"NR": 8, "MASTER": "1", "MODE": "F", "VALUE": 127.0,"ACTIVE":0}
  210. fixTMH = {"DMX": 20, "UNIVERS": 2, "NAME": "MH-BEAM", "ATTRIBUT": DATA}
  211. fi = copy.deepcopy(fixTMH)
  212. fi["DMX"] = 241
  213. fixture["2001"] = fi
  214. fi = copy.deepcopy(fixTMH)
  215. fi["DMX"] = 461
  216. fixture["2002"] = fi
  217. fi = copy.deepcopy(fix3)
  218. fi["DMX"] = 441
  219. fixture["2003"] = fi
  220. fi = copy.deepcopy(fix3)
  221. fi["DMX"] = 461
  222. fixture["2005"] = fi
  223. fi = copy.deepcopy(fix)
  224. fi["DMX"] = 401
  225. fixture["1001"] = fi
  226. fi = copy.deepcopy(fix)
  227. fi["DMX"] = 421
  228. fi["ATTRIBUT"]["BLUE"]["VALUE"] = 22
  229. fixture["1002"] = fi
  230. fi = copy.deepcopy(fix)
  231. fi["DMX"] = 441
  232. fi["ATTRIBUT"]["BLUE"]["VALUE"] = 22
  233. fixture["1003"] = fi
  234. self.fixtures = fixture
  235. self.preset = OrderedDict()
  236. #["IRIS OPEN", {"74": {"IRIS": 0.0, "_activ": 1, "_selection_nr": 1}}],
  237. for i in range(60):
  238. self.preset["NAME"] = "PRESET "+str(i+1)
  239. DATA = OrderedDict()
  240. DATA["2001"] = {"VDIM":200,"RED":2}
  241. DATA["2002"] = {"VDIM":100,"RED":2}
  242. DATA["2003"] = {"VDIM":50,"RED":2}
  243. self.preset["DATA"] = DATA
  244. def draw_fix(self,fix,data):
  245. i=0
  246. c=0
  247. r=0
  248. frame = tk.Frame(root,bg="black")
  249. frame.pack(fill=tk.X, side=tk.TOP)
  250. b = tk.Button(frame,bg="lightblue", text="FIX:"+str(fix)+" "+data["NAME"],width=20)
  251. b.bind("<Button>",Xevent(elem=b).cb)
  252. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  253. c+=1
  254. #r+=1
  255. if fix not in self.elem_attr:
  256. self.elem_attr[fix] = {}
  257. for attr in data["ATTRIBUT"]:
  258. if attr not in self.all_attr:
  259. self.all_attr.append(attr)
  260. if attr not in self.elem_attr[fix]:
  261. self.elem_attr[fix][attr] = []
  262. if attr.endswith("-FINE"):
  263. continue
  264. v= data["ATTRIBUT"][attr]["VALUE"]
  265. b = tk.Button(frame,bg="grey", text=str(attr)+' '+str(round(v,2)),width=10)
  266. self.elem_attr[fix][attr] = b
  267. b.bind("<Button>",Xevent(elem=b,attr=attr,data=data).cb)
  268. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  269. c+=1
  270. if c >=8:
  271. c=0
  272. r+=1
  273. def draw_enc(self):
  274. i=0
  275. c=0
  276. r=0
  277. frame = tk.Frame(root,bg="black")
  278. frame.pack(fill=tk.X, side=tk.TOP)
  279. b = tk.Label(frame,bg="black", text="--------------------------------------- ---------------------------------------")
  280. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  281. r=0
  282. frame = tk.Frame(root,bg="black")
  283. frame.pack(fill=tk.X, side=tk.TOP)
  284. b = tk.Button(frame,bg="lightblue", text="ENCODER")
  285. #b.bind("<Button>",Xevent(elem=b).cb)
  286. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  287. r+=1
  288. for attr in self.all_attr:
  289. if attr.endswith("-FINE"):
  290. continue
  291. v=0
  292. b = tk.Button(frame,bg="orange", text=str(attr)+'',width=10)
  293. b.bind("<Button>",Xevent(elem=b,attr=attr,data=self,mode="ENCODER").cb)
  294. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  295. c+=1
  296. if c >=8:
  297. c=0
  298. r+=1
  299. def draw_command(self):
  300. i=0
  301. c=0
  302. r=0
  303. frame = tk.Frame(root,bg="black")
  304. frame.pack(fill=tk.X, side=tk.TOP)
  305. b = tk.Label(frame,bg="black", text="--------------------------------------- ---------------------------------------")
  306. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  307. r=0
  308. frame = tk.Frame(root,bg="black")
  309. frame.pack(fill=tk.X, side=tk.TOP)
  310. b = tk.Button(frame,bg="lightblue", text="COMMANDS")
  311. #b.bind("<Button>",Xevent(elem=b).cb)
  312. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  313. r+=1
  314. for comm in self.commands:
  315. v=0
  316. b = tk.Button(frame,bg="white", text=str(comm),width=10)
  317. if comm not in self.elem_command:
  318. self.elem_command[comm] = b
  319. self.val_commands[comm] = 0
  320. b.bind("<Button>",Xevent(elem=b,attr=comm,data=self,mode="COMMAND").cb)
  321. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  322. c+=1
  323. if c >=8:
  324. c=0
  325. r+=1
  326. def draw_preset(self):
  327. i=0
  328. c=0
  329. r=0
  330. frame = tk.Frame(root,bg="black")
  331. frame.pack(fill=tk.X, side=tk.TOP)
  332. b = tk.Label(frame, text="--------------------------------------- ---------------------------------------")
  333. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  334. r=0
  335. frame = tk.Frame(root,bg="black")
  336. frame.pack(fill=tk.X, side=tk.TOP)
  337. b = tk.Button(frame,bg="lightblue", text="PRESET")
  338. #b.bind("<Button>",Xevent(elem=b).cb)
  339. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  340. r+=1
  341. for k in self.commands:
  342. v=0
  343. b = tk.Button(frame,bg="white", text=str(k))
  344. b.bind("<Button>",Xevent(elem=b,attr=k,data=self,mode="COMMAND").cb)
  345. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  346. c+=1
  347. if c >=8:
  348. c=0
  349. r+=1
  350. def render(self):
  351. for fix in self.fixtures:
  352. data = self.fixtures[fix]
  353. print( fix)
  354. self.draw_fix(fix,data)
  355. self.draw_enc()
  356. self.draw_command()
  357. master =Master()
  358. master.render()
  359. root.mainloop()
  360. sys.exit()
  361. cmd = ["BLIND",]
  362. frame = tk.Frame(root,bg="black")
  363. frame.pack(fill=tk.X, side=tk.TOP)
  364. data = []
  365. i=0
  366. for r in range(3):
  367. frame.columnconfigure(r, weight=1)
  368. cd = []
  369. for c in range(8):
  370. i+=1
  371. frame.columnconfigure(c, weight=1)
  372. b = tk.Button(frame,bg="red", text='MH'+str(i)+' r:'+str(r+1)+' c:'+str(c+1))
  373. b.bind("<Button>",Xevent(o=b).cb)
  374. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  375. cd.append(b)
  376. #fixture.append(fix)
  377. frame = tk.Frame(root,bg="black")
  378. frame.pack(fill=tk.X, side=tk.TOP)
  379. data = []
  380. i=0
  381. for r in range(3):
  382. frame.columnconfigure(r, weight=1)
  383. cd = []
  384. for c in range(8):
  385. i+=1
  386. frame.columnconfigure(c, weight=1)
  387. b = tk.Button(frame,bg="red", text='MH'+str(i)+' r:'+str(r+1)+' c:'+str(c+1))
  388. b.bind("<Button>",wheel)
  389. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  390. cd.append(b)
  391. frame = tk.Frame(root,bg="black")
  392. frame.pack(fill=tk.X, side=tk.TOP)
  393. data = []
  394. i=0
  395. for c in range(8):
  396. frame.columnconfigure(c, weight=1)
  397. cd = []
  398. for r in range(3):
  399. i+=1
  400. frame.columnconfigure(r, weight=1)
  401. b = tk.Button(frame,bg="green", text='PAN'+str(i)+' r:'+str(r+1)+' c:'+str(c+1))
  402. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  403. cd.append(b)
  404. frame = tk.Frame(root,bg="black")
  405. frame.pack(fill=tk.X, side=tk.TOP)
  406. data = []
  407. for c in range(10):
  408. frame.columnconfigure(c, weight=1)
  409. cd = []
  410. for r in range(10):
  411. frame.columnconfigure(r, weight=1)
  412. b = tk.Button(frame, text='r:'+str(r+1)+' c:'+str(c+1))
  413. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  414. cd.append(b)
  415. frame = tk.Frame(root,bg="black")
  416. frame.pack(fill=tk.X, side=tk.TOP)
  417. data = []
  418. for c in range(3):
  419. frame.columnconfigure(c, weight=1)
  420. cd = []
  421. for r in range(3):
  422. frame.columnconfigure(r, weight=1)
  423. b = tk.Button(frame,bg="grey", text='r:'+str(r+1)+' c:'+str(c+1))
  424. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  425. cd.append(b)
  426. root.mainloop()