forked from protonphoton/LJ
		
	[enh] adds clitools
This commit is contained in:
		
							parent
							
								
									0e9e7717c9
								
							
						
					
					
						commit
						249932a9dd
					
				
							
								
								
									
										70
									
								
								clitools/README.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										70
									
								
								clitools/README.md
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,70 @@
 | 
				
			|||||||
 | 
					# Chaining Lasers In Submission Tools for LJ
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Alright everybody, ready for some fun? Here comes The Piping And Plumbing Your Way To The Top Show!
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					You're going to push so many points to this laser it will hog and cry...
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					BOOM | WIIIIIZ :: PHHHHHRACKRACKRACK ~~ WOOP ~~###~~ WIIT
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## The basic loop
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					python3 generators/dummy.py -f 2 | filters/kaleidoscope.py  | exports/toRedis.py -v 
 | 
				
			||||||
 | 
					 ------------------------------     ---------------------      -------------------
 | 
				
			||||||
 | 
					             \/                              \/                        \/
 | 
				
			||||||
 | 
					          Generator                       Filter                      Export
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					1. The Generator
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Use it to produce some points in any manner, orderly or total chaos.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Don't be that boring Sinusoids bugger! Flash Maps of Dooms, Disbitnic sprites, Dismorphic HexaFonts all over the walls! 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					2. The Filter(s)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					These babies will modify data on the wire by passing around the points and modifying them in sequence. 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Want your Double Heavy Laser Cannons to bounce together like they been drinking Jagerbombs for two hours? That's the place.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					3. The Exporter
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Now, this IS the most boring part. Send your points to whatever output system. Yawn. Are we there yet?
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Hacking around
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Say what!? Why, this is exactly the place for that!
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Take a seat and copy paste the "dummy.py" files, they present the basic structure you need to play around.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Just be cautious to use the `debug` method if you're the kind of miss that debugs by outputing data structures (who does not, yah know, sometimes?). Or you'll break the chain.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Generators 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					They must send list of points to standard out. Don't forget the "flush" argument, or the piping will be breaking, ain't no Mario lazering.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					* dummy.py : sends always the same list of points. The Monomaniac.
 | 
				
			||||||
 | 
					* @todo : read texts from redis and others
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Filters
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					These do listen and read on STDIN and do the same print'n'flush on STDOUT.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					* kaleidoscope.py : mirrors the points based on a pivot
 | 
				
			||||||
 | 
					* @todo : fourier analysis and other realtime reaction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Export
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Read from STDIN and send to redis mostly
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					* toRedis.py : provide a key, server IP, etc.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Common parameters
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Every command can be called with a `-h/--help` flag to get some help
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Every command has a `-v/--verbose` flag to send debug info to STDERR. 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Generators have a `-f/--fps` param for FPS, to be fast but not so furious on your machine
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Filters and Exports are their own beasts
 | 
				
			||||||
							
								
								
									
										55
									
								
								clitools/exports/toRedis.py
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										55
									
								
								clitools/exports/toRedis.py
									
									
									
									
									
										Executable file
									
								
							@ -0,0 +1,55 @@
 | 
				
			|||||||
 | 
					#!/usr/bin/python3
 | 
				
			||||||
 | 
					# -*- coding: utf-8 -*-
 | 
				
			||||||
 | 
					# -*- mode: Python -*-
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					'''
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					redis exporter
 | 
				
			||||||
 | 
					v0.1.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					A basic exporter 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					LICENCE : CC
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					by cocoa 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					'''
 | 
				
			||||||
 | 
					from __future__ import print_function
 | 
				
			||||||
 | 
					import sys
 | 
				
			||||||
 | 
					import os
 | 
				
			||||||
 | 
					import argparse
 | 
				
			||||||
 | 
					import redis
 | 
				
			||||||
 | 
					import time 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					argsparser = argparse.ArgumentParser(description="Redis exporter LJ")
 | 
				
			||||||
 | 
					argsparser.add_argument("-i","--ip",help="IP address of the Redis server ",default="127.0.0.1",type=str)
 | 
				
			||||||
 | 
					argsparser.add_argument("-p","--port",help="Port of the Redis server ",default="6379",type=str)
 | 
				
			||||||
 | 
					argsparser.add_argument("-k","--key",help="Redis key to update",default="0",type=int)
 | 
				
			||||||
 | 
					argsparser.add_argument("-v","--verbose",action="store_true",help="Verbose")
 | 
				
			||||||
 | 
					args = argsparser.parse_args()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ip = args.ip
 | 
				
			||||||
 | 
					port = args.port
 | 
				
			||||||
 | 
					key = args.key
 | 
				
			||||||
 | 
					verbose=args.verbose
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def debug(*args, **kwargs):
 | 
				
			||||||
 | 
					    if( verbose == False ):
 | 
				
			||||||
 | 
					        return
 | 
				
			||||||
 | 
					    print(*args, file=sys.stderr, **kwargs)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					r=redis.StrictRedis(host=ip, port=port, db=0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					try:
 | 
				
			||||||
 | 
					    while True:
 | 
				
			||||||
 | 
					      line = sys.stdin.readline()
 | 
				
			||||||
 | 
					      if line == "":
 | 
				
			||||||
 | 
					         time.sleep(0.01)
 | 
				
			||||||
 | 
					      line = line.rstrip('\n')
 | 
				
			||||||
 | 
					      if r.set(key,line)==True:
 | 
				
			||||||
 | 
					          debug("exports::redis set("+str(key)+") to "+line)
 | 
				
			||||||
 | 
					except EOFError:
 | 
				
			||||||
 | 
					    debug("break")# no more information
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										161
									
								
								clitools/filters/kaleidoscope.py
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										161
									
								
								clitools/filters/kaleidoscope.py
									
									
									
									
									
										Executable file
									
								
							@ -0,0 +1,161 @@
 | 
				
			|||||||
 | 
					#!/usr/bin/python3
 | 
				
			||||||
 | 
					# -*- coding: utf-8 -*-
 | 
				
			||||||
 | 
					# -*- mode: Python -*-
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					'''
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					kaleidoscop
 | 
				
			||||||
 | 
					v0.1.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					A simple effect : mirror a quadrant of the input
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					LICENCE : CC
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					by Sam Neurohack
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					'''
 | 
				
			||||||
 | 
					from __future__ import print_function
 | 
				
			||||||
 | 
					import sys
 | 
				
			||||||
 | 
					import ast
 | 
				
			||||||
 | 
					import os
 | 
				
			||||||
 | 
					import argparse
 | 
				
			||||||
 | 
					ljpath = r'%s' % os.getcwd().replace('\\','/')
 | 
				
			||||||
 | 
					sys.path.append(ljpath +'/../libs/')
 | 
				
			||||||
 | 
					sys.path.append(ljpath +'/libs/')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import time 
 | 
				
			||||||
 | 
					name = "filters::kaleidoscope"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					argsparser = argparse.ArgumentParser(description="Redis exporter LJ")
 | 
				
			||||||
 | 
					argsparser.add_argument("-x","--centerX",help="geometrical center X position",default=300,type=int)
 | 
				
			||||||
 | 
					argsparser.add_argument("-y","--centerY",help="geometrical center Y position",default=300,type=int)
 | 
				
			||||||
 | 
					argsparser.add_argument("-f","--fps",help="Frame Per Second",default=30,type=int)
 | 
				
			||||||
 | 
					argsparser.add_argument("-v","--verbose",action="store_true",help="Verbose")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					args    = argsparser.parse_args()
 | 
				
			||||||
 | 
					fps     = args.fps
 | 
				
			||||||
 | 
					centerX = args.centerX
 | 
				
			||||||
 | 
					centerY = args.centerY
 | 
				
			||||||
 | 
					verbose = args.verbose
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					optimal_looptime = 1 / fps
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def debug(*args, **kwargs):
 | 
				
			||||||
 | 
					    if( verbose == False ):
 | 
				
			||||||
 | 
					        return
 | 
				
			||||||
 | 
					    print(*args, file=sys.stderr, **kwargs)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def kaleidoscope( pl ):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # Stage 1: Crop points in single quadrant
 | 
				
			||||||
 | 
					    quad1 = []
 | 
				
			||||||
 | 
					    # Iterate trough the segments 
 | 
				
			||||||
 | 
					    for i in range( 0, len(pl) - 1 ):
 | 
				
			||||||
 | 
					        #debug(name+" point #", i)
 | 
				
			||||||
 | 
					        currentpoint = cp = pl[i]
 | 
				
			||||||
 | 
					        nextpoint = pl[i+1]
 | 
				
			||||||
 | 
					        cx,cy,cc = [cp[0],cp[1],cp[2]]
 | 
				
			||||||
 | 
					        nx,ny,nc = [nextpoint[0],nextpoint[1],nextpoint[2]]
 | 
				
			||||||
 | 
					        rect=[[cx,cy],[cx,ny],[nx,ny],[nx,cy]]
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        right = wrong = 0
 | 
				
			||||||
 | 
					        #debug(name+" rect: ", rect,"curr",currentpoint,"next",nextpoint )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        # Enumerate the points in rectangle to see 
 | 
				
			||||||
 | 
					        # how many right / wrong there are to add or skip early
 | 
				
			||||||
 | 
					        #
 | 
				
			||||||
 | 
					        for iterator, p in enumerate(rect):
 | 
				
			||||||
 | 
					            if p[0] >= centerX and p[1] >= centerY:
 | 
				
			||||||
 | 
					                right += 1
 | 
				
			||||||
 | 
					            else:
 | 
				
			||||||
 | 
					                #if p[0] <= centerX and p[1] <= centerY:
 | 
				
			||||||
 | 
					                wrong += 1 
 | 
				
			||||||
 | 
					        # If all rectangle points are in the right quadrant, Add and Skip  
 | 
				
			||||||
 | 
					        if right == 4:
 | 
				
			||||||
 | 
					            quad1.append(pl[i])
 | 
				
			||||||
 | 
					            #debug(name+" found valid point", pl[i])
 | 
				
			||||||
 | 
					            continue
 | 
				
			||||||
 | 
					        # If all rectangle points in wrong quadrant, Skip
 | 
				
			||||||
 | 
					        if wrong == 4:
 | 
				
			||||||
 | 
					            #debug(name+" found bad point", pl[i])
 | 
				
			||||||
 | 
					            continue
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        # Find the (x,y) intersections
 | 
				
			||||||
 | 
					        # 
 | 
				
			||||||
 | 
					        #debug(name+" Looking for crossing point between ("+str(cx)+","+str(cy)+") and ("+str(nx)+","+str(ny)+")") 
 | 
				
			||||||
 | 
					        delta=[ nx - cx, ny - cy ]
 | 
				
			||||||
 | 
					        #debug(name+" delta:",delta)
 | 
				
			||||||
 | 
					        crossX = None
 | 
				
			||||||
 | 
					        crossY = None
 | 
				
			||||||
 | 
					        absnewX = 0
 | 
				
			||||||
 | 
					        absnewY = 0
 | 
				
			||||||
 | 
					        # If one point has negative x, search y axis crossing
 | 
				
			||||||
 | 
					        if cx < centerX or nx < centerX:
 | 
				
			||||||
 | 
					            if delta[0] == 0 :
 | 
				
			||||||
 | 
					                delta[0] = 0.0000001
 | 
				
			||||||
 | 
					            v=[ delta[0]/abs(delta[0]), delta[1]/abs(delta[0]) ]
 | 
				
			||||||
 | 
					            absnewX = abs( centerX - cx )
 | 
				
			||||||
 | 
					            #print("on y axis, v=",str(v)," and absnewX=",str(absnewX))
 | 
				
			||||||
 | 
					            crossX = [( absnewX*v[0] + cx ),( absnewX*v[1]+cy ), nc]
 | 
				
			||||||
 | 
					        # If one point has negative y, search x axis crossing
 | 
				
			||||||
 | 
					        if cy < centerY or ny < centerY:
 | 
				
			||||||
 | 
					            if delta[1] == 0 :
 | 
				
			||||||
 | 
					                delta[1] = 0.0000001
 | 
				
			||||||
 | 
					            v=[ delta[0]/abs(delta[1]), delta[1]/abs(delta[1])]
 | 
				
			||||||
 | 
					            absnewY = abs( centerY - cy )
 | 
				
			||||||
 | 
					            #print("on x axis, v=",str(v)," and absnewY=",str(absnewY))
 | 
				
			||||||
 | 
					            crossY = [( absnewY*v[0] + cy ),( absnewY*v[1]+cy ), nc]
 | 
				
			||||||
 | 
					        # Inject in order
 | 
				
			||||||
 | 
					        # If current is valid, Add 
 | 
				
			||||||
 | 
					        if cx >= centerX and cy >= centerY :
 | 
				
			||||||
 | 
					            quad1.append( currentpoint )
 | 
				
			||||||
 | 
					        # If absnewX smaller, it is closest to currentPoint
 | 
				
			||||||
 | 
					        if absnewX < absnewY:
 | 
				
			||||||
 | 
					            if None != crossX : quad1.append( crossX )
 | 
				
			||||||
 | 
					            if None != crossY : quad1.append( crossY )
 | 
				
			||||||
 | 
					        else : 
 | 
				
			||||||
 | 
					            if None != crossY : quad1.append( crossY ) 
 | 
				
			||||||
 | 
					            if None != crossX : quad1.append( crossX )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ## Stage 2 : Mirror points
 | 
				
			||||||
 | 
					    #
 | 
				
			||||||
 | 
					    quad2 = []
 | 
				
			||||||
 | 
					    # quad2 = vertical symetric of quad1 
 | 
				
			||||||
 | 
					    for iterator in range( len(quad1) -1 , -1, -1):
 | 
				
			||||||
 | 
					        point = quad1[iterator]
 | 
				
			||||||
 | 
					        quad2.append([ point[0], 2*centerY - point[1], point[2] ])
 | 
				
			||||||
 | 
					    # quad3 is the merge of 1 and 2
 | 
				
			||||||
 | 
					    quad3 = quad1 + quad2
 | 
				
			||||||
 | 
					    # quad4 is the horizontal symetric of quad3
 | 
				
			||||||
 | 
					    quad4 = []
 | 
				
			||||||
 | 
					    for iterator in range( len(quad3) -1, -1, -1):
 | 
				
			||||||
 | 
					        point = quad3[iterator]
 | 
				
			||||||
 | 
					        quad4.append([ 2*centerX - point[0], point[1], point[2] ])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    #debug(name+" quad1:",quad1)
 | 
				
			||||||
 | 
					    #debug(name+" quad2:", quad2 )
 | 
				
			||||||
 | 
					    debug(name+" quad3:", quad3 )
 | 
				
			||||||
 | 
					    debug(name+" quad4:", quad4 )
 | 
				
			||||||
 | 
					    return quad3+quad4
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					try:
 | 
				
			||||||
 | 
					    while True:
 | 
				
			||||||
 | 
					      start = time.time()
 | 
				
			||||||
 | 
					      line = sys.stdin.readline()
 | 
				
			||||||
 | 
					      if line == "":
 | 
				
			||||||
 | 
					         time.sleep(0.01)
 | 
				
			||||||
 | 
					      line = line.rstrip('\n')
 | 
				
			||||||
 | 
					      pointsList = ast.literal_eval(line)
 | 
				
			||||||
 | 
					      # Do the filter
 | 
				
			||||||
 | 
					      result = kaleidoscope( pointsList ) 
 | 
				
			||||||
 | 
					      print( result, flush=True )
 | 
				
			||||||
 | 
					      looptime = time.time() - start
 | 
				
			||||||
 | 
					      # debug(name+" looptime:"+str(looptime))
 | 
				
			||||||
 | 
					      if( looptime < optimal_looptime ):
 | 
				
			||||||
 | 
					        time.sleep( optimal_looptime - looptime)
 | 
				
			||||||
 | 
					        # debug(name+" micro sleep:"+str( optimal_looptime - looptime))
 | 
				
			||||||
 | 
					except EOFError:
 | 
				
			||||||
 | 
					    debug(name+" break")# no more information
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										51
									
								
								clitools/generators/dummy.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										51
									
								
								clitools/generators/dummy.py
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,51 @@
 | 
				
			|||||||
 | 
					#!/usr/bin/python3
 | 
				
			||||||
 | 
					# -*- coding: utf-8 -*-
 | 
				
			||||||
 | 
					# -*- mode: Python -*-
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					'''
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					This is the most basic generator you can imagine: straight up static!
 | 
				
			||||||
 | 
					v0.1.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Use it to test your filters and outputs
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					LICENCE : CC
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					by cocoa 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					'''
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					from __future__ import print_function
 | 
				
			||||||
 | 
					import time
 | 
				
			||||||
 | 
					import argparse
 | 
				
			||||||
 | 
					import sys
 | 
				
			||||||
 | 
					name="generator::dummy"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def debug(*args, **kwargs):
 | 
				
			||||||
 | 
					    if( verbose == False ):
 | 
				
			||||||
 | 
					        return
 | 
				
			||||||
 | 
					    print(*args, file=sys.stderr, **kwargs)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					argsparser = argparse.ArgumentParser(description="Dummy generator")
 | 
				
			||||||
 | 
					argsparser.add_argument("-f","--fps",help="Frame Per Second",default=30,type=int)
 | 
				
			||||||
 | 
					argsparser.add_argument("-v","--verbose",action="store_true",help="Verbose output")
 | 
				
			||||||
 | 
					args = argsparser.parse_args()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					fps=args.fps
 | 
				
			||||||
 | 
					verbose=args.verbose
 | 
				
			||||||
 | 
					optimal_looptime = 1 / fps
 | 
				
			||||||
 | 
					debug(name+" optimal looptime "+str(optimal_looptime))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					while True:
 | 
				
			||||||
 | 
					  start = time.time()
 | 
				
			||||||
 | 
					  #print("[(100.0, 100.0, 65280), (100.0, 500.0, 65280), (500.0, 500.0, 65280), (500.0, 100.0, 65280), (100.0, 100.0, 65280)]", flush=True);
 | 
				
			||||||
 | 
					  print("[(100.0, 100.0, 65280), (110.0, 500.0, 65280), (510.0, 500.0, 65280), (510.0, 100.0, 65280), (100.0, 110.0, 65280)]", flush=True);
 | 
				
			||||||
 | 
					  looptime = time.time() - start
 | 
				
			||||||
 | 
					  if( looptime < optimal_looptime ):
 | 
				
			||||||
 | 
					    time.sleep( optimal_looptime - looptime)
 | 
				
			||||||
 | 
					    debug(name+" micro sleep:"+str( optimal_looptime - looptime))
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										182
									
								
								clitools/generators/example.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										182
									
								
								clitools/generators/example.py
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,182 @@
 | 
				
			|||||||
 | 
					#!/usr/bin/python3
 | 
				
			||||||
 | 
					# -*- coding: utf-8 -*-
 | 
				
			||||||
 | 
					# -*- mode: Python -*-
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					'''
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					example, based on custom
 | 
				
			||||||
 | 
					v0.1.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					A copy of square.py you can modify to code your plugin.
 | 
				
			||||||
 | 
					custom1 has necessary hooks in LJ.conf, webui and so on.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					LICENCE : CC
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					by Sam Neurohack
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					'''
 | 
				
			||||||
 | 
					import sys
 | 
				
			||||||
 | 
					import os
 | 
				
			||||||
 | 
					ljpath = r'%s' % os.getcwd().replace('\\','/')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# import from shell
 | 
				
			||||||
 | 
					sys.path.append(ljpath +'/../../libs/')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#import from LJ
 | 
				
			||||||
 | 
					sys.path.append(ljpath +'/libs/')
 | 
				
			||||||
 | 
					print(ljpath+'/../libs/')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import lj23layers as lj
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					sys.path.append('../libs')
 | 
				
			||||||
 | 
					import math
 | 
				
			||||||
 | 
					import time
 | 
				
			||||||
 | 
					import argparse
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					print ("")
 | 
				
			||||||
 | 
					print ("Arguments parsing if needed...")
 | 
				
			||||||
 | 
					argsparser = argparse.ArgumentParser(description="Custom1 example for LJ")
 | 
				
			||||||
 | 
					argsparser.add_argument("-v","--verbose",help="Verbosity level (0 by default)",default=0,type=int)
 | 
				
			||||||
 | 
					args = argsparser.parse_args()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Useful variables init.
 | 
				
			||||||
 | 
					white = lj.rgb2int(255,255,255)
 | 
				
			||||||
 | 
					red = lj.rgb2int(255,0,0)
 | 
				
			||||||
 | 
					blue = lj.rgb2int(0,0,255)
 | 
				
			||||||
 | 
					green = lj.rgb2int(0,255,0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					width = 800
 | 
				
			||||||
 | 
					height = 600
 | 
				
			||||||
 | 
					centerX = width / 2
 | 
				
			||||||
 | 
					centerY = height / 2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# 3D to 2D projection parameters
 | 
				
			||||||
 | 
					fov = 256
 | 
				
			||||||
 | 
					viewer_distance = 2.2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Anaglyph computation parameters for right and left eyes.
 | 
				
			||||||
 | 
					# algorythm come from anaglyph geo maps 
 | 
				
			||||||
 | 
					eye_spacing = 100
 | 
				
			||||||
 | 
					nadir = 0.5
 | 
				
			||||||
 | 
					observer_altitude = 30000
 | 
				
			||||||
 | 
					map_layerane_altitude = 0.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# square coordinates : vertices that compose each of the square.
 | 
				
			||||||
 | 
					vertices = [
 | 
				
			||||||
 | 
					        (- 1.0, 1.0,- 1.0),
 | 
				
			||||||
 | 
					        ( 1.0, 1.0,- 1.0),
 | 
				
			||||||
 | 
					        ( 1.0,- 1.0,- 1.0),
 | 
				
			||||||
 | 
					        (- 1.0,- 1.0,- 1.0)
 | 
				
			||||||
 | 
					        ]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					face = [0,1,2,3]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# LJ inits
 | 
				
			||||||
 | 
					# 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					layer = 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Define properties for each drawn "element" : name, intensity, active, xy, color, red, green, blue, layer , closed
 | 
				
			||||||
 | 
					Leftsquare = lj.FixedObject('Leftsquare', True, 255, [], red, 255, 0, 0, layer , True)
 | 
				
			||||||
 | 
					Rightsquare = lj.FixedObject('Rightsquare', True, 255, [], green, 0, 255, 0, layer , True)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# 'Destination' for given layer : name, number, active, layer , scene, laser
 | 
				
			||||||
 | 
					Dest0 = lj.DestObject('0', 0, True, 0 , 0, 0) 	# Dest0 will send layer 0 points to scene 0, laser 0 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# Anaglyph computation : different X coordinate for each eye
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def LeftShift(elevation):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    diff = elevation - map_layerane_altitude
 | 
				
			||||||
 | 
					                        return nadir * eye_spacing *  diff / (observer_altitude - elevation)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def RightShift(elevation):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    diff = map_layerane_altitude - elevation
 | 
				
			||||||
 | 
					                        return (1 - nadir) * eye_spacing * diff / (observer_altitude - elevation)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def Proj(x,y,z,angleX,angleY,angleZ):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    rad = angleX * math.pi / 180
 | 
				
			||||||
 | 
					                cosa = math.cos(rad)
 | 
				
			||||||
 | 
					                sina = math.sin(rad)
 | 
				
			||||||
 | 
					                y2 = y
 | 
				
			||||||
 | 
					                y = y2 * cosa - z * sina
 | 
				
			||||||
 | 
					                z = y2 * sina + z * cosa
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                rad = angleY * math.pi / 180
 | 
				
			||||||
 | 
					                cosa = math.cos(rad)
 | 
				
			||||||
 | 
					                sina = math.sin(rad)
 | 
				
			||||||
 | 
					                z2 = z
 | 
				
			||||||
 | 
					                z = z2 * cosa - x * sina
 | 
				
			||||||
 | 
					                x = z2 * sina + x * cosa
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                rad = angleZ * math.pi / 180
 | 
				
			||||||
 | 
					                cosa = math.cos(rad)
 | 
				
			||||||
 | 
					                sina = math.sin(rad)
 | 
				
			||||||
 | 
					                x2 = x
 | 
				
			||||||
 | 
					                x = x2 * cosa - y * sina
 | 
				
			||||||
 | 
					                y = x2 * sina + y * cosa
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                """ Transforms this 3D point to 2D using a perspective projection. """
 | 
				
			||||||
 | 
					                factor = fov / (viewer_distance + z)
 | 
				
			||||||
 | 
					                x = x * factor + centerX
 | 
				
			||||||
 | 
					                y = - y * factor + centerY
 | 
				
			||||||
 | 
					                return (x,y)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# Main 
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def Run():
 | 
				
			||||||
 | 
					    Left = []
 | 
				
			||||||
 | 
					    Right = []
 | 
				
			||||||
 | 
					    counter =0
 | 
				
			||||||
 | 
					    try:
 | 
				
			||||||
 | 
					      while True: 
 | 
				
			||||||
 | 
					        Left = []
 | 
				
			||||||
 | 
					        Right = []
 | 
				
			||||||
 | 
					        x = vertices[0][0]
 | 
				
			||||||
 | 
					        y = vertices[0][1]
 | 
				
			||||||
 | 
					        z = vertices[0][2]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        # lj tracers will "move" the laser to this first point in black, then move to the next with second point color.
 | 
				
			||||||
 | 
					        # for more accuracy in dac emulator, repeat this first point.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        # generate all points in square.
 | 
				
			||||||
 | 
					        for point in face:
 | 
				
			||||||
 | 
					            x = vertices[point][0]
 | 
				
			||||||
 | 
					                y = vertices[point][1]
 | 
				
			||||||
 | 
					                z = vertices[point][2]
 | 
				
			||||||
 | 
					                left.append(proj(x+leftshift(z*25),y,z,0,counter,0))
 | 
				
			||||||
 | 
					                right.append(proj(x+rightshift(z*25),y,z,0,counter,0))	
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        lj.polylineonecolor(left, c = leftsquare.color , layer = leftsquare.layer, closed = leftsquare.closed)
 | 
				
			||||||
 | 
					        lj.polylineonecolor(right, c = rightsquare.color , layer = rightsquare.layer, closed = rightsquare.closed)
 | 
				
			||||||
 | 
					        lj.drawdests()
 | 
				
			||||||
 | 
					        time.sleep(0.1)
 | 
				
			||||||
 | 
					        counter += 1
 | 
				
			||||||
 | 
					        if counter > 360:
 | 
				
			||||||
 | 
					            counter = 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    except KeyboardInterrupt:
 | 
				
			||||||
 | 
					        pass
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # Gently stop on CTRL C
 | 
				
			||||||
 | 
					    finally:
 | 
				
			||||||
 | 
					        lj.ClosePlugin()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Run()
 | 
				
			||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user