| | |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| |
|
| |
|
| | from datetime import datetime |
| | import argparse |
| | import shlex |
| | import FreeCAD |
| | from FreeCAD import Units |
| | import Path |
| | import Path.Base.Util as PathUtil |
| | import Path.Post.Utils as PostUtils |
| | import PathScripts.PathUtils as PathUtils |
| | from builtins import open as pyopen |
| |
|
| | Revised = "2020-11-03" |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| |
|
| |
|
| | TOOLTIP = """ |
| | Generate g-code from a Path that is compatible with the Marlin controller. |
| | import marlin_post |
| | marlin_post.export(object, "/path/to/file.nc") |
| | """ |
| |
|
| | |
| | |
| | |
| | MOTION_MODE = "G90" |
| | WORK_PLANE = "G17" |
| | UNITS = "G21" |
| | UNIT_FORMAT = "mm" |
| | UNIT_FEED_FORMAT = "mm/min" |
| |
|
| | |
| | |
| | |
| | PRECISION = 3 |
| | DRILL_RETRACT_MODE = "G98" |
| | |
| | TRANSLATE_DRILL_CYCLES = True |
| | |
| | OUTPUT_TOOL_CHANGE = False |
| | RETURN_TO = None |
| | SPINDLE_WAIT = 3 |
| | MODAL = False |
| | |
| | LINENR = 100 |
| | LINEINCR = 10 |
| | PRE_OPERATION = """""" |
| | |
| | POST_OPERATION = """""" |
| | |
| | TOOL_CHANGE = """""" |
| | |
| |
|
| | |
| | |
| | |
| | OUTPUT_HEADER = True |
| | OUTPUT_COMMENTS = True |
| | OUTPUT_FINISH = False |
| | OUTPUT_PATH = False |
| | OUTPUT_MARLIN_CONFIG = False |
| | OUTPUT_LINE_NUMBERS = False |
| | OUTPUT_BCNC = False |
| | |
| | SHOW_EDITOR = True |
| |
|
| | |
| | |
| | |
| | parser = argparse.ArgumentParser(prog="marlin", add_help=False) |
| | parser.add_argument("--header", action="store_true", help="output headers (default)") |
| | parser.add_argument("--no-header", action="store_true", help="suppress header output") |
| | parser.add_argument("--comments", action="store_true", help="output comment (default)") |
| | parser.add_argument("--no-comments", action="store_true", help="suppress comment output") |
| | parser.add_argument("--finish-comments", action="store_true", help="output finish-comment") |
| | parser.add_argument( |
| | "--no-finish-comments", |
| | action="store_true", |
| | help="suppress finish-comment output (default)", |
| | ) |
| | parser.add_argument("--path-comments", action="store_true", help="output path-comment") |
| | parser.add_argument( |
| | "--no-path-comments", |
| | action="store_true", |
| | help="suppress path-comment output (default)", |
| | ) |
| | parser.add_argument("--marlin-config", action="store_true", help="output #defines for Marlin") |
| | parser.add_argument( |
| | "--no-marlin-config", |
| | action="store_true", |
| | help="suppress output #defines for Marlin (default)", |
| | ) |
| | parser.add_argument("--line-numbers", action="store_true", help="prefix with line numbers") |
| | parser.add_argument( |
| | "--no-line-numbers", |
| | action="store_true", |
| | help="do not prefix with line numbers (default)", |
| | ) |
| | parser.add_argument( |
| | "--show-editor", |
| | action="store_true", |
| | help="pop up editor before writing output (default)", |
| | ) |
| | parser.add_argument( |
| | "--no-show-editor", |
| | action="store_true", |
| | help="do not pop up editor before writing output", |
| | ) |
| | parser.add_argument("--precision", default="3", help="number of digits of precision, default=3") |
| | parser.add_argument( |
| | "--translate_drill", |
| | action="store_true", |
| | help="translate drill cycles G81, G82, G83 into G0/G1 movements (default)", |
| | ) |
| | parser.add_argument( |
| | "--no-translate_drill", |
| | action="store_true", |
| | help="do not translate drill cycles G81, G82, G83 into G0/G1 movements", |
| | ) |
| | parser.add_argument( |
| | "--preamble", help='set commands to be issued before the first command, default=""' |
| | ) |
| | parser.add_argument( |
| | "--postamble", help='set commands to be issued after the last command, default="M5\\n"' |
| | ) |
| | parser.add_argument("--tool-change", action="store_true", help="Insert M6 for all tool changes") |
| | parser.add_argument( |
| | "--wait-for-spindle", |
| | type=int, |
| | default=3, |
| | help="Wait for spindle to reach desired speed after M3 or M4, default=0", |
| | ) |
| | parser.add_argument( |
| | "--return-to", |
| | default="", |
| | help='When done, move to, e.g. --return-to="3.175, 4.702, 50.915"', |
| | ) |
| | parser.add_argument( |
| | "--bcnc", |
| | action="store_true", |
| | help="Add Job operations as bCNC block headers. \ |
| | Consider suppressing existing comments: Add argument --no-comments", |
| | ) |
| | parser.add_argument( |
| | "--no-bcnc", action="store_true", help="suppress bCNC block header output (default)" |
| | ) |
| | TOOLTIP_ARGS = parser.format_help() |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| |
|
| | |
| | PREAMBLE = """""" |
| |
|
| | |
| | POSTAMBLE = """M5 |
| | """ |
| |
|
| | |
| | |
| | |
| | MOTION_COMMANDS = ["G0", "G00", "G1", "G01", "G2", "G02", "G3", "G03"] |
| | RAPID_MOVES = ["G0", "G00"] |
| | SUPPRESS_COMMANDS = [""] |
| | COMMAND_SPACE = " " |
| | |
| | CURRENT_X = None |
| | CURRENT_Y = None |
| | CURRENT_Z = None |
| |
|
| |
|
| | def processArguments(argstring): |
| | global OUTPUT_HEADER |
| | global OUTPUT_COMMENTS |
| | global OUTPUT_FINISH |
| | global OUTPUT_PATH |
| | global OUTPUT_MARLIN_CONFIG |
| | global OUTPUT_LINE_NUMBERS |
| | global SHOW_EDITOR |
| | global PREAMBLE |
| | global POSTAMBLE |
| | global UNITS |
| | global UNIT_FEED_FORMAT |
| | global UNIT_FORMAT |
| | global TRANSLATE_DRILL_CYCLES |
| | global OUTPUT_TOOL_CHANGE |
| | global SPINDLE_WAIT |
| | global RETURN_TO |
| | global OUTPUT_BCNC |
| | global PRECISION |
| |
|
| | try: |
| | args = parser.parse_args(shlex.split(argstring)) |
| | if args.no_header: |
| | OUTPUT_HEADER = False |
| | if args.header: |
| | OUTPUT_HEADER = True |
| | if args.no_comments: |
| | OUTPUT_COMMENTS = False |
| | if args.comments: |
| | OUTPUT_COMMENTS = True |
| | if args.no_finish_comments: |
| | OUTPUT_FINISH = False |
| | if args.finish_comments: |
| | OUTPUT_FINISH = True |
| | if args.no_path_comments: |
| | OUTPUT_PATH = False |
| | if args.path_comments: |
| | OUTPUT_PATH = True |
| | if args.no_marlin_config: |
| | OUTPUT_MARLIN_CONFIG = False |
| | if args.marlin_config: |
| | OUTPUT_MARLIN_CONFIG = True |
| | if args.no_line_numbers: |
| | OUTPUT_LINE_NUMBERS = False |
| | if args.line_numbers: |
| | OUTPUT_LINE_NUMBERS = True |
| | if args.no_show_editor: |
| | SHOW_EDITOR = False |
| | if args.show_editor: |
| | SHOW_EDITOR = True |
| | if args.preamble is not None: |
| | PREAMBLE = args.preamble.replace("\\n", "\n") |
| | if args.postamble is not None: |
| | POSTAMBLE = args.postamble.replace("\\n", "\n") |
| | if args.no_translate_drill: |
| | TRANSLATE_DRILL_CYCLES = False |
| | if args.translate_drill: |
| | TRANSLATE_DRILL_CYCLES = True |
| | if args.tool_change: |
| | OUTPUT_TOOL_CHANGE = True |
| | if args.return_to: |
| | RETURN_TO = args.return_to |
| | if RETURN_TO.find(",") == -1: |
| | RETURN_TO = None |
| | print("--return-to coordinates must be specified as:") |
| | print('--return-to "x.n,y.n,z.n"') |
| | if args.bcnc: |
| | OUTPUT_BCNC = True |
| | if args.no_bcnc: |
| | OUTPUT_BCNC = False |
| | SPINDLE_WAIT = args.wait_for_spindle |
| | PRECISION = args.precision |
| |
|
| | except Exception as e: |
| | return False |
| |
|
| | return True |
| |
|
| |
|
| | |
| | def dump(obj): |
| | for attr in dir(obj): |
| | try: |
| | if attr.startswith("__"): |
| | continue |
| | print(">" + attr + "<") |
| | attr_text = "%s = %s" % (attr, getattr(obj, attr)) |
| | if attr in ["HorizFeed", "VertFeed"]: |
| | print("==============\n", attr_text) |
| | if "mm/s" in attr_text: |
| | print("===> metric values <===") |
| | except Exception: |
| | |
| | pass |
| |
|
| |
|
| | def export(objectslist, filename, argstring): |
| | if not processArguments(argstring): |
| | return None |
| |
|
| | global UNITS |
| | global UNIT_FORMAT |
| | global UNIT_FEED_FORMAT |
| | global MOTION_MODE |
| | global SUPPRESS_COMMANDS |
| |
|
| | print("Post Processor: " + __name__ + " postprocessing...") |
| | gcode = "" |
| |
|
| | |
| | if OUTPUT_HEADER: |
| | gcode += linenumber() + "(Exported by FreeCAD)\n" |
| | gcode += linenumber() + "(Post Processor: " + __name__ |
| | gcode += ".py, version: " + Revised + ")\n" |
| | gcode += linenumber() + "(Output Time:" + str(datetime.now()) + ")\n" |
| |
|
| | |
| | if TRANSLATE_DRILL_CYCLES: |
| | SUPPRESS_COMMANDS += ["G80", "G98", "G99"] |
| |
|
| | |
| | if OUTPUT_COMMENTS: |
| | gcode += linenumber() + "(Begin preamble)\n" |
| | for line in PREAMBLE.splitlines(): |
| | gcode += linenumber() + line + "\n" |
| |
|
| | |
| | |
| | if OUTPUT_COMMENTS: |
| | gcode += linenumber() + "(Default Configuration)\n" |
| | gcode += linenumber() + MOTION_MODE + "\n" |
| | gcode += linenumber() + UNITS + "\n" |
| | gcode += linenumber() + WORK_PLANE + "\n" |
| |
|
| | for obj in objectslist: |
| | |
| | |
| | |
| | |
| | if not hasattr(obj, "Path"): |
| | print( |
| | "The object " + obj.Name + " is not a path. Please select only path and Compounds." |
| | ) |
| | return |
| |
|
| | |
| | if not PathUtil.activeForOp(obj): |
| | continue |
| |
|
| | |
| | if OUTPUT_BCNC: |
| | gcode += linenumber() + "(Block-name: " + obj.Label + ")\n" |
| | gcode += linenumber() + "(Block-expand: 0)\n" |
| | gcode += linenumber() + "(Block-enable: 1)\n" |
| | if OUTPUT_COMMENTS: |
| | gcode += linenumber() + "(Begin operation: " + obj.Label + ")\n" |
| | for line in PRE_OPERATION.splitlines(True): |
| | gcode += linenumber() + line |
| |
|
| | |
| | coolantMode = PathUtil.coolantModeForOp(obj) |
| |
|
| | |
| | if OUTPUT_COMMENTS: |
| | if not coolantMode == "None": |
| | gcode += linenumber() + "(Coolant On:" + coolantMode + ")\n" |
| | if coolantMode == "Flood": |
| | gcode += linenumber() + "M8\n" |
| | if coolantMode == "Mist": |
| | gcode += linenumber() + "M7\n" |
| |
|
| | |
| | gcode += parse(obj) |
| |
|
| | |
| | if OUTPUT_COMMENTS and OUTPUT_FINISH: |
| | gcode += linenumber() + "(Finish operation: " + obj.Label + ")\n" |
| | for line in POST_OPERATION.splitlines(True): |
| | gcode += linenumber() + line |
| |
|
| | |
| | if not coolantMode == "None": |
| | if OUTPUT_COMMENTS: |
| | gcode += linenumber() + "(Coolant Off:" + coolantMode + ")\n" |
| | gcode += linenumber() + "M9\n" |
| |
|
| | |
| | if OUTPUT_BCNC: |
| | gcode += linenumber() + "(Block-name: post_amble)\n" |
| | gcode += linenumber() + "(Block-expand: 0)\n" |
| | gcode += linenumber() + "(Block-enable: 1)\n" |
| | if OUTPUT_COMMENTS: |
| | gcode += linenumber() + "(Begin postamble)\n" |
| | for line in POSTAMBLE.splitlines(): |
| | gcode += linenumber() + line + "\n" |
| |
|
| | |
| | if RETURN_TO: |
| | first_comma = RETURN_TO.find(",") |
| | last_comma = RETURN_TO.rfind(",") |
| | ref_X = " X" + RETURN_TO[0:first_comma].strip() |
| |
|
| | |
| | if last_comma != first_comma: |
| | ref_Z = " Z" + RETURN_TO[last_comma + 1 :].strip() |
| | ref_Y = " Y" + RETURN_TO[first_comma + 1 : last_comma].strip() |
| | else: |
| | ref_Z = "" |
| | ref_Y = " Y" + RETURN_TO[first_comma + 1 :].strip() |
| |
|
| | gcode += linenumber() + "G0" + ref_X + ref_Y + ref_Z + "\n" |
| |
|
| | |
| | if OUTPUT_MARLIN_CONFIG: |
| | gcode += linenumber() + "(Marlin 2.x Configuration)\n" |
| | gcode += linenumber() + "(The following should be enabled in)\n" |
| | gcode += linenumber() + "(the configuration files of Marlin 2.x)\n" |
| | gcode += linenumber() + "(#define ARC_SUPPORT)\n" |
| | gcode += linenumber() + "(#define CNC_COORDINATE_SYSTEMS)\n" |
| | gcode += linenumber() + "(#define PAREN_COMMENTS)\n" |
| | gcode += linenumber() + "(#define GCODE_MOTION_MODES)\n" |
| | gcode += linenumber() + "(#define G0_FEEDRATE)\n" |
| | gcode += linenumber() + "(define VARIABLE_G0_FEEDRATE)\n" |
| |
|
| | |
| | if FreeCAD.GuiUp and SHOW_EDITOR: |
| | dia = PostUtils.GCodeEditorDialog() |
| | dia.editor.setPlainText(gcode) |
| | result = dia.exec_() |
| | if result: |
| | final = dia.editor.toPlainText() |
| | else: |
| | final = gcode |
| | else: |
| | final = gcode |
| |
|
| | print("Done postprocessing.") |
| |
|
| | |
| | if not filename == "-": |
| | gfile = pyopen(filename, "w") |
| | gfile.write(final) |
| | gfile.close() |
| |
|
| | return final |
| |
|
| |
|
| | def linenumber(): |
| | if not OUTPUT_LINE_NUMBERS: |
| | return "" |
| | global LINENR |
| | global LINEINCR |
| | LINENR += LINEINCR |
| | return "N" + str(LINENR) + " " |
| |
|
| |
|
| | def format_outlist(strTable): |
| | |
| | global COMMAND_SPACE |
| | s = "" |
| | for w in strTable: |
| | s += w + COMMAND_SPACE |
| | return s.strip() |
| |
|
| |
|
| | def parse(pathobj): |
| | global DRILL_RETRACT_MODE |
| | global MOTION_MODE |
| | global CURRENT_X |
| | global CURRENT_Y |
| | global CURRENT_Z |
| |
|
| | out = "" |
| | lastcommand = None |
| | precision_string = "." + str(PRECISION) + "f" |
| |
|
| | params = [ |
| | "X", |
| | "Y", |
| | "Z", |
| | "A", |
| | "B", |
| | "C", |
| | "U", |
| | "V", |
| | "W", |
| | "I", |
| | "J", |
| | "K", |
| | "F", |
| | "S", |
| | "T", |
| | "Q", |
| | "R", |
| | "L", |
| | "P", |
| | ] |
| |
|
| | if hasattr(pathobj, "Group"): |
| | if OUTPUT_COMMENTS: |
| | out += linenumber() + "(Compound: " + pathobj.Label + ")\n" |
| | for p in pathobj.Group: |
| | out += parse(p) |
| | return out |
| |
|
| | else: |
| | |
| | if not hasattr(pathobj, "Path"): |
| | return out |
| |
|
| | if OUTPUT_COMMENTS and OUTPUT_PATH: |
| | out += linenumber() + "(Path: " + pathobj.Label + ")\n" |
| |
|
| | for c in PathUtils.getPathWithPlacement(pathobj).Commands: |
| | outlist = [] |
| | command = c.Name |
| | outlist.append(command) |
| | |
| | |
| |
|
| | |
| | if MODAL: |
| | if command == lastcommand: |
| | outlist.pop(0) |
| |
|
| | |
| | for param in params: |
| | if param in c.Parameters: |
| | if param == "F": |
| | if command not in RAPID_MOVES: |
| | feedRate = Units.Quantity(c.Parameters["F"], FreeCAD.Units.Velocity) |
| | if feedRate.getValueAs(UNIT_FEED_FORMAT) > 0.0: |
| | outlist.append( |
| | param |
| | + format( |
| | float(feedRate.getValueAs(UNIT_FEED_FORMAT)), |
| | precision_string, |
| | ) |
| | ) |
| | elif param in ["T", "H", "D", "S", "P", "L"]: |
| | outlist.append(param + str(c.Parameters[param])) |
| | elif param in ["A", "B", "C"]: |
| | outlist.append(param + format(c.Parameters[param], precision_string)) |
| | |
| | else: |
| | pos = Units.Quantity(c.Parameters[param], FreeCAD.Units.Length) |
| | outlist.append( |
| | param + format(float(pos.getValueAs(UNIT_FORMAT)), precision_string) |
| | ) |
| |
|
| | |
| | lastcommand = command |
| |
|
| | |
| | if command in MOTION_COMMANDS: |
| | if "X" in c.Parameters: |
| | CURRENT_X = Units.Quantity(c.Parameters["X"], FreeCAD.Units.Length) |
| | if "Y" in c.Parameters: |
| | CURRENT_Y = Units.Quantity(c.Parameters["Y"], FreeCAD.Units.Length) |
| | if "Z" in c.Parameters: |
| | CURRENT_Z = Units.Quantity(c.Parameters["Z"], FreeCAD.Units.Length) |
| |
|
| | if command in ("G98", "G99"): |
| | DRILL_RETRACT_MODE = command |
| |
|
| | if TRANSLATE_DRILL_CYCLES: |
| | if command in ("G81", "G82", "G83"): |
| | out += drill_translate(outlist, command, c.Parameters) |
| | |
| | outlist = [] |
| |
|
| | if SPINDLE_WAIT > 0: |
| | if command in ("M3", "M03", "M4", "M04"): |
| | out += linenumber() + format_outlist(outlist) + "\n" |
| | |
| | out += linenumber() |
| | out += format_outlist(["G4", "S%s" % SPINDLE_WAIT]) |
| | out += "\n" |
| | outlist = [] |
| |
|
| | |
| | if command in ("M6", "M06"): |
| | if OUTPUT_COMMENTS: |
| | out += linenumber() + "(Begin toolchange)\n" |
| | if OUTPUT_TOOL_CHANGE: |
| | for line in TOOL_CHANGE.splitlines(True): |
| | out += linenumber() + line |
| | if not OUTPUT_TOOL_CHANGE and OUTPUT_COMMENTS: |
| | outlist[0] = "(" + outlist[0] |
| | outlist[-1] = outlist[-1] + ")" |
| | if not OUTPUT_TOOL_CHANGE and not OUTPUT_COMMENTS: |
| | outlist = [] |
| |
|
| | if command == "message": |
| | if OUTPUT_COMMENTS: |
| | outlist.pop(0) |
| | else: |
| | out = [] |
| |
|
| | if command in SUPPRESS_COMMANDS: |
| | outlist[0] = "(" + outlist[0] |
| | outlist[-1] = outlist[-1] + ")" |
| |
|
| | |
| | if not OUTPUT_COMMENTS: |
| | tmplist = [] |
| | list_index = 0 |
| | while list_index < len(outlist): |
| | left_index = outlist[list_index].find("(") |
| | if left_index == -1: |
| | tmplist.append(outlist[list_index]) |
| | else: |
| | right_index = outlist[list_index].find(")") |
| | comment_area = outlist[list_index][left_index : right_index + 1] |
| | line_minus_comment = outlist[list_index].replace(comment_area, "").strip() |
| | if line_minus_comment: |
| | |
| | tmplist.append(line_minus_comment) |
| | list_index += 1 |
| | |
| | outlist = tmplist |
| |
|
| | |
| | if len(outlist) >= 1: |
| | out += linenumber() + format_outlist(outlist) + "\n" |
| |
|
| | return out |
| |
|
| |
|
| | |
| | |
| | |
| | |
| | |
| | def drill_translate(outlist, cmd, params): |
| | global DRILL_RETRACT_MODE |
| | global MOTION_MODE |
| | global CURRENT_X |
| | global CURRENT_Y |
| | global CURRENT_Z |
| | global UNITS |
| | global UNIT_FORMAT |
| | global UNIT_FEED_FORMAT |
| |
|
| | class Drill: |
| | gcode = "" |
| |
|
| | strFormat = "." + str(PRECISION) + "f" |
| |
|
| | if OUTPUT_COMMENTS: |
| | outlist[0] = "(" + outlist[0] |
| | outlist[-1] = outlist[-1] + ")" |
| | Drill.gcode += linenumber() + format_outlist(outlist) + "\n" |
| |
|
| | |
| | |
| | drill_X = Units.Quantity(params["X"], FreeCAD.Units.Length) |
| | drill_Y = Units.Quantity(params["Y"], FreeCAD.Units.Length) |
| | drill_Z = Units.Quantity(params["Z"], FreeCAD.Units.Length) |
| | drill_R = Units.Quantity(params["R"], FreeCAD.Units.Length) |
| | drill_F = Units.Quantity(params["F"], FreeCAD.Units.Velocity) |
| | if cmd == "G82": |
| | drill_DwellTime = params["P"] |
| | elif cmd == "G83": |
| | drill_Step = Units.Quantity(params["Q"], FreeCAD.Units.Length) |
| |
|
| | |
| | if drill_R < drill_Z: |
| | Drill.gcode += linenumber() + "(drill cycle error: R less than Z )\n" |
| | return Drill.gcode |
| |
|
| | |
| | if DRILL_RETRACT_MODE == "G98" and CURRENT_Z > drill_R: |
| | RETRACT_Z = CURRENT_Z |
| | else: |
| | RETRACT_Z = drill_R |
| |
|
| | |
| | def rapid_Z_to(new_Z): |
| | Drill.gcode += linenumber() + "G0 Z" |
| | Drill.gcode += format(float(new_Z.getValueAs(UNIT_FORMAT)), strFormat) + "\n" |
| |
|
| | def feed_Z_to(new_Z): |
| | Drill.gcode += linenumber() + "G1 Z" |
| | Drill.gcode += format(float(new_Z.getValueAs(UNIT_FORMAT)), strFormat) + " F" |
| | Drill.gcode += format(float(drill_F.getValueAs(UNIT_FEED_FORMAT)), ".2f") + "\n" |
| |
|
| | |
| | if CURRENT_Z < RETRACT_Z: |
| | rapid_Z_to(RETRACT_Z) |
| |
|
| | |
| | Drill.gcode += linenumber() + "G0 X" |
| | Drill.gcode += format(float(drill_X.getValueAs(UNIT_FORMAT)), strFormat) + " Y" |
| | Drill.gcode += format(float(drill_Y.getValueAs(UNIT_FORMAT)), strFormat) + "\n" |
| |
|
| | |
| | rapid_Z_to(drill_R) |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | if cmd in ("G81", "G82"): |
| | feed_Z_to(drill_Z) |
| | if cmd == "G82": |
| | Drill.gcode += linenumber() + "G4 S" + str(drill_DwellTime) + "\n" |
| | |
| |
|
| | elif cmd == "G83": |
| | chip_Space = drill_Step * 0.5 |
| | next_Stop_Z = drill_R - drill_Step |
| | while next_Stop_Z >= drill_Z: |
| | feed_Z_to(next_Stop_Z) |
| |
|
| | |
| | if (next_Stop_Z - drill_Step) >= drill_Z: |
| | |
| | rapid_Z_to(drill_R) |
| | |
| | rapid_Z_to(next_Stop_Z + chip_Space) |
| | |
| | next_Stop_Z -= drill_Step |
| | elif next_Stop_Z == drill_Z: |
| | break |
| | else: |
| | |
| | rapid_Z_to(drill_R) |
| | |
| | rapid_Z_to(next_Stop_Z + chip_Space) |
| | |
| | feed_Z_to(drill_Z) |
| | break |
| | rapid_Z_to(RETRACT_Z) |
| |
|
| | return Drill.gcode |
| |
|
| |
|
| | |
| |
|
| | |
| | |
| | |
| |
|