dmx.py 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457
  1. #from pyray import *
  2. import pyray
  3. #import ralib_sdl as pyray
  4. #import raylib as pyray
  5. import sys
  6. sys.path.insert(0,"/opt/LibreLight/Xdesk/")
  7. #pyray.set_config_flags(pyray.FLAG_WINDOW_HIGHDPI )
  8. #pyray.set_config_flags(pyray.FLAG_MSAA_4X_HINT)
  9. pyray.set_config_flags(pyray.FLAG_WINDOW_RESIZABLE)
  10. CAPTION = 'RAY-DMX'
  11. import tool.movewin as movewin
  12. import pathlib
  13. _file_path=pathlib.Path(__file__)
  14. print("file:",_file_path)
  15. movewin.check_is_started(CAPTION,_file_path)
  16. win_title =CAPTION.strip().split()[-1]
  17. store = movewin.load_all_sdl(win_title)
  18. print(store)
  19. POS=[10,10]
  20. W=760
  21. H=450
  22. if store:
  23. POS=[store[-2],store[-1]]
  24. POS[0] += 5 #frame kompensation
  25. POS[1] += 29 #frame kompensation
  26. print(store)
  27. W=int(store[-4])
  28. H=int(store[-3])
  29. pyray.init_window(W, H, CAPTION) #"RAY-DMX")#,10,10,10,10)
  30. #pyray.TextureFilter(font10,1)
  31. win_con = movewin.Control()
  32. win_con.title = win_title
  33. win_con.winfo()
  34. if POS:
  35. win_con.move(POS[0],POS[1])
  36. print(POS,win_con.title)
  37. #exit()
  38. import sys
  39. sys.path.insert(0,"/opt/LibreLight/Xdesk/")
  40. import tool.tk_elm as tk_elm
  41. #import tool.sdl_elm as sdl_elm
  42. img = "/opt/LibreLight/Xdesk/icon/scribble.png"
  43. IMG = pyray.load_image(img)
  44. print(pyray.set_window_icon(IMG))
  45. import time
  46. import memcache
  47. mc = memcache.Client(['127.0.0.1:11211'], debug=0)
  48. #x=mc.get(k)
  49. old_x = -10
  50. old_y = -10
  51. start = time.time()
  52. frame_count = 0
  53. fps_count = 0
  54. #a = "/usr/share/fonts/truetype/freefont/FreeMono.ttf"
  55. #a = "/usr/share/fonts/truetype/freefont/FreeSerif.ttf"
  56. #a = "/usr/share/fonts/truetype/freefont/FreeSans.ttf"
  57. #a = "/usr/share/fonts/truetype/freefont/FreeMonoBold.ttf"
  58. #a = "/usr/share/fonts/truetype/freefont/FreeSansBold.ttf"
  59. k=200
  60. a = "/usr/share/fonts/truetype/freefont/FreeSans.ttf"
  61. font10l = pyray.load_font_ex(a, 10, None, 0);
  62. a = "/usr/share/fonts/truetype/freefont/FreeSansBold.ttf"
  63. font10 = pyray.load_font_ex(a, 12, None, 0);
  64. print(dir(font10))
  65. print(font10.baseSize)
  66. ##exit()
  67. font20 = pyray.load_font_ex(a, 20, None, 0);
  68. a = "/usr/share/fonts/truetype/freefont/FreeMono.ttf"
  69. a = "/usr/share/fonts/truetype/freefont/FreeSansBold.ttf"
  70. a = "/usr/share/fonts/truetype/freefont/FreeSans.ttf"
  71. font25 = pyray.load_font_ex(a, 25, None, 0);
  72. pyray.TextureFilter(3)
  73. class EVENT():
  74. def __init__(self):
  75. self.dict = {}
  76. self.type = 0
  77. self.button=10
  78. self.buttons=[0,0,0,0]
  79. xevent=EVENT()
  80. class BUTTON():
  81. def __init__(self,master=None,txt="<BUTTON>",pos=[10,10,20,90]):
  82. #self.btn = tk_elm.Button(None,pos=[390,12,20,90])
  83. self.btn = tk_elm.Button(master,pos=pos)
  84. self.btn.btn1.color = [127,127,127,255]
  85. #self.btn.btn1.type = "toggle"
  86. #self.btn.btn2.type = "toggle"
  87. #self.btn.btn3.type = "toggle"
  88. #btn.btn1.color_on = [155,155,155,255]
  89. #btn.btn2.color = [155,55,155,255]
  90. #btn.btn2.color_on = [155,155,155,255]
  91. self.btn.btn3.color = [55,155,155,255]
  92. self.btn.btn3.color_on = [55,255,255,255]
  93. self.btn.btn2.color_on = [55,255,255,255]
  94. self.btn.btn1.name=txt
  95. #x=btn.btn1.name
  96. def draw(self,event=None):
  97. font_size = font10.baseSize
  98. pos=self.btn.pos
  99. c=[122,122,122,122] #btn.btn2.get_color()
  100. pyray.draw_rectangle(pos[1],pos[0],pos[3],pos[2],c)
  101. c=self.btn.btn1.get_color()
  102. pyray.draw_rectangle(pos[1]+2,pos[0]+2,pos[3]-4,pos[2]-4,c)
  103. c=self.btn.btn3.get_color()
  104. #pyray.draw_rectangle(pos[1]+1,pos[0]+1,pos[3]-2,pos[2]-2,c)
  105. pyray.draw_rectangle_lines_ex([pos[1]+1,pos[0]+1,pos[3]-2,pos[2]-2],1,c)
  106. x=self.btn.btn1.name
  107. pyray.draw_text_ex(font10,str(x), [pos[1]+4,pos[0]+4], font_size, 0, [0,0,0,255])#pyray.YELLOW)#[0,255,0,255]) #pyray.YELLOW)
  108. def event(self,x,y,mouse):
  109. try:
  110. #print("POS:",old_x,old_y,mouse,xevent.type)
  111. xevent.dict={"pos":[old_y,old_x],"button":1,"buttons":[0,0,0]}
  112. #xevent.type=3
  113. for i,v in enumerate(mouse):
  114. if i==0:
  115. if v == "release":
  116. xevent.type=6
  117. xevent.dict["button"] = 1
  118. #self.btn.btn1.val.set(0)
  119. if v == "press":
  120. xevent.type=5
  121. xevent.dict["button"] = 1
  122. #self.btn.btn1.val.set(255)
  123. xevent.dict["buttons"] = mouse
  124. #print(xevent.dict,xevent.type,xevent.button)
  125. self.btn.event(xevent)
  126. except Exception as e:
  127. import traceback
  128. print(traceback.format_exc())
  129. raise e
  130. mouse_box_on = 0
  131. mouse_box_on_pos = [0,0]
  132. def draw_mouse_box(window,pos1,mouse=[None,None,None],color=[128,128,128],text=1):
  133. global mouse_box_on_pos
  134. global mouse_box_on
  135. if mouse[0]=="click":#"press":
  136. if mouse_box_on == 0:
  137. pos2 = pos1[:]
  138. mouse_box_on_pos = pos2
  139. mouse_box_on = 1
  140. else:
  141. mouse_box_on = 0
  142. if mouse[0]=="press":
  143. pos2 = mouse_box_on_pos[:]
  144. w=pos1[0]-pos2[0]
  145. h=pos1[1]-pos2[1]
  146. pos = pos2[:]
  147. #print(pos1,pos2,h,w)
  148. wd=1
  149. hd=1
  150. if w < 0:
  151. pos[0] = pos1[0]
  152. w*=-1
  153. wd=-1
  154. if h < 0:
  155. pos[1] = pos1[1]
  156. h*=-1
  157. hd=-1
  158. if w > 10 or h > 10:
  159. c=[255,255,255,255]
  160. pyray.draw_rectangle_lines_ex([pos[0],pos[1],w,h],1,c)
  161. font_size = font10l.baseSize
  162. pyray.draw_text_ex(font10l,str(pos1[0])+" "+str(pos1[1]), [pos1[0],pos1[1]-10], font_size, 0, pyray.WHITE)
  163. pyray.draw_text_ex(font10l,str(pos2[0])+" "+str(pos2[1]), [pos2[0]+5,pos2[1]+10], font_size, 0, pyray.WHITE)
  164. pyray.draw_text_ex(font10l,str(w), [pos2[0]+5+w/2*wd,pos2[1]], font_size, 0, pyray.WHITE)
  165. pyray.draw_text_ex(font10l,str(h), [pos2[0]+5,pos2[1]+h/2*hd], font_size, 0, pyray.WHITE)
  166. return pos1,pos2,[pos1[0]-pos2[0],pos1[1]-pos2[1]]
  167. mouse_old=[None,None,None]
  168. def check_area_v(v1,v2,event_v):#elm_pos,event_pos):
  169. if event_v < v1+1:
  170. return 0
  171. if event_v > v2-1:
  172. return 0
  173. return 1
  174. def check_area(pos,event_pos):
  175. v2 = pos[0]+pos[2]
  176. x = check_area_v(pos[0],v2,event_pos[0])
  177. v2 = pos[1]+pos[3]
  178. y = check_area_v(pos[1],v2,event_pos[1])
  179. if x and y:
  180. return 1
  181. spectrum = [[255,127]]*40
  182. def render_spectrum(cur,x,y):
  183. pyray.draw_text_ex(font25,"SRC:{}".format(cur),[x-20,y-50], 25, 0, pyray.VIOLET)
  184. txt="1 DMX"
  185. pyray.draw_text_ex(font10,txt, [x,y-20], font_size, 0, [0,255,0,255]) #pyray.YELLOW)
  186. txt="255"
  187. pyray.draw_text_ex(font10,txt, [x+230,y-20], font_size, 0, [0,255,0,255]) #pyray.YELLOW)
  188. txt="512 DMX"
  189. pyray.draw_text_ex(font10,txt, [x+470,y-20], font_size, 0, [0,255,0,255]) #pyray.YELLOW)
  190. DMX=mc.get(cur)
  191. spectrum.append(DMX)
  192. if len(spectrum) > 40:
  193. spectrum.pop(0)
  194. for i,lines in enumerate(spectrum):
  195. if lines:
  196. for j,pix in enumerate(lines):
  197. if type(pix) is not int:
  198. pix=0
  199. if pix > 255:
  200. pix=255
  201. if pix < 0:
  202. pix=0
  203. c=[255,255,255,pix]
  204. #pyray.draw_pixel(x+j,y+i*6,c)
  205. pyray.draw_line(x+j,y+i*6,x+j,y+i*6-5,c)
  206. def render_grid(cur,x,y):
  207. xi=0
  208. yi=0
  209. grid_x = x #250
  210. grid_y = y #60
  211. for i,v in enumerate(range(20)):
  212. # COL NUMBER -> 1 2... 20
  213. x2 = grid_x+i*25#+xi
  214. y2 = grid_y-20 #+yi
  215. txt=str(i+1)
  216. pyray.draw_text_ex(font10,txt, [x2,y2], font_size, 0, [0,255,0,255]) #pyray.YELLOW)
  217. i+=1
  218. DMX=mc.get(cur)
  219. pyray.draw_text_ex(font25,"SRC:{}".format(cur),[grid_x-20,grid_y-50], 25, 0, pyray.VIOLET)
  220. if DMX:
  221. for i,v in enumerate(DMX):
  222. if v:
  223. host_list[k][-1] +=1
  224. txt = str(v)
  225. x2 = grid_x+xi*25
  226. y2 = grid_y+yi*15
  227. try:
  228. pyray.draw_rectangle(x2-2, y2-2,24,13,[255,255,255,int(v)])
  229. except:
  230. pyray.draw_rectangle(x2-2, y2-2,24,13,[255,2,2,255])
  231. try:
  232. int(v)
  233. except:
  234. v=0
  235. if int(v) > 100:
  236. pyray.draw_text_ex(font10,txt, [x2,y2], font_size, 0, pyray.BLACK)# pyray.VIOLET)
  237. else:
  238. pyray.draw_text_ex(font10,txt, [x2,y2], font_size, 0, GREY)# pyray.VIOLET)
  239. xi+=1
  240. if xi % 20 == 0:
  241. txt = str(int(yi*20)+1)
  242. pyray.draw_text_ex(font10,txt, [grid_x-30,y2], font_size, 0, pyray.YELLOW)# pyray.VIOLET) # ROEW NR
  243. xi = 0
  244. yi += 1
  245. txt = str(int(yi*20)+1)
  246. pyray.draw_text_ex(font10,txt, [grid_x-30,y2], font_size, 0, pyray.YELLOW)# pyray.VIOLET) # ROEW NR
  247. buttons={} #[]
  248. cur = None
  249. history = []
  250. spectrum_btn=BUTTON(None,"SPECTRUM",[3,610,20,90])
  251. spectrum_btn.btn.btn1.color = pyray.YELLOW # [127,127,127,255]
  252. spectrum_btn.btn.btn1.color_on = pyray.YELLOW # [127,127,127,255]
  253. add=0
  254. while not pyray.window_should_close():
  255. pyray.begin_drawing()
  256. pyray.clear_background(pyray.BLACK)
  257. pyray.Color(255,0,0,0)
  258. pyray.rl_enable_smooth_lines()
  259. font_size = font10.baseSize
  260. try:
  261. DATA=mc.get("index")#cmd)
  262. GREY = [122,122,122,255]
  263. p=0
  264. keys = []
  265. host_list = {}
  266. k="xxx"
  267. if DATA is None:
  268. k="None"
  269. keys.append(k)
  270. host_list[k] = "" #DATA[k] #[0]).ljust(" ",18) #,0,"=",0]
  271. if DATA:
  272. for k in DATA:
  273. #print(k,DATA[k])
  274. #print(k)
  275. keys.append(k)
  276. host_list[k] = DATA[k] #[0]).ljust(" ",18) #,0,"=",0]
  277. keys.sort()
  278. k=keys[0]
  279. if cur is None:
  280. cur = k #k[3] #"xx123" # k
  281. if cur not in host_list:
  282. if host_list:
  283. cur = keys[0] #host_list[0]
  284. if spectrum_btn.btn.btn1.val.get():
  285. render_spectrum(cur,230,50)
  286. else:
  287. render_grid(cur,250,50)
  288. p=0
  289. for k,v in host_list.items():
  290. x2 = 10
  291. y2 = 60+p #grid_y+p
  292. v = str(v).replace(" ","").replace("[","").replace("]","")
  293. txt = str(k)+" "+str(v)
  294. key = txt.split(" ")[0]
  295. p+=22
  296. if key in buttons:
  297. btn = buttons[key]
  298. else:
  299. btn=BUTTON(None,txt,[y2,x2,20,190])
  300. buttons[key] = btn
  301. print("ADD",key,btn)
  302. add=1
  303. btn.btn.btn1.name = txt
  304. btn.btn.btn1.color_on = [255,255,0,255]
  305. btn.btn.btn1.val.set(0)
  306. if cur in btn.btn.btn1.name:
  307. btn.btn.btn1.val.set(255)
  308. #btn.btn.btn1.press() #val.set(255)
  309. if add:
  310. add=0
  311. print()
  312. w=200
  313. h=50
  314. x=200
  315. y=200
  316. pyray.draw_text_ex(font25,"FPS:{}".format(fps_count),[10,5], 25, 0, pyray.VIOLET)
  317. m=pyray.get_mouse_position()
  318. #print(m)
  319. if m.x != old_x or m.y != old_y:
  320. old_x = m.x
  321. old_y = m.y
  322. mouse=[None,None,None]
  323. mouse_change=0
  324. for i in range(3):
  325. ev = ""
  326. if pyray.is_mouse_button_released(i):
  327. ev = "release"
  328. if pyray.is_mouse_button_pressed(i):
  329. ev = "click" #"press"
  330. if ev and ev != mouse[i]:
  331. mouse[i] = ev
  332. mouse_change=1
  333. if mouse != mouse_old and mouse != [None,None,None]:
  334. #print(mouse)
  335. mouse_old = mouse[:]
  336. spectrum_btn.event(old_x,old_y,mouse_old) #abtn.btn1.name = "SPECTRUM"
  337. if check_area(spectrum_btn.btn.pos,[old_y,old_x]):#event_pos):
  338. if "release" == mouse_old[0]:
  339. print( spectrum_btn.btn.btn1.val.get(),mouse_old)
  340. if spectrum_btn.btn.btn1.val.get():
  341. spectrum_btn.btn.btn1.val.set(0)
  342. spectrum_btn.btn.btn1.name = "SPECTRUM"
  343. else:
  344. spectrum_btn.btn.btn1.val.set(255)
  345. spectrum_btn.btn.btn1.name = "DMX-GRID"
  346. spectrum_btn.draw()
  347. for k,btn in buttons.items():
  348. btn.event(old_x,old_y,mouse_old)
  349. if "release" == mouse_old[0]:
  350. btn.button = 1
  351. if check_area(btn.btn.pos,[old_y,old_x]):#event_pos):
  352. cur = k
  353. btn.draw()
  354. aapos = draw_mouse_box(None,[old_x,old_y],mouse_old,color=[128,128,128],text=1)
  355. pyray.draw_text_ex(font20,"POS:{}:{}".format(int(m.x),int(m.y)),[10,34], 20, 0, pyray.VIOLET)
  356. pyray.draw_rectangle(int(old_x-10),int(old_y-1),20,2,[255,0,255,255])
  357. pyray.draw_rectangle(int(old_x-1),int(old_y-10),2,20,[255,0,255,255])
  358. pyray.end_drawing()
  359. time.sleep(1/11)
  360. for i,v in enumerate(mouse_old):
  361. if v == "release":
  362. mouse_old[i] = None
  363. if v == "click":
  364. mouse_old[i] = "press"
  365. #print(mouse_old)
  366. frame_count += 1
  367. if time.time()-start > 1:
  368. start = time.time()
  369. fps_count = frame_count
  370. frame_count = 0
  371. except KeyboardInterrupt as e:
  372. raise e
  373. except Exception as e:# KeyInterupt
  374. print("err",e)
  375. import traceback
  376. print(traceback.format_exc())
  377. time.sleep(1)
  378. pyray.close_window()