import cProfile
from os.path import join
import pstats
import sys
from time import time

from pymkcam.Cutters.CylindricalCutter import CylindricalCutter
from pymkcam.Gui.Console import ConsoleProgressBar
from pymkcam.Importers.STLImporter import ImportModel
from pymkcam.PathGenerators.DropCutter import DropCutter
from pymkcam.PathProcessors.PathAccumulator import PathAccumulator
from pymkcam.Toolpath import Bounds
from pymkcam.Toolpath.MotionGrid import get_fixed_grid
from pymkcam.Utils.locations import get_data_file_location

# Disable multi processing
from pymkcam.Utils import threading
threading.__multiprocessing = False

""" Profile PyCAM doing several operations, print out the top 10
(sorted by actual local runtime) methods.
"""

model = ImportModel(get_data_file_location(join('samples', 'pymkcam-textbox.stl')))
print model.minx, model.miny, model.maxx, model.maxy


def run_dropcutter():
    """ Run DropCutter on standard PyCAM sample plaque """
    progress_bar = ConsoleProgressBar(sys.stdout)

    overlap = .6
    layer_distance = 1
    tool = CylindricalCutter(10)
    path_generator = DropCutter(PathAccumulator())
    bounds = Bounds(Bounds.TYPE_CUSTOM,
                    (model.minx-5, model.miny-5, model.minz),
                    (model.maxx+5, model.maxy+5, model.maxz))


    low, high = bounds.get_absolute_limits()
    line_distance = 2 * tool.radius * (1.0 - overlap)

    motion_grid = get_fixed_grid((low, high), layer_distance,
                                 line_distance, tool.radius / 4.0)
    moves = path_generator.GenerateToolPath(tool, [model], motion_grid,
                                            minz=low[2], maxz=high[2],
                                            draw_callback=progress_bar.update)
    


if __name__ == '__main__':
    start_time = time()
    cProfile.run('run_dropcutter()', 'dropcutter.pyprof')
    run_time = time() - start_time
    print '\nDropcutter took %f seconds' % run_time
    p = pstats.Stats('dropcutter.pyprof')
    print 'Top ten time-consuming functions:'
    p.sort_stats('time').print_stats(10)
