示例#1
0
    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)
示例#2
0
    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()