_LibreLightDesk.py 106 KB

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