def comp_level(self, queue, stopFunc=None): """Use probe information (if exist) to modify the g-code to autolevel""" paths = [] # empty the gctos value OCV.gctos = [] def add(line, path): if line is not None: if isinstance(line, str): queue.put(line + "\n") OCV.gctos.append(line) else: queue.put(line) OCV.gctos.append(line) paths.append(path) # check the existence of an autolevel file autolevel = not self.probe.isEmpty() self.initPath() for line in CNC.compile_pgm(OCV.startup.splitlines()): add(line, None) every = 1 for i, block in enumerate(OCV.blocks): if not block.enable: continue for j, line in enumerate(block): every -= 1 if every <= 0: if stopFunc is not None and stopFunc(): return None every = 50 newcmd = [] cmds = CNC.compileLine(line) if cmds is None: continue elif isinstance(cmds, str): cmds = CNC.breakLine(cmds) else: # either CodeType or tuple, list[] append at it as is if isinstance(cmds, types.CodeType) or\ isinstance(cmds, int): add(cmds, None) else: add(cmds, (i, j)) continue skip = False expand = None self.cnc.motionStart(cmds) # FIXME append feed on cut commands. # It will be obsolete in grbl v1.0 if OCV.appendFeed and self.cnc.gcode in (1, 2, 3): # Check is not existing in cmds for c in cmds: if c[0] in ('f', 'F'): break else: cmds.append( OCV.fmt( 'F', self.cnc.feed / OCV.unit)) if autolevel and self.cnc.gcode in (0, 1, 2, 3) and \ self.cnc.mval == 0: xyz = self.cnc.motionPath() if not xyz: # while auto-levelling, do not ignore non-movement # commands, just append the line as-is add(line, None) else: extra = "" for c in cmds: if c[0].upper() not in ( 'G', 'X', 'Y', 'Z', 'I', 'J', 'K', 'R'): extra += c x1, y1, z1 = xyz[0] if self.cnc.gcode == 0: g = 0 else: g = 1 for x2, y2, z2 in xyz[1:]: for x, y, z in self.probe.splitLine( x1, y1, z1, x2, y2, z2): add("G{0:d} {1} {2} {3} {4}".format( g, OCV.fmt('X', x/OCV.unit), OCV.fmt('Y', y/OCV.unit), OCV.fmt('Z', z/OCV.unit), extra), (i, j)) extra = "" x1, y1, z1 = x2, y2, z2 self.cnc.motionEnd() continue else: # FIXME expansion policy here variable needed # Canned cycles if OCV.drillPolicy == 1 and \ self.cnc.gcode in (81, 82, 83, 85, 86, 89): expand = self.cnc.macroGroupG8X() # Tool change elif self.cnc.mval == 6: if OCV.toolPolicy == 0: # send to grbl pass elif OCV.toolPolicy == 1: # skip whole line skip = True elif OCV.toolPolicy >= 2: expand = CNC.compile_pgm(self.cnc.toolChange()) self.cnc.motionEnd() if expand is not None: for line in expand: add(line, None) expand = None continue elif skip: skip = False continue for cmd in cmds: c = cmd[0] try: value = float(cmd[1:]) except Exception: value = 0.0 if c.upper() in ( "F", "X", "Y", "Z", "I", "J", "K", "R", "P"): cmd = OCV.fmt(c, value) else: opt = OCV.ERROR_HANDLING.get(cmd.upper(), 0) if opt == OCV.GSTATE_SKIP: cmd = None if cmd is not None: newcmd.append(cmd) add("".join(newcmd), (i, j)) return paths