_LibreLightDesk.py 95 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750
  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, version 2 of the License.
  8. LibreLight is distributed in the hope that it will be useful,
  9. but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  11. GNU General Public License for more details.
  12. You should have received a copy of the GNU General Public License
  13. along with LibreLight. If not, see <http://www.gnu.org/licenses/>.
  14. (c) 2012 micha@uxsrv.de
  15. """
  16. import random
  17. rnd_id = str(random.randint(1000,9000))
  18. rnd_id += " Beta 22.02 "
  19. import subprocess
  20. rnd_id += subprocess.check_output(['git', 'rev-parse', '--short', 'HEAD']).decode('ascii').strip()
  21. try:
  22. xtitle = __file__
  23. except:
  24. xtitle = "__file__"
  25. if "/" in xtitle:
  26. xtitle = xtitle.split("/")[-1]
  27. import sys
  28. sys.stdout.write("\x1b]2;"+str(xtitle)+" "+str(rnd_id)+"\x07") # terminal title
  29. import json
  30. import time
  31. import sys
  32. import os
  33. import _thread as thread
  34. import traceback
  35. import tkinter
  36. import tkinter as tk
  37. from tkinter import font
  38. import tkinter.simpledialog
  39. import lib.chat as chat
  40. import lib.motion as motion
  41. from collections import OrderedDict
  42. CUES = OrderedDict()
  43. groups = OrderedDict()
  44. class Modes():
  45. def __init__(self):
  46. self.modes = {}
  47. self.__cfg = {}
  48. self.__cb = None
  49. def val(self,mode,value=None):
  50. if value is not None:
  51. return self.set(mode,value)
  52. elif mode in self.modes:
  53. return self.modes[mode]
  54. def get(self,mode,value=None):
  55. return slef.val(mode,value)
  56. def __check(self,mode):
  57. if mode not in self.modes:
  58. self.modes[mode] = 0
  59. self.__cfg[mode] = 0
  60. def cfg(self,mode,data={}):
  61. self.__check(mode)
  62. if type(data) is dict:
  63. for k in data:
  64. v = data[k]
  65. if v not in self.__cfg:
  66. self.__cfg[k] = v
  67. return 1
  68. elif type(data) is str:
  69. if data in self.__cfg:
  70. return self.__cfg[data]
  71. def set(self,mode,value):
  72. protected = ["BLIND","CLEAR","STONY_FX"]
  73. self.__check(mode)
  74. out = 0
  75. if mode == "CLEAR":
  76. return 1
  77. elif mode == "ESC":
  78. for m in self.modes:
  79. print("ESC",m)
  80. if m == "COPY":
  81. PRESETS.clear_copy()
  82. if m == "MOVE":
  83. PRESETS.clear_move()
  84. if m != "BLIND":
  85. self.modes[m] = 0
  86. self.callback(m)
  87. out = 1
  88. return 1
  89. elif value:
  90. for m in self.modes:
  91. if m not in protected and mode not in protected and m != mode:
  92. if self.modes[m]:
  93. self.modes[m]= 0
  94. self.callback(m)
  95. if self.modes[mode]:
  96. if modes == "MOVE":
  97. PRESETS.clear_move()
  98. if modes == "COPY":
  99. PRESETS.clear_copy()
  100. self.modes[mode] = 0 # value
  101. else:
  102. self.modes[mode] = 1 #value
  103. out = 1
  104. else:
  105. self.modes[mode] = 0 #value
  106. if modes == "COPY":
  107. PRESETS.clear_copy()
  108. if modes == "MOVE":
  109. PRESETS.clear_move()
  110. self.callback(mode)
  111. return value
  112. def set_cb(self,cb):
  113. if cb:
  114. self.__cb = cb
  115. def callback(self,mode):
  116. if self.__cb is not None and mode in self.modes:
  117. value = self.modes[mode]
  118. self.__cb(mode=mode,value=value)
  119. modes = Modes()
  120. #modes.val("BLIND", 0)
  121. #modes.modes["BLIND"] = 0
  122. modes.modes["ESC"] = 0
  123. modes.modes["REC"] = 0
  124. modes.modes["EDIT"] = 0
  125. modes.modes["MOVE"] = 0
  126. modes.modes["FLASH"] = 0
  127. modes.modes["GO"] = 0
  128. modes.modes["DEL"] = 0
  129. modes.modes["STONY_FX"] = 0
  130. modes.modes["SELECT"] = 0
  131. modes.modes["CFG-BTN"] = 0
  132. modes.modes["LABEL"] = 0
  133. def xcb(mode,value=None):
  134. print("xcb","MODE CALLBACK",mode,value)
  135. if mode == "STONY_FX":
  136. print("xcb",modes.val("STONY_FX"))
  137. #modes.set_cb(xcb)
  138. POS = ["PAN","TILT","MOTION"]
  139. COLOR = ["RED","GREEN","BLUE","COLOR"]
  140. BEAM = ["GOBO","G-ROT","PRISMA","P-ROT","FOCUS","SPEED"]
  141. INT = ["DIM","SHUTTER","STROBE","FUNC"]
  142. client = chat.tcp_sender(port=50001)
  143. jclient = chat.tcp_sender()#port=50001)
  144. def jclient_send(data):
  145. jclient.send("\00 "+ json.dumps(data) +"\00 ")
  146. class _FadeTime():
  147. def __init__(self):
  148. self._value = 2
  149. self._on = 1
  150. def inc(self,value=None):
  151. if value is not None:
  152. if type(value) is float:
  153. self._value += round(value,4)
  154. else:
  155. self._value += value
  156. return self._value
  157. def val(self,value=None):
  158. if value is not None:
  159. if type(value) is float:
  160. self._value = round(value,4)
  161. else:
  162. self._value = value
  163. return self._value
  164. def on(self):
  165. self._on = 1
  166. def off(self):
  167. self._on = 0
  168. def _is(self):
  169. if self._on:
  170. return 1
  171. return 0
  172. FADE = _FadeTime() #2 #0.1 #1.13
  173. fx_move_prm = {"SIZE":20,"SPEED":100,"OFFSET":50,"BASE":"-","START":0}
  174. fx_prm = {"SIZE":200,"SPEED":30,"OFFSET":255,"BASE":"-","START":0,"MODE":0,"MO":0,"DIR":1,"WING":2}
  175. fx_modes = [":RED",":GREEN",":BLUE",":MAG",":YELLOW",":CYAN"]
  176. fx_mo = ["sinus","on","on2","bump","bump2","fade","cosinus"]
  177. def build_cmd(dmx,val,args=[],flash=0,xpfx="",attr=""):
  178. if not args:
  179. args.append(FADE.val())
  180. cmd=""
  181. if xpfx:
  182. pfx=xpfx
  183. elif flash:
  184. pfx ="df"
  185. else:
  186. pfx ="d"
  187. if type(val) is float or type(val) is int:
  188. cmd += ",{}{}:{:0.4f}".format(pfx,dmx,val)
  189. else:
  190. cmd += ",{}{}:{}".format(pfx,dmx,val)
  191. if flash:
  192. cmd += ":0:0"#.format(val)
  193. else:
  194. for val in args:
  195. if type(val) is float or type(val) is int:
  196. cmd += ":{:0.4f}".format(val)
  197. else:
  198. cmd += ":{}".format(val)
  199. if attr:
  200. cmd += ":"+str(attr)
  201. cprint("build_cmd",cmd,color="red")
  202. return cmd
  203. def update_raw_dmx(data ,value=None,args=[],xfade=0,flash=0,pfx="d",fx=0):
  204. if flash:
  205. xfade = 0
  206. if not args: # and xfade is not None:# and FADE._is():
  207. args.append(xfade)
  208. else:
  209. args[0] = xfade
  210. cmd = []
  211. jcmd = []
  212. if flash:
  213. pfx += "f"
  214. for row in data:
  215. jxcmd={}
  216. if type(value) is float:
  217. jxcmd["VALUE"] = value #round(value,3)
  218. else:
  219. jxcmd["VALUE"] = value
  220. jxcmd["args"] = []
  221. if fx:
  222. if value is not None:
  223. # z.b. flush off
  224. xcmd = str(value)+":"+row["FX"].split(":",1)[-1]
  225. jxcmd["FX"] = row["FX"].split(":",1)[-1]
  226. else:
  227. xcmd = row["FX"]
  228. jxcmd["FX"] = row["FX"]
  229. else:
  230. if row["VALUE"] is None:
  231. xcmd = ""
  232. else:
  233. if value is not None:
  234. if type(value) is float:
  235. xcmd = "{:0.4f}".format(value)
  236. else:
  237. xcmd = "{}".format(value)
  238. else:
  239. v=row["VALUE"]
  240. xcmd = "{:0.4f}".format(v)
  241. cprint([v])
  242. if type(v) is float:
  243. jxcmd["VALUE"] = v #round(v,3)
  244. else:
  245. jxcmd["VALUE"] = v
  246. for arg in args:
  247. if type(arg) is float:
  248. xcmd += ":{:0.4f}".format(arg)
  249. jxcmd["args"].append(v)#round(arg,3))
  250. else:
  251. xcmd += ":{}".format(arg)
  252. jxcmd["args"].append(arg)#round(arg,3))
  253. #print( "pack: FIX",row["FIX"],row["ATTR"], xcmd)
  254. #xcmd += ":{}".format(row["ATTR"])
  255. v= xfade #FADE.val() #rxcmd["args"][0]
  256. if type( v ) is float:
  257. jxcmd["FADE"] = round(v,4)
  258. else:
  259. jxcmd["FADE"] = v
  260. #if ("VALUE" in jxcmd and jxcmd["VALUE"] is not None) or "FX" in jxcmd and jxcmd["FX"]:
  261. jcmd.append( jxcmd)
  262. cmd.append( xcmd)
  263. #if xcmd:
  264. # cprint("update_raw_dmx j",jxcmd,color="red")
  265. # cprint("update_raw_dmx x",xcmd,color="red")
  266. return cmd,jcmd
  267. def update_dmx(attr,data,value=None,args=None,flash=0,pfx=""):
  268. xfade = 0
  269. if not args:
  270. args=[]
  271. xfade = FADE.val()
  272. args.append(xfade)
  273. #global modes #BLIND
  274. #print("update_dmx",data)
  275. dmx = data["DMX"]
  276. dmx = (data["UNIVERS"]*512)+data["DMX"]
  277. val = None
  278. cmd=""
  279. try:
  280. if attr == "DIM" and data["ATTRIBUT"][attr]["NR"] < 0: #VDIM
  281. #print( "VDIM")
  282. for attr in data["ATTRIBUT"]:
  283. dmx = (data["UNIVERS"]*512) + data["DMX"]
  284. dmx = data["DMX"]
  285. if data["ATTRIBUT"][attr]["NR"] < 0: #virtual channels
  286. continue
  287. dmx += data["ATTRIBUT"][attr]["NR"]-1
  288. mode = ""
  289. if "MODE" in data["ATTRIBUT"][attr]:
  290. mode = data["ATTRIBUT"][attr]["MODE"]
  291. #print(attr)
  292. val = data["ATTRIBUT"][attr]["VALUE"]
  293. if data["ATTRIBUT"][attr]["MASTER"]:
  294. val = val * (data["ATTRIBUT"]["DIM"]["VALUE"] / 255.)
  295. if val is not None:
  296. #cmd += ",d{}:{:0.4f}".format(dmx,int(val))
  297. if value is not None:
  298. val = value
  299. if mode == "F": #FADE
  300. cmd += build_cmd(dmx,val,args=args,flash=flash,xpfx=pfx,attr=attr)
  301. else:
  302. cmd += build_cmd(dmx,val,args=[0],flash=flash,xpfx=pfx,attr=attr)
  303. #print("cmd",cmd)
  304. elif data["ATTRIBUT"][attr]["NR"] > 0:
  305. dmx += data["ATTRIBUT"][attr]["NR"]-1
  306. val = data["ATTRIBUT"][attr]["VALUE"]
  307. mode = ""
  308. if "MODE" in data["ATTRIBUT"][attr]:
  309. mode = data["ATTRIBUT"][attr]["MODE"]
  310. if data["ATTRIBUT"][attr]["MASTER"]:
  311. #if "VDIM" in data["ATTRIBUT"]:
  312. if "DIM" in data["ATTRIBUT"] and data["ATTRIBUT"]["DIM"]["NR"] < 0: #VDIM
  313. val = val * (data["ATTRIBUT"]["DIM"]["VALUE"] / 255.)
  314. if val is not None:
  315. #cmd += ",d{}:{}".format(dmx,int(val))
  316. if value is not None:
  317. val = value
  318. if mode == "F": #FADE
  319. cmd += build_cmd(dmx,val,args=args,flash=flash,xpfx=pfx,attr=attr)
  320. else:
  321. cmd += build_cmd(dmx,val,args=[0],flash=flash,xpfx=pfx,attr=attr)
  322. #print("cmd",cmd)
  323. if modes.val("BLIND"):
  324. cmd=""
  325. cprint("update_dmx",cmd,color="red")
  326. return cmd
  327. except Exception as e:
  328. cprint("== cb EXCEPT",e,color="red")
  329. cprint("Error on line {}".format(sys.exc_info()[-1].tb_lineno),color="red")
  330. cprint(''.join(traceback.format_exception(None, e, e.__traceback__)),color="red")
  331. raise e
  332. class dummy_event():
  333. def __init__(self):
  334. self.num =0
  335. self.type = 4 #press 5 release
  336. self.set_value=-1
  337. gcolor = 1
  338. def cprint(*text,color="blue",space=" ",end="\n"):
  339. #return 0 #disable print dbg
  340. if not gcolor:
  341. print(text)
  342. return 0
  343. if color == "green":
  344. txt = '\033[92m'
  345. elif color == "red":
  346. txt = '\033[0;31m\033[1m'
  347. elif color == "yellow":
  348. txt = '\033[93m\033[1m'
  349. elif color == "cyan":
  350. txt = '\033[96m'
  351. else:
  352. txt = '\033[94m'
  353. for t in text:
  354. txt += str(t ) +" "
  355. #HEADER = '\033[95m'
  356. #OKBLUE = '\033[94m'
  357. #OKCYAN = '\033[96m'
  358. #OKGREEN = '\033[92m'
  359. #WARNING = '\033[93m'
  360. #FAIL = '\033[91m'
  361. #ENDC = '\033[0m'
  362. #BOLD = '\033[1m'
  363. #UNDERLINE = '\033[4m'
  364. txt += '\033[0m'
  365. print(txt,end=end)
  366. #return txt
  367. cprint("________________________________")
  368. class Xevent():
  369. def __init__(self,fix,elem,attr=None,data=None,mode=None):
  370. self.fix = fix
  371. self.data=data
  372. self.attr = attr
  373. self.elem = elem
  374. self.mode = mode
  375. def fx(self,event):
  376. cprint("Xevent.fx",self.attr,self.fix,event)
  377. jdatas = []
  378. if event.num == 4:
  379. cprint("FX:COLOR CHANGE",fx_prm,color="red")
  380. txt = "FX:RED"
  381. fx_prm["MODE"] += 1
  382. if fx_prm["MODE"] > len(fx_modes):
  383. fx_prm["MODE"]=0
  384. txt = "FX:"+fx_modes[fx_prm["MODE"]]
  385. master.elem_fx_commands["FX:RED"]["text"] = txt
  386. elif event.num == 5:
  387. cprint("FX:COLOR CHANGE",fx_prm,color="red")
  388. txt = "FX:RED"
  389. fx_prm["MODE"] -= 1
  390. if fx_prm["MODE"] < 0:
  391. fx_prm["MODE"]= len(fx_modes)-1
  392. txt = "FX:"+fx_modes[fx_prm["MODE"]]
  393. master.elem_fx_commands["FX:RED"]["text"] = txt
  394. elif event.num == 1:
  395. cmd = ""
  396. offset = 0
  397. offset_flag=0
  398. start = fx_prm["START"]
  399. base = fx_prm["BASE"]
  400. #FIXTURES.start_fx(attr)
  401. xfixtures = []
  402. # WING's and BLOCK's
  403. for fix in FIXTURES.fixtures:
  404. xfixtures.append(fix)
  405. x=0
  406. if fx_prm["DIR"] < 0:
  407. xfixtures = xfixtures[::-1]
  408. x=-1
  409. wings = []
  410. if fx_prm["WING"]:
  411. l = len(xfixtures)
  412. w = l // fx_prm["WING"]
  413. teiler = l//w
  414. if teiler < 2:
  415. teiler = 2
  416. for i in range(teiler):
  417. j = i*w
  418. wing = xfixtures[j:j+w]
  419. if i%2==0:
  420. wing = wing[::-1]
  421. print("wing",i,"j",j,"w",w,"wing",wing)
  422. wings.append(wing)
  423. if l > j+w:
  424. wing = xfixtures[j+w:]
  425. wings.append(wing)
  426. else:
  427. wings.append(xfixtures)
  428. print("FX442 ",xfixtures)
  429. print("FX442 ",fx_prm,x)
  430. for wing in wings:
  431. coffset= offset
  432. for fix in wing:
  433. data = FIXTURES.fixtures[fix]
  434. #print( "ADD FX",fix)
  435. for attr in data["ATTRIBUT"]:
  436. jdata = {"MODE":"FX"}
  437. jdata["FIX"] = fix
  438. jdata["DMX"] = FIXTURES.get_dmx(fix,attr)
  439. jdata["ATTR"] =attr
  440. if attr.endswith("-FINE"):
  441. continue
  442. csize = fx_prm["SIZE"]
  443. cspeed = fx_prm["SPEED"]
  444. cstart = fx_prm["START"]
  445. cbase = fx_prm["BASE"]
  446. #cstart = start
  447. coffset= offset
  448. #cbase = base
  449. fx=""
  450. if "SIN" in self.attr:
  451. fx = "sinus"
  452. elif "FD" in self.attr:
  453. fx = "fade"
  454. elif "ON2" in self.attr:
  455. fx = "on2"
  456. elif "ON" in self.attr:
  457. fx = "on"
  458. elif "BUM2" in self.attr:
  459. fx = "bump2"
  460. elif "BUM" in self.attr:
  461. fx = "bump"
  462. elif "COS" in self.attr:
  463. fx = "cosinus"
  464. if fx:
  465. if fx_prm["SPEED"] < 0.1:
  466. fx = "off"
  467. else:
  468. if ":DIM" in self.attr:
  469. base=""
  470. ffxb= fx_mo[fx_prm["MO"]]
  471. if attr == "DIM":
  472. if fx_prm["SPEED"] < 0.1:
  473. fx = "off"
  474. else:
  475. fx = ffxb #"fade"
  476. elif ":TILT" in self.attr:
  477. base=""
  478. if attr == "PAN":
  479. fx = "off"
  480. if attr == "TILT":
  481. if fx_prm["SPEED"] < 0.1:
  482. fx = "off"
  483. else:
  484. fx = "sinus"
  485. elif ":PAN" in self.attr:
  486. base=""
  487. if attr == "PAN":
  488. if fx_prm["SPEED"] < 0.1:
  489. fx = "off"
  490. else:
  491. fx = "cosinus"
  492. if attr == "TILT":
  493. fx = "off"
  494. elif ":CIR" in self.attr:
  495. base=""
  496. if attr == "PAN":
  497. if fx_prm["SPEED"] < 0.1:
  498. fx = "off"
  499. else:
  500. fx = "cosinus"
  501. if attr == "TILT":
  502. if fx_prm["SPEED"] < 0.1:
  503. fx = "off"
  504. else:
  505. fx = "sinus"
  506. elif ":RED" in self.attr:
  507. ffxb= fx_mo[fx_prm["MO"]]
  508. ffx= "off" #fx_mo[fx_prm["MO"]]
  509. if ":RED" in fx_modes[fx_prm["MODE"]]:#
  510. base="-"
  511. if attr == "RED":
  512. #coffset=0
  513. #cspeed=0
  514. fx=ffx
  515. if attr == "GREEN":
  516. fx = ffxb# "off"
  517. if attr == "BLUE":
  518. fx = ffxb#"off"
  519. elif ":GREEN" in fx_modes[fx_prm["MODE"]]:#fx_prm["MODE"]:#in self.attr:
  520. base="-"
  521. if attr == "RED":
  522. fx = ffxb#"off"
  523. elif ":GREEN" in fx_modes[fx_prm["MODE"]]:#fx_prm["MODE"]:#in self.attr:
  524. if attr == "GREEN":
  525. fx = ffxb# "off"
  526. #cspeed=0
  527. #coffset=0
  528. fx=ffx
  529. if attr == "BLUE":
  530. fx = ffxb#"off"
  531. elif ":BLUE" in fx_modes[fx_prm["MODE"]]:#fx_prm["MODE"]:#self.attr:
  532. base="-"
  533. if attr == "RED":
  534. fx = ffxb# "off"
  535. if attr == "GREEN":
  536. fx = ffxb# "off"
  537. if attr == "BLUE":
  538. fx = ffxb# "off"
  539. #cspeed=0
  540. #coffset=0
  541. fx=ffx
  542. elif ":YELLOW" in fx_modes[fx_prm["MODE"]]:#fx_prm["MODE"]:#self.attr:
  543. base="-"
  544. if attr == "RED":
  545. fx = ffxb# "off"
  546. #cspeed=0
  547. #coffset=0
  548. fx=ffx
  549. if attr == "GREEN":
  550. fx = ffxb# "off"
  551. #cspeed=0
  552. #coffset=0
  553. fx=ffx
  554. if attr == "BLUE":
  555. fx = "off"
  556. elif ":CYAN" in fx_modes[fx_prm["MODE"]]:#fx_prm["MODE"]:#self.attr:
  557. base="-"
  558. if attr == "RED":
  559. fx = ffxb# "off"
  560. if attr == "GREEN":
  561. fx = ffxb# "off"
  562. #cspeed=0
  563. #coffset=0
  564. fx=ffx
  565. if attr == "BLUE":
  566. fx = ffxb# "off"
  567. #cspeed=0
  568. #coffset=0
  569. fx=ffx
  570. elif ":MAG" in fx_modes[fx_prm["MODE"]]:#fx_prm["MODE"]:#self.attr:
  571. base="-"
  572. if attr == "RED":
  573. fx = ffxb# "off"
  574. fx=ffx
  575. #cspeed=0
  576. #coffset=0
  577. if attr == "GREEN":
  578. fx = ffxb# "off"
  579. if attr == "BLUE":
  580. fx = ffxb# "off"
  581. fx=ffx
  582. #cspeed=0
  583. #coffset=0
  584. else:
  585. cprint("FX: unbekant",fx_modes[fx_prm["MODE"]],color="red")
  586. jdata["TYPE"] = fx
  587. jdata["OFFSET"]= coffset
  588. jdata["SPEED"] = cspeed
  589. jdata["START"] = cstart
  590. jdata["BASE"] = cbase
  591. if fx:
  592. print(jdata)
  593. jdatas.append(jdata)
  594. if fx:
  595. #fx += ":{:0.0f}:{:0.0f}:{:0.0f}:{:0.0f}:{}:".format(fx_prm["SIZE"],fx_prm["SPEED"],start,offset,base)
  596. fx += ":{:0.0f}:{:0.0f}:{:0.0f}:{:0.0f}:{}:".format(csize,cspeed,cstart,coffset,cbase)
  597. offset_flag=1
  598. #print("ADD FX",fix,attr,fx,data["ATTRIBUT"][attr]["ACTIVE"])
  599. if "FX" not in data["ATTRIBUT"][attr]:
  600. data["ATTRIBUT"][attr]["FX"] =""
  601. if data["ATTRIBUT"][attr]["ACTIVE"] and fx:
  602. print("++ADD FX",fix,attr,fx)
  603. data["ATTRIBUT"][attr]["FX"] = fx #"sinus:40:100:10"
  604. cmd+=update_dmx(attr,data,pfx="fx",value=fx)#,flash=FLASH)
  605. if fx_prm["OFFSET"] > 0.5 and offset_flag:
  606. offset_flag=0
  607. offset += fx_prm["OFFSET"] # add offset on next fixture
  608. #print("offset",offset)
  609. if cmd and not modes.val("BLIND"):
  610. client.send(cmd)
  611. jclient_send(jdatas)
  612. master.refresh_fix()
  613. def command(self,event):
  614. if self.mode == "COMMAND":
  615. if self.attr == "CLEAR":
  616. if event.num == 1:
  617. ok = FIXTURES.clear()
  618. if ok:
  619. master.refresh_fix()
  620. modes.val(self.attr,0)
  621. elif self.attr.startswith("SZ:"):#SIN":
  622. #global fx_prm
  623. k = "SIZE"
  624. if event.num == 1:
  625. pass
  626. elif event.num == 2:
  627. pass
  628. elif event.num == 4:
  629. if fx_prm[k] <= 0:
  630. fx_prm[k] = 1
  631. fx_prm[k] *=1.2
  632. elif event.num == 5:
  633. fx_prm[k] /=1.2
  634. #fx_prm[k] =int(fx_prm[k])
  635. if fx_prm[k] > 4000:
  636. fx_prm[k] = 4000
  637. if fx_prm[k] < 0:
  638. fx_prm[k] =0
  639. self.data.elem_fx_commands[self.attr]["text"] = "SZ:{:0.0f}".format(fx_prm[k])
  640. elif self.attr.startswith("SP:"):#SIN":
  641. #global fx_prm
  642. k = "SPEED"
  643. if event.num == 1:
  644. pass
  645. elif event.num == 2:
  646. pass
  647. elif event.num == 4:
  648. if fx_prm[k] <= 0:
  649. fx_prm[k] = 1
  650. fx_prm[k] *=1.2
  651. elif event.num == 5:
  652. fx_prm[k] /=1.2
  653. #fx_prm[k] =int(fx_prm[k])
  654. if fx_prm[k] > 4000:
  655. fx_prm[k] = 4000
  656. if fx_prm[k] < 0:
  657. fx_prm[k] =0
  658. if fx_prm[k] < 0.1:
  659. self.data.elem_fx_commands[self.attr]["text"] = "SP:off".format(fx_prm[k])
  660. else:
  661. self.data.elem_fx_commands[self.attr]["text"] = "SP:{:0.0f}".format(fx_prm[k])
  662. elif self.attr.startswith("ST:"):#SIN":
  663. #global fx_prm
  664. k = "START"
  665. if event.num == 1:
  666. pass
  667. elif event.num == 2:
  668. pass
  669. elif event.num == 4:
  670. if fx_prm[k] <= 0:
  671. fx_prm[k] = 1
  672. fx_prm[k] *=1.2
  673. elif event.num == 5:
  674. fx_prm[k] /=1.2
  675. #fx_prm[k] =int(fx_prm[k])
  676. if fx_prm[k] > 4000:
  677. fx_prm[k] = 4000
  678. if fx_prm[k] < 0:
  679. fx_prm[k] =0
  680. self.data.elem_fx_commands[self.attr]["text"] = "ST:{:0.0f}".format(fx_prm[k])
  681. elif self.attr.startswith("MO:"):# on,sinus,bump
  682. #global fx_prm
  683. k = "MO"
  684. if event.num == 1:
  685. pass
  686. elif event.num == 2:
  687. pass
  688. elif event.num == 4:
  689. fx_prm[k] -=1
  690. if fx_prm[k] < 0:
  691. fx_prm[k] = len(fx_mo)-1
  692. elif event.num == 5:
  693. fx_prm[k] +=1
  694. if fx_prm[k] >= len(fx_mo):
  695. fx_prm[k] = 0
  696. txt = fx_mo[fx_prm[k]]
  697. self.data.elem_fx_commands[self.attr]["text"] = "MO:{}".format(txt)
  698. elif self.attr.startswith("DIR:"):#SIN":
  699. #global fx_prm
  700. k = "DIR"
  701. if event.num == 1:
  702. pass
  703. elif event.num == 2:
  704. pass
  705. elif event.num == 4:
  706. fx_prm[k] = 1
  707. elif event.num == 5:
  708. fx_prm[k] =-1
  709. txt = fx_prm[k]
  710. self.data.elem_fx_commands[self.attr]["text"] = "DIR:{}".format(fx_prm[k])
  711. elif self.attr.startswith("WING:"):#SIN":
  712. #global fx_prm
  713. k = "WING"
  714. if event.num == 1:
  715. pass
  716. elif event.num == 2:
  717. pass
  718. elif event.num == 4:
  719. fx_prm[k] += 1
  720. elif event.num == 5:
  721. fx_prm[k] -=1
  722. if fx_prm[k] > 10:
  723. fx_prm[k] = 10
  724. if fx_prm[k] < 0:
  725. fx_prm[k] =0
  726. txt = fx_prm[k]
  727. self.data.elem_fx_commands[self.attr]["text"] = "WING:{}".format(fx_prm[k])
  728. elif self.attr.startswith("OF:"):#SIN":
  729. #global fx_prm
  730. k = "OFFSET"
  731. if event.num == 1:
  732. pass
  733. elif event.num == 2:
  734. pass
  735. elif event.num == 4:
  736. if fx_prm[k] <= 0:
  737. fx_prm[k] = 1
  738. fx_prm[k] *=1.2
  739. elif event.num == 5:
  740. fx_prm[k] /=1.2
  741. #fx_prm[k] =int(fx_prm[k])
  742. if fx_prm[k] > 1024:
  743. fx_prm[k] = 1024
  744. if fx_prm[k] < 0:
  745. fx_prm[k] =0
  746. self.data.elem_fx_commands[self.attr]["text"] = "OF:{:0.0f}".format(fx_prm[k])
  747. elif self.attr.startswith("BS:"):
  748. k = "BASE"
  749. if event.num == 1:
  750. fx_prm[k] = "0"
  751. elif event.num == 2:
  752. pass
  753. elif event.num == 4:
  754. fx_prm[k] = "+"
  755. elif event.num == 5:
  756. fx_prm[k] = "-"
  757. self.data.elem_fx_commands[self.attr]["text"] = "BS:{}".format(fx_prm[k])
  758. elif self.attr.startswith("FX:"):#SIN":
  759. self.fx(event)
  760. elif self.attr == "FX OFF":
  761. if event.num == 1:
  762. FIXTURES.fx_off("all")
  763. CONSOLE.fx_off("all")
  764. CONSOLE.flash_off("all")
  765. master.refresh_fix()
  766. return 0
  767. elif self.attr == "FADE":
  768. fade = FADE.val()
  769. print("EVENT CHANGE FADE",fade)
  770. if fade < 0.01:
  771. FADE.val(0.01)
  772. elif fade > 100.0:
  773. fade = 100
  774. if event.num == 4:
  775. fade *= 1.1
  776. elif event.num == 5:
  777. fade /= 1.1
  778. elif event.num == 1:
  779. if FADE._is():
  780. FADE.off()# = 0
  781. self.data.elem_commands[self.attr]["bg"] = "grey"
  782. else:
  783. FADE.on()# = 1
  784. self.data.elem_commands[self.attr]["bg"] = "green"
  785. elif event.num == 2:
  786. if fade > 1 and fade < 4:
  787. fade = 4
  788. elif fade > 3 and fade < 6:
  789. fade = 6
  790. elif fade > 5 and fade < 7:
  791. fade = 8
  792. elif fade > 7 and fade < 9:
  793. fade = 10
  794. elif fade > 9:
  795. fade = 0.01
  796. elif fade < 1:
  797. fade = 1.1
  798. fade = round(fade,3)
  799. FADE.val(fade)
  800. self.data.elem_commands[self.attr]["text"] = "Fade{:0.2f}".format(fade)
  801. elif self.attr == "BACKUP":
  802. modes.val(self.attr,1)
  803. PRESETS.backup_presets()
  804. FIXTURES.backup_patch()
  805. #time.sleep(1)
  806. modes.val(self.attr,0)
  807. else:
  808. if event.num == 1:
  809. print("ELSE",self.attr)
  810. modes.val(self.attr,1)
  811. return 0
  812. def cb(self,event):
  813. cprint("EVENT cb",self.attr,self.mode,event,color='yellow')
  814. print(["type",event.type,"num",event.num])
  815. try:
  816. change = 0
  817. if "keysym" in dir(event):
  818. if "Escape" == event.keysym:
  819. ok = FIXTURES.clear()
  820. master.refresh_fix()
  821. return 0
  822. if self.mode == "COMMAND":
  823. self.command(event)
  824. elif self.mode == "ROOT":
  825. if event.keysym=="Escape":
  826. pass
  827. elif self.mode == "INPUT":
  828. print("INP",self.data.entry.get())
  829. if event.keycode == 36:
  830. x=self.data.entry.get()
  831. client.send(x)
  832. elif self.mode == "INPUT2":
  833. print("INP2",self.data.entry2.get())
  834. if event.keycode == 36:
  835. x=self.data.entry2.get()
  836. client.send(x)
  837. elif self.mode == "INPUT3":
  838. print("INP3",self.data.entry3.get())
  839. if event.keycode == 36:
  840. x=self.data.entry3.get()
  841. client.send(x)
  842. elif self.mode == "PRESET":
  843. nr = self.attr #int(self.attr.split(":")[1])-1
  844. if event.num == 1:
  845. if str(event.type) == '4': #4 ButtonPress
  846. if modes.val("REC"):
  847. self.data.preset_rec(nr)
  848. modes.val("REC",0)
  849. elif modes.val("DEL"):
  850. ok=PRESETS.delete(nr)
  851. if ok:
  852. modes.val("DEL",0)
  853. master.refresh_exec()
  854. elif modes.val("COPY"):
  855. ok=PRESETS.copy(nr)
  856. if ok:
  857. modes.val("COPY",0)
  858. master.refresh_exec()
  859. elif modes.val("MOVE"):
  860. ok=PRESETS.move(nr)
  861. if ok:
  862. modes.val("MOVE",0)
  863. master.refresh_exec()
  864. elif modes.val("CFG-BTN"):
  865. master.btn_cfg(nr)
  866. elif modes.val("LABEL"):#else:
  867. master.label(nr)
  868. elif modes.val("EDIT"):
  869. FIXTURES.clear()
  870. self.data.preset_select(nr)
  871. self.data.preset_go(nr,xfade=0,event=event,val=255)
  872. modes.val("EDIT", 0)
  873. master.refresh_fix()
  874. elif modes.val("SELECT"):
  875. self.data.preset_select(nr)
  876. else:
  877. self.data.preset_go(nr,event=event,val=255)
  878. else:
  879. self.data.preset_go(nr,xfade=0,event=event,val=0)
  880. if event.num == 3:
  881. if not modes.val("REC"):
  882. self.data.preset_go(nr,xfade=0,event=event,val=255)
  883. return 0
  884. elif self.mode == "INPUT":
  885. return 0
  886. if self.mode == "ENCODER":
  887. cprint("ENC",self.fix,self.attr,self.mode)
  888. cprint(self.data)
  889. val=""
  890. if event.num == 1:
  891. val ="click"
  892. elif event.num == 4:
  893. val ="+"
  894. elif event.num == 5:
  895. val ="-"
  896. if val:
  897. FIXTURES.encoder(fix=self.fix,attr=self.attr,xval=val)
  898. master.refresh_fix()
  899. except Exception as e:
  900. cprint("== cb EXCEPT",e,color="red")
  901. cprint("Error on line {}".format(sys.exc_info()[-1].tb_lineno),color="red")
  902. cprint(''.join(traceback.format_exception(None, e, e.__traceback__)),color="red")
  903. def wheel(event,d=None):
  904. print("wheel",event,d)
  905. import copy
  906. class Element():
  907. def __init__(self):
  908. self.__data = {}
  909. def set(self,key,val):
  910. self.__data[key] = val
  911. class Base():
  912. def __init__(self):
  913. show_name = "GloryCamp2021"
  914. #show_name = "JMS"
  915. #show_name = "Dimmer"
  916. show_name = "DemoShow"
  917. self.home = os.environ['HOME']
  918. self.show_path = self.home +"/LibreLight/"
  919. if not os.path.isdir(self.show_path):
  920. os.mkdir(self.show_path)
  921. self.show_path += "/show/"
  922. if not os.path.isdir(self.show_path):
  923. os.mkdir(self.show_path)
  924. self.show_path += "/" +show_name +"/"
  925. if not os.path.isdir(self.show_path):
  926. os.mkdir(self.show_path)
  927. pass
  928. def _load(self,filename):
  929. xfname = self.show_path+"/"+str(filename)+".sav"
  930. print("load",xfname)
  931. f = open(xfname,"r")
  932. lines = f.readlines()
  933. f.close()
  934. data = OrderedDict()
  935. labels = OrderedDict()
  936. for line in lines:
  937. key,label,rdata = line.split("\t",2)
  938. key = int(key)
  939. #print(xfname,"load",key,label)
  940. #print(line)
  941. jdata = json.loads(rdata,object_pairs_hook=OrderedDict)
  942. nrnull = 0
  943. print(jdata)
  944. #if "ATTRIBUT" in jdata: # translate old FIXTURES.fixtures start with 0 to 1
  945. # for attr in jdata["ATTRIBUT"]:
  946. # row = jdata["ATTRIBUT"][attr]
  947. # if type(row) is OrderedDict:
  948. # #print(row)
  949. # if "VALUE" in row:
  950. # v = row["VALUE"]
  951. # if type(v) is float:
  952. # v = round(v,4)
  953. # jdata["ATTRIBUT"][attr]["VALUE"] = round(v,4)
  954. # print("preset v",key,label,attr,v)
  955. if "ATTRIBUT" in jdata: # translate old FIXTURES.fixtures start with 0 to 1
  956. for attr in jdata["ATTRIBUT"]:
  957. pass
  958. #if "VALUE" in jdata["ATTRIBUT"][attr]:
  959. # v = jdata["ATTRIBUT"][attr]["VALUE"]
  960. # if type(v) is float:
  961. # jdata["ATTRIBUT"][attr]["VALUE"] = round(v,4)
  962. # #print("fix v",attr,v)
  963. #if "NR" in jdata["ATTRIBUT"][attr]:
  964. # nr = jdata["ATTRIBUT"][attr]["NR"]
  965. # if nr == 0:
  966. # nrnull = 1
  967. # break
  968. if nrnull:
  969. print("DMX NR IS NULL",attr,"CHANGE +1")
  970. for attr in jdata["ATTRIBUT"]:
  971. if "NR" in jdata["ATTRIBUT"][attr]:
  972. nr = jdata["ATTRIBUT"][attr]["NR"]
  973. if nr >= 0:
  974. jdata["ATTRIBUT"][attr]["NR"] +=1
  975. data[key] = jdata
  976. labels[key] = label
  977. return data,labels
  978. def _backup(self,filename,data,labels):
  979. #fixture
  980. #xfname = "show/"+show_name+"/"+str(filename)+".sav"
  981. xfname = self.show_path+"/"+str(filename)+".sav"
  982. print("backup",xfname)
  983. f = open(xfname,"w")
  984. for key in data:
  985. line = data[key]
  986. #print(line)
  987. label = "label"
  988. if key in labels:
  989. label = labels[key]
  990. if label == "Name-"+str(key):
  991. label = ""
  992. #print(xfname,"load",key,label,len(line))
  993. f.write( "{}\t{}\t{}\n".format( key,label,json.dumps(line) ) )
  994. f.close()
  995. class Event():
  996. def __init__(self,name):
  997. self.name=name
  998. #print("init",self)
  999. def event(self,event):
  1000. print(self.name,event)
  1001. class scroll():
  1002. def __init__(self,canvas):
  1003. self.canvas=canvas
  1004. def config(self,event):
  1005. canvas = self.canvas
  1006. canvas.configure(scrollregion=canvas.bbox("all"))#,width=400,height=200)
  1007. def hex_to_rgb(hex):
  1008. return tuple(int(hex[i:i+2], 16) for i in (0, 2, 4))
  1009. class cb():
  1010. def __init__(self,win):
  1011. self.win = win
  1012. def _callback(self,event):
  1013. clobj=event.widget
  1014. ## undermouse=find_withtag(master.CURRENT)
  1015. undermouse=self.win.find_closest(self.win.CURRENT)
  1016. print( repr(undermouse))
  1017. def callback(self,event):
  1018. print(__file__,self,"callback",event)
  1019. cnv = self.win
  1020. item = cnv.find_closest(cnv.canvasx(event.x), cnv.canvasy(event.y))[0]
  1021. tags = cnv.gettags(item)
  1022. #cnv.itemconfigure(self.tag, text=tags[0])
  1023. print(tags,item)
  1024. color = cnv.itemcget(item, "fill")
  1025. cnv.itemconfig("all", width=1)#filla="green")
  1026. cnv.itemconfig(item, width=3)#filla="green")
  1027. print(color)
  1028. print( hex_to_rgb(color[1:]))
  1029. class GUI(Base):
  1030. def __init__(self):
  1031. super().__init__()
  1032. self.load()
  1033. self._XX = 0
  1034. self.all_attr =["DIM","PAN","TILT"]
  1035. self.elem_attr = {}
  1036. self.fx_commands =["STONY_FX","FX OFF","\n"
  1037. ,"FX:CIR","FX:PAN","FX:TILT","\n"
  1038. ,"MSZ:","MSP:","MST:","MOF:","MBS:-","\n"
  1039. ,"FX:DIM","FX:RED", "MO:on","DIR:1","WING:0","\n"
  1040. ,"SZ:","SP:","ST:","OF:","BS:-","\n"
  1041. , "FX:SIN","FX:COS","FX:BUM","FX:BUM2","FX:FD","FX:ON","FX:ON2" ]
  1042. self.commands =["\n","ESC","CFG-BTN","LABEL","BACKUP","DEL","\n"
  1043. ,"SELECT","FLASH","GO","FADE","MOVE","\n"
  1044. ,"BLIND","CLEAR","REC","EDIT","COPY","\n"
  1045. ]
  1046. self.elem_fx_commands = {}
  1047. self.val_fx_commands = {}
  1048. self.elem_commands = {}
  1049. self.val_commands = {}
  1050. self.elem_presets = {}
  1051. for i in range(8*8*8):
  1052. if i not in PRESETS.val_presets:
  1053. name = "Preset:"+str(i+1)+":\nXYZ"
  1054. #self.presets[i] = [i]
  1055. PRESETS.val_presets[i] = OrderedDict() # FIX
  1056. PRESETS.val_presets[i]["CFG"] = OrderedDict() # CONFIG
  1057. PRESETS.label_presets[i] = "-"
  1058. modes.set_cb(self.xcb)
  1059. def button_refresh(self,name,color,color2=None,fg=None):
  1060. cprint("button_refresh",name,color)
  1061. #if color == "gold":
  1062. # color2 = "yellow"
  1063. if color2 is None:
  1064. color2 = color
  1065. if name in self.elem_commands:
  1066. self.elem_commands[name]["bg"] = color
  1067. self.elem_commands[name].config(activebackground=color2)
  1068. if fg:
  1069. self.elem_commands[name]["fg"] = fg
  1070. print(dir(self.elem_commands[name]))
  1071. elif name in self.elem_fx_commands:
  1072. #todo
  1073. self.elem_fx_commands[name]["bg"] = color
  1074. self.elem_fx_commands[name].config(activebackground=color2)
  1075. if fg:
  1076. self.elem_fx_commands[name]["fg"] = fg
  1077. print(dir(self.elem_fx_commands[name]))
  1078. def btn_cfg(self,nr):
  1079. txt = PRESETS.btn_cfg(nr)
  1080. txt = tkinter.simpledialog.askstring("CFG-BTN","GO=GO\nFL=FLASH\nSEL=SELECT\n EXE:"+str(nr+1),initialvalue=txt)
  1081. if txt:
  1082. PRESETS.btn_cfg(nr,txt)
  1083. self.elem_presets[nr]["text"] = PRESETS.get_btn_txt(nr)
  1084. modes.val("CFG-BTN",0)
  1085. def label(self,nr):
  1086. txt = PRESETS.label(nr)
  1087. txt = tkinter.simpledialog.askstring("LABEL","EXE:"+str(nr+1),initialvalue=txt)
  1088. if txt:
  1089. PRESETS.label(nr,txt)
  1090. self.elem_presets[nr]["text"] = PRESETS.get_btn_txt(nr)
  1091. modes.val("LABEL", 0)
  1092. def xcb(self,mode,value=None):
  1093. cprint("MODE CALLBACK",mode,value,color="green",end="")
  1094. #cprint(self,"xcb","MODE CALLBACK",mode,value,color="green")
  1095. if value:
  1096. cprint("===== ON ======",color="red")
  1097. self.button_refresh(mode,color="red")#,fg="blue")
  1098. else:
  1099. cprint("===== OFF ======",color="red")
  1100. self.button_refresh(mode,color="lightgrey")#,fg="black")
  1101. def load(self,fname=""):
  1102. pass
  1103. def exit(self):
  1104. print("__del__",self)
  1105. PRESETS.backup_presets()
  1106. #print("********************************************************")
  1107. FIXTURES.backup_patch()
  1108. #print("*********del",self,"***********************************************")
  1109. def refresh_exec(self):
  1110. cprint("PRESET.refresh_exec()")
  1111. self._XX +=1
  1112. for k in PRESETS.val_presets:
  1113. label = ""
  1114. if k not in self.elem_presets:
  1115. cprint("ERROR",k ,"not in elem_presets continue")
  1116. continue
  1117. if k in PRESETS.label_presets:
  1118. label = PRESETS.label_presets[k]
  1119. #print([label])
  1120. b = self.elem_presets[k]
  1121. if k in PRESETS.val_presets and len(PRESETS.val_presets[k]) :
  1122. sdata = PRESETS.val_presets[k]
  1123. #print("sdata7654",sdata)
  1124. BTN="go"
  1125. if "CFG" in sdata:#["BUTTON"] = "GO"
  1126. if "BUTTON" in sdata["CFG"]:
  1127. BTN = sdata["CFG"]["BUTTON"]
  1128. txt=str(k)+":"+str(BTN)+":"+str(len(sdata)-1)+"\n"+label
  1129. #txt+=str(self._XX)
  1130. b["text"] = txt
  1131. b["bg"] = "yellow"
  1132. b.config(activebackground="yellow")
  1133. if len(sdata) > 1:
  1134. fx_color = 0
  1135. val_color = 0
  1136. for fix in sdata:
  1137. if fix == "CFG":
  1138. continue
  1139. #print( "$$$$",fix,sdata[fix])
  1140. for attr in sdata[fix]:
  1141. if "FX" in sdata[fix][attr]:
  1142. if sdata[fix][attr]["FX"]:
  1143. fx_color = 1
  1144. if "VALUE" in sdata[fix][attr]:
  1145. if sdata[fix][attr]["VALUE"] is not None:
  1146. val_color = 1
  1147. b["fg"] = "black"
  1148. if val_color:
  1149. b["bg"] = "gold"
  1150. b.config(activebackground="#ffaa55")
  1151. if fx_color:
  1152. b["fg"] = "blue"
  1153. else:
  1154. if fx_color:
  1155. b["bg"] = "cyan"
  1156. b.config(activebackground="#55d4ff")
  1157. else:
  1158. b["bg"] = "grey"
  1159. b.config(activebackground="#aaaaaa")
  1160. if "\n" in txt:
  1161. txt = txt.split("\n")[0]
  1162. if "SEL" in txt:
  1163. b["fg"] = "black"
  1164. b["bg"] = "#5555ff"
  1165. b.config(activebackground="#6666ff")
  1166. elif "GO" in txt:
  1167. b["fg"] = "black"
  1168. elif "FL" in txt:
  1169. b["fg"] = "#7f00ff"
  1170. def refresh_fix(self):
  1171. for fix in FIXTURES.fixtures:
  1172. sdata = FIXTURES.fixtures[fix]
  1173. for attr in sdata["ATTRIBUT"]:
  1174. if "FINE" in attr:
  1175. continue
  1176. v2 = sdata["ATTRIBUT"][attr]["VALUE"]
  1177. if fix in self.elem_attr:
  1178. elem = self.elem_attr[fix][attr]
  1179. #print( attr,v2)
  1180. elem["text"] = "{} {:0.2f}".format(attr,v2)
  1181. if sdata["ATTRIBUT"][attr]["ACTIVE"]:
  1182. elem["bg"] = "yellow"
  1183. elem.config(activebackground="yellow")
  1184. else:
  1185. elem["bg"] = "grey"
  1186. elem.config(activebackground="grey")
  1187. if sdata["ATTRIBUT"][attr]["FX"]:
  1188. elem["fg"] = "blue"
  1189. else:
  1190. elem["fg"] = "black"
  1191. def preset_rec(self,nr):
  1192. print("------- STORE PRESET")
  1193. data = FIXTURES.get_active()
  1194. if modes.val("STONY_FX"):
  1195. PRESETS.rec(nr,data,"STONY_FX")
  1196. modes.val("STONY_FX",0)
  1197. else:
  1198. PRESETS.rec(nr,data)
  1199. sdata=data
  1200. PRESETS.val_presets[nr] = sdata
  1201. master.refresh_exec()
  1202. return 1
  1203. def preset_select(self,nr):
  1204. print("SELECT PRESET")
  1205. sdata = PRESETS.val_presets[nr]
  1206. cmd = ""
  1207. for fix in sdata:
  1208. if fix == "CFG":
  1209. continue
  1210. for attr in sdata[fix]:
  1211. v2 = sdata[fix][attr]["VALUE"]
  1212. v2_fx = sdata[fix][attr]["FX"]
  1213. #print( self.data.elem_attr)
  1214. if fix in self.elem_attr:
  1215. elem = self.elem_attr[fix][attr]
  1216. FIXTURES.fixtures[fix]["ATTRIBUT"][attr]["ACTIVE"] = 1
  1217. elem["bg"] = "yellow"
  1218. def preset_go(self,nr,val=None,xfade=None,event=None):
  1219. if xfade is None and FADE._is():
  1220. xfade = FADE.val()
  1221. print("GO PRESET FADE",nr,val)
  1222. rdata = PRESETS.get_raw_map(nr)
  1223. if not rdata:
  1224. return 0
  1225. print("???????")
  1226. cfg = PRESETS.get_cfg(nr)
  1227. print("''''''''")
  1228. #virtcmd = FIXTURES.get_virtual(rdata)
  1229. if not cfg:
  1230. cprint("NO CFG",cfg,nr)
  1231. return 0
  1232. xFLASH = 0
  1233. value=None
  1234. cprint("preset_go",nr,cfg)
  1235. if modes.val("SELECT") or ( "BUTTON" in cfg and cfg["BUTTON"] == "SEL") and val: #FLASH
  1236. self.preset_select(nr)
  1237. elif modes.val("FLASH") or ( "BUTTON" in cfg and cfg["BUTTON"] == "FL"): #FLASH
  1238. xFLASH = 1
  1239. xfade = 0
  1240. if type(val) is not None and val == 0 :
  1241. value = "off"
  1242. if event:
  1243. if str(event.type) == "ButtonRelease" or event.type == '5' :
  1244. # 4 fix vor ThinkPad / Debian 11
  1245. if xFLASH:
  1246. value = "off"
  1247. cprint("preset_go() FLUSH",value,color="red")
  1248. fcmd = FIXTURES.update_raw(rdata,update=0)
  1249. self._preset_go(rdata,cfg,fcmd,value,xfade=xfade,xFLASH=xFLASH)
  1250. elif not val:
  1251. cprint("preset_go() STOP",value,color="red")
  1252. elif modes.val("GO") or ( "BUTTON" in cfg and cfg["BUTTON"] in ["go","GO"]):
  1253. fcmd = FIXTURES.update_raw(rdata)
  1254. self._preset_go(rdata,cfg,fcmd,value,xfade=xfade,xFLASH=xFLASH)
  1255. if not (modes.val("FLASH") or ( "BUTTON" in cfg and cfg["BUTTON"] == "FL")): #FLASH
  1256. self.refresh_exec()
  1257. self.refresh_fix()
  1258. else:
  1259. self.refresh_exec()
  1260. self.refresh_fix()
  1261. def _preset_go(self,rdata,cfg,fcmd,value,xfade=None,event=None,xFLASH=0):
  1262. if xfade is None and FADE._is():
  1263. xfade = FADE.val()
  1264. cprint("PRESETS._preset_go()",len(rdata))
  1265. vvcmd,jvvcmd = update_raw_dmx( rdata ,value,[],xfade=xfade )
  1266. fxcmd,jfxcmd = update_raw_dmx( rdata ,value,[],xfade=xfade,fx=1)
  1267. cmd = []
  1268. for vcmd,d in [[jvvcmd,"d"],[jfxcmd,"fx"]]:
  1269. #cprint(vcmd)
  1270. if xFLASH:
  1271. d+="f"
  1272. for i,v in enumerate(fcmd):
  1273. if xFLASH:
  1274. vcmd[i]["FLASH"] = 1
  1275. #print(i)
  1276. #print(fcmd)
  1277. DMX = fcmd[i]["DMX"]
  1278. if "VALUE" in vcmd[i] and type(vcmd[i]["VALUE"]) is float:
  1279. vcmd[i]["VALUE"] = round(vcmd[i]["VALUE"],3)
  1280. if DMX and vcmd[i]:
  1281. #xcmd = ",{}{}:{}".format(d,DMX,vcmd[i])
  1282. vcmd[i]["DMX"] = DMX
  1283. #cmd.append( xcmd )
  1284. if "VIRTUAL" in fcmd[i]:
  1285. for a in fcmd[i]["VIRTUAL"]:
  1286. DMX = fcmd[i]["VIRTUAL"][a]
  1287. if DMX and vcmd[i]:
  1288. vcmd[i]["DMX"] = DMX
  1289. #xcmd = ",{}{}:{}".format(d,DMX,vcmd[i])
  1290. #cmd.append( xcmd )
  1291. if vcmd[i]["VALUE"] is not None or ("FX" in vcmd[i] and vcmd[i]["FX"]):
  1292. cprint("jvcmd",vcmd[i])
  1293. cmd.append(vcmd[i])
  1294. if cmd and not modes.val("BLIND"):
  1295. pass
  1296. jclient_send(cmd)
  1297. return 0 #======================= END
  1298. cmd=[]
  1299. for vcmd,d in [[vvcmd,"d"],[fxcmd,"fx"]]:
  1300. if xFLASH:
  1301. d+="f"
  1302. for i,v in enumerate(fcmd):
  1303. DMX = fcmd[i]["DMX"]
  1304. if DMX and vcmd[i]:
  1305. xcmd = ",{}{}:{}".format(d,DMX,vcmd[i])
  1306. cmd.append( xcmd )
  1307. if "VIRTUAL" in fcmd[i]:
  1308. for a in fcmd[i]["VIRTUAL"]:
  1309. DMX = fcmd[i]["VIRTUAL"][a]
  1310. if DMX and vcmd[i]:
  1311. xcmd = ",{}{}:{}".format(d,DMX,vcmd[i])
  1312. cmd.append( xcmd )
  1313. cmd = "".join(cmd)
  1314. #print("cmd",cmd)
  1315. if cmd and not modes.val("BLIND"):
  1316. client.send(cmd )
  1317. def draw_sub_dim(self,fix,data,c=0,r=0,frame=None):
  1318. i=0
  1319. if frame is None:
  1320. frame = tk.Frame(root,bg="black")
  1321. frame.pack(fill=tk.X, side=tk.TOP)
  1322. if fix not in self.elem_attr:
  1323. self.elem_attr[fix] = {}
  1324. for attr in data["ATTRIBUT"]:
  1325. if attr not in self.all_attr:
  1326. self.all_attr.append(attr)
  1327. if attr not in self.elem_attr[fix]:
  1328. self.elem_attr[fix][attr] = []
  1329. if attr.endswith("-FINE"):
  1330. continue
  1331. v= data["ATTRIBUT"][attr]["VALUE"]
  1332. b = tk.Button(frame,bg="lightblue", text=""+str(fix)+" "+data["NAME"],width=4)
  1333. b.bind("<Button>",Xevent(fix=fix,mode="D-SELECT",elem=b).cb)
  1334. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1335. c+=1
  1336. b = tk.Button(frame,bg="grey", text=str(attr)+' '+str(round(v,2)),width=6)
  1337. self.elem_attr[fix][attr] = b
  1338. b.bind("<Button>",Xevent(fix=fix,elem=b,attr=attr,mode="ENCODER",data=data).cb)
  1339. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1340. c+=1
  1341. if c >=12:
  1342. c=0
  1343. r+=1
  1344. return c,r
  1345. def draw_patch(self,yframe):
  1346. xframe = tk.Frame(yframe,bg="black")
  1347. xframe.pack()
  1348. def yview(event):
  1349. print("yevent",event)
  1350. yyy=20.1
  1351. xframe.yview_moveto(yyy)
  1352. i=0
  1353. c=0
  1354. r=0
  1355. for fix in FIXTURES.fixtures:
  1356. i+=1
  1357. data = FIXTURES.fixtures[fix]
  1358. b = tk.Button(xframe,bg="lightblue", text="FIX:"+str(fix)+" "+data["NAME"],width=20)
  1359. #b.bind("<Button>",Xevent(fix=fix,elem=b).cb)
  1360. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1361. c+=1
  1362. #r+=1
  1363. if fix not in self.elem_attr:
  1364. self.elem_attr[fix] = {}
  1365. patch = ["DMX","UNIVERS"]
  1366. for k in patch:
  1367. v=data[k]
  1368. b = tk.Button(xframe,bg="grey", text=str(k)+' '+str(v),width=8)
  1369. #self.elem_attr[fix][attr] = b
  1370. #b.bind("<Button>",Xevent(fix=fix,elem=b,attr=attr,data=data).cb)
  1371. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1372. c+=1
  1373. if c >=8:
  1374. c=1
  1375. r+=1
  1376. for attr in data["ATTRIBUT"]:
  1377. if attr not in self.all_attr:
  1378. self.all_attr.append(attr)
  1379. if attr not in self.elem_attr[fix]:
  1380. self.elem_attr[fix][attr] = []
  1381. if attr.endswith("-FINE"):
  1382. continue
  1383. v= data["ATTRIBUT"][attr]["VALUE"]
  1384. b = tk.Button(xframe,bg="grey", text=str(attr)+' '+str(round(v,2)),width=8)
  1385. #self.elem_attr[fix][attr] = b
  1386. #b.bind("<Button>",Xevent(fix=fix,elem=b,attr=attr,data=data).cb)
  1387. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1388. c+=1
  1389. if c >=8:
  1390. c=1
  1391. r+=1
  1392. c=0
  1393. r+=1
  1394. def draw_fix(self,xframe,yframe=None):
  1395. r=0
  1396. c=0
  1397. frame_dim=xframe
  1398. if yframe:
  1399. frame_dim=yframe
  1400. frame_fix=xframe
  1401. root = frame_dim
  1402. dim_frame = tk.Frame(root,bg="black")
  1403. dim_frame.pack(fill=tk.X, side=tk.TOP)
  1404. root = frame_fix
  1405. fix_frame = tk.Frame(root,bg="black")
  1406. fix_frame.pack(fill=tk.X, side=tk.TOP)
  1407. i=0
  1408. c=0
  1409. r=0
  1410. dim_end=0
  1411. for fix in FIXTURES.fixtures:
  1412. i+=1
  1413. data = FIXTURES.fixtures[fix]
  1414. #print("draw_fix", fix ,data )
  1415. if(len(data["ATTRIBUT"].keys()) <= 1):
  1416. c,r=self.draw_sub_dim(fix,data,c=c,r=r,frame=dim_frame)
  1417. else:
  1418. if not dim_end:
  1419. dim_end=1
  1420. c=0
  1421. r=0
  1422. #self._draw_fix(fix,data,root=fix_frame)
  1423. frame = fix_frame
  1424. b = tk.Button(frame,bg="lightblue", text="FIX:"+str(fix)+" "+data["NAME"],width=20)
  1425. b.bind("<Button>",Xevent(fix=fix,mode="SELECT",elem=b).cb)
  1426. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1427. c+=1
  1428. #r+=1
  1429. if fix not in self.elem_attr:
  1430. self.elem_attr[fix] = {}
  1431. for attr in data["ATTRIBUT"]:
  1432. if attr.endswith("-FINE"):
  1433. continue
  1434. if attr not in self.all_attr:
  1435. self.all_attr.append(attr)
  1436. if attr not in self.elem_attr[fix]:
  1437. self.elem_attr[fix][attr] = ["line1348",fix,attr]
  1438. v= data["ATTRIBUT"][attr]["VALUE"]
  1439. b = tk.Button(frame,bg="grey", text=str(attr)+' '+str(round(v,2)),width=8)
  1440. self.elem_attr[fix][attr] = b
  1441. b.bind("<Button>",Xevent(fix=fix,elem=b,attr=attr,mode="ENCODER",data=data).cb)
  1442. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1443. c+=1
  1444. if c >=8:
  1445. c=1
  1446. r+=1
  1447. c=0
  1448. r+=1
  1449. def draw_enc(self,xframe):
  1450. root2 = xframe
  1451. i=0
  1452. c=0
  1453. r=0
  1454. frame = tk.Frame(root2,bg="black")
  1455. frame.pack( side=tk.TOP,expand=1,fill="both")
  1456. b = tk.Button(frame,bg="lightblue", text="ENCODER",width=6)
  1457. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1458. c+=1
  1459. for attr in self.all_attr:
  1460. if attr.endswith("-FINE"):
  1461. continue
  1462. v=0
  1463. b = tk.Button(frame,bg="orange", text=str(attr)+'',width=6)
  1464. b.bind("<Button>",Xevent(fix=0,elem=b,attr=attr,data=self,mode="ENCODER").cb)
  1465. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1466. c+=1
  1467. if c >=8:
  1468. c=0
  1469. r+=1
  1470. def draw_fx(self,xframe):
  1471. frame_fx=xframe
  1472. i=0
  1473. c=0
  1474. r=0
  1475. frame = tk.Frame(frame_fx,bg="black")
  1476. frame.pack(fill=tk.X, side=tk.TOP)
  1477. b = tk.Button(frame,bg="lightblue", text="FX.",width=6)
  1478. #b.bind("<Button>",Xevent(fix=fix,elem=b).cb)
  1479. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1480. c+=1
  1481. for comm in self.fx_commands:
  1482. if comm == "\n":
  1483. c=0
  1484. r+=1
  1485. continue
  1486. v=0
  1487. b = tk.Button(frame,bg="lightgrey", text=str(comm),width=6,height=2)
  1488. if comm not in self.elem_fx_commands:
  1489. self.elem_fx_commands[comm] = b
  1490. self.val_fx_commands[comm] = 0
  1491. b.bind("<Button>",Xevent(fix=0,elem=b,attr=comm,data=self,mode="COMMAND").cb)
  1492. if comm == "BLIND":
  1493. b["bg"] = "grey"
  1494. elif comm == "CLEAR":
  1495. b["bg"] = "grey"
  1496. elif comm == "STONY_FX":
  1497. b["bg"] = "grey"
  1498. elif comm == "FADE":
  1499. b["bg"] = "green"
  1500. elif comm == "FX OFF":
  1501. b["bg"] = "magenta"
  1502. elif comm[:3] == "FX:":
  1503. b["text"] = comm #"BS:{}".format(fx_prm["BASE"])
  1504. b["bg"] = "#ffbf00"
  1505. elif comm == "MO:on":
  1506. b["text"] = comm #"BS:{}".format(fx_prm["BASE"])
  1507. b["bg"] = "lightgreen"
  1508. elif comm == "MO:on":
  1509. b["text"] = comm #"BS:{}".format(fx_prm["BASE"])
  1510. b["bg"] = "lightgreen"
  1511. elif comm == "SZ:":
  1512. b["text"] = "SZ:{:0.0f}".format(fx_prm["SIZE"])
  1513. b["bg"] = "lightgreen"
  1514. elif comm == "SP:":
  1515. b["text"] = "SP:{:0.0f}".format(fx_prm["SPEED"])
  1516. b["bg"] = "lightgreen"
  1517. elif comm == "ST:":
  1518. b["bg"] = "lightgreen"
  1519. b["text"] = "ST:{:0.0f}".format(fx_prm["START"])
  1520. elif comm == "OF:":
  1521. b["bg"] = "lightgreen"
  1522. b["text"] = "OF:{:0.0f}".format(fx_prm["OFFSET"])
  1523. elif comm == "BS:-":
  1524. b["bg"] = "lightgreen"
  1525. b["text"] = "BS:{}".format(fx_prm["BASE"])
  1526. elif comm[0] == "M":
  1527. b["text"] = comm #"BS:{}".format(fx_prm["BASE"])
  1528. b["bg"] = "lightgrey"
  1529. if comm:
  1530. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1531. c+=1
  1532. if c >=5:
  1533. c=0
  1534. r+=1
  1535. def draw_command(self,xframe):
  1536. frame_cmd=xframe
  1537. i=0
  1538. c=0
  1539. r=0
  1540. frame = tk.Frame(frame_cmd,bg="black")
  1541. frame.pack(fill=tk.X, side=tk.TOP)
  1542. b = tk.Button(frame,bg="lightblue", text="COMM.",width=6)
  1543. #b.bind("<Button>",Xevent(fix=fix,elem=b).cb)
  1544. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1545. #r+=1
  1546. c+=1
  1547. for comm in self.commands:
  1548. if comm == "\n":
  1549. c=0
  1550. r+=1
  1551. continue
  1552. v=0
  1553. b = tk.Button(frame,bg="lightgrey", text=str(comm),width=6,height=2)
  1554. if comm not in self.elem_commands:
  1555. self.elem_commands[comm] = b
  1556. self.val_commands[comm] = 0
  1557. b.bind("<Button>",Xevent(fix=0,elem=b,attr=comm,data=self,mode="COMMAND").cb)
  1558. if comm == "BLIND":
  1559. b["bg"] = "grey"
  1560. if comm == "CLEAR":
  1561. b["bg"] = "grey"
  1562. if comm == "STONY_FX":
  1563. b["bg"] = "grey"
  1564. if comm == "FADE":
  1565. b["bg"] = "green"
  1566. if comm == "FX OFF":
  1567. b["bg"] = "magenta"
  1568. if comm == "SZ:":
  1569. b["text"] = "SZ:{:0.0f}".format(fx_prm["SIZE"])
  1570. if comm == "SP:":
  1571. b["text"] = "SP:{:0.0f}".format(fx_prm["SPEED"])
  1572. if comm == "FADE":
  1573. b["text"] = "FADE:{:0.02f}".format(FADE.val())
  1574. if comm == "ST:":
  1575. b["text"] = "ST:{:0.0f}".format(fx_prm["START"])
  1576. if comm == "OF:":
  1577. b["text"] = "OF:{:0.0f}".format(fx_prm["OFFSET"])
  1578. if comm == "BS:":
  1579. b["text"] = "BS:{}".format(fx_prm["BASE"])
  1580. if comm:
  1581. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1582. c+=1
  1583. if c >=5:
  1584. c=0
  1585. r+=1
  1586. def draw_preset(self,xframe):
  1587. i=0
  1588. c=0
  1589. r=0
  1590. root = xframe
  1591. frame = tk.Frame(root,bg="black")
  1592. frame.pack(fill=tk.X, side=tk.TOP)
  1593. i=0
  1594. for k in PRESETS.val_presets:
  1595. if i%(8*8)==0 or i ==0:
  1596. c=0
  1597. b = tk.Label(frame,bg="black", text="X" )
  1598. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1599. r+=1
  1600. c=0
  1601. b = tk.Button(frame,bg="lightblue", text="EXEC " )
  1602. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1603. c+=1
  1604. b = tk.Button(frame,bg="lightblue", text="PAGE " + str(int(i/(8*8))+1) )
  1605. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1606. c+=1
  1607. b = tk.Button(frame,bg="lightblue", text="<NAME>" )
  1608. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1609. r+=1
  1610. c=0
  1611. i+=1
  1612. v=0
  1613. label = ""
  1614. #if k in PRESETS.label_presets:
  1615. # label = PRESETS.label_presets[k]
  1616. # #print([label])
  1617. sdata=PRESETS.val_presets[k]
  1618. BTN="go"
  1619. if "CFG" in sdata:#["BUTTON"] = "GO"
  1620. if "BUTTON" in sdata["CFG"]:
  1621. BTN = sdata["CFG"]["BUTTON"]
  1622. txt=str(k+1)+":"+str(BTN)+":"+str(len(sdata)-1)+"\n"+label
  1623. b = tk.Button(frame,bg="grey", text=txt,width=8,height=2)
  1624. b.bind("<Button>",Xevent(fix=0,elem=b,attr=k,data=self,mode="PRESET").cb)
  1625. b.bind("<ButtonRelease>",Xevent(fix=0,elem=b,attr=k,data=self,mode="PRESET").cb)
  1626. if k not in self.elem_presets:
  1627. self.elem_presets[k] = b
  1628. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1629. c+=1
  1630. if c >=8:
  1631. c=0
  1632. r+=1
  1633. self.refresh_exec()
  1634. def draw_input(self):
  1635. i=0
  1636. c=0
  1637. r=0
  1638. frame = tk.Frame(root2,bg="black")
  1639. frame.pack(fill=tk.X, side=tk.TOP)
  1640. b = tk.Label(frame,bg="black", text="------------------------ ---------------------------------------")
  1641. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1642. r=0
  1643. frame = tk.Frame(root2,bg="black")
  1644. frame.pack(fill=tk.X, side=tk.TOP)
  1645. b = tk.Label(frame, text="send:")
  1646. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1647. c+=1
  1648. b = tk.Entry(frame,bg="grey", text="",width=50)
  1649. self.entry = b
  1650. b.bind("<Button>",Xevent(fix=0,elem=b,attr="INPUT",data=self,mode="INPUT").cb)
  1651. b.bind("<Key>",Xevent(fix=0,elem=b,attr="INPUT",data=self,mode="INPUT").cb)
  1652. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1653. b.insert("end","d0:127,fx241:sinus:50:50:10,fx243:cosinus:50:50:10,d201:127,fx201:sinus:50:300:10")
  1654. r+=1
  1655. b = tk.Entry(frame,bg="grey", text="",width=20)
  1656. self.entry2 = b
  1657. b.bind("<Button>",Xevent(fix=0,elem=b,attr="INPUT",data=self,mode="INPUT2").cb)
  1658. b.bind("<Key>",Xevent(fix=0,elem=b,attr="INPUT",data=self,mode="INPUT2").cb)
  1659. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1660. b.insert("end","d1:0:4")
  1661. r+=1
  1662. b = tk.Entry(frame,bg="grey", text="",width=20)
  1663. self.entry3 = b
  1664. b.bind("<Button>",Xevent(fix=0,elem=b,attr="INPUT",data=self,mode="INPUT3").cb)
  1665. #b.bind("<B1-Motion>",Xevent(fix=0,elem=b,attr="INPUT",data=self,mode="INPUT3").cb)
  1666. b.bind("<Key>",Xevent(fix=0,elem=b,attr="INPUT",data=self,mode="INPUT3").cb)
  1667. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1668. b.insert("end","fx:alloff:::")
  1669. def draw_colorpicker(self,xframe):
  1670. import lib.colorpicker as colp
  1671. class _CB():
  1672. def __init__(self):
  1673. self.old_color = (0,0,0)
  1674. def cb(self,event,data):
  1675. cprint("colorpicker CB")
  1676. if "color" in data and self.old_color != data["color"] or event.num==2:
  1677. self.old_color = data["color"]
  1678. else:
  1679. return 0
  1680. color = data["color"]
  1681. print("e",event,data)
  1682. print("e",dir(event))#.keys())
  1683. try:
  1684. print("e.state",event.state)
  1685. except:pass
  1686. set_fade = FADE.val() #fade
  1687. if "color" in data and (event.num == 1 or event.num == 3 or event.num==2 or event.state in [256,1024]):
  1688. cr=None
  1689. cg=None
  1690. cb=None
  1691. if event.num == 1:
  1692. set_fade=FADE.val() #fade
  1693. cr = color[0]
  1694. cg = color[1]
  1695. cb = color[2]
  1696. elif event.num == 3:
  1697. cr = color[0]
  1698. cg = color[1]
  1699. cb = color[2]
  1700. set_fade=0
  1701. elif event.num == 2:
  1702. cr= "click"
  1703. cg= "click"
  1704. cb= "click"
  1705. elif event.state == 256:
  1706. cr = color[0]
  1707. cg = color[1]
  1708. cb = color[2]
  1709. set_fade=0
  1710. else:
  1711. set_fade=0
  1712. if cr is not None:
  1713. FIXTURES.encoder(fix=0,attr="RED",xval=cr,xfade=set_fade)
  1714. if cg is not None:
  1715. FIXTURES.encoder(fix=0,attr="GREEN",xval=cg,xfade=set_fade)
  1716. if cb is not None:
  1717. FIXTURES.encoder(fix=0,attr="BLUE",xval=cb,xfade=set_fade)
  1718. master.refresh_fix()
  1719. print("PICK COLOR:",data["color"])
  1720. _cb=_CB()
  1721. colp.colorpicker(xframe,width=600,height=100, xcb=_cb.cb)
  1722. return 0
  1723. canvas=tk.Canvas(xframe,width=600,height=100)
  1724. canvas["bg"] = "yellow" #"green"
  1725. canvas.pack()
  1726. # RGB
  1727. x=0
  1728. y=0
  1729. j=0
  1730. d = 20
  1731. for i in range(0,d+1):
  1732. fi = int(i*255/d)
  1733. f = 255-fi
  1734. if i > d/2:
  1735. pass#break
  1736. color = '#%02x%02x%02x' % (f, fi, fi)
  1737. print( "farbe", i*10, j, f,fi,fi,color)
  1738. r = canvas.create_rectangle(x, y, x+20, y+20, fill=color)
  1739. x+=20
  1740. def render(self):
  1741. #Xroot.bind("<Key>",Xevent(fix=0,elem=None,attr="ROOT",data=self,mode="ROOT").cb)
  1742. self.draw_input()
  1743. def ScrollFrame(root,width=50,height=100,bd=1):
  1744. #print("ScrollFrame init",width,height)
  1745. aframe=tk.Frame(root,relief=tk.GROOVE)#,width=width,height=height,bd=bd)
  1746. #aframe.place(x=0,y=0)
  1747. aframe.pack(side="left",fill="both",expand=1) #x=0,y=0)
  1748. canvas=tk.Canvas(aframe,width=width-24,height=height)
  1749. canvas["bg"] = "black" #"green"
  1750. bframe=tk.Frame(canvas)#,width=width,height=height)
  1751. bframe["bg"] = "blue"
  1752. scrollbar=tk.Scrollbar(aframe,orient="vertical",command=canvas.yview,width=20)
  1753. canvas.configure(yscrollcommand=scrollbar.set)
  1754. scrollbar.pack(side="right",fill="y")
  1755. canvas.pack(side="left",expand=1,fill="both")
  1756. canvas.create_window((0,0),window=bframe,anchor='nw')
  1757. bframe.bind("<Configure>",scroll(canvas).config)
  1758. canvas.bind("<Button>",Event("XXX").event)
  1759. canvas.bind("<Key>",Event("XXX").event)
  1760. canvas.bind("<KeyRelease>",Event("XXX").event)
  1761. return bframe
  1762. #frame = ScrollFrame(root)
  1763. class GUIHandler():
  1764. def __init__(self):
  1765. pass
  1766. def update(self,fix,attr,args={}):
  1767. print("GUIHandler.update()",fix,attr,args)
  1768. for i,k in enumerate(args):
  1769. v = args[k]
  1770. #print("GUI-H", i,k,v)
  1771. class Fixtures(Base):
  1772. def __init__(self):
  1773. super().__init__()
  1774. #self.load()
  1775. self.fixtures = OrderedDict()
  1776. self.gui = GUIHandler()
  1777. def load_patch(self):
  1778. filename="patch"
  1779. d,l = self._load(filename)
  1780. self.fixtures = OrderedDict()
  1781. for i in l:
  1782. sdata = d[i]
  1783. for attr in sdata["ATTRIBUT"]:
  1784. sdata["ATTRIBUT"][attr]["ACTIVE"] = 0
  1785. #print("load",filename,sdata)
  1786. #if "CFG" not in sdata:
  1787. # sdata["CFG"] = OrderedDict()
  1788. self.fixtures[str(i)] = sdata
  1789. #PRESETS.label_presets = l
  1790. def backup_patch(self):
  1791. filename = "patch"
  1792. data = self.fixtures
  1793. labels = {}
  1794. for k in data:
  1795. labels[k] = k
  1796. self._backup(filename,data,labels)
  1797. def fx_off(self,fix=None):
  1798. if not fix or fix == "all":
  1799. #self.data.elem_fx_commands[self.attr]["bg"] = "magenta"
  1800. for fix in self.fixtures:
  1801. data = self.fixtures[fix]
  1802. for attr in data["ATTRIBUT"]:
  1803. data["ATTRIBUT"][attr]["FX"] = ""
  1804. def get_attr(self,fix,attr):
  1805. if fix in self.fixtures:
  1806. data = self.fixtures[fix]
  1807. if "ATTRIBUT" in data:
  1808. if attr in data["ATTRIBUT"]:
  1809. return data["ATTRIBUT"][attr]
  1810. def get_dmx(self,fix,attr):
  1811. cprint("get_dmx",[fix,attr])
  1812. if fix in self.fixtures:
  1813. data = self.fixtures[fix]
  1814. if "DMX" in data:
  1815. DMX = int(data["DMX"])
  1816. else:
  1817. return -1
  1818. if "UNIVERS" in data:
  1819. DMX += (int(data["UNIVERS"])*512)
  1820. adata = self.get_attr(fix,attr)
  1821. #-hier ende 8.2.22
  1822. cprint("adata",adata,DMX)
  1823. if adata:
  1824. if "NR" in adata:
  1825. NR = adata["NR"]
  1826. if NR:
  1827. DMX+=NR-1
  1828. else:
  1829. return -2
  1830. return DMX
  1831. return -4
  1832. return -3
  1833. def update_raw(self,rdata,update=1):
  1834. cprint("update_raw",len(rdata))
  1835. cmd = []
  1836. for i,d in enumerate(rdata):
  1837. xcmd = {"DMX":""}
  1838. #print("fix:",i,d)
  1839. fix = d["FIX"]
  1840. attr = d["ATTR"]
  1841. v2 = d["VALUE"]
  1842. v2_fx = d["FX"]
  1843. if fix not in self.fixtures:
  1844. continue
  1845. sdata = self.fixtures[fix] #shortcat
  1846. ATTR = sdata["ATTRIBUT"]
  1847. sDMX = 0
  1848. if sdata["DMX"] > 0:
  1849. #print( sdata)
  1850. sDMX = (sdata["UNIVERS"]*512)+sdata["DMX"]
  1851. #sDMX =sdata["DMX"]
  1852. #else:
  1853. # continue
  1854. if attr not in ATTR:
  1855. continue
  1856. #DMX = FIXTURES.get_dmx(fix)
  1857. if ATTR[attr]["NR"] >= 0:
  1858. DMX = sDMX+ATTR[attr]["NR"]-1
  1859. xcmd["DMX"] = str(DMX)
  1860. else:
  1861. if attr == "DIM" and ATTR[attr]["NR"] < 0:
  1862. xcmd["VIRTUAL"] = {}
  1863. for a in ATTR:
  1864. if ATTR[a]["MASTER"]:
  1865. xcmd["VIRTUAL"][a] = sDMX+ATTR[a]["NR"]-1
  1866. #print( "VIRTUAL",xcmd)
  1867. cmd.append(xcmd)
  1868. v=ATTR[attr]["VALUE"]
  1869. if v2 is not None and update:
  1870. ATTR[attr]["VALUE"] = v2
  1871. #self.data.elem_attr[fix][attr]["text"] = str(attr)+' '+str(round(v,2))
  1872. text = str(attr)+' '+str(round(v,2))
  1873. #self.gui.update(fix,attr,args={"text":text})
  1874. #print("END 5454 _=_=_=_=_==_")
  1875. cprint("update_raw",cmd,color="red")
  1876. return cmd
  1877. def encoder(self,fix,attr,xval="",xfade=0):
  1878. cprint("FIXTURES.encoder",fix,attr,xval,xfade,color="yellow")
  1879. if attr == "CLEAR":
  1880. self.clear()
  1881. return 0
  1882. if fix not in self.fixtures:
  1883. jdata=[{"MODE":"---"}]
  1884. ii =0
  1885. jclient_send(jdata)
  1886. for fix in self.fixtures:
  1887. ii+=1
  1888. #cprint(fix,attr,xval)
  1889. data = self.fixtures[fix]
  1890. if attr in data["ATTRIBUT"]:
  1891. if xval == "click":
  1892. self.select(fix,attr,mode="on")
  1893. elif data["ATTRIBUT"][attr]["ACTIVE"]:
  1894. if fix: # prevent endless recursion
  1895. self.encoder(fix,attr,xval,xfade)
  1896. jdata=[{"MODE":ii}]
  1897. jclient_send(jdata)
  1898. return 0
  1899. data = self.fixtures[fix]
  1900. if xval == "click":
  1901. #cprint(data)
  1902. return self.select(fix,attr,mode="toggle")
  1903. v2=data["ATTRIBUT"][attr]["VALUE"]
  1904. change=0
  1905. increment = 4.11
  1906. jdata = {"MODE":"ENC"}
  1907. if xval == "+":
  1908. v2+= increment
  1909. jdata["INC"] = increment
  1910. change=1
  1911. elif xval == "-":
  1912. jdata["INC"] = increment*-1
  1913. v2-= increment
  1914. change=1
  1915. elif type(xval) is int or type(xval) is float:
  1916. v2 = xval
  1917. change=1
  1918. if v2 < 0:
  1919. v2=0
  1920. elif v2 > 256:
  1921. v2=256
  1922. jdata["VALUE"] = round(v2,4)
  1923. jdata["FIX"] = fix
  1924. jdata["ATTR"] = attr
  1925. jdata["DMX"] = FIXTURES.get_dmx(fix,attr)
  1926. out = {}
  1927. if change:
  1928. data["ATTRIBUT"][attr]["ACTIVE"] = 1
  1929. data["ATTRIBUT"][attr]["VALUE"] = round(v2,4)
  1930. jdata["FADE"] = 0
  1931. if xfade:
  1932. jdata["FADE"] = xfade
  1933. if not modes.val("BLIND"):
  1934. jdata = [jdata]
  1935. print(jdata)
  1936. jclient_send(jdata)
  1937. return v2
  1938. def get_active(self):
  1939. cprint("get_active",self,"get_active")
  1940. CFG = OrderedDict()
  1941. sdata = OrderedDict()
  1942. sdata["CFG"] = CFG # OrderedDict()
  1943. sdata["CFG"]["FADE"] = FADE.val()
  1944. sdata["CFG"]["DEALY"] = 0
  1945. #sdata["CFG"]["BUTTON"] = "GO"
  1946. for fix in self.fixtures:
  1947. data = self.fixtures[fix]
  1948. for attr in data["ATTRIBUT"]:
  1949. if data["ATTRIBUT"][attr]["ACTIVE"]:
  1950. if fix not in sdata:
  1951. sdata[fix] = {}
  1952. if attr not in sdata[fix]:
  1953. sdata[fix][attr] = OrderedDict()
  1954. if not modes.val("STONY_FX"):
  1955. sdata[fix][attr]["VALUE"] = data["ATTRIBUT"][attr]["VALUE"]
  1956. #sdata[fix][attr]["FADE"] = FADE.val() #fade
  1957. else:
  1958. sdata[fix][attr]["VALUE"] = None #data["ATTRIBUT"][attr]["VALUE"]
  1959. if "FX" not in data["ATTRIBUT"][attr]:
  1960. data["ATTRIBUT"][attr]["FX"] =""
  1961. sdata[fix][attr]["FX"] = data["ATTRIBUT"][attr]["FX"]
  1962. return sdata
  1963. def select(self,fix=None,attr=None,mode="on"):
  1964. cprint("FIXTURES.select()",fix,attr,mode,color="yellow")
  1965. out = 0
  1966. if fix in self.fixtures:
  1967. data = self.fixtures[fix]
  1968. if attr in data["ATTRIBUT"]:
  1969. if mode == "on":
  1970. if not data["ATTRIBUT"][attr]["ACTIVE"]:
  1971. data["ATTRIBUT"][attr]["ACTIVE"] = 1
  1972. out = 1
  1973. elif mode == "off":
  1974. if data["ATTRIBUT"][attr]["ACTIVE"]:
  1975. data["ATTRIBUT"][attr]["ACTIVE"] = 0
  1976. out = 1
  1977. elif mode == "toggle":
  1978. if data["ATTRIBUT"][attr]["ACTIVE"]:
  1979. data["ATTRIBUT"][attr]["ACTIVE"] = 0
  1980. else:
  1981. data["ATTRIBUT"][attr]["ACTIVE"] = 1
  1982. out = 1
  1983. return out
  1984. def clear(self):
  1985. out = 0
  1986. for fix in self.fixtures:
  1987. data = self.fixtures[fix]
  1988. for attr in data["ATTRIBUT"]:
  1989. if attr.endswith("-FINE"):
  1990. continue
  1991. if data["ATTRIBUT"][attr]["ACTIVE"]:
  1992. out +=1
  1993. data["ATTRIBUT"][attr]["ACTIVE"] = 0
  1994. return out
  1995. class Presets(Base):
  1996. def __init__(self):
  1997. super().__init__()
  1998. #self.load()
  1999. self._last_copy = None
  2000. self._last_move = None
  2001. def load_presets(self):
  2002. filename="presets"
  2003. d,l = self._load(filename)
  2004. for i in d:
  2005. sdata = d[i]
  2006. if "CFG" not in sdata:
  2007. sdata["CFG"] = OrderedDict()
  2008. if "FADE" not in sdata["CFG"]:
  2009. sdata["CFG"]["FADE"] = 4
  2010. if "DELAY" not in sdata["CFG"]:
  2011. sdata["CFG"]["DELAY"] = 0
  2012. if "BUTTON" not in sdata["CFG"]:
  2013. sdata["CFG"]["BUTTON"] = "GO"
  2014. self.val_presets = d
  2015. self.label_presets = l
  2016. def check_cfg(self,nr=None):
  2017. cprint("PRESETS.check_cfg()",nr)
  2018. ok = 0
  2019. if nr is not None:
  2020. ok += self._check_cfg(nr)
  2021. else:
  2022. for nr in self.val_presets:
  2023. ok += self._check_cfg(nr)
  2024. return ok
  2025. def _check_cfg(self,nr):
  2026. #cprint("PRESETS._check_cfg()",nr)
  2027. ok=0
  2028. if nr in self.val_presets:
  2029. sdata = self.val_presets[nr]
  2030. if "CFG" not in sdata:
  2031. sdata["CFG"] = OrderedDict()
  2032. ok += 1
  2033. if "FADE" not in sdata["CFG"]:
  2034. sdata["CFG"]["FADE"] = 4
  2035. ok += 1
  2036. if "DELAY" not in sdata["CFG"]:
  2037. sdata["CFG"]["DELAY"] = 0
  2038. ok += 1
  2039. if "BUTTON" not in sdata["CFG"]:
  2040. sdata["CFG"]["BUTTON"] = "GO"
  2041. ok += 1
  2042. if ok:
  2043. cprint("REPAIR CFG's",nr,sdata["CFG"],color="red")
  2044. else:
  2045. cprint("nr not in data ",nr,color="red")
  2046. return ok
  2047. def backup_presets(self):
  2048. filename = "presets"
  2049. data = self.val_presets
  2050. labels = self.label_presets
  2051. self._backup(filename,data,labels)
  2052. def get_cfg(self,nr):
  2053. cprint("PRESETS.get_cfg()",nr)
  2054. self.check_cfg(nr)
  2055. if nr not in self.val_presets:
  2056. cprint("get_cfg",self,"error get_cfg no nr:",nr,color="red")
  2057. return {}
  2058. if "CFG" in self.val_presets[nr]:
  2059. return self.val_presets[nr]["CFG"]
  2060. def get_raw_map(self,nr):
  2061. print("get_raw_map",nr)
  2062. if nr not in self.val_presets:
  2063. self.val_presets[nr] = OrderedDict()
  2064. self.val_presets[nr]["VALUE"] = 0
  2065. self.val_presets[nr]["FX"] = ""
  2066. sdata = self.val_presets[nr]
  2067. cmd = ""
  2068. out = []
  2069. dmx=-1
  2070. for fix in sdata:
  2071. if fix == "CFG":
  2072. #print("CFG",nr,sdata[fix])
  2073. continue
  2074. for attr in sdata[fix]:
  2075. x = {}
  2076. #print("RAW",attr)
  2077. x["FIX"] = fix
  2078. x["ATTR"] = attr
  2079. x["VALUE"] = sdata[fix][attr]["VALUE"]
  2080. x["FX"] = sdata[fix][attr]["FX"]
  2081. #x["DMX"] = sdata[fix][attr]["NR"]
  2082. out.append(x)
  2083. return out
  2084. def get_btn_txt(self,nr):
  2085. sdata=self.val_presets[nr]
  2086. BTN="go"
  2087. if "CFG" in sdata:
  2088. if "BUTTON" in sdata["CFG"]:
  2089. BTN = sdata["CFG"]["BUTTON"]
  2090. _label = self.label_presets[nr] # = label
  2091. txt=str(nr+1)+":"+str(BTN)+":"+str(len(sdata)-1)+"\n"+_label
  2092. print("get_btn_txt",nr,[txt])
  2093. return txt
  2094. def btn_cfg(self,nr,txt=None):
  2095. if nr not in self.val_presets:
  2096. return ""
  2097. if "CFG" not in self.val_presets[nr]:
  2098. self.val_presets[nr]["CFG"] = OrderedDict()
  2099. if "BUTTON" not in self.val_presets[nr]["CFG"]:
  2100. self.val_presets[nr]["CFG"]["BUTTON"] = ""
  2101. if type(txt) is str:
  2102. self.val_presets[nr]["CFG"]["BUTTON"] = txt
  2103. if self.val_presets[nr]["CFG"]["BUTTON"] is None:
  2104. self.val_presets[nr]["CFG"]["BUTTON"] = ""
  2105. print("EEE", self.val_presets[nr]["CFG"]["BUTTON"] )
  2106. return self.val_presets[nr]["CFG"]["BUTTON"]
  2107. def label(self,nr,txt=None):
  2108. if nr not in self.label_presets:
  2109. return ""
  2110. if type(txt) is str:
  2111. self.label_presets[nr] = txt
  2112. print("set label",nr,[txt])
  2113. print("??? ?? set label",nr,[txt])
  2114. return self.label_presets[nr]
  2115. def clear_move(self):
  2116. cprint("PRESETS.clear_move()",end=" ")
  2117. self.clear_copy()
  2118. def clear_copy(self):
  2119. cprint("PRESETS.clear_copy()",end=" ")
  2120. if self._last_copy is not None:
  2121. cprint("=OK=",color="red")
  2122. self._last_copy = None
  2123. else:
  2124. cprint("=NONE=",color="green")
  2125. def copy(self,nr,overwrite=1):
  2126. cprint("PRESETS._copy",nr,"last",self._last_copy)
  2127. if nr:
  2128. if self._last_copy is not None:
  2129. ok = self._copy(self._last_copy,nr,overwrite=overwrite)
  2130. return ok #ok
  2131. else:
  2132. self._last_copy = nr
  2133. cprint("PRESETS.copy START ",color="red")
  2134. return 0
  2135. return 1 # on error reset move
  2136. def _copy(self,nr_from,nr_to,overwrite=1):
  2137. cprint("PRESETS._copy",nr_from,"to",nr_to)
  2138. self.check_cfg(nr_from)
  2139. if self._last_copy is None:
  2140. cprint("PRESETS._copy last nr is None")
  2141. return 0
  2142. if nr_from in self.val_presets and nr_to in self.val_presets:
  2143. fdata = self.val_presets[nr_from]
  2144. tdata = self.val_presets[nr_to]
  2145. #cprint(fdata)
  2146. flabel = self.label_presets[nr_from]
  2147. tlabel = self.label_presets[nr_to]
  2148. self.val_presets[nr_to] = copy.deepcopy(fdata)
  2149. self.label_presets[nr_to] = flabel
  2150. if not overwrite: #default
  2151. cprint("overwrite",overwrite)
  2152. self.val_presets[nr_from] = copy.deepcopy(tdata)
  2153. self.label_presets[nr_from] = tlabel
  2154. #self.label_presets[nr_from] = "MOVE"
  2155. self.clear_copy()
  2156. cprint("PRESETS.copy OK",color="red")
  2157. return 1
  2158. def move(self,nr):
  2159. cprint("PRESETS.move",self._last_copy,"to",nr)
  2160. if nr:
  2161. last = self._last_copy
  2162. ok= self.copy(nr,overwrite=0)
  2163. if ok and last:
  2164. cprint("PRESETS.move OK",color="red")
  2165. #self.delete(last)
  2166. return ok #ok
  2167. return 0 # on error reset move
  2168. def delete(self,nr):
  2169. cprint("PRESETS.delete",nr)
  2170. ok=0
  2171. if nr in self.val_presets:
  2172. self.val_presets[nr] = OrderedDict()
  2173. self.label_presets[nr] = ""
  2174. ok = 1
  2175. self.check_cfg(nr)
  2176. return ok
  2177. def rec(self,nr,data,arg=""):
  2178. print("rec",self,"rec()",data,arg)
  2179. self.check_cfg(nr)
  2180. self.val_presets[nr] = data
  2181. return 1
  2182. class GUI_grid():
  2183. def __init__(self,root,data,title="tilte",width=800):
  2184. self.data = data
  2185. self.frame = tk.Frame(root,bg="black",width=width)
  2186. self.frame.pack(fill=tk.BOTH, side=tk.LEFT)
  2187. r=0
  2188. c=0
  2189. i=1
  2190. for row in data:
  2191. self.b = tk.Button(self.frame,bg="lightblue", text=row["text"],width=11,height=4)
  2192. #self.b.bind("<Button>",Xevent(fix=fix,elem=b).cb)
  2193. self.b.grid(row=r, column=c, sticky=tk.W+tk.E)#,anchor="w")
  2194. c+=1
  2195. if c % 8 == 0:
  2196. r+=1
  2197. c=0
  2198. i+=1
  2199. self.frame.pack()
  2200. class BEvent():
  2201. def __init__(self,data,cb):
  2202. self._data = data
  2203. self._cb = cb
  2204. def cb(self,event):
  2205. #print(self,event)
  2206. self._cb(event,self._data)
  2207. class GUI_menu():
  2208. def __init__(self,root,data,title="tilte",width=800):
  2209. global tk
  2210. self.data = data
  2211. self.frame = tk.Frame(root,bg="black",width=width)
  2212. self.frame.pack(fill=tk.BOTH, side=tk.LEFT)
  2213. r=0
  2214. c=0
  2215. i=1
  2216. self.b = tk.Label(self.frame,bg="lightblue", text="MAIN:MENU",width=10,height=1)
  2217. self.b.grid(row=r, column=c, sticky=tk.W+tk.E)#,anchor="w")
  2218. r+=1
  2219. for row in data:
  2220. #print(i)
  2221. #row = data[i]
  2222. self.b = tk.Button(self.frame,bg="lightblue", text=row["text"],width=10,height=3)
  2223. self.b.bind("<Button>",BEvent({"NR":i,"text":row["text"]},self.callback).cb)
  2224. self.b.grid(row=r, column=c, sticky=tk.W+tk.E)#,anchor="w")
  2225. r+=1
  2226. i+=1
  2227. self.frame.pack()
  2228. def callback(self,event,data={}):
  2229. print("callback543",self,event,data)
  2230. window_manager.top(data["text"])# = WindowManager()
  2231. lf_nr = 0
  2232. class GUIWindow():
  2233. def __init__(self,title="tilte",master=0,width=100,height=100,left=None,top=None):
  2234. global lf_nr
  2235. if master:
  2236. self.tk = tkinter.Tk()
  2237. defaultFont = tkinter.font.nametofont("TkDefaultFont")
  2238. print(defaultFont)
  2239. defaultFont.configure(family="FreeSans",
  2240. size=10,
  2241. weight="bold")
  2242. #self.tk.option_add("*Font", FontBold)
  2243. else:
  2244. self.tk = tkinter.Toplevel()
  2245. #print(title,self.tk.__doc__)
  2246. self.tk["bg"] = "black"
  2247. self.tk.bind("<Button>",self.callback)
  2248. self.tk.bind("<Key>",self.callback)
  2249. self.tk.bind("<KeyRelease>",self.callback)
  2250. self.tk.title(""+str(title)+" "+str(lf_nr)+":"+str(rnd_id))
  2251. lf_nr+=1
  2252. #self.tk.geometry("270x600+0+65")
  2253. geo ="{}x{}".format(width,height)
  2254. if left is not None:
  2255. geo += "+{}".format(left)
  2256. if top is not None:
  2257. geo += "+{}".format(top)
  2258. #self._event_clear = Xevent(fix=0,elem=None,attr="CLEAR",data=self,mode="ROOT").cb
  2259. self.tk.geometry(geo)
  2260. def title(self,title=None):
  2261. if title is None:
  2262. return self.tk.title()
  2263. else:
  2264. return self.tk.title(title)
  2265. def show(self):
  2266. pass
  2267. def mainloop(self):
  2268. try:
  2269. self.tk.mainloop()
  2270. finally:
  2271. self.tk.quit()
  2272. def callback(self,event,data={}):#value=255):
  2273. print()
  2274. print()
  2275. cprint("<GUI>",event,color="yellow")
  2276. cprint("<GUI>",event.state,data,[event.type],color="yellow")
  2277. value = 255
  2278. if "Release" in str(event.type) or str(event.type) == '5' or str(event.type) == '3':
  2279. value = 0
  2280. if "keysym" in dir(event):
  2281. if "Escape" == event.keysym:
  2282. FIXTURES.clear()
  2283. modes.val("ESC",1)
  2284. master.refresh_fix()
  2285. elif event.keysym in "ebfclrms" and value:
  2286. if "e" == event.keysym:
  2287. modes.val("EDIT",1)
  2288. elif "b" == event.keysym:
  2289. modes.val("BLIND",1)
  2290. elif "f" == event.keysym:
  2291. modes.val("FLASH",1)
  2292. elif "c" == event.keysym:
  2293. modes.val("CFG-BTN",1)
  2294. elif "l" == event.keysym:
  2295. modes.val("LABEL",1)
  2296. elif "r" == event.keysym:
  2297. modes.val("REC",1)
  2298. elif "m" == event.keysym:
  2299. x=modes.val("MOVE",1)
  2300. if not x:
  2301. PRESETS.clear_move()
  2302. elif "s" == event.keysym:
  2303. modes.val("SELECT",1)
  2304. elif event.keysym in ["1","2","3","4","5","6","7","8","9","0"]:
  2305. nr = int( event.keysym)
  2306. if nr == 0:
  2307. nr =10
  2308. cprint("F-KEY",value,nr)
  2309. xfade = 0
  2310. if FADE._is():
  2311. xfade = 0
  2312. master.preset_go(128-1+nr,xfade=xfade,val=value)
  2313. elif event.keysym in ["F1","F2","F3","F4","F5","F6","F7","F8","F9","F10","F11","F12"]:
  2314. nr = int( event.keysym[1])-1
  2315. cprint("F-KEY",value,nr)
  2316. xfade = 0
  2317. if FADE._is():
  2318. xfade = 0
  2319. master.preset_go(65-1+nr,xfade=xfade,val=value)
  2320. elif "End" == event.keysym:
  2321. FIXTURES.fx_off("all")
  2322. CONSOLE.fx_off("all")
  2323. CONSOLE.flash_off("all")
  2324. elif "Delete" == event.keysym:
  2325. #PRESETS.delete(nr)
  2326. if value:
  2327. modes.val("DEL",1)
  2328. class WindowManager():
  2329. def __init__(self):
  2330. self.windows = {}
  2331. self.nr= 0
  2332. self.first=""
  2333. def new(self,w,name=""):
  2334. if not self.first:
  2335. if name:
  2336. self.first = name
  2337. else:
  2338. self.first = str(self.nr)
  2339. w.tk.attributes('-topmost',True)
  2340. if name:
  2341. self.windows[str(name)] = w
  2342. else:
  2343. self.windows[str(self.nr)] = w
  2344. self.nr+=1
  2345. #w.show()
  2346. def mainloop(self):
  2347. self.windows[self.first].mainloop()
  2348. def top(self,name):
  2349. name = str(name)
  2350. if name in self.windows:
  2351. self.windows[name].tk.attributes('-topmost',True)
  2352. self.windows[name].tk.attributes('-topmost',False)
  2353. else:
  2354. print(name,"not in self.windows",self.windows.keys())
  2355. class Console():
  2356. def __init__(self):
  2357. pass
  2358. def flash_off(self,fix):
  2359. client.send("df0:alloff:::,")
  2360. def fx_off(self,fix):
  2361. cprint("Console.fx_off()",fix)
  2362. if not fix or fix == "all":
  2363. client.send("fx0:alloff:,fxf:alloff:,")
  2364. client.send("df0:alloff:::,")
  2365. return 0
  2366. window_manager = WindowManager()
  2367. CONSOLE = Console()
  2368. PRESETS = Presets()
  2369. PRESETS.load_presets()
  2370. FIXTURES = Fixtures()
  2371. FIXTURES.load_patch()
  2372. master = GUI()
  2373. w = GUIWindow("MAIN",master=1,width=100,height=450,left=0,top=65)
  2374. data = []
  2375. #data.append({"text":"COMMAND"})
  2376. data.append({"text":"EXEC"})
  2377. data.append({"text":"DIMMER"})
  2378. data.append({"text":"FIXTURES"})
  2379. f = GUI_menu(w.tk,data)
  2380. window_manager.new(w)
  2381. name="EXEC"
  2382. w = GUIWindow(name,master=0,width=800,height=400,left=110,top=65)
  2383. w1 = ScrollFrame(w.tk,width=800,height=400)
  2384. #frame_exe = w.tk
  2385. master.draw_preset(w1)#w.tk)
  2386. window_manager.new(w,name)
  2387. name="DIMMER"
  2388. w = GUIWindow(name,master=0,width=800,height=400,left=110,top=65)
  2389. w2 = ScrollFrame(w.tk,width=800,height=400)
  2390. #frame_dim = w1 # w.tk
  2391. #master.draw_dim(w1.tk)
  2392. window_manager.new(w,name)
  2393. name="FIXTURES"
  2394. w = GUIWindow(name,master=0,width=800,height=400,left=110,top=65)
  2395. w1 = ScrollFrame(w.tk,width=800,height=400)
  2396. #frame_fix = w1 #w.tk
  2397. master.draw_fix(w1,w2)#.tk)
  2398. window_manager.new(w,name)
  2399. name="ENCODER"
  2400. ww = GUIWindow(name,master=0,width=800,height=50,left=110,top=500)
  2401. Xroot = ww.tk
  2402. w = None
  2403. root = tk.Frame(Xroot,bg="black",width="10px")
  2404. print("print pack",root)
  2405. root.pack(fill=tk.BOTH,expand=0, side=tk.LEFT)
  2406. root3 = tk.Frame(Xroot,bg="black",width="20px")
  2407. root3.pack(fill=tk.BOTH,expand=0, side=tk.LEFT)
  2408. root2 = tk.Frame(Xroot,bg="black",width="1px")
  2409. master.draw_enc(root2)
  2410. root2.pack(fill=tk.BOTH,expand=0, side=tk.LEFT)
  2411. name = "COMMAND"
  2412. w = GUIWindow(name,master=0,width=350,height=200,left=920,top=65)
  2413. master.draw_command(w.tk)
  2414. window_manager.new(w,name)
  2415. name="PATCH"
  2416. w = GUIWindow(name,master=0,width=800,height=400,left=110,top=65)
  2417. w1 = ScrollFrame(w.tk,width=800,height=400)
  2418. master.draw_patch(w1)
  2419. window_manager.new(w,name)
  2420. name="FX"
  2421. w = GUIWindow(name,master=0,width=350,height=250,left=920,top=305)
  2422. #frame_fx = w.tk
  2423. master.draw_fx(w.tk)
  2424. window_manager.new(w,name)
  2425. #LibreLightDesk
  2426. name="COLORPICKER"
  2427. w = GUIWindow(name,master=0,width=580,height=100,left=80,top=620)
  2428. master.draw_colorpicker(w.tk)
  2429. window_manager.new(w,name)
  2430. #Xroot = tk.Tk()
  2431. #Xroot["bg"] = "black" #white
  2432. #Xroot.title( xtitle+" "+str(rnd_id) )
  2433. #Xroot.geometry("1024x800+130+65")
  2434. master.render()
  2435. #w = frame_fix #GUIWindow("OLD",master=0,width=800,height=500,left=130,top=65)
  2436. window_manager.new(w,name)
  2437. try:
  2438. #root.mainloop()
  2439. #tk.mainloop()
  2440. window_manager.mainloop()
  2441. finally:
  2442. master.exit()