From d687fb5287a04b8a6be153d132257689e3a71000 Mon Sep 17 00:00:00 2001 From: Juan Pablo Caram Date: Sun, 4 Oct 2015 21:45:19 -0400 Subject: [PATCH] Started multi-pass cuts. --- camlib.py | 45 +++++++++++++++++++++++++++++++++------------ 1 file changed, 33 insertions(+), 12 deletions(-) diff --git a/camlib.py b/camlib.py index febd6e7f..69e6cb73 100644 --- a/camlib.py +++ b/camlib.py @@ -2686,7 +2686,7 @@ class CNCjob(Geometry): gcode += "M6\n" # Tool change gcode += "(MSG, Change to tool dia=%.4f)\n" % exobj.tools[tool]["C"] gcode += "M0\n" # Temporary machine stop - if(self.spindlespeed != None): + if self.spindlespeed is not None: gcode += "M03 S%d\n" % int(self.spindlespeed) # Spindle start with configured speed else: gcode += "M03\n" # Spindle start @@ -2702,7 +2702,8 @@ class CNCjob(Geometry): self.gcode = gcode - def generate_from_geometry_2(self, geometry, append=True, tooldia=None, tolerance=0): + def generate_from_geometry_2(self, geometry, append=True, tooldia=None, tolerance=0, + multipass=False, depthpercut=None): """ Second algorithm to generate from Geometry. @@ -2779,15 +2780,32 @@ class CNCjob(Geometry): if pt != geo.coords[0] and pt == geo.coords[-1]: geo.coords = list(geo.coords)[::-1] - # G-code - # Note: self.linear2gcode() and self.point2gcode() will - # lower and raise the tool every time. - if type(geo) == LineString or type(geo) == LinearRing: - self.gcode += self.linear2gcode(geo, tolerance=tolerance) - elif type(geo) == Point: - self.gcode += self.point2gcode(geo) + if not multipass: + # G-code + # Note: self.linear2gcode() and self.point2gcode() will + # lower and raise the tool every time. + if type(geo) == LineString or type(geo) == LinearRing: + self.gcode += self.linear2gcode(geo, tolerance=tolerance) + elif type(geo) == Point: + self.gcode += self.point2gcode(geo) + else: + log.warning("G-code generation not implemented for %s" % (str(type(geo)))) else: - log.warning("G-code generation not implemented for %s" % (str(type(geo)))) + if depthpercut is None: + depthpercut = self.z_cut + + depth = 0 + while depth > self.z_cut: + depth -= depthpercut + # G-code + # Note: self.linear2gcode() and self.point2gcode() will + # lower and raise the tool every time. + # if type(geo) == LineString or type(geo) == LinearRing: + # self.gcode += self.linear2gcode(geo, tolerance=tolerance) + # elif type(geo) == Point: + # self.gcode += self.point2gcode(geo) + # else: + # log.warning("G-code generation not implemented for %s" % (str(type(geo)))) # Delete from index, update current location and continue. #rti.delete(hits[0], geo.coords[0]) @@ -3033,7 +3051,7 @@ class CNCjob(Geometry): # TODO: This takes forever. Too much data? self.solid_geometry = cascaded_union([geo['geom'] for geo in self.gcode_parsed]) - def linear2gcode(self, linear, tolerance=0): + def linear2gcode(self, linear, tolerance=0, down=True, up=True): """ Generates G-code to cut along the linear feature. @@ -3066,7 +3084,10 @@ class CNCjob(Geometry): for pt in path[1:]: gcode += t % (1, pt[0], pt[1]) # Linear motion to point - gcode += "G00 Z%.4f\n" % self.z_move # Stop cutting + + if up: + gcode += "G00 Z%.4f\n" % self.z_move # Stop cutting + return gcode def point2gcode(self, point):