Merge pull request #16984 from CSharperMantle:argparse-patch-1

pull/17014/head
Alexander Alekhin 5 years ago
commit 51a8885566
  1. 172
      doc/pattern_tools/gen_pattern.py

@ -16,110 +16,106 @@ python gen_pattern.py -o out.svg -r 11 -c 8 -T circles -s 20.0 -R 5.0 -u mm -w 2
-H, --help - show help -H, --help - show help
""" """
import argparse
from svgfig import * from svgfig import *
import sys
import getopt
class PatternMaker: class PatternMaker:
def __init__(self, cols,rows,output,units,square_size,radius_rate,page_width,page_height): def __init__(self, cols, rows, output, units, square_size, radius_rate, page_width, page_height):
self.cols = cols self.cols = cols
self.rows = rows self.rows = rows
self.output = output self.output = output
self.units = units self.units = units
self.square_size = square_size self.square_size = square_size
self.radius_rate = radius_rate self.radius_rate = radius_rate
self.width = page_width self.width = page_width
self.height = page_height self.height = page_height
self.g = SVG("g") # the svg group container self.g = SVG("g") # the svg group container
def makeCirclesPattern(self): def make_circles_pattern(self):
spacing = self.square_size spacing = self.square_size
r = spacing / self.radius_rate r = spacing / self.radius_rate
for x in range(1,self.cols+1): for x in range(1, self.cols + 1):
for y in range(1,self.rows+1): for y in range(1, self.rows + 1):
dot = SVG("circle", cx=x * spacing, cy=y * spacing, r=r, fill="black", stroke="none") dot = SVG("circle", cx=x * spacing, cy=y * spacing, r=r, fill="black", stroke="none")
self.g.append(dot) self.g.append(dot)
def makeACirclesPattern(self): def make_acircles_pattern(self):
spacing = self.square_size spacing = self.square_size
r = spacing / self.radius_rate r = spacing / self.radius_rate
for i in range(0,self.rows): for i in range(0, self.rows):
for j in range(0,self.cols): 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", stroke="none") dot = SVG("circle", cx=((j * 2 + i % 2) * spacing) + spacing, cy=self.height - (i * spacing + spacing),
self.g.append(dot) r=r, fill="black", stroke="none")
self.g.append(dot)
def makeCheckerboardPattern(self): def make_checkerboard_pattern(self):
spacing = self.square_size spacing = self.square_size
xspacing = (self.width - self.cols * self.square_size) / 2.0 xspacing = (self.width - self.cols * self.square_size) / 2.0
yspacing = (self.height - self.rows * self.square_size) / 2.0 yspacing = (self.height - self.rows * self.square_size) / 2.0
for x in range(0,self.cols): for x in range(0, self.cols):
for y in range(0,self.rows): for y in range(0, self.rows):
if x%2 == y%2: if x % 2 == y % 2:
square = SVG("rect", x=x * spacing + xspacing, y=y * spacing + yspacing, width=spacing, height=spacing, fill="black", stroke="none") square = SVG("rect", x=x * spacing + xspacing, y=y * spacing + yspacing, width=spacing,
self.g.append(square) height=spacing, fill="black", stroke="none")
self.g.append(square)
def save(self): 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 = canvas(self.g, width="%d%s" % (self.width, self.units), height="%d%s" % (self.height, self.units),
c.save(self.output) viewBox="0 0 %d %d" % (self.width, self.height))
c.save(self.output)
def main(): def main():
# parse command line options, TODO use argparse for better doc # parse command line options
try: parser = argparse.ArgumentParser(description="generate camera-calibration pattern", add_help=False)
opts, args = getopt.getopt(sys.argv[1:], "Ho:c:r:T:u:s:R:w:h:a:", ["help","output=","columns=","rows=", parser.add_argument("-H", "--help", help="show help", action="store_true", dest="show_help")
"type=","units=","square_size=","radius_rate=", parser.add_argument("-o", "--output", help="output file", default="out.svg", action="store", dest="output")
"page_width=","page_height=", "page_size="]) parser.add_argument("-c", "--columns", help="pattern columns", default="8", action="store", dest="columns",
except getopt.error as msg: type=int)
print(msg) parser.add_argument("-r", "--rows", help="pattern rows", default="11", action="store", dest="rows", type=int)
print("for help use --help") parser.add_argument("-T", "--type", help="type of pattern", default="circles", action="store", dest="p_type",
sys.exit(2) choices=["circles", "acircles", "checkerboard"])
output = "out.svg" parser.add_argument("-u", "--units", help="length unit", default="mm", action="store", dest="units",
columns = 8 choices=["mm", "inches", "px", "m"])
rows = 11 parser.add_argument("-s", "--square_size", help="size of squares in pattern", default="20.0", action="store",
p_type = "circles" dest="square_size", type=float)
units = "mm" parser.add_argument("-R", "--radius_rate", help="circles_radius = square_size/radius_rate", default="5.0",
square_size = 20.0 action="store", dest="radius_rate", type=float)
radius_rate = 5.0 parser.add_argument("-w", "--page_width", help="page width in units", default="216", action="store",
page_size = "A4" dest="page_width", type=int)
parser.add_argument("-h", "--page_height", help="page height in units", default="279", action="store",
dest="page_width", type=int)
parser.add_argument("-a", "--page_size", help="page size, supersedes -h -w arguments", default="A4", action="store",
dest="page_size", choices=["A0", "A1", "A2", "A3", "A4", "A5"])
args = parser.parse_args()
show_help = args.show_help
if show_help:
parser.print_help()
return
output = args.output
columns = args.columns
rows = args.rows
p_type = args.p_type
units = args.units
square_size = args.square_size
radius_rate = args.radius_rate
page_size = args.page_size
# page size dict (ISO standard, mm) for easy lookup. format - size: [width, height] # page size dict (ISO standard, mm) for easy lookup. format - size: [width, height]
page_sizes = {"A0": [840, 1188], "A1": [594, 840], "A2": [420, 594], "A3": [297, 420], "A4": [210, 297], "A5": [148, 210]} page_sizes = {"A0": [840, 1188], "A1": [594, 840], "A2": [420, 594], "A3": [297, 420], "A4": [210, 297],
"A5": [148, 210]}
page_width = page_sizes[page_size.upper()][0] page_width = page_sizes[page_size.upper()][0]
page_height = page_sizes[page_size.upper()][1] page_height = page_sizes[page_size.upper()][1]
# process options pm = PatternMaker(columns, rows, output, units, square_size, radius_rate, page_width, page_height)
for o, a in opts: # dict for easy lookup of pattern type
if o in ("-H", "--help"): mp = {"circles": pm.make_circles_pattern, "acircles": pm.make_acircles_pattern,
print(__doc__) "checkerboard": pm.make_checkerboard_pattern}
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)
elif o in ("-a", "--page_size"):
units = "mm"
page_size = a.upper()
page_width = page_sizes[page_size][0]
page_height = page_sizes[page_size][1]
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]() mp[p_type]()
#this should save pattern to output # this should save pattern to output
pm.save() pm.save()
if __name__ == "__main__": if __name__ == "__main__":
main() main()

Loading…
Cancel
Save