dmx.py 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458
  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. if DMX:
  220. for i,v in enumerate(DMX):
  221. if v:
  222. host_list[k][-1] +=1
  223. txt = str(v)
  224. x2 = grid_x+xi*25
  225. y2 = grid_y+yi*15
  226. try:
  227. pyray.draw_rectangle(x2-2, y2-2,24,13,[255,255,255,int(v)])
  228. except:
  229. pyray.draw_rectangle(x2-2, y2-2,24,13,[255,2,2,255])
  230. try:
  231. int(v)
  232. except:
  233. v=0
  234. if int(v) > 100:
  235. pyray.draw_text_ex(font10,txt, [x2,y2], font_size, 0, pyray.BLACK)# pyray.VIOLET)
  236. else:
  237. pyray.draw_text_ex(font10,txt, [x2,y2], font_size, 0, GREY)# pyray.VIOLET)
  238. xi+=1
  239. if xi % 20 == 0:
  240. txt = str(int(yi*20)+1)
  241. pyray.draw_text_ex(font10,txt, [grid_x-30,y2], font_size, 0, pyray.YELLOW)# pyray.VIOLET) # ROEW NR
  242. xi = 0
  243. yi += 1
  244. txt = str(int(yi*20)+1)
  245. pyray.draw_text_ex(font10,txt, [grid_x-30,y2], font_size, 0, pyray.YELLOW)# pyray.VIOLET) # ROEW NR
  246. buttons={} #[]
  247. cur = None
  248. history = []
  249. spectrum_btn=BUTTON(None,"SPECTRUM",[3,610,20,90])
  250. spectrum_btn.btn.btn1.color = pyray.YELLOW # [127,127,127,255]
  251. spectrum_btn.btn.btn1.color_on = pyray.YELLOW # [127,127,127,255]
  252. add=0
  253. while not pyray.window_should_close():
  254. pyray.begin_drawing()
  255. pyray.clear_background(pyray.BLACK)
  256. pyray.Color(255,0,0,0)
  257. pyray.rl_enable_smooth_lines()
  258. font_size = font10.baseSize
  259. try:
  260. DATA=mc.get("index")#cmd)
  261. GREY = [122,122,122,255]
  262. p=0
  263. keys = []
  264. host_list = {}
  265. k="xxx"
  266. if DATA is None:
  267. k="None"
  268. keys.append(k)
  269. host_list[k] = "" #DATA[k] #[0]).ljust(" ",18) #,0,"=",0]
  270. if DATA:
  271. for k in DATA:
  272. #print(k,DATA[k])
  273. #print(k)
  274. keys.append(k)
  275. host_list[k] = DATA[k] #[0]).ljust(" ",18) #,0,"=",0]
  276. keys.sort()
  277. k=keys[0]
  278. if cur is None:
  279. cur = k #k[3] #"xx123" # k
  280. if spectrum_btn.btn.btn1.val.get():
  281. render_spectrum(cur,230,50)
  282. else:
  283. render_grid(cur,250,50)
  284. p=0
  285. for k,v in host_list.items():
  286. x2 = 10
  287. y2 = 60+p #grid_y+p
  288. v = str(v).replace(" ","").replace("[","").replace("]","")
  289. txt = str(k)+" "+str(v)
  290. key = txt.split(" ")[0]
  291. p+=22
  292. if key in buttons:
  293. btn = buttons[key]
  294. else:
  295. btn=BUTTON(None,txt,[y2,x2,20,190])
  296. buttons[key] = btn
  297. print("ADD",key,btn)
  298. add=1
  299. btn.btn.btn1.name = txt
  300. btn.btn.btn1.color_on = [255,255,0,255]
  301. btn.btn.btn1.val.set(0)
  302. if cur in btn.btn.btn1.name:
  303. btn.btn.btn1.val.set(255)
  304. #btn.btn.btn1.press() #val.set(255)
  305. if add:
  306. add=0
  307. print()
  308. w=200
  309. h=50
  310. x=200
  311. y=200
  312. pyray.draw_text_ex(font25,"FPS:{}".format(fps_count),[10,5], 25, 0, pyray.VIOLET)
  313. m=pyray.get_mouse_position()
  314. #print(m)
  315. if m.x != old_x or m.y != old_y:
  316. old_x = m.x
  317. old_y = m.y
  318. mouse=[None,None,None]
  319. mouse_change=0
  320. for i in range(3):
  321. ev = ""
  322. if pyray.is_mouse_button_released(i):
  323. ev = "release"
  324. if pyray.is_mouse_button_pressed(i):
  325. ev = "click" #"press"
  326. if ev and ev != mouse[i]:
  327. mouse[i] = ev
  328. mouse_change=1
  329. if mouse != mouse_old and mouse != [None,None,None]:
  330. #print(mouse)
  331. mouse_old = mouse[:]
  332. spectrum_btn.event(old_x,old_y,mouse_old) #abtn.btn1.name = "SPECTRUM"
  333. if check_area(spectrum_btn.btn.pos,[old_y,old_x]):#event_pos):
  334. if "release" == mouse_old[0]:
  335. print( spectrum_btn.btn.btn1.val.get(),mouse_old)
  336. if spectrum_btn.btn.btn1.val.get():
  337. spectrum_btn.btn.btn1.val.set(0)
  338. spectrum_btn.btn.btn1.name = "SPECTRUM"
  339. else:
  340. spectrum_btn.btn.btn1.val.set(255)
  341. spectrum_btn.btn.btn1.name = "DMX-GRID"
  342. spectrum_btn.draw()
  343. for k,btn in buttons.items():
  344. btn.event(old_x,old_y,mouse_old)
  345. #if "press" == mouse_old[0]:
  346. if "release" == mouse_old[0]:
  347. btn.button = 1
  348. #if check_area(btn.btn.pos,[old_x,old_y]):#event_pos):
  349. if check_area(btn.btn.pos,[old_y,old_x]):#event_pos):
  350. #print(k,btn.btn.pos)
  351. #btn.btn.btn1.val.set(255)
  352. #cur = k
  353. cur = k # btn.btn.btn1.name
  354. btn.draw()
  355. aapos = draw_mouse_box(None,[old_x,old_y],mouse_old,color=[128,128,128],text=1)
  356. pyray.draw_text_ex(font20,"POS:{}:{}".format(int(m.x),int(m.y)),[10,34], 20, 0, pyray.VIOLET)
  357. pyray.draw_rectangle(int(old_x-10),int(old_y-1),20,2,[255,0,255,255])
  358. pyray.draw_rectangle(int(old_x-1),int(old_y-10),2,20,[255,0,255,255])
  359. pyray.end_drawing()
  360. time.sleep(1/11)
  361. for i,v in enumerate(mouse_old):
  362. if v == "release":
  363. mouse_old[i] = None
  364. if v == "click":
  365. mouse_old[i] = "press"
  366. #print(mouse_old)
  367. frame_count += 1
  368. if time.time()-start > 1:
  369. start = time.time()
  370. fps_count = frame_count
  371. frame_count = 0
  372. except KeyboardInterrupt as e:
  373. raise e
  374. except Exception as e:# KeyInterupt
  375. print("err",e)
  376. import traceback
  377. print(traceback.format_exc())
  378. time.sleep(1)
  379. pyray.close_window()