_LibreLightDesk.py 79 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264
  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 random
  18. rnd_id = str(random.randint(1000,9000))
  19. rnd_id += " Beta 22.01"
  20. try:
  21. xtitle = __file__
  22. except:
  23. xtitle = "__file__"
  24. if "/" in xtitle:
  25. xtitle = xtitle.split("/")[-1]
  26. import sys
  27. sys.stdout.write("\x1b]2;"+str(xtitle)+" "+str(rnd_id)+"\x07") # terminal title
  28. import json
  29. import time
  30. import sys
  31. import _thread as thread
  32. import traceback
  33. import tkinter
  34. import tkinter as tk
  35. from tkinter import font
  36. import tkinter.simpledialog
  37. import lib.chat as chat
  38. import lib.motion as motion
  39. from collections import OrderedDict
  40. show_name = "GloryCamp2021"
  41. #show_name = "JMS"
  42. #show_name = "Dimmer"
  43. CUES = OrderedDict()
  44. groups = OrderedDict()
  45. class Modes():
  46. def __init__(self):
  47. self.modes = {}
  48. self.__cfg = {}
  49. self.__cb = None
  50. def val(self,mode,value=None):
  51. if value is not None:
  52. return self.set(mode,value)
  53. elif mode in self.modes:
  54. return self.modes[mode]
  55. def get(self,mode,value=None):
  56. return slef.val(mode,value)
  57. def __check(self,mode):
  58. if mode not in self.modes:
  59. self.modes[mode] = 0
  60. self.__cfg[mode] = 0
  61. def cfg(self,mode,data={}):
  62. self.__check(mode)
  63. if type(data) is dict:
  64. for k in data:
  65. v = data[k]
  66. if v not in self.__cfg:
  67. self.__cfg[k] = v
  68. return 1
  69. elif type(data) is str:
  70. if data in self.__cfg:
  71. return self.__cfg[data]
  72. def set(self,mode,value):
  73. protected = ["BLIND","CLEAR"]
  74. self.__check(mode)
  75. out = 0
  76. if mode == "CLEAR":
  77. return 1
  78. elif mode == "ESC":
  79. for m in self.modes:
  80. print("ESC",m)
  81. if m != "BLIND":
  82. self.modes[m] = 0
  83. self.callback(m)
  84. out = 1
  85. return 1
  86. elif value:
  87. for m in self.modes:
  88. if m not in protected and mode not in protected and m != mode:
  89. if self.modes[m]:
  90. self.modes[m]= 0
  91. self.callback(m)
  92. if self.modes[mode]:
  93. self.modes[mode] = 0 # value
  94. else:
  95. self.modes[mode] = 1 #value
  96. out = 1
  97. else:
  98. self.modes[mode] = 0 #value
  99. self.callback(mode)
  100. return value
  101. def set_cb(self,cb):
  102. if cb:
  103. self.__cb = cb
  104. def callback(self,mode):
  105. if self.__cb is not None and mode in self.modes:
  106. value = self.modes[mode]
  107. self.__cb(mode=mode,value=value)
  108. modes = Modes()
  109. #modes.val("BLIND", 0)
  110. #modes.modes["BLIND"] = 0
  111. modes.modes["ESC"] = 0
  112. modes.modes["STORE"] = 0
  113. modes.modes["EDIT"] = 0
  114. modes.modes["MOVE"] = 0
  115. modes.modes["FLASH"] = 0
  116. modes.modes["STONY_FX"] = 0
  117. modes.modes["SELECT"] = 0
  118. modes.modes["ACTIVATE"] = 0
  119. modes.modes["CFG-BTN"] = 0
  120. modes.modes["LABEL"] = 0
  121. def xcb(mode,value=None):
  122. print("xcb","MODE CALLBACK",mode,value)
  123. #modes.set_cb(xcb)
  124. POS = ["PAN","TILT","MOTION"]
  125. COLOR = ["RED","GREEN","BLUE","COLOR"]
  126. BEAM = ["GOBO","G-ROT","PRISMA","P-ROT","FOCUS","SPEED"]
  127. INT = ["DIM","SHUTTER","STROBE","FUNC"]
  128. client = chat.tcp_sender()
  129. fade = 2 #2 #0.1 #1.13
  130. fade_on = 1
  131. fx_prm = {"SIZE":20,"SPEED":100,"OFFSET":50,"BASE":"-","START":0}
  132. def build_cmd(dmx,val,args=[fade],flash=0,xpfx="",attr=""):
  133. cmd=""
  134. if xpfx:
  135. pfx=xpfx
  136. elif flash:
  137. pfx ="df"
  138. else:
  139. pfx ="d"
  140. if type(val) is float or type(val) is int:
  141. cmd += ",{}{}:{:0.4f}".format(pfx,dmx,val)
  142. else:
  143. cmd += ",{}{}:{}".format(pfx,dmx,val)
  144. if flash:
  145. cmd += ":0:0"#.format(val)
  146. else:
  147. for val in args:
  148. if type(val) is float or type(val) is int:
  149. cmd += ":{:0.4f}".format(val)
  150. else:
  151. cmd += ":{}".format(val)
  152. if attr:
  153. cmd += ":"+str(attr)
  154. return cmd
  155. def update_raw_dmx(data ,value=None,args=[fade],flash=0,pfx="d",fx=0):
  156. cmd = []
  157. if flash:
  158. pfx += "f"
  159. for row in data:
  160. if fx:
  161. if value is not None:
  162. # z.b. flush off
  163. xcmd = str(value)+":"+row["FX"].split(":",1)[-1]
  164. else:
  165. xcmd = row["FX"]
  166. else:
  167. if row["VALUE"] is None:
  168. xcmd = ""
  169. else:
  170. if value is not None:
  171. if type(value) is float:
  172. xcmd = "{:0.4f}".format(value)
  173. else:
  174. xcmd = "{}".format(value)
  175. else:
  176. xcmd = "{:0.4f}".format(row["VALUE"])
  177. for arg in args:
  178. if type(arg) is float:
  179. xcmd += ":{}".format(arg)
  180. else:
  181. xcmd += ":{:0.4f}".format(arg)
  182. #print( "pack: FIX",row["FIX"],row["ATTR"], xcmd)
  183. #xcmd += ":{}".format(row["ATTR"])
  184. cmd.append( xcmd)
  185. return cmd
  186. def update_dmx(attr,data,value=None,args=[fade],flash=0,pfx=""):
  187. #global modes #BLIND
  188. #print("update_dmx",data)
  189. dmx = data["DMX"]
  190. dmx = (data["UNIVERS"]*512)+data["DMX"]
  191. val = None
  192. cmd=""
  193. try:
  194. if attr == "DIM" and data["ATTRIBUT"][attr]["NR"] < 0: #VDIM
  195. #print( "VDIM")
  196. for attr in data["ATTRIBUT"]:
  197. dmx = (data["UNIVERS"]*512) + data["DMX"]
  198. dmx = data["DMX"]
  199. if data["ATTRIBUT"][attr]["NR"] < 0: #virtual channels
  200. continue
  201. dmx += data["ATTRIBUT"][attr]["NR"]-1
  202. mode = ""
  203. if "MODE" in data["ATTRIBUT"][attr]:
  204. mode = data["ATTRIBUT"][attr]["MODE"]
  205. #print(attr)
  206. val = data["ATTRIBUT"][attr]["VALUE"]
  207. if data["ATTRIBUT"][attr]["MASTER"]:
  208. val = val * (data["ATTRIBUT"]["DIM"]["VALUE"] / 255.)
  209. if val is not None:
  210. #cmd += ",d{}:{:0.4f}".format(dmx,int(val))
  211. if value is not None:
  212. val = value
  213. if mode == "F": #FADE
  214. cmd += build_cmd(dmx,val,args=args,flash=flash,xpfx=pfx,attr=attr)
  215. else:
  216. cmd += build_cmd(dmx,val,args=[0],flash=flash,xpfx=pfx,attr=attr)
  217. #print("cmd",cmd)
  218. elif data["ATTRIBUT"][attr]["NR"] > 0:
  219. dmx += data["ATTRIBUT"][attr]["NR"]-1
  220. val = data["ATTRIBUT"][attr]["VALUE"]
  221. mode = ""
  222. if "MODE" in data["ATTRIBUT"][attr]:
  223. mode = data["ATTRIBUT"][attr]["MODE"]
  224. if data["ATTRIBUT"][attr]["MASTER"]:
  225. #if "VDIM" in data["ATTRIBUT"]:
  226. if "DIM" in data["ATTRIBUT"] and data["ATTRIBUT"]["DIM"]["NR"] < 0: #VDIM
  227. val = val * (data["ATTRIBUT"]["DIM"]["VALUE"] / 255.)
  228. if val is not None:
  229. #cmd += ",d{}:{}".format(dmx,int(val))
  230. if value is not None:
  231. val = value
  232. if mode == "F": #FADE
  233. cmd += build_cmd(dmx,val,args=args,flash=flash,xpfx=pfx,attr=attr)
  234. else:
  235. cmd += build_cmd(dmx,val,args=[0],flash=flash,xpfx=pfx,attr=attr)
  236. #print("cmd",cmd)
  237. if modes.val("BLIND"):
  238. cmd=""
  239. return cmd
  240. except Exception as e:
  241. cprint("== cb EXCEPT",e,color="red")
  242. cprint("Error on line {}".format(sys.exc_info()[-1].tb_lineno),color="red")
  243. cprint(''.join(traceback.format_exception(None, e, e.__traceback__)),color="red")
  244. raise e
  245. class dummy_event():
  246. def __init__(self):
  247. self.num =0
  248. self.type = 4 #press 5 release
  249. self.set_value=-1
  250. gcolor = 1
  251. def cprint(*text,color="blue",space=" ",end="\n"):
  252. if not gcolor:
  253. print(text)
  254. return 0
  255. if color == "green":
  256. txt = '\033[92m'
  257. elif color == "red":
  258. txt = '\033[0;31m\033[1m'
  259. elif color == "yellow":
  260. txt = '\033[93m\033[1m'
  261. elif color == "cyan":
  262. txt = '\033[96m'
  263. else:
  264. txt = '\033[94m'
  265. for t in text:
  266. txt += str(t ) +" "
  267. #HEADER = '\033[95m'
  268. #OKBLUE = '\033[94m'
  269. #OKCYAN = '\033[96m'
  270. #OKGREEN = '\033[92m'
  271. #WARNING = '\033[93m'
  272. #FAIL = '\033[91m'
  273. #ENDC = '\033[0m'
  274. #BOLD = '\033[1m'
  275. #UNDERLINE = '\033[4m'
  276. txt += '\033[0m'
  277. print(txt,end=end)
  278. #return txt
  279. cprint("________________________________")
  280. class Xevent():
  281. def __init__(self,fix,elem,attr=None,data=None,mode=None):
  282. self.data=data
  283. self.attr = attr
  284. self.elem = elem
  285. self.mode = mode
  286. def encoder(self,fix,attr,data,elem,action="",xfade=None):
  287. if action == "click":
  288. print("encoder",fix,attr,action,data)
  289. cprint(type(self.data))
  290. if self.data is dict or self.data is OrderedDict:
  291. if "ATTRIBUT" in self.data:
  292. if attr in self.data["ATTRIBUT"]:
  293. if "ACTIVE" in self.data["ATTRIBUT"][attr]:
  294. if self.data["ATTRIBUT"][attr]["ACTIVE"]:
  295. self.data["ATTRIBUT"][attr]["ACTIVE"] = 0
  296. self.elem["bg"] = "grey"
  297. else:
  298. self.data["ATTRIBUT"][attr]["ACTIVE"] = 1
  299. self.elem["bg"] = "yellow"
  300. return 1
  301. v2=data["ATTRIBUT"][attr]["VALUE"]
  302. change=0
  303. increment = 4.11
  304. if action == "+":
  305. v2+= increment
  306. v = "+{:0.4f}".format( increment ) #) #4.11"
  307. change=1
  308. elif action == "-":
  309. v2-= increment
  310. v = "-{:0.4f}".format( increment ) #) #4.11"
  311. change=1
  312. elif type(action) is int or type(action) is float:
  313. #v2-= increment
  314. #v = "-{:0.4f}".format( increment ) #) #4.11"
  315. v2 = action
  316. change=1
  317. if v2 < 0:
  318. v2=0
  319. elif v2 > 256:
  320. v2=256
  321. if change:
  322. data["ATTRIBUT"][attr]["ACTIVE"] = 1
  323. elem["bg"] = "yellow"
  324. #v2 = v
  325. #v = data["ATTRIBUT"][attr]["VALUE"]
  326. data["ATTRIBUT"][attr]["VALUE"] = v2
  327. elem["text"] = "{} {:0.2f}".format(attr,v2)
  328. #worker.fade_dmx(fix,attr,data,v,v2,ft=0)
  329. if xfade:
  330. cmd=update_dmx(attr=attr,data=data)
  331. else:
  332. cmd=update_dmx(attr=attr,data=data,args=[0])
  333. #data["ATTRIBUT"][attr]["VALUE"] = v2
  334. if cmd and not modes.val("BLIND"):
  335. client.send(cmd)
  336. def clear(self,event=None):
  337. ok = self.data.FIXTURES.clear(event)
  338. if ok:
  339. for fix in self.data.elem_attr:
  340. for attr in self.data.elem_attr[fix]:
  341. print(type(self.data.elem_attr[fix]))
  342. print(type(self.data.elem_attr[fix][attr]))
  343. print((self.data.elem_attr[fix][attr]))
  344. self.data.elem_attr[fix][attr]["bg"] = "grey"
  345. return 0
  346. if modes.val("STORE"):
  347. self.data.val_commands["STORE"] = 0
  348. modes.val("STORE",0)# = 0
  349. else:
  350. for fix in self.data.FIXTURES.fixtures:
  351. data = self.data.FIXTURES.fixtures[fix]
  352. for attr in data["ATTRIBUT"]:
  353. if attr.endswith("-FINE"):
  354. continue
  355. self.data.elem_attr[fix][attr]["bg"] = "grey"
  356. print( "CB CLEAR" )
  357. def command(self,event):
  358. if self.mode == "COMMAND":
  359. if self.attr == "CLEAR":
  360. if event.num == 1:
  361. self.clear()
  362. #self.button_refresh("STORE","grey")
  363. #modes.val("STORE",0)
  364. modes.val(self.attr,0)
  365. #modes.val("CLEAR",0)
  366. elif self.attr.startswith("SZ:"):#SIN":
  367. #global fx_prm
  368. k = "SIZE"
  369. if event.num == 1:
  370. pass
  371. elif event.num == 2:
  372. pass
  373. elif event.num == 4:
  374. if fx_prm[k] <= 0:
  375. fx_prm[k] = 1
  376. fx_prm[k] *=1.2
  377. elif event.num == 5:
  378. fx_prm[k] /=1.2
  379. #fx_prm[k] =int(fx_prm[k])
  380. if fx_prm[k] > 4000:
  381. fx_prm[k] = 4000
  382. if fx_prm[k] < 0:
  383. fx_prm[k] =0
  384. self.data.elem_fx_commands[self.attr]["text"] = "SZ:{:0.0f}".format(fx_prm[k])
  385. elif self.attr.startswith("SP:"):#SIN":
  386. #global fx_prm
  387. k = "SPEED"
  388. if event.num == 1:
  389. pass
  390. elif event.num == 2:
  391. pass
  392. elif event.num == 4:
  393. if fx_prm[k] <= 0:
  394. fx_prm[k] = 1
  395. fx_prm[k] *=1.2
  396. elif event.num == 5:
  397. fx_prm[k] /=1.2
  398. #fx_prm[k] =int(fx_prm[k])
  399. if fx_prm[k] > 4000:
  400. fx_prm[k] = 4000
  401. if fx_prm[k] < 0:
  402. fx_prm[k] =0
  403. if fx_prm[k] < 0.1:
  404. self.data.elem_fx_commands[self.attr]["text"] = "SP:off".format(fx_prm[k])
  405. else:
  406. self.data.elem_fx_commands[self.attr]["text"] = "SP:{:0.0f}".format(fx_prm[k])
  407. elif self.attr.startswith("ST:"):#SIN":
  408. #global fx_prm
  409. k = "START"
  410. if event.num == 1:
  411. pass
  412. elif event.num == 2:
  413. pass
  414. elif event.num == 4:
  415. if fx_prm[k] <= 0:
  416. fx_prm[k] = 1
  417. fx_prm[k] *=1.2
  418. elif event.num == 5:
  419. fx_prm[k] /=1.2
  420. #fx_prm[k] =int(fx_prm[k])
  421. if fx_prm[k] > 4000:
  422. fx_prm[k] = 4000
  423. if fx_prm[k] < 0:
  424. fx_prm[k] =0
  425. self.data.elem_fx_commands[self.attr]["text"] = "ST:{:0.0f}".format(fx_prm[k])
  426. elif self.attr.startswith("OF:"):#SIN":
  427. #global fx_prm
  428. k = "OFFSET"
  429. if event.num == 1:
  430. pass
  431. elif event.num == 2:
  432. pass
  433. elif event.num == 4:
  434. if fx_prm[k] <= 0:
  435. fx_prm[k] = 1
  436. fx_prm[k] *=1.2
  437. elif event.num == 5:
  438. fx_prm[k] /=1.2
  439. #fx_prm[k] =int(fx_prm[k])
  440. if fx_prm[k] > 1024:
  441. fx_prm[k] = 1024
  442. if fx_prm[k] < 0:
  443. fx_prm[k] =0
  444. self.data.elem_fx_commands[self.attr]["text"] = "OF:{:0.0f}".format(fx_prm[k])
  445. elif self.attr.startswith("BS:"):
  446. k = "BASE"
  447. if event.num == 1:
  448. fx_prm[k] = "0"
  449. elif event.num == 2:
  450. pass
  451. elif event.num == 4:
  452. fx_prm[k] = "+"
  453. elif event.num == 5:
  454. fx_prm[k] = "-"
  455. self.data.elem_fx_commands[self.attr]["text"] = "BS:{}".format(fx_prm[k])
  456. elif self.attr.startswith("FX:"):#SIN":
  457. if event.num == 1:
  458. cmd = ""
  459. offset = 0
  460. offset_flag=0
  461. start = fx_prm["START"]
  462. base = fx_prm["BASE"]
  463. for fix in self.data.FIXTURES.fixtures:
  464. data = self.data.FIXTURES.fixtures[fix]
  465. #print( "ADD FX",fix)
  466. for attr in data["ATTRIBUT"]:
  467. if attr.endswith("-FINE"):
  468. continue
  469. fx=""
  470. if "SIN" in self.attr:
  471. fx = "sinus"
  472. elif "FD" in self.attr:
  473. fx = "fade"
  474. elif "ON2" in self.attr:
  475. fx = "on2"
  476. elif "ON" in self.attr:
  477. fx = "on"
  478. elif "BUM2" in self.attr:
  479. fx = "bump2"
  480. elif "BUM" in self.attr:
  481. fx = "bump"
  482. elif "COS" in self.attr:
  483. fx = "cosinus"
  484. if fx:
  485. if fx_prm["SPEED"] < 0.1:
  486. fx = "off"
  487. else:
  488. if "DIM" in self.attr:
  489. base=""
  490. if attr == "DIM":
  491. if fx_prm["SPEED"] < 0.1:
  492. fx = "off"
  493. else:
  494. fx = "fade"
  495. elif "TILT" in self.attr:
  496. base=""
  497. if attr == "PAN":
  498. fx = "off"
  499. if attr == "TILT":
  500. if fx_prm["SPEED"] < 0.1:
  501. fx = "off"
  502. else:
  503. fx = "sinus"
  504. elif "PAN" in self.attr:
  505. base=""
  506. if attr == "PAN":
  507. if fx_prm["SPEED"] < 0.1:
  508. fx = "off"
  509. else:
  510. fx = "cosinus"
  511. if attr == "TILT":
  512. fx = "off"
  513. elif "CIR" in self.attr:
  514. base=""
  515. if attr == "PAN":
  516. if fx_prm["SPEED"] < 0.1:
  517. fx = "off"
  518. else:
  519. fx = "cosinus"
  520. if attr == "TILT":
  521. if fx_prm["SPEED"] < 0.1:
  522. fx = "off"
  523. else:
  524. fx = "sinus"
  525. if fx:
  526. fx += ":{:0.0f}:{:0.0f}:{:0.0f}:{:0.0f}:{}:".format(fx_prm["SIZE"],fx_prm["SPEED"],start,offset,base)
  527. offset_flag=1
  528. if "FX" not in data["ATTRIBUT"][attr]:
  529. data["ATTRIBUT"][attr]["FX"] =""
  530. print("ADD FX",fix,attr,fx,data["ATTRIBUT"][attr]["ACTIVE"])
  531. if data["ATTRIBUT"][attr]["ACTIVE"] and fx:
  532. print("++ADD FX",fix,attr,fx)
  533. data["ATTRIBUT"][attr]["FX"] = fx #"sinus:40:100:10"
  534. cmd+=update_dmx(attr,data,pfx="fx",value=fx)#,flash=FLASH)
  535. if fx_prm["OFFSET"] > 0.5 and offset_flag:
  536. offset_flag=0
  537. offset += fx_prm["OFFSET"] # add offset on next fixture
  538. #print("offset",offset)
  539. if cmd and not modes.val("BLIND"):
  540. client.send(cmd)
  541. elif self.attr == "FX OFF":
  542. if event.num == 1:
  543. client.send("fx0:alloff:,fxf:alloff:")
  544. self.data.elem_fx_commands[self.attr]["bg"] = "magenta"
  545. for fix in self.data.FIXTURES.fixtures:
  546. data = self.data.FIXTURES.fixtures[fix]
  547. for attr in data["ATTRIBUT"]:
  548. data["ATTRIBUT"][attr]["FX"] = ""
  549. elif self.attr == "FADE":
  550. global fade
  551. global fade_on
  552. if fade < 0.01:
  553. fade = 0.01
  554. elif fade > 100.0:
  555. fade = 100
  556. if event.num == 4:
  557. fade *= 1.1
  558. elif event.num == 5:
  559. fade /= 1.1
  560. elif event.num == 1:
  561. if fade_on:
  562. fade_on = 0
  563. self.data.elem_commands[self.attr]["bg"] = "grey"
  564. else:
  565. fade_on = 1
  566. self.data.elem_commands[self.attr]["bg"] = "green"
  567. elif event.num == 2:
  568. if fade > 1 and fade < 4:
  569. fade = 4
  570. elif fade > 3 and fade < 6:
  571. fade = 6
  572. elif fade > 5 and fade < 7:
  573. fade = 8
  574. elif fade > 7 and fade < 9:
  575. fade = 10
  576. elif fade > 9:
  577. fade = 0.01
  578. elif fade < 1:
  579. fade = 1.1
  580. self.data.elem_commands[self.attr]["text"] = "Fade{:0.2f}".format(fade)
  581. elif self.attr == "BACKUP":
  582. modes.val(self.attr,1)
  583. self.data.PRESETS.backup_presets()
  584. self.data.FIXTURES.backup_patch()
  585. #time.sleep(1)
  586. modes.val(self.attr,0)
  587. else:
  588. if event.num == 1:
  589. print("ELSE",self.attr)
  590. modes.val(self.attr,1)
  591. return 0
  592. def cb(self,event):
  593. #print("cb",self,event,data)
  594. cprint("EVENT cb",self.attr,self.mode,event,color='yellow')
  595. print(["type",event.type,"num",event.num])
  596. #print(dir(event.type))
  597. #print(dir(event),[str(event.type)])#.keys())
  598. try:
  599. #v = self.data["ATTRIBUT"][self.attr]
  600. #global modes
  601. #global STORE
  602. #global BLIND
  603. #global FLASH
  604. #global STONY_FX
  605. #global LABEL
  606. #global SELECT
  607. #global ACTIVATE
  608. #global CFG-BTN
  609. change = 0
  610. if "keysym" in dir(event):
  611. if "Escape" == event.keysym:
  612. self.clear()
  613. #CLEAR
  614. return 0
  615. if self.mode == "COMMAND":
  616. self.command(event)
  617. elif self.mode == "ROOT":
  618. if event.keysym=="Escape":
  619. pass
  620. #STORE = 0
  621. #LABEL = 0
  622. elif self.mode == "INPUT":
  623. print("INP",self.data.entry.get())
  624. if event.keycode == 36:
  625. x=self.data.entry.get()
  626. client.send(x)
  627. #self.data.entry.clean()
  628. #self.data
  629. #chat.send("")
  630. elif self.mode == "INPUT2":
  631. print("INP2",self.data.entry2.get())
  632. if event.keycode == 36:
  633. x=self.data.entry2.get()
  634. client.send(x)
  635. #self.data.entry.clean()
  636. elif self.mode == "INPUT3":
  637. print("INP3",self.data.entry3.get())
  638. if event.keycode == 36:
  639. x=self.data.entry3.get()
  640. client.send(x)
  641. #self.data.entry.clean()
  642. #self.data
  643. #chat.send("")
  644. elif self.mode == "PRESET":
  645. nr = self.attr #int(self.attr.split(":")[1])-1
  646. #print( "RRR", [str(event.type) , event.type] )
  647. #print( "PRESET EVENT",event.num)
  648. if event.num == 1:
  649. if str(event.type) == '4': #4 ButtonPress
  650. #if str(event.type) == "ButtonRelease" or event.type == '5':
  651. if modes.val("STORE"):
  652. self.data.preset_store(nr)
  653. modes.val("STORE",0)
  654. #STORE = 0
  655. #self.button_refresh("STORE","grey")
  656. #self.elem_commands["STORE"]["bg"] = "lightgrey"
  657. elif modes.val("CFG-BTN"):
  658. _label = self.data.PRESETS.btn_cfg(nr)
  659. txt = tkinter.simpledialog.askstring("CFG-BTN","GO,FLASH,TOGGLE,SWOP\n EXE:"+str(nr+1),initialvalue=_label)
  660. if txt:
  661. self.data.PRESETS.btn_cfg(nr,txt)
  662. self.data.elem_presets[nr]["text"] = self.data.PRESETS.get_btn_txt(nr)
  663. modes.val("CFG-BTN",0)
  664. #self.data.elem_commands["CFG-BTN"]["bg"] = "grey"
  665. elif modes.val("LABEL"):#else:
  666. _label = self.data.PRESETS.label(nr)
  667. txt = tkinter.simpledialog.askstring("CFG-BTN","GO,FLASH,TOGGLE,SWOP\n EXE:"+str(nr+1),initialvalue=_label)
  668. if txt:
  669. self.data.PRESETS.label(nr,txt)
  670. self.data.elem_presets[nr]["text"] = self.data.PRESETS.get_btn_txt(nr)
  671. modes.val("LABEL", 0)
  672. elif modes.val("ACTIVATE"):
  673. self.data.preset_select(nr)
  674. self.data.preset_go(nr,xfade=0,event=event)
  675. modes.val("ACTIVATE", 0)
  676. self.data.elem_commands["ACTIVATE"]["bg"] = "lightgrey"
  677. elif modes.val("SELECT"):
  678. self.data.preset_select(nr)
  679. else:
  680. self.data.preset_go(nr,event=event)
  681. else:
  682. self.data.preset_go(nr,event=event)
  683. if event.num == 3:
  684. if not modes.val("STORE"):
  685. self.data.preset_go(nr,xfade=0,event=event)
  686. return 0
  687. elif self.mode == "INPUT":
  688. return 0
  689. if self.mode == "ENCODER":
  690. #if self.attr == "VDIM":
  691. # self.attr = "DIM"
  692. for fix in self.data.FIXTURES.fixtures:
  693. data = self.data.FIXTURES.fixtures[fix]
  694. for attr in data["ATTRIBUT"]:
  695. if attr.endswith("-FINE"):
  696. continue
  697. elem = self.data.elem_attr[fix][attr]
  698. if self.attr != attr:
  699. continue
  700. if event.num == 1:
  701. #self#encoder(attr=attr,data=data,elem=elem,action="click")
  702. data["ATTRIBUT"][attr]["ACTIVE"] = 1
  703. elem["bg"] = "yellow"
  704. if "FX" in data["ATTRIBUT"][attr]:#["FX"]:# = 1
  705. if data["ATTRIBUT"][attr]["FX"]:# = 1
  706. elem["fg"] = "blue"
  707. else:
  708. elem["fg"] = "blue"
  709. elem["fg"] = "black"
  710. if not data["ATTRIBUT"][attr]["ACTIVE"]:
  711. continue
  712. if event.num == 4:
  713. self.encoder(fix=fix,attr=attr,data=data,elem=elem,action="+")
  714. #if attr == "DIM":
  715. # self.encoder(attr="VDIM",data=data,elem=elem,action="+")
  716. elif event.num == 5:
  717. self.encoder(fix=fix,attr=attr,data=data,elem=elem,action="-")
  718. #if attr == "DIM":
  719. # self.encoder(attr="VDIM",data=data,elem=elem,action="-")
  720. if "set_value" in dir(event) and event.set_value >=0:
  721. print("ENCODER set_value and set_fade",event)
  722. #print(dir(event))
  723. if "set_fade" in dir(event) and event.set_fade >0:
  724. print("event.set_fade",event.set_fade)
  725. self.encoder(fix=fix,attr=attr,data=data,elem=elem,action=event.set_value,xfade=1)
  726. else:
  727. self.encoder(fix=fix,attr=attr,data=data,elem=elem,action=event.set_value)
  728. return 0
  729. if event.num == 1:
  730. self.encoder(fix=0,attr=self.attr,data=self.data,elem=self.elem,action="click")
  731. elif event.num == 4:
  732. self.encoder(fix=0,attr=self.attr,data=self.data,elem=self.elem,action="+")
  733. elif event.num == 5:
  734. self.encoder(fix=0,attr=self.attr,data=self.data,elem=self.elem,action="-")
  735. #finally:
  736. # pass
  737. except Exception as e:
  738. cprint("== cb EXCEPT",e,color="red")
  739. cprint("Error on line {}".format(sys.exc_info()[-1].tb_lineno),color="red")
  740. cprint(''.join(traceback.format_exception(None, e, e.__traceback__)),color="red")
  741. #traceback.print_exc()
  742. #print(self.elem["text"],self.attr,self.data)
  743. def wheel(event,d=None):
  744. print("wheel",event,d)
  745. import copy
  746. class Element():
  747. def __init__(self):
  748. self.__data = {}
  749. def set(self,key,val):
  750. self.__data[key] = val
  751. class Base():
  752. def __init__(self):
  753. pass
  754. def _load(self,filename):
  755. xfname = "show/"+show_name+"/"+str(filename)+".sav"
  756. print("load",xfname)
  757. f = open(xfname,"r")
  758. lines = f.readlines()
  759. f.close()
  760. data = OrderedDict()
  761. labels = OrderedDict()
  762. for line in lines:
  763. key,label,rdata = line.split("\t",2)
  764. key = int(key)
  765. #print(xfname,"load",key,label)
  766. #print(line)
  767. jdata = json.loads(rdata,object_pairs_hook=OrderedDict)
  768. nrnull = 0
  769. if "ATTRIBUT" in jdata: # translate old FIXTURES.fixtures start with 0 to 1
  770. for attr in jdata["ATTRIBUT"]:
  771. if "NR" in jdata["ATTRIBUT"][attr]:
  772. nr = jdata["ATTRIBUT"][attr]["NR"]
  773. if nr == 0:
  774. nrnull = 1
  775. break
  776. if nrnull:
  777. print("DMX NR IS NULL",attr,"CHANGE +1")
  778. for attr in jdata["ATTRIBUT"]:
  779. if "NR" in jdata["ATTRIBUT"][attr]:
  780. nr = jdata["ATTRIBUT"][attr]["NR"]
  781. if nr >= 0:
  782. jdata["ATTRIBUT"][attr]["NR"] +=1
  783. data[key] = jdata
  784. labels[key] = label
  785. return data,labels
  786. def _backup(self,filename,data,labels):
  787. #fixture
  788. xfname = "show/"+show_name+"/"+str(filename)+".sav"
  789. print("backup",xfname)
  790. f = open(xfname,"w")
  791. for key in data:
  792. line = data[key]
  793. #print(line)
  794. label = "label"
  795. if key in labels:
  796. label = labels[key]
  797. if label == "Name-"+str(key):
  798. label = ""
  799. #print(xfname,"load",key,label,len(line))
  800. f.write( "{}\t{}\t{}\n".format( key,label,json.dumps(line) ) )
  801. f.close()
  802. class Event():
  803. def __init__(self,name):
  804. self.name=name
  805. print("init",self)
  806. def event(self,event):
  807. print(self.name,event)
  808. class scroll():
  809. def __init__(self,canvas):
  810. self.canvas=canvas
  811. def config(self,event):
  812. canvas = self.canvas
  813. canvas.configure(scrollregion=canvas.bbox("all"))#,width=400,height=200)
  814. def hex_to_rgb(hex):
  815. return tuple(int(hex[i:i+2], 16) for i in (0, 2, 4))
  816. class cb():
  817. def __init__(self,win):
  818. self.win = win
  819. def _callback(self,event):
  820. clobj=event.widget
  821. ## undermouse=find_withtag(master.CURRENT)
  822. undermouse=self.win.find_closest(self.win.CURRENT)
  823. print( repr(undermouse))
  824. def callback(self,event):
  825. print(__file__,self,"callback",event)
  826. cnv = self.win
  827. item = cnv.find_closest(cnv.canvasx(event.x), cnv.canvasy(event.y))[0]
  828. tags = cnv.gettags(item)
  829. #cnv.itemconfigure(self.tag, text=tags[0])
  830. print(tags,item)
  831. color = cnv.itemcget(item, "fill")
  832. cnv.itemconfig("all", width=1)#filla="green")
  833. cnv.itemconfig(item, width=3)#filla="green")
  834. print(color)
  835. print( hex_to_rgb(color[1:]))
  836. class GUI(Base):
  837. def __init__(self):
  838. super().__init__()
  839. self.load()
  840. self.all_attr =["DIM","PAN","TILT"]
  841. self.elem_attr = {}
  842. self.fx_commands =["STONY_FX","FX OFF","\n"
  843. ,"FX:CIR","FX:PAN","FX:TILT","FX:DIM","\n"
  844. ,"SZ:","SP:","ST:","OF:","BS:-","\n"
  845. , "FX:SIN","FX:COS","FX:BUM","FX:BUM2","FX:FD","FX:ON","FX:ON2" ]
  846. self.commands =["\n","ESC","CFG-BTN","LABEL","BACKUP","\n"
  847. ,"SET","SELECT","ACTIVATE","FLASH","FADE","\n"
  848. ,"BLIND","CLEAR","STORE","EDIT","MOVE","\n"
  849. ]
  850. self.elem_fx_commands = {}
  851. self.val_fx_commands = {}
  852. self.elem_commands = {}
  853. self.val_commands = {}
  854. self.elem_presets = {}
  855. self.PRESETS = Presets()
  856. self.PRESETS.load_presets()
  857. self.FIXTURES = Fixtures()
  858. self.FIXTURES.load_patch()
  859. for i in range(8*8*8):
  860. if i not in self.PRESETS.val_presets:
  861. name = "Preset:"+str(i+1)+":\nXYZ"
  862. #self.presets[i] = [i]
  863. self.PRESETS.val_presets[i] = OrderedDict() # FIX
  864. self.PRESETS.val_presets[i]["CFG"] = OrderedDict() # CONFIG
  865. self.PRESETS.label_presets[i] = "-"
  866. modes.set_cb(self.xcb)
  867. def button_refresh(self,name,color,fg=None):
  868. cprint("button_refresh",name,color)
  869. #self.data.elem_commands["STORE"]["bg"] = "grey"
  870. if name in self.elem_commands:
  871. self.elem_commands[name]["bg"] = color
  872. self.elem_commands[name].config(activebackground=color)
  873. if fg:
  874. self.elem_commands[name]["fg"] = fg
  875. print(dir(self.elem_commands[name]))
  876. def xcb(self,mode,value=None):
  877. cprint("MODE CALLBACK",mode,value,color="green",end="")
  878. #cprint(self,"xcb","MODE CALLBACK",mode,value,color="green")
  879. if value:
  880. cprint("===== ON ======",color="red")
  881. self.button_refresh(mode,color="red")#,fg="blue")
  882. else:
  883. cprint("===== OFF ======",color="red")
  884. self.button_refresh(mode,color="lightgrey")#,fg="black")
  885. def load(self,fname=""):
  886. pass
  887. def exit(self):
  888. print("__del__",self)
  889. self.PRESETS.backup_presets()
  890. print("********************************************************")
  891. self.FIXTURES.backup_patch()
  892. print("*********del",self,"***********************************************")
  893. def refresh_gui(self):
  894. for fix in self.FIXTURES.fixtures:
  895. sdata = self.FIXTURES.fixtures[fix]
  896. for attr in sdata["ATTRIBUT"]:
  897. if "FINE" in attr:
  898. continue
  899. v2 = sdata["ATTRIBUT"][attr]["VALUE"]
  900. if fix in self.elem_attr:
  901. elem = self.elem_attr[fix][attr]
  902. #print( attr,v2)
  903. elem["text"] = "{} {:0.2f}".format(attr,v2)
  904. if sdata["ATTRIBUT"][attr]["ACTIVE"]:
  905. elem["bg"] = "yellow"
  906. else:
  907. elem["bg"] = "grey"
  908. def preset_store(self,nr):
  909. #TODO refactor
  910. print("------- STORE PRESET")
  911. data = self.FIXTURES.get_active()
  912. if modes.val("STONY_FX"):
  913. self.PRESETS.store(nr,data,"STONY_FX")
  914. else:
  915. self.PRESETS.store(nr,data)
  916. #global STORE
  917. #STORE = 0
  918. #self.elem_commands["STORE"]["bg"] = "lightgrey"
  919. #CFG = OrderedDict()
  920. #if "CFG" in self.PRESETS.val_presets[nr]: #["CFG"]
  921. # CFG = self.PRESETS.val_presets[nr]["CFG"]
  922. sdata=data
  923. self.PRESETS.val_presets[nr] = sdata
  924. if len(sdata) > 1:
  925. fx_color = 0
  926. val_color = 0
  927. for fix in sdata:
  928. if fix == "CFG":
  929. continue
  930. #print( "$$$$",fix,sdata[fix])
  931. for attr in sdata[fix]:
  932. if "FX" in sdata[fix][attr]:
  933. if sdata[fix][attr]["FX"]:
  934. fx_color = 1
  935. if "VALUE" in sdata[fix][attr]:
  936. if sdata[fix][attr]["VALUE"] is not None:
  937. val_color = 1
  938. self.elem_presets[nr]["fg"] = "black"
  939. if val_color:
  940. self.elem_presets[nr]["bg"] = "yellow"
  941. if fx_color:
  942. self.elem_presets[nr]["fg"] = "blue"
  943. else:
  944. if fx_color:
  945. self.elem_presets[nr]["bg"] = "cyan"
  946. else:
  947. self.elem_presets[nr]["fg"] = "black"
  948. self.elem_presets[nr]["bg"] = "grey"
  949. #self.elem_presets[nr].option_add("*Font", FontBold)
  950. label = ""
  951. if nr in self.PRESETS.label_presets:
  952. #print(dir(self.data))
  953. label = self.PRESETS.label_presets[nr]
  954. BTN="go"
  955. if "CFG" in sdata:#["BUTTON"] = "GO"
  956. if "BUTTON" in sdata["CFG"]:
  957. BTN = sdata["CFG"]["BUTTON"]
  958. txt = str(nr)+":"+str(BTN)+":"+str(len(sdata)-1)+"\n"+label
  959. self.elem_presets[nr]["text"] = txt
  960. #print("GO CFG ",self.PRESETS.val_presets)
  961. def preset_select(self,nr):
  962. print("SELECT PRESET")
  963. sdata = self.PRESETS.val_presets[nr]
  964. cmd = ""
  965. for fix in sdata:
  966. if fix == "CFG":
  967. continue
  968. for attr in sdata[fix]:
  969. v2 = sdata[fix][attr]["VALUE"]
  970. v2_fx = sdata[fix][attr]["FX"]
  971. #print( self.data.elem_attr)
  972. if fix in self.elem_attr:
  973. elem = self.elem_attr[fix][attr]
  974. #self#encoder(attr=attr,data=data,elem=elem,action="click")
  975. self.FIXTURES.fixtures[fix]["ATTRIBUT"][attr]["ACTIVE"] = 1
  976. elem["bg"] = "yellow"
  977. def preset_go(self,nr,xfade=fade,event=None):
  978. print("GO PRESET FADE",nr)
  979. rdata = self.PRESETS.get_raw_map(nr)
  980. cfg = self.PRESETS.get_cfg(nr)
  981. fcmd = self.FIXTURES.update_raw(rdata)
  982. #virtcmd = self.data.FIXTURES.get_virtual(rdata)
  983. xFLASH = 0
  984. value=None
  985. #xfade = fade
  986. if modes.val("FLASH") or ( "BUTTON" in cfg and cfg["BUTTON"] == "SEL"): #FLASH
  987. self.preset_select(nr)
  988. return 0
  989. elif modes.val("FLASH") or ( "BUTTON" in cfg and cfg["BUTTON"] == "FL"): #FLASH
  990. xFLASH = 1
  991. xfade = 0
  992. if event:
  993. if str(event.type) == "ButtonRelease" or event.type == '5' :
  994. # 4 fix vor ThinkPad / Debian 11
  995. if xFLASH:
  996. value = "off"
  997. vvcmd = update_raw_dmx( rdata ,value,[xfade] )
  998. fxcmd = update_raw_dmx( rdata ,value,[xfade],fx=1)
  999. cmd = []
  1000. for vcmd,d in [[vvcmd,"d"],[fxcmd,"fx"]]:
  1001. if xFLASH:
  1002. d+="f"
  1003. for i,v in enumerate(fcmd):
  1004. DMX = fcmd[i]["DMX"]
  1005. if DMX and vcmd[i]:
  1006. xcmd = ",{}{}:{}".format(d,DMX,vcmd[i])
  1007. cmd.append( xcmd )
  1008. if "VIRTUAL" in fcmd[i]:
  1009. for a in fcmd[i]["VIRTUAL"]:
  1010. DMX = fcmd[i]["VIRTUAL"][a]
  1011. if DMX and vcmd[i]:
  1012. xcmd = ",{}{}:{}".format(d,DMX,vcmd[i])
  1013. cmd.append( xcmd )
  1014. cmd = "".join(cmd)
  1015. print("cmd",cmd)
  1016. if cmd and not modes.val("BLIND"):
  1017. client.send(cmd )
  1018. self.refresh_gui()
  1019. def draw_dim(self,fix,data,c=0,r=0,frame=None):
  1020. Font = font.Font(family='Helvetica', size=9, weight='normal')
  1021. FontBold = font.Font(family='Helvetica', size=10, weight='bold')
  1022. i=0
  1023. if frame is None:
  1024. frame = tk.Frame(root,bg="black")
  1025. frame.pack(fill=tk.X, side=tk.TOP)
  1026. #b = tk.Button(frame,bg="lightblue", text="FIX:"+str(fix)+" "+data["NAME"],width=20)
  1027. #b.bind("<Button>",Xevent(fix=fix,elem=b).cb)
  1028. #b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1029. #c+=1
  1030. #r+=1
  1031. if fix not in self.elem_attr:
  1032. self.elem_attr[fix] = {}
  1033. for attr in data["ATTRIBUT"]:
  1034. if attr not in self.all_attr:
  1035. self.all_attr.append(attr)
  1036. if attr not in self.elem_attr[fix]:
  1037. self.elem_attr[fix][attr] = []
  1038. if attr.endswith("-FINE"):
  1039. continue
  1040. v= data["ATTRIBUT"][attr]["VALUE"]
  1041. b = tk.Button(frame,bg="lightblue",font=FontBold, text=""+str(fix)+" "+data["NAME"],width=4)
  1042. #b.bind("<Button>",Xevent(fix=fix,elem=b).cb)
  1043. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1044. c+=1
  1045. b = tk.Button(frame,bg="grey",font=FontBold, text=str(attr)+' '+str(round(v,2)),width=6)
  1046. self.elem_attr[fix][attr] = b
  1047. b.bind("<Button>",Xevent(fix=fix,elem=b,attr=attr,data=data).cb)
  1048. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1049. c+=1
  1050. if c >=12:
  1051. c=0
  1052. r+=1
  1053. return c,r
  1054. def draw_patch(self,xframe):
  1055. r=0
  1056. c=0
  1057. frame_dim = xframe
  1058. root = frame_dim
  1059. dim_frame = tk.Frame(root,bg="black")
  1060. dim_frame.pack(fill=tk.X, side=tk.TOP)
  1061. root = frame_patch
  1062. fix_frame = tk.Frame(root,bg="black")
  1063. canvas = tk.Canvas(root)
  1064. def yview(event):
  1065. print("yevent",event)
  1066. print(dir(canvas))
  1067. #yview_moveto', 'yview_scroll'
  1068. yyy=20.1
  1069. fix_frame.yview_moveto(yyy)
  1070. #canvas.yview_moveto(yyy)
  1071. #yyy=20
  1072. #canvas.yview_scroll(yyy,"units")
  1073. #def sconfig(event):
  1074. # global canvas
  1075. # canvas.configure(scrollregion=canvas.bbox("all"),width=400,height=200)
  1076. #fix_frame.bind("<Configure>",sconfig)
  1077. #myscrollbar=tk.Scrollbar(root,orient="vertical",command=canvas.yview)
  1078. #myscrollbar=tk.Scrollbar(root,orient="vertical",command=yview)
  1079. #myscrollbar.pack(side="right",fill="y")
  1080. #canvas.create_window((0, 0), window=fix_frame, anchor="nw")
  1081. #canvas.pack(fill=tk.X, side=tk.TOP)
  1082. fix_frame = tk.Frame(root,bg="black")
  1083. fix_frame.pack(fill=tk.X, side=tk.TOP)
  1084. #fix_frame = canvas
  1085. #fix_frame.configure(scrollregion=canvas.bbox("all"),width=200,height=200)
  1086. #canvas.configure(yscrollcommand=myscrollbar.set)
  1087. i=0
  1088. c=0
  1089. r=0
  1090. for fix in self.FIXTURES.fixtures:
  1091. i+=1
  1092. data = self.FIXTURES.fixtures[fix]
  1093. print( fix ,data )
  1094. #if(len(data["ATTRIBUT"].keys()) <= 1):
  1095. # c,r=self.draw_dim(fix,data,c=c,r=r,frame=dim_frame)
  1096. #else:
  1097. if 1:
  1098. #self._draw_fix(fix,data,root=fix_frame)
  1099. frame = fix_frame
  1100. b = tk.Button(frame,bg="lightblue", text="FIX:"+str(fix)+" "+data["NAME"],width=20)
  1101. b.bind("<Button>",Xevent(fix=fix,elem=b).cb)
  1102. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1103. c+=1
  1104. #r+=1
  1105. if fix not in self.elem_attr:
  1106. self.elem_attr[fix] = {}
  1107. patch = ["DMX","UNIVERS"]
  1108. for k in patch:
  1109. v=data[k]
  1110. b = tk.Button(frame,bg="grey", text=str(k)+' '+str(v),width=8)
  1111. #self.elem_attr[fix][attr] = b
  1112. #b.bind("<Button>",Xevent(fix=fix,elem=b,attr=attr,data=data).cb)
  1113. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1114. c+=1
  1115. if c >=8:
  1116. c=1
  1117. r+=1
  1118. for attr in data["ATTRIBUT"]:
  1119. if attr not in self.all_attr:
  1120. self.all_attr.append(attr)
  1121. if attr not in self.elem_attr[fix]:
  1122. self.elem_attr[fix][attr] = []
  1123. if attr.endswith("-FINE"):
  1124. continue
  1125. v= data["ATTRIBUT"][attr]["VALUE"]
  1126. b = tk.Button(frame,bg="grey", text=str(attr)+' '+str(round(v,2)),width=8)
  1127. self.elem_attr[fix][attr] = b
  1128. #b.bind("<Button>",Xevent(fix=fix,elem=b,attr=attr,data=data).cb)
  1129. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1130. c+=1
  1131. if c >=8:
  1132. c=1
  1133. r+=1
  1134. c=0
  1135. r+=1
  1136. #fix_frame
  1137. #canvas.configure(scrollregion=canvas.bbox("all"),width=200,height=200)
  1138. def draw_fix(self,xframe):
  1139. r=0
  1140. c=0
  1141. frame_dim=xframe
  1142. frame_fix=xframe
  1143. root = frame_dim
  1144. dim_frame = tk.Frame(root,bg="black")
  1145. dim_frame.pack(fill=tk.X, side=tk.TOP)
  1146. root = frame_fix
  1147. fix_frame = tk.Frame(root,bg="black")
  1148. fix_frame.pack(fill=tk.X, side=tk.TOP)
  1149. Font = font.Font(family='Helvetica', size=9, weight='normal')
  1150. FontBold = font.Font(family='Helvetica', size=10, weight='bold')
  1151. #self.tk.default_font.configure(size=9)
  1152. #self.tk.option_add("*Font", FontBold)
  1153. #dim_frame.configure(font=Font)
  1154. #fix_frame.configure(font=Font)
  1155. i=0
  1156. c=0
  1157. r=0
  1158. dim_end=0
  1159. for fix in self.FIXTURES.fixtures:
  1160. i+=1
  1161. data = self.FIXTURES.fixtures[fix]
  1162. print( fix ,data )
  1163. if(len(data["ATTRIBUT"].keys()) <= 1):
  1164. c,r=self.draw_dim(fix,data,c=c,r=r,frame=dim_frame)
  1165. else:
  1166. if not dim_end:
  1167. dim_end=1
  1168. c=0
  1169. r=0
  1170. #self._draw_fix(fix,data,root=fix_frame)
  1171. frame = fix_frame
  1172. b = tk.Button(frame,bg="lightblue",font=FontBold, text="FIX:"+str(fix)+" "+data["NAME"],width=20)
  1173. b.bind("<Button>",Xevent(fix=fix,elem=b).cb)
  1174. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1175. c+=1
  1176. #r+=1
  1177. if fix not in self.elem_attr:
  1178. self.elem_attr[fix] = {}
  1179. for attr in data["ATTRIBUT"]:
  1180. if attr.endswith("-FINE"):
  1181. continue
  1182. if attr not in self.all_attr:
  1183. self.all_attr.append(attr)
  1184. if attr not in self.elem_attr[fix]:
  1185. self.elem_attr[fix][attr] = ["line1348",fix,attr]
  1186. v= data["ATTRIBUT"][attr]["VALUE"]
  1187. b = tk.Button(frame,bg="grey",font=FontBold, text=str(attr)+' '+str(round(v,2)),width=8)
  1188. self.elem_attr[fix][attr] = b
  1189. b.bind("<Button>",Xevent(fix=fix,elem=b,attr=attr,data=data).cb)
  1190. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1191. c+=1
  1192. if c >=8:
  1193. c=1
  1194. r+=1
  1195. c=0
  1196. r+=1
  1197. def draw_enc(self,xframe):
  1198. root2 = xframe
  1199. i=0
  1200. c=0
  1201. r=0
  1202. #frame = tk.Frame(root,bg="black")
  1203. #frame.pack(fill=tk.X, side=tk.TOP)
  1204. #b = tk.Label(frame,bg="black", text="--------------------------------- ---------------------------------------")
  1205. #b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1206. #r=0
  1207. frame = tk.Frame(root2,bg="black")
  1208. frame.pack( side=tk.TOP,expand=1,fill="both")
  1209. b = tk.Button(frame,bg="lightblue", text="ENCODER",width=6)
  1210. #b.bind("<Button>",Xevent(fix=fix,elem=b).cb)
  1211. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1212. #r+=1
  1213. c+=1
  1214. for attr in self.all_attr:
  1215. if attr.endswith("-FINE"):
  1216. continue
  1217. v=0
  1218. b = tk.Button(frame,bg="orange", text=str(attr)+'',width=6)
  1219. b.bind("<Button>",Xevent(fix=0,elem=b,attr=attr,data=self,mode="ENCODER").cb)
  1220. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1221. c+=1
  1222. if c >=8:
  1223. c=0
  1224. r+=1
  1225. def draw_fx(self,xframe):
  1226. frame_fx=xframe
  1227. i=0
  1228. c=0
  1229. r=0
  1230. #frame = tk.Frame(root,bg="black")
  1231. #frame.pack(fill=tk.X, side=tk.TOP)
  1232. #b = tk.Label(frame,bg="black", text="------------------------------ ---------------------------------------")
  1233. #b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1234. #r=0
  1235. #frame = tk.Frame(root2,bg="black")
  1236. frame = tk.Frame(frame_fx,bg="black")
  1237. frame.pack(fill=tk.X, side=tk.TOP)
  1238. b = tk.Button(frame,bg="lightblue", text="FX.",width=6)
  1239. #b.bind("<Button>",Xevent(fix=fix,elem=b).cb)
  1240. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1241. #r+=1
  1242. c+=1
  1243. for comm in self.fx_commands:
  1244. if comm == "\n":
  1245. c=0
  1246. r+=1
  1247. continue
  1248. v=0
  1249. b = tk.Button(frame,bg="lightgrey", text=str(comm),width=6,height=2)
  1250. if comm not in self.elem_fx_commands:
  1251. self.elem_fx_commands[comm] = b
  1252. self.val_fx_commands[comm] = 0
  1253. b.bind("<Button>",Xevent(fix=0,elem=b,attr=comm,data=self,mode="COMMAND").cb)
  1254. if comm == "BLIND":
  1255. b["bg"] = "grey"
  1256. if comm == "CLEAR":
  1257. b["bg"] = "grey"
  1258. if comm == "STONY_FX":
  1259. b["bg"] = "grey"
  1260. if comm == "FADE":
  1261. b["bg"] = "green"
  1262. if comm == "FX OFF":
  1263. b["bg"] = "magenta"
  1264. if comm == "SZ:":
  1265. b["text"] = "SZ:{:0.0f}".format(fx_prm["SIZE"])
  1266. if comm == "SP:":
  1267. b["text"] = "SP:{:0.0f}".format(fx_prm["SPEED"])
  1268. if comm == "ST:":
  1269. b["text"] = "ST:{:0.0f}".format(fx_prm["START"])
  1270. if comm == "OF:":
  1271. b["text"] = "OF:{:0.0f}".format(fx_prm["OFFSET"])
  1272. if comm == "BS:":
  1273. b["text"] = "BS:{}".format(fx_prm["BASE"])
  1274. if comm:
  1275. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1276. c+=1
  1277. if c >=5:
  1278. c=0
  1279. r+=1
  1280. def draw_command(self,xframe):
  1281. frame_cmd=xframe
  1282. i=0
  1283. c=0
  1284. r=0
  1285. #frame = tk.Frame(root,bg="black")
  1286. #frame.pack(fill=tk.X, side=tk.TOP)
  1287. #b = tk.Label(frame,bg="black", text="------------------------------ ---------------------------------------")
  1288. #b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1289. #r=0
  1290. #frame = tk.Frame(root2,bg="black")
  1291. frame = tk.Frame(frame_cmd,bg="black")
  1292. frame.pack(fill=tk.X, side=tk.TOP)
  1293. b = tk.Button(frame,bg="lightblue", text="COMM.",width=6)
  1294. #b.bind("<Button>",Xevent(fix=fix,elem=b).cb)
  1295. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1296. #r+=1
  1297. c+=1
  1298. for comm in self.commands:
  1299. if comm == "\n":
  1300. c=0
  1301. r+=1
  1302. continue
  1303. v=0
  1304. b = tk.Button(frame,bg="lightgrey", text=str(comm),width=6,height=2)
  1305. if comm not in self.elem_commands:
  1306. self.elem_commands[comm] = b
  1307. self.val_commands[comm] = 0
  1308. b.bind("<Button>",Xevent(fix=0,elem=b,attr=comm,data=self,mode="COMMAND").cb)
  1309. if comm == "BLIND":
  1310. b["bg"] = "grey"
  1311. if comm == "CLEAR":
  1312. b["bg"] = "grey"
  1313. if comm == "STONY_FX":
  1314. b["bg"] = "grey"
  1315. if comm == "FADE":
  1316. b["bg"] = "green"
  1317. if comm == "FX OFF":
  1318. b["bg"] = "magenta"
  1319. if comm == "SZ:":
  1320. b["text"] = "SZ:{:0.0f}".format(fx_prm["SIZE"])
  1321. if comm == "SP:":
  1322. b["text"] = "SP:{:0.0f}".format(fx_prm["SPEED"])
  1323. if comm == "FADE":
  1324. b["text"] = "FADE:{:0.02f}".format(fade)
  1325. if comm == "ST:":
  1326. b["text"] = "ST:{:0.0f}".format(fx_prm["START"])
  1327. if comm == "OF:":
  1328. b["text"] = "OF:{:0.0f}".format(fx_prm["OFFSET"])
  1329. if comm == "BS:":
  1330. b["text"] = "BS:{}".format(fx_prm["BASE"])
  1331. if comm:
  1332. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1333. c+=1
  1334. if c >=5:
  1335. c=0
  1336. r+=1
  1337. def draw_preset(self,xframe):
  1338. i=0
  1339. c=0
  1340. r=0
  1341. root = xframe
  1342. frame = tk.Frame(root,bg="black")
  1343. frame.pack(fill=tk.X, side=tk.TOP)
  1344. #b = tk.Button(frame,bg="lightblue", text="EXEC")
  1345. #b.bind("<Button>",Xevent(elem=b).cb)
  1346. #b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1347. #r+=1
  1348. i=0
  1349. for k in self.PRESETS.val_presets:
  1350. if i%(8*8)==0 or i ==0:
  1351. c=0
  1352. b = tk.Label(frame,bg="black", text="X" )
  1353. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1354. r+=1
  1355. c=0
  1356. b = tk.Button(frame,bg="lightblue", text="EXEC " )
  1357. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1358. c+=1
  1359. b = tk.Button(frame,bg="lightblue", text="PAGE " + str(int(i/(8*8))+1) )
  1360. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1361. c+=1
  1362. b = tk.Button(frame,bg="lightblue", text="<NAME>" )
  1363. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1364. r+=1
  1365. c=0
  1366. i+=1
  1367. v=0
  1368. label = ""
  1369. if k in self.PRESETS.label_presets:
  1370. label = self.PRESETS.label_presets[k]
  1371. print([label])
  1372. sdata=self.PRESETS.val_presets[k]
  1373. BTN="go"
  1374. if "CFG" in sdata:#["BUTTON"] = "GO"
  1375. if "BUTTON" in sdata["CFG"]:
  1376. BTN = sdata["CFG"]["BUTTON"]
  1377. txt=str(k+1)+":"+str(BTN)+":"+str(len(sdata)-1)+"\n"+label
  1378. b = tk.Button(frame,bg="grey", text=txt,width=8,height=2)
  1379. b.bind("<Button>",Xevent(fix=0,elem=b,attr=k,data=self,mode="PRESET").cb)
  1380. b.bind("<ButtonRelease>",Xevent(fix=0,elem=b,attr=k,data=self,mode="PRESET").cb)
  1381. if k in self.PRESETS.val_presets and len(self.PRESETS.val_presets[k]) :
  1382. b["bg"] = "yellow"
  1383. sdata = self.PRESETS.val_presets[k]
  1384. if len(sdata) > 1:
  1385. fx_color = 0
  1386. val_color = 0
  1387. for fix in sdata:
  1388. if fix == "CFG":
  1389. continue
  1390. #print( "$$$$",fix,sdata[fix])
  1391. for attr in sdata[fix]:
  1392. if "FX" in sdata[fix][attr]:
  1393. if sdata[fix][attr]["FX"]:
  1394. fx_color = 1
  1395. if "VALUE" in sdata[fix][attr]:
  1396. if sdata[fix][attr]["VALUE"] is not None:
  1397. val_color = 1
  1398. b["fg"] = "black"
  1399. if val_color:
  1400. b["bg"] = "gold"
  1401. if fx_color:
  1402. b["fg"] = "blue"
  1403. else:
  1404. if fx_color:
  1405. b["bg"] = "cyan"
  1406. else:
  1407. b["bg"] = "grey"
  1408. if "SEL" in txt:
  1409. b["fg"] = "black"
  1410. b["bg"] = "blue"
  1411. elif "GO" in txt:
  1412. b["fg"] = "black"
  1413. elif "FL" in txt:
  1414. b["fg"] = "red"
  1415. if k not in self.elem_presets:
  1416. self.elem_presets[k] = b
  1417. #self.PRESETS.val_presets[preset] = 0
  1418. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1419. c+=1
  1420. if c >=8:
  1421. c=0
  1422. r+=1
  1423. def draw_input(self):
  1424. i=0
  1425. c=0
  1426. r=0
  1427. frame = tk.Frame(root2,bg="black")
  1428. frame.pack(fill=tk.X, side=tk.TOP)
  1429. b = tk.Label(frame,bg="black", text="------------------------ ---------------------------------------")
  1430. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1431. r=0
  1432. frame = tk.Frame(root2,bg="black")
  1433. frame.pack(fill=tk.X, side=tk.TOP)
  1434. b = tk.Label(frame, text="send:")
  1435. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1436. c+=1
  1437. b = tk.Entry(frame,bg="grey", text="",width=50)
  1438. self.entry = b
  1439. b.bind("<Button>",Xevent(fix=0,elem=b,attr="INPUT",data=self,mode="INPUT").cb)
  1440. b.bind("<Key>",Xevent(fix=0,elem=b,attr="INPUT",data=self,mode="INPUT").cb)
  1441. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1442. b.insert("end","d0:127,fx241:sinus:50:50:10,fx243:cosinus:50:50:10,d201:127,fx201:sinus:50:300:10")
  1443. r+=1
  1444. b = tk.Entry(frame,bg="grey", text="",width=20)
  1445. self.entry2 = b
  1446. b.bind("<Button>",Xevent(fix=0,elem=b,attr="INPUT",data=self,mode="INPUT2").cb)
  1447. b.bind("<Key>",Xevent(fix=0,elem=b,attr="INPUT",data=self,mode="INPUT2").cb)
  1448. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1449. b.insert("end","d1:0:4")
  1450. r+=1
  1451. b = tk.Entry(frame,bg="grey", text="",width=20)
  1452. self.entry3 = b
  1453. b.bind("<Button>",Xevent(fix=0,elem=b,attr="INPUT",data=self,mode="INPUT3").cb)
  1454. #b.bind("<B1-Motion>",Xevent(fix=0,elem=b,attr="INPUT",data=self,mode="INPUT3").cb)
  1455. b.bind("<Key>",Xevent(fix=0,elem=b,attr="INPUT",data=self,mode="INPUT3").cb)
  1456. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1457. b.insert("end","fx:alloff:::")
  1458. def draw_colorpicker(self,xframe):
  1459. import lib.colorpicker as colp
  1460. #colp.colorpicker(xframe,width=600,height=100, xcb=Xevent(fix=0,elem=None,attr="COLORPICKER",data=self,mode="INPUT").cb)
  1461. #xcb = cb
  1462. e = dummy_event()
  1463. r = Xevent(fix=0,elem=None,attr="RED",data=self,mode="ENCODER") #.cb
  1464. g = Xevent(fix=0,elem=None,attr="GREEN",data=self,mode="ENCODER") #.cb
  1465. b = Xevent(fix=0,elem=None,attr="BLUE",data=self,mode="ENCODER") #.cb
  1466. class _CB():
  1467. def __init__(self):
  1468. self.old_color = (0,0,0)
  1469. def cb(self,event,data):
  1470. if "color" in data and self.old_color != data["color"]:
  1471. self.old_color = data["color"]
  1472. else:
  1473. return 0
  1474. color = data["color"]
  1475. print("PPPPPPPOOOOOORRR")
  1476. print("e",event,data)
  1477. print("e",dir(event))#.keys())
  1478. print("e.num",event.num)
  1479. try:
  1480. print("e.stat",event.state)
  1481. except:pass
  1482. if "color" in data and (event.num == 1 or event.num == 3 or event.num==2 or event.state==256):
  1483. e.num=5
  1484. e.type=1
  1485. cr=-1
  1486. cg=-1
  1487. cb=-1
  1488. if event.num == 1:
  1489. e.set_fade=fade
  1490. cr = color[0]
  1491. cg = color[1]
  1492. cb = color[2]
  1493. elif event.num == 3:
  1494. cr = color[0]
  1495. cg = color[1]
  1496. cb = color[2]
  1497. e.set_fade=-1
  1498. elif event.num == 2:
  1499. e.num=1
  1500. e.type=4
  1501. e.set_value=-1
  1502. elif event.state == 256:
  1503. cr = color[0]
  1504. cg = color[1]
  1505. cb = color[2]
  1506. e.set_fade=-1
  1507. else:
  1508. e.set_fade=-1
  1509. e.set_value=cr#color[0]
  1510. r.cb(e)
  1511. e.set_value=cg#color[1]
  1512. g.cb(e)
  1513. e.set_value=cb#color[2]
  1514. b.cb(e)
  1515. e.set_value=-1
  1516. e.set_fade=-1
  1517. print("PICK COLOR:",data["color"])
  1518. #self.encoder(fix=fix,attr=attr,data=data,elem=elem,action="+")
  1519. _cb=_CB()
  1520. colp.colorpicker(xframe,width=600,height=100, xcb=_cb.cb)
  1521. return 0
  1522. canvas=tk.Canvas(xframe,width=600,height=100)
  1523. canvas["bg"] = "yellow" #"green"
  1524. canvas.pack()
  1525. # RGB
  1526. x=0
  1527. y=0
  1528. j=0
  1529. d = 20
  1530. for i in range(0,d+1):
  1531. fi = int(i*255/d)
  1532. f = 255-fi
  1533. if i > d/2:
  1534. pass#break
  1535. color = '#%02x%02x%02x' % (f, fi, fi)
  1536. print( "farbe", i*10, j, f,fi,fi,color)
  1537. r = canvas.create_rectangle(x, y, x+20, y+20, fill=color)
  1538. x+=20
  1539. def render(self):
  1540. Xroot.bind("<Key>",Xevent(fix=0,elem=None,attr="ROOT",data=self,mode="ROOT").cb)
  1541. #self.draw_patch()
  1542. #self.draw_fix()
  1543. #input()
  1544. #self.draw_enc()
  1545. #self.draw_command()
  1546. #self.draw_fx()
  1547. self.draw_input()
  1548. #self.draw_preset()
  1549. def ScrollFrame(root,width=50,height=100,bd=1):
  1550. print("ScrollFrame init",width,height)
  1551. aframe=tk.Frame(root,relief=tk.GROOVE)#,width=width,height=height,bd=bd)
  1552. #aframe.place(x=0,y=0)
  1553. aframe.pack(side="left",fill="both",expand=1) #x=0,y=0)
  1554. canvas=tk.Canvas(aframe,width=width-24,height=height)
  1555. canvas["bg"] = "black" #"green"
  1556. bframe=tk.Frame(canvas)#,width=width,height=height)
  1557. bframe["bg"] = "blue"
  1558. scrollbar=tk.Scrollbar(aframe,orient="vertical",command=canvas.yview,width=20)
  1559. canvas.configure(yscrollcommand=scrollbar.set)
  1560. scrollbar.pack(side="right",fill="y")
  1561. canvas.pack(side="left",expand=1,fill="both")
  1562. canvas.create_window((0,0),window=bframe,anchor='nw')
  1563. bframe.bind("<Configure>",scroll(canvas).config)
  1564. canvas.bind("<Button>",Event("XXX").event)
  1565. canvas.bind("<Key>",Event("XXX").event)
  1566. return bframe
  1567. #frame = ScrollFrame(root)
  1568. class GUIHandler():
  1569. def __init__(self):
  1570. pass
  1571. def update(self,fix,attr,args={}):
  1572. #print("GUIHandler",fix,attr,args)
  1573. for i,k in enumerate(args):
  1574. v = args[k]
  1575. #print("GUI-H", i,k,v)
  1576. class Fixtures(Base):
  1577. def __init__(self):
  1578. super().__init__()
  1579. #self.load()
  1580. self.fixtures = OrderedDict()
  1581. self.gui = GUIHandler()
  1582. def load_patch(self):
  1583. filename="patch"
  1584. d,l = self._load(filename)
  1585. self.fixtures = OrderedDict()
  1586. for i in l:
  1587. sdata = d[i]
  1588. for attr in sdata["ATTRIBUT"]:
  1589. sdata["ATTRIBUT"][attr]["ACTIVE"] = 0
  1590. #print("load",filename,sdata)
  1591. #if "CFG" not in sdata:
  1592. # sdata["CFG"] = OrderedDict()
  1593. self.fixtures[str(i)] = sdata
  1594. #self.PRESETS.label_presets = l
  1595. def backup_patch(self):
  1596. filename = "patch"
  1597. data = self.fixtures
  1598. labels = {}
  1599. for k in data:
  1600. labels[k] = k
  1601. self._backup(filename,data,labels)
  1602. def update_raw(self,rdata):
  1603. #print("update_raw",rdata)
  1604. cmd = []
  1605. for i,d in enumerate(rdata):
  1606. xcmd = {"DMX":""}
  1607. #print("fix:",i,d)
  1608. fix = d["FIX"]
  1609. attr = d["ATTR"]
  1610. v2 = d["VALUE"]
  1611. v2_fx = d["FX"]
  1612. if fix not in self.fixtures:
  1613. continue
  1614. sdata = self.fixtures[fix] #shortcat
  1615. ATTR = sdata["ATTRIBUT"]
  1616. sDMX = 0
  1617. if sdata["DMX"] > 0:
  1618. print( sdata)
  1619. sDMX = (sdata["UNIVERS"]*512)+sdata["DMX"]
  1620. #sDMX =sdata["DMX"]
  1621. if attr not in ATTR:
  1622. continue
  1623. if ATTR[attr]["NR"] >= 0:
  1624. DMX = sDMX+ATTR[attr]["NR"]-1
  1625. xcmd["DMX"] = str(DMX)
  1626. else:
  1627. if attr == "DIM" and ATTR[attr]["NR"] < 0:
  1628. xcmd["VIRTUAL"] = {}
  1629. for a in ATTR:
  1630. if ATTR[a]["MASTER"]:
  1631. xcmd["VIRTUAL"][a] = sDMX+ATTR[a]["NR"]-1
  1632. #print( "VIRTUAL",xcmd)
  1633. cmd.append(xcmd)
  1634. v=ATTR[attr]["VALUE"]
  1635. if v2 is not None:
  1636. ATTR[attr]["VALUE"] = v2
  1637. #self.data.elem_attr[fix][attr]["text"] = str(attr)+' '+str(round(v,2))
  1638. text = str(attr)+' '+str(round(v,2))
  1639. self.gui.update(fix,attr,args={"text":text})
  1640. return cmd
  1641. def get_active(self):
  1642. print(self,"get_active")
  1643. CFG = OrderedDict()
  1644. sdata = OrderedDict()
  1645. sdata["CFG"] = CFG # OrderedDict()
  1646. sdata["CFG"]["FADE"] = fade
  1647. sdata["CFG"]["DEALY"] = 0
  1648. #sdata["CFG"]["BUTTON"] = "GO"
  1649. for fix in self.fixtures:
  1650. data = self.fixtures[fix]
  1651. for attr in data["ATTRIBUT"]:
  1652. if data["ATTRIBUT"][attr]["ACTIVE"]:
  1653. if fix not in sdata:
  1654. sdata[fix] = {}
  1655. if attr not in sdata[fix]:
  1656. sdata[fix][attr] = OrderedDict()
  1657. if not modes.val("STONY_FX"):
  1658. sdata[fix][attr]["VALUE"] = data["ATTRIBUT"][attr]["VALUE"]
  1659. #sdata[fix][attr]["FADE"] = fade
  1660. else:
  1661. sdata[fix][attr]["VALUE"] = None #data["ATTRIBUT"][attr]["VALUE"]
  1662. if "FX" not in data["ATTRIBUT"][attr]:
  1663. data["ATTRIBUT"][attr]["FX"] =""
  1664. sdata[fix][attr]["FX"] = data["ATTRIBUT"][attr]["FX"]
  1665. return sdata
  1666. def select(self,fix=None,attr=None):
  1667. out = 0
  1668. if fix in self.fixtures:
  1669. data = self.fixtures[fix]
  1670. if attr in data["ATTRIBUT"]:
  1671. data["ATTRIBUT"][attr]["ACTIVE"] = 1
  1672. out = 1
  1673. return 1
  1674. def clear(self,event=None):
  1675. out = 0
  1676. if 1:
  1677. for fix in self.fixtures:
  1678. #print( "clr",fix)
  1679. data = self.fixtures[fix]
  1680. #print("elm",self.data.elem_attr[fix])
  1681. for attr in data["ATTRIBUT"]:
  1682. if attr.endswith("-FINE"):
  1683. continue
  1684. if data["ATTRIBUT"][attr]["ACTIVE"]:
  1685. out +=1
  1686. data["ATTRIBUT"][attr]["ACTIVE"] = 0
  1687. #print(data["ATTRIBUT"])
  1688. print( "CB CLEAR" )
  1689. return out
  1690. class Presets(Base):
  1691. def __init__(self):
  1692. super().__init__()
  1693. #self.load()
  1694. def load_presets(self):
  1695. filename="presets"
  1696. d,l = self._load(filename)
  1697. for i in d:
  1698. sdata = d[i]
  1699. if "CFG" not in sdata:
  1700. sdata["CFG"] = OrderedDict()
  1701. if "FADE" not in sdata["CFG"]:
  1702. sdata["CFG"]["FADE"] = 4
  1703. if "DELAY" not in sdata["CFG"]:
  1704. sdata["CFG"]["DELAY"] = 0
  1705. if "BUTTON" not in sdata["CFG"]:
  1706. sdata["CFG"]["BUTTON"] = "GO"
  1707. self.val_presets = d
  1708. self.label_presets = l
  1709. def backup_presets(self):
  1710. filename = "presets"
  1711. data = self.val_presets
  1712. labels = self.label_presets
  1713. self._backup(filename,data,labels)
  1714. def get_cfg(self,nr):
  1715. if nr not in self.val_presets:
  1716. print(self,"error get_cfg no nr:",nr)
  1717. return {}
  1718. if "CFG" in self.val_presets[nr]:
  1719. return self.val_presets[nr]["CFG"]
  1720. def get_raw_map(self,nr):
  1721. print("get_raw_map",nr)
  1722. if nr not in self.val_presets:
  1723. self.val_presets[nr] = OrderedDict()
  1724. self.val_presets[nr]["VALUE"] = 0
  1725. self.val_presets[nr]["FX"] = ""
  1726. sdata = self.val_presets[nr]
  1727. cmd = ""
  1728. out = []
  1729. dmx=-1
  1730. for fix in sdata:
  1731. if fix == "CFG":
  1732. #print("CFG",nr,sdata[fix])
  1733. continue
  1734. for attr in sdata[fix]:
  1735. x = {}
  1736. #print("RAW",attr)
  1737. x["FIX"] = fix
  1738. x["ATTR"] = attr
  1739. x["VALUE"] = sdata[fix][attr]["VALUE"]
  1740. x["FX"] = sdata[fix][attr]["FX"]
  1741. #x["DMX"] = sdata[fix][attr]["NR"]
  1742. out.append(x)
  1743. return out
  1744. def get_btn_txt(self,nr):
  1745. sdata=self.val_presets[nr]
  1746. BTN="go"
  1747. if "CFG" in sdata:
  1748. if "BUTTON" in sdata["CFG"]:
  1749. BTN = sdata["CFG"]["BUTTON"]
  1750. _label = self.label_presets[nr] # = label
  1751. txt=str(nr+1)+":"+str(BTN)+":"+str(len(sdata)-1)+"\n"+_label
  1752. print("get_btn_txt",nr,[txt])
  1753. return txt
  1754. def btn_cfg(self,nr,txt=None):
  1755. if nr not in self.val_presets:
  1756. return ""
  1757. if type(name) is str:
  1758. if "CFG" not in self.val_presets[nr]:
  1759. self.val_presets[nr]["CFG"] = OrderedDict()
  1760. if "BUTTON" not in self.val_presets[nr]["CFG"]:
  1761. self.val_presets[nr]["CFG"]["BUTTON"] = ""
  1762. self.val_presets[nr]["CFG"]["BUTTON"] = txt
  1763. if self.val_presets[nr]["CFG"]["BUTTON"] is None:
  1764. self.val_presets[nr]["CFG"]["BUTTON"] = ""
  1765. print("EEE", self.val_presets[nr]["CFG"]["BUTTON"] )
  1766. return self.val_presets[nr]["CFG"]["BUTTON"]
  1767. def label(self,nr,txt=None):
  1768. if nr not in self.label_presets:
  1769. return ""
  1770. if type(txt) is str:
  1771. self.label_presets[nr] = txt
  1772. print("set label",nr,[txt])
  1773. print("??? ?? set label",nr,[txt])
  1774. return self.label_presets[nr]
  1775. def store(self,nr,data,arg=""):
  1776. #TODO implement
  1777. print(self,"store()",data,arg)
  1778. self.val_presets[nr] = data
  1779. if not self.label_presets:
  1780. self.label_presets = "Neu"
  1781. #return 0
  1782. class GUI_grid():
  1783. def __init__(self,root,data,title="tilte",width=800):
  1784. self.data = data
  1785. self.frame = tk.Frame(root,bg="black",width=width)
  1786. self.frame.pack(fill=tk.BOTH, side=tk.LEFT)
  1787. r=0
  1788. c=0
  1789. i=1
  1790. for row in data:
  1791. self.b = tk.Button(self.frame,bg="lightblue", text=row["text"],width=11,height=4)
  1792. #self.b.bind("<Button>",Xevent(fix=fix,elem=b).cb)
  1793. self.b.grid(row=r, column=c, sticky=tk.W+tk.E)#,anchor="w")
  1794. c+=1
  1795. if c % 8 == 0:
  1796. r+=1
  1797. c=0
  1798. i+=1
  1799. self.frame.pack()
  1800. class BEvent():
  1801. def __init__(self,data,cb):
  1802. self._data = data
  1803. self._cb = cb
  1804. def cb(self,event):
  1805. #print(self,event)
  1806. self._cb(event,self._data)
  1807. class GUI_menu():
  1808. def __init__(self,root,data,title="tilte",width=800):
  1809. global tk
  1810. self.data = data
  1811. self.frame = tk.Frame(root,bg="black",width=width)
  1812. self.frame.pack(fill=tk.BOTH, side=tk.LEFT)
  1813. r=0
  1814. c=0
  1815. i=1
  1816. self.b = tk.Label(self.frame,bg="blue", text="MAIN:MENU",width=13,height=1)
  1817. self.b.grid(row=r, column=c, sticky=tk.W+tk.E)#,anchor="w")
  1818. r+=1
  1819. for row in data:
  1820. #print(i)
  1821. #row = data[i]
  1822. self.b = tk.Button(self.frame,bg="lightblue", text=row["text"],width=13,height=3)
  1823. self.b.bind("<Button>",BEvent({"NR":i,"text":row["text"]},self.callback).cb)
  1824. self.b.grid(row=r, column=c, sticky=tk.W+tk.E)#,anchor="w")
  1825. r+=1
  1826. i+=1
  1827. self.frame.pack()
  1828. def callback(self,event,data={}):
  1829. print(self,event,data)
  1830. window_manager.top(data["text"])# = WindowManager()
  1831. lf_nr = 0
  1832. class GUIWindow():
  1833. def __init__(self,title="tilte",master=0,width=100,height=100,left=None,top=None):
  1834. global lf_nr
  1835. if master:
  1836. #Font = font.Font(family='Helvetica', size=9, weight='normal')
  1837. self.tk = tkinter.Tk()#font=Font) #Toplevel()
  1838. #Font = font.Font(family='Helvetica', size=9, weight='normal')
  1839. #FontBold = font.Font(family='Helvetica', size=10, weight='bold')
  1840. #self.tk.default_font.configure(size=9)
  1841. #self.tk.option_add("*Font", FontBold)
  1842. #self.tk.configure(font=Font)
  1843. else:
  1844. self.tk = tkinter.Toplevel()
  1845. self.tk["bg"] = "black"
  1846. self.tk.bind("<Button>",self.callback)
  1847. self.tk.bind("<Key>",self.callback)
  1848. self.tk.title(""+str(title)+" "+str(lf_nr)+":"+str(rnd_id))
  1849. lf_nr+=1
  1850. #self.tk.geometry("270x600+0+65")
  1851. geo ="{}x{}".format(width,height)
  1852. if left is not None:
  1853. geo += "+{}".format(left)
  1854. if top is not None:
  1855. geo += "+{}".format(top)
  1856. #self._event_clear = Xevent(fix=0,elem=None,attr="CLEAR",data=self,mode="ROOT").cb
  1857. self.tk.geometry(geo)
  1858. def title(self,title=None):
  1859. if title is None:
  1860. return self.tk.title()
  1861. else:
  1862. return self.tk.title(title)
  1863. def show(self):
  1864. pass
  1865. #self.frame.pack()
  1866. def mainloop(self):
  1867. self.tk.mainloop()
  1868. def callback(self,event,data={}):
  1869. print("<GUI>",self,event,data)
  1870. #if "keysym" in dir(event):
  1871. # if "Escape" == event.keysym:
  1872. # e=dummy_event()
  1873. # e.num=1
  1874. # self._event_clear(e)
  1875. class WindowManager():
  1876. def __init__(self):
  1877. self.windows = {}
  1878. self.nr= 0
  1879. self.first=""
  1880. def new(self,w,name=""):
  1881. if not self.first:
  1882. if name:
  1883. self.first = name
  1884. else:
  1885. self.first = str(self.nr)
  1886. w.tk.attributes('-topmost',True)
  1887. if name:
  1888. self.windows[str(name)] = w
  1889. else:
  1890. self.windows[str(self.nr)] = w
  1891. self.nr+=1
  1892. #w.show()
  1893. def mainloop(self):
  1894. self.windows[self.first].mainloop()
  1895. def top(self,name):
  1896. name = str(name)
  1897. if name in self.windows:
  1898. self.windows[name].tk.attributes('-topmost',True)
  1899. self.windows[name].tk.attributes('-topmost',False)
  1900. else:
  1901. print(name,"not in self.windows",self.windows.keys())
  1902. window_manager = WindowManager()
  1903. master =GUI()
  1904. w = GUIWindow("MAIN",master=1,width=130,height=450,left=0,top=65)
  1905. data = []
  1906. #data.append({"text":"COMMAND"})
  1907. data.append({"text":"EXEC"})
  1908. data.append({"text":"DIMMER"})
  1909. data.append({"text":"FIXTURES"})
  1910. #data.append({"text":"PRESET"})
  1911. #data.append({"text":"PATCH"})
  1912. #data.append({"text":"ENCODER"})
  1913. f = GUI_menu(w.tk,data)
  1914. window_manager.new(w)
  1915. name="DIMMER"
  1916. w = GUIWindow(name,master=0,width=800,height=400,left=140,top=65)
  1917. w1 = ScrollFrame(w.tk,width=800,height=400)
  1918. #frame_dim = w1 # w.tk
  1919. #master.draw_dim(w1.tk)
  1920. window_manager.new(w,name)
  1921. name="FIXTURES"
  1922. w = GUIWindow(name,master=0,width=800,height=400,left=140,top=65)
  1923. w1 = ScrollFrame(w.tk,width=800,height=400)
  1924. #frame_fix = w1 #w.tk
  1925. master.draw_fix(w1)#.tk)
  1926. window_manager.new(w,name)
  1927. name="ENCODER"
  1928. ww = GUIWindow(name,master=0,width=800,height=50,left=140,top=500)
  1929. Xroot = ww.tk
  1930. #default_font = font.Font(family='Helvetica', size=12, weight='bold')
  1931. Font = font.Font(family='Helvetica', size=9, weight='normal')
  1932. FontBold = font.Font(family='Helvetica', size=10, weight='bold')
  1933. #default_font.configure(size=9)
  1934. Xroot.option_add("*Font", FontBold)
  1935. w = None
  1936. root = tk.Frame(Xroot,bg="black",width="10px")
  1937. root.pack(fill=tk.BOTH,expand=0, side=tk.LEFT)
  1938. root3 = tk.Frame(Xroot,bg="black",width="20px")
  1939. root3.pack(fill=tk.BOTH,expand=0, side=tk.LEFT)
  1940. root2 = tk.Frame(Xroot,bg="black",width="1px")
  1941. master.draw_enc(root2)
  1942. root2.pack(fill=tk.BOTH,expand=0, side=tk.LEFT)
  1943. #w = GUIWindow("GRID",master=0,width=1000,height=200,left=232,top=65)
  1944. #data = []
  1945. #for i in range(10):
  1946. # data.append({"text":"P {:02}".format(i+1)})
  1947. #w = GUI_grid(w.tk,data)
  1948. #window_manager.new(w)
  1949. name = "COMMAND"
  1950. w = GUIWindow(name,master=0,width=350,height=200,left=950,top=65)
  1951. master.draw_command(w.tk)
  1952. window_manager.new(w,name)
  1953. name="EXEC"
  1954. w = GUIWindow(name,master=0,width=800,height=400,left=140,top=65)
  1955. w1 = ScrollFrame(w.tk,width=800,height=400)
  1956. #frame_exe = w.tk
  1957. master.draw_preset(w1)#w.tk)
  1958. window_manager.new(w,name)
  1959. name="PATCH"
  1960. w = GUIWindow(name,master=0,width=800,height=400,left=140,top=65)
  1961. w1 = ScrollFrame(w.tk,width=800,height=400)
  1962. frame_patch = w1 #w.tk
  1963. window_manager.new(w,name)
  1964. name="FX"
  1965. w = GUIWindow(name,master=0,width=350,height=250,left=950,top=305)
  1966. #frame_fx = w.tk
  1967. master.draw_fx(w.tk)
  1968. window_manager.new(w,name)
  1969. #LibreLightDesk
  1970. name="COLERPICKER"
  1971. w = GUIWindow(name,master=0,width=580,height=100,left=80,top=620)
  1972. master.draw_colorpicker(w.tk)
  1973. window_manager.new(w,name)
  1974. #Xroot = tk.Tk()
  1975. #Xroot["bg"] = "black" #white
  1976. #Xroot.title( xtitle+" "+str(rnd_id) )
  1977. #Xroot.geometry("1024x800+130+65")
  1978. master.render()
  1979. #w = frame_fix #GUIWindow("OLD",master=0,width=800,height=500,left=130,top=65)
  1980. window_manager.new(w,name)
  1981. try:
  1982. #root.mainloop()
  1983. #tk.mainloop()
  1984. window_manager.mainloop()
  1985. finally:
  1986. master.exit()