annotate tools/generate_poly.py @ 443:fffb9becf608

Shape generator.
author Simon Cross <hodgestar@gmail.com>
date Sat, 07 Sep 2013 14:42:21 +0200
parents
children 79ba44e04b57
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")
fffb9becf608 Shape generator.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
17 opts, args = parser.parse_args(args)
fffb9becf608 Shape generator.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
18 args = args[1:]
fffb9becf608 Shape generator.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
19
fffb9becf608 Shape generator.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
20 if not args:
fffb9becf608 Shape generator.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
21 parser.print_help()
fffb9becf608 Shape generator.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
22 return None, {}, opts
fffb9becf608 Shape generator.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
23
fffb9becf608 Shape generator.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
24 obj_type = args[0]
fffb9becf608 Shape generator.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
25 params = parse_params(args[1:])
fffb9becf608 Shape generator.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
26 return obj_type, params, opts
fffb9becf608 Shape generator.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
27
fffb9becf608 Shape generator.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
28
fffb9becf608 Shape generator.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
29 class PolyGenerator(object):
fffb9becf608 Shape generator.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
30 def generate(self, obj_type, params, opts):
fffb9becf608 Shape generator.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
31 handler = getattr(self, 'generate_%s' % (obj_type,),
fffb9becf608 Shape generator.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
32 self.unknown_type)
fffb9becf608 Shape generator.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
33 return handler(params, opts)
fffb9becf608 Shape generator.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
34
fffb9becf608 Shape generator.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
35 def print_poly(self, poly):
fffb9becf608 Shape generator.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
36 print "Poly:"
fffb9becf608 Shape generator.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
37 for point in poly:
fffb9becf608 Shape generator.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
38 print " - [%d, %d]" % tuple(point)
fffb9becf608 Shape generator.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
39
fffb9becf608 Shape generator.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
40 def unknown_type(self, params, opts):
fffb9becf608 Shape generator.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
41 prefix = "generate_"
fffb9becf608 Shape generator.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
42 known_types = [k[len(prefix):] for k in self.__dict__
fffb9becf608 Shape generator.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
43 if k.startswith(prefix)]
fffb9becf608 Shape generator.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
44 raise ValueError("Unknown object type. Known types: %s" %
fffb9becf608 Shape generator.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
45 ",".join(known_types))
fffb9becf608 Shape generator.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
46
fffb9becf608 Shape generator.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
47 def check_params(self, params, *sigs):
fffb9becf608 Shape generator.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
48 results = []
fffb9becf608 Shape generator.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
49 for name, parser in sigs:
fffb9becf608 Shape generator.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
50 value = params.get(name)
fffb9becf608 Shape generator.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
51 try:
fffb9becf608 Shape generator.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
52 result = parser(value)
fffb9becf608 Shape generator.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
53 except:
fffb9becf608 Shape generator.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
54 raise ValueError(
fffb9becf608 Shape generator.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
55 "Failed to parse param %s with value %s (parser: %r)"
fffb9becf608 Shape generator.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
56 % (name, value, parser))
fffb9becf608 Shape generator.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
57 results.append(result)
fffb9becf608 Shape generator.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
58 return results
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 generate_circle(self, params, opts):
fffb9becf608 Shape generator.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
61 r, steps = self.check_params(params, ("r", int), ("steps", int))
fffb9becf608 Shape generator.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
62 poly = []
fffb9becf608 Shape generator.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
63 rad, step_size = 0, 2 * math.pi / steps
fffb9becf608 Shape generator.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
64 for p in range(steps + 1):
fffb9becf608 Shape generator.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
65 x, y = r * math.sin(rad), r * math.cos(rad)
fffb9becf608 Shape generator.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
66 poly.append([x, y])
fffb9becf608 Shape generator.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
67 rad += step_size
fffb9becf608 Shape generator.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
68 return poly
fffb9becf608 Shape generator.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
69
fffb9becf608 Shape generator.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
70
fffb9becf608 Shape generator.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
71 if __name__ == "__main__":
fffb9becf608 Shape generator.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
72 obj_type, params, opts = parse_args(sys.argv)
fffb9becf608 Shape generator.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
73 if obj_type is not None:
fffb9becf608 Shape generator.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
74 p = PolyGenerator()
fffb9becf608 Shape generator.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
75 poly = p.generate(obj_type, params, opts)
fffb9becf608 Shape generator.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
76 p.print_poly(poly)