Skip to content

Instantly share code, notes, and snippets.

@Otann
Created May 26, 2026 17:05
Show Gist options
  • Select an option

  • Save Otann/e7b47e709a4b37d6cb4cc51d73ef7233 to your computer and use it in GitHub Desktop.

Select an option

Save Otann/e7b47e709a4b37d6cb4cc51d73ef7233 to your computer and use it in GitHub Desktop.
Purge on print start
[gcode_macro PRINT_START]
description: A wrapper that initializes a toolchanger by homing and then passes to real one
gcode:
M117 Pre-homing to init toolchanger
G28
{% set target_bed = params.BED|int %}
{% set target_extruder = params.EXTRUDER|int %}
{% set target_chamber = params.CHAMBER|default("40")|int %}
{% set tool_n = params.TOOL|default("0") %}
{% set t0_temp = params.T0_TEMP|default(0)|int %}
{% set t1_temp = params.T1_TEMP|default(0)|int %}
{% set t2_temp = params.T2_TEMP|default(0)|int %}
M117 Passing over to _PRINT_START (_PRINT_START BED={target_bed} EXTRUDER={target_extruder} CHAMBER={target_chamber} TOOL={tool_n} T0_TEMP={t0_temp} T1_TEMP={t1_temp} T2_TEMP={t2_temp})
_PRINT_START BED={target_bed} EXTRUDER={target_extruder} CHAMBER={target_chamber} TOOL={tool_n} T0_TEMP={t0_temp} T1_TEMP={t1_temp} T2_TEMP={t2_temp}
[gcode_macro _PREHEAT_HEAD_TO_TEMP]
gcode:
{% set tool_temp = params.TARGET|default(0)|int %}
{% set tool_index = params.TOOL_INDEX|int %}
{% set tool_name = printer.toolchanger.tool_names[tool_index] %}
{% set tool = printer[tool_name] %}
{% set tool_extruder = tool['extruder'] %}
{% if tool_temp != 0 %}
M117 Preheating {tool_name} to {tool_temp}
SET_HEATER_TEMPERATURE HEATER={tool_extruder} TARGET={tool_temp}
{% endif %}
[gcode_macro _PURGE_DOCK_HEAD]
variable_length: 25
gcode:
{% set current_tool = printer.toolchanger.tool_number %}
{% set tool_index = params.TOOL_INDEX|int %}
# Avoid purging curent tool, as it is not in the dock
{% if tool_index == current_tool %}
M117 Not purging current tool T{tool_index}
{% else %}
{% set tool_temp = params.TARGET %}
{% set purge_length = params.LENGTH|default(length)|int %}
{% set tool_name = printer.toolchanger.tool_names[tool_index] %}
{% set tool = printer[tool_name] %}
{% set tool_extruder = tool['extruder'] %}
M117 Purging {tool_name} before printing at {tool_temp}
TEMPERATURE_WAIT SENSOR={tool_extruder} MINIMUM={tool_temp} ; for selected tool
ACTIVATE_EXTRUDER EXTRUDER={tool_extruder}
G91
G1 E{purge_length} F100
# cool down to prevent more oozing
# {% set temp_wait = tool_temp - 20 %}
# SET_HEATER_TEMPERATURE HEATER={tool_extruder} TARGET={t0_temp}
{% endif %}
[gcode_macro _PRINT_START]
description: A real implementation with toolchanger initialized
gcode:
{% set target_bed = params.BED|int %}
{% set target_extruder = params.EXTRUDER|int %}
{% set target_chamber = params.CHAMBER|default("40")|int %}
{% set tool_n = params.TOOL|default("0") %}
{% set t0_temp = params.T0_TEMP|default(0)|int %}
{% set t1_temp = params.T1_TEMP|default(0)|int %}
{% set t2_temp = params.T2_TEMP|default(0)|int %}
### From ktc-easy
STOP_CRASH_DETECTION
# If there is a heatsoak going, cancel it so it won't cause anything unexpected later
DISABLE_HEAT_SOAK
# Even though there is a heatsoak routine, save some time and start heating the bed early
M117 Preparing for the print, preheating bed to {target_bed}
SET_HEATER_TEMPERATURE HEATER=heater_bed TARGET={target_bed}
# Preheat all tools too, if their temp was requested
_PREHEAT_HEAD_TO_TEMP TOOL_INDEX=0 TARGET={t0_temp}
_PREHEAT_HEAD_TO_TEMP TOOL_INDEX=1 TARGET={t1_temp}
# Calibrating frame
# M117 Calibrating frame (QGL -> re-home -> Bed Mesh)
G90 ; Absolut position
_LED_STATUS_PREPARING ; Add visuals
M117 Quad Gantry Leveling
QUAD_GANTRY_LEVEL ; Calibrage gantry with clean nozzle
G28 ; Home again with clean nozzle for better z precision
G90 ; Absolut position
_LED_STATUS_PREPARING ; Set status again after re-homing
M117 Bed Mesh Calibration
BED_MESH_CLEAR ; Discard old bed mesh and clean nozzle
BED_MESH_CALIBRATE ADAPTIVE=1 ; This is done after cleaning nozzle and gantry calibration
M117 Switching to T{tool_n}
SELECT_TOOL T={tool_n}
# Set temperature for the requested tool
{% set target_tool = printer['tool T' + tool_n] %}
{% set target_heater = target_tool['extruder'] %}
M117 Setting target temperature for {target_tool['name']}
SET_HEATER_TEMPERATURE HEATER={target_heater} TARGET={target_extruder}
# Purge tools other than main, if temp was requested
_PURGE_DOCK_HEAD TOOL_INDEX=0 TARGET={t0_temp}
_PURGE_DOCK_HEAD TOOL_INDEX=1 TARGET={t1_temp}
# After purging activate back target extruder
ACTIVATE_EXTRUDER EXTRUDER={target_heater}
# Wait for target tool's target temperature at safe location
_BUCKET
M117 Waiting for printing temperatures (bed: {target_bed}c, extruder: {target_extruder}c)
TEMPERATURE_WAIT SENSOR=heater_bed MINIMUM={target_bed}
TEMPERATURE_WAIT SENSOR={target_heater} MINIMUM={target_extruder} ; for selected tool
### From ktc-easy
START_CRASH_DETECTION
# Main tool is purged to the bucket right before print starts
{% set clean_macro = printer['gcode_macro _CLEAN_NOZZLE'] %}
{% set clean_retract = clean_macro.retract_hot + clean_macro.retract_cool %}
G92 E0 ; zero the extruder
G1 E{clean_retract} F400 ; that was pulled dufing _CLEAN_NOZZLE
G1 E100 F400 ; Instead of purge
G90 ; switch to absolute coordinates before printing
_SCRUB_NOZZLE
_LED_STATUS_PRINTING
M117 Starting the print
# M118 Starting the print
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment