fxlib.py 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320
  1. #/usr/bin/python3
  2. import random
  3. import sys
  4. if "/opt/LibreLight/Xdesk/" not in sys.path:
  5. sys.path.insert(0,"/opt/LibreLight/Xdesk/")
  6. import lib.fixlib as fixlib
  7. import lib.meta as meta
  8. def cprint(*args):
  9. print(args)
  10. def process_wings(xfixtures,fx_prm):
  11. """process the wing's of selected fixtures
  12. input: [1,2,3,4,10,12,13,14]
  13. if WING = 2 return: [[1,2,3,4][14,13,12,10]]
  14. """
  15. wing_buffer = []
  16. fix_count = len(xfixtures)
  17. prm = fx_prm # ToDo: global WING for PAN/TILE !? ATTRIBUT is not availible in this moment
  18. if prm["WING"] > 1 and fix_count > 1:
  19. wing_count = fix_count // prm["WING"]
  20. number_of_fix_in_wing = fix_count // wing_count
  21. if number_of_fix_in_wing < 2:
  22. number_of_fix_in_wing = 2
  23. for i in range(number_of_fix_in_wing):
  24. j = i*wing_count
  25. wing = xfixtures[j:j+wing_count]
  26. if i%2!=0:
  27. wing = wing[::-1]
  28. cprint("wing",i,"j",j,"wing_count:",wing_count,"wing",wing)
  29. wing_buffer.append(wing)
  30. if fix_count > j+wing_count: # append Fixtures Left over
  31. wing = xfixtures[j+wing_count:]
  32. wing_buffer.append(wing)
  33. else:
  34. wing_buffer.append(xfixtures)
  35. if prm["SHUFFLE"]:
  36. _wing_buffer = []
  37. max_nr = 0
  38. for wing in wing_buffer:
  39. if max_nr < len(wing):
  40. max_nr = len(wing)
  41. random.seed(9300) # sync random
  42. shuf = list(range(max_nr))
  43. random.shuffle(shuf)
  44. for i,wing in enumerate(wing_buffer):
  45. wing = wing[:]
  46. wing2=[]
  47. shuf2=shuf[:]
  48. if i % 2 == 0: # invert even wing
  49. wing = wing[::-1]
  50. for a,s in enumerate(shuf2):
  51. if s >= len(wing):
  52. continue
  53. wing2.append(wing[s])
  54. if i % 2 == 0: # re inver even wing
  55. wing2 = wing2[::-1]
  56. _wing_buffer.append(wing2)
  57. wing_buffer = _wing_buffer
  58. return wing_buffer
  59. def _process_effect(wing_buffer,fx_prm,fx_prm_move,FIXTURES,fx_name=""):
  60. jdatas = []
  61. offset = 0
  62. offset_move = 0
  63. start = fx_prm["START"]
  64. base = fx_prm["BASE"]
  65. for wi, wing in enumerate(wing_buffer):
  66. count_of_fix_in_wing = len(wing)
  67. coffset= 0 # 1024/count_of_fix_in_wing * (offset/255)
  68. coffset_move=0
  69. for fix in wing:
  70. if fix not in FIXTURES.fixtures:
  71. continue
  72. data = FIXTURES.fixtures[fix]
  73. for attr in data["ATTRIBUT"]:
  74. if attr.startswith("_"):
  75. continue
  76. if attr.endswith("-FINE"):
  77. continue
  78. jdata = {"MODE":"FX"}
  79. jdata["WING"] = wi
  80. jdata["VALUE"] = None
  81. jdata["FIX"] = fix
  82. dmx = fixlib.get_dmx(FIXTURES.fixtures,fix,attr)
  83. jdata["DMX"] = dmx
  84. dmx_fine = fixlib.get_dmx(FIXTURES.fixtures,fix,attr+"-FINE")
  85. if dmx_fine != jdata["DMX"] and dmx > 0:
  86. jdata["DMX-FINE"] = dmx_fine
  87. jdata["ATTR"] = attr
  88. tmp_fx_prm = fx_prm
  89. coffset= round(offset,1)
  90. if attr in ["PAN","TILT"]:
  91. tmp_fx_prm = fx_prm_move
  92. coffset_move= round(offset_move,1)
  93. csize = tmp_fx_prm["SIZE"]
  94. cspeed = tmp_fx_prm["SPEED"]
  95. cstart = tmp_fx_prm["START"]
  96. cbase = tmp_fx_prm["BASE"]
  97. width = tmp_fx_prm["WIDTH"]
  98. invert = tmp_fx_prm["INVERT"]
  99. fx=""
  100. if "SIN" in fx_name:
  101. fx = "sinus"
  102. elif "FD" in fx_name:
  103. fx = "fade"
  104. elif "RND" in fx_name:
  105. fx = "rnd"
  106. elif "STATIC" in fx_name:
  107. fx = "static"
  108. elif "ON" in fx_name:
  109. fx = "on"
  110. elif "RAMP2" in fx_name:
  111. fx = "bump2"
  112. fx = "ramp2"
  113. elif "RAMP" in fx_name:
  114. fx = "ramp"
  115. elif "COS" in fx_name:
  116. fx = "cosinus"
  117. if fx:
  118. if attr in ["PAN","TILT"]:
  119. cprint("SKIP FX attr:{} fix:{} " .format(attr,fix) )
  120. continue
  121. if fx:
  122. if cspeed < 0:
  123. fx = "off"
  124. else:
  125. if ":DIM" in fx_name:
  126. base=""
  127. ffxb=meta.fx_mo[fx_prm["MO"]]
  128. if attr == "DIM":
  129. if cspeed < 0:
  130. fx = "off"
  131. else:
  132. fx = ffxb #"fade"
  133. elif ":TILT" in fx_name:
  134. base=""
  135. if attr == "PAN":
  136. fx = "off"
  137. if attr == "TILT":
  138. if cspeed < 0:
  139. fx = "off"
  140. else:
  141. fx = "sinus"
  142. elif ":PAN" in fx_name:
  143. base=""
  144. if attr == "PAN":
  145. if cspeed < 0:
  146. fx = "off"
  147. else:
  148. fx = "cosinus"
  149. if attr == "TILT":
  150. fx = "off"
  151. elif ":CIR" in fx_name:
  152. base=""
  153. if attr == "PAN":
  154. if cspeed < 0:
  155. fx = "off"
  156. else:
  157. fx = "cosinus"
  158. if attr == "TILT":
  159. if cspeed < 0:
  160. fx = "off"
  161. else:
  162. fx = "sinus"
  163. elif ":RED" in fx_name:
  164. fxon = "on"
  165. fxoff = "static" #"off"
  166. MODE = fx_modes[fx_prm["MODE"]]
  167. if "RED" in MODE:
  168. base="-"
  169. if attr == "RED":
  170. fx = fxon # ON ----
  171. #csize *=-1
  172. if attr == "GREEN":
  173. fx = "static"
  174. csize = 0
  175. if attr == "BLUE":
  176. fx = "static"
  177. csize = 0
  178. elif "GREEN" in MODE:
  179. base="-"
  180. if attr == "RED":
  181. fx = "static"
  182. csize = 0
  183. if attr == "GREEN":
  184. fx = fxon # ON ----
  185. csize *=-1
  186. if attr == "BLUE":
  187. fx = "static"
  188. csize = 0
  189. elif "BLUE" in MODE:
  190. base="-"
  191. if attr == "RED":
  192. fx = "static"
  193. csize = 0
  194. if attr == "GREEN":
  195. fx = "static"
  196. csize = 0
  197. if attr == "BLUE":
  198. fx = fxon # ON ----
  199. csize *=-1
  200. elif "YELLOW" in MODE:
  201. base="-"
  202. if attr == "RED":
  203. fx = fxon
  204. csize *=-1
  205. if attr == "GREEN":
  206. fx = fxon
  207. csize *=-1
  208. if attr == "BLUE":
  209. fx = "static"
  210. csize = 0
  211. elif "CYAN" in MODE:
  212. base="-"
  213. if attr == "RED":
  214. fx = fxoff
  215. invert *= -1
  216. csize = 0
  217. fx = fxon
  218. if attr == "GREEN":
  219. fx = fxon
  220. csize=0
  221. if attr == "BLUE":
  222. fx = fxon
  223. csize=0
  224. elif "MAG" in MODE:
  225. base="-"
  226. if attr == "RED":
  227. fx = fxon
  228. csize=0
  229. if attr == "GREEN":
  230. fx = fxoff
  231. invert *= -1
  232. csize = 0
  233. fx = fxon
  234. if attr == "BLUE":
  235. fx = fxon
  236. csize=0
  237. else:
  238. cprint("FX: unbekant",fx_modes[fx_prm["MODE"]],color="red")
  239. fxtype = fx
  240. fxtype = fx
  241. if "FX" not in data["ATTRIBUT"][attr]:
  242. data["ATTRIBUT"][attr]["FX"] =""
  243. if "FX2" not in data["ATTRIBUT"][attr]:
  244. data["ATTRIBUT"][attr]["FX2"] ={}
  245. if data["ATTRIBUT"][attr]["ACTIVE"] and fxtype:
  246. fjdata = {}
  247. if cspeed < 0.1:
  248. fjdata["TYPE"] = "off"
  249. else:
  250. fjdata["TYPE"] = fxtype
  251. fjdata["SIZE"] = round(csize,2)
  252. fjdata["SPEED"] = round(cspeed,2)
  253. fjdata["WIDTH"] = int(width)
  254. fjdata["START"] = cstart
  255. if attr in ["PAN","TILT"]:
  256. fjdata["OFFSET"]= round(coffset_move,2)
  257. else:
  258. fjdata["OFFSET"]= round(coffset,2)
  259. fjdata["INVERT"]= int(invert)
  260. fjdata["BASE"] = cbase
  261. jdata["FX2"] = fjdata
  262. data["ATTRIBUT"][attr]["FX2"] = fjdata
  263. jdatas.append(jdata)
  264. print("GOO FX:",jdata)
  265. if fx_prm_move["OFFSET"] > 0.5: # and
  266. aoffset_move = (100/count_of_fix_in_wing) * (fx_prm_move["OFFSET"]/100)
  267. if fx_prm_move["DIR"] <= 0:
  268. offset_move -= aoffset_move
  269. else:
  270. offset_move += aoffset_move
  271. offset_move = round(offset_move,2)
  272. if fx_prm["OFFSET"] > 0.5: # and
  273. aoffset = (100/count_of_fix_in_wing) * (fx_prm["OFFSET"]/100)
  274. if fx_prm["DIR"] <= 0:
  275. offset -= aoffset
  276. else:
  277. offset += aoffset
  278. offset = round(offset,2)
  279. return jdatas
  280. def process_effect(wing_buffer,fx_prm,fx_prm_move,modes,jclient_send,master,FIXTURES,fx_name=""):
  281. jdatas = _process_effect(wing_buffer,fx_prm,fx_prm_move,FIXTURES,fx_name=fx_name)
  282. if jdatas and not modes.val("BLIND"):
  283. jclient_send(jdatas)
  284. master._refresh_fix()
  285. return jdatas