TAM‑CNC Rectangle Offset G41 Generator

Rectangle G-code Generator (G41 Offset)

Rectangle Diagram

This code is similar to the Rectangle code above, but uses G41 to offset the tool according to the tool table.

Enter your parameters below to generate G-code for a simple rectangle.

import js from pyscript import display def generate_rectangle_g41_gcode(event): try: tool_no = js.document.getElementById("r41-tool-no").value tool_dia = float(js.document.getElementById("r41-tool-dia").value) tool_rad = tool_dia / 2.0 wrk_ofset = js.document.getElementById("r41-work-offset").value spdle_rpm = js.document.getElementById("r41-spindle-rpm").value x_pos = float(js.document.getElementById("r41-x-position").value) y_pos = float(js.document.getElementById("r41-y-position").value) z_rapid = float(js.document.getElementById("r41-z-rapid").value) z_start = float(js.document.getElementById("r41-z-start").value) z_cut = float(js.document.getElementById("r41-z-cut").value) nosteps = int(js.document.getElementById("r41-nosteps").value) x_dist = float(js.document.getElementById("r41-x-distance").value) x_cutl = x_dist / 2.0 y_dist = float(js.document.getElementById("r41-y-distance").value) y_cutl = y_dist / 2.0 con_rad = float(js.document.getElementById("r41-corner-radius").value) lead_in = float(js.document.getElementById("r41-lead-in-radius").value) feedrate = float(js.document.getElementById("r41-feed-rate").value) gcode_lines = [] gcode_lines.append("%") # Start of program gcode_lines.append("M97 P8000") gcode_lines.append("M05") gcode_lines.append(f"T{tool_no} M06 ({tool_dia}mm Cutter)") gcode_lines.append(f"M03 P{spdle_rpm}") gcode_lines.append(f"G{wrk_ofset}") gcode_lines.append("G40") gcode_lines.append("G98 G17") gcode_lines.append(f"G00 X{x_pos:.2f} Y{y_cutl + lead_in:.2f}") gcode_lines.append(f"G{wrk_ofset} G00 Z{z_rapid} G43 H{tool_no} M08") gcode_lines.append(f"G01 Z{z_start:.2f} F{feedrate/2:.2f}") gcode_lines.append(f"M97 P201 L{nosteps}") gcode_lines.append(f"G01 Z{z_start:.2f} F{feedrate/2:.2f}") gcode_lines.append(f"G00 Z{z_rapid} M09") gcode_lines.append("M05") gcode_lines.append("M97 P8000") gcode_lines.append("M30") gcode_lines.append("\nN201") gcode_lines.append(f"G91 G01 Z-{z_cut:.2f} F{feedrate/2:.2f}") gcode_lines.append("G90") gcode_lines.append(f"G01 G41 D{tool_no} X{x_pos - lead_in:.2f} F{feedrate:.2f}") gcode_lines.append(f"G03 X{x_pos:.2f} Y{y_cutl:.2f} R{lead_in:.2f}") gcode_lines.append(f"G01 X{x_cutl - con_rad:.2f} Y{y_cutl:.2f}") gcode_lines.append(f"G02 X{x_cutl:.2f} Y{y_cutl - con_rad:.2f} R{con_rad:.2f}") gcode_lines.append(f"G01 X{x_cutl:.2f} Y-{y_cutl - con_rad:.2f}") gcode_lines.append(f"G02 X{x_cutl - con_rad:.2f} Y-{y_cutl:.2f} R{con_rad:.2f}") gcode_lines.append(f"G01 X-{x_cutl - con_rad:.2f} Y-{y_cutl:.2f}") gcode_lines.append(f"G02 X-{x_cutl:.2f} Y-{y_cutl - con_rad:.2f} R{con_rad:.2f}") gcode_lines.append(f"G01 Y{y_cutl - con_rad:.2f}") gcode_lines.append(f"G02 X-{x_cutl - con_rad:.2f} Y{y_cutl:.2f} R{con_rad:.2f}") gcode_lines.append(f"G01 X{x_pos:.2f} Y{y_cutl:.2f}") gcode_lines.append(f"G03 X{x_pos + lead_in:.2f} Y{y_cutl + lead_in:.2f} R{lead_in:.2f}") gcode_lines.append(f"G01 G40 X{x_pos:.2f}") gcode_lines.append("M99") gcode_lines.append("\nN8000") gcode_lines.append("G00 G90 M09") gcode_lines.append("G53 G00 G40 Z0") gcode_lines.append("G53 G00 G40 X0 Y0") gcode_lines.append("M01") # gcode_lines.append("M99") gcode_lines.append("%") output_element = js.document.querySelector("#r41-gcode-output pre code") output_element.innerText = "\n".join(gcode_lines) except Exception as e: output_element = js.document.querySelector("#r41-gcode-output pre code") output_element.innerText = f"Error generating G-code: {str(e)}\nPlease check your input values." # Placeholder for the function definition itself, as py-click handles the event. pass















Generated G-code: