comparison 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
comparison
equal deleted inserted replaced
442:5357f04e45b3 443:fffb9becf608
1 import optparse
2 import sys
3 import math
4
5
6 def parse_params(args):
7 params = {}
8 for arg in args:
9 key, _, value = arg.partition("=")
10 params[key] = value
11 return params
12
13
14 def parse_args(args):
15 """Parse arguments."""
16 parser = optparse.OptionParser(usage="%prog <type> arg1=foo arg2=bar")
17 opts, args = parser.parse_args(args)
18 args = args[1:]
19
20 if not args:
21 parser.print_help()
22 return None, {}, opts
23
24 obj_type = args[0]
25 params = parse_params(args[1:])
26 return obj_type, params, opts
27
28
29 class PolyGenerator(object):
30 def generate(self, obj_type, params, opts):
31 handler = getattr(self, 'generate_%s' % (obj_type,),
32 self.unknown_type)
33 return handler(params, opts)
34
35 def print_poly(self, poly):
36 print "Poly:"
37 for point in poly:
38 print " - [%d, %d]" % tuple(point)
39
40 def unknown_type(self, params, opts):
41 prefix = "generate_"
42 known_types = [k[len(prefix):] for k in self.__dict__
43 if k.startswith(prefix)]
44 raise ValueError("Unknown object type. Known types: %s" %
45 ",".join(known_types))
46
47 def check_params(self, params, *sigs):
48 results = []
49 for name, parser in sigs:
50 value = params.get(name)
51 try:
52 result = parser(value)
53 except:
54 raise ValueError(
55 "Failed to parse param %s with value %s (parser: %r)"
56 % (name, value, parser))
57 results.append(result)
58 return results
59
60 def generate_circle(self, params, opts):
61 r, steps = self.check_params(params, ("r", int), ("steps", int))
62 poly = []
63 rad, step_size = 0, 2 * math.pi / steps
64 for p in range(steps + 1):
65 x, y = r * math.sin(rad), r * math.cos(rad)
66 poly.append([x, y])
67 rad += step_size
68 return poly
69
70
71 if __name__ == "__main__":
72 obj_type, params, opts = parse_args(sys.argv)
73 if obj_type is not None:
74 p = PolyGenerator()
75 poly = p.generate(obj_type, params, opts)
76 p.print_poly(poly)