fxlib.py 11 KB

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