[gcode_macro LINE_PURGE] description: A purge macro that adapts to be near your actual printed objects gcode: # Get relevant printer params {% set travel_speed = (printer.toolhead.max_velocity) * 60 | float %} {% set cross_section = printer.configfile.settings.extruder.max_extrude_cross_section | float %} # Use firmware retraction if it is defined {% if printer.firmware_retraction is defined %} {% set RETRACT = G10 | string %} {% set UNRETRACT = G11 | string %} {% else %} {% set RETRACT = 'G1 E-.5 F2100' | string %} {% set UNRETRACT = 'G1 E.5 F2100' | string %} {% endif %} # Get purge settings from _Kamp_Settings {% set verbose_enable = printer["gcode_macro _KAMP_Settings"].verbose_enable | abs %} {% set purge_height = printer["gcode_macro _KAMP_Settings"].purge_height | float %} {% set tip_distance = printer["gcode_macro _KAMP_Settings"].tip_distance | float %} {% set purge_margin = printer["gcode_macro _KAMP_Settings"].purge_margin | float %} {% set purge_amount = printer["gcode_macro _KAMP_Settings"].purge_amount | float %} {% set flow_rate = printer["gcode_macro _KAMP_Settings"].flow_rate | float %} # Calculate purge origins and centers from objects {% set all_points = printer.exclude_object.objects | map(attribute='polygon') | sum(start=[]) %} # Get all object points {% set purge_x_min = (all_points | map(attribute=0) | min | default(0)) %} # Object x min {% set purge_x_max = (all_points | map(attribute=0) | max | default(0)) %} # Object x max {% set purge_y_min = (all_points | map(attribute=1) | min | default(0)) %} # Object y min {% set purge_y_max = (all_points | map(attribute=1) | max | default(0)) %} # Object y max {% set purge_x_center = ([((purge_x_max + purge_x_min) / 2) - (purge_amount / 2), 0] | max) %} # Create center point of purge line relative to print on X axis {% set purge_y_center = ([((purge_y_max + purge_y_min) / 2) - (purge_amount / 2), 0] | max) %} # Create center point of purge line relative to print on Y axis {% set purge_x_origin = ([purge_x_min - purge_margin, 0] | max) %} # Add margin to x min, compare to 0, and choose the larger {% set purge_y_origin = ([purge_y_min - purge_margin, 0] | max) %} # Add margin to y min, compare to 0, and choose the larger # Calculate purge speed {% set purge_move_speed = (flow_rate / 5.0) * 60 | float %} {% if cross_section < 5 %} {action_respond_info("[Extruder] max_extrude_cross_section is insufficient for purge, please set it to 5 or greater. Purge skipped.")} {% else %} {% if verbose_enable == True %} {action_respond_info("Moving filament tip {}mms".format( (tip_distance), )) } {% endif %} {% if printer.firmware_retraction is defined %} {action_respond_info("KAMP purge is using firmware retraction.")} {% else %} {action_respond_info("KAMP purge is not using firmware retraction, it is recommended to configure it.")} {% endif %} {% if purge_y_origin > 0 %} {action_respond_info("KAMP purge starting at {}, {} and purging {}mm of filament, requested flow rate is {}mm/s3.".format( (purge_x_center), (purge_y_origin), (purge_amount), (flow_rate), )) } {% else %} {action_respond_info("KAMP purge starting at {}, {} and purging {}mm of filament, requested flow rate is {}mm/s3.".format( (purge_x_origin), (purge_y_center), (purge_amount), (flow_rate), )) } {% endif %} SAVE_GCODE_STATE NAME=Prepurge_State # Create gcode state {% if purge_y_origin > 0 %} # If there's room on Y, purge along X axis in front of print area G92 E0 # Reset extruder G0 F{travel_speed} # Set travel speed G90 # Absolute positioning G0 X{purge_x_center} Y{purge_y_origin} # Move to purge position G0 Z{purge_height} # Move to purge Z height M83 # Relative extrusion mode G1 E{tip_distance} F{purge_move_speed} # Move filament tip G1 X{purge_x_center + purge_amount} E{purge_amount} F{purge_move_speed} # Purge line {RETRACT} # Retract G0 X{purge_x_center + purge_amount + 10} F{travel_speed} # Rapid move to break string G92 E0 # Reset extruder distance M82 # Absolute extrusion mode G0 Z{purge_height * 2} F{travel_speed} # Z hop {% else %} # If there's room on X, purge along Y axis to the left of print area G92 E0 # Reset extruder G0 F{travel_speed} # Set travel speed G90 # Absolute positioning G0 X{purge_x_origin} Y{purge_y_center} # Move to purge position G0 Z{purge_height} # Move to purge Z height M83 # Relative extrusion mode G1 E{tip_distance} F{purge_move_speed} # Move filament tip G1 Y{purge_y_center + purge_amount} E{purge_amount} F{purge_move_speed} # Purge line {RETRACT} # Retract G0 Y{purge_y_center + purge_amount + 10} F{travel_speed} # Rapid move to break string G92 E0 # Reset extruder distance M82 # Absolute extrusion mode G0 Z{purge_height * 2} F{travel_speed} # Z hop {% endif %} RESTORE_GCODE_STATE NAME=Prepurge_State # Restore gcode state {% endif %}