changeset 443:fffb9becf608

Shape generator.
author Simon Cross <hodgestar@gmail.com>
date Sat, 07 Sep 2013 14:42:21 +0200
parents 5357f04e45b3
children 547320870aed
files tools/generate_poly.py
diffstat 1 files changed, 76 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tools/generate_poly.py	Sat Sep 07 14:42:21 2013 +0200
@@ -0,0 +1,76 @@
+import optparse
+import sys
+import math
+
+
+def parse_params(args):
+    params = {}
+    for arg in args:
+        key, _, value = arg.partition("=")
+        params[key] = value
+    return params
+
+
+def parse_args(args):
+    """Parse arguments."""
+    parser = optparse.OptionParser(usage="%prog <type> arg1=foo arg2=bar")
+    opts, args = parser.parse_args(args)
+    args = args[1:]
+
+    if not args:
+        parser.print_help()
+        return None, {}, opts
+
+    obj_type = args[0]
+    params = parse_params(args[1:])
+    return obj_type, params, opts
+
+
+class PolyGenerator(object):
+    def generate(self, obj_type, params, opts):
+        handler = getattr(self, 'generate_%s' % (obj_type,),
+                          self.unknown_type)
+        return handler(params, opts)
+
+    def print_poly(self, poly):
+        print "Poly:"
+        for point in poly:
+            print "  - [%d, %d]" % tuple(point)
+
+    def unknown_type(self, params, opts):
+        prefix = "generate_"
+        known_types = [k[len(prefix):] for k in self.__dict__
+                       if k.startswith(prefix)]
+        raise ValueError("Unknown object type. Known types: %s" %
+                         ",".join(known_types))
+
+    def check_params(self, params, *sigs):
+        results = []
+        for name, parser in sigs:
+            value = params.get(name)
+            try:
+                result = parser(value)
+            except:
+                raise ValueError(
+                    "Failed to parse param %s with value %s (parser: %r)"
+                    % (name, value, parser))
+            results.append(result)
+        return results
+
+    def generate_circle(self, params, opts):
+        r, steps = self.check_params(params, ("r", int), ("steps", int))
+        poly = []
+        rad, step_size = 0, 2 * math.pi / steps
+        for p in range(steps + 1):
+            x, y = r * math.sin(rad), r * math.cos(rad)
+            poly.append([x, y])
+            rad += step_size
+        return poly
+
+
+if __name__ == "__main__":
+    obj_type, params, opts = parse_args(sys.argv)
+    if obj_type is not None:
+        p = PolyGenerator()
+        poly = p.generate(obj_type, params, opts)
+        p.print_poly(poly)