MK4duo Gcode support

parent f299ea66
......@@ -25,11 +25,17 @@ from pymkcam.Toolpath import CORNER_STYLE_EXACT_PATH, CORNER_STYLE_EXACT_STOP, \
CORNER_STYLE_OPTIMIZE_SPEED, CORNER_STYLE_OPTIMIZE_TOLERANCE
DEFAULT_HEADER = (("G40", "disable tool radius compensation"),
("G49", "disable tool length compensation"),
("G80", "cancel modal motion"),
("G54", "select coordinate system 1"),
("G90", "disable incremental moves"))
DEFAULT_HEADER = (
("M82", "select absolute coordinate system"),
)
DEFAULT_FOOTER = (
("G0 Z5.00000 F200", "safe Z position"),
("M5", "stop spindle"),
("M18", "unlock all steppers"),
("M2", "program ends")
)
DEFAULT_DIGITS = 6
......@@ -42,29 +48,31 @@ def _render_number(number):
class MK4duo(pymkcam.Exporters.GCode.BaseGenerator):
sspeed = "10000"
feed = "300"
fast = "3000"
def add_header(self):
for command, comment in DEFAULT_HEADER:
self.add_command(command, comment=comment)
# TODO: use a "unit" filter
if True:
self.add_command("G21", "metric")
else:
self.add_command("G20", "imperial")
def add_footer(self):
self.add_command("M2", "end program")
for command, comment in DEFAULT_FOOTER:
self.add_command(command, comment=comment)
def add_comment(self, comment):
self.add_command("; %s" % comment)
def add_command(self, command, comment=None):
self.destination.write(command)
if comment:
self.destination.write("\t")
self.add_comment(comment)
else:
self.destination.write(os.linesep)
self.destination.write(command)
self.destination.write(os.linesep)
def add_move(self, coordinates, is_rapid=False):
components = []
......@@ -72,52 +80,49 @@ class MK4duo(pymkcam.Exporters.GCode.BaseGenerator):
# True: the last move was G0
# False: the last move was G1
# None: some non-move happened before
if self._get_cache("rapid_move", None) != is_rapid:
components.append("G0" if is_rapid else "G1")
else:
# improve gcode style
components.append(" ")
components.append("G0" if is_rapid else "G1")
axes = [axis for axis in "XYZABCUVW"]
previous = self._get_cache("position", [None] * len(coordinates))
for (axis, value, last) in zip(axes, coordinates, previous):
if (last is None) or (last != value):
components.append("%s%.6f" % (axis, value))
command = " ".join(components)
if command.strip():
self.add_command(command)
if len(components) > 1:
if self._get_cache("rapid_move", None) != is_rapid:
components.append("F%s" % (self.fast if is_rapid else self.feed))
command = " ".join(components)
if command.strip():
self.add_command(command)
def command_feedrate(self, feedrate):
self.add_command("F%s" % _render_number(feedrate), "set feedrate")
self.feed = _render_number(feedrate)
def command_select_tool(self, tool_id):
self.add_command("T%d M6" % tool_id, "select tool")
self.add_command("T%d" % tool_id, "select tool")
def command_spindle_speed(self, speed):
self.add_command("S%s" % _render_number(speed), "set spindle speed")
self.sspeed = _render_number(speed)
def command_spindle_enabled(self, state):
if state:
self.add_command("M3", "start spindle")
self.add_command("M3 S%s" % self.sspeed, "start spindle")
else:
self.add_command("M5", "stop spindle")
def command_delay(self, seconds):
self.add_command("G04 P%d" % seconds, "wait for %d seconds" % seconds)
self.add_command("G04 S%d" % seconds, "wait for %d seconds" % seconds)
def command_corner_style(self,
(path_mode, motion_tolerance, naive_tolerance)):
if path_mode == CORNER_STYLE_EXACT_PATH:
self.add_command("G61", "exact path mode")
self.add_comment("G61 exact path mode was requested but not implemented")
elif path_mode == CORNER_STYLE_EXACT_STOP:
self.add_command("G61.1", "exact stop mode")
self.add_comment("G61.1 exact stop mode was requested but not implemented")
elif path_mode == CORNER_STYLE_OPTIMIZE_SPEED:
self.add_command("G64", "continuous mode with maximum speed")
self.add_comment("G64 continuous mode with maximum speed was requested but not implemented")
else:
if not naive_tolerance:
self.add_command("G64 P%f" % motion_tolerance,
"continuous mode with tolerance")
self.add_comment("G64 P%f continuous mode with tolerance was requested but not implemented" % motion_tolerance)
else:
self.add_command("G64 P%f Q%f" % \
(motion_tolerance, naive_tolerance),
"continuous mode with tolerance and cleanup")
self.add_command("G64 P%f Q%f continuous mode with tolerance and cleanup was requested but not implemented" % \
(motion_tolerance, naive_tolerance))
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment