Mercurial > nagslang
view 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 |
line wrap: on
line source
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)