def bGeneratePressed(self, _): self.bSave.Enable(False) self.bVisualize.Enable(False) self.gcl.clear() self.gcode = [] errs = [] try: dec = int(self.teDecimals.GetValue()) self.fmt = "%0." + str(dec) + "f" except: errs.append("Decimal Places") try: sx = float(self.teStartX.GetValue()) except: errs.append("Start X") try: sy = float(self.teStartY.GetValue()) except: errs.append("Start Y") try: sz = float(self.teStartZ.GetValue()) except: errs.append("Start Z") try: safez = float(self.teSafeZ.GetValue()) except: errs.append("Safe Z") addspeed = self.cbAddSpeed.IsChecked() try: feedzG0 = float(self.teFeedZG0.GetValue()) except: errs.append("Z G0 Speed") try: feedzG1 = float(self.teFeedZG1.GetValue()) except: errs.append("Z G1 Speed") try: feedxyG0 = float(self.teFeedXYG0.GetValue()) except: errs.append("XY G0 Speed") try: feedxyG1 = float(self.teFeedXYG1.GetValue()) except: errs.append("XY G1 Speed") try: height = float(self.teHeight.GetValue()) except: errs.append("Height") try: width = float(self.teWidth.GetValue()) except: errs.append("Width") try: depth = float(self.teTotalDepth.GetValue()) except: errs.append("Depth") try: passdepth = float(self.tePassDepth.GetValue()) except: errs.append("Depth per Pass") try: tdiam = float(self.teToolDiam.GetValue()) except: errs.append("Tool Diameter") try: stepover = float(self.teStepOver.GetValue()) except: errs.append("Stepover") try: angle = float(self.teAngle.GetValue()) except: errs.append("Angle") if not ValidateNoEntryErrors(self, errs): return rot = Rotator(angle) if not ValidateToolSize(self, tdiam, height, "Height"): return if not ValidateToolSize(self, tdiam, width, "Width"): return if not ValidateRange(self, stepover, 0.001, 1.0, "Stepover", "0 < x <= 1.0"): return self.gcode = self.preamble(self.getChosen(self.rbMeas), tdiam, self.toolInfo, safez) self.tDiam = tdiam if self.settings.annotate: if angle == 0: self.gcode.append( "(Rectangle (%6.2f,%6.2f) to (%6.2f,%6.2f) depth from %6.2f to %6.2f)" % (sx, sy, width, height, sz, depth)) else: rx1, ry1 = rot.rotate(sx, sy) rx2, ry2 = rot.rotate(width + sx, height + sy) self.gcode.append( "(Rectangle (%6.2f,%6.2f) to (%6.2f,%6.2f) depth from %6.2f to %6.2f rotated %6.2f)" % (rx1, ry1, rx2, ry2, sz, depth, angle)) points = [[sx, sy], [sx, sy + height], [sx + width, sy + height], [sx + width, sy], [sx, sy]] sp = self.getChosen(self.rbStartPoints) adjx = 0 adjy = 0 if sp == "Upper Left": adjy = -height elif sp == "Upper Right": adjy = -height adjx = -width elif sp == "Lower Right": adjx = -width elif sp == "Center": adjx = -width / 2 adjy = -height / 2 for p in points: p[0] += adjx p[1] += adjy tm = self.getChosen(self.rbToolMove) rad = float(tdiam) / 2.0 if tm == "Inside Rectangle": points[0][0] += rad points[0][1] += rad points[1][0] += rad points[1][1] -= rad points[2][0] -= rad points[2][1] -= rad points[3][0] -= rad points[3][1] += rad points[4][0] += rad points[4][1] += rad elif tm == "Outside Rectangle": points[0][0] -= rad points[0][1] -= rad points[1][0] -= rad points[1][1] += rad points[2][0] += rad points[2][1] += rad points[3][0] += rad points[3][1] -= rad points[4][0] -= rad points[4][1] -= rad cd = self.getChosen(self.rbCutDir) if cd != "Clockwise": np = points[::-1] points = np pkt = self.getChosen(self.rbPkts) if self.settings.annotate: self.gcode.append("(Start point: %s)" % sp) self.gcode.append("(Cutting direction: %s)" % cd) self.gcode.append("(Tool movement: %s)" % tm) self.gcode.append("(Pocket: %s)" % pkt) if pkt == "None": self.gcode.append( ("G0 Z" + self.fmt + self.speedTerm(addspeed, feedzG0)) % (safez)) self.gcode.append(("G0 X" + self.fmt + " Y" + self.fmt + self.speedTerm(addspeed, feedxyG0)) % rot.rotate(points[0][0], points[0][1])) xmin = min(points[0][0], points[2][0]) + tdiam / 2 xmax = max(points[0][0], points[2][0]) - tdiam / 2 ymin = min(points[0][1], points[2][1]) + tdiam / 2 ymax = max(points[0][1], points[2][1]) - tdiam / 2 passes = int(math.ceil(depth / passdepth)) cz = sz xlast = 0 ylast = 0 for i in range(passes): cz -= passdepth if cz < -depth: cz = -depth if self.settings.annotate: self.gcode.append("(Pass number %d at depth %f)" % (i, cz)) if pkt == "Horizontal": first = True alt = True y = ymin self.gcode.append( ("G0 Z" + self.fmt + self.speedTerm(addspeed, feedzG0)) % (safez)) self.gcode.append(("G0 X" + self.fmt + " Y" + self.fmt + self.speedTerm(addspeed, feedxyG0)) % rot.rotate(xmin, ymin)) self.gcode.append( ("G1 Z" + self.fmt + self.speedTerm(addspeed, feedzG1)) % (cz)) while y <= ymax: if not first: self.gcode.append( ("G1 X" + self.fmt + " Y" + self.fmt + self.speedTerm(addspeed, feedxyG1)) % rot.rotate(xlast, y)) if alt: self.gcode.append( ("G1 X" + self.fmt + " Y" + self.fmt + self.speedTerm(addspeed, feedxyG1)) % rot.rotate(xmax, y)) xlast = xmax else: self.gcode.append( ("G1 X" + self.fmt + " Y" + self.fmt + self.speedTerm(addspeed, feedxyG1)) % rot.rotate(xmin, y)) xlast = xmin y += tdiam * stepover first = False alt = not alt self.gcode.append( ("G0 Z" + self.fmt + self.speedTerm(addspeed, feedzG0)) % (safez)) self.gcode.append(("G0 X" + self.fmt + " Y" + self.fmt + self.speedTerm(addspeed, feedxyG0)) % rot.rotate(points[0][0], points[0][1])) elif pkt == "Vertical": first = True alt = True x = xmin self.gcode.append( ("G0 Z" + self.fmt + self.speedTerm(addspeed, feedzG0)) % (safez)) self.gcode.append(("G0 X" + self.fmt + " Y" + self.fmt + self.speedTerm(addspeed, feedxyG0)) % rot.rotate(xmin, ymin)) self.gcode.append( ("G1 Z" + self.fmt + self.speedTerm(addspeed, feedzG1)) % (cz)) while x <= xmax: if not first: self.gcode.append( ("G1 X" + self.fmt + " Y" + self.fmt + self.speedTerm(addspeed, feedxyG1)) % rot.rotate(x, ylast)) if alt: self.gcode.append( ("G1 X" + self.fmt + " Y" + self.fmt + self.speedTerm(addspeed, feedxyG1)) % rot.rotate(x, ymax)) ylast = ymax else: self.gcode.append( ("G1 X" + self.fmt + " Y" + self.fmt + self.speedTerm(addspeed, feedxyG1)) % rot.rotate(x, ymin)) ylast = ymin x += tdiam * stepover first = False alt = not alt self.gcode.append( ("G0 Z" + self.fmt + self.speedTerm(addspeed, feedzG0)) % (safez)) self.gcode.append(("G0 X" + self.fmt + " Y" + self.fmt + self.speedTerm(addspeed, feedxyG0)) % rot.rotate(points[0][0], points[0][1])) elif pkt == "Centered": vertical = False if (xmax - xmin) > (ymax - ymin): ya = (ymax + ymin) / 2.0 yb = ya d = ymax - ya xa = xmin + d xb = xmax - d elif (xmax - xmin) < (ymax - ymin): vertical = True xa = (xmax + xmin) / 2.0 xb = xa d = xmax - xa ya = ymin + d yb = ymax - d else: xa = (xmax + xmin) / 2.0 xb = xa ya = (ymax + ymin) / 2.0 yb = ya self.gcode.append( ("G0 Z" + self.fmt + self.speedTerm(addspeed, feedzG0)) % (safez)) self.gcode.append( ("G0 X" + self.fmt + " Y" + self.fmt + self.speedTerm(addspeed, feedxyG0)) % rot.rotate(xb, yb)) self.gcode.append( ("G1 Z" + self.fmt + self.speedTerm(addspeed, feedzG1)) % (cz)) self.gcode.append( ("G1 X" + self.fmt + " Y" + self.fmt + self.speedTerm(addspeed, feedxyG1)) % rot.rotate(xa, ya)) d = stepover * tdiam while (xa - d) >= xmin: if cd == "Clockwise": self.gcode.append( ("G1 X" + self.fmt + " Y" + self.fmt + self.speedTerm(addspeed, feedxyG1)) % rot.rotate(xa - d, ya - d)) if vertical: self.gcode.append( ("G1 X" + self.fmt + " Y" + self.fmt + self.speedTerm(addspeed, feedxyG1)) % rot.rotate(xa - d, yb + d)) else: self.gcode.append( ("G1 X" + self.fmt + " Y" + self.fmt + self.speedTerm(addspeed, feedxyG1)) % rot.rotate(xa - d, ya + d)) self.gcode.append( ("G1 X" + self.fmt + " Y" + self.fmt + self.speedTerm(addspeed, feedxyG1)) % rot.rotate(xb + d, yb + d)) if vertical: self.gcode.append( ("G1 X" + self.fmt + " Y" + self.fmt + self.speedTerm(addspeed, feedxyG1)) % rot.rotate(xb + d, ya - d)) else: self.gcode.append( ("G1 X" + self.fmt + " Y" + self.fmt + self.speedTerm(addspeed, feedxyG1)) % rot.rotate(xb + d, yb - d)) self.gcode.append( ("G1 X" + self.fmt + " Y" + self.fmt + self.speedTerm(addspeed, feedxyG1)) % rot.rotate(xa - d, ya - d)) else: self.gcode.append( ("G1 X" + self.fmt + " Y" + self.fmt + self.speedTerm(addspeed, feedxyG1)) % rot.rotate(xa - d, ya - d)) if vertical: self.gcode.append( ("G1 X" + self.fmt + " Y" + self.fmt + self.speedTerm(addspeed, feedxyG1)) % rot.rotate(xb + d, ya - d)) else: self.gcode.append( ("G1 X" + self.fmt + " Y" + self.fmt + self.speedTerm(addspeed, feedxyG1)) % rot.rotate(xb + d, yb - d)) self.gcode.append( ("G1 X" + self.fmt + " Y" + self.fmt + self.speedTerm(addspeed, feedxyG1)) % rot.rotate(xb + d, yb + d)) if vertical: self.gcode.append( ("G1 X" + self.fmt + " Y" + self.fmt + self.speedTerm(addspeed, feedxyG1)) % rot.rotate(xa - d, yb + d)) else: self.gcode.append( ("G1 X" + self.fmt + " Y" + self.fmt + self.speedTerm(addspeed, feedxyG1)) % rot.rotate(xa - d, ya + d)) self.gcode.append( ("G1 X" + self.fmt + " Y" + self.fmt + self.speedTerm(addspeed, feedxyG1)) % rot.rotate(xa - d, ya - d)) d += stepover * tdiam self.gcode.append( ("G0 Z" + self.fmt + self.speedTerm(addspeed, feedzG0)) % (safez)) self.gcode.append(("G0 X" + self.fmt + " Y" + self.fmt + self.speedTerm(addspeed, feedxyG0)) % rot.rotate(points[0][0], points[0][1])) self.gcode.append( ("G1 Z" + self.fmt + self.speedTerm(addspeed, feedzG1)) % (cz)) for p in points[1:]: self.gcode.append(("G1 X" + self.fmt + " Y" + self.fmt + self.speedTerm(addspeed, feedxyG1)) % rot.rotate(p[0], p[1])) self.gcode.append( ("G0 Z" + self.fmt + self.speedTerm(addspeed, feedzG0)) % (safez)) if self.settings.annotate: self.gcode.append("(End object %s)" % self.viewTitle) self.gcl.updateList(self.gcode) self.bSave.Enable() self.bVisualize.Enable() self.setState(False, True)
def bGeneratePressed(self, _): self.bVisualize.Enable(False) self.bSave.Enable(False) self.gcl.clear() self.gcode = [] errs = [] try: dec = int(self.teDecimals.GetValue()) self.fmt = "%0." + str(dec) + "f" except: errs.append("Decimal Places") try: sx = float(self.teStartX.GetValue()) except: errs.append("Start X") try: sy = float(self.teStartY.GetValue()) except: errs.append("Start Y") try: sz = float(self.teStartZ.GetValue()) except: errs.append("Start Z") try: angle = float(self.teAngle.GetValue()) except: errs.append("Angle") try: safez = float(self.teSafeZ.GetValue()) except: errs.append("Safe Z") addspeed = self.cbAddSpeed.IsChecked() try: feedzG0 = float(self.teFeedZG0.GetValue()) except: errs.append("Z G0 Speed") try: feedzG1 = float(self.teFeedZG1.GetValue()) except: errs.append("Z G1 Speed") try: feedxyG0 = float(self.teFeedXYG0.GetValue()) except: errs.append("XY G0 Speed") try: feedxyG23 = float(self.teFeedXYG1.GetValue()) except: errs.append("XY G1 Speed") try: height = float(self.teHeight.GetValue()) except: errs.append("Height") try: width = float(self.teWidth.GetValue()) except: errs.append("Width") try: depth = float(self.teDepth.GetValue()) except: errs.append("Depth") try: passdepth = float(self.tePassDepth.GetValue()) except: errs.append("Depth per Pass") try: stepover = float(self.teStepover.GetValue()) except: errs.append("Stepover") try: tdiam = float(self.teToolDiam.GetValue()) except: errs.append("Tool Diameter") try: hdiam = float(self.teHoleDiam.GetValue()) except: errs.append("Hole Diameter") try: spacing = float(self.teSpacing.GetValue()) except: errs.append("Spacing") if not ValidateNoEntryErrors(self, errs): return if not ValidateToolSize(self, tdiam, hdiam, "Hole Diameter"): return if not ValidateMinLength(self, height, hdiam + spacing, "Height", "Hole Diameter + Spacing"): return if not ValidateMinLength(self, width, hdiam + spacing, "Width", "Hole Diameter + Spacing"): return self.gcode = self.preamble(self.getChosen(self.rbMeas), tdiam, self.toolInfo, safez) sp = self.getChosen(self.rbStartPoints) if sp == "Upper Left": sy -= height elif sp == "Upper Right": sy -= height sx -= width elif sp == "Lower Right": sx -= width elif sp == "Center": sx -= width / 2 sy -= height / 2 perimeteronly = self.cbPerimeter.IsChecked() inside = self.cbInside.IsChecked() if perimeteronly: stagger = False else: stagger = self.cbStagger.IsChecked() retract = self.cbRetract.IsChecked() if inside: minx = sx + hdiam / 2 maxx = sx + width - hdiam / 2 miny = sy + hdiam / 2 maxy = sy + height - hdiam / 2 else: minx = sx maxx = sx + width miny = sy maxy = sy + height cd = self.getChosen(self.rbCutDir) if cd == "Clockwise": cmd = "G2" else: cmd = "G3" nrows = int((maxy - miny) / (hdiam + spacing)) ncols = int((maxx - minx) / (hdiam + spacing)) xstep = (maxx - minx) / float(ncols) ystep = (maxy - miny) / float(nrows) if stagger: ystep *= 0.866 nrows = int((nrows / 0.866) + 0.5) cx = minx cy = miny rot = None if angle != 0: rot = Rotator(angle) if self.settings.annotate: self.gcode.append( "(Rectangular drill pattern start (%6.2f,%6.2f) height %6.2f width %6.2f depth from %6.2f to %6.2f)" % (sx, sy, height, width, sz, depth)) self.gcode.append("(Starting point: %s)" % sp) self.gcode.append("(Cut Direction: %s)" % cd) self.gcode.append("(Inside Circle: %s)" % str(inside)) self.gcode.append("(Perimeter Only: %s)" % str(perimeteronly)) self.gcode.append("(Retract each pass: %s)" % str(retract)) self.gcode.append("(Hole diameter: %6.2f)" % hdiam) self.gcode.append("(Stagger rows: %s)" % str(stagger)) self.gcode.append("(Calculated step x/y: %6.2f/%6.2f)" % (xstep, ystep)) self.gcode.append( ("G0 Z" + self.fmt + self.speedTerm(addspeed, feedzG0)) % (safez)) passes = int(math.ceil(depth / passdepth)) maxyoff = hdiam / 2 - tdiam / 2 for iy in range(nrows + 1): for ix in range(ncols + 1): includeHole = False if not perimeteronly: if cx <= maxx and cy <= maxy: includeHole = True else: if ix == 0 or ix == ncols or iy == 0 or iy == nrows: includeHole = True if includeHole: if rot is None: nx = cx ny = cy else: nx, ny = rot.rotate(cx, cy) self.gcode.append( ("G0 X" + self.fmt + " Y" + self.fmt + self.speedTerm(addspeed, feedxyG0)) % (nx, ny)) cz = sz for i in range(passes): cz -= passdepth if cz < -depth: cz = -depth if self.settings.annotate: self.gcode.append("(Pass number %d at depth %f)" % (i, cz)) self.gcode.append( ("G1 Z" + self.fmt + self.speedTerm(addspeed, feedzG1)) % (cz)) if hdiam > tdiam: maxyoff = (hdiam - tdiam) / 2.0 yoff = stepover while True: if yoff > maxyoff: yoff = maxyoff self.gcode.append( ("G1 Y" + self.fmt + self.speedTerm(addspeed, feedxyG0)) % (ny - yoff)) self.gcode.append( (cmd + " J" + self.fmt + " X" + self.fmt + " Y" + self.fmt + self.speedTerm(addspeed, feedxyG23)) % (yoff, nx, ny - yoff)) if yoff >= maxyoff: break yoff += stepover self.gcode.append( ("G1 X" + self.fmt + " Y" + self.fmt + self.speedTerm(addspeed, feedxyG23)) % (nx, ny)) if retract: self.gcode.append( ("G0 Z" + self.fmt + self.speedTerm(addspeed, feedzG0)) % (safez)) if not retract: self.gcode.append( ("G0 Z" + self.fmt + self.speedTerm(addspeed, feedzG0)) % (safez)) cx += xstep cy += ystep if stagger and iy % 2 == 0: cx = minx + xstep / 2 else: cx = minx if self.settings.annotate: self.gcode.append("(End object %s)" % self.viewTitle) self.gcl.updateList(self.gcode) self.setState(False, True) self.bVisualize.Enable() self.bSave.Enable()