annotate tools/generate_poly.py @ 543:80264aee0af2

Remove debugging print
author Neil Muller <drnlmuller@gmail.com>
date Sat, 07 Sep 2013 21:11:19 +0200
parents 79ba44e04b57
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
443
fffb9becf608 Shape generator.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
1 import optparse
fffb9becf608 Shape generator.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
2 import sys
fffb9becf608 Shape generator.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
3 import math
fffb9becf608 Shape generator.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
4
fffb9becf608 Shape generator.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
5
fffb9becf608 Shape generator.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
6 def parse_params(args):
fffb9becf608 Shape generator.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
7 params = {}
fffb9becf608 Shape generator.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
8 for arg in args:
fffb9becf608 Shape generator.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
9 key, _, value = arg.partition("=")
fffb9becf608 Shape generator.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
10 params[key] = value
fffb9becf608 Shape generator.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
11 return params
fffb9becf608 Shape generator.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
12
fffb9becf608 Shape generator.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
13
fffb9becf608 Shape generator.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
14 def parse_args(args):
fffb9becf608 Shape generator.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
15 """Parse arguments."""
fffb9becf608 Shape generator.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
16 parser = optparse.OptionParser(usage="%prog <type> arg1=foo arg2=bar")
445
79ba44e04b57 Add offset support.
Simon Cross <hodgestar@gmail.com>
parents: 443
diff changeset
17
79ba44e04b57 Add offset support.
Simon Cross <hodgestar@gmail.com>
parents: 443
diff changeset
18 parser.add_option('-x',
79ba44e04b57 Add offset support.
Simon Cross <hodgestar@gmail.com>
parents: 443
diff changeset
19 dest='offset_x', type=int, default=0,
79ba44e04b57 Add offset support.
Simon Cross <hodgestar@gmail.com>
parents: 443
diff changeset
20 help='X offset for poly.')
79ba44e04b57 Add offset support.
Simon Cross <hodgestar@gmail.com>
parents: 443
diff changeset
21
79ba44e04b57 Add offset support.
Simon Cross <hodgestar@gmail.com>
parents: 443
diff changeset
22 parser.add_option('-y',
79ba44e04b57 Add offset support.
Simon Cross <hodgestar@gmail.com>
parents: 443
diff changeset
23 dest='offset_y', type=int, default=0,
79ba44e04b57 Add offset support.
Simon Cross <hodgestar@gmail.com>
parents: 443
diff changeset
24 help='Y offset for poly.')
79ba44e04b57 Add offset support.
Simon Cross <hodgestar@gmail.com>
parents: 443
diff changeset
25
443
fffb9becf608 Shape generator.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
26 opts, args = parser.parse_args(args)
fffb9becf608 Shape generator.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
27 args = args[1:]
fffb9becf608 Shape generator.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
28
fffb9becf608 Shape generator.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
29 if not args:
fffb9becf608 Shape generator.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
30 parser.print_help()
fffb9becf608 Shape generator.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
31 return None, {}, opts
fffb9becf608 Shape generator.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
32
fffb9becf608 Shape generator.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
33 obj_type = args[0]
fffb9becf608 Shape generator.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
34 params = parse_params(args[1:])
fffb9becf608 Shape generator.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
35 return obj_type, params, opts
fffb9becf608 Shape generator.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
36
fffb9becf608 Shape generator.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
37
fffb9becf608 Shape generator.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
38 class PolyGenerator(object):
445
79ba44e04b57 Add offset support.
Simon Cross <hodgestar@gmail.com>
parents: 443
diff changeset
39 def __init__(self, opts):
79ba44e04b57 Add offset support.
Simon Cross <hodgestar@gmail.com>
parents: 443
diff changeset
40 self.offset_x = opts.offset_x
79ba44e04b57 Add offset support.
Simon Cross <hodgestar@gmail.com>
parents: 443
diff changeset
41 self.offset_y = opts.offset_y
79ba44e04b57 Add offset support.
Simon Cross <hodgestar@gmail.com>
parents: 443
diff changeset
42
79ba44e04b57 Add offset support.
Simon Cross <hodgestar@gmail.com>
parents: 443
diff changeset
43 def generate(self, obj_type, params):
443
fffb9becf608 Shape generator.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
44 handler = getattr(self, 'generate_%s' % (obj_type,),
fffb9becf608 Shape generator.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
45 self.unknown_type)
445
79ba44e04b57 Add offset support.
Simon Cross <hodgestar@gmail.com>
parents: 443
diff changeset
46 return handler(params)
443
fffb9becf608 Shape generator.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
47
fffb9becf608 Shape generator.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
48 def print_poly(self, poly):
fffb9becf608 Shape generator.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
49 print "Poly:"
fffb9becf608 Shape generator.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
50 for point in poly:
fffb9becf608 Shape generator.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
51 print " - [%d, %d]" % tuple(point)
fffb9becf608 Shape generator.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
52
445
79ba44e04b57 Add offset support.
Simon Cross <hodgestar@gmail.com>
parents: 443
diff changeset
53 def unknown_type(self, params):
443
fffb9becf608 Shape generator.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
54 prefix = "generate_"
fffb9becf608 Shape generator.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
55 known_types = [k[len(prefix):] for k in self.__dict__
fffb9becf608 Shape generator.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
56 if k.startswith(prefix)]
fffb9becf608 Shape generator.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
57 raise ValueError("Unknown object type. Known types: %s" %
fffb9becf608 Shape generator.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
58 ",".join(known_types))
fffb9becf608 Shape generator.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
59
fffb9becf608 Shape generator.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
60 def check_params(self, params, *sigs):
fffb9becf608 Shape generator.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
61 results = []
fffb9becf608 Shape generator.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
62 for name, parser in sigs:
fffb9becf608 Shape generator.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
63 value = params.get(name)
fffb9becf608 Shape generator.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
64 try:
fffb9becf608 Shape generator.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
65 result = parser(value)
fffb9becf608 Shape generator.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
66 except:
fffb9becf608 Shape generator.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
67 raise ValueError(
fffb9becf608 Shape generator.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
68 "Failed to parse param %s with value %s (parser: %r)"
fffb9becf608 Shape generator.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
69 % (name, value, parser))
fffb9becf608 Shape generator.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
70 results.append(result)
fffb9becf608 Shape generator.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
71 return results
fffb9becf608 Shape generator.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
72
445
79ba44e04b57 Add offset support.
Simon Cross <hodgestar@gmail.com>
parents: 443
diff changeset
73 def apply_opts(self, poly):
79ba44e04b57 Add offset support.
Simon Cross <hodgestar@gmail.com>
parents: 443
diff changeset
74 new_poly = []
79ba44e04b57 Add offset support.
Simon Cross <hodgestar@gmail.com>
parents: 443
diff changeset
75 for p in poly:
79ba44e04b57 Add offset support.
Simon Cross <hodgestar@gmail.com>
parents: 443
diff changeset
76 x = p[0] + self.offset_x
79ba44e04b57 Add offset support.
Simon Cross <hodgestar@gmail.com>
parents: 443
diff changeset
77 y = p[1] + self.offset_y
79ba44e04b57 Add offset support.
Simon Cross <hodgestar@gmail.com>
parents: 443
diff changeset
78 new_poly.append([x, y])
79ba44e04b57 Add offset support.
Simon Cross <hodgestar@gmail.com>
parents: 443
diff changeset
79 return new_poly
79ba44e04b57 Add offset support.
Simon Cross <hodgestar@gmail.com>
parents: 443
diff changeset
80
79ba44e04b57 Add offset support.
Simon Cross <hodgestar@gmail.com>
parents: 443
diff changeset
81 def generate_circle(self, params):
443
fffb9becf608 Shape generator.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
82 r, steps = self.check_params(params, ("r", int), ("steps", int))
fffb9becf608 Shape generator.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
83 poly = []
fffb9becf608 Shape generator.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
84 rad, step_size = 0, 2 * math.pi / steps
fffb9becf608 Shape generator.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
85 for p in range(steps + 1):
fffb9becf608 Shape generator.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
86 x, y = r * math.sin(rad), r * math.cos(rad)
fffb9becf608 Shape generator.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
87 poly.append([x, y])
fffb9becf608 Shape generator.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
88 rad += step_size
445
79ba44e04b57 Add offset support.
Simon Cross <hodgestar@gmail.com>
parents: 443
diff changeset
89 return self.apply_opts(poly)
443
fffb9becf608 Shape generator.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
90
fffb9becf608 Shape generator.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
91
fffb9becf608 Shape generator.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
92 if __name__ == "__main__":
fffb9becf608 Shape generator.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
93 obj_type, params, opts = parse_args(sys.argv)
fffb9becf608 Shape generator.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
94 if obj_type is not None:
445
79ba44e04b57 Add offset support.
Simon Cross <hodgestar@gmail.com>
parents: 443
diff changeset
95 p = PolyGenerator(opts)
79ba44e04b57 Add offset support.
Simon Cross <hodgestar@gmail.com>
parents: 443
diff changeset
96 poly = p.generate(obj_type, params)
443
fffb9becf608 Shape generator.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
97 p.print_poly(poly)