   
from OCC.BRep import BRep_Builder
from OCC.BRepBuilderAPI import *
from OCC.TopoDS import *
from OCC.gp import gp_Pnt
from OCC.BRep import *
from OCC.Utils import *
from OCC.GeomAdaptor import *
from OCC.GCPnts import *
from OCC.TopExp import *
import random
import os


brepbuilder = BRep_Builder()

def mem(size="rss"):
    """Generalization; memory sizes: rss, rsz, vsz."""
    return int(os.popen('ps -p %d -o %s | tail -1' %
                        (os.getpid(), size)).read())
 
def rss():
    """Return ps -o rss (resident) memory in kB."""
    return float(mem("rss"))/1024

discretizer = GCPnts_UniformDeflection()
def curve_discretizer(gcurve,first,last):
        if gcurve.IsNull():
            print "Null shape given."
            return
        curve_adaptor = GeomAdaptor_Curve(gcurve)
        deflection = 0.05 
        discretizer.Initialize(curve_adaptor,deflection,first,last)
        #assert(discretizer.IsDone())
        #assert(discretizer.NbPoints()>0)
        result = discretizer.NbPoints()
        #return gcurve.GetObject()
        curve_object = gcurve.GetObject()
        points = [0.]*3*result
        #print 'writing to numpy array'
        for i in range(1,result+1):
            p = gp_Pnt(curve_object.Value(discretizer.Parameter(i)))
            points[(i-1)*3] = p.X()
            points[(i-1)*3+1] = p.Y()
            points[(i-1)*3+2] = p.Z()
            
        return points
        
def make_poly(i):
    print 'running number',i
    verts = []
    xsize = int(random.uniform(0,100))
    ysize = int(random.uniform(0,100))
    
    print 'creating points',xsize,'x',ysize
    for x in xrange(xsize):
        for y in xrange(ysize):
            v = TopoDS_Vertex()
            brepbuilder.MakeVertex(v,gp_Pnt(x,y,0.),1e-7)
            verts.append(v)
    poly_maker = BRepBuilderAPI_MakePolygon()
    print 'creating poly'
    for point in verts:
        poly_maker.Add(point)
    if poly_maker.IsDone():
        poly_maker.Close()
        wire = poly_maker.Wire()
        
        explorer = TopExp_Explorer()
        explorer.Init(wire,TopAbs.TopAbs_EDGE)
        while explorer.More():
            curve_data = BRep_Tool_Curve(TopoDS_edge((explorer.Current())))
            gcurve = curve_data[0]
            first = curve_data[1]
            last = curve_data[2]
            cuve_object = curve_discretizer(gcurve,first,last)
            explorer.Next()
    print 'exit function and collect garbage'

def main():
    random.seed()
    m = []
    for i in xrange(50):
        GarbageCollector.garbage.push_context()
        make_poly(i)
        #With force purge it crashes
        #GarbageCollector.garbage.force_purge()
        
        #With smart purge it leaks
        GarbageCollector.garbage.smart_purge()
        GarbageCollector.garbage.pop_context()
    


main()

#import cProfile
#p = cProfile.run('main()')
