_LibreLightDesk.py 77 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200
  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, either version 2 of the License, or
  8. (at your option) any later version.
  9. LibreLight is distributed in the hope that it will be useful,
  10. but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. GNU General Public License for more details.
  13. You should have received a copy of the GNU General Public License
  14. along with LibreLight. If not, see <http://www.gnu.org/licenses/>.
  15. (c) 2012 micha.rathfelder@gmail.com
  16. """
  17. import random
  18. rnd_id = str(random.randint(1000,9000))
  19. rnd_id += " Beta 22.01"
  20. try:
  21. xtitle = __file__
  22. except:
  23. xtitle = "__file__"
  24. if "/" in xtitle:
  25. xtitle = xtitle.split("/")[-1]
  26. import sys
  27. sys.stdout.write("\x1b]2;"+str(xtitle)+" "+str(rnd_id)+"\x07") # terminal title
  28. import json
  29. import time
  30. import sys
  31. import _thread as thread
  32. import traceback
  33. import tkinter
  34. import tkinter as tk
  35. from tkinter import font
  36. import lib.chat as chat
  37. import lib.motion as motion
  38. from collections import OrderedDict
  39. show_name = "GloryCamp2021"
  40. #show_name = "JMS"
  41. #show_name = "Dimmer"
  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"]
  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 != "BLIND":
  81. self.modes[m] = 0
  82. self.callback(m)
  83. out = 1
  84. return 1
  85. elif value:
  86. for m in self.modes:
  87. if m not in protected and mode not in protected and m != mode:
  88. if self.modes[m]:
  89. self.modes[m]= 0
  90. self.callback(m)
  91. if self.modes[mode]:
  92. self.modes[mode] = 0 # value
  93. else:
  94. self.modes[mode] = 1 #value
  95. out = 1
  96. else:
  97. self.modes[mode] = 0 #value
  98. self.callback(mode)
  99. return value
  100. def set_cb(self,cb):
  101. if cb:
  102. self.__cb = cb
  103. def callback(self,mode):
  104. if self.__cb is not None and mode in self.modes:
  105. value = self.modes[mode]
  106. self.__cb(mode=mode,value=value)
  107. modes = Modes()
  108. #modes.val("BLIND", 0)
  109. #modes.modes["BLIND"] = 0
  110. modes.modes["ESC"] = 0
  111. modes.modes["STORE"] = 0
  112. modes.modes["EDIT"] = 0
  113. modes.modes["MOVE"] = 0
  114. modes.modes["FLASH"] = 0
  115. modes.modes["STONY_FX"] = 0
  116. modes.modes["SELECT"] = 0
  117. modes.modes["ACTIVATE"] = 0
  118. modes.modes["CFG-BTN"] = 0
  119. modes.modes["LABEL"] = 0
  120. def xcb(mode,value=None):
  121. print("xcb","MODE CALLBACK",mode,value)
  122. #modes.set_cb(xcb)
  123. POS = ["PAN","TILT","MOTION"]
  124. COLOR = ["RED","GREEN","BLUE","COLOR"]
  125. BEAM = ["GOBO","G-ROT","PRISMA","P-ROT","FOCUS","SPEED"]
  126. INT = ["DIM","SHUTTER","STROBE","FUNC"]
  127. client = chat.tcp_sender()
  128. fade = 2 #2 #0.1 #1.13
  129. fade_on = 1
  130. fx_prm = {"SIZE":20,"SPEED":100,"OFFSET":50,"BASE":"-","START":0}
  131. def build_cmd(dmx,val,args=[fade],flash=0,xpfx="",attr=""):
  132. cmd=""
  133. if xpfx:
  134. pfx=xpfx
  135. elif flash:
  136. pfx ="df"
  137. else:
  138. pfx ="d"
  139. if type(val) is float or type(val) is int:
  140. cmd += ",{}{}:{:0.4f}".format(pfx,dmx,val)
  141. else:
  142. cmd += ",{}{}:{}".format(pfx,dmx,val)
  143. if flash:
  144. cmd += ":0:0"#.format(val)
  145. else:
  146. for val in args:
  147. if type(val) is float or type(val) is int:
  148. cmd += ":{:0.4f}".format(val)
  149. else:
  150. cmd += ":{}".format(val)
  151. if attr:
  152. cmd += ":"+str(attr)
  153. return cmd
  154. def update_raw_dmx(data ,value=None,args=[fade],flash=0,pfx="d",fx=0):
  155. cmd = []
  156. if flash:
  157. pfx += "f"
  158. for row in data:
  159. if fx:
  160. if value is not None:
  161. # z.b. flush off
  162. xcmd = str(value)+":"+row["FX"].split(":",1)[-1]
  163. else:
  164. xcmd = row["FX"]
  165. else:
  166. if row["VALUE"] is None:
  167. xcmd = ""
  168. else:
  169. if value is not None:
  170. if type(value) is float:
  171. xcmd = "{:0.4f}".format(value)
  172. else:
  173. xcmd = "{}".format(value)
  174. else:
  175. xcmd = "{:0.4f}".format(row["VALUE"])
  176. for arg in args:
  177. if type(arg) is float:
  178. xcmd += ":{}".format(arg)
  179. else:
  180. xcmd += ":{:0.4f}".format(arg)
  181. #print( "pack: FIX",row["FIX"],row["ATTR"], xcmd)
  182. #xcmd += ":{}".format(row["ATTR"])
  183. cmd.append( xcmd)
  184. return cmd
  185. def update_dmx(attr,data,value=None,args=[fade],flash=0,pfx=""):
  186. #global modes #BLIND
  187. #print("update_dmx",data)
  188. dmx = data["DMX"]
  189. dmx = (data["UNIVERS"]*512)+data["DMX"]
  190. val = None
  191. cmd=""
  192. try:
  193. if attr == "DIM" and data["ATTRIBUT"][attr]["NR"] < 0: #VDIM
  194. #print( "VDIM")
  195. for attr in data["ATTRIBUT"]:
  196. dmx = (data["UNIVERS"]*512) + data["DMX"]
  197. dmx = data["DMX"]
  198. if data["ATTRIBUT"][attr]["NR"] < 0: #virtual channels
  199. continue
  200. dmx += data["ATTRIBUT"][attr]["NR"]-1
  201. mode = ""
  202. if "MODE" in data["ATTRIBUT"][attr]:
  203. mode = data["ATTRIBUT"][attr]["MODE"]
  204. #print(attr)
  205. val = data["ATTRIBUT"][attr]["VALUE"]
  206. if data["ATTRIBUT"][attr]["MASTER"]:
  207. val = val * (data["ATTRIBUT"]["DIM"]["VALUE"] / 255.)
  208. if val is not None:
  209. #cmd += ",d{}:{:0.4f}".format(dmx,int(val))
  210. if value is not None:
  211. val = value
  212. if mode == "F": #FADE
  213. cmd += build_cmd(dmx,val,args=args,flash=flash,xpfx=pfx,attr=attr)
  214. else:
  215. cmd += build_cmd(dmx,val,args=[0],flash=flash,xpfx=pfx,attr=attr)
  216. #print("cmd",cmd)
  217. elif data["ATTRIBUT"][attr]["NR"] > 0:
  218. dmx += data["ATTRIBUT"][attr]["NR"]-1
  219. val = data["ATTRIBUT"][attr]["VALUE"]
  220. mode = ""
  221. if "MODE" in data["ATTRIBUT"][attr]:
  222. mode = data["ATTRIBUT"][attr]["MODE"]
  223. if data["ATTRIBUT"][attr]["MASTER"]:
  224. #if "VDIM" in data["ATTRIBUT"]:
  225. if "DIM" in data["ATTRIBUT"] and data["ATTRIBUT"]["DIM"]["NR"] < 0: #VDIM
  226. val = val * (data["ATTRIBUT"]["DIM"]["VALUE"] / 255.)
  227. if val is not None:
  228. #cmd += ",d{}:{}".format(dmx,int(val))
  229. if value is not None:
  230. val = value
  231. if mode == "F": #FADE
  232. cmd += build_cmd(dmx,val,args=args,flash=flash,xpfx=pfx,attr=attr)
  233. else:
  234. cmd += build_cmd(dmx,val,args=[0],flash=flash,xpfx=pfx,attr=attr)
  235. #print("cmd",cmd)
  236. if modes.val("BLIND"):
  237. cmd=""
  238. return cmd
  239. except Exception as e:
  240. cprint("== cb EXCEPT",e,color="red")
  241. cprint("Error on line {}".format(sys.exc_info()[-1].tb_lineno),color="red")
  242. cprint(''.join(traceback.format_exception(None, e, e.__traceback__)),color="red")
  243. raise e
  244. class dummy_event():
  245. def __init__(self):
  246. self.num =0
  247. self.type = 4 #press 5 release
  248. self.set_value=-1
  249. gcolor = 1
  250. def cprint(*text,color="blue",space=" ",end="\n"):
  251. if not gcolor:
  252. print(text)
  253. return 0
  254. if color == "green":
  255. txt = '\033[92m'
  256. elif color == "red":
  257. txt = '\033[0;31m\033[1m'
  258. elif color == "yellow":
  259. txt = '\033[93m\033[1m'
  260. elif color == "cyan":
  261. txt = '\033[96m'
  262. else:
  263. txt = '\033[94m'
  264. for t in text:
  265. txt += str(t ) +" "
  266. #HEADER = '\033[95m'
  267. #OKBLUE = '\033[94m'
  268. #OKCYAN = '\033[96m'
  269. #OKGREEN = '\033[92m'
  270. #WARNING = '\033[93m'
  271. #FAIL = '\033[91m'
  272. #ENDC = '\033[0m'
  273. #BOLD = '\033[1m'
  274. #UNDERLINE = '\033[4m'
  275. txt += '\033[0m'
  276. print(txt,end=end)
  277. #return txt
  278. cprint("________________________________")
  279. class Xevent():
  280. def __init__(self,fix,elem,attr=None,data=None,mode=None):
  281. self.data=data
  282. self.attr = attr
  283. self.elem = elem
  284. self.mode = mode
  285. def encoder(self,fix,attr,data,elem,action="",xfade=None):
  286. if action == "click":
  287. print("encoder",fix,attr,action,data)
  288. cprint(type(self.data))
  289. if self.data is dict or self.data is OrderedDict:
  290. if "ATTRIBUT" in self.data:
  291. if attr in self.data["ATTRIBUT"]:
  292. if "ACTIVE" in self.data["ATTRIBUT"][attr]:
  293. if self.data["ATTRIBUT"][attr]["ACTIVE"]:
  294. self.data["ATTRIBUT"][attr]["ACTIVE"] = 0
  295. self.elem["bg"] = "grey"
  296. else:
  297. self.data["ATTRIBUT"][attr]["ACTIVE"] = 1
  298. self.elem["bg"] = "yellow"
  299. return 1
  300. v2=data["ATTRIBUT"][attr]["VALUE"]
  301. change=0
  302. increment = 4.11
  303. if action == "+":
  304. v2+= increment
  305. v = "+{:0.4f}".format( increment ) #) #4.11"
  306. change=1
  307. elif action == "-":
  308. v2-= increment
  309. v = "-{:0.4f}".format( increment ) #) #4.11"
  310. change=1
  311. elif type(action) is int or type(action) is float:
  312. #v2-= increment
  313. #v = "-{:0.4f}".format( increment ) #) #4.11"
  314. v2 = action
  315. change=1
  316. if v2 < 0:
  317. v2=0
  318. elif v2 > 256:
  319. v2=256
  320. if change:
  321. data["ATTRIBUT"][attr]["ACTIVE"] = 1
  322. elem["bg"] = "yellow"
  323. #v2 = v
  324. #v = data["ATTRIBUT"][attr]["VALUE"]
  325. data["ATTRIBUT"][attr]["VALUE"] = v2
  326. elem["text"] = "{} {:0.2f}".format(attr,v2)
  327. #worker.fade_dmx(fix,attr,data,v,v2,ft=0)
  328. if xfade:
  329. cmd=update_dmx(attr=attr,data=data)
  330. else:
  331. cmd=update_dmx(attr=attr,data=data,args=[0])
  332. #data["ATTRIBUT"][attr]["VALUE"] = v2
  333. if cmd and not modes.val("BLIND"):
  334. client.send(cmd)
  335. def clear(self,event=None):
  336. ok = self.data.FIXTURES.clear(event)
  337. if ok:
  338. for fix in self.data.elem_attr:
  339. for attr in self.data.elem_attr[fix]:
  340. if fix in self.data.elem_attr:
  341. if attr in self.data.elem_attr[fix]:
  342. self.data.elem_attr[fix][attr]["bg"] = "grey"
  343. return 0
  344. if modes.val("STORE"):
  345. self.data.val_commands["STORE"] = 0
  346. modes.val("STORE",0)# = 0
  347. else:
  348. for fix in self.data.FIXTURES.fixtures:
  349. data = self.data.FIXTURES.fixtures[fix]
  350. for attr in data["ATTRIBUT"]:
  351. if attr.endswith("-FINE"):
  352. continue
  353. self.data.elem_attr[fix][attr]["bg"] = "grey"
  354. print( "CB CLEAR" )
  355. def command(self,event):
  356. if self.mode == "COMMAND":
  357. if self.attr == "CLEAR":
  358. if event.num == 1:
  359. self.clear()
  360. #self.button_refresh("STORE","grey")
  361. #modes.val("STORE",0)
  362. modes.val(self.attr,0)
  363. #modes.val("CLEAR",0)
  364. elif self.attr.startswith("SZ:"):#SIN":
  365. #global fx_prm
  366. k = "SIZE"
  367. if event.num == 1:
  368. pass
  369. elif event.num == 2:
  370. pass
  371. elif event.num == 4:
  372. if fx_prm[k] <= 0:
  373. fx_prm[k] = 1
  374. fx_prm[k] *=1.2
  375. elif event.num == 5:
  376. fx_prm[k] /=1.2
  377. #fx_prm[k] =int(fx_prm[k])
  378. if fx_prm[k] > 4000:
  379. fx_prm[k] = 4000
  380. if fx_prm[k] < 0:
  381. fx_prm[k] =0
  382. self.data.elem_fx_commands[self.attr]["text"] = "SZ:{:0.0f}".format(fx_prm[k])
  383. elif self.attr.startswith("SP:"):#SIN":
  384. #global fx_prm
  385. k = "SPEED"
  386. if event.num == 1:
  387. pass
  388. elif event.num == 2:
  389. pass
  390. elif event.num == 4:
  391. if fx_prm[k] <= 0:
  392. fx_prm[k] = 1
  393. fx_prm[k] *=1.2
  394. elif event.num == 5:
  395. fx_prm[k] /=1.2
  396. #fx_prm[k] =int(fx_prm[k])
  397. if fx_prm[k] > 4000:
  398. fx_prm[k] = 4000
  399. if fx_prm[k] < 0:
  400. fx_prm[k] =0
  401. if fx_prm[k] < 0.1:
  402. self.data.elem_fx_commands[self.attr]["text"] = "SP:off".format(fx_prm[k])
  403. else:
  404. self.data.elem_fx_commands[self.attr]["text"] = "SP:{:0.0f}".format(fx_prm[k])
  405. elif self.attr.startswith("ST:"):#SIN":
  406. #global fx_prm
  407. k = "START"
  408. if event.num == 1:
  409. pass
  410. elif event.num == 2:
  411. pass
  412. elif event.num == 4:
  413. if fx_prm[k] <= 0:
  414. fx_prm[k] = 1
  415. fx_prm[k] *=1.2
  416. elif event.num == 5:
  417. fx_prm[k] /=1.2
  418. #fx_prm[k] =int(fx_prm[k])
  419. if fx_prm[k] > 4000:
  420. fx_prm[k] = 4000
  421. if fx_prm[k] < 0:
  422. fx_prm[k] =0
  423. self.data.elem_fx_commands[self.attr]["text"] = "ST:{:0.0f}".format(fx_prm[k])
  424. elif self.attr.startswith("OF:"):#SIN":
  425. #global fx_prm
  426. k = "OFFSET"
  427. if event.num == 1:
  428. pass
  429. elif event.num == 2:
  430. pass
  431. elif event.num == 4:
  432. if fx_prm[k] <= 0:
  433. fx_prm[k] = 1
  434. fx_prm[k] *=1.2
  435. elif event.num == 5:
  436. fx_prm[k] /=1.2
  437. #fx_prm[k] =int(fx_prm[k])
  438. if fx_prm[k] > 1024:
  439. fx_prm[k] = 1024
  440. if fx_prm[k] < 0:
  441. fx_prm[k] =0
  442. self.data.elem_fx_commands[self.attr]["text"] = "OF:{:0.0f}".format(fx_prm[k])
  443. elif self.attr.startswith("BS:"):
  444. k = "BASE"
  445. if event.num == 1:
  446. fx_prm[k] = "0"
  447. elif event.num == 2:
  448. pass
  449. elif event.num == 4:
  450. fx_prm[k] = "+"
  451. elif event.num == 5:
  452. fx_prm[k] = "-"
  453. self.data.elem_fx_commands[self.attr]["text"] = "BS:{}".format(fx_prm[k])
  454. elif self.attr.startswith("FX:"):#SIN":
  455. if event.num == 1:
  456. cmd = ""
  457. offset = 0
  458. offset_flag=0
  459. start = fx_prm["START"]
  460. base = fx_prm["BASE"]
  461. for fix in self.data.FIXTURES.fixtures:
  462. data = self.data.FIXTURES.fixtures[fix]
  463. #print( "ADD FX",fix)
  464. for attr in data["ATTRIBUT"]:
  465. if attr.endswith("-FINE"):
  466. continue
  467. fx=""
  468. if "SIN" in self.attr:
  469. fx = "sinus"
  470. elif "FD" in self.attr:
  471. fx = "fade"
  472. elif "ON2" in self.attr:
  473. fx = "on2"
  474. elif "ON" in self.attr:
  475. fx = "on"
  476. elif "BUM2" in self.attr:
  477. fx = "bump2"
  478. elif "BUM" in self.attr:
  479. fx = "bump"
  480. elif "COS" in self.attr:
  481. fx = "cosinus"
  482. if fx:
  483. if fx_prm["SPEED"] < 0.1:
  484. fx = "off"
  485. else:
  486. if "DIM" in self.attr:
  487. base=""
  488. if attr == "DIM":
  489. if fx_prm["SPEED"] < 0.1:
  490. fx = "off"
  491. else:
  492. fx = "fade"
  493. elif "TILT" in self.attr:
  494. base=""
  495. if attr == "PAN":
  496. fx = "off"
  497. if attr == "TILT":
  498. if fx_prm["SPEED"] < 0.1:
  499. fx = "off"
  500. else:
  501. fx = "sinus"
  502. elif "PAN" in self.attr:
  503. base=""
  504. if attr == "PAN":
  505. if fx_prm["SPEED"] < 0.1:
  506. fx = "off"
  507. else:
  508. fx = "cosinus"
  509. if attr == "TILT":
  510. fx = "off"
  511. elif "CIR" in self.attr:
  512. base=""
  513. if attr == "PAN":
  514. if fx_prm["SPEED"] < 0.1:
  515. fx = "off"
  516. else:
  517. fx = "cosinus"
  518. if attr == "TILT":
  519. if fx_prm["SPEED"] < 0.1:
  520. fx = "off"
  521. else:
  522. fx = "sinus"
  523. if fx:
  524. fx += ":{:0.0f}:{:0.0f}:{:0.0f}:{:0.0f}:{}:".format(fx_prm["SIZE"],fx_prm["SPEED"],start,offset,base)
  525. offset_flag=1
  526. if "FX" not in data["ATTRIBUT"][attr]:
  527. data["ATTRIBUT"][attr]["FX"] =""
  528. print("ADD FX",fix,attr,fx,data["ATTRIBUT"][attr]["ACTIVE"])
  529. if data["ATTRIBUT"][attr]["ACTIVE"] and fx:
  530. print("++ADD FX",fix,attr,fx)
  531. data["ATTRIBUT"][attr]["FX"] = fx #"sinus:40:100:10"
  532. cmd+=update_dmx(attr,data,pfx="fx",value=fx)#,flash=FLASH)
  533. if fx_prm["OFFSET"] > 0.5 and offset_flag:
  534. offset_flag=0
  535. offset += fx_prm["OFFSET"] # add offset on next fixture
  536. #print("offset",offset)
  537. if cmd and not modes.val("BLIND"):
  538. client.send(cmd)
  539. elif self.attr == "FX OFF":
  540. if event.num == 1:
  541. client.send("fx0:alloff:,fxf:alloff:")
  542. self.data.elem_fx_commands[self.attr]["bg"] = "magenta"
  543. for fix in self.data.FIXTURES.fixtures:
  544. data = self.data.FIXTURES.fixtures[fix]
  545. for attr in data["ATTRIBUT"]:
  546. data["ATTRIBUT"][attr]["FX"] = ""
  547. elif self.attr == "FADE":
  548. global fade
  549. global fade_on
  550. if fade < 0.01:
  551. fade = 0.01
  552. elif fade > 100.0:
  553. fade = 100
  554. if event.num == 4:
  555. fade *= 1.1
  556. elif event.num == 5:
  557. fade /= 1.1
  558. elif event.num == 1:
  559. if fade_on:
  560. fade_on = 0
  561. self.data.elem_commands[self.attr]["bg"] = "grey"
  562. else:
  563. fade_on = 1
  564. self.data.elem_commands[self.attr]["bg"] = "green"
  565. elif event.num == 2:
  566. if fade > 1 and fade < 4:
  567. fade = 4
  568. elif fade > 3 and fade < 6:
  569. fade = 6
  570. elif fade > 5 and fade < 7:
  571. fade = 8
  572. elif fade > 7 and fade < 9:
  573. fade = 10
  574. elif fade > 9:
  575. fade = 0.01
  576. elif fade < 1:
  577. fade = 1.1
  578. self.data.elem_commands[self.attr]["text"] = "Fade{:0.2f}".format(fade)
  579. elif self.attr == "BACKUP":
  580. modes.val(self.attr,1)
  581. self.data.PRESETS.backup_presets()
  582. self.data.FIXTURES.backup_patch()
  583. #time.sleep(1)
  584. modes.val(self.attr,0)
  585. else:
  586. if event.num == 1:
  587. print("ELSE",self.attr)
  588. modes.val(self.attr,1)
  589. return 0
  590. def cb(self,event):
  591. #print("cb",self,event,data)
  592. cprint("EVENT cb",self.attr,self.mode,event,color='yellow')
  593. print(["type",event.type,"num",event.num])
  594. #print(dir(event.type))
  595. #print(dir(event),[str(event.type)])#.keys())
  596. try:
  597. #v = self.data["ATTRIBUT"][self.attr]
  598. #global modes
  599. #global STORE
  600. #global BLIND
  601. #global FLASH
  602. #global STONY_FX
  603. #global LABEL
  604. #global SELECT
  605. #global ACTIVATE
  606. #global CFG-BTN
  607. change = 0
  608. if "keysym" in dir(event):
  609. if "Escape" == event.keysym:
  610. self.clear()
  611. #CLEAR
  612. return 0
  613. if self.mode == "COMMAND":
  614. self.command(event)
  615. elif self.mode == "ROOT":
  616. if event.keysym=="Escape":
  617. pass
  618. #STORE = 0
  619. #LABEL = 0
  620. elif self.mode == "INPUT":
  621. print("INP",self.data.entry.get())
  622. if event.keycode == 36:
  623. x=self.data.entry.get()
  624. client.send(x)
  625. #self.data.entry.clean()
  626. #self.data
  627. #chat.send("")
  628. elif self.mode == "INPUT2":
  629. print("INP2",self.data.entry2.get())
  630. if event.keycode == 36:
  631. x=self.data.entry2.get()
  632. client.send(x)
  633. #self.data.entry.clean()
  634. elif self.mode == "INPUT3":
  635. print("INP3",self.data.entry3.get())
  636. if event.keycode == 36:
  637. x=self.data.entry3.get()
  638. client.send(x)
  639. #self.data.entry.clean()
  640. #self.data
  641. #chat.send("")
  642. elif self.mode == "PRESET":
  643. nr = self.attr #int(self.attr.split(":")[1])-1
  644. #print( "RRR", [str(event.type) , event.type] )
  645. #print( "PRESET EVENT",event.num)
  646. if event.num == 1:
  647. if str(event.type) == '4': #4 ButtonPress
  648. #if str(event.type) == "ButtonRelease" or event.type == '5':
  649. if modes.val("STORE"):
  650. self.data.preset_store(nr)
  651. modes.val("STORE",0)
  652. #STORE = 0
  653. #self.button_refresh("STORE","grey")
  654. #self.elem_commands["STORE"]["bg"] = "lightgrey"
  655. elif modes.val("CFG-BTN"):
  656. import tkinter.simpledialog
  657. txt = tkinter.simpledialog.askstring("CFG-BTN","GO,FLASH,TOGGLE,SWOP\n EXE:"+str(nr))
  658. if "CFG" not in self.data.PRESETS.val_presets[nr]:
  659. self.data.PRESETS.val_presets[nr]["CFG"] = OrderedDict()
  660. if "BUTTON" not in self.data.PRESETS.val_presets[nr]["CFG"]:
  661. self.data.PRESETS.val_presets[nr]["CFG"]["BUTTON"] = ""
  662. self.data.PRESETS.val_presets[nr]["CFG"]["BUTTON"] = txt
  663. sdata=self.data.PRESETS.val_presets[nr]
  664. BTN="go"
  665. if "CFG" in sdata:#["BUTTON"] = "GO"
  666. if "BUTTON" in sdata["CFG"]:
  667. BTN = sdata["CFG"]["BUTTON"]
  668. label = self.data.PRESETS.label_presets[nr] # = label
  669. txt=str(nr)+":"+str(BTN)+":"+str(len(sdata)-1)+"\n"+label
  670. self.data.elem_presets[nr]["text"] = txt
  671. modes.val("CFG-BTN",0)# = 0
  672. #self.data.elem_commands["CFG-BTN"]["bg"] = "grey"
  673. elif modes.val("LABEL"):#else:
  674. label = "lalaal"
  675. import tkinter.simpledialog
  676. label = tkinter.simpledialog.askstring("LABEL","Preset "+str(nr))
  677. if label is not None:
  678. self.data.elem_presets[nr]["text"] = label
  679. self.data.PRESETS.label_presets[nr] = label
  680. sdata=self.data.PRESETS.val_presets[nr]
  681. BTN="go"
  682. if "CFG" in sdata:#["BUTTON"] = "GO"
  683. if "BUTTON" in sdata["CFG"]:
  684. BTN = sdata["CFG"]["BUTTON"]
  685. txt=str(nr)+":"+str(BTN)+":"+str(len(sdata)-1)+"\n"+label
  686. #txt = "Preset:"+str(nr)+":\n"+str(len(l))+":"+label
  687. self.data.elem_presets[nr]["text"] = txt
  688. modes.val("LABEL", 0)
  689. self.data.elem_commands["LABEL"]["bg"] = "lightgrey"
  690. elif modes.val("ACTIVATE"):
  691. self.data.preset_select(nr)
  692. self.data.preset_go(nr,xfade=0,event=event)
  693. modes.val("ACTIVATE", 0)
  694. self.data.elem_commands["ACTIVATE"]["bg"] = "lightgrey"
  695. elif modes.val("SELECT"):
  696. self.data.preset_select(nr)
  697. else:
  698. self.data.preset_go(nr,event=event)
  699. else:
  700. self.data.preset_go(nr,event=event)
  701. if event.num == 3:
  702. if not modes.val("STORE"):
  703. self.data.preset_go(nr,xfade=0,event=event)
  704. return 0
  705. elif self.mode == "INPUT":
  706. return 0
  707. if self.mode == "ENCODER":
  708. #if self.attr == "VDIM":
  709. # self.attr = "DIM"
  710. for fix in self.data.FIXTURES.fixtures:
  711. data = self.data.FIXTURES.fixtures[fix]
  712. for attr in data["ATTRIBUT"]:
  713. if attr.endswith("-FINE"):
  714. continue
  715. elem = self.data.elem_attr[fix][attr]
  716. if self.attr != attr:
  717. continue
  718. if event.num == 1:
  719. #self#encoder(attr=attr,data=data,elem=elem,action="click")
  720. data["ATTRIBUT"][attr]["ACTIVE"] = 1
  721. elem["bg"] = "yellow"
  722. if "FX" in data["ATTRIBUT"][attr]:#["FX"]:# = 1
  723. if data["ATTRIBUT"][attr]["FX"]:# = 1
  724. elem["fg"] = "blue"
  725. else:
  726. elem["fg"] = "blue"
  727. elem["fg"] = "black"
  728. if not data["ATTRIBUT"][attr]["ACTIVE"]:
  729. continue
  730. if event.num == 4:
  731. self.encoder(fix=fix,attr=attr,data=data,elem=elem,action="+")
  732. #if attr == "DIM":
  733. # self.encoder(attr="VDIM",data=data,elem=elem,action="+")
  734. elif event.num == 5:
  735. self.encoder(fix=fix,attr=attr,data=data,elem=elem,action="-")
  736. #if attr == "DIM":
  737. # self.encoder(attr="VDIM",data=data,elem=elem,action="-")
  738. if "set_value" in dir(event) and event.set_value >=0:
  739. print("ENCODER set_value and set_fade",event)
  740. #print(dir(event))
  741. if "set_fade" in dir(event) and event.set_fade >0:
  742. print("event.set_fade",event.set_fade)
  743. self.encoder(fix=fix,attr=attr,data=data,elem=elem,action=event.set_value,xfade=1)
  744. else:
  745. self.encoder(fix=fix,attr=attr,data=data,elem=elem,action=event.set_value)
  746. return 0
  747. if event.num == 1:
  748. self.encoder(fix=0,attr=self.attr,data=self.data,elem=self.elem,action="click")
  749. elif event.num == 4:
  750. self.encoder(fix=0,attr=self.attr,data=self.data,elem=self.elem,action="+")
  751. elif event.num == 5:
  752. self.encoder(fix=0,attr=self.attr,data=self.data,elem=self.elem,action="-")
  753. #finally:
  754. # pass
  755. except Exception as e:
  756. cprint("== cb EXCEPT",e,color="red")
  757. cprint("Error on line {}".format(sys.exc_info()[-1].tb_lineno),color="red")
  758. cprint(''.join(traceback.format_exception(None, e, e.__traceback__)),color="red")
  759. #traceback.print_exc()
  760. #print(self.elem["text"],self.attr,self.data)
  761. def wheel(event,d=None):
  762. print("wheel",event,d)
  763. import copy
  764. class Element():
  765. def __init__(self):
  766. self.__data = {}
  767. def set(self,key,val):
  768. self.__data[key] = val
  769. class Base():
  770. def __init__(self):
  771. pass
  772. def _load(self,filename):
  773. xfname = "show/"+show_name+"/"+str(filename)+".sav"
  774. print("load",xfname)
  775. f = open(xfname,"r")
  776. lines = f.readlines()
  777. f.close()
  778. data = OrderedDict()
  779. labels = OrderedDict()
  780. for line in lines:
  781. key,label,rdata = line.split("\t",2)
  782. key = int(key)
  783. #print(xfname,"load",key,label)
  784. #print(line)
  785. jdata = json.loads(rdata,object_pairs_hook=OrderedDict)
  786. nrnull = 0
  787. if "ATTRIBUT" in jdata: # translate old FIXTURES.fixtures start with 0 to 1
  788. for attr in jdata["ATTRIBUT"]:
  789. if "NR" in jdata["ATTRIBUT"][attr]:
  790. nr = jdata["ATTRIBUT"][attr]["NR"]
  791. if nr == 0:
  792. nrnull = 1
  793. break
  794. if nrnull:
  795. print("DMX NR IS NULL",attr,"CHANGE +1")
  796. for attr in jdata["ATTRIBUT"]:
  797. if "NR" in jdata["ATTRIBUT"][attr]:
  798. nr = jdata["ATTRIBUT"][attr]["NR"]
  799. if nr >= 0:
  800. jdata["ATTRIBUT"][attr]["NR"] +=1
  801. data[key] = jdata
  802. labels[key] = label
  803. return data,labels
  804. def _backup(self,filename,data,labels):
  805. #fixture
  806. xfname = "show/"+show_name+"/"+str(filename)+".sav"
  807. print("backup",xfname)
  808. f = open(xfname,"w")
  809. for key in data:
  810. line = data[key]
  811. #print(line)
  812. label = "label"
  813. if key in labels:
  814. label = labels[key]
  815. if label == "Name-"+str(key):
  816. label = ""
  817. #print(xfname,"load",key,label,len(line))
  818. f.write( "{}\t{}\t{}\n".format( key,label,json.dumps(line) ) )
  819. f.close()
  820. class Event():
  821. def __init__(self,name):
  822. self.name=name
  823. print("init",self)
  824. def event(self,event):
  825. print(self.name,event)
  826. class scroll():
  827. def __init__(self,canvas):
  828. self.canvas=canvas
  829. def config(self,event):
  830. canvas = self.canvas
  831. canvas.configure(scrollregion=canvas.bbox("all"))#,width=400,height=200)
  832. def hex_to_rgb(hex):
  833. return tuple(int(hex[i:i+2], 16) for i in (0, 2, 4))
  834. class cb():
  835. def __init__(self,win):
  836. self.win = win
  837. def _callback(self,event):
  838. clobj=event.widget
  839. ## undermouse=find_withtag(master.CURRENT)
  840. undermouse=self.win.find_closest(self.win.CURRENT)
  841. print( repr(undermouse))
  842. def callback(self,event):
  843. print(__file__,self,"callback",event)
  844. cnv = self.win
  845. item = cnv.find_closest(cnv.canvasx(event.x), cnv.canvasy(event.y))[0]
  846. tags = cnv.gettags(item)
  847. #cnv.itemconfigure(self.tag, text=tags[0])
  848. print(tags,item)
  849. color = cnv.itemcget(item, "fill")
  850. cnv.itemconfig("all", width=1)#filla="green")
  851. cnv.itemconfig(item, width=3)#filla="green")
  852. print(color)
  853. print( hex_to_rgb(color[1:]))
  854. class GUI(Base):
  855. def __init__(self):
  856. super().__init__()
  857. self.load()
  858. self.all_attr =["DIM","PAN","TILT"]
  859. self.elem_attr = {}
  860. self.fx_commands =["STONY_FX","FX OFF","\n"
  861. ,"FX:CIR","FX:PAN","FX:TILT","FX:DIM","\n"
  862. ,"SZ:","SP:","ST:","OF:","BS:-","\n"
  863. , "FX:SIN","FX:COS","FX:BUM","FX:BUM2","FX:FD","FX:ON","FX:ON2" ]
  864. self.commands =["\n","ESC","CFG-BTN","LABEL","BACKUP","\n"
  865. ,"SET","SELECT","ACTIVATE","FLASH","FADE","\n"
  866. ,"BLIND","CLEAR","STORE","EDIT","MOVE","\n"
  867. ]
  868. self.elem_fx_commands = {}
  869. self.val_fx_commands = {}
  870. self.elem_commands = {}
  871. self.val_commands = {}
  872. self.elem_presets = {}
  873. self.PRESETS = Presets()
  874. self.PRESETS.load_presets()
  875. self.FIXTURES = Fixtures()
  876. self.FIXTURES.load_patch()
  877. for i in range(8*8):
  878. if i not in self.PRESETS.val_presets:
  879. name = "Preset:"+str(i+1)+":\nXYZ"
  880. #self.presets[i] = [i]
  881. self.PRESETS.val_presets[i] = OrderedDict() # FIX
  882. self.PRESETS.val_presets[i]["CFG"] = OrderedDict() # CONFIG
  883. self.PRESETS.label_presets[i] = "-"
  884. modes.set_cb(self.xcb)
  885. def button_refresh(self,name,color,fg=None):
  886. cprint("button_refresh",name,color)
  887. #self.data.elem_commands["STORE"]["bg"] = "grey"
  888. if name in self.elem_commands:
  889. self.elem_commands[name]["bg"] = color
  890. self.elem_commands[name].config(activebackground=color)
  891. if fg:
  892. self.elem_commands[name]["fg"] = fg
  893. print(dir(self.elem_commands[name]))
  894. def xcb(self,mode,value=None):
  895. cprint("MODE CALLBACK",mode,value,color="green",end="")
  896. #cprint(self,"xcb","MODE CALLBACK",mode,value,color="green")
  897. if value:
  898. cprint("===== ON ======",color="red")
  899. self.button_refresh(mode,color="red")#,fg="blue")
  900. else:
  901. cprint("===== OFF ======",color="red")
  902. self.button_refresh(mode,color="lightgrey")#,fg="black")
  903. def load(self,fname=""):
  904. pass
  905. def exit(self):
  906. print("__del__",self)
  907. self.PRESETS.backup_presets()
  908. print("********************************************************")
  909. self.FIXTURES.backup_patch()
  910. print("*********del",self,"***********************************************")
  911. def refresh_gui(self):
  912. for fix in self.FIXTURES.fixtures:
  913. sdata = self.FIXTURES.fixtures[fix]
  914. for attr in sdata["ATTRIBUT"]:
  915. if "FINE" in attr:
  916. continue
  917. v2 = sdata["ATTRIBUT"][attr]["VALUE"]
  918. if fix in self.elem_attr:
  919. elem = self.elem_attr[fix][attr]
  920. #print( attr,v2)
  921. elem["text"] = "{} {:0.2f}".format(attr,v2)
  922. if sdata["ATTRIBUT"][attr]["ACTIVE"]:
  923. elem["bg"] = "yellow"
  924. else:
  925. elem["bg"] = "grey"
  926. def preset_store(self,nr):
  927. #TODO refactor
  928. print("------- STORE PRESET")
  929. data = self.FIXTURES.get_active()
  930. if modes.val("STONY_FX"):
  931. self.PRESETS.store(nr,data,"STONY_FX")
  932. else:
  933. self.PRESETS.store(nr,data)
  934. #global STORE
  935. #STORE = 0
  936. #self.elem_commands["STORE"]["bg"] = "lightgrey"
  937. #CFG = OrderedDict()
  938. #if "CFG" in self.PRESETS.val_presets[nr]: #["CFG"]
  939. # CFG = self.PRESETS.val_presets[nr]["CFG"]
  940. sdata=data
  941. self.PRESETS.val_presets[nr] = sdata
  942. if len(sdata) > 1:
  943. fx_color = 0
  944. val_color = 0
  945. for fix in sdata:
  946. if fix == "CFG":
  947. continue
  948. #print( "$$$$",fix,sdata[fix])
  949. for attr in sdata[fix]:
  950. if "FX" in sdata[fix][attr]:
  951. if sdata[fix][attr]["FX"]:
  952. fx_color = 1
  953. if "VALUE" in sdata[fix][attr]:
  954. if sdata[fix][attr]["VALUE"] is not None:
  955. val_color = 1
  956. self.elem_presets[nr]["fg"] = "black"
  957. if val_color:
  958. self.elem_presets[nr]["bg"] = "yellow"
  959. if fx_color:
  960. self.elem_presets[nr]["fg"] = "blue"
  961. else:
  962. if fx_color:
  963. self.elem_presets[nr]["bg"] = "cyan"
  964. else:
  965. self.elem_presets[nr]["fg"] = "black"
  966. self.elem_presets[nr]["bg"] = "grey"
  967. #self.elem_presets[nr].option_add("*Font", FontBold)
  968. label = ""
  969. if nr in self.PRESETS.label_presets:
  970. #print(dir(self.data))
  971. label = self.PRESETS.label_presets[nr]
  972. BTN="go"
  973. if "CFG" in sdata:#["BUTTON"] = "GO"
  974. if "BUTTON" in sdata["CFG"]:
  975. BTN = sdata["CFG"]["BUTTON"]
  976. txt = str(nr)+":"+str(BTN)+":"+str(len(sdata)-1)+"\n"+label
  977. self.elem_presets[nr]["text"] = txt
  978. #print("GO CFG ",self.PRESETS.val_presets)
  979. def preset_select(self,nr):
  980. print("SELECT PRESET")
  981. sdata = self.PRESETS.val_presets[nr]
  982. cmd = ""
  983. for fix in sdata:
  984. if fix == "CFG":
  985. continue
  986. for attr in sdata[fix]:
  987. v2 = sdata[fix][attr]["VALUE"]
  988. v2_fx = sdata[fix][attr]["FX"]
  989. #print( self.data.elem_attr)
  990. if fix in self.elem_attr:
  991. elem = self.elem_attr[fix][attr]
  992. #self#encoder(attr=attr,data=data,elem=elem,action="click")
  993. self.FIXTURES.fixtures[fix]["ATTRIBUT"][attr]["ACTIVE"] = 1
  994. elem["bg"] = "yellow"
  995. def preset_go(self,nr,xfade=fade,event=None):
  996. print("GO PRESET FADE",nr)
  997. rdata = self.PRESETS.get_raw_map(nr)
  998. cfg = self.PRESETS.get_cfg(nr)
  999. fcmd = self.FIXTURES.update_raw(rdata)
  1000. #virtcmd = self.data.FIXTURES.get_virtual(rdata)
  1001. xFLASH = 0
  1002. value=None
  1003. #xfade = fade
  1004. if modes.val("FLASH") or ( "BUTTON" in cfg and cfg["BUTTON"] == "SEL"): #FLASH
  1005. self.preset_select(nr)
  1006. return 0
  1007. elif modes.val("FLASH") or ( "BUTTON" in cfg and cfg["BUTTON"] == "FL"): #FLASH
  1008. xFLASH = 1
  1009. xfade = 0
  1010. if event:
  1011. if str(event.type) == "ButtonRelease" or event.type == '5' :
  1012. # 4 fix vor ThinkPad / Debian 11
  1013. if xFLASH:
  1014. value = "off"
  1015. vvcmd = update_raw_dmx( rdata ,value,[xfade] )
  1016. fxcmd = update_raw_dmx( rdata ,value,[xfade],fx=1)
  1017. cmd = []
  1018. for vcmd,d in [[vvcmd,"d"],[fxcmd,"fx"]]:
  1019. if xFLASH:
  1020. d+="f"
  1021. for i,v in enumerate(fcmd):
  1022. DMX = fcmd[i]["DMX"]
  1023. if DMX and vcmd[i]:
  1024. xcmd = ",{}{}:{}".format(d,DMX,vcmd[i])
  1025. cmd.append( xcmd )
  1026. if "VIRTUAL" in fcmd[i]:
  1027. for a in fcmd[i]["VIRTUAL"]:
  1028. DMX = fcmd[i]["VIRTUAL"][a]
  1029. if DMX and vcmd[i]:
  1030. xcmd = ",{}{}:{}".format(d,DMX,vcmd[i])
  1031. cmd.append( xcmd )
  1032. cmd = "".join(cmd)
  1033. print("cmd",cmd)
  1034. if cmd and not modes.val("BLIND"):
  1035. client.send(cmd )
  1036. self.refresh_gui()
  1037. def draw_dim(self,fix,data,c=0,r=0,frame=None):
  1038. Font = font.Font(family='Helvetica', size=9, weight='normal')
  1039. FontBold = font.Font(family='Helvetica', size=10, weight='bold')
  1040. i=0
  1041. if frame is None:
  1042. frame = tk.Frame(root,bg="black")
  1043. frame.pack(fill=tk.X, side=tk.TOP)
  1044. #b = tk.Button(frame,bg="lightblue", text="FIX:"+str(fix)+" "+data["NAME"],width=20)
  1045. #b.bind("<Button>",Xevent(fix=fix,elem=b).cb)
  1046. #b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1047. #c+=1
  1048. #r+=1
  1049. if fix not in self.elem_attr:
  1050. self.elem_attr[fix] = {}
  1051. for attr in data["ATTRIBUT"]:
  1052. if attr not in self.all_attr:
  1053. self.all_attr.append(attr)
  1054. if attr not in self.elem_attr[fix]:
  1055. self.elem_attr[fix][attr] = []
  1056. if attr.endswith("-FINE"):
  1057. continue
  1058. v= data["ATTRIBUT"][attr]["VALUE"]
  1059. b = tk.Button(frame,bg="lightblue",font=FontBold, text=""+str(fix)+" "+data["NAME"],width=4)
  1060. #b.bind("<Button>",Xevent(fix=fix,elem=b).cb)
  1061. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1062. c+=1
  1063. b = tk.Button(frame,bg="grey",font=FontBold, text=str(attr)+' '+str(round(v,2)),width=6)
  1064. self.elem_attr[fix][attr] = b
  1065. b.bind("<Button>",Xevent(fix=fix,elem=b,attr=attr,data=data).cb)
  1066. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1067. c+=1
  1068. if c >=12:
  1069. c=0
  1070. r+=1
  1071. return c,r
  1072. def draw_patch(self,xframe):
  1073. r=0
  1074. c=0
  1075. frame_dim = xframe
  1076. root = frame_dim
  1077. dim_frame = tk.Frame(root,bg="black")
  1078. dim_frame.pack(fill=tk.X, side=tk.TOP)
  1079. root = frame_patch
  1080. fix_frame = tk.Frame(root,bg="black")
  1081. canvas = tk.Canvas(root)
  1082. def yview(event):
  1083. print("yevent",event)
  1084. print(dir(canvas))
  1085. #yview_moveto', 'yview_scroll'
  1086. yyy=20.1
  1087. fix_frame.yview_moveto(yyy)
  1088. #canvas.yview_moveto(yyy)
  1089. #yyy=20
  1090. #canvas.yview_scroll(yyy,"units")
  1091. #def sconfig(event):
  1092. # global canvas
  1093. # canvas.configure(scrollregion=canvas.bbox("all"),width=400,height=200)
  1094. #fix_frame.bind("<Configure>",sconfig)
  1095. #myscrollbar=tk.Scrollbar(root,orient="vertical",command=canvas.yview)
  1096. #myscrollbar=tk.Scrollbar(root,orient="vertical",command=yview)
  1097. #myscrollbar.pack(side="right",fill="y")
  1098. #canvas.create_window((0, 0), window=fix_frame, anchor="nw")
  1099. #canvas.pack(fill=tk.X, side=tk.TOP)
  1100. fix_frame = tk.Frame(root,bg="black")
  1101. fix_frame.pack(fill=tk.X, side=tk.TOP)
  1102. #fix_frame = canvas
  1103. #fix_frame.configure(scrollregion=canvas.bbox("all"),width=200,height=200)
  1104. #canvas.configure(yscrollcommand=myscrollbar.set)
  1105. i=0
  1106. c=0
  1107. r=0
  1108. for fix in self.FIXTURES.fixtures:
  1109. i+=1
  1110. data = self.FIXTURES.fixtures[fix]
  1111. print( fix ,data )
  1112. #if(len(data["ATTRIBUT"].keys()) <= 1):
  1113. # c,r=self.draw_dim(fix,data,c=c,r=r,frame=dim_frame)
  1114. #else:
  1115. if 1:
  1116. #self._draw_fix(fix,data,root=fix_frame)
  1117. frame = fix_frame
  1118. b = tk.Button(frame,bg="lightblue", text="FIX:"+str(fix)+" "+data["NAME"],width=20)
  1119. b.bind("<Button>",Xevent(fix=fix,elem=b).cb)
  1120. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1121. c+=1
  1122. #r+=1
  1123. if fix not in self.elem_attr:
  1124. self.elem_attr[fix] = {}
  1125. patch = ["DMX","UNIVERS"]
  1126. for k in patch:
  1127. v=data[k]
  1128. b = tk.Button(frame,bg="grey", text=str(k)+' '+str(v),width=8)
  1129. #self.elem_attr[fix][attr] = b
  1130. #b.bind("<Button>",Xevent(fix=fix,elem=b,attr=attr,data=data).cb)
  1131. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1132. c+=1
  1133. if c >=8:
  1134. c=1
  1135. r+=1
  1136. for attr in data["ATTRIBUT"]:
  1137. if attr not in self.all_attr:
  1138. self.all_attr.append(attr)
  1139. if attr not in self.elem_attr[fix]:
  1140. self.elem_attr[fix][attr] = []
  1141. if attr.endswith("-FINE"):
  1142. continue
  1143. v= data["ATTRIBUT"][attr]["VALUE"]
  1144. b = tk.Button(frame,bg="grey", text=str(attr)+' '+str(round(v,2)),width=8)
  1145. self.elem_attr[fix][attr] = b
  1146. #b.bind("<Button>",Xevent(fix=fix,elem=b,attr=attr,data=data).cb)
  1147. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1148. c+=1
  1149. if c >=8:
  1150. c=1
  1151. r+=1
  1152. c=0
  1153. r+=1
  1154. #fix_frame
  1155. #canvas.configure(scrollregion=canvas.bbox("all"),width=200,height=200)
  1156. def draw_fix(self,xframe):
  1157. r=0
  1158. c=0
  1159. frame_dim=xframe
  1160. frame_fix=xframe
  1161. root = frame_dim
  1162. dim_frame = tk.Frame(root,bg="black")
  1163. dim_frame.pack(fill=tk.X, side=tk.TOP)
  1164. root = frame_fix
  1165. fix_frame = tk.Frame(root,bg="black")
  1166. fix_frame.pack(fill=tk.X, side=tk.TOP)
  1167. Font = font.Font(family='Helvetica', size=9, weight='normal')
  1168. FontBold = font.Font(family='Helvetica', size=10, weight='bold')
  1169. #self.tk.default_font.configure(size=9)
  1170. #self.tk.option_add("*Font", FontBold)
  1171. #dim_frame.configure(font=Font)
  1172. #fix_frame.configure(font=Font)
  1173. i=0
  1174. c=0
  1175. r=0
  1176. dim_end=0
  1177. for fix in self.FIXTURES.fixtures:
  1178. i+=1
  1179. data = self.FIXTURES.fixtures[fix]
  1180. print( fix ,data )
  1181. if(len(data["ATTRIBUT"].keys()) <= 1):
  1182. c,r=self.draw_dim(fix,data,c=c,r=r,frame=dim_frame)
  1183. else:
  1184. if not dim_end:
  1185. dim_end=1
  1186. c=0
  1187. r=0
  1188. #self._draw_fix(fix,data,root=fix_frame)
  1189. frame = fix_frame
  1190. b = tk.Button(frame,bg="lightblue",font=FontBold, text="FIX:"+str(fix)+" "+data["NAME"],width=20)
  1191. b.bind("<Button>",Xevent(fix=fix,elem=b).cb)
  1192. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1193. c+=1
  1194. #r+=1
  1195. if fix not in self.elem_attr:
  1196. self.elem_attr[fix] = {}
  1197. for attr in data["ATTRIBUT"]:
  1198. if attr not in self.all_attr:
  1199. self.all_attr.append(attr)
  1200. if attr not in self.elem_attr[fix]:
  1201. self.elem_attr[fix][attr] = []
  1202. if attr.endswith("-FINE"):
  1203. continue
  1204. v= data["ATTRIBUT"][attr]["VALUE"]
  1205. b = tk.Button(frame,bg="grey",font=FontBold, text=str(attr)+' '+str(round(v,2)),width=8)
  1206. self.elem_attr[fix][attr] = b
  1207. b.bind("<Button>",Xevent(fix=fix,elem=b,attr=attr,data=data).cb)
  1208. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1209. c+=1
  1210. if c >=8:
  1211. c=1
  1212. r+=1
  1213. c=0
  1214. r+=1
  1215. def draw_enc(self,xframe):
  1216. root2 = xframe
  1217. i=0
  1218. c=0
  1219. r=0
  1220. #frame = tk.Frame(root,bg="black")
  1221. #frame.pack(fill=tk.X, side=tk.TOP)
  1222. #b = tk.Label(frame,bg="black", text="--------------------------------- ---------------------------------------")
  1223. #b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1224. #r=0
  1225. frame = tk.Frame(root2,bg="black")
  1226. frame.pack( side=tk.TOP,expand=1,fill="both")
  1227. b = tk.Button(frame,bg="lightblue", text="ENCODER",width=6)
  1228. #b.bind("<Button>",Xevent(fix=fix,elem=b).cb)
  1229. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1230. #r+=1
  1231. c+=1
  1232. for attr in self.all_attr:
  1233. if attr.endswith("-FINE"):
  1234. continue
  1235. v=0
  1236. b = tk.Button(frame,bg="orange", text=str(attr)+'',width=6)
  1237. b.bind("<Button>",Xevent(fix=0,elem=b,attr=attr,data=self,mode="ENCODER").cb)
  1238. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1239. c+=1
  1240. if c >=8:
  1241. c=0
  1242. r+=1
  1243. def draw_fx(self,xframe):
  1244. frame_fx=xframe
  1245. i=0
  1246. c=0
  1247. r=0
  1248. #frame = tk.Frame(root,bg="black")
  1249. #frame.pack(fill=tk.X, side=tk.TOP)
  1250. #b = tk.Label(frame,bg="black", text="------------------------------ ---------------------------------------")
  1251. #b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1252. #r=0
  1253. #frame = tk.Frame(root2,bg="black")
  1254. frame = tk.Frame(frame_fx,bg="black")
  1255. frame.pack(fill=tk.X, side=tk.TOP)
  1256. b = tk.Button(frame,bg="lightblue", text="FX.",width=6)
  1257. #b.bind("<Button>",Xevent(fix=fix,elem=b).cb)
  1258. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1259. #r+=1
  1260. c+=1
  1261. for comm in self.fx_commands:
  1262. if comm == "\n":
  1263. c=0
  1264. r+=1
  1265. continue
  1266. v=0
  1267. b = tk.Button(frame,bg="lightgrey", text=str(comm),width=6,height=2)
  1268. if comm not in self.elem_fx_commands:
  1269. self.elem_fx_commands[comm] = b
  1270. self.val_fx_commands[comm] = 0
  1271. b.bind("<Button>",Xevent(fix=0,elem=b,attr=comm,data=self,mode="COMMAND").cb)
  1272. if comm == "BLIND":
  1273. b["bg"] = "grey"
  1274. if comm == "CLEAR":
  1275. b["bg"] = "grey"
  1276. if comm == "STONY_FX":
  1277. b["bg"] = "grey"
  1278. if comm == "FADE":
  1279. b["bg"] = "green"
  1280. if comm == "FX OFF":
  1281. b["bg"] = "magenta"
  1282. if comm == "SZ:":
  1283. b["text"] = "SZ:{:0.0f}".format(fx_prm["SIZE"])
  1284. if comm == "SP:":
  1285. b["text"] = "SP:{:0.0f}".format(fx_prm["SPEED"])
  1286. if comm == "ST:":
  1287. b["text"] = "ST:{:0.0f}".format(fx_prm["START"])
  1288. if comm == "OF:":
  1289. b["text"] = "OF:{:0.0f}".format(fx_prm["OFFSET"])
  1290. if comm == "BS:":
  1291. b["text"] = "BS:{}".format(fx_prm["BASE"])
  1292. if comm:
  1293. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1294. c+=1
  1295. if c >=5:
  1296. c=0
  1297. r+=1
  1298. def draw_command(self,xframe):
  1299. frame_cmd=xframe
  1300. i=0
  1301. c=0
  1302. r=0
  1303. #frame = tk.Frame(root,bg="black")
  1304. #frame.pack(fill=tk.X, side=tk.TOP)
  1305. #b = tk.Label(frame,bg="black", text="------------------------------ ---------------------------------------")
  1306. #b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1307. #r=0
  1308. #frame = tk.Frame(root2,bg="black")
  1309. frame = tk.Frame(frame_cmd,bg="black")
  1310. frame.pack(fill=tk.X, side=tk.TOP)
  1311. b = tk.Button(frame,bg="lightblue", text="COMM.",width=6)
  1312. #b.bind("<Button>",Xevent(fix=fix,elem=b).cb)
  1313. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1314. #r+=1
  1315. c+=1
  1316. for comm in self.commands:
  1317. if comm == "\n":
  1318. c=0
  1319. r+=1
  1320. continue
  1321. v=0
  1322. b = tk.Button(frame,bg="lightgrey", text=str(comm),width=6,height=2)
  1323. if comm not in self.elem_commands:
  1324. self.elem_commands[comm] = b
  1325. self.val_commands[comm] = 0
  1326. b.bind("<Button>",Xevent(fix=0,elem=b,attr=comm,data=self,mode="COMMAND").cb)
  1327. if comm == "BLIND":
  1328. b["bg"] = "grey"
  1329. if comm == "CLEAR":
  1330. b["bg"] = "grey"
  1331. if comm == "STONY_FX":
  1332. b["bg"] = "grey"
  1333. if comm == "FADE":
  1334. b["bg"] = "green"
  1335. if comm == "FX OFF":
  1336. b["bg"] = "magenta"
  1337. if comm == "SZ:":
  1338. b["text"] = "SZ:{:0.0f}".format(fx_prm["SIZE"])
  1339. if comm == "SP:":
  1340. b["text"] = "SP:{:0.0f}".format(fx_prm["SPEED"])
  1341. if comm == "FADE":
  1342. b["text"] = "FADE:{:0.02f}".format(fade)
  1343. if comm == "ST:":
  1344. b["text"] = "ST:{:0.0f}".format(fx_prm["START"])
  1345. if comm == "OF:":
  1346. b["text"] = "OF:{:0.0f}".format(fx_prm["OFFSET"])
  1347. if comm == "BS:":
  1348. b["text"] = "BS:{}".format(fx_prm["BASE"])
  1349. if comm:
  1350. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1351. c+=1
  1352. if c >=5:
  1353. c=0
  1354. r+=1
  1355. def draw_preset(self,xframe):
  1356. i=0
  1357. c=0
  1358. r=0
  1359. root = xframe
  1360. frame = tk.Frame(root,bg="black")
  1361. frame.pack(fill=tk.X, side=tk.TOP)
  1362. b = tk.Button(frame,bg="lightblue", text="EXEC")
  1363. #b.bind("<Button>",Xevent(elem=b).cb)
  1364. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1365. r+=1
  1366. for k in self.PRESETS.val_presets:
  1367. v=0
  1368. label = ""
  1369. if k in self.PRESETS.label_presets:
  1370. label = self.PRESETS.label_presets[k]
  1371. print([label])
  1372. sdata=self.PRESETS.val_presets[k]
  1373. BTN="go"
  1374. if "CFG" in sdata:#["BUTTON"] = "GO"
  1375. if "BUTTON" in sdata["CFG"]:
  1376. BTN = sdata["CFG"]["BUTTON"]
  1377. txt=str(k)+":"+str(BTN)+":"+str(len(sdata)-1)+"\n"+label
  1378. b = tk.Button(frame,bg="grey", text=txt,width=8,height=2)
  1379. b.bind("<Button>",Xevent(fix=0,elem=b,attr=k,data=self,mode="PRESET").cb)
  1380. b.bind("<ButtonRelease>",Xevent(fix=0,elem=b,attr=k,data=self,mode="PRESET").cb)
  1381. if k in self.PRESETS.val_presets and len(self.PRESETS.val_presets[k]) :
  1382. b["bg"] = "yellow"
  1383. sdata = self.PRESETS.val_presets[k]
  1384. if len(sdata) > 1:
  1385. fx_color = 0
  1386. val_color = 0
  1387. for fix in sdata:
  1388. if fix == "CFG":
  1389. continue
  1390. #print( "$$$$",fix,sdata[fix])
  1391. for attr in sdata[fix]:
  1392. if "FX" in sdata[fix][attr]:
  1393. if sdata[fix][attr]["FX"]:
  1394. fx_color = 1
  1395. if "VALUE" in sdata[fix][attr]:
  1396. if sdata[fix][attr]["VALUE"] is not None:
  1397. val_color = 1
  1398. b["fg"] = "black"
  1399. if val_color:
  1400. b["bg"] = "gold"
  1401. if fx_color:
  1402. b["fg"] = "blue"
  1403. else:
  1404. if fx_color:
  1405. b["bg"] = "cyan"
  1406. else:
  1407. b["bg"] = "grey"
  1408. if "SEL" in txt:
  1409. b["fg"] = "black"
  1410. b["bg"] = "blue"
  1411. elif "GO" in txt:
  1412. b["fg"] = "black"
  1413. elif "FL" in txt:
  1414. b["fg"] = "red"
  1415. if k not in self.elem_presets:
  1416. self.elem_presets[k] = b
  1417. #self.PRESETS.val_presets[preset] = 0
  1418. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1419. c+=1
  1420. if c >=8:
  1421. c=0
  1422. r+=1
  1423. def draw_input(self):
  1424. i=0
  1425. c=0
  1426. r=0
  1427. frame = tk.Frame(root2,bg="black")
  1428. frame.pack(fill=tk.X, side=tk.TOP)
  1429. b = tk.Label(frame,bg="black", text="------------------------ ---------------------------------------")
  1430. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1431. r=0
  1432. frame = tk.Frame(root2,bg="black")
  1433. frame.pack(fill=tk.X, side=tk.TOP)
  1434. b = tk.Label(frame, text="send:")
  1435. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1436. c+=1
  1437. b = tk.Entry(frame,bg="grey", text="",width=50)
  1438. self.entry = b
  1439. b.bind("<Button>",Xevent(fix=0,elem=b,attr="INPUT",data=self,mode="INPUT").cb)
  1440. b.bind("<Key>",Xevent(fix=0,elem=b,attr="INPUT",data=self,mode="INPUT").cb)
  1441. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1442. b.insert("end","d0:127,fx241:sinus:50:50:10,fx243:cosinus:50:50:10,d201:127,fx201:sinus:50:300:10")
  1443. r+=1
  1444. b = tk.Entry(frame,bg="grey", text="",width=20)
  1445. self.entry2 = b
  1446. b.bind("<Button>",Xevent(fix=0,elem=b,attr="INPUT",data=self,mode="INPUT2").cb)
  1447. b.bind("<Key>",Xevent(fix=0,elem=b,attr="INPUT",data=self,mode="INPUT2").cb)
  1448. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1449. b.insert("end","d1:0:4")
  1450. r+=1
  1451. b = tk.Entry(frame,bg="grey", text="",width=20)
  1452. self.entry3 = b
  1453. b.bind("<Button>",Xevent(fix=0,elem=b,attr="INPUT",data=self,mode="INPUT3").cb)
  1454. b.bind("<Key>",Xevent(fix=0,elem=b,attr="INPUT",data=self,mode="INPUT3").cb)
  1455. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  1456. b.insert("end","fx:alloff:::")
  1457. def draw_colorpicker(self,xframe):
  1458. import lib.colorpicker as colp
  1459. #colp.colorpicker(xframe,width=600,height=100, xcb=Xevent(fix=0,elem=None,attr="COLORPICKER",data=self,mode="INPUT").cb)
  1460. #xcb = cb
  1461. e = dummy_event()
  1462. r = Xevent(fix=0,elem=None,attr="RED",data=self,mode="ENCODER") #.cb
  1463. g = Xevent(fix=0,elem=None,attr="GREEN",data=self,mode="ENCODER") #.cb
  1464. b = Xevent(fix=0,elem=None,attr="BLUE",data=self,mode="ENCODER") #.cb
  1465. def _cb(event,data):
  1466. print("PPPPPPPOOOOOORRR",event,data)
  1467. print(event.num)
  1468. if "color" in data and (event.num == 1 or event.num == 3 or event.num==2):
  1469. e.num=5
  1470. e.type=1
  1471. cr=-1
  1472. cg=-1
  1473. cb=-1
  1474. color = data["color"]
  1475. if event.num == 1:
  1476. e.set_fade=fade
  1477. cr = color[0]
  1478. cg = color[1]
  1479. cb = color[2]
  1480. elif event.num == 2:
  1481. e.num=1
  1482. e.type=4
  1483. e.set_value=-1
  1484. else:
  1485. e.set_fade=-1
  1486. e.set_value=cr#color[0]
  1487. r.cb(e)
  1488. e.set_value=cg#color[1]
  1489. g.cb(e)
  1490. e.set_value=cb#color[2]
  1491. b.cb(e)
  1492. e.set_value=-1
  1493. e.set_fade=-1
  1494. print("PICK COLOR:",data["color"])
  1495. #self.encoder(fix=fix,attr=attr,data=data,elem=elem,action="+")
  1496. colp.colorpicker(xframe,width=600,height=100, xcb=_cb)
  1497. return 0
  1498. canvas=tk.Canvas(xframe,width=600,height=100)
  1499. canvas["bg"] = "yellow" #"green"
  1500. canvas.pack()
  1501. # RGB
  1502. x=0
  1503. y=0
  1504. j=0
  1505. d = 20
  1506. for i in range(0,d+1):
  1507. fi = int(i*255/d)
  1508. f = 255-fi
  1509. if i > d/2:
  1510. pass#break
  1511. color = '#%02x%02x%02x' % (f, fi, fi)
  1512. print( "farbe", i*10, j, f,fi,fi,color)
  1513. r = canvas.create_rectangle(x, y, x+20, y+20, fill=color)
  1514. x+=20
  1515. def render(self):
  1516. Xroot.bind("<Key>",Xevent(fix=0,elem=None,attr="ROOT",data=self,mode="ROOT").cb)
  1517. #self.draw_patch()
  1518. #self.draw_fix()
  1519. #input()
  1520. #self.draw_enc()
  1521. #self.draw_command()
  1522. #self.draw_fx()
  1523. self.draw_input()
  1524. #self.draw_preset()
  1525. def ScrollFrame(root,width=50,height=100,bd=1):
  1526. print("ScrollFrame init",width,height)
  1527. aframe=tk.Frame(root,relief=tk.GROOVE)#,width=width,height=height,bd=bd)
  1528. #aframe.place(x=0,y=0)
  1529. aframe.pack(side="left",fill="both",expand=1) #x=0,y=0)
  1530. canvas=tk.Canvas(aframe,width=width-24,height=height)
  1531. canvas["bg"] = "black" #"green"
  1532. bframe=tk.Frame(canvas)#,width=width,height=height)
  1533. bframe["bg"] = "blue"
  1534. scrollbar=tk.Scrollbar(aframe,orient="vertical",command=canvas.yview,width=20)
  1535. canvas.configure(yscrollcommand=scrollbar.set)
  1536. scrollbar.pack(side="right",fill="y")
  1537. canvas.pack(side="left",expand=1,fill="both")
  1538. canvas.create_window((0,0),window=bframe,anchor='nw')
  1539. bframe.bind("<Configure>",scroll(canvas).config)
  1540. canvas.bind("<Button>",Event("XXX").event)
  1541. canvas.bind("<Key>",Event("XXX").event)
  1542. return bframe
  1543. #frame = ScrollFrame(root)
  1544. class GUIHandler():
  1545. def __init__(self):
  1546. pass
  1547. def update(self,fix,attr,args={}):
  1548. #print("GUIHandler",fix,attr,args)
  1549. for i,k in enumerate(args):
  1550. v = args[k]
  1551. #print("GUI-H", i,k,v)
  1552. class Fixtures(Base):
  1553. def __init__(self):
  1554. super().__init__()
  1555. #self.load()
  1556. self.fixtures = OrderedDict()
  1557. self.gui = GUIHandler()
  1558. def load_patch(self):
  1559. filename="patch"
  1560. d,l = self._load(filename)
  1561. self.fixtures = OrderedDict()
  1562. for i in l:
  1563. sdata = d[i]
  1564. for attr in sdata["ATTRIBUT"]:
  1565. sdata["ATTRIBUT"][attr]["ACTIVE"] = 0
  1566. #print("load",filename,sdata)
  1567. #if "CFG" not in sdata:
  1568. # sdata["CFG"] = OrderedDict()
  1569. self.fixtures[str(i)] = sdata
  1570. #self.PRESETS.label_presets = l
  1571. def backup_patch(self):
  1572. filename = "patch"
  1573. data = self.fixtures
  1574. labels = {}
  1575. for k in data:
  1576. labels[k] = k
  1577. self._backup(filename,data,labels)
  1578. def update_raw(self,rdata):
  1579. #print("update_raw",rdata)
  1580. cmd = []
  1581. for i,d in enumerate(rdata):
  1582. xcmd = {"DMX":""}
  1583. #print("fix:",i,d)
  1584. fix = d["FIX"]
  1585. attr = d["ATTR"]
  1586. v2 = d["VALUE"]
  1587. v2_fx = d["FX"]
  1588. if fix not in self.fixtures:
  1589. continue
  1590. sdata = self.fixtures[fix] #shortcat
  1591. ATTR = sdata["ATTRIBUT"]
  1592. sDMX = 0
  1593. if sdata["DMX"] > 0:
  1594. print( sdata)
  1595. sDMX = (sdata["UNIVERS"]*512)+sdata["DMX"]
  1596. #sDMX =sdata["DMX"]
  1597. if attr not in ATTR:
  1598. continue
  1599. if ATTR[attr]["NR"] >= 0:
  1600. DMX = sDMX+ATTR[attr]["NR"]-1
  1601. xcmd["DMX"] = str(DMX)
  1602. else:
  1603. if attr == "DIM" and ATTR[attr]["NR"] < 0:
  1604. xcmd["VIRTUAL"] = {}
  1605. for a in ATTR:
  1606. if ATTR[a]["MASTER"]:
  1607. xcmd["VIRTUAL"][a] = sDMX+ATTR[a]["NR"]-1
  1608. #print( "VIRTUAL",xcmd)
  1609. cmd.append(xcmd)
  1610. v=ATTR[attr]["VALUE"]
  1611. if v2 is not None:
  1612. ATTR[attr]["VALUE"] = v2
  1613. #self.data.elem_attr[fix][attr]["text"] = str(attr)+' '+str(round(v,2))
  1614. text = str(attr)+' '+str(round(v,2))
  1615. self.gui.update(fix,attr,args={"text":text})
  1616. return cmd
  1617. def get_active(self):
  1618. print(self,"get_active")
  1619. CFG = OrderedDict()
  1620. sdata = OrderedDict()
  1621. sdata["CFG"] = CFG # OrderedDict()
  1622. sdata["CFG"]["FADE"] = fade
  1623. sdata["CFG"]["DEALY"] = 0
  1624. #sdata["CFG"]["BUTTON"] = "GO"
  1625. for fix in self.fixtures:
  1626. data = self.fixtures[fix]
  1627. for attr in data["ATTRIBUT"]:
  1628. if data["ATTRIBUT"][attr]["ACTIVE"]:
  1629. if fix not in sdata:
  1630. sdata[fix] = {}
  1631. if attr not in sdata[fix]:
  1632. sdata[fix][attr] = OrderedDict()
  1633. if not modes.val("STONY_FX"):
  1634. sdata[fix][attr]["VALUE"] = data["ATTRIBUT"][attr]["VALUE"]
  1635. #sdata[fix][attr]["FADE"] = fade
  1636. else:
  1637. sdata[fix][attr]["VALUE"] = None #data["ATTRIBUT"][attr]["VALUE"]
  1638. if "FX" not in data["ATTRIBUT"][attr]:
  1639. data["ATTRIBUT"][attr]["FX"] =""
  1640. sdata[fix][attr]["FX"] = data["ATTRIBUT"][attr]["FX"]
  1641. return sdata
  1642. def select(self,fix=None,attr=None):
  1643. out = 0
  1644. if fix in self.fixtures:
  1645. data = self.fixtures[fix]
  1646. if attr in data["ATTRIBUT"]:
  1647. data["ATTRIBUT"][attr]["ACTIVE"] = 1
  1648. out = 1
  1649. return 1
  1650. def clear(self,event=None):
  1651. out = 0
  1652. if 1:
  1653. for fix in self.fixtures:
  1654. #print( "clr",fix)
  1655. data = self.fixtures[fix]
  1656. #print("elm",self.data.elem_attr[fix])
  1657. for attr in data["ATTRIBUT"]:
  1658. if attr.endswith("-FINE"):
  1659. continue
  1660. if data["ATTRIBUT"][attr]["ACTIVE"]:
  1661. out +=1
  1662. data["ATTRIBUT"][attr]["ACTIVE"] = 0
  1663. #print(data["ATTRIBUT"])
  1664. print( "CB CLEAR" )
  1665. return out
  1666. class Presets(Base):
  1667. def __init__(self):
  1668. super().__init__()
  1669. #self.load()
  1670. def load_presets(self):
  1671. filename="presets"
  1672. d,l = self._load(filename)
  1673. for i in d:
  1674. sdata = d[i]
  1675. if "CFG" not in sdata:
  1676. sdata["CFG"] = OrderedDict()
  1677. if "FADE" not in sdata["CFG"]:
  1678. sdata["CFG"]["FADE"] = 4
  1679. if "DELAY" not in sdata["CFG"]:
  1680. sdata["CFG"]["DELAY"] = 0
  1681. if "BUTTON" not in sdata["CFG"]:
  1682. sdata["CFG"]["BUTTON"] = "GO"
  1683. self.val_presets = d
  1684. self.label_presets = l
  1685. def backup_presets(self):
  1686. filename = "presets"
  1687. data = self.val_presets
  1688. labels = self.label_presets
  1689. self._backup(filename,data,labels)
  1690. def get_cfg(self,nr):
  1691. if nr not in self.val_presets:
  1692. print(self,"error get_cfg no nr:",nr)
  1693. return {}
  1694. if "CFG" in self.val_presets[nr]:
  1695. return self.val_presets[nr]["CFG"]
  1696. def get_raw_map(self,nr):
  1697. print("get_raw_map",nr)
  1698. if nr not in self.val_presets:
  1699. self.val_presets[nr] = OrderedDict()
  1700. self.val_presets[nr]["VALUE"] = 0
  1701. self.val_presets[nr]["FX"] = ""
  1702. sdata = self.val_presets[nr]
  1703. cmd = ""
  1704. out = []
  1705. dmx=-1
  1706. for fix in sdata:
  1707. if fix == "CFG":
  1708. #print("CFG",nr,sdata[fix])
  1709. continue
  1710. for attr in sdata[fix]:
  1711. x = {}
  1712. #print("RAW",attr)
  1713. x["FIX"] = fix
  1714. x["ATTR"] = attr
  1715. x["VALUE"] = sdata[fix][attr]["VALUE"]
  1716. x["FX"] = sdata[fix][attr]["FX"]
  1717. #x["DMX"] = sdata[fix][attr]["NR"]
  1718. out.append(x)
  1719. return out
  1720. def store(self,nr,data,arg=""):
  1721. #TODO implement
  1722. print(self,"store()",data,arg)
  1723. self.val_presets[nr] = data
  1724. if not self.label_presets:
  1725. self.label_presets = "Neu"
  1726. #return 0
  1727. class GUI_grid():
  1728. def __init__(self,root,data,title="tilte",width=800):
  1729. self.data = data
  1730. self.frame = tk.Frame(root,bg="black",width=width)
  1731. self.frame.pack(fill=tk.BOTH, side=tk.LEFT)
  1732. r=0
  1733. c=0
  1734. i=1
  1735. for row in data:
  1736. self.b = tk.Button(self.frame,bg="lightblue", text=row["text"],width=11,height=4)
  1737. #self.b.bind("<Button>",Xevent(fix=fix,elem=b).cb)
  1738. self.b.grid(row=r, column=c, sticky=tk.W+tk.E)#,anchor="w")
  1739. c+=1
  1740. if c % 8 == 0:
  1741. r+=1
  1742. c=0
  1743. i+=1
  1744. self.frame.pack()
  1745. class BEvent():
  1746. def __init__(self,data,cb):
  1747. self._data = data
  1748. self._cb = cb
  1749. def cb(self,event):
  1750. #print(self,event)
  1751. self._cb(event,self._data)
  1752. class GUI_menu():
  1753. def __init__(self,root,data,title="tilte",width=800):
  1754. global tk
  1755. self.data = data
  1756. self.frame = tk.Frame(root,bg="black",width=width)
  1757. self.frame.pack(fill=tk.BOTH, side=tk.LEFT)
  1758. r=0
  1759. c=0
  1760. i=1
  1761. self.b = tk.Label(self.frame,bg="blue", text="MAIN:MENU",width=13,height=1)
  1762. self.b.grid(row=r, column=c, sticky=tk.W+tk.E)#,anchor="w")
  1763. r+=1
  1764. for row in data:
  1765. #print(i)
  1766. #row = data[i]
  1767. self.b = tk.Button(self.frame,bg="lightblue", text=row["text"],width=13,height=3)
  1768. self.b.bind("<Button>",BEvent({"NR":i,"text":row["text"]},self.callback).cb)
  1769. self.b.grid(row=r, column=c, sticky=tk.W+tk.E)#,anchor="w")
  1770. r+=1
  1771. i+=1
  1772. self.frame.pack()
  1773. def callback(self,event,data={}):
  1774. print(self,event,data)
  1775. window_manager.top(data["text"])# = WindowManager()
  1776. lf_nr = 0
  1777. class GUIWindow():
  1778. def __init__(self,title="tilte",master=0,width=100,height=100,left=None,top=None):
  1779. global lf_nr
  1780. if master:
  1781. #Font = font.Font(family='Helvetica', size=9, weight='normal')
  1782. self.tk = tkinter.Tk()#font=Font) #Toplevel()
  1783. #Font = font.Font(family='Helvetica', size=9, weight='normal')
  1784. #FontBold = font.Font(family='Helvetica', size=10, weight='bold')
  1785. #self.tk.default_font.configure(size=9)
  1786. #self.tk.option_add("*Font", FontBold)
  1787. #self.tk.configure(font=Font)
  1788. else:
  1789. self.tk = tkinter.Toplevel()
  1790. self.tk["bg"] = "black"
  1791. self.tk.bind("<Button>",self.callback)
  1792. self.tk.bind("<Key>",self.callback)
  1793. self.tk.title(""+str(title)+" "+str(lf_nr)+":"+str(rnd_id))
  1794. lf_nr+=1
  1795. #self.tk.geometry("270x600+0+65")
  1796. geo ="{}x{}".format(width,height)
  1797. if left is not None:
  1798. geo += "+{}".format(left)
  1799. if top is not None:
  1800. geo += "+{}".format(top)
  1801. #self._event_clear = Xevent(fix=0,elem=None,attr="CLEAR",data=self,mode="ROOT").cb
  1802. self.tk.geometry(geo)
  1803. def title(self,title=None):
  1804. if title is None:
  1805. return self.tk.title()
  1806. else:
  1807. return self.tk.title(title)
  1808. def show(self):
  1809. pass
  1810. #self.frame.pack()
  1811. def mainloop(self):
  1812. self.tk.mainloop()
  1813. def callback(self,event,data={}):
  1814. print("<GUI>",self,event,data)
  1815. #if "keysym" in dir(event):
  1816. # if "Escape" == event.keysym:
  1817. # e=dummy_event()
  1818. # e.num=1
  1819. # self._event_clear(e)
  1820. class WindowManager():
  1821. def __init__(self):
  1822. self.windows = {}
  1823. self.nr= 0
  1824. self.first=""
  1825. def new(self,w,name=""):
  1826. if not self.first:
  1827. if name:
  1828. self.first = name
  1829. else:
  1830. self.first = str(self.nr)
  1831. w.tk.attributes('-topmost',True)
  1832. if name:
  1833. self.windows[str(name)] = w
  1834. else:
  1835. self.windows[str(self.nr)] = w
  1836. self.nr+=1
  1837. #w.show()
  1838. def mainloop(self):
  1839. self.windows[self.first].mainloop()
  1840. def top(self,name):
  1841. name = str(name)
  1842. if name in self.windows:
  1843. self.windows[name].tk.attributes('-topmost',True)
  1844. self.windows[name].tk.attributes('-topmost',False)
  1845. else:
  1846. print(name,"not in self.windows",self.windows.keys())
  1847. window_manager = WindowManager()
  1848. master =GUI()
  1849. w = GUIWindow("MAIN",master=1,width=130,height=450,left=0,top=65)
  1850. data = []
  1851. #data.append({"text":"COMMAND"})
  1852. data.append({"text":"EXEC"})
  1853. data.append({"text":"DIMMER"})
  1854. data.append({"text":"FIXTURES"})
  1855. #data.append({"text":"PRESET"})
  1856. #data.append({"text":"PATCH"})
  1857. #data.append({"text":"ENCODER"})
  1858. f = GUI_menu(w.tk,data)
  1859. window_manager.new(w)
  1860. name="DIMMER"
  1861. w = GUIWindow(name,master=0,width=800,height=400,left=140,top=65)
  1862. w1 = ScrollFrame(w.tk,width=800,height=400)
  1863. #frame_dim = w1 # w.tk
  1864. #master.draw_dim(w1.tk)
  1865. window_manager.new(w,name)
  1866. name="FIXTURES"
  1867. w = GUIWindow(name,master=0,width=800,height=400,left=140,top=65)
  1868. w1 = ScrollFrame(w.tk,width=800,height=400)
  1869. #frame_fix = w1 #w.tk
  1870. master.draw_fix(w1)#.tk)
  1871. window_manager.new(w,name)
  1872. name="ENCODER"
  1873. ww = GUIWindow(name,master=0,width=800,height=50,left=140,top=500)
  1874. Xroot = ww.tk
  1875. #default_font = font.Font(family='Helvetica', size=12, weight='bold')
  1876. Font = font.Font(family='Helvetica', size=9, weight='normal')
  1877. FontBold = font.Font(family='Helvetica', size=10, weight='bold')
  1878. #default_font.configure(size=9)
  1879. Xroot.option_add("*Font", FontBold)
  1880. w = None
  1881. root = tk.Frame(Xroot,bg="black",width="10px")
  1882. root.pack(fill=tk.BOTH,expand=0, side=tk.LEFT)
  1883. root3 = tk.Frame(Xroot,bg="black",width="20px")
  1884. root3.pack(fill=tk.BOTH,expand=0, side=tk.LEFT)
  1885. root2 = tk.Frame(Xroot,bg="black",width="1px")
  1886. master.draw_enc(root2)
  1887. root2.pack(fill=tk.BOTH,expand=0, side=tk.LEFT)
  1888. #w = GUIWindow("GRID",master=0,width=1000,height=200,left=232,top=65)
  1889. #data = []
  1890. #for i in range(10):
  1891. # data.append({"text":"P {:02}".format(i+1)})
  1892. #w = GUI_grid(w.tk,data)
  1893. #window_manager.new(w)
  1894. name = "COMMAND"
  1895. w = GUIWindow(name,master=0,width=350,height=200,left=950,top=65)
  1896. master.draw_command(w.tk)
  1897. window_manager.new(w,name)
  1898. name="EXEC"
  1899. w = GUIWindow(name,master=0,width=800,height=400,left=140,top=65)
  1900. #frame_exe = w.tk
  1901. master.draw_preset(w.tk)
  1902. window_manager.new(w,name)
  1903. name="PATCH"
  1904. w = GUIWindow(name,master=0,width=800,height=400,left=140,top=65)
  1905. w1 = ScrollFrame(w.tk,width=800,height=400)
  1906. frame_patch = w1 #w.tk
  1907. window_manager.new(w,name)
  1908. name="FX"
  1909. w = GUIWindow(name,master=0,width=350,height=250,left=950,top=305)
  1910. #frame_fx = w.tk
  1911. master.draw_fx(w.tk)
  1912. window_manager.new(w,name)
  1913. #LibreLightDesk
  1914. name="COLERPICKER"
  1915. w = GUIWindow(name,master=0,width=580,height=100,left=80,top=620)
  1916. master.draw_colorpicker(w.tk)
  1917. window_manager.new(w,name)
  1918. #Xroot = tk.Tk()
  1919. #Xroot["bg"] = "black" #white
  1920. #Xroot.title( xtitle+" "+str(rnd_id) )
  1921. #Xroot.geometry("1024x800+130+65")
  1922. master.render()
  1923. #w = frame_fix #GUIWindow("OLD",master=0,width=800,height=500,left=130,top=65)
  1924. window_manager.new(w,name)
  1925. try:
  1926. #root.mainloop()
  1927. #tk.mainloop()
  1928. window_manager.mainloop()
  1929. finally:
  1930. master.exit()