#!/usr/bin/python

import sys
from poly import *
from vector import *
from boundsexport import *
import operator
import wildcard
from optparse import OptionParser, Option, OptionValueError
from copy import copy



class BoundsOption(Option):
    def check_assignment(self,opt,val):
        if val.count(":") != 2:
            raise OptionValueError("option "+opt+": syntax is PATTERN:PATTERN:NUMBER")
        try:
            [obj,grp,valstr] = val.split(":")
            return Assignment(obj,grp,int(valstr))
        except ValueError:
            raise OptionValueError(
                "option "+opt+": last argument is not an integer")



    TYPES=Option.TYPES + ("assignment",)
    TYPE_CHECKER=copy(Option.TYPE_CHECKER)
    TYPE_CHECKER["assignment"] = check_assignment

usage = "usage: %prog [-h] [-c EPS] [-e EPS] [-x OBJFILE] [-o OUTFILE] (-p PARENT CHILD)* (-{d,t} ASGNMNT)* INFILE"
parser = OptionParser(usage, option_class=BoundsOption)
parser.add_option("-c", "--compress", action="store", type="float", dest="compress", metavar="EPS",
    help="compress bounds by dropping children that save less than EPS volume")
parser.add_option("-e", "--exactness", action="store", type="float", dest="exactness", metavar="EPS", default=1.0,
    help="subdivide until boxes are <= EPS")
parser.add_option("-o", "--outfile", action="store", type="string", dest="outfile", metavar="OUTFILE",
    help="store bounds in OUTFILE")
parser.add_option("-x", "--export", action="store", type="string", dest="exportfile", metavar="FILE",
    help="export bounds in .obj format to FILE")
parser.add_option("-d", "--domain", action="append", type="assignment", dest="domains", default=[], metavar="ASGNMNT",
    help="assigns OBJECT:GROUP the domain DOMAIN. Syntax: OBJECT:GROUP:DOMAIN")
parser.add_option("-t", "--transform", action="append", type="assignment", dest="transforms", default=[], metavar="ASGNMNT",
    help="assigns OBJECT:GROUP the transform TRANSFORM. Syntax: OBJECT:GROUP:TRANSFORM")
parser.add_option("-p", "--parent", action="append", type="int", dest="parents", nargs=2, default=[], metavar="CHILD PARENT",
    help="specifies the parent PARENT of transform CHILD")

(options, args) = parser.parse_args()
if len(args) != 1:
    parser.error("incorrect number of arguments")

print options.parents

infile = args[0]
if options.outfile:
    output = options.outfile
elif infile.endswith(".obj"):
    output = infile[:-4] + ".bounds"
else:
    output = infile + ".bounds"

soup = obj_import(infile, AssignmentList(options.transforms), AssignmentList(options.domains))
print "Generating tree."
tree = make_tree(options.exactness, 0, 0, soup)
prettyprint(tree)

#print "Max polys/box:", max_polys_in(bnds)

if options.compress and False:
    print "Compressing bounds."
    bnds, vol, preserved = compress_bounds(options.compress, bnds)
    print "Now Volume:", vol, ", preserved:", preserved,", max polys/box:", max_polys_in(bnds)

if options.exportfile:
    print "Exporting bounds to",options.exportfile
    exporter = ExportAsObj(open(options.exportfile, "w"))
    exporter.export(tree)


parents = {}
for (c,p) in options.parents:
    parents[c]=p

print "Saving bounds."
exporter = ExportAsBounds(open(output, "w"), parents)
exporter.export(tree)


