_LibreLightDesk.py 76 KB

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