dmx.py 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452
  1. #from pyray import *
  2. import pyray
  3. import sys
  4. sys.path.insert(0,"/opt/LibreLight/Xdesk/")
  5. #for i in dir(pyray):
  6. # if i.startswith("draw_"):
  7. # print(i)
  8. #exit()
  9. #pyray.ConfigFlags(pyray.FLAG_MSAA_4X_HINT) #|pyray.FLAG_WINDOW_RESIZABLE )
  10. #pyray.ConfigFlags(pyray.FLAG_WINDOW_RESIZABLE )
  11. #pyray.ConfigFlags(pyray.FLAG_WINDOW_HIGHDPI )
  12. CAPTION = 'RAY-DMX'
  13. import tool.movewin as movewin
  14. import pathlib
  15. _file_path=pathlib.Path(__file__)
  16. print("file:",_file_path)
  17. movewin.check_is_started(CAPTION,_file_path)
  18. win_title =CAPTION.strip().split()[-1]
  19. store = movewin.load_all_sdl(win_title)
  20. print(store)
  21. POS=[10,10]
  22. if store:
  23. POS=[store[-2],store[-1]]
  24. pyray.init_window(760, 450, CAPTION) #"RAY-DMX")#,10,10,10,10)
  25. #pyray.TextureFilter(font10,1)
  26. win_con = movewin.Control()
  27. win_con.title = win_title
  28. win_con.winfo()
  29. if POS:
  30. win_con.move(POS[0],POS[1])
  31. print(POS,win_con.title)
  32. #exit()
  33. import sys
  34. sys.path.insert(0,"/opt/LibreLight/Xdesk/")
  35. import tool.tk_elm as tk_elm
  36. #import tool.sdl_elm as sdl_elm
  37. img = "/opt/LibreLight/Xdesk/icon/scribble.png"
  38. IMG = pyray.load_image(img)
  39. print(pyray.set_window_icon(IMG))
  40. import time
  41. import memcache
  42. mc = memcache.Client(['127.0.0.1:11211'], debug=0)
  43. #x=mc.get(k)
  44. old_x = -10
  45. old_y = -10
  46. start = time.time()
  47. frame_count = 0
  48. fps_count = 0
  49. #a = "resources/pixantiqua.ttf"
  50. #a = "/lib/firefox-esr/fonts/TwemojiMozilla.ttf"
  51. #a = "/lib/python3/dist-packages/pygame/freesansbold.ttf"
  52. #a = "/usr/share/fonts/truetype/freefont/FreeMono.ttf"
  53. #a = "/usr/share/fonts/truetype/freefont/FreeSerif.ttf"
  54. #a = "/usr/share/fonts/truetype/freefont/FreeMonoBold.ttf"
  55. a = "/usr/share/fonts/truetype/freefont/FreeSans.ttf"
  56. a = "/usr/share/fonts/truetype/freefont/FreeMonoBold.ttf"
  57. a = "/usr/share/fonts/truetype/freefont/FreeSansBold.ttf"
  58. #a = "/usr/share/fonts/truetype/freefont/FreeSans.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
  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. for j,pix in enumerate(lines):
  196. if type(pix) is not int:
  197. pix=0
  198. if pix > 255:
  199. pix=255
  200. if pix < 0:
  201. pix=0
  202. c=[255,255,255,pix]
  203. #pyray.draw_pixel(x+j,y+i*6,c)
  204. pyray.draw_line(x+j,y+i*6,x+j,y+i*6-5,c)
  205. def render_grid(cur,x,y):
  206. xi=0
  207. yi=0
  208. grid_x = x #250
  209. grid_y = y #60
  210. for i,v in enumerate(range(20)):
  211. # COL NUMBER -> 1 2... 20
  212. x2 = grid_x+i*25#+xi
  213. y2 = grid_y-20 #+yi
  214. txt=str(i+1)
  215. pyray.draw_text_ex(font10,txt, [x2,y2], font_size, 0, [0,255,0,255]) #pyray.YELLOW)
  216. i+=1
  217. DMX=mc.get(cur)
  218. pyray.draw_text_ex(font25,"SRC:{}".format(cur),[grid_x-20,grid_y-50], 25, 0, pyray.VIOLET)
  219. for i,v in enumerate(DMX):
  220. if v:
  221. host_list[k][-1] +=1
  222. txt = str(v)
  223. x2 = grid_x+xi*25
  224. y2 = grid_y+yi*15
  225. try:
  226. pyray.draw_rectangle(x2-2, y2-2,24,13,[255,255,255,int(v)])
  227. except:
  228. pyray.draw_rectangle(x2-2, y2-2,24,13,[255,2,2,255])
  229. try:
  230. int(v)
  231. except:
  232. v=0
  233. if int(v) > 100:
  234. pyray.draw_text_ex(font10,txt, [x2,y2], font_size, 0, pyray.BLACK)# pyray.VIOLET)
  235. else:
  236. pyray.draw_text_ex(font10,txt, [x2,y2], font_size, 0, GREY)# pyray.VIOLET)
  237. xi+=1
  238. if xi % 20 == 0:
  239. txt = str(int(yi*20)+1)
  240. pyray.draw_text_ex(font10,txt, [grid_x-30,y2], font_size, 0, pyray.YELLOW)# pyray.VIOLET) # ROEW NR
  241. xi = 0
  242. yi += 1
  243. txt = str(int(yi*20)+1)
  244. pyray.draw_text_ex(font10,txt, [grid_x-30,y2], font_size, 0, pyray.YELLOW)# pyray.VIOLET) # ROEW NR
  245. buttons={} #[]
  246. cur = None
  247. history = []
  248. spectrum_btn=BUTTON(None,"SPECTRUM",[3,610,20,90])
  249. spectrum_btn.btn.btn1.color = pyray.YELLOW # [127,127,127,255]
  250. spectrum_btn.btn.btn1.color_on = pyray.YELLOW # [127,127,127,255]
  251. add=0
  252. while not pyray.window_should_close():
  253. pyray.begin_drawing()
  254. pyray.clear_background(pyray.BLACK)
  255. pyray.Color(255,0,0,0)
  256. pyray.rl_enable_smooth_lines()
  257. font_size = font10.baseSize
  258. try:
  259. DATA=mc.get("index")#cmd)
  260. GREY = [122,122,122,255]
  261. p=0
  262. keys = []
  263. host_list = {}
  264. for k in DATA:
  265. #print(k,DATA[k])
  266. #print(k)
  267. keys.append(k)
  268. host_list[k] = DATA[k] #[0]).ljust(" ",18) #,0,"=",0]
  269. keys.sort()
  270. k=keys[0]
  271. if cur is None:
  272. cur = k #k[3] #"xx123" # k
  273. if spectrum_btn.btn.btn1.val.get():
  274. render_spectrum(cur,230,50)
  275. else:
  276. render_grid(cur,250,50)
  277. p=0
  278. for k,v in host_list.items():
  279. x2 = 10
  280. y2 = 60+p #grid_y+p
  281. v = str(v).replace(" ","").replace("[","").replace("]","")
  282. txt = str(k)+" "+str(v)
  283. key = txt.split(" ")[0]
  284. p+=22
  285. if key in buttons:
  286. btn = buttons[key]
  287. else:
  288. btn=BUTTON(None,txt,[y2,x2,20,190])
  289. buttons[key] = btn
  290. print("ADD",key,btn)
  291. add=1
  292. btn.btn.btn1.name = txt
  293. btn.btn.btn1.color_on = [255,255,0,255]
  294. btn.btn.btn1.val.set(0)
  295. if cur in btn.btn.btn1.name:
  296. btn.btn.btn1.val.set(255)
  297. #btn.btn.btn1.press() #val.set(255)
  298. if add:
  299. add=0
  300. print()
  301. w=200
  302. h=50
  303. x=200
  304. y=200
  305. pyray.draw_text_ex(font25,"FPS:{}".format(fps_count),[10,5], 25, 0, pyray.VIOLET)
  306. m=pyray.get_mouse_position()
  307. #print(m)
  308. if m.x != old_x or m.y != old_y:
  309. old_x = m.x
  310. old_y = m.y
  311. mouse=[None,None,None]
  312. mouse_change=0
  313. for i in range(3):
  314. ev = ""
  315. if pyray.is_mouse_button_released(i):
  316. ev = "release"
  317. if pyray.is_mouse_button_pressed(i):
  318. ev = "click" #"press"
  319. if ev and ev != mouse[i]:
  320. mouse[i] = ev
  321. mouse_change=1
  322. if mouse != mouse_old and mouse != [None,None,None]:
  323. #print(mouse)
  324. mouse_old = mouse[:]
  325. spectrum_btn.event(old_x,old_y,mouse_old) #abtn.btn1.name = "SPECTRUM"
  326. if check_area(spectrum_btn.btn.pos,[old_y,old_x]):#event_pos):
  327. if "release" == mouse_old[0]:
  328. print( spectrum_btn.btn.btn1.val.get(),mouse_old)
  329. if spectrum_btn.btn.btn1.val.get():
  330. spectrum_btn.btn.btn1.val.set(0)
  331. spectrum_btn.btn.btn1.name = "SPECTRUM"
  332. else:
  333. spectrum_btn.btn.btn1.val.set(255)
  334. spectrum_btn.btn.btn1.name = "DMX-GRID"
  335. spectrum_btn.draw()
  336. for k,btn in buttons.items():
  337. btn.event(old_x,old_y,mouse_old)
  338. #if "press" == mouse_old[0]:
  339. if "release" == mouse_old[0]:
  340. btn.button = 1
  341. #if check_area(btn.btn.pos,[old_x,old_y]):#event_pos):
  342. if check_area(btn.btn.pos,[old_y,old_x]):#event_pos):
  343. #print(k,btn.btn.pos)
  344. #btn.btn.btn1.val.set(255)
  345. #cur = k
  346. cur = k # btn.btn.btn1.name
  347. btn.draw()
  348. aapos = draw_mouse_box(None,[old_x,old_y],mouse_old,color=[128,128,128],text=1)
  349. pyray.draw_text_ex(font20,"POS:{}:{}".format(int(m.x),int(m.y)),[10,34], 20, 0, pyray.VIOLET)
  350. pyray.draw_rectangle(int(old_x-10),int(old_y-1),20,2,[255,0,255,255])
  351. pyray.draw_rectangle(int(old_x-1),int(old_y-10),2,20,[255,0,255,255])
  352. pyray.end_drawing()
  353. time.sleep(1/11)
  354. for i,v in enumerate(mouse_old):
  355. if v == "release":
  356. mouse_old[i] = None
  357. if v == "click":
  358. mouse_old[i] = "press"
  359. #print(mouse_old)
  360. frame_count += 1
  361. if time.time()-start > 1:
  362. start = time.time()
  363. fps_count = frame_count
  364. frame_count = 0
  365. except KeyboardInterrupt as e:
  366. raise e
  367. except Exception as e:# KeyInterupt
  368. print("err",e)
  369. import traceback
  370. print(traceback.format_exc())
  371. time.sleep(1)
  372. pyray.close_window()