_LibreLightDesk.py 123 KB

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