fxlib.py 11 KB

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