From 1ff688a3ffcb97840188e05ccd31ac752e615016 Mon Sep 17 00:00:00 2001 From: sliptonic Date: Thu, 20 Jan 2022 17:21:17 -0600 Subject: [PATCH] Helix refactor for generator --- src/Mod/Path/Generators/helix_generator.py | 30 ++++++++++------ .../Path/PathTests/TestPathHelixGenerator.py | 36 +++++++++---------- 2 files changed, 35 insertions(+), 31 deletions(-) diff --git a/src/Mod/Path/Generators/helix_generator.py b/src/Mod/Path/Generators/helix_generator.py index 2d4f2cf29e..1d83095025 100644 --- a/src/Mod/Path/Generators/helix_generator.py +++ b/src/Mod/Path/Generators/helix_generator.py @@ -51,7 +51,7 @@ def generate( ): """generate(edge, hole_radius, inner_radius, step_over) ... generate helix commands. hole_radius, inner_radius: outer and inner radius of the hole - step_over: step over radius value""" + step_over: step over % of tool diameter""" startPoint = edge.Vertexes[0].Point endPoint = edge.Vertexes[1].Point @@ -73,16 +73,16 @@ def generate( ) if type(hole_radius) not in [float, int]: - raise ValueError("hole_radius must be a float") + raise TypeError("Invalid type for hole radius") if hole_radius < 0.0: raise ValueError("hole_radius < 0") if type(inner_radius) not in [float, int]: - raise ValueError("inner_radius must be a float") + raise TypeError("inner_radius must be a float") if type(tool_diameter) not in [float, int]: - raise ValueError("tool_diameter must be a float") + raise TypeError("tool_diameter must be a float") if inner_radius > 0 and hole_radius - inner_radius < tool_diameter: raise ValueError( @@ -104,6 +104,13 @@ def generate( elif direction not in ["CW", "CCW"]: raise ValueError("Invalid value for parameter 'direction'") + if type(step_over) not in [float, int]: + raise TypeError("Invalid value for parameter 'step_over'") + + if step_over <= 0 or step_over > 1: + raise ValueError("Invalid value for parameter 'step_over'") + step_over_distance = step_over * tool_diameter + if not ( isclose(startPoint.sub(endPoint).x, 0, rtol=1e-05, atol=1e-06) and (isclose(startPoint.sub(endPoint).y, 0, rtol=1e-05, atol=1e-06)) @@ -117,13 +124,13 @@ def generate( PathLog.debug("(annulus mode)\n") outer_radius = hole_radius - tool_diameter / 2 step_radius = inner_radius + tool_diameter / 2 - if abs((outer_radius - step_radius) / step_over) < 1e-5: - radii = [(outer_radius + step_radius) / 2] + if abs((outer_radius - step_radius) / step_over_distance) < 1e-5: + radii = [(outer_radius + inner_radius) / 2] else: - nr = max(int(ceil((outer_radius - step_radius) / step_over)), 2) + nr = max(int(ceil((outer_radius - inner_radius) / step_over_distance)), 2) radii = linspace(outer_radius, step_radius, nr) - elif hole_radius <= 2 * step_over: + elif hole_radius <= 2 * tool_diameter: PathLog.debug("(single helix mode)\n") radii = [hole_radius - tool_diameter / 2] if radii[0] <= 0: @@ -136,16 +143,17 @@ def generate( else: PathLog.debug("(full hole mode)\n") outer_radius = hole_radius - tool_diameter / 2 - step_radius = step_over / 2 - nr = max(1 + int(ceil((outer_radius - step_radius) / step_over)), 2) - radii = [r for r in linspace(outer_radius, step_radius, nr) if r > 0] + nr = max(1 + int(ceil((outer_radius - inner_radius) / step_over_distance)), 2) + PathLog.debug("nr: {}".format(nr)) + radii = [r for r in linspace(outer_radius, inner_radius, nr) if r > 0] if not radii: raise ValueError( "Cannot helix a hole of diameter {0} with a tool of diameter {1}".format( 2 * hole_radius, tool_diameter ) ) + PathLog.debug("Radii: {}".format(radii)) # calculate the number of full and partial turns required # Each full turn is two 180 degree arcs. Zsteps is equally spaced step # down values diff --git a/src/Mod/Path/PathTests/TestPathHelixGenerator.py b/src/Mod/Path/PathTests/TestPathHelixGenerator.py index ea2b477823..d3707f9236 100644 --- a/src/Mod/Path/PathTests/TestPathHelixGenerator.py +++ b/src/Mod/Path/PathTests/TestPathHelixGenerator.py @@ -42,7 +42,7 @@ def _resetArgs(): "edge": edg, "hole_radius": 10.0, "step_down": 1.0, - "step_over": 5.0, + "step_over": 0.5, "tool_diameter": 5.0, "inner_radius": 0.0, "direction": "CW", @@ -62,7 +62,6 @@ G2 I7.500000 J0.000000 X12.500000 Y5.000000 Z18.000000\ G0 X5.000000 Y5.000000 Z18.000000\ G0 Z20.000000" - def test00(self): """Test Basic Helix Generator Return""" args = _resetArgs() @@ -71,34 +70,27 @@ G0 Z20.000000" self.assertTrue(type(result[0]) is Path.Command) gcode = "".join([r.toGCode() for r in result]) - print(gcode) self.assertTrue( gcode == self.expectedHelixGCode, "Incorrect helix g-code generated" ) def test01(self): - """Test Basic Helix Generator hole_radius is float > 0""" + """Test Value and Type checking""" args = _resetArgs() - args["hole_radius"] = '10' - self.assertRaises(ValueError, generator.generate, **args) + args["hole_radius"] = "10" + self.assertRaises(TypeError, generator.generate, **args) args["hole_radius"] = -10.0 self.assertRaises(ValueError, generator.generate, **args) - def test02(self): - """Test Basic Helix Generator inner_radius is float""" args = _resetArgs() - args["inner_radius"] = '2' - self.assertRaises(ValueError, generator.generate, **args) + args["inner_radius"] = "2" + self.assertRaises(TypeError, generator.generate, **args) - def test03(self): - """Test Basic Helix Generator tool_diameter is float""" args = _resetArgs() - args["tool_diameter"] = '5' - self.assertRaises(ValueError, generator.generate, **args) + args["tool_diameter"] = "5" + self.assertRaises(TypeError, generator.generate, **args) - def test04(self): - """Test Basic Helix Generator tool fit with radius difference less than tool diameter""" args = _resetArgs() # require tool fit 1: radius diff less than tool diam args["hole_radius"] = 10.0 @@ -112,14 +104,18 @@ G0 Z20.000000" args["tool_diameter"] = 5.0 self.assertRaises(ValueError, generator.generate, **args) - def test05(self): - """Test Basic Helix Generator validate the startAt enumeration value""" + # step_over is a percent value between 0 and 1 + args = _resetArgs() + args["step_over"] = 50 + self.assertRaises(ValueError, generator.generate, **args) + args["step_over"] = "50" + self.assertRaises(TypeError, generator.generate, **args) + + # Other argument testing args = _resetArgs() args["startAt"] = "Other" self.assertRaises(ValueError, generator.generate, **args) - def test06(self): - """Test Basic Helix Generator validate the direction enumeration value""" args = _resetArgs() args["direction"] = "clock" self.assertRaises(ValueError, generator.generate, **args)