_LibreLightDesk.py 125 KB

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