Mercurial > nagslang
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)