From fea0e02fc1a97d761196b7e34bc0c293413c4f67 Mon Sep 17 00:00:00 2001 From: ChrisLuck Date: Fri, 6 Jan 2017 16:03:11 +0100 Subject: [PATCH] support stepdown greater than total depth, 2nd try --- src/Mod/Path/PathScripts/PathUtils.py | 65 +++++++++++++------ src/Mod/Path/PathTests/TestPathDepthParams.py | 24 ++++++- 2 files changed, 68 insertions(+), 21 deletions(-) diff --git a/src/Mod/Path/PathScripts/PathUtils.py b/src/Mod/Path/PathScripts/PathUtils.py index 2f6763b4d..4e75ef089 100644 --- a/src/Mod/Path/PathScripts/PathUtils.py +++ b/src/Mod/Path/PathScripts/PathUtils.py @@ -35,6 +35,7 @@ from DraftGeomUtils import geomType import PathScripts from PathScripts import PathJob # import itertools +import numpy def cleanedges(splines, precision): '''cleanedges([splines],precision). Convert BSpline curves, Beziers, to arcs that can be used for cnc paths. @@ -840,27 +841,53 @@ class depth_params: '''returns a list of depths to be used in order from first to last. equalstep=True: all steps down before the finish pass will be equalized.''' - depths = [] if self.user_depths is not None: - depths = self.user_depths - else: - total_depth = self.start_depth - self.final_depth - if total_depth <= 0: - return depths - layers_required = int((total_depth - self.z_finish_step) / self.step_down) - partial_steplayer = (total_depth - self.z_finish_step) % self.step_down - if equalstep is True and partial_steplayer > 0: - layerstep = float((total_depth - self.z_finish_step) / (layers_required + 1)) + return self.user_depths + + total_depth = self.start_depth - self.final_depth + + if total_depth < 0: + return [] + + depths = [self.final_depth] + + # apply finish step if necessary + if self.z_finish_step > 0: + if self.z_finish_step < total_depth: + depths.append(self.z_finish_step + self.final_depth) else: - layerstep = self.step_down + return depths - for step in range(layers_required): - d = self.start_depth - ((step +1) * layerstep) - depths.append(d) - - if self.z_finish_step != 0 and depths[-1] != self.final_depth + self.z_finish_step: - depths.append(self.final_depth + self.z_finish_step) - if depths[-1] != self.final_depth: - depths.append(self.final_depth) + if equalstep: + depths += self.__equal_steps(self.start_depth, depths[-1], self.step_down)[1:] + else: + depths += self.__fixed_steps(self.start_depth, depths[-1], self.step_down)[1:] + depths.reverse() return depths + + def __equal_steps(self, start, stop, max_size): + '''returns a list of depths beginning with the bottom (included), ending + with the top (not included). + all steps are of equal size, which is as big as possible but not bigger + than max_size.''' + + steps_needed = math.ceil((start - stop) / max_size) + depths = numpy.linspace(stop, start, steps_needed, endpoint=False) + + return depths.tolist() + + def __fixed_steps(self, start, stop, size): + '''returns a list of depths beginning with the bottom (included), ending + with the top (not included). + all steps are of size 'size' except the one at the bottom wich can be + smaller.''' + + fullsteps = int((start - stop) / size) + last_step = start - (fullsteps * size) + depths = numpy.linspace(last_step, start, fullsteps, endpoint=False) + + if last_step == stop: + return depths.tolist() + else: + return [stop] + depths.tolist() diff --git a/src/Mod/Path/PathTests/TestPathDepthParams.py b/src/Mod/Path/PathTests/TestPathDepthParams.py index 244bb700e..57e51a5d0 100644 --- a/src/Mod/Path/PathTests/TestPathDepthParams.py +++ b/src/Mod/Path/PathTests/TestPathDepthParams.py @@ -73,7 +73,7 @@ class depthTestCases(unittest.TestCase): final_depth = 10 user_depths = None - expected =[] + expected =[10] d = PU.depth_params(clearance_height, rapid_safety_space, start_depth, step_down, z_finish_step, final_depth, user_depths) r = d.get_depths() @@ -109,7 +109,7 @@ class depthTestCases(unittest.TestCase): self.assertListEqual (r, expected) def test40(self): - '''Finish depth passed in.''' + '''z_finish_step passed in.''' clearance_height= 10 rapid_safety_space = 5 @@ -161,3 +161,23 @@ class depthTestCases(unittest.TestCase): r = d.get_depths(equalstep=True) self.assertListEqual (r, expected) + def test70(self): + '''stepping down with stepdown greater than total depth''' + clearance_height= 10 + rapid_safety_space = 5 + + start_depth = 10 + step_down = 20 + z_finish_step = 1 + final_depth = 0 + user_depths = None + + expected =[1.0, 0] + + d = PU.depth_params(clearance_height, rapid_safety_space, start_depth, step_down, z_finish_step, final_depth, user_depths) + r = d.get_depths(equalstep=True) + self.assertListEqual (r, expected) + + d = PU.depth_params(clearance_height, rapid_safety_space, start_depth, step_down, z_finish_step, final_depth, user_depths) + r = d.get_depths() + self.assertListEqual (r, expected)