_LibreLightDesk.py 131 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548354935503551355235533554355535563557355835593560356135623563356435653566356735683569357035713572357335743575357635773578357935803581358235833584358535863587358835893590359135923593359435953596359735983599360036013602360336043605360636073608360936103611361236133614361536163617361836193620362136223623362436253626362736283629363036313632363336343635363636373638363936403641364236433644364536463647364836493650365136523653365436553656365736583659366036613662366336643665366636673668366936703671367236733674367536763677367836793680368136823683368436853686368736883689369036913692369336943695369636973698369937003701370237033704370537063707370837093710371137123713371437153716371737183719372037213722372337243725372637273728372937303731373237333734373537363737
  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. try:
  21. rnd_id += subprocess.check_output(['git', 'rev-parse', '--short', 'HEAD']).decode('ascii').strip()
  22. except:
  23. rnd_id += " no git"
  24. try:
  25. xtitle = __file__
  26. except:
  27. xtitle = "__file__"
  28. if "/" in xtitle:
  29. xtitle = xtitle.split("/")[-1]
  30. import sys
  31. sys.stdout.write("\x1b]2;"+str(xtitle)+" "+str(rnd_id)+"\x07") # terminal title
  32. import json
  33. import time
  34. import sys
  35. import os
  36. import _thread as thread
  37. import traceback
  38. import tkinter
  39. import tkinter as tk
  40. from tkinter import font
  41. import tkinter.simpledialog
  42. import lib.chat as chat
  43. import lib.motion as motion
  44. from collections import OrderedDict
  45. CUES = OrderedDict()
  46. groups = OrderedDict()
  47. class Modes():
  48. def __init__(self):
  49. self.modes = {}
  50. self.__cfg = {}
  51. self.__cb = None
  52. def val(self,mode,value=None):
  53. if value is not None:
  54. return self.set(mode,value)
  55. elif mode in self.modes:
  56. return self.modes[mode]
  57. def get(self,mode,value=None):
  58. return self.val(mode,value)
  59. def __check(self,mode):
  60. if mode not in self.modes:
  61. self.modes[mode] = 0
  62. self.__cfg[mode] = 0
  63. def cfg(self,mode,data={}):
  64. self.__check(mode)
  65. if type(data) is dict:
  66. for k in data:
  67. v = data[k]
  68. if v not in self.__cfg:
  69. self.__cfg[k] = v
  70. return 1
  71. elif type(data) is str:
  72. if data in self.__cfg:
  73. return self.__cfg[data]
  74. def set(self,mode,value):
  75. protected = ["BLIND","CLEAR","REC-FX"]
  76. self.__check(mode)
  77. if mode == "CLEAR":
  78. return 1
  79. elif mode == "ESC":
  80. for m in self.modes:
  81. print("ESC",m)
  82. if m == "COPY":
  83. PRESETS.clear_copy()
  84. if m == "MOVE":
  85. PRESETS.clear_move()
  86. if m != "BLIND":
  87. self.modes[m] = 0
  88. self.callback(m)
  89. return 1
  90. if value:
  91. for m in self.modes:
  92. if m not in protected and mode not in protected and m != mode:
  93. cprint("-#-# clear mode",mode,m,value,color="red")
  94. if self.modes[m]:
  95. self.modes[m]= 0
  96. self.callback(m)
  97. if self.modes[mode] and value == 1:
  98. if modes == "MOVE":
  99. PRESETS.clear_move()
  100. if modes == "COPY":
  101. PRESETS.clear_copy()
  102. self.modes[mode] = 0 # value
  103. else:
  104. self.modes[mode] = value #1 #value
  105. else:
  106. self.modes[mode] = 0 #value
  107. if modes == "COPY":
  108. PRESETS.clear_copy()
  109. if modes == "MOVE":
  110. PRESETS.clear_move()
  111. self.callback(mode)
  112. return value
  113. def set_cb(self,cb):
  114. if cb:
  115. self.__cb = cb
  116. def callback(self,mode):
  117. if self.__cb is not None and mode in self.modes:
  118. value = self.modes[mode]
  119. self.__cb(mode=mode,value=value)
  120. modes = Modes()
  121. #modes.val("BLIND", 0)
  122. #modes.modes["BLIND"] = 0
  123. modes.modes["ESC"] = 0
  124. modes.modes["REC"] = 0
  125. modes.modes["EDIT"] = 0
  126. modes.modes["MOVE"] = 0
  127. modes.modes["FLASH"] = 0
  128. modes.modes["GO"] = 0
  129. modes.modes["DEL"] = 0
  130. modes.modes["REC-FX"] = 0
  131. modes.modes["SELECT"] = 0
  132. modes.modes["CFG-BTN"] = 0
  133. modes.modes["LABEL"] = 0
  134. def xcb(mode,value=None):
  135. print("xcb","MODE CALLBACK",mode,value)
  136. if mode == "REC-FX":
  137. print("xcb",modes.val("REC-FX"))
  138. #modes.set_cb(xcb)
  139. POS = ["PAN","TILT","MOTION"]
  140. COLOR = ["RED","GREEN","BLUE","COLOR"]
  141. BEAM = ["GOBO","G-ROT","PRISMA","P-ROT","FOCUS","SPEED"]
  142. INT = ["DIM","SHUTTER","STROBE","FUNC"]
  143. #client = chat.tcp_sender(port=50001)
  144. jclient = chat.tcp_sender()#port=50001)
  145. import zlib
  146. def jclient_send(data):
  147. t_start = time.time()
  148. jtxt = data
  149. jdatas = []
  150. for jdata in data:
  151. if "DMX" in jdata:
  152. try:
  153. if int(jdata["DMX"]) >= 1: # ignore DMX lower one
  154. jdatas.append(jdata)
  155. else:
  156. cprint("jclient_send, ignore DMX ",jdata["DMX"],color="red")
  157. except Exception as e:
  158. cprint("jclient_send, Exception DMX ",color="red")
  159. cprint("",jdata,color="red")
  160. cprint("-----",color="red")
  161. jtxt = jdatas
  162. jtxt = json.dumps(jtxt)
  163. jtxt = jtxt.encode()
  164. #jtxt = zlib.compress(jtxt)
  165. jclient.send(b"\00 "+ jtxt +b"\00 ")
  166. print(round((time.time()-t_start)*1000,4),"milis")
  167. cprint(round(time.time(),4),color="yellow")
  168. class _FadeTime():
  169. def __init__(self):
  170. self._value = 2
  171. self._on = 1
  172. def inc(self,value=None):
  173. if value is not None:
  174. if type(value) is float:
  175. self._value += round(value,4)
  176. else:
  177. self._value += value
  178. return self._value
  179. def val(self,value=None):
  180. if value is not None:
  181. if type(value) is float:
  182. self._value = round(value,4)
  183. else:
  184. self._value = value
  185. return self._value
  186. def on(self):
  187. self._on = 1
  188. def off(self):
  189. self._on = 0
  190. def _is(self):
  191. if self._on:
  192. return 1
  193. return 0
  194. FADE = _FadeTime() #2 #0.1 #1.13
  195. fx_prm_move = {"SIZE":100,"SPEED":30,"OFFSET":100,"BASE":"-","START":0,"MODE":0,"MO":0,"DIR":1,"INVERT":0,"WING":2,"WIDTH":25}
  196. fx_prm = {"SIZE":100,"SPEED":30,"OFFSET":100,"BASE":"-","START":0,"MODE":0,"MO":0,"DIR":1,"INVERT":0,"WING":2,"WIDTH":25}
  197. fx_modes = ["RED","GREEN","BLUE","MAG","YELLOW","CYAN"]
  198. fx_mo = ["sinus","on","rnd","bump","bump2","fade","cosinus"]
  199. class FX_handler():
  200. def __init__():
  201. pass
  202. def build_cmd(dmx,val,args=[],flash=0,xpfx="",attr=""):
  203. if not args:
  204. args.append(FADE.val())
  205. cmd=""
  206. if xpfx:
  207. pfx=xpfx
  208. elif flash:
  209. pfx ="df"
  210. else:
  211. pfx ="d"
  212. if type(val) is float or type(val) is int:
  213. cmd += ",{}{}:{:0.4f}".format(pfx,dmx,val)
  214. else:
  215. cmd += ",{}{}:{}".format(pfx,dmx,val)
  216. if flash:
  217. cmd += ":0:0"#.format(val)
  218. else:
  219. for val in args:
  220. if type(val) is float or type(val) is int:
  221. cmd += ":{:0.4f}".format(val)
  222. else:
  223. cmd += ":{}".format(val)
  224. if attr:
  225. cmd += ":"+str(attr)
  226. #cprint("build_cmd",cmd,color="red")
  227. return cmd
  228. def update_raw_dmx(data ,value=None,args=[],xfade=0,flash=0,pfx="d",fx=0):
  229. if flash:
  230. xfade = 0
  231. if not args: # and xfade is not None:# and FADE._is():
  232. args.append(xfade)
  233. else:
  234. args[0] = xfade
  235. cmd = []
  236. jcmd = []
  237. if flash:
  238. pfx += "f"
  239. for row in data:
  240. jxcmd={}
  241. if type(value) is float:
  242. jxcmd["VALUE"] = value #round(value,3)
  243. else:
  244. jxcmd["VALUE"] = value
  245. jxcmd["args"] = []
  246. if fx:
  247. if value is not None:
  248. # z.b. flush off
  249. xcmd = str(value)+":"+row["FX"].split(":",1)[-1]
  250. jxcmd["FX"] = row["FX"].split(":",1)[-1]
  251. else:
  252. xcmd = row["FX"]
  253. jxcmd["FX"] = row["FX"]
  254. if row["FX2"]:
  255. jxcmd["FX2"] = row["FX2"]
  256. else:
  257. if row["VALUE"] is None:
  258. xcmd = ""
  259. else:
  260. if value is not None:
  261. if type(value) is float:
  262. xcmd = "{:0.4f}".format(value)
  263. else:
  264. xcmd = "{}".format(value)
  265. else:
  266. v=row["VALUE"]
  267. xcmd = "{:0.4f}".format(v)
  268. #cprint([v])
  269. if type(v) is float:
  270. jxcmd["VALUE"] = v #round(v,3)
  271. else:
  272. jxcmd["VALUE"] = v
  273. for arg in args:
  274. if type(arg) is float:
  275. xcmd += ":{:0.4f}".format(arg)
  276. jxcmd["args"].append(v)#round(arg,3))
  277. else:
  278. xcmd += ":{}".format(arg)
  279. jxcmd["args"].append(arg)#round(arg,3))
  280. #print( "pack: FIX",row["FIX"],row["ATTR"], xcmd)
  281. #xcmd += ":{}".format(row["ATTR"])
  282. v= xfade #FADE.val() #rxcmd["args"][0]
  283. if type( v ) is float:
  284. jxcmd["FADE"] = round(v,4)
  285. else:
  286. jxcmd["FADE"] = v
  287. #if ("VALUE" in jxcmd and jxcmd["VALUE"] is not None) or "FX" in jxcmd and jxcmd["FX"]:
  288. jcmd.append( jxcmd)
  289. cmd.append( xcmd)
  290. #if xcmd:
  291. # cprint("update_raw_dmx j",jxcmd,color="red")
  292. # cprint("update_raw_dmx x",xcmd,color="red")
  293. return cmd,jcmd
  294. def update_dmx(attr,data,value=None,args=None,flash=0,pfx=""):
  295. xfade = 0
  296. if not args:
  297. args=[]
  298. xfade = FADE.val()
  299. args.append(xfade)
  300. #global modes #BLIND
  301. #print("update_dmx",data)
  302. dmx = data["DMX"]
  303. dmx = (data["UNIVERS"]*512)+data["DMX"]
  304. val = None
  305. cmd=""
  306. try:
  307. if attr == "DIM" and data["ATTRIBUT"][attr]["NR"] < 0: #VDIM
  308. #print( "VDIM")
  309. for attr in data["ATTRIBUT"]:
  310. dmx = (data["UNIVERS"]*512) + data["DMX"]
  311. dmx = data["DMX"]
  312. if data["ATTRIBUT"][attr]["NR"] < 0: #virtual channels
  313. continue
  314. dmx += data["ATTRIBUT"][attr]["NR"]-1
  315. mode = ""
  316. if "MODE" in data["ATTRIBUT"][attr]:
  317. mode = data["ATTRIBUT"][attr]["MODE"]
  318. #print(attr)
  319. val = data["ATTRIBUT"][attr]["VALUE"]
  320. if data["ATTRIBUT"][attr]["MASTER"]:
  321. val = val * (data["ATTRIBUT"]["DIM"]["VALUE"] / 255.)
  322. if val is not None:
  323. #cmd += ",d{}:{:0.4f}".format(dmx,int(val))
  324. if value is not None:
  325. val = value
  326. if mode == "F": #FADE
  327. cmd += build_cmd(dmx,val,args=args,flash=flash,xpfx=pfx,attr=attr)
  328. else:
  329. cmd += build_cmd(dmx,val,args=[0],flash=flash,xpfx=pfx,attr=attr)
  330. #print("cmd",cmd)
  331. elif data["ATTRIBUT"][attr]["NR"] > 0:
  332. dmx += data["ATTRIBUT"][attr]["NR"]-1
  333. val = data["ATTRIBUT"][attr]["VALUE"]
  334. mode = ""
  335. if "MODE" in data["ATTRIBUT"][attr]:
  336. mode = data["ATTRIBUT"][attr]["MODE"]
  337. if data["ATTRIBUT"][attr]["MASTER"]:
  338. #if "VDIM" in data["ATTRIBUT"]:
  339. if "DIM" in data["ATTRIBUT"] and data["ATTRIBUT"]["DIM"]["NR"] < 0: #VDIM
  340. val = val * (data["ATTRIBUT"]["DIM"]["VALUE"] / 255.)
  341. if val is not None:
  342. #cmd += ",d{}:{}".format(dmx,int(val))
  343. if value is not None:
  344. val = value
  345. if mode == "F": #FADE
  346. cmd += build_cmd(dmx,val,args=args,flash=flash,xpfx=pfx,attr=attr)
  347. else:
  348. cmd += build_cmd(dmx,val,args=[0],flash=flash,xpfx=pfx,attr=attr)
  349. #print("cmd",cmd)
  350. if modes.val("BLIND"):
  351. cmd=""
  352. #cprint("update_dmx",cmd,color="red")
  353. return cmd
  354. except Exception as e:
  355. cprint("== cb EXCEPT",e,color="red")
  356. cprint("Error on line {}".format(sys.exc_info()[-1].tb_lineno),color="red")
  357. cprint(''.join(traceback.format_exception(None, e, e.__traceback__)),color="red")
  358. raise e
  359. class dummy_event():
  360. def __init__(self):
  361. self.num =0
  362. self.type = 4 #press 5 release
  363. self.set_value=-1
  364. gcolor = 1
  365. def cprint(*text,color="blue",space=" ",end="\n"):
  366. #return 0 #disable print dbg
  367. if not gcolor:
  368. print(text)
  369. return 0
  370. if color == "green":
  371. txt = '\033[92m'
  372. elif color == "red":
  373. txt = '\033[0;31m\033[1m'
  374. elif color == "yellow":
  375. txt = '\033[93m\033[1m'
  376. elif color == "cyan":
  377. txt = '\033[96m'
  378. else:
  379. txt = '\033[94m'
  380. for t in text:
  381. txt += str(t ) +" "
  382. #HEADER = '\033[95m'
  383. #OKBLUE = '\033[94m'
  384. #OKCYAN = '\033[96m'
  385. #OKGREEN = '\033[92m'
  386. #WARNING = '\033[93m'
  387. #FAIL = '\033[91m'
  388. #ENDC = '\033[0m'
  389. #BOLD = '\033[1m'
  390. #UNDERLINE = '\033[4m'
  391. txt += '\033[0m'
  392. print(txt,end=end)
  393. #return txt
  394. cprint("________________________________")
  395. class Xevent():
  396. """ global input event Handeler for short cut's ... etc
  397. """
  398. def __init__(self,fix,elem,attr=None,data=None,mode=None):
  399. self.fix = fix
  400. self.data=data
  401. self.attr = attr
  402. self.elem = elem
  403. self.mode = mode
  404. def fx(self,event):
  405. cprint("Xevent.fx",self.attr,self.fix,event)
  406. jdatas = []
  407. fx2 = {}
  408. if event.num == 4:
  409. cprint("FX:COLOR CHANGE",fx_prm,color="red")
  410. txt = "FX:RED"
  411. fx_prm["MODE"] += 1
  412. if fx_prm["MODE"] > len(fx_modes):
  413. fx_prm["MODE"]=0
  414. txt = "FX:\n"+fx_modes[fx_prm["MODE"]]
  415. master.elem_fx_commands["FX:RED"]["text"] = txt
  416. elif event.num == 5:
  417. cprint("FX:COLOR CHANGE",fx_prm,color="red")
  418. txt = "FX:RED"
  419. fx_prm["MODE"] -= 1
  420. if fx_prm["MODE"] < 0:
  421. fx_prm["MODE"]= len(fx_modes)-1
  422. txt = "FX:\n"+fx_modes[fx_prm["MODE"]]
  423. master.elem_fx_commands["FX:RED"]["text"] = txt
  424. elif event.num == 1:
  425. offset = 0
  426. start = fx_prm["START"]
  427. base = fx_prm["BASE"]
  428. xfixtures = []
  429. fix_active =FIXTURES.get_active()
  430. for fix in fix_active:
  431. if fix == "CFG":
  432. continue
  433. xfixtures.append(fix)
  434. x=0
  435. if not xfixtures:
  436. cprint("470 fx() ... init no fixture selected",color="red")
  437. return 0
  438. wings = []
  439. l = len(xfixtures)
  440. if fx_prm["WING"] and l > 1:
  441. w = l // fx_prm["WING"]
  442. teiler = l//w
  443. if teiler < 2:
  444. teiler = 2
  445. for i in range(teiler):
  446. j = i*w
  447. wing = xfixtures[j:j+w]
  448. if i%2==0:
  449. wing = wing[::-1]
  450. print("wing",i,"j",j,"w",w,"wing",wing)
  451. wings.append(wing)
  452. if l > j+w:
  453. wing = xfixtures[j+w:]
  454. wings.append(wing)
  455. else:
  456. wings.append(xfixtures)
  457. for wing in wings:
  458. wlen = len(wing)
  459. coffset= 0 # 1024/wlen * (offset/255)
  460. for fix in wing:
  461. data = FIXTURES.fixtures[fix]
  462. for attr in data["ATTRIBUT"]:
  463. jdata = {"MODE":"FX"}
  464. jdata["VALUE"] = None
  465. jdata["FIX"] = fix
  466. jdata["DMX"] = FIXTURES.get_dmx(fix,attr)
  467. jdata["ATTR"] =attr
  468. if attr.endswith("-FINE"):
  469. continue
  470. csize = fx_prm["SIZE"]
  471. cspeed = fx_prm["SPEED"]
  472. cstart = fx_prm["START"]
  473. cbase = fx_prm["BASE"]
  474. width = fx_prm["WIDTH"]
  475. invert = fx_prm["INVERT"]
  476. coffset= round(offset,1)
  477. fx=""
  478. if "SIN" in self.attr:
  479. fx = "sinus"
  480. elif "FD" in self.attr:
  481. fx = "fade"
  482. elif "RND" in self.attr:
  483. fx = "rnd"
  484. elif "ON" in self.attr:
  485. fx = "on"
  486. elif "BUM2" in self.attr:
  487. fx = "bump2"
  488. elif "BUM" in self.attr:
  489. fx = "bump"
  490. elif "COS" in self.attr:
  491. fx = "cosinus"
  492. if fx:
  493. if fx_prm["SPEED"] < 0:
  494. fx = "off"
  495. else:
  496. if ":DIM" in self.attr:
  497. base=""
  498. ffxb= fx_mo[fx_prm["MO"]]
  499. if attr == "DIM":
  500. if fx_prm["SPEED"] < 0:
  501. fx = "off"
  502. else:
  503. fx = ffxb #"fade"
  504. elif ":TILT" in self.attr:
  505. base=""
  506. if attr == "PAN":
  507. fx = "off"
  508. if attr == "TILT":
  509. if fx_prm["SPEED"] < 0:
  510. fx = "off"
  511. else:
  512. fx = "sinus"
  513. elif ":PAN" in self.attr:
  514. base=""
  515. if attr == "PAN":
  516. if fx_prm["SPEED"] < 0:
  517. fx = "off"
  518. else:
  519. fx = "cosinus"
  520. if attr == "TILT":
  521. fx = "off"
  522. elif ":CIR" in self.attr:
  523. base=""
  524. if attr == "PAN":
  525. if fx_prm["SPEED"] < 0:
  526. fx = "off"
  527. else:
  528. fx = "cosinus"
  529. if attr == "TILT":
  530. if fx_prm["SPEED"] < 0:
  531. fx = "off"
  532. else:
  533. fx = "sinus"
  534. elif ":RED" in self.attr:
  535. ffxb= fx_mo[fx_prm["MO"]]
  536. ffx= "off" #fx_mo[fx_prm["MO"]]
  537. if "RED" in fx_modes[fx_prm["MODE"]]:#
  538. base="-"
  539. if attr == "RED":
  540. fx=ffx
  541. if attr == "GREEN":
  542. fx = ffxb# "off"
  543. if attr == "BLUE":
  544. fx = ffxb#"off"
  545. elif "GREEN" in fx_modes[fx_prm["MODE"]]:#fx_prm["MODE"]:#in self.attr:
  546. base="-"
  547. if attr == "RED":
  548. fx = ffxb#"off"
  549. elif "GREEN" in fx_modes[fx_prm["MODE"]]:#fx_prm["MODE"]:#in self.attr:
  550. if attr == "GREEN":
  551. fx = ffxb# "off"
  552. fx=ffx
  553. if attr == "BLUE":
  554. fx = ffxb#"off"
  555. elif "BLUE" in fx_modes[fx_prm["MODE"]]:#fx_prm["MODE"]:#self.attr:
  556. base="-"
  557. if attr == "RED":
  558. fx = ffxb# "off"
  559. if attr == "GREEN":
  560. fx = ffxb# "off"
  561. if attr == "BLUE":
  562. fx = ffxb# "off"
  563. fx=ffx
  564. elif "YELLOW" in fx_modes[fx_prm["MODE"]]:#fx_prm["MODE"]:#self.attr:
  565. base="-"
  566. if attr == "RED":
  567. fx = ffxb# "off"
  568. fx=ffx
  569. if attr == "GREEN":
  570. fx = ffxb# "off"
  571. fx=ffx
  572. if attr == "BLUE":
  573. fx = "off"
  574. elif "CYAN" in fx_modes[fx_prm["MODE"]]:#fx_prm["MODE"]:#self.attr:
  575. base="-"
  576. if attr == "RED":
  577. fx = ffxb# "off"
  578. if attr == "GREEN":
  579. fx = ffxb# "off"
  580. fx=ffx
  581. if attr == "BLUE":
  582. fx = ffxb# "off"
  583. fx=ffx
  584. elif "MAG" in fx_modes[fx_prm["MODE"]]:#fx_prm["MODE"]:#self.attr:
  585. base="-"
  586. if attr == "RED":
  587. fx = ffxb# "off"
  588. fx=ffx
  589. if attr == "GREEN":
  590. fx = ffxb# "off"
  591. if attr == "BLUE":
  592. fx = ffxb# "off"
  593. fx=ffx
  594. else:
  595. cprint("FX: unbekant",fx_modes[fx_prm["MODE"]],color="red")
  596. fxtype = fx
  597. fxtype = fx
  598. if "FX" not in data["ATTRIBUT"][attr]:
  599. data["ATTRIBUT"][attr]["FX"] =""
  600. if "FX2" not in data["ATTRIBUT"][attr]:
  601. data["ATTRIBUT"][attr]["FX2"] ={}
  602. if data["ATTRIBUT"][attr]["ACTIVE"] and fxtype:
  603. #print("++ADD FX",fix,attr,fx)
  604. #data["ATTRIBUT"][attr]["FX"] = fx #"sinus:40:100:10"
  605. fjdata = {}
  606. if cspeed < 0.1:
  607. fjdata["TYPE"] = "off"
  608. else:
  609. fjdata["TYPE"] = fxtype
  610. fjdata["SIZE"] = round(csize,2)
  611. fjdata["SPEED"] = round(cspeed,2)
  612. fjdata["WIDTH"] = int(width)
  613. fjdata["START"] = cstart
  614. fjdata["OFFSET"]= round(coffset,2)
  615. fjdata["INVERT"]= int(invert)
  616. fjdata["BASE"] = cbase
  617. jdata["FX2"] = fjdata
  618. data["ATTRIBUT"][attr]["FX2"] = fjdata
  619. jdatas.append(jdata)
  620. if fx_prm["OFFSET"] > 0.5: # and
  621. aoffset = (100/wlen) * (fx_prm["OFFSET"]/100)
  622. if fx_prm["DIR"] <= 0:
  623. offset -= aoffset
  624. else:
  625. offset += aoffset
  626. offset = round(offset,2)
  627. if jdatas and not modes.val("BLIND"):
  628. jclient_send(jdatas)
  629. master.refresh_fix()
  630. def setup(self,event):
  631. cprint("xevent.SETUP",[self.mode,self.attr],color="red")
  632. if self.mode == "SETUP":
  633. if self.attr == "BACKUP\nSHOW":
  634. self.elem["bg"] = "orange"
  635. self.elem["text"] = "SAVING..."
  636. tkinter.Tk.update_idletasks(gui_menu_gui.tk)
  637. #self.elem["fg"] = "orange"
  638. self.elem.config(activebackground="orange")
  639. modes.val(self.attr,1)
  640. PRESETS.backup_presets()
  641. FIXTURES.backup_patch()
  642. #time.sleep(1)
  643. #modes.val(self.attr,0)
  644. self.elem["bg"] = "lightgrey"
  645. #self.elem["fg"] = "lightgrey"
  646. self.elem.config(activebackground="lightgrey")
  647. else:
  648. r=tkinter.messagebox.showwarning(message="{}\nnot implemented".format(self.attr.replace("\n"," ")),parent=None)
  649. return 1
  650. def fx_command(self,event):
  651. if self.mode == "FX":
  652. if self.attr.startswith("SZ:"):#SIN":
  653. #global fx_prm
  654. k = "SIZE"
  655. if event.num == 1:
  656. fx_prm[k] =30
  657. elif event.num == 3:
  658. fx_prm[k] =100
  659. elif event.num == 4:
  660. if fx_prm[k] <= 0:
  661. fx_prm[k] = 1
  662. fx_prm[k] +=5
  663. elif event.num == 5:
  664. fx_prm[k] -=5
  665. #fx_prm[k] =int(fx_prm[k])
  666. if fx_prm[k] > 4000:
  667. fx_prm[k] = 4000
  668. if fx_prm[k] < 0:
  669. fx_prm[k] =0
  670. if fx_prm[k] == 6: #bug
  671. fx_prm[k] =5
  672. self.data.elem_fx_commands[self.attr]["text"] = "SZ:\n{:0.0f}".format(fx_prm[k])
  673. cprint(fx_prm)
  674. elif self.attr.startswith("SP:"):#SIN":
  675. #global fx_prm
  676. k = "SPEED"
  677. if event.num == 1:
  678. fx_prm[k] = 6
  679. elif event.num == 3:
  680. fx_prm[k] = 60
  681. elif event.num == 4:
  682. if fx_prm[k] <= 0:
  683. fx_prm[k] = 0.06
  684. elif fx_prm[k] < 5:
  685. fx_prm[k] *=1.2
  686. else:
  687. fx_prm[k] +=5 #1.1
  688. elif event.num == 5:
  689. if fx_prm[k] <= 5:
  690. fx_prm[k] *=0.8
  691. else:
  692. fx_prm[k] -= 5 #1.1
  693. #fx_prm[k] =int(fx_prm[k])
  694. if fx_prm[k] > 4000:
  695. fx_prm[k] = 4000
  696. if fx_prm[k] < 0.05:
  697. fx_prm[k] =0
  698. if fx_prm[k] > 5 and fx_prm[k] < 10: #bug
  699. fx_prm[k] =5
  700. if fx_prm[k] < 0:
  701. self.data.elem_fx_commands[self.attr]["text"] = "SP:\noff".format(fx_prm[k])
  702. else:
  703. self.data.elem_fx_commands[self.attr]["text"] = "SP:\n{:0.02f}".format(fx_prm[k])
  704. cprint(fx_prm)
  705. elif self.attr.startswith("ST:"):#SIN":
  706. #global fx_prm
  707. k = "START"
  708. if event.num == 1:
  709. pass
  710. elif event.num == 2:
  711. pass
  712. elif event.num == 4:
  713. if fx_prm[k] <= 0:
  714. fx_prm[k] = 1
  715. fx_prm[k] += 5 #1.1
  716. elif event.num == 5:
  717. fx_prm[k] -= 5 #1.1
  718. #fx_prm[k] =int(fx_prm[k])
  719. if fx_prm[k] > 4000:
  720. fx_prm[k] = 4000
  721. if fx_prm[k] < 5:
  722. fx_prm[k] =0
  723. if fx_prm[k] == 6: #bug
  724. fx_prm[k] =5
  725. self.data.elem_fx_commands[self.attr]["text"] = "ST:\n{:0.0f}".format(fx_prm[k])
  726. cprint(fx_prm)
  727. elif self.attr.startswith("MO:"):# on,sinus,bump
  728. #global fx_prm
  729. k = "MO"
  730. if event.num == 1:
  731. pass
  732. elif event.num == 2:
  733. pass
  734. elif event.num == 4:
  735. fx_prm[k] -=1
  736. if fx_prm[k] < 0:
  737. fx_prm[k] = len(fx_mo)-1
  738. elif event.num == 5:
  739. fx_prm[k] +=1
  740. if fx_prm[k] >= len(fx_mo):
  741. fx_prm[k] = 0
  742. txt = fx_mo[fx_prm[k]]
  743. self.data.elem_fx_commands[self.attr]["text"] = "MO:\n{}".format(txt)
  744. cprint(fx_prm)
  745. elif self.attr.startswith("WIDTH:"):#SIN":
  746. #global fx_prm
  747. k = "WIDTH"
  748. if event.num == 1:
  749. fx_prm[k] = 25
  750. elif event.num == 2:
  751. fx_prm[k] = 50
  752. elif event.num == 3:
  753. fx_prm[k] = 100
  754. elif event.num == 4:
  755. if fx_prm[k] <= 0:
  756. fx_prm[k] = 1
  757. elif fx_prm[k] == 50:
  758. fx_prm[k] = 100
  759. elif fx_prm[k] == 5:
  760. fx_prm[k] = 25
  761. elif fx_prm[k] == 25:
  762. fx_prm[k] = 50
  763. else:
  764. fx_prm[k] += 5 #*=1.1
  765. elif event.num == 5:
  766. if fx_prm[k] == 50:
  767. fx_prm[k] = 25
  768. elif fx_prm[k] == 100:
  769. fx_prm[k] = 50
  770. else:
  771. fx_prm[k] -=5 #/=1.1
  772. #fx_prm[k] =int(fx_prm[k])
  773. if fx_prm[k] < 0:
  774. fx_prm[k] = 0
  775. if fx_prm[k] > 100:
  776. fx_prm[k] = 100
  777. if fx_prm[k] == 6: #bug
  778. fx_prm[k] =5
  779. if fx_prm[k] > 25 and fx_prm[k] < 50: #bug
  780. fx_prm[k] =50
  781. if fx_prm[k] > 50 and fx_prm[k] < 100: #bug
  782. fx_prm[k] =100
  783. self.data.elem_fx_commands[self.attr]["text"] = "WIDTH:\n{:0.0f}".format(fx_prm[k])
  784. cprint(fx_prm)
  785. elif self.attr.startswith("DIR:"):#SIN":
  786. #global fx_prm
  787. k = "DIR"
  788. if event.num == 1:
  789. fx_prm[k] = 1
  790. elif event.num == 3:
  791. fx_prm[k] = -1
  792. elif event.num == 4:
  793. fx_prm[k] = 1
  794. elif event.num == 5:
  795. fx_prm[k] =-1
  796. txt = fx_prm[k]
  797. self.data.elem_fx_commands[self.attr]["text"] = "DIR:\n{}".format(fx_prm[k])
  798. cprint(fx_prm)
  799. elif self.attr.startswith("INVERT:"):#SIN":
  800. #global fx_prm
  801. k = "INVERT"
  802. if event.num == 1:
  803. fx_prm[k] = 0
  804. elif event.num == 3:
  805. fx_prm[k] = 1
  806. elif event.num == 4:
  807. fx_prm[k] = 1
  808. elif event.num == 5:
  809. fx_prm[k] =0
  810. if fx_prm[k] == 6: #bug ?
  811. fx_prm[k] =5
  812. self.data.elem_fx_commands[self.attr]["text"] = k+":\n{}".format(fx_prm[k])
  813. cprint(fx_prm)
  814. elif self.attr.startswith("WING:"):#SIN":
  815. #global fx_prm
  816. k = "WING"
  817. if event.num == 1:
  818. fx_prm[k] = 1
  819. elif event.num == 3:
  820. fx_prm[k] = 2
  821. elif event.num == 4:
  822. fx_prm[k] += 1
  823. elif event.num == 5:
  824. fx_prm[k] -=1
  825. if fx_prm[k] > 100:
  826. fx_prm[k] = 100
  827. if fx_prm[k] < 1:
  828. fx_prm[k] =1
  829. txt = fx_prm[k]
  830. self.data.elem_fx_commands[self.attr]["text"] = "WING:\n{}".format(fx_prm[k])
  831. cprint(fx_prm)
  832. elif self.attr.startswith("OF:"):#SIN":
  833. #global fx_prm
  834. k = "OFFSET"
  835. if event.num == 1:
  836. fx_prm[k] = 50
  837. elif event.num == 2:
  838. fx_prm[k] *= 2
  839. elif event.num == 3:
  840. fx_prm[k] = 100
  841. elif event.num == 4:
  842. if fx_prm[k] <= 0:
  843. fx_prm[k] = 1
  844. fx_prm[k] +=5 #*=1.1
  845. elif event.num == 5:
  846. fx_prm[k] -=5 #/=1.1
  847. #fx_prm[k] =int(fx_prm[k])
  848. #if fx_prm[k] > 512:
  849. # fx_prm[k] = 512
  850. if fx_prm[k] < 5:
  851. fx_prm[k] =0
  852. if fx_prm[k] == 6: #bug
  853. fx_prm[k] =5
  854. self.data.elem_fx_commands[self.attr]["text"] = "OF:\n{:0.0f}".format(fx_prm[k])
  855. cprint(fx_prm)
  856. elif self.attr.startswith("BS:"):
  857. k = "BASE"
  858. if event.num == 1:
  859. fx_prm[k] = "-"
  860. elif event.num == 3:
  861. fx_prm[k] = "0"
  862. elif event.num == 4:
  863. fx_prm[k] = "+"
  864. elif event.num == 5:
  865. fx_prm[k] = "0"
  866. self.data.elem_fx_commands[self.attr]["text"] = "BS:\n{}".format(fx_prm[k])
  867. elif self.attr.startswith("FX:"):#SIN":
  868. self.fx(event)
  869. elif self.attr == "FX OFF":
  870. if event.num == 1:
  871. FIXTURES.fx_off("all")
  872. CONSOLE.fx_off("all")
  873. CONSOLE.flash_off("all")
  874. master.refresh_fix()
  875. return 0
  876. #if event.num == 1:
  877. elif self.attr == "REC-FX":
  878. print("ELSE",self.attr)
  879. modes.val(self.attr,1)
  880. return 0
  881. def live(self,event):
  882. if self.mode == "LIVE":
  883. if self.attr == "FADE":
  884. fade = FADE.val()
  885. print("EVENT CHANGE FADE",fade)
  886. if fade < 0.01:
  887. FADE.val(0.01)
  888. elif fade > 100.0:
  889. fade = 100
  890. if event.num == 4:
  891. fade *= 1.1
  892. elif event.num == 5:
  893. fade /= 1.1
  894. elif event.num == 1:
  895. if FADE._is():
  896. FADE.off()# = 0
  897. self.data.elem_commands[self.attr]["bg"] = "grey"
  898. else:
  899. FADE.on()# = 1
  900. self.data.elem_commands[self.attr]["bg"] = "green"
  901. elif event.num == 2:
  902. if fade > 1 and fade < 4:
  903. fade = 4
  904. elif fade > 3 and fade < 6:
  905. fade = 6
  906. elif fade > 5 and fade < 7:
  907. fade = 8
  908. elif fade > 7 and fade < 9:
  909. fade = 10
  910. elif fade > 9:
  911. fade = 0.01
  912. elif fade < 1:
  913. fade = 1.1
  914. fade = round(fade,3)
  915. FADE.val(fade)
  916. self.data.elem_commands[self.attr]["text"] = "Fade{:0.2f}".format(fade)
  917. self.elem.config(activebackground="lightgreen")
  918. def command(self,event):
  919. if self.mode == "COMMAND":
  920. if self.attr == "CLEAR":
  921. if event.num == 1:
  922. ok = FIXTURES.clear()
  923. if ok:
  924. master.refresh_fix()
  925. modes.val(self.attr,0)
  926. elif self.attr == "BACKUP":
  927. modes.val(self.attr,1)
  928. PRESETS.backup_presets()
  929. FIXTURES.backup_patch()
  930. #time.sleep(1)
  931. modes.val(self.attr,0)
  932. else:
  933. if event.num == 1:
  934. print("ELSE",self.attr)
  935. modes.val(self.attr,1)
  936. return 0
  937. def encoder(self,event):
  938. if self.mode == "ENCODER":
  939. cprint("ENC",self.fix,self.attr,self.mode)
  940. cprint(self.data)
  941. val=""
  942. if event.num == 1:
  943. val ="click"
  944. elif event.num == 4:
  945. val ="+"
  946. elif event.num == 5:
  947. val ="-"
  948. if val:
  949. if self.attr == "DIM" and self.fix == 0 and val == "click":
  950. pass
  951. else:
  952. FIXTURES.encoder(fix=self.fix,attr=self.attr,xval=val)
  953. master.refresh_fix()
  954. def cb(self,event):
  955. cprint("EVENT cb",self.attr,self.mode,event,color='yellow')
  956. print(["type",event.type,"num",event.num])
  957. try:
  958. change = 0
  959. if "keysym" in dir(event):
  960. if "Escape" == event.keysym:
  961. ok = FIXTURES.clear()
  962. master.refresh_fix()
  963. return 0
  964. if self.mode == "SETUP":
  965. self.setup(event)
  966. elif self.mode == "COMMAND":
  967. self.command(event)
  968. elif self.mode == "LIVE":
  969. self.live(event)
  970. elif self.mode == "ENCODER":
  971. self.encoder(event)
  972. elif self.mode == "FX":
  973. self.fx_command(event)
  974. elif self.mode == "ROOT":
  975. if event.keysym=="Escape":
  976. pass
  977. elif self.mode == "INPUT":
  978. print("INP",self.data.entry.get())
  979. if event.keycode == 36:
  980. x=self.data.entry.get()
  981. #client.send(x)
  982. elif self.mode == "INPUT2":
  983. print("INP2",self.data.entry2.get())
  984. if event.keycode == 36:
  985. x=self.data.entry2.get()
  986. #client.send(x)
  987. elif self.mode == "INPUT3":
  988. print("INP3",self.data.entry3.get())
  989. if event.keycode == 36:
  990. x=self.data.entry3.get()
  991. #client.send(x)
  992. elif self.mode == "PRESET":
  993. nr = self.attr #int(self.attr.split(":")[1])-1
  994. if event.num == 1:
  995. if str(event.type) == '4': #4 ButtonPress
  996. if modes.val("REC"):
  997. self.data.preset_rec(nr)
  998. modes.val("REC",0)
  999. elif modes.val("DEL"):
  1000. ok=PRESETS.delete(nr)
  1001. if ok:
  1002. modes.val("DEL",0)
  1003. master.refresh_exec()
  1004. elif modes.val("COPY"):
  1005. ok=PRESETS.copy(nr)
  1006. if ok:
  1007. modes.val("COPY",0)
  1008. master.refresh_exec()
  1009. elif modes.val("MOVE"):
  1010. ok=PRESETS.move(nr)
  1011. if ok:
  1012. #modes.val("MOVE",0) # keep MOVE on
  1013. master.refresh_exec()
  1014. elif modes.val("CFG-BTN"):
  1015. master.btn_cfg(nr)
  1016. elif modes.val("LABEL"):#else:
  1017. master.label(nr)
  1018. elif modes.val("EDIT"):
  1019. FIXTURES.clear()
  1020. self.data.preset_select(nr)
  1021. self.data.preset_go(nr,xfade=0,event=event,val=255,button="go")
  1022. modes.val("EDIT", 0)
  1023. master.refresh_fix()
  1024. elif modes.val("SELECT"):
  1025. self.data.preset_select(nr)
  1026. else:
  1027. self.data.preset_go(nr,event=event,val=255)
  1028. else:
  1029. self.data.preset_go(nr,xfade=0,event=event,val=0)
  1030. if event.num == 3:
  1031. if not modes.val("REC"):
  1032. self.data.preset_go(nr,xfade=0,event=event,val=255)
  1033. return 0
  1034. elif self.mode == "INPUT":
  1035. return 0
  1036. except Exception as e:
  1037. cprint("== cb EXCEPT",e,color="red")
  1038. cprint("Error on line {}".format(sys.exc_info()[-1].tb_lineno),color="red")
  1039. cprint(''.join(traceback.format_exception(None, e, e.__traceback__)),color="red")
  1040. return 1
  1041. def wheel(event,d=None):
  1042. print("wheel",event,d)
  1043. import copy
  1044. class Element():
  1045. def __init__(self):
  1046. self.__data = {}
  1047. def set(self,key,val):
  1048. self.__data[key] = val
  1049. class Base():
  1050. def __init__(self):
  1051. show_name = "GloryCamp2021"
  1052. #show_name = "JMS"
  1053. show_name = "DemoShow"
  1054. #show_name = "Dimmer"
  1055. self.home = os.environ['HOME']
  1056. self.show_path = self.home +"/LibreLight/"
  1057. try:
  1058. f = open(self.show_path+"init.txt","r")
  1059. for line in f.readlines():
  1060. cprint(line)
  1061. if not line.startswith("#"):
  1062. show_name = line.strip()
  1063. show_name = show_name.replace(".","")
  1064. show_name = show_name.replace("\\","")
  1065. show_name = show_name.replace("/","")
  1066. except Exception as e:
  1067. cprint("shownamw exception",color="red")
  1068. if not os.path.isdir(self.show_path):
  1069. os.mkdir(self.show_path)
  1070. self.show_path += "/show/"
  1071. if not os.path.isdir(self.show_path):
  1072. os.mkdir(self.show_path)
  1073. self.show_path += "/" +show_name +"/"
  1074. if not os.path.isdir(self.show_path):
  1075. os.mkdir(self.show_path)
  1076. pass
  1077. def _load(self,filename):
  1078. xfname = self.show_path+"/"+str(filename)+".sav"
  1079. print("load",xfname)
  1080. f = open(xfname,"r")
  1081. lines = f.readlines()
  1082. f.close()
  1083. data = OrderedDict()
  1084. labels = OrderedDict()
  1085. for line in lines:
  1086. key,label,rdata = line.split("\t",2)
  1087. key = int(key)
  1088. #print(xfname,"load",key,label)
  1089. #print(line)
  1090. jdata = json.loads(rdata,object_pairs_hook=OrderedDict)
  1091. nrnull = 0
  1092. print(jdata)
  1093. #if "ATTRIBUT" in jdata: # translate old FIXTURES.fixtures start with 0 to 1
  1094. # for attr in jdata["ATTRIBUT"]:
  1095. # row = jdata["ATTRIBUT"][attr]
  1096. # if type(row) is OrderedDict:
  1097. # #print(row)
  1098. # if "VALUE" in row:
  1099. # v = row["VALUE"]
  1100. # if type(v) is float:
  1101. # v = round(v,4)
  1102. # jdata["ATTRIBUT"][attr]["VALUE"] = round(v,4)
  1103. # print("preset v",key,label,attr,v)
  1104. if "ATTRIBUT" in jdata: # translate old FIXTURES.fixtures start with 0 to 1
  1105. for attr in jdata["ATTRIBUT"]:
  1106. pass
  1107. #if "VALUE" in jdata["ATTRIBUT"][attr]:
  1108. # v = jdata["ATTRIBUT"][attr]["VALUE"]
  1109. # if type(v) is float:
  1110. # jdata["ATTRIBUT"][attr]["VALUE"] = round(v,4)
  1111. # #print("fix v",attr,v)
  1112. #if "NR" in jdata["ATTRIBUT"][attr]:
  1113. # nr = jdata["ATTRIBUT"][attr]["NR"]
  1114. # if nr == 0:
  1115. # nrnull = 1
  1116. # break
  1117. if nrnull:
  1118. print("DMX NR IS NULL",attr,"CHANGE +1")
  1119. for attr in jdata["ATTRIBUT"]:
  1120. if "NR" in jdata["ATTRIBUT"][attr]:
  1121. nr = jdata["ATTRIBUT"][attr]["NR"]
  1122. if nr >= 0:
  1123. jdata["ATTRIBUT"][attr]["NR"] +=1
  1124. data[key] = jdata
  1125. labels[key] = label
  1126. return data,labels
  1127. def _backup(self,filename,data,labels):
  1128. #fixture
  1129. #xfname = "show/"+show_name+"/"+str(filename)+".sav"
  1130. xfname = self.show_path+"/"+str(filename)+".sav"
  1131. print("backup",xfname)
  1132. f = open(xfname,"w")
  1133. for key in data:
  1134. line = data[key]
  1135. #print(line)
  1136. label = "label"
  1137. if key in labels:
  1138. label = labels[key]
  1139. if label == "Name-"+str(key):
  1140. label = ""
  1141. #print(xfname,"load",key,label,len(line))
  1142. f.write( "{}\t{}\t{}\n".format( key,label,json.dumps(line) ) )
  1143. f.close()
  1144. class Event():
  1145. def __init__(self,name):
  1146. self.name=name
  1147. #print("init",self)
  1148. def event(self,event):
  1149. print(self.name,event)
  1150. class scroll():
  1151. def __init__(self,canvas):
  1152. self.canvas=canvas
  1153. def config(self,event):
  1154. canvas = self.canvas
  1155. canvas.configure(scrollregion=canvas.bbox("all"))#,width=400,height=200)
  1156. def hex_to_rgb(hex):
  1157. return tuple(int(hex[i:i+2], 16) for i in (0, 2, 4))
  1158. class cb():
  1159. def __init__(self,win):
  1160. self.win = win
  1161. def _callback(self,event):
  1162. clobj=event.widget
  1163. ## undermouse=find_withtag(master.CURRENT)
  1164. undermouse=self.win.find_closest(self.win.CURRENT)
  1165. print( repr(undermouse))
  1166. def callback(self,event):
  1167. print(__file__,self,"callback",event)
  1168. cnv = self.win
  1169. item = cnv.find_closest(cnv.canvasx(event.x), cnv.canvasy(event.y))[0]
  1170. tags = cnv.gettags(item)
  1171. #cnv.itemconfigure(self.tag, text=tags[0])
  1172. print(tags,item)
  1173. color = cnv.itemcget(item, "fill")
  1174. cnv.itemconfig("all", width=1)#filla="green")
  1175. cnv.itemconfig(item, width=3)#filla="green")
  1176. print(color)
  1177. print( hex_to_rgb(color[1:]))
  1178. class MiniButton:
  1179. def __init__(self,root,width=72,height=38,text="button"):
  1180. self.text=text
  1181. self.rb = tk.Frame(root, highlightbackground = "lightgrey", highlightthickness = 1, bd=0)
  1182. self.bb = tk.Canvas(self.rb, highlightbackground = "black", highlightthickness = 1, bd=1,relief=tk.RAISED)
  1183. self.bb.configure(width=width, height=height)
  1184. #txt=str(k+1)+":"+str(BTN)+":"+str(len(sdata)-1)+"\n"+label
  1185. #self.b = tk.Button(self.bb,bg="grey", text=text,width=7,height=2)
  1186. #self.b = tk.Button(self.bb,bg="grey", text=text,width=7,height=2)
  1187. #bb.bind("<Button>",Xevent(fix=0,elem=b,attr=k,data=self,mode="PRESET").cb)
  1188. #bb.bind("<ButtonRelease>",Xevent(fix=0,elem=b,attr=k,data=self,mode="PRESET").cb)
  1189. def _label(self,text="1\n2\n3\n"):
  1190. z = 0
  1191. self.bb.delete("label")
  1192. txt2 = text
  1193. try:
  1194. text = text.split("\n")[1]
  1195. except:pass
  1196. if "grün" in text.lower() or "green" in text.lower():
  1197. self.l = self.bb.create_rectangle(10,27,20,37,fill="green",tag="label")
  1198. elif "blau" in text.lower() or "blue" in text.lower():
  1199. self.l = self.bb.create_rectangle(10,27,20,37,fill="blue",tag="label")
  1200. elif "rot" in text.lower() or "red" in text.lower():
  1201. self.l = self.bb.create_rectangle(10,27,20,37,fill="red",tag="label")
  1202. elif "orange" in text.lower():# or "yellow" in text.lower():
  1203. self.l = self.bb.create_rectangle(10,27,20,37,fill="orange",tag="label")
  1204. elif "weiß" in text.lower() or "white" in text.lower():
  1205. self.l = self.bb.create_rectangle(10,27,20,37,fill="white",tag="label")
  1206. elif "cyan" in text.lower():# or "yellow" in text.lower():
  1207. self.l = self.bb.create_rectangle(10,27,20,37,fill="cyan",tag="label")
  1208. elif "gelb" in text.lower() or "yellow" in text.lower():
  1209. self.l = self.bb.create_rectangle(10,27,20,37,fill="yellow",tag="label")
  1210. elif "mage" in text.lower() or "mage" in text.lower():
  1211. self.l = self.bb.create_rectangle(10,27,20,37,fill="magenta",tag="label")
  1212. if "nebel" in text.lower() or "smoke" in text.lower() or "haze" in text.lower():
  1213. self.l = self.bb.create_rectangle(10,27,60,37,fill="white",tag="label")
  1214. if "mh " in text.lower() or " mh" in text.lower() :
  1215. self.l = self.bb.create_rectangle(30,27,35,32,fill="black",tag="label")
  1216. self.l = self.bb.create_rectangle(28,34,37,37,fill="black",tag="label")
  1217. if "off" in text.lower():
  1218. self.l = self.bb.create_rectangle(50,30,55,35,fill="black",tag="label")
  1219. if "dim" in text.lower() or "front" in text.lower() or "on" in text.lower():
  1220. #self.l = self.bb.create_line(56,30,60,28,fill="black",tag="label")
  1221. self.l = self.bb.create_rectangle(50,30,55,35,fill="white",tag="label")
  1222. #self.l = self.bb.create_line(56,36,58,36,fill="black",tag="label")
  1223. if "circle" in text.lower():
  1224. self.l = self.bb.create_oval(30,27,40,37,fill="",tag="label")
  1225. if "pan" in text.lower():
  1226. self.l = self.bb.create_line(20,34 ,45,34,fill="black",arrow=tk.BOTH,tag="label")
  1227. if "tilt" in text.lower():
  1228. self.l = self.bb.create_line(30,25 ,30,43,fill="black",arrow=tk.BOTH,tag="label")
  1229. text = txt2
  1230. for t in text.split("\n"):
  1231. #print(t)
  1232. self.l = self.bb.create_text(37,z*10+9,text=t,anchor="c",tag="label")
  1233. z+=1
  1234. def configure(self,**args):
  1235. if "text" in args:
  1236. self.text = args["text"]
  1237. self._label(self.text)
  1238. if "bg" in args:
  1239. #print(dir(self.bb))
  1240. self.bb.configure(bg=args["bg"])
  1241. def config(self,**args):
  1242. self.configure(**args)
  1243. def bind(self,etype="<Button>",cb=None):
  1244. #bb.bind("<Button>",Xevent(fix=0,elem=b,attr=k,data=self,mode="PRESET").cb)
  1245. #bb.bind("<ButtonRelease>",Xevent(fix=0,elem=b,attr=k,data=self,mode="PRESET").cb)
  1246. if cb:
  1247. self.bb.bind(etype,cb)
  1248. def grid(self,row=0, column=0, sticky=""):
  1249. self.bb.pack() #(row=row, column=column, sticky=sticky)
  1250. self.rb.grid(row=row, column=column, sticky=sticky)
  1251. class GUI(Base):
  1252. def __init__(self):
  1253. super().__init__()
  1254. self.load()
  1255. self._XX = 0
  1256. self.all_attr =["DIM","PAN","TILT"]
  1257. self.elem_attr = {}
  1258. self.fx_commands =["REC-FX","FX OFF","\n"
  1259. ,"FX:CIR","FX:PAN","FX:TILT","MO:ON""\n"
  1260. ,"MSZ:","MSP:","MST:","MOF:","MBS:-","\n"
  1261. ,"FX:DIM","FX:\nRED", "WIDTH:\n25","DIR:\n1","INVERT:\n0","WING:\n2","\n"
  1262. ,"SZ:\n","SP:\n","ST:\n","OF:\n","BS:\n-","\n"
  1263. , "FX:SIN","FX:COS","FX:BUM","FX:BUM2","FX:FD","FX:ON","FX:RND" ]
  1264. self.commands =["\n","ESC","CFG-BTN","LABEL","-","DEL","\n"
  1265. ,"SELECT","FLASH","GO","-","MOVE","\n"
  1266. ,"BLIND","CLEAR","REC","EDIT","COPY","\n"
  1267. ]
  1268. self.elem_fx_commands = {}
  1269. self.val_fx_commands = {}
  1270. self.elem_commands = {}
  1271. self.val_commands = {}
  1272. self.elem_presets = {}
  1273. for i in range(8*8*8):
  1274. if i not in PRESETS.val_presets:
  1275. name = "Preset:"+str(i+1)+":\nXYZ"
  1276. #self.presets[i] = [i]
  1277. PRESETS.val_presets[i] = OrderedDict() # FIX
  1278. PRESETS.val_presets[i]["CFG"] = OrderedDict() # CONFIG
  1279. PRESETS.label_presets[i] = "-"
  1280. modes.set_cb(self.xcb)
  1281. def button_refresh(self,name,color,color2=None,text="",fg=None):
  1282. cprint("button_refresh",name,color)
  1283. #if color == "gold":
  1284. # color2 = "yellow"
  1285. if color2 is None:
  1286. color2 = color
  1287. if text:
  1288. text = "\n"+str(text)
  1289. if name in self.elem_commands:
  1290. self.elem_commands[name]["bg"] = color
  1291. self.elem_commands[name]["text"] = name+ text
  1292. self.elem_commands[name].config(activebackground=color2)
  1293. if fg:
  1294. self.elem_commands[name]["fg"] = fg
  1295. #print(dir(self.elem_commands[name]))
  1296. elif name in self.elem_fx_commands:
  1297. #todo
  1298. self.elem_fx_commands[name]["bg"] = color
  1299. self.elem_fx_commands[name].config(activebackground=color2)
  1300. if fg:
  1301. self.elem_fx_commands[name]["fg"] = fg
  1302. #print(dir(self.elem_fx_commands[name]))
  1303. def btn_cfg(self,nr):
  1304. txt = PRESETS.btn_cfg(nr)
  1305. txt = tkinter.simpledialog.askstring("CFG-BTN","GO=GO FL=FLASH\nSEL=SELECT EXE:"+str(nr+1),initialvalue=txt)
  1306. if txt:
  1307. PRESETS.btn_cfg(nr,txt)
  1308. self.elem_presets[nr].configure(text= PRESETS.get_btn_txt(nr))
  1309. modes.val("CFG-BTN",0)
  1310. def label(self,nr):
  1311. txt = PRESETS.label(nr)
  1312. txt = tkinter.simpledialog.askstring("LABEL","EXE:"+str(nr+1),initialvalue=txt)
  1313. if txt:
  1314. PRESETS.label(nr,txt)
  1315. self.elem_presets[nr].configure(text = PRESETS.get_btn_txt(nr))
  1316. modes.val("LABEL", 0)
  1317. def xcb(self,mode,value=None):
  1318. cprint("MODE CALLBACK",mode,value,color="green",end="")
  1319. #cprint(self,"xcb","MODE CALLBACK",mode,value,color="green")
  1320. if value:
  1321. cprint("===== ON ======",color="red")
  1322. txt = ""
  1323. if mode == "REC-FX":
  1324. modes.val("REC",1)
  1325. if value == 2:
  1326. if mode in ["MOVE","COPY"]:
  1327. txt="to"
  1328. self.button_refresh(mode,color="orange",text=txt)#,fg="blue")
  1329. else:
  1330. if mode in ["MOVE","COPY"]:
  1331. txt="from"
  1332. self.button_refresh(mode,color="red",text=txt)#,fg="blue",text="from")
  1333. else:
  1334. cprint("===== OFF ======",color="red")
  1335. if mode == "REC-FX":
  1336. modes.val("REC",0)
  1337. self.button_refresh(mode,color="lightgrey")#,fg="black")
  1338. def load(self,fname=""):
  1339. pass
  1340. def exit(self):
  1341. print("__del__",self)
  1342. PRESETS.backup_presets()
  1343. #print("********************************************************")
  1344. FIXTURES.backup_patch()
  1345. #print("*********del",self,"***********************************************")
  1346. def refresh_exec(self):
  1347. refresher.reset() # = Refresher()
  1348. def _refresh_exec(self):
  1349. cprint("PRESET.refresh_exec()")
  1350. self._XX +=1
  1351. for k in PRESETS.val_presets:
  1352. label = ""
  1353. if k not in self.elem_presets:
  1354. cprint("ERROR",k ,"not in elem_presets continue")
  1355. continue
  1356. if k in PRESETS.label_presets:
  1357. label = PRESETS.label_presets[k]
  1358. #print([label])
  1359. b = self.elem_presets[k]
  1360. if k in PRESETS.val_presets and len(PRESETS.val_presets[k]) :
  1361. sdata = PRESETS.val_presets[k]
  1362. #print("sdata7654",sdata)
  1363. BTN="go"
  1364. if "CFG" in sdata:#["BUTTON"] = "GO"
  1365. if "BUTTON" in sdata["CFG"]:
  1366. BTN = sdata["CFG"]["BUTTON"]
  1367. txt=str(k+1)+":"+str(BTN)+":"+str(len(sdata)-1)+"\n"+label
  1368. #txt+=str(self._XX)
  1369. b.configure(text= txt)
  1370. b.configure(bg="yellow")
  1371. b.config(activebackground="yellow")
  1372. if len(sdata) > 1:
  1373. fx_color = 0
  1374. val_color = 0
  1375. for fix in sdata:
  1376. if fix == "CFG":
  1377. continue
  1378. #print( "$$$$",fix,sdata[fix])
  1379. for attr in sdata[fix]:
  1380. if "FX2" in sdata[fix][attr]:
  1381. if sdata[fix][attr]["FX2"]:
  1382. fx_color = 1
  1383. if "FX" in sdata[fix][attr]:
  1384. if sdata[fix][attr]["FX"]:
  1385. fx_color = 1
  1386. if "VALUE" in sdata[fix][attr]:
  1387. if sdata[fix][attr]["VALUE"] is not None:
  1388. val_color = 1
  1389. b.configure(fg= "black")
  1390. if val_color:
  1391. b.configure(bg="gold")
  1392. b.config(activebackground="#ffaa55")
  1393. if fx_color:
  1394. b.configure(fg = "blue")
  1395. else:
  1396. if fx_color:
  1397. b.configure(bg = "cyan")
  1398. b.config(activebackground="#55d4ff")
  1399. else:
  1400. b.configure(bg="grey")
  1401. b.config(activebackground="#aaaaaa")
  1402. if "\n" in txt:
  1403. txt = txt.split("\n")[0]
  1404. if "SEL" in txt:
  1405. b.configure(fg= "black")
  1406. b.configure(bg = "#5555ff")
  1407. b.config(activebackground="#6666ff")
  1408. elif "ON" in txt:
  1409. b.configure(bg = "#ffcc00")
  1410. b.configure(fg = "#00c")
  1411. elif "GO" in txt:
  1412. b.configure(fg="black")
  1413. elif "FL" in txt:
  1414. b.configure(fg = "#7f00ff")
  1415. def refresh_fix(self):
  1416. refresher.reset() # = Refresher()
  1417. def _refresh_fix(self):
  1418. c_d =0
  1419. c_f =0
  1420. c_a =0
  1421. for fix in FIXTURES.fixtures:
  1422. sdata = FIXTURES.fixtures[fix]
  1423. _c_a = 0
  1424. for attr in sdata["ATTRIBUT"]:
  1425. if "FINE" in attr:
  1426. continue
  1427. v2 = sdata["ATTRIBUT"][attr]["VALUE"]
  1428. if fix in self.elem_attr:
  1429. elem = self.elem_attr[fix][attr]
  1430. #print( attr,v2)
  1431. elem["text"] = "{} {:0.2f}".format(attr,v2)
  1432. if sdata["ATTRIBUT"][attr]["ACTIVE"]:
  1433. elem["bg"] = "yellow"
  1434. elem.config(activebackground="yellow")
  1435. if "DIM" in sdata["ATTRIBUT"] and len(sdata["ATTRIBUT"]) == 1:
  1436. c_d+=1
  1437. else:
  1438. _c_a += 1
  1439. else:
  1440. elem["bg"] = "grey"
  1441. elem.config(activebackground="grey")
  1442. if "FX2" not in sdata["ATTRIBUT"][attr]: # insert FX2 excetption
  1443. sdata["ATTRIBUT"][attr]["FX2"] = OrderedDict()
  1444. if sdata["ATTRIBUT"][attr]["FX"]:
  1445. elem["fg"] = "blue"
  1446. elif sdata["ATTRIBUT"][attr]["FX2"]:
  1447. elem["fg"] = "red"
  1448. else:
  1449. elem["fg"] = "black"
  1450. c_a += _c_a
  1451. if _c_a>0:
  1452. c_f +=1
  1453. c_a2=0
  1454. if c_f > 0:
  1455. c_a2 = round(c_a/c_f,2)
  1456. if c_a2 % 1 > 0:
  1457. gui_menu.config("FIXTURES","bg","orange")
  1458. else:
  1459. gui_menu.config("FIXTURES","bg","yellow")
  1460. else:
  1461. gui_menu.config("FIXTURES","bg","")
  1462. gui_menu.update("FIXTURES","{} : {}".format(c_f,c_a2))
  1463. if c_d > 0:
  1464. gui_menu.config("DIMMER","bg","yellow")
  1465. else:
  1466. gui_menu.config("DIMMER","bg","")
  1467. gui_menu.update("DIMMER","{}".format(c_d))
  1468. def preset_rec(self,nr):
  1469. print("------- STORE PRESET")
  1470. data = FIXTURES.get_active()
  1471. if modes.val("REC-FX"):
  1472. PRESETS.rec(nr,data,"REC-FX")
  1473. modes.val("REC-FX",0)
  1474. else:
  1475. PRESETS.rec(nr,data)
  1476. sdata=data
  1477. PRESETS.val_presets[nr] = sdata
  1478. master.refresh_exec()
  1479. return 1
  1480. def preset_select(self,nr):
  1481. print("SELECT PRESET")
  1482. sdata = PRESETS.val_presets[nr]
  1483. cmd = ""
  1484. for fix in sdata:
  1485. if fix == "CFG":
  1486. continue
  1487. for attr in sdata[fix]:
  1488. v2 = sdata[fix][attr]["VALUE"]
  1489. v2_fx = sdata[fix][attr]["FX"]
  1490. #print( self.data.elem_attr)
  1491. if fix in self.elem_attr:
  1492. elem = self.elem_attr[fix][attr]
  1493. FIXTURES.fixtures[fix]["ATTRIBUT"][attr]["ACTIVE"] = 1
  1494. elem["bg"] = "yellow"
  1495. def preset_go(self,nr,val=None,xfade=None,event=None,button=""):
  1496. t_start = time.time()
  1497. if xfade is None and FADE._is():
  1498. xfade = FADE.val()
  1499. print("GO PRESET FADE",nr,val)
  1500. rdata = PRESETS.get_raw_map(nr)
  1501. if not rdata:
  1502. return 0
  1503. print("???????")
  1504. cfg = PRESETS.get_cfg(nr)
  1505. print("''''''''")
  1506. #virtcmd = FIXTURES.get_virtual(rdata)
  1507. if not cfg:
  1508. cprint("NO CFG",cfg,nr)
  1509. return 0
  1510. xFLASH = 0
  1511. value=None
  1512. cprint("preset_go",nr,cfg)
  1513. if modes.val("SELECT") or ( "BUTTON" in cfg and cfg["BUTTON"] == "SEL") and val and not button: #FLASH
  1514. self.preset_select(nr)
  1515. elif modes.val("FLASH") or ( "BUTTON" in cfg and cfg["BUTTON"] == "FL") and not button: #FLASH
  1516. xFLASH = 1
  1517. xfade = 0
  1518. if type(val) is not None and val == 0 :
  1519. value = "off"
  1520. if event:
  1521. if str(event.type) == "ButtonRelease" or event.type == '5' :
  1522. value = "off"
  1523. cprint("preset_go() FLUSH",value,color="red")
  1524. fcmd = FIXTURES.update_raw(rdata,update=0)
  1525. self._preset_go(rdata,cfg,fcmd,value,xfade=xfade,xFLASH=xFLASH)
  1526. elif not val:
  1527. cprint("preset_go() STOP",value,color="red")
  1528. elif button == "on" or ( modes.val("ON") or ( "BUTTON" in cfg and cfg["BUTTON"] in ["on","ON"])):
  1529. fcmd = FIXTURES.update_raw(rdata)
  1530. self._preset_go(rdata,cfg,fcmd,value,xfade=0,xFLASH=xFLASH)
  1531. elif button == "go" or ( modes.val("GO") or ( "BUTTON" in cfg and cfg["BUTTON"] in ["go","GO"])):
  1532. fcmd = FIXTURES.update_raw(rdata)
  1533. self._preset_go(rdata,cfg,fcmd,value,xfade=xfade,xFLASH=xFLASH)
  1534. if not (modes.val("FLASH") or ( "BUTTON" in cfg and cfg["BUTTON"] == "FL")): #FLASH
  1535. self.refresh_exec()
  1536. self.refresh_fix()
  1537. cprint("preset_go",time.time()-t_start)
  1538. def _preset_go(self,rdata,cfg,fcmd,value=None,xfade=None,event=None,xFLASH=0):
  1539. if xfade is None and FADE._is():
  1540. xfade = FADE.val()
  1541. cprint("PRESETS._preset_go()",len(rdata))
  1542. vvcmd,jvvcmd = update_raw_dmx( rdata ,value,[],xfade=xfade )
  1543. fxcmd,jfxcmd = update_raw_dmx( rdata ,value,[],xfade=xfade,fx=1)
  1544. cmd = []
  1545. for vcmd,d in [[jvvcmd,"d"],[jfxcmd,"fx"]]:
  1546. if xFLASH:
  1547. d+="f"
  1548. for i,v in enumerate(fcmd):
  1549. if xFLASH:
  1550. vcmd[i]["FLASH"] = 1
  1551. DMX = fcmd[i]["DMX"]
  1552. if "VALUE" in vcmd[i] and type(vcmd[i]["VALUE"]) is float:
  1553. vcmd[i]["VALUE"] = round(vcmd[i]["VALUE"],3)
  1554. if value is not None:
  1555. vcmd[i]["VALUE"] = value
  1556. if value == "off":
  1557. if "FX2" in vcmd:
  1558. vcmd[i]["FX2"]["TYPE"] = value
  1559. if DMX and vcmd[i]:
  1560. vcmd[i]["DMX"] = DMX
  1561. if "VIRTUAL" in fcmd[i]:
  1562. for a in fcmd[i]["VIRTUAL"]:
  1563. DMX = fcmd[i]["VIRTUAL"][a]
  1564. if DMX and vcmd[i]:
  1565. vcmd[i]["DMX"] = DMX
  1566. #if vcmd[i]["VALUE"] is not None or ("FX2" in vcmd[i] and vcmd[i]["FX2"]):
  1567. # cprint("jvcmd",vcmd[i])
  1568. # cmd.append(vcmd[i])
  1569. #elif vcmd[i]["VALUE"] is not None or ("FX" in vcmd[i] and vcmd[i]["FX"]):
  1570. # cprint("jvcmd",vcmd[i])
  1571. # cmd.append(vcmd[i])
  1572. #cprint("jvcmd",vcmd[i])
  1573. cmd.append(vcmd[i])
  1574. if cmd and not modes.val("BLIND"):
  1575. jclient_send(cmd)
  1576. def draw_sub_dim(self,fix,data,c=0,r=0,frame=None):
  1577. i=0
  1578. if frame is None:
  1579. frame = tk.Frame(root,bg="black")
  1580. frame.pack(fill=tk.X, side=tk.TOP)
  1581. if fix not in self.elem_attr:
  1582. self.elem_attr[fix] = {}
  1583. for attr in data["ATTRIBUT"]:
  1584. if attr not in self.all_attr:
  1585. self.all_attr.append(attr)
  1586. if attr not in self.elem_attr[fix]:
  1587. self.elem_attr[fix][attr] = []
  1588. if attr.endswith("-FINE"):
  1589. continue
  1590. v= data["ATTRIBUT"][attr]["VALUE"]
  1591. b = tk.Button(frame,bg="lightblue", text=""+str(fix)+" "+data["NAME"],width=4)
  1592. b.bind("<Button>",Xevent(fix=fix,mode="D-SELECT",elem=b).cb)
  1593. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1594. c+=1
  1595. b = tk.Button(frame,bg="grey", text=str(attr)+' '+str(round(v,2)),width=6)
  1596. self.elem_attr[fix][attr] = b
  1597. b.bind("<Button>",Xevent(fix=fix,elem=b,attr=attr,mode="ENCODER",data=data).cb)
  1598. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1599. c+=1
  1600. if c >=12:
  1601. c=0
  1602. r+=1
  1603. return c,r
  1604. def draw_patch(self,yframe):
  1605. xframe = tk.Frame(yframe,bg="black")
  1606. xframe.pack()
  1607. def yview(event):
  1608. print("yevent",event)
  1609. yyy=20.1
  1610. xframe.yview_moveto(yyy)
  1611. i=0
  1612. c=0
  1613. r=0
  1614. b = tk.Button(xframe,bg="lightblue", text="ID",width=6,anchor="e")
  1615. #b.bind("<Button>",Xevent(fix=fix,elem=b).cb)
  1616. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1617. c+=1
  1618. b = tk.Button(xframe,bg="lightblue", text="NAME",width=14,anchor="w")
  1619. #b.bind("<Button>",Xevent(fix=fix,elem=b).cb)
  1620. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1621. c+=1
  1622. b = tk.Button(xframe,bg="#ddd", text="TYPE",width=3)
  1623. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1624. c+=1
  1625. b = tk.Button(xframe,bg="#ddd", text="Uni",width=1)
  1626. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1627. c+=1
  1628. b = tk.Button(xframe,bg="#ddd", text="DMX",width=1)
  1629. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1630. c+=1
  1631. b = tk.Button(xframe,bg="#ddd", text="CH's",width=1)
  1632. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1633. c+=1
  1634. c=0
  1635. r+=1
  1636. for fix in FIXTURES.fixtures:
  1637. i+=1
  1638. data = FIXTURES.fixtures[fix]
  1639. b = tk.Button(xframe,bg="lightblue", text=""+str(fix),width=6,anchor="e")
  1640. #b.bind("<Button>",Xevent(fix=fix,elem=b).cb)
  1641. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1642. c+=1
  1643. b = tk.Button(xframe,bg="lightblue", text=data["NAME"],width=14,anchor="w")
  1644. #b.bind("<Button>",Xevent(fix=fix,elem=b).cb)
  1645. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1646. c+=1
  1647. if len(data["ATTRIBUT"]) == 1:
  1648. b = tk.Button(xframe,bg="#ddd", text="DIMMER",width=8,anchor="w")
  1649. elif "PAN" in data["ATTRIBUT"] or "TILT" in data["ATTRIBUT"] :
  1650. b = tk.Button(xframe,bg="#ddd", text="MOVER",width=8,anchor="w")
  1651. else:
  1652. b = tk.Button(xframe,bg="#ddd", text="",width=8,anchor="w")
  1653. #b.bind("<Button>",Xevent(fix=fix,elem=b).cb)
  1654. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1655. c+=1
  1656. b = tk.Button(xframe,bg="#ddd", text="EDIT",width=3)
  1657. b.bind("<Button>",Xevent(fix=fix,mode="SELECT",elem=b).cb)
  1658. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1659. c+=1
  1660. b = tk.Button(xframe,bg="#ddd", text="[ ][x]",width=1)
  1661. b.bind("<Button>",Xevent(fix=fix,mode="SELECT",elem=b).cb)
  1662. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1663. c+=1
  1664. #r+=1
  1665. start_c=3
  1666. c=start_c
  1667. if fix not in self.elem_attr:
  1668. self.elem_attr[fix] = {}
  1669. patch = ["UNIVERS","DMX"]
  1670. for k in patch:
  1671. v=data[k]
  1672. #b = tk.Button(xframe,bg="grey", text=str(k)+' '+str(v),width=8)
  1673. b = tk.Button(xframe,bg="grey", text=str(v),width=2)
  1674. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1675. c+=1
  1676. if c >=8:
  1677. c=start_c
  1678. r+=1
  1679. b = tk.Button(xframe,bg="grey", text="{}".format(len(data["ATTRIBUT"])),width=3)
  1680. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1681. c+=1
  1682. b = tk.Button(xframe,bg="#aaa", text="{:03}-{:03}".format(data["DMX"],len(data["ATTRIBUT"])+(data["DMX"])-1),width=6,anchor="w")
  1683. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1684. if 0: #for attr in data["ATTRIBUT"]:
  1685. if attr not in self.all_attr:
  1686. self.all_attr.append(attr)
  1687. if attr not in self.elem_attr[fix]:
  1688. self.elem_attr[fix][attr] = []
  1689. if attr.endswith("-FINE"):
  1690. continue
  1691. v= data["ATTRIBUT"][attr]["VALUE"]
  1692. b = tk.Button(xframe,bg="grey", text=str(attr)+' '+str(round(v,2)),width=8)
  1693. #self.elem_attr[fix][attr] = b
  1694. #b.bind("<Button>",Xevent(fix=fix,elem=b,attr=attr,data=data).cb)
  1695. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1696. c+=1
  1697. if c >=8:
  1698. c=start_c
  1699. r+=1
  1700. c=0
  1701. r+=1
  1702. def draw_fix(self,xframe,yframe=None):
  1703. r=0
  1704. c=0
  1705. frame_dim=xframe
  1706. if yframe:
  1707. frame_dim=yframe
  1708. frame_fix=xframe
  1709. root = frame_dim
  1710. dim_frame = tk.Frame(root,bg="black")
  1711. dim_frame.pack(fill=tk.X, side=tk.TOP)
  1712. root = frame_fix
  1713. fix_frame = tk.Frame(root,bg="black")
  1714. fix_frame.pack(fill=tk.X, side=tk.TOP)
  1715. i=0
  1716. c=0
  1717. r=0
  1718. dim_end=0
  1719. for fix in FIXTURES.fixtures:
  1720. i+=1
  1721. data = FIXTURES.fixtures[fix]
  1722. #print("draw_fix", fix ,data )
  1723. if(len(data["ATTRIBUT"].keys()) <= 1):
  1724. c,r=self.draw_sub_dim(fix,data,c=c,r=r,frame=dim_frame)
  1725. else:
  1726. if not dim_end:
  1727. dim_end=1
  1728. c=0
  1729. r=0
  1730. #self._draw_fix(fix,data,root=fix_frame)
  1731. frame = fix_frame
  1732. b = tk.Button(frame,bg="lightblue", text="FIX:"+str(fix)+" "+data["NAME"],width=20)
  1733. b.bind("<Button>",Xevent(fix=fix,mode="SELECT",elem=b).cb)
  1734. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1735. c+=1
  1736. #r+=1
  1737. start_c=3
  1738. c=start_c
  1739. if fix not in self.elem_attr:
  1740. self.elem_attr[fix] = {}
  1741. for attr in data["ATTRIBUT"]:
  1742. if attr.endswith("-FINE"):
  1743. continue
  1744. if attr not in self.all_attr:
  1745. self.all_attr.append(attr)
  1746. if attr not in self.elem_attr[fix]:
  1747. self.elem_attr[fix][attr] = ["line1348",fix,attr]
  1748. v= data["ATTRIBUT"][attr]["VALUE"]
  1749. b = tk.Button(frame,bg="grey", text=str(attr)+' '+str(round(v,2)),width=8)
  1750. self.elem_attr[fix][attr] = b
  1751. b.bind("<Button>",Xevent(fix=fix,elem=b,attr=attr,mode="ENCODER",data=data).cb)
  1752. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1753. c+=1
  1754. if c >=8:
  1755. c=start_c
  1756. r+=1
  1757. c=0
  1758. r+=1
  1759. def draw_enc(self,xframe):
  1760. root2 = xframe
  1761. i=0
  1762. c=0
  1763. r=0
  1764. frame = tk.Frame(root2,bg="black")
  1765. frame.pack( side=tk.LEFT,expand=0,fill="both")
  1766. b = tk.Button(frame,bg="lightblue", text="ENCODER",width=6)
  1767. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1768. c+=1
  1769. for attr in self.all_attr:
  1770. if attr.endswith("-FINE"):
  1771. continue
  1772. v=0
  1773. b = tk.Button(frame,bg="orange", text=str(attr)+'',width=6)
  1774. if attr == "DIM":
  1775. b = tk.Button(frame,bg="yellow", text=str(attr)+'',width=6)
  1776. b.bind("<Button>",Xevent(fix=0,elem=b,attr=attr,data=self,mode="ENCODER").cb)
  1777. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1778. c+=1
  1779. if c >=8:
  1780. c=0
  1781. r+=1
  1782. def draw_fx(self,xframe):
  1783. frame_fx=xframe
  1784. i=0
  1785. c=0
  1786. r=0
  1787. frame = tk.Frame(frame_fx,bg="black")
  1788. frame.pack(fill=tk.X, side=tk.TOP)
  1789. b = tk.Button(frame,bg="lightblue", text="FX.",width=6)
  1790. #b.bind("<Button>",Xevent(fix=fix,elem=b).cb)
  1791. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1792. c+=1
  1793. for comm in self.fx_commands:
  1794. if comm == "\n":
  1795. c=0
  1796. r+=1
  1797. continue
  1798. v=0
  1799. if "PAN/TILT" in comm:
  1800. b = tk.Button(frame,bg="grey", text=str(comm),width=6,height=2)
  1801. else:
  1802. b = tk.Button(frame,bg="lightgrey", text=str(comm),width=6,height=2)
  1803. if comm not in self.elem_fx_commands:
  1804. comm = comm.replace("\n","")
  1805. self.elem_fx_commands[comm] = b
  1806. self.val_fx_commands[comm] = 0
  1807. b.bind("<Button>",Xevent(fix=0,elem=b,attr=comm,data=self,mode="FX").cb)
  1808. if comm == "BLIND":
  1809. b["bg"] = "grey"
  1810. elif comm == "CLEAR":
  1811. b["bg"] = "grey"
  1812. elif comm == "REC-FX":
  1813. b["bg"] = "grey"
  1814. elif comm == "FADE":
  1815. b["bg"] = "green"
  1816. elif comm == "FX OFF":
  1817. b["bg"] = "magenta"
  1818. elif comm[:3] == "FX:":
  1819. b["text"] = comm #"BS:{}".format(fx_prm["BASE"])
  1820. b["bg"] = "#ffbf00"
  1821. elif comm == "MO:on":
  1822. b["text"] = comm #"BS:{}".format(fx_prm["BASE"])
  1823. b["bg"] = "lightgreen"
  1824. elif comm == "MO:on":
  1825. b["text"] = comm #"BS:{}".format(fx_prm["BASE"])
  1826. b["bg"] = "lightgreen"
  1827. elif comm == "SZ:":
  1828. b["text"] = "SZ:\n{:0.0f}".format(fx_prm["SIZE"])
  1829. b["bg"] = "lightgreen"
  1830. elif comm == "SP:":
  1831. b["text"] = "SP:\n{:0.0f}".format(fx_prm["SPEED"])
  1832. b["bg"] = "lightgreen"
  1833. elif comm == "ST:":
  1834. b["bg"] = "lightgreen"
  1835. b["text"] = "ST:\n{:0.0f}".format(fx_prm["START"])
  1836. elif comm == "OF:":
  1837. b["bg"] = "lightgreen"
  1838. b["text"] = "OF:\n{:0.0f}".format(fx_prm["OFFSET"])
  1839. elif comm == "BS:-":
  1840. b["bg"] = "lightgreen"
  1841. b["text"] = "BS:\n{}".format(fx_prm["BASE"])
  1842. elif comm[0] == "M":
  1843. b["text"] = comm #"BS:{}".format(fx_prm["BASE"])
  1844. b["bg"] = "lightgrey"
  1845. if comm:
  1846. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1847. c+=1
  1848. if c >=6:
  1849. c=0
  1850. r+=1
  1851. def draw_setup(self,xframe):
  1852. frame_cmd=xframe
  1853. i=0
  1854. c=0
  1855. r=0
  1856. frame = tk.Frame(frame_cmd,bg="black")
  1857. frame.pack(fill=tk.X, side=tk.TOP)
  1858. #b = tk.Button(frame,bg="lightblue", text="SETUP",width=6)
  1859. #b.bind("<Button>",Xevent(fix=fix,elem=b).cb)
  1860. #b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1861. #r+=1
  1862. c+=1
  1863. for comm in ["BACKUP\nSHOW","LOAD\nSHOW","NEW\nSHOW","SAVE\nSHOW AS"]:
  1864. if comm == "\n":
  1865. c=0
  1866. r+=1
  1867. continue
  1868. v=0
  1869. if comm == "BACKUP\nSHOW":
  1870. b = tk.Button(frame,bg="lightgrey", text=str(comm),width=6,height=2)
  1871. else:
  1872. b = tk.Button(frame,bg="grey", text=str(comm),width=6,height=2)
  1873. if comm not in self.elem_commands:
  1874. self.elem_commands[comm] = b
  1875. self.val_commands[comm] = 0
  1876. b.bind("<Button>",Xevent(fix=0,elem=b,attr=comm,data=self,mode="SETUP").cb)
  1877. if comm == "BS:":
  1878. b["text"] = "BS:{}".format(fx_prm["BASE"])
  1879. if comm:
  1880. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1881. c+=1
  1882. if c >=5:
  1883. c=0
  1884. r+=1
  1885. def draw_live(self,xframe):
  1886. frame_cmd=xframe
  1887. i=0
  1888. c=0
  1889. r=0
  1890. frame = tk.Frame(frame_cmd,bg="black")
  1891. frame.pack(fill=tk.X, side=tk.TOP)
  1892. c+=1
  1893. for comm in ["FADE","DELAY:0.0","PAN/TILT\nFADE:x.x","PAN/TILT\nDELAY:0.0"]:
  1894. if comm == "\n":
  1895. c=0
  1896. r+=1
  1897. continue
  1898. v=0
  1899. b = tk.Button(frame,bg="lightgrey", text=str(comm),width=6,height=2)
  1900. if comm not in self.elem_commands:
  1901. self.elem_commands[comm] = b
  1902. self.val_commands[comm] = 0
  1903. b.bind("<Button>",Xevent(fix=0,elem=b,attr=comm,data=self,mode="LIVE").cb)
  1904. if "FADE" == comm:
  1905. b["text"] = "FADE:2.0"
  1906. if "FADE" in comm:
  1907. b["bg"] = "green"
  1908. if comm:
  1909. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1910. c+=1
  1911. if c >=5:
  1912. c=0
  1913. r+=1
  1914. def draw_command(self,xframe):
  1915. frame_cmd=xframe
  1916. i=0
  1917. c=0
  1918. r=0
  1919. frame = tk.Frame(frame_cmd,bg="black")
  1920. frame.pack(fill=tk.X, side=tk.TOP)
  1921. # b = tk.Button(frame,bg="lightblue", text="COMM.",width=6)
  1922. #b.bind("<Button>",Xevent(fix=fix,elem=b).cb)
  1923. #b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1924. #r+=1
  1925. c+=1
  1926. for comm in self.commands:
  1927. if comm == "\n":
  1928. c=0
  1929. r+=1
  1930. continue
  1931. v=0
  1932. b = tk.Button(frame,bg="lightgrey", text=str(comm),width=6,height=2)
  1933. if comm not in self.elem_commands:
  1934. self.elem_commands[comm] = b
  1935. self.val_commands[comm] = 0
  1936. b.bind("<Button>",Xevent(fix=0,elem=b,attr=comm,data=self,mode="COMMAND").cb)
  1937. if comm == "BLIND":
  1938. b["bg"] = "grey"
  1939. if comm == "CLEAR":
  1940. b["bg"] = "grey"
  1941. if comm == "REC-FX":
  1942. b["bg"] = "grey"
  1943. if comm == "FADE":
  1944. b["bg"] = "green"
  1945. if comm == "FX OFF":
  1946. b["bg"] = "magenta"
  1947. if comm == "SZ:":
  1948. b["text"] = "SZ:{:0.0f}".format(fx_prm["SIZE"])
  1949. if comm == "SP:":
  1950. b["text"] = "SP:{:0.0f}".format(fx_prm["SPEED"])
  1951. if comm == "FADE":
  1952. b["text"] = "FADE:{:0.02f}".format(FADE.val())
  1953. if comm == "ST:":
  1954. b["text"] = "ST:{:0.0f}".format(fx_prm["START"])
  1955. if comm == "OF:":
  1956. b["text"] = "OF:{:0.0f}".format(fx_prm["OFFSET"])
  1957. if comm == "BS:":
  1958. b["text"] = "BS:{}".format(fx_prm["BASE"])
  1959. if comm:
  1960. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1961. c+=1
  1962. if c >=5:
  1963. c=0
  1964. r+=1
  1965. def draw_preset(self,xframe):
  1966. i=0
  1967. c=0
  1968. r=0
  1969. root = xframe
  1970. frame = tk.Frame(root,bg="black")
  1971. frame.pack(fill=tk.X, side=tk.TOP)
  1972. i=0
  1973. for k in PRESETS.val_presets:
  1974. if i%(10*8)==0 or i ==0:
  1975. c=0
  1976. b = tk.Label(frame,bg="black", text="" )
  1977. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1978. r+=1
  1979. c=0
  1980. b = tk.Button(frame,bg="lightblue", text="EXEC " )
  1981. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1982. c+=1
  1983. b = tk.Button(frame,bg="lightblue", text="BANK " + str(int(i/(8*8))+1) )
  1984. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1985. c+=1
  1986. b = tk.Button(frame,bg="lightblue", text="NAME" )
  1987. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1988. r+=1
  1989. c=0
  1990. i+=1
  1991. v=0
  1992. label = ""
  1993. #if k in PRESETS.label_presets:
  1994. # label = PRESETS.label_presets[k]
  1995. # #print([label])
  1996. sdata=PRESETS.val_presets[k]
  1997. BTN="go"
  1998. if "CFG" in sdata:#["BUTTON"] = "GO"
  1999. if "BUTTON" in sdata["CFG"]:
  2000. BTN = sdata["CFG"]["BUTTON"]
  2001. #bb = tk.Frame(frame, highlightbackground = "red", highlightthickness = 1, bd=0)
  2002. #bb = tk.Canvas(frame, highlightbackground = "black", highlightthickness = 1, bd=1)
  2003. #bb.configure(width=70, height=38)
  2004. txt=str(k+1)+":"+str(BTN)+":"+str(len(sdata)-1)+"\n"+label
  2005. b = MiniButton(frame,text=txt)
  2006. #b = tk.Button(bb,bg="grey", text=txt,width=7,height=2)
  2007. b.bind("<Button>",Xevent(fix=0,elem=b,attr=k,data=self,mode="PRESET").cb)
  2008. b.bind("<ButtonRelease>",Xevent(fix=0,elem=b,attr=k,data=self,mode="PRESET").cb)
  2009. if k not in self.elem_presets:
  2010. self.elem_presets[k] = b
  2011. #b.pack(expand=1)
  2012. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  2013. c+=1
  2014. if c >=10:
  2015. c=0
  2016. r+=1
  2017. self.refresh_exec()
  2018. def draw_input(self):
  2019. i=0
  2020. c=0
  2021. r=0
  2022. frame = tk.Frame(root2,bg="black")
  2023. frame.pack(fill=tk.X, side=tk.TOP)
  2024. b = tk.Label(frame,bg="black", text="------------------------ ---------------------------------------")
  2025. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  2026. r=0
  2027. frame = tk.Frame(root2,bg="black")
  2028. frame.pack(fill=tk.X, side=tk.TOP)
  2029. b = tk.Label(frame, text="send:")
  2030. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  2031. c+=1
  2032. b = tk.Entry(frame,bg="grey", text="",width=50)
  2033. self.entry = b
  2034. b.bind("<Button>",Xevent(fix=0,elem=b,attr="INPUT",data=self,mode="INPUT").cb)
  2035. b.bind("<Key>",Xevent(fix=0,elem=b,attr="INPUT",data=self,mode="INPUT").cb)
  2036. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  2037. b.insert("end","d0:127,fx241:sinus:50:50:10,fx243:cosinus:50:50:10,d201:127,fx201:sinus:50:300:10")
  2038. r+=1
  2039. b = tk.Entry(frame,bg="grey", text="",width=20)
  2040. self.entry2 = b
  2041. b.bind("<Button>",Xevent(fix=0,elem=b,attr="INPUT",data=self,mode="INPUT2").cb)
  2042. b.bind("<Key>",Xevent(fix=0,elem=b,attr="INPUT",data=self,mode="INPUT2").cb)
  2043. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  2044. b.insert("end","d1:0:4")
  2045. r+=1
  2046. b = tk.Entry(frame,bg="grey", text="",width=20)
  2047. self.entry3 = b
  2048. b.bind("<Button>",Xevent(fix=0,elem=b,attr="INPUT",data=self,mode="INPUT3").cb)
  2049. #b.bind("<B1-Motion>",Xevent(fix=0,elem=b,attr="INPUT",data=self,mode="INPUT3").cb)
  2050. b.bind("<Key>",Xevent(fix=0,elem=b,attr="INPUT",data=self,mode="INPUT3").cb)
  2051. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  2052. b.insert("end","fx:alloff:::")
  2053. def draw_colorpicker(self,xframe):
  2054. import lib.colorpicker as colp
  2055. class _CB():
  2056. def __init__(self):
  2057. self.old_color = (0,0,0)
  2058. def cb(self,event,data):
  2059. cprint("colorpicker CB")
  2060. if "color" in data and self.old_color != data["color"] or event.num==2:
  2061. self.old_color = data["color"]
  2062. else:
  2063. return 0
  2064. color = data["color"]
  2065. print("e",event,data)
  2066. print("e",dir(event))#.keys())
  2067. try:
  2068. print("e.state",event.state)
  2069. except:pass
  2070. set_fade = FADE.val() #fade
  2071. if "color" in data and (event.num == 1 or event.num == 3 or event.num==2 or event.state in [256,1024]):
  2072. cr=None
  2073. cg=None
  2074. cb=None
  2075. if event.num == 1:
  2076. set_fade=FADE.val() #fade
  2077. cr = color[0]
  2078. cg = color[1]
  2079. cb = color[2]
  2080. elif event.num == 3:
  2081. cr = color[0]
  2082. cg = color[1]
  2083. cb = color[2]
  2084. set_fade=0
  2085. elif event.num == 2:
  2086. cr= "click"
  2087. cg= "click"
  2088. cb= "click"
  2089. elif event.state == 256:
  2090. cr = color[0]
  2091. cg = color[1]
  2092. cb = color[2]
  2093. set_fade=0
  2094. else:
  2095. set_fade=0
  2096. if cr is not None:
  2097. FIXTURES.encoder(fix=0,attr="RED",xval=cr,xfade=set_fade)
  2098. if cg is not None:
  2099. FIXTURES.encoder(fix=0,attr="GREEN",xval=cg,xfade=set_fade)
  2100. if cb is not None:
  2101. FIXTURES.encoder(fix=0,attr="BLUE",xval=cb,xfade=set_fade)
  2102. master.refresh_fix()
  2103. print("PICK COLOR:",data["color"])
  2104. _cb=_CB()
  2105. colp.colorpicker(xframe,width=600,height=100, xcb=_cb.cb)
  2106. return 0
  2107. canvas=tk.Canvas(xframe,width=600,height=100)
  2108. canvas["bg"] = "yellow" #"green"
  2109. canvas.pack()
  2110. # RGB
  2111. x=0
  2112. y=0
  2113. j=0
  2114. d = 20
  2115. for i in range(0,d+1):
  2116. fi = int(i*255/d)
  2117. f = 255-fi
  2118. if i > d/2:
  2119. pass#break
  2120. color = '#%02x%02x%02x' % (f, fi, fi)
  2121. print( "farbe", i*10, j, f,fi,fi,color)
  2122. r = canvas.create_rectangle(x, y, x+20, y+20, fill=color)
  2123. x+=20
  2124. def render(self):
  2125. #Xroot.bind("<Key>",Xevent(fix=0,elem=None,attr="ROOT",data=self,mode="ROOT").cb)
  2126. self.draw_input()
  2127. class TableFrame():
  2128. def __init__(self,root, width=50,height=100,bd=1):
  2129. self.root=root
  2130. self.a = _TableFrame(self.root)
  2131. f=self.a.HFrame()
  2132. f=self.a.Sframe(f, width=width,height=height,bd=bd)
  2133. self.draw([["A","11"],["B",4],["E",""],["R","R"],["Z","Z"],["U","U"]])
  2134. self.b = _TableFrame(self.root)
  2135. f=self.b.HFrame()
  2136. f=self.b.Sframe(f, width=width,height=height,bd=bd)
  2137. self.b.draw([["A","11"],["B",4],["E",""],["R","R"],["Z","Z"],["U","U"]])
  2138. self.c = _TableFrame(self.root)
  2139. f=self.c.HFrame()
  2140. f=self.c.Sframe(f, width=width,height=height,bd=bd)
  2141. self.bframe=None
  2142. def draw(self,data=[1,2],head=[],config=[]):
  2143. pass
  2144. class _TableFrame():
  2145. def __init__(self,root):
  2146. self.root=root
  2147. def HFrame(self):
  2148. try:
  2149. pass#self.hframe.destroy()
  2150. except:pass
  2151. hframe=tk.Frame(self.root,relief=tk.GROOVE,bg="red")#,width=width,height=height,bd=bd)
  2152. hframe.pack(side="top",fill="both",expand=1) #x=0,y=0)
  2153. self.hframe=hframe
  2154. hframe=self.hframe
  2155. #for i in dir(hframe):
  2156. # print(i)
  2157. h2frame=tk.Frame(hframe,relief=tk.GROOVE,bg="#de0")#,width=width,height=height,bd=bd)
  2158. h2frame.pack(side="top",fill="x",expand=0) #x=0,y=0)
  2159. self.l=tk.Label(h2frame,text="filter:")
  2160. #l.pack(side="left")
  2161. r=0
  2162. c=0
  2163. self.l.grid(row=r, column=c)#, sticky=tk.W+tk.E)
  2164. c+=1
  2165. self.l=tk.Entry(h2frame,text="test")
  2166. self.l.grid(row=r, column=c)#, sticky=tk.W+tk.E)
  2167. self.hframe = hframe
  2168. #self.bframe=hframe
  2169. return hframe
  2170. def Sframe(self,root, width=50,height=100,bd=1):
  2171. try:
  2172. pass#self.aframe.destroy()
  2173. except:pass
  2174. aframe=tk.Frame(root,relief=tk.GROOVE)#,width=width,height=height,bd=bd)
  2175. self.aframe=aframe
  2176. #aframe.place(x=0,y=0)
  2177. aframe.pack(side="top",fill="both",expand=1) #x=0,y=0)
  2178. canvas=tk.Canvas(aframe,width=width-24,height=height)
  2179. canvas["bg"] = "blue" #black" #"green"
  2180. bframe=tk.Frame(canvas)#,width=width,height=height)
  2181. bframe["bg"] = "blue"
  2182. scrollbar=tk.Scrollbar(aframe,orient="vertical",command=canvas.yview,width=20)
  2183. canvas.configure(yscrollcommand=scrollbar.set)
  2184. scrollbar.pack(side="right",fill="y")
  2185. canvas.pack(side="left",expand=1,fill="both")
  2186. canvas.create_window((0,0),window=bframe,anchor='nw')
  2187. bframe.bind("<Configure>",scroll(canvas).config)
  2188. canvas.bind("<Button>",Event("XXX").event)
  2189. canvas.bind("<Key>",Event("XXX").event)
  2190. canvas.bind("<KeyRelease>",Event("XXX").event)
  2191. self.bframe=bframe
  2192. return bframe
  2193. def draw(self,data=[1,2],head=[],config=[]):
  2194. global tk
  2195. bframe=self.bframe
  2196. yframe = bframe
  2197. if 1:
  2198. xframe = tk.Frame(yframe,bg="black")
  2199. xframe.pack()
  2200. def yview(event):
  2201. print("yevent",event)
  2202. yyy=20.1
  2203. xframe.yview_moveto(yyy)
  2204. i=0
  2205. c=0
  2206. r=0
  2207. b = tk.Button(xframe,bg="lightblue", text="ID",width=6,anchor="e")
  2208. #b.bind("<Button>",Xevent(fix=fix,elem=b).cb)
  2209. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  2210. c+=1
  2211. b = tk.Button(xframe,bg="lightblue", text="NAME",width=14,anchor="w")
  2212. #b.bind("<Button>",Xevent(fix=fix,elem=b).cb)
  2213. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  2214. c+=1
  2215. b = tk.Button(xframe,bg="#ddd", text="TYPE",width=3)
  2216. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  2217. c+=1
  2218. b = tk.Button(xframe,bg="#ddd", text="Uni",width=1)
  2219. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  2220. c+=1
  2221. b = tk.Button(xframe,bg="#ddd", text="DMX",width=1)
  2222. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  2223. c+=1
  2224. b = tk.Button(xframe,bg="#ddd", text="CH's",width=1)
  2225. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  2226. c+=1
  2227. c=0
  2228. r+=1
  2229. for i,p in enumerate(data):
  2230. for j in data[i]:
  2231. b = tk.Button(xframe,bg="lightblue", text=""+str(j),width=6,anchor="e")
  2232. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  2233. c+=1
  2234. c=0
  2235. r+=1
  2236. return bframe
  2237. def ScrollFrame(root,width=50,height=100,bd=1):
  2238. #print("ScrollFrame init",width,height)
  2239. aframe=tk.Frame(root,relief=tk.GROOVE)#,width=width,height=height,bd=bd)
  2240. #aframe.place(x=0,y=0)
  2241. aframe.pack(side="left",fill="both",expand=1) #x=0,y=0)
  2242. canvas=tk.Canvas(aframe,width=width-24,height=height)
  2243. canvas["bg"] = "black" #"green"
  2244. bframe=tk.Frame(canvas)#,width=width,height=height)
  2245. bframe["bg"] = "blue"
  2246. scrollbar=tk.Scrollbar(aframe,orient="vertical",command=canvas.yview,width=20)
  2247. canvas.configure(yscrollcommand=scrollbar.set)
  2248. scrollbar.pack(side="right",fill="y")
  2249. canvas.pack(side="left",expand=1,fill="both")
  2250. canvas.create_window((0,0),window=bframe,anchor='nw')
  2251. bframe.bind("<Configure>",scroll(canvas).config)
  2252. canvas.bind("<Button>",Event("XXX").event)
  2253. canvas.bind("<Key>",Event("XXX").event)
  2254. canvas.bind("<KeyRelease>",Event("XXX").event)
  2255. return bframe
  2256. #frame = ScrollFrame(root)
  2257. class GUIHandler():
  2258. def __init__(self):
  2259. pass
  2260. def update(self,fix,attr,args={}):
  2261. print("GUIHandler.update()",fix,attr,args)
  2262. for i,k in enumerate(args):
  2263. v = args[k]
  2264. #print("GUI-H", i,k,v)
  2265. class Fixtures(Base):
  2266. def __init__(self):
  2267. super().__init__()
  2268. #self.load()
  2269. self.fixtures = OrderedDict()
  2270. self.gui = GUIHandler()
  2271. def load_patch(self):
  2272. filename="patch"
  2273. d,l = self._load(filename)
  2274. self.fixtures = OrderedDict()
  2275. for i in l:
  2276. sdata = d[i]
  2277. for attr in sdata["ATTRIBUT"]:
  2278. sdata["ATTRIBUT"][attr]["ACTIVE"] = 0
  2279. #print("load",filename,sdata)
  2280. #if "CFG" not in sdata:
  2281. # sdata["CFG"] = OrderedDict()
  2282. self.fixtures[str(i)] = sdata
  2283. #PRESETS.label_presets = l
  2284. def backup_patch(self):
  2285. filename = "patch"
  2286. data = self.fixtures
  2287. labels = {}
  2288. for k in data:
  2289. labels[k] = k
  2290. self._backup(filename,data,labels)
  2291. def fx_off(self,fix=None):
  2292. if not fix or fix == "all":
  2293. #self.data.elem_fx_commands[self.attr]["bg"] = "magenta"
  2294. for fix in self.fixtures:
  2295. data = self.fixtures[fix]
  2296. for attr in data["ATTRIBUT"]:
  2297. data["ATTRIBUT"][attr]["FX"] = ""
  2298. data["ATTRIBUT"][attr]["FX2"] = OrderedDict()
  2299. def get_attr(self,fix,attr):
  2300. if fix in self.fixtures:
  2301. data = self.fixtures[fix]
  2302. if "ATTRIBUT" in data:
  2303. if attr in data["ATTRIBUT"]:
  2304. return data["ATTRIBUT"][attr]
  2305. def get_dmx(self,fix,attr):
  2306. #cprint("get_dmx",[fix,attr])
  2307. if fix in self.fixtures:
  2308. data = self.fixtures[fix]
  2309. DMX = -99
  2310. if "DMX" in data:
  2311. DMX = int(data["DMX"])
  2312. if DMX < 1: # ignore attribute with DMX lower 1
  2313. return -22
  2314. else:
  2315. return -1
  2316. if "UNIVERS" in data:
  2317. if int(data["UNIVERS"]) >= 0:
  2318. DMX += (int(data["UNIVERS"])*512)
  2319. else:
  2320. return -33
  2321. adata = self.get_attr(fix,attr)
  2322. #-hier ende 8.2.22
  2323. #cprint("adata",adata,DMX)
  2324. if adata:
  2325. if "NR" in adata:
  2326. NR = adata["NR"]
  2327. if NR >= 1:
  2328. DMX+=NR-1
  2329. else:
  2330. return -44
  2331. return DMX
  2332. return -4
  2333. return -3
  2334. def update_raw(self,rdata,update=1):
  2335. cprint("update_raw",len(rdata))
  2336. cmd = []
  2337. for i,d in enumerate(rdata):
  2338. xcmd = {"DMX":""}
  2339. #print("fix:",i,d)
  2340. fix = d["FIX"]
  2341. attr = d["ATTR"]
  2342. v2 = d["VALUE"]
  2343. v2_fx = d["FX"]
  2344. if fix not in self.fixtures:
  2345. continue
  2346. sdata = self.fixtures[fix] #shortcat
  2347. ATTR = sdata["ATTRIBUT"]
  2348. sDMX = 0
  2349. if sdata["DMX"] > 0:
  2350. #print( sdata)
  2351. sDMX = (sdata["UNIVERS"]*512)+sdata["DMX"]
  2352. #sDMX =sdata["DMX"]
  2353. #else:
  2354. # continue
  2355. if attr not in ATTR:
  2356. continue
  2357. #DMX = FIXTURES.get_dmx(fix)
  2358. if ATTR[attr]["NR"] >= 0:
  2359. DMX = sDMX+ATTR[attr]["NR"]-1
  2360. xcmd["DMX"] = str(DMX)
  2361. else:
  2362. if attr == "DIM" and ATTR[attr]["NR"] < 0:
  2363. xcmd["VIRTUAL"] = {}
  2364. for a in ATTR:
  2365. if ATTR[a]["MASTER"]:
  2366. xcmd["VIRTUAL"][a] = sDMX+ATTR[a]["NR"]-1
  2367. #print( "VIRTUAL",xcmd)
  2368. cmd.append(xcmd)
  2369. v=ATTR[attr]["VALUE"]
  2370. if v2 is not None and update:
  2371. ATTR[attr]["VALUE"] = v2
  2372. if d["FX2"] and update:
  2373. ATTR[attr]["FX2"] = d["FX2"]
  2374. #self.data.elem_attr[fix][attr]["text"] = str(attr)+' '+str(round(v,2))
  2375. text = str(attr)+' '+str(round(v,2))
  2376. #self.gui.update(fix,attr,args={"text":text})
  2377. #print("END 5454 _=_=_=_=_==_")
  2378. #cprint("update_raw",cmd,color="red")
  2379. return cmd
  2380. def encoder(self,fix,attr,xval="",xfade=0):
  2381. #cprint("FIXTURES.encoder",fix,attr,xval,xfade,color="yellow")
  2382. if attr == "CLEAR":
  2383. self.clear()
  2384. return 0
  2385. if fix not in self.fixtures:
  2386. jdata=[{"MODE":"---"}]
  2387. ii =0
  2388. jclient_send(jdata)
  2389. for fix in self.fixtures:
  2390. ii+=1
  2391. #cprint(fix,attr,xval)
  2392. data = self.fixtures[fix]
  2393. if attr in data["ATTRIBUT"]:
  2394. if xval == "click":
  2395. self.select(fix,attr,mode="on")
  2396. elif data["ATTRIBUT"][attr]["ACTIVE"]:
  2397. if fix: # prevent endless recursion
  2398. self.encoder(fix,attr,xval,xfade)
  2399. jdata=[{"MODE":ii}]
  2400. jclient_send(jdata)
  2401. return 0
  2402. data = self.fixtures[fix]
  2403. if xval == "click":
  2404. #cprint(data)
  2405. return self.select(fix,attr,mode="toggle")
  2406. v2=data["ATTRIBUT"][attr]["VALUE"]
  2407. change=0
  2408. increment = 4.11
  2409. jdata = {"MODE":"ENC"}
  2410. if xval == "+":
  2411. v2+= increment
  2412. jdata["INC"] = increment
  2413. change=1
  2414. elif xval == "-":
  2415. jdata["INC"] = increment*-1
  2416. v2-= increment
  2417. change=1
  2418. elif type(xval) is int or type(xval) is float:
  2419. v2 = xval
  2420. change=1
  2421. if v2 < 0:
  2422. v2=0
  2423. elif v2 > 256:
  2424. v2=256
  2425. jdata["VALUE"] = round(v2,4)
  2426. jdata["FIX"] = fix
  2427. jdata["ATTR"] = attr
  2428. jdata["DMX"] = FIXTURES.get_dmx(fix,attr)
  2429. out = {}
  2430. if change:
  2431. data["ATTRIBUT"][attr]["ACTIVE"] = 1
  2432. data["ATTRIBUT"][attr]["VALUE"] = round(v2,4)
  2433. jdata["FADE"] = 0
  2434. if xfade:
  2435. jdata["FADE"] = xfade
  2436. if not modes.val("BLIND"):
  2437. jdata = [jdata]
  2438. print(jdata)
  2439. jclient_send(jdata)
  2440. return v2
  2441. def get_active(self):
  2442. cprint("get_active",self,"get_active")
  2443. CFG = OrderedDict()
  2444. sdata = OrderedDict()
  2445. sdata["CFG"] = CFG # OrderedDict()
  2446. sdata["CFG"]["FADE"] = FADE.val()
  2447. sdata["CFG"]["DEALY"] = 0
  2448. #sdata["CFG"]["BUTTON"] = "GO"
  2449. for fix in self.fixtures:
  2450. data = self.fixtures[fix]
  2451. for attr in data["ATTRIBUT"]:
  2452. if data["ATTRIBUT"][attr]["ACTIVE"]:
  2453. if fix not in sdata:
  2454. sdata[fix] = {}
  2455. if attr not in sdata[fix]:
  2456. sdata[fix][attr] = OrderedDict()
  2457. if not modes.val("REC-FX"):
  2458. sdata[fix][attr]["VALUE"] = data["ATTRIBUT"][attr]["VALUE"]
  2459. #sdata[fix][attr]["FADE"] = FADE.val() #fade
  2460. else:
  2461. sdata[fix][attr]["VALUE"] = None #data["ATTRIBUT"][attr]["VALUE"]
  2462. if "FX" not in data["ATTRIBUT"][attr]:
  2463. data["ATTRIBUT"][attr]["FX"] =""
  2464. if "FX2" not in data["ATTRIBUT"][attr]:
  2465. data["ATTRIBUT"][attr]["FX2"] ={}
  2466. sdata[fix][attr]["FX"] = data["ATTRIBUT"][attr]["FX"]
  2467. sdata[fix][attr]["FX2"] = data["ATTRIBUT"][attr]["FX2"]
  2468. return sdata
  2469. def select(self,fix=None,attr=None,mode="on"):
  2470. cprint("FIXTURES.select()",fix,attr,mode,color="yellow")
  2471. out = 0
  2472. if fix in self.fixtures:
  2473. data = self.fixtures[fix]
  2474. if attr in data["ATTRIBUT"]:
  2475. if mode == "on":
  2476. if not data["ATTRIBUT"][attr]["ACTIVE"]:
  2477. data["ATTRIBUT"][attr]["ACTIVE"] = 1
  2478. out = 1
  2479. elif mode == "off":
  2480. if data["ATTRIBUT"][attr]["ACTIVE"]:
  2481. data["ATTRIBUT"][attr]["ACTIVE"] = 0
  2482. out = 1
  2483. elif mode == "toggle":
  2484. if data["ATTRIBUT"][attr]["ACTIVE"]:
  2485. data["ATTRIBUT"][attr]["ACTIVE"] = 0
  2486. else:
  2487. data["ATTRIBUT"][attr]["ACTIVE"] = 1
  2488. out = 1
  2489. return out
  2490. def clear(self):
  2491. out = 0
  2492. for fix in self.fixtures:
  2493. data = self.fixtures[fix]
  2494. for attr in data["ATTRIBUT"]:
  2495. if attr.endswith("-FINE"):
  2496. continue
  2497. if data["ATTRIBUT"][attr]["ACTIVE"]:
  2498. out +=1
  2499. data["ATTRIBUT"][attr]["ACTIVE"] = 0
  2500. return out
  2501. class Presets(Base):
  2502. def __init__(self):
  2503. super().__init__()
  2504. #self.load()
  2505. self._last_copy = None
  2506. self._last_move = None
  2507. def load_presets(self):
  2508. filename="presets"
  2509. d,l = self._load(filename)
  2510. for i in d:
  2511. sdata = d[i]
  2512. if "CFG" not in sdata:
  2513. sdata["CFG"] = OrderedDict()
  2514. if "FADE" not in sdata["CFG"]:
  2515. sdata["CFG"]["FADE"] = 4
  2516. if "DELAY" not in sdata["CFG"]:
  2517. sdata["CFG"]["DELAY"] = 0
  2518. if "BUTTON" not in sdata["CFG"]:
  2519. sdata["CFG"]["BUTTON"] = "GO"
  2520. self.val_presets = d
  2521. self.label_presets = l
  2522. def check_cfg(self,nr=None):
  2523. cprint("PRESETS.check_cfg()",nr)
  2524. ok = 0
  2525. if nr is not None:
  2526. ok += self._check_cfg(nr)
  2527. else:
  2528. for nr in self.val_presets:
  2529. ok += self._check_cfg(nr)
  2530. return ok
  2531. def _check_cfg(self,nr):
  2532. #cprint("PRESETS._check_cfg()",nr)
  2533. ok=0
  2534. if nr in self.val_presets:
  2535. sdata = self.val_presets[nr]
  2536. if "CFG" not in sdata:
  2537. sdata["CFG"] = OrderedDict()
  2538. ok += 1
  2539. if "FADE" not in sdata["CFG"]:
  2540. sdata["CFG"]["FADE"] = 4
  2541. ok += 1
  2542. if "DELAY" not in sdata["CFG"]:
  2543. sdata["CFG"]["DELAY"] = 0
  2544. ok += 1
  2545. if "BUTTON" not in sdata["CFG"]:
  2546. sdata["CFG"]["BUTTON"] = "GO"
  2547. ok += 1
  2548. if ok:
  2549. cprint("REPAIR CFG's",nr,sdata["CFG"],color="red")
  2550. else:
  2551. cprint("nr not in data ",nr,color="red")
  2552. return ok
  2553. def backup_presets(self):
  2554. filename = "presets"
  2555. data = self.val_presets
  2556. labels = self.label_presets
  2557. self._backup(filename,data,labels)
  2558. def get_cfg(self,nr):
  2559. cprint("PRESETS.get_cfg()",nr)
  2560. self.check_cfg(nr)
  2561. if nr not in self.val_presets:
  2562. cprint("get_cfg",self,"error get_cfg no nr:",nr,color="red")
  2563. return {}
  2564. if "CFG" in self.val_presets[nr]:
  2565. return self.val_presets[nr]["CFG"]
  2566. def clean(self,nr):
  2567. if nr not in self.val_presets:
  2568. self.val_presets[nr] = OrderedDict()
  2569. #self.val_presets[nr]["VALUE"] = 0
  2570. #self.val_presets[nr]["FX"] = ""
  2571. sdata = self.val_presets[nr]
  2572. for fix in sdata:
  2573. #print("exec.clear()",nr,fix,sdata[fix])
  2574. for attr in sdata[fix]:
  2575. row = sdata[fix][attr]
  2576. if fix == "CFG":
  2577. continue
  2578. if "VALUE" not in row:
  2579. row["VALUE"] = None
  2580. if "FX" not in row:
  2581. row["FX"] = ""
  2582. if "FX2" not in row:
  2583. row["FX2"] = OrderedDict()
  2584. elif row["FX2"]:
  2585. for k in ["SIZE","SPEED","START","OFFSET"]:
  2586. row["FX2"][k] = int( row["FX2"][k] )
  2587. row["FX"] = ""
  2588. if "FX" in row and row["FX"] and not row["FX2"]: # rebuild old FX to Dict-FX2
  2589. #"off:0:0:0:16909:-:"
  2590. x = row["FX"].split(":")
  2591. print(x,len(x))
  2592. #'FX2': {'TYPE': 'sinus', 'SIZE': 200, 'SPEED': 30, 'START': 0, 'OFFSET': 2805, 'BASE': '-'}}
  2593. if len(x) >= 6:
  2594. row["FX2"]["TYPE"] = x[0]
  2595. row["FX2"]["SIZE"] = int(x[1])
  2596. row["FX2"]["SPEED"] = int(x[2])
  2597. row["FX2"]["START"] = int(x[3])
  2598. row["FX2"]["OFFSET"] = int(x[4])
  2599. row["FX2"]["BASE"] = x[5]
  2600. row["FXOLD"] = row["FX"]
  2601. row["FX"] = ""
  2602. #cprint("exec.clear()",nr,fix,row)
  2603. def get_raw_map(self,nr):
  2604. self.clean(nr)
  2605. print("get_raw_map",nr)
  2606. sdata = self.val_presets[nr]
  2607. cmd = ""
  2608. out = []
  2609. dmx=-1
  2610. for fix in sdata:
  2611. if fix == "CFG":
  2612. #print("CFG",nr,sdata[fix])
  2613. continue
  2614. for attr in sdata[fix]:
  2615. x = {}
  2616. #print("RAW",attr)
  2617. x["FIX"] = fix
  2618. x["ATTR"] = attr
  2619. x["VALUE"] = sdata[fix][attr]["VALUE"]
  2620. x["FX"] = sdata[fix][attr]["FX"]
  2621. x["FX2"] = sdata[fix][attr]["FX2"]
  2622. #x["DMX"] = sdata[fix][attr]["NR"]
  2623. out.append(x)
  2624. return out
  2625. def get_btn_txt(self,nr):
  2626. sdata=self.val_presets[nr]
  2627. BTN="go"
  2628. if "CFG" in sdata:
  2629. if "BUTTON" in sdata["CFG"]:
  2630. BTN = sdata["CFG"]["BUTTON"]
  2631. _label = self.label_presets[nr] # = label
  2632. txt=str(nr+1)+":"+str(BTN)+":"+str(len(sdata)-1)+"\n"+_label
  2633. print("get_btn_txt",nr,[txt])
  2634. return txt
  2635. def btn_cfg(self,nr,txt=None):
  2636. if nr not in self.val_presets:
  2637. return ""
  2638. if "CFG" not in self.val_presets[nr]:
  2639. self.val_presets[nr]["CFG"] = OrderedDict()
  2640. if "BUTTON" not in self.val_presets[nr]["CFG"]:
  2641. self.val_presets[nr]["CFG"]["BUTTON"] = ""
  2642. if type(txt) is str:
  2643. self.val_presets[nr]["CFG"]["BUTTON"] = txt
  2644. if self.val_presets[nr]["CFG"]["BUTTON"] is None:
  2645. self.val_presets[nr]["CFG"]["BUTTON"] = ""
  2646. print("EEE", self.val_presets[nr]["CFG"]["BUTTON"] )
  2647. return self.val_presets[nr]["CFG"]["BUTTON"]
  2648. def label(self,nr,txt=None):
  2649. if nr not in self.label_presets:
  2650. return ""
  2651. if type(txt) is str:
  2652. self.label_presets[nr] = txt
  2653. print("set label",nr,[txt])
  2654. print("??? ?? set label",nr,[txt])
  2655. return self.label_presets[nr]
  2656. def clear_move(self):
  2657. cprint("PRESETS.clear_move()",end=" ")
  2658. self.clear_copy()
  2659. def clear_copy(self):
  2660. cprint("PRESETS.clear_copy()",end=" ")
  2661. if self._last_copy is not None:
  2662. cprint("=OK=",color="red")
  2663. self._last_copy = None
  2664. else:
  2665. cprint("=NONE=",color="green")
  2666. def copy(self,nr,overwrite=1):
  2667. cprint("PRESETS._copy",nr,"last",self._last_copy)
  2668. if nr:
  2669. if self._last_copy is not None:
  2670. if modes.val("COPY"):
  2671. modes.val("COPY",3)
  2672. ok = self._copy(self._last_copy,nr,overwrite=overwrite)
  2673. return ok #ok
  2674. else:
  2675. if modes.val("COPY"):
  2676. modes.val("COPY",2)
  2677. self._last_copy = nr
  2678. cprint("PRESETS.copy START ",color="red")
  2679. return 0
  2680. return 1 # on error reset move
  2681. def _copy(self,nr_from,nr_to,overwrite=1):
  2682. cprint("PRESETS._copy",nr_from,"to",nr_to)
  2683. self.check_cfg(nr_from)
  2684. if self._last_copy is None:
  2685. cprint("PRESETS._copy last nr is None")
  2686. return 0
  2687. if nr_from in self.val_presets and nr_to in self.val_presets:
  2688. fdata = self.val_presets[nr_from]
  2689. tdata = self.val_presets[nr_to]
  2690. #cprint(fdata)
  2691. flabel = self.label_presets[nr_from]
  2692. tlabel = self.label_presets[nr_to]
  2693. self.val_presets[nr_to] = copy.deepcopy(fdata)
  2694. self.label_presets[nr_to] = flabel
  2695. if not overwrite: #default
  2696. cprint("overwrite",overwrite)
  2697. self.val_presets[nr_from] = copy.deepcopy(tdata)
  2698. self.label_presets[nr_from] = tlabel
  2699. #self.label_presets[nr_from] = "MOVE"
  2700. self.clear_copy()
  2701. cprint("PRESETS.copy OK",color="red")
  2702. return 1
  2703. def move(self,nr):
  2704. cprint("PRESETS.move",self._last_copy,"to",nr)
  2705. if nr:
  2706. last = self._last_copy
  2707. if modes.val("MOVE"):
  2708. modes.val("MOVE",2)
  2709. ok= self.copy(nr,overwrite=0)
  2710. if ok and last:
  2711. if modes.val("MOVE"):
  2712. modes.val("MOVE",3)
  2713. cprint("PRESETS.move OK",color="red")
  2714. #self.delete(last)
  2715. return ok #ok
  2716. return 0 # on error reset move
  2717. def delete(self,nr):
  2718. cprint("PRESETS.delete",nr)
  2719. ok=0
  2720. if nr in self.val_presets:
  2721. self.val_presets[nr] = OrderedDict()
  2722. self.label_presets[nr] = ""
  2723. ok = 1
  2724. self.check_cfg(nr)
  2725. return ok
  2726. def rec(self,nr,data,arg=""):
  2727. print("rec",self,"rec()",data,arg)
  2728. self.check_cfg(nr)
  2729. self.val_presets[nr] = data
  2730. return 1
  2731. def test(a1="",a2=""):
  2732. print([a1,a2])
  2733. class FixtureEditor():
  2734. def __init__(self,dmx=1):
  2735. pass
  2736. self.elem=[]
  2737. self.dmx=dmx
  2738. print("init FixtureEditor",dmx)
  2739. def event(self,a1="",a2=""):
  2740. print([self.dmx,a1,a2])
  2741. j=[]
  2742. jdata = {'VALUE': int(a1), 'args': [] , 'FADE': 0,'DMX': str(self.dmx)}
  2743. j.append(jdata)
  2744. jclient_send(j)
  2745. class BufferVar():
  2746. def __init__(self,elem):
  2747. self.elem = elem
  2748. def change_dmx(self,event=""):
  2749. nr=1
  2750. txt=""
  2751. txt = tkinter.simpledialog.askstring("FADER-DMX-START",""+str(nr+1),initialvalue=txt)
  2752. print("change_dmx",[event,self])
  2753. class ELEM_FADER():
  2754. def __init__(self,frame,nr,**args):
  2755. self.frame = frame
  2756. self.nr= nr
  2757. self.id=nr
  2758. self.elem = []
  2759. width=11
  2760. frameS = tk.Frame(self.frame,bg="#005",width=width)
  2761. frameS.pack(fill=tk.Y, side=tk.LEFT)
  2762. self.frame=frameS
  2763. def event(self,a1="",a2=""):
  2764. print(self,"event",[self.nr,a1,a2])
  2765. j=[]
  2766. jdata = {'VALUE': int(a1), 'args': [] , 'FADE': 0,'DMX': str(self.nr)}
  2767. j.append(jdata)
  2768. jclient_send(j)
  2769. def set_nr(self,nr,btn=1):
  2770. self.nr=nr
  2771. try:
  2772. self.elem[btn]["text"]="{} D:{}".format(self.id,nr)
  2773. except:pass
  2774. def set_attr(self,_event=None):
  2775. txt= self.attr["text"]
  2776. txt = tkinter.simpledialog.askstring("ATTR","set attr:",initialvalue=txt)
  2777. self._set_attr(txt)
  2778. def _set_attr(self,txt=""):
  2779. if type(txt) is str:
  2780. self.attr["text"] = "{}".format(txt)
  2781. print("_set_attr",[self])
  2782. def set_mode(self,_event=None):
  2783. txt= self.mode["text"]
  2784. txt = tkinter.simpledialog.askstring("MODE S/F:","SWITCH or FADE",initialvalue=txt)
  2785. w = GUIWindow("config",master=1,width=200,height=140,left=L1,top=TOP)
  2786. #w.pack()
  2787. self._set_mode(txt)
  2788. def _set_mode(self,txt=""):
  2789. if type(txt) is str:
  2790. self.mode["text"] = "{}".format(txt[0].upper())
  2791. print("_set_attr",[self])
  2792. def _refresh(self):
  2793. pass
  2794. def pack(self,**args):
  2795. width=11
  2796. r=0
  2797. c=0
  2798. j=0
  2799. frameS=self.frame
  2800. self.b = tk.Scale(frameS,bg="lightblue", width=11,from_=255,to=0,command=self.event)
  2801. self.b.pack(fill=tk.Y, side=tk.TOP)
  2802. self.elem.append(self.b)
  2803. self.b = tk.Button(frameS,bg="lightblue",text="{}".format(self.nr), width=4,command=test)
  2804. self.b.pack(fill=tk.BOTH, side=tk.TOP)
  2805. self.elem.append(self.b)
  2806. self.b = tk.Button(frameS,bg="lightblue",text="", width=5,command=self.set_attr)
  2807. self.attr=self.b
  2808. self.b.pack(fill=tk.BOTH, side=tk.TOP)
  2809. self.elem.append(self.b)
  2810. self.b = tk.Button(frameS,bg="lightblue",text="FADE", width=4,command=self.set_mode)
  2811. self.mode=self.b
  2812. self.b.pack(fill=tk.BOTH, side=tk.TOP)
  2813. self.elem.append(self.b)
  2814. self.b = tk.Label(frameS,bg="black",text="", width=4)
  2815. self.b.pack(fill=tk.BOTH, side=tk.TOP)
  2816. self.elem.append(self.b)
  2817. class GUI_FaderLayout():
  2818. def __init__(self,root,data,title="tilte",width=800):
  2819. r=0
  2820. c=0
  2821. i=1
  2822. self.elem=[]
  2823. self.header=[]
  2824. self.data = data
  2825. self.frame = tk.Frame(root,bg="black",width=width)
  2826. self.frame.pack(fill=tk.BOTH, side=tk.TOP)
  2827. self.b = tk.Label(self.frame,bg="#fff",text="Fixture Editor" )
  2828. self.b.pack(fill=None, side=tk.LEFT)
  2829. self.frame = tk.Frame(root,bg="black",width=width)
  2830. self.frame.pack(fill=tk.BOTH, side=tk.TOP)
  2831. self.b = tk.Label(self.frame,bg="#ddd",text="NAME:")
  2832. self.b.pack(fill=None, side=tk.LEFT)
  2833. self.b = tk.Button(self.frame,bg="lightblue",text="MAC-500", width=11)
  2834. self.name=self.b
  2835. self.b["command"] = self.set_name
  2836. self.b.pack( side=tk.LEFT)
  2837. self.b = tk.Label(self.frame,bg="lightblue",text="UNIV:")
  2838. self.b.pack(fill=None, side=tk.LEFT)
  2839. self.b = tk.Button(self.frame,bg="lightblue",text="1", width=4)#,command=self.event) #bv.change_dmx)
  2840. self.entry=self.b
  2841. self.b["command"] = self.event
  2842. self.b.pack( side=tk.LEFT)
  2843. self.b = tk.Label(self.frame,bg="lightblue",text="DMX:")
  2844. self.b.pack(fill=None, side=tk.LEFT)
  2845. self.b = tk.Button(self.frame,bg="lightblue",text="1", width=4)#,command=self.event) #bv.change_dmx)
  2846. self.entry=self.b
  2847. self.b["command"] = self.event
  2848. self.b.pack( side=tk.LEFT)
  2849. self.b = tk.Label(self.frame,bg="#ddd",text="TYPE:")
  2850. self.b.pack(fill=None, side=tk.LEFT)
  2851. self.b = tk.Button(self.frame,bg="lightblue",text="Empty", width=5)#,command=self.event) #bv.change_dmx)
  2852. self.b["command"] = self.load_EMPTY
  2853. self.b.pack( side=tk.LEFT)
  2854. self.b = tk.Button(self.frame,bg="lightblue",text="DIM", width=5)#,command=self.event) #bv.change_dmx)
  2855. self.b["command"] = self.load_DIM
  2856. self.b.pack( side=tk.LEFT)
  2857. self.b = tk.Button(self.frame,bg="lightblue",text="IRGB", width=5)#,command=self.event) #bv.change_dmx)
  2858. self.b["command"] = self.load_LED
  2859. self.b.pack( side=tk.LEFT)
  2860. self.b = tk.Button(self.frame,bg="lightblue",text="MH", width=5)#,command=self.event) #bv.change_dmx)
  2861. self.b["command"] = self.load_MH
  2862. self.b.pack( side=tk.LEFT)
  2863. self.b = tk.Button(self.frame,bg="lightblue",text="MH2", width=5)#,command=self.event) #bv.change_dmx)
  2864. self.b["command"] = self.load_MH2
  2865. self.b.pack( side=tk.LEFT)
  2866. self.b = tk.Label(self.frame,bg="black",text="") # spacer
  2867. self.b.pack(fill=tk.Y, side=tk.LEFT)
  2868. self.frame = tk.Frame(root,bg="magenta",width=width,border=2) # fader frame
  2869. self.frame.pack(fill=tk.BOTH, side=tk.TOP)
  2870. r=0
  2871. c=0
  2872. pb=12
  2873. self.pb=pb
  2874. for j,row in enumerate(data):
  2875. if c % pb == 0 or c==0:
  2876. h=hex(j*10)[2:].rjust(2,"0")
  2877. frameS = tk.Frame(self.frame,bg="#000",width=width,border=2)
  2878. frameS.pack(fill=tk.BOTH, side=tk.TOP)
  2879. p=j//pb+1
  2880. txt="BANK:{} {}-{}".format(p,p*pb-pb+1,p*pb)
  2881. self.b = tk.Label(frameS,bg="lightblue",text=txt,width=15)
  2882. self.header.append(self.b)
  2883. self.b.pack(fill=None, side=tk.LEFT)
  2884. self.b = tk.Label(frameS,bg="black",text="" ,width=11)
  2885. self.b.pack(fill=tk.BOTH, side=tk.LEFT)
  2886. frameS = tk.Frame(self.frame,bg="#a000{}".format(h),width=width,border=2)
  2887. c=0
  2888. print(frameS)
  2889. e= ELEM_FADER(frameS,nr=j+1)
  2890. e.pack()
  2891. self.elem.append(e)
  2892. frameS.pack(fill=tk.X, side=tk.TOP)
  2893. c+=1
  2894. i+=1
  2895. self.frame.pack()
  2896. def set_name(self,_event=None):
  2897. txt = self.name["text"]
  2898. txt = tkinter.simpledialog.askstring("FIXTURE NAME:","NAME:",initialvalue=txt)
  2899. self.name["text"] = "{}".format(txt)
  2900. print("change_dmx",[_event,self])
  2901. def load_EMPTY(self,_event=None,attr=[]):
  2902. #attr = [,"RED","GREEN","BLUE"]
  2903. #mode = ["F","F","F","F"]
  2904. self._load_mh(None)#,attr,mode)
  2905. def load_DIM(self,_event=None,attr=[]):
  2906. attr = ["DIM"]
  2907. mode = ["F"]
  2908. self._load_mh(None,attr,mode)
  2909. def load_LED(self,_event=None,attr=[]):
  2910. attr = ["DIM","RED","GREEN","BLUE"]
  2911. mode = ["F","F","F","F"]
  2912. self._load_mh(None,attr,mode)
  2913. def load_MH(self,_event=None,attr=[]):
  2914. attr = ["PAN","PAN-FINE","TILT","TILT-FINE","SHUTTER","DIM","RED","GREEN","BLUE","GOBO"]
  2915. mode = ["F","F","F","F","S","F","F","F","F","S"]
  2916. self._load_mh(None,attr,mode)
  2917. def load_MH2(self,_event=None,attr=[]):
  2918. attr = ["PAN","PAN-FINE","TILT","TILT-FINE","SHUTTER","DIM","RED","GREEN","BLUE","GOBO","G-ROT","PRISM","P-ROT","ZOOM","CONTR"]
  2919. mode = ["F","F","F","F","S","F","F","F","F","S","S","S","S","F","S"]
  2920. self._load_mh(None,attr,mode)
  2921. def _load_mh(self,_event=None,attr=[],mode=[]):
  2922. print("load_fixture",[_event,self])
  2923. #for i,e in enumerate(self.elem):
  2924. for i,e in enumerate(self.elem):
  2925. #print(self,"event",_event,e)
  2926. print("event",_event,e)
  2927. e._set_attr( "---")
  2928. if len(attr) > i:
  2929. e._set_attr( attr[i])
  2930. e._set_mode( "---")
  2931. if len(mode) > i:
  2932. e._set_mode( mode[i])
  2933. def event(self,_event=None):
  2934. nr=1
  2935. txt="dd"
  2936. txt= self.entry["text"]
  2937. txt = tkinter.simpledialog.askstring("FADER-DMX-START",""+str(nr+1),initialvalue=txt)
  2938. nr = int(txt)
  2939. self.entry["text"] = "{}".format(nr)
  2940. print("change_dmx",[_event,self])
  2941. for i,e in enumerate(self.elem):
  2942. #print(self,"event",_event,e)
  2943. print("event",_event,e)
  2944. e.set_nr(nr+i)
  2945. pb=self.pb
  2946. for j,e in enumerate(self.header):
  2947. p=j+1
  2948. #p=nr/pb
  2949. txt="BANK:{} {}-{}".format(p,p*pb-pb+nr,p*pb+nr-1)
  2950. print("---",j,txt,e)
  2951. e["text"] = txt
  2952. class GUI_grid():
  2953. def __init__(self,root,data,title="tilte",width=800):
  2954. self.data = data
  2955. self.frame = tk.Frame(root,bg="black",width=width)
  2956. self.frame.pack(fill=tk.BOTH, side=tk.LEFT)
  2957. r=0
  2958. c=0
  2959. i=1
  2960. for row in data:
  2961. self.b = tk.Button(self.frame,bg="lightblue", text=row["text"],width=11,height=4)
  2962. #self.b.bind("<Button>",Xevent(fix=fix,elem=b).cb)
  2963. self.b.grid(row=r, column=c, sticky=tk.W+tk.E)#,anchor="w")
  2964. c+=1
  2965. if c % 8 == 0:
  2966. r+=1
  2967. c=0
  2968. i+=1
  2969. self.frame.pack()
  2970. class BEvent():
  2971. def __init__(self,data,cb):
  2972. self._data = data
  2973. self._cb = cb
  2974. def cb(self,event):
  2975. #print(self,event)
  2976. self._cb(event,self._data)
  2977. class GUI_menu():
  2978. def __init__(self,root,data,title="tilte",width=800):
  2979. global tk
  2980. self.data = data
  2981. self.data2 = {}
  2982. self.frame = tk.Frame(root,bg="black",width=width)
  2983. self.frame.pack(fill=tk.BOTH, side=tk.LEFT)
  2984. r=0
  2985. c=0
  2986. i=1
  2987. self.b = tk.Label(self.frame,bg="lightblue", text="MAIN:MENU",width=8,height=1)
  2988. self.b.grid(row=r, column=c, sticky=tk.W+tk.E)#,anchor="w")
  2989. r+=1
  2990. for row in data:
  2991. #print(i)
  2992. #row = data[i]
  2993. self.b = tk.Button(self.frame,bg="lightgrey", text=row["text"],width=8,height=2)
  2994. self.b.bind("<Button>",BEvent({"NR":i,"text":row["text"]},self.callback).cb)
  2995. self.b.grid(row=r, column=c, sticky=tk.W+tk.E)#,anchor="w")
  2996. row["elem"] = self.b
  2997. self.data2[row["text"]] = row
  2998. r+=1
  2999. i+=1
  3000. self.frame.pack()
  3001. def callback(self,event,data={}):
  3002. print("callback543",self,event,data)
  3003. window_manager.top(data["text"])# = WindowManager()
  3004. def update(self,button,text):
  3005. #print(self,button,text)
  3006. for k in self.data2:
  3007. v=self.data2[k]
  3008. #print(self,k,v)
  3009. if button == k:
  3010. v["elem"]["text"] = k+"\n"+text
  3011. def config(self,button,attr,value):
  3012. print(self,button,attr,value)
  3013. for k in self.data2:
  3014. v=self.data2[k]
  3015. #print(self,k,v)
  3016. if button == k:
  3017. #print(dir(v["elem"]))
  3018. if attr == "bg":
  3019. if value == "":
  3020. value = "lightgrey"
  3021. v["elem"]["bg"] = str(value)
  3022. lf_nr = 0
  3023. from tkinter import PhotoImage
  3024. class GUIWindow():
  3025. def __init__(self,title="tilte",master=0,width=100,height=100,left=None,top=None):
  3026. global lf_nr
  3027. #ico_path="/opt/LibreLight/Xdesk/icon/"
  3028. ico_path="./icon/"
  3029. if master:
  3030. self.tk = tkinter.Tk()
  3031. defaultFont = tkinter.font.nametofont("TkDefaultFont")
  3032. print(defaultFont)
  3033. defaultFont.configure(family="FreeSans",
  3034. size=10,
  3035. weight="bold")
  3036. #self.tk.option_add("*Font", FontBold)
  3037. # MAIN MENUE
  3038. self.tk.iconphoto(False, tk.PhotoImage(file=ico_path+"main.png"))
  3039. else:
  3040. # addtional WINDOW
  3041. self.tk = tkinter.Toplevel()
  3042. self.tk.protocol("WM_DELETE_WINDOW", self.close_app_win)
  3043. if "COLORPICKER" in title:
  3044. self.tk.iconphoto(False, tk.PhotoImage(file=ico_path+"picker.png"))
  3045. elif "ENCODER" in title:
  3046. self.tk.iconphoto(False, tk.PhotoImage(file=ico_path+"enc.png"))
  3047. elif "EXEC" in title:
  3048. self.tk.iconphoto(False, tk.PhotoImage(file=ico_path+"exec.png"))
  3049. elif "FX" in title:
  3050. self.tk.iconphoto(False, tk.PhotoImage(file=ico_path+"fx.png"))
  3051. else:
  3052. self.tk.iconphoto(False, tk.PhotoImage(file=ico_path+"scribble.png"))
  3053. self.tk["bg"] = "black"
  3054. self.tk.bind("<Button>",self.callback)
  3055. self.tk.bind("<Key>",self.callback)
  3056. self.tk.bind("<KeyRelease>",self.callback)
  3057. self.tk.title(""+str(title)+" "+str(lf_nr)+":"+str(rnd_id))
  3058. lf_nr+=1
  3059. #self.tk.geometry("270x600+0+65")
  3060. geo ="{}x{}".format(width,height)
  3061. if left is not None:
  3062. geo += "+{}".format(left)
  3063. if top is not None:
  3064. geo += "+{}".format(top)
  3065. #self._event_clear = Xevent(fix=0,elem=None,attr="CLEAR",data=self,mode="ROOT").cb
  3066. self.tk.geometry(geo)
  3067. def close_app_win(self,event):
  3068. print("close_app_win",self,event)
  3069. def title(self,title=None):
  3070. if title is None:
  3071. return self.tk.title()
  3072. else:
  3073. return self.tk.title(title)
  3074. def show(self):
  3075. pass
  3076. def mainloop(self):
  3077. try:
  3078. self.tk.mainloop()
  3079. finally:
  3080. self.tk.quit()
  3081. def callback(self,event,data={}):#value=255):
  3082. print()
  3083. print()
  3084. cprint("<GUI>",event,color="yellow")
  3085. cprint("<GUI>",event.state,data,[event.type],color="yellow")
  3086. value = 255
  3087. if "Release" in str(event.type) or str(event.type) == '5' or str(event.type) == '3':
  3088. value = 0
  3089. if "keysym" in dir(event):
  3090. if "Escape" == event.keysym:
  3091. FIXTURES.clear()
  3092. modes.val("ESC",1)
  3093. master.refresh_fix()
  3094. elif event.keysym in "ebfclrms" and value:
  3095. if "e" == event.keysym:
  3096. modes.val("EDIT",1)
  3097. elif "b" == event.keysym:
  3098. modes.val("BLIND",1)
  3099. elif "f" == event.keysym:
  3100. modes.val("FLASH",1)
  3101. elif "c" == event.keysym:
  3102. modes.val("CFG-BTN",1)
  3103. elif "l" == event.keysym:
  3104. modes.val("LABEL",1)
  3105. elif "r" == event.keysym:
  3106. modes.val("REC",1)
  3107. elif "m" == event.keysym:
  3108. x=modes.val("MOVE",1)
  3109. if not x:
  3110. PRESETS.clear_move()
  3111. elif "s" == event.keysym:
  3112. modes.val("SELECT",1)
  3113. elif event.keysym in ["F1","F2","F3","F4","F5","F6","F7","F8","F9","F10","F11","F12"]:
  3114. nr = int( event.keysym[1])
  3115. nr = nr-1+81
  3116. cprint("F-KEY",value,nr)
  3117. master.preset_go(nr-1,xfade=None,val=value)
  3118. elif event.keysym in ["1","2","3","4","5","6","7","8","9","0"]:
  3119. nr = int( event.keysym)
  3120. if nr == 0:
  3121. nr = 10
  3122. nr = nr-1+161
  3123. cprint("NUM-KEY",value,nr)
  3124. master.preset_go(nr-1,xfade=None,val=value)
  3125. elif "End" == event.keysym:
  3126. FIXTURES.fx_off("all")
  3127. CONSOLE.fx_off("all")
  3128. CONSOLE.flash_off("all")
  3129. elif "Delete" == event.keysym:
  3130. #PRESETS.delete(nr)
  3131. if value:
  3132. modes.val("DEL",1)
  3133. class WindowManager():
  3134. def __init__(self):
  3135. self.windows = {}
  3136. self.nr= 0
  3137. self.first=""
  3138. def new(self,w,name=""):
  3139. if not self.first:
  3140. if name:
  3141. self.first = name
  3142. else:
  3143. self.first = str(self.nr)
  3144. w.tk.attributes('-topmost',True)
  3145. if name:
  3146. self.windows[str(name)] = w
  3147. else:
  3148. self.windows[str(self.nr)] = w
  3149. self.nr+=1
  3150. #w.show()
  3151. def mainloop(self):
  3152. self.windows[self.first].mainloop()
  3153. def top(self,name):
  3154. name = str(name)
  3155. if name in self.windows:
  3156. self.windows[name].tk.attributes('-topmost',True)
  3157. self.windows[name].tk.attributes('-topmost',False)
  3158. else:
  3159. print(name,"not in self.windows",self.windows.keys())
  3160. class Console():
  3161. def __init__(self):
  3162. pass
  3163. def flash_off(self,fix):
  3164. pass#client.send("df0:alloff:::,")
  3165. def fx_off(self,fix):
  3166. cprint("Console.fx_off()",fix)
  3167. if not fix or fix == "all":
  3168. #client.send("fx0:alloff:,fxf:alloff:,")
  3169. #client.send("df0:alloff:::,")
  3170. j = []
  3171. if 0:
  3172. jdata = {'VALUE': None, 'args': [], 'FX': 'alloff::::', 'FADE': 2, 'DMX': '0'}
  3173. j.append(jdata)
  3174. jdata = {'VALUE': None, 'args': [], 'FX': 'alloff::::', 'FADE': 2,'FLASH':1, 'DMX': '0'}
  3175. j.append(jdata)
  3176. else:
  3177. jdata = {'VALUE': None, 'args': [], 'FX2': {"TYPE":"alloff"}, 'FADE': 2,'FLASH':1, 'DMX': '1'}
  3178. j.append(jdata)
  3179. jclient_send(j)
  3180. return 0
  3181. window_manager = WindowManager()
  3182. CONSOLE = Console()
  3183. PRESETS = Presets()
  3184. PRESETS.load_presets()
  3185. FIXTURES = Fixtures()
  3186. FIXTURES.load_patch()
  3187. master = GUI()
  3188. class Refresher():
  3189. def __init__(self):
  3190. self.time = time.time()+1
  3191. def reset(self):
  3192. self.time = time.time()+.1
  3193. def refresh(self):
  3194. if time.time() > self.time:
  3195. if time.time() < self.time+2:
  3196. #self.time = time.time()+1
  3197. self._refresh()
  3198. def _refresh(self):
  3199. master._refresh_fix()
  3200. master._refresh_exec()
  3201. def loop(self,args={}):
  3202. while 1:
  3203. self.refresh()
  3204. time.sleep(0.2)
  3205. refresher = Refresher()
  3206. thread.start_new_thread(refresher.loop,())
  3207. TOP = 15
  3208. L1 = 95
  3209. L2 = 920
  3210. W1 = 800
  3211. H1 = 550
  3212. HTB = 23 # hight of the titlebar from window manager
  3213. w = GUIWindow("MAIN",master=1,width=85,height=H1//2,left=0,top=TOP)
  3214. gui_menu_gui = w
  3215. data = []
  3216. #data.append({"text":"COMMAND"})
  3217. data.append({"text":"PATCH"})
  3218. data.append({"text":"DIMMER"})
  3219. data.append({"text":"FIXTURES"})
  3220. data.append({"text":"EXEC"})
  3221. gui_menu = GUI_menu(w.tk,data)
  3222. window_manager.new(w)
  3223. name="EXEC"
  3224. w = GUIWindow(name,master=0,width=W1,height=H1,left=L1,top=TOP)
  3225. w1 = ScrollFrame(w.tk,width=W1,height=H1)
  3226. #frame_exe = w.tk
  3227. master.draw_preset(w1)#w.tk)
  3228. window_manager.new(w,name)
  3229. name="DIMMER"
  3230. w = GUIWindow(name,master=0,width=W1,height=H1,left=L1,top=TOP)
  3231. w2 = ScrollFrame(w.tk,width=W1,height=H1)
  3232. #frame_dim = w1 # w.tk
  3233. #master.draw_dim(w1.tk)
  3234. window_manager.new(w,name)
  3235. name="FIXTURES"
  3236. w = GUIWindow(name,master=0,width=W1,height=H1,left=L1,top=TOP)
  3237. w1 = ScrollFrame(w.tk,width=W1,height=H1)
  3238. #frame_fix = w1 #w.tk
  3239. master.draw_fix(w1,w2)#.tk)
  3240. window_manager.new(w,name)
  3241. name="FIXTURE-EDITOR"
  3242. w = GUIWindow(name,master=0,width=W1,height=H1,left=L1,top=TOP)
  3243. w1 = ScrollFrame(w.tk,width=W1,height=H1)
  3244. data=[]
  3245. for i in range(24+12):
  3246. data.append({"text"+str(i):"test"})
  3247. GUI_FaderLayout(w1,data)
  3248. #frame_fix = w1 #w.tk
  3249. #master.draw_fix(w1,w2)#.tk)
  3250. window_manager.new(w,name)
  3251. name="ENCODER"
  3252. ww = GUIWindow(name,master=0,width=600,height=100,left=720,top=HTB*2+TOP+H1)
  3253. Xroot = ww.tk
  3254. w = None
  3255. root = tk.Frame(Xroot,bg="black",width="10px")
  3256. print("print pack",root)
  3257. root.pack(fill=tk.BOTH,expand=0, side=tk.LEFT)
  3258. root3 = tk.Frame(Xroot,bg="black",width="20px")
  3259. root3.pack(fill=tk.BOTH,expand=0, side=tk.LEFT)
  3260. root2 = tk.Frame(Xroot,bg="black",width="1px")
  3261. master.draw_enc(root2)
  3262. root2.pack(fill=tk.BOTH,expand=0, side=tk.LEFT)
  3263. name = "SETUP"
  3264. w = GUIWindow(name,master=0,width=415,height=42,left=10+L1+W1,top=TOP)
  3265. master.draw_setup(w.tk)
  3266. window_manager.new(w,name)
  3267. name = "COMMAND"
  3268. w = GUIWindow(name,master=0,width=415,height=130,left=10+L1+W1,top=98)
  3269. master.draw_command(w.tk)
  3270. window_manager.new(w,name)
  3271. name = "LIVE"
  3272. w = GUIWindow(name,master=0,width=415,height=42,left=10+L1+W1,top=255)
  3273. master.draw_live(w.tk)
  3274. window_manager.new(w,name)
  3275. name="FX"
  3276. w = GUIWindow(name,master=0,width=415,height=250,left=10+L1+W1,top=328)
  3277. #frame_fx = w.tk
  3278. master.draw_fx(w.tk)
  3279. window_manager.new(w,name)
  3280. name="PATCH"
  3281. w = GUIWindow(name,master=0,width=W1,height=H1,left=L1,top=TOP)
  3282. w1 = ScrollFrame(w.tk,width=W1,height=H1)
  3283. master.draw_patch(w1)
  3284. window_manager.new(w,name)
  3285. #LibreLightDesk
  3286. name="COLORPICKER"
  3287. w = GUIWindow(name,master=0,width=580,height=100,left=L1,top=20+HTB*2+H1)
  3288. master.draw_colorpicker(w.tk)
  3289. window_manager.new(w,name)
  3290. name="Table"
  3291. w# = GUIWindow(name,master=0,width=580,height=100,left=80,top=620)
  3292. w = GUIWindow(name,master=0,width=W1,height=H1,left=L1,top=TOP)
  3293. x=TableFrame(root=w.tk)#,left=80,top=620)
  3294. data =[]
  3295. for a in range(40):
  3296. data.append(["E","E{}".format(a+1)])
  3297. x.draw(data=data,head=["E","C"],config=[12,5,5])
  3298. w=x.bframe
  3299. #window_manager.new(w,name)
  3300. #Xroot = tk.Tk()
  3301. #Xroot["bg"] = "black" #white
  3302. #Xroot.title( xtitle+" "+str(rnd_id) )
  3303. #Xroot.geometry("1024x800+130+65")
  3304. master.render()
  3305. window_manager.top("Table")
  3306. #w = frame_fix #GUIWindow("OLD",master=0,width=W1,height=500,left=130,top=TOP)
  3307. window_manager.new(w,name)
  3308. try:
  3309. #root.mainloop()
  3310. #tk.mainloop()
  3311. window_manager.mainloop()
  3312. finally:
  3313. master.exit()