116 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			116 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
	
	
| #!/usr/bin/env python
 | |
| 
 | |
| """gen_pattern.py
 | |
| Usage example:
 | |
| python gen_pattern.py -o out.svg -r 11 -c 8 -T circles -s 20.0 -R 5.0 -u mm -w 216 -h 279
 | |
| 
 | |
| -o, --output - output file (default out.svg)
 | |
| -r, --rows - pattern rows (default 11)
 | |
| -c, --columns - pattern columns (default 8)
 | |
| -T, --type - type of pattern, circles, acircles, checkerboard (default circles)
 | |
| -s, --square_size - size of squares in pattern (default 20.0)
 | |
| -R, --radius_rate - circles_radius = square_size/radius_rate (default 5.0)
 | |
| -u, --units - mm, inches, px, m (default mm)
 | |
| -w, --page_width - page width in units (default 216)
 | |
| -h, --page_height - page height in units (default 279)
 | |
| -H, --help - show help
 | |
| """
 | |
| 
 | |
| from svgfig import *
 | |
| 
 | |
| import sys
 | |
| import getopt
 | |
| 
 | |
| class PatternMaker:
 | |
|   def __init__(self, cols,rows,output,units,square_size,radius_rate,page_width,page_height):
 | |
|     self.cols = cols
 | |
|     self.rows = rows
 | |
|     self.output = output
 | |
|     self.units = units
 | |
|     self.square_size = square_size
 | |
|     self.radius_rate = radius_rate
 | |
|     self.width = page_width
 | |
|     self.height = page_height
 | |
|     self.g = SVG("g") # the svg group container
 | |
| 
 | |
|   def makeCirclesPattern(self):
 | |
|     spacing = self.square_size
 | |
|     r = spacing / self.radius_rate
 | |
|     for x in range(1,self.cols+1):
 | |
|       for y in range(1,self.rows+1):
 | |
|         dot = SVG("circle", cx=x * spacing, cy=y * spacing, r=r, fill="black")
 | |
|         self.g.append(dot)
 | |
| 
 | |
|   def makeACirclesPattern(self):
 | |
|     spacing = self.square_size
 | |
|     r = spacing / self.radius_rate
 | |
|     for i in range(0,self.rows):
 | |
|       for j in range(0,self.cols):
 | |
|         dot = SVG("circle", cx= ((j*2 + i%2)*spacing) + spacing, cy=self.height - (i * spacing + spacing), r=r, fill="black")
 | |
|         self.g.append(dot)
 | |
| 
 | |
|   def makeCheckerboardPattern(self):
 | |
|     spacing = self.square_size
 | |
|     for x in range(1,self.cols+1):
 | |
|       for y in range(1,self.rows+1):
 | |
|         if x%2 == y%2:
 | |
|           dot = SVG("rect", x=x * spacing, y=y * spacing, width=spacing, height=spacing, stroke_width="0", fill="black")
 | |
|           self.g.append(dot)
 | |
| 
 | |
|   def save(self):
 | |
|     c = canvas(self.g,width="%d%s"%(self.width,self.units),height="%d%s"%(self.height,self.units),viewBox="0 0 %d %d"%(self.width,self.height))
 | |
|     c.inkview(self.output)
 | |
| 
 | |
| 
 | |
| def main():
 | |
|     # parse command line options, TODO use argparse for better doc
 | |
|     try:
 | |
|         opts, args = getopt.getopt(sys.argv[1:], "Ho:c:r:T:u:s:R:w:h:", ["help","output=","columns=","rows=",
 | |
|                                                                       "type=","units=","square_size=","radius_rate=",
 | |
|                                                                       "page_width=","page_height="])
 | |
|     except getopt.error, msg:
 | |
|         print msg
 | |
|         print "for help use --help"
 | |
|         sys.exit(2)
 | |
|     output = "out.svg"
 | |
|     columns = 8
 | |
|     rows = 11
 | |
|     p_type = "circles"
 | |
|     units = "mm"
 | |
|     square_size = 20.0
 | |
|     radius_rate = 5.0
 | |
|     page_width = 216    #8.5 inches
 | |
|     page_height = 279   #11 inches
 | |
|     # process options
 | |
|     for o, a in opts:
 | |
|         if o in ("-H", "--help"):
 | |
|             print __doc__
 | |
|             sys.exit(0)
 | |
|         elif o in ("-r", "--rows"):
 | |
|             rows = int(a)
 | |
|         elif o in ("-c", "--columns"):
 | |
|             columns = int(a)
 | |
|         elif o in ("-o", "--output"):
 | |
|             output = a
 | |
|         elif o in ("-T", "--type"):
 | |
|             p_type = a
 | |
|         elif o in ("-u", "--units"):
 | |
|             units = a
 | |
|         elif o in ("-s", "--square_size"):
 | |
|             square_size = float(a)
 | |
|         elif o in ("-R", "--radius_rate"):
 | |
|             radius_rate = float(a)
 | |
|         elif o in ("-w", "--page_width"):
 | |
|             page_width = float(a)
 | |
|         elif o in ("-h", "--page_height"):
 | |
|             page_height = float(a)
 | |
|     pm = PatternMaker(columns,rows,output,units,square_size,radius_rate,page_width,page_height)
 | |
|     #dict for easy lookup of pattern type
 | |
|     mp = {"circles":pm.makeCirclesPattern,"acircles":pm.makeACirclesPattern,"checkerboard":pm.makeCheckerboardPattern}
 | |
|     mp[p_type]()
 | |
|     #this should save pattern to output
 | |
|     pm.save()
 | |
| 
 | |
| if __name__ == "__main__":
 | |
|     main()
 | 
