_LibreLightDesk.py 104 KB

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