Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Make prime line height a variable parameter #466

Merged
merged 1 commit into from
Feb 20, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 17 additions & 8 deletions macros/helpers/prime_line.cfg
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,11 @@ gcode:
{% set prime_line_length = params.LINE_LENGTH|default(printer["gcode_macro _USER_VARIABLES"].prime_line_length)|float %}
{% set prime_line_purge_distance = params.PURGE_LENGTH|default(printer["gcode_macro _USER_VARIABLES"].prime_line_purge_distance)|float %}
{% set prime_line_flowrate = params.FLOWRATE|default(printer["gcode_macro _USER_VARIABLES"].prime_line_flowrate)|float %}
{% if printer["gcode_macro _USER_VARIABLES"].prime_line_height %}
{% set prime_line_height = params.LINE_HEIGHT|default(printer["gcode_macro _USER_VARIABLES"].prime_line_height)|float %}
{% else %}
{% set prime_line_height = params.LINE_HEIGHT|default(0.6)|float %}
{% endif %}

# Set internal macro vars
{% set prime_line_x, prime_line_y = printer["gcode_macro _USER_VARIABLES"].prime_line_xy|map('float') %}
Expand All @@ -19,40 +24,44 @@ gcode:
{% set max_extrude_cross_section = printer["configfile"].config["extruder"]["max_extrude_cross_section"]|float %}
{% set filament_diameter = printer["configfile"].config["extruder"]["filament_diameter"]|float %}

{% set line_height = 0.6 %}

# some more Macro parameters after retrieving defaults
{% set prime_line_x = params.START_X|default(prime_line_x)|float %}
{% set prime_line_y = params.START_Y|default(prime_line_y)|float %}
{% set prime_line_direction = params.LINE_DIRECTION|default(printer["gcode_macro _USER_VARIABLES"].prime_line_direction)|string|upper %}

{% if verbose %}
{action_respond_info("Prime line length: %.4f" % prime_line_length)}
{action_respond_info("Prime line eight: %.4f" % prime_line_height)}
{action_respond_info("prime line extrusion length: %4.f" % prime_line_purge_distance)}
{% endif %}

# We first compute the width of the prime line
{% set purge_volume = prime_line_purge_distance * 3.14159 * (filament_diameter / 2)**2 %}
{% set line_width = purge_volume / (line_height * prime_line_length) %}
{% set line_width = purge_volume / (prime_line_height * prime_line_length) %}

# Then we check that the prime line cross section will not be problematic (exceeding Klipper max_extrude_cross_section)
# or, if it's the case, we warn the user and add a correction to the length of filament to be purged
{% if (line_height * line_width) > max_extrude_cross_section %}
{% if (prime_line_height * line_width) > max_extrude_cross_section %}
{% if verbose %}
{action_respond_info("The prime_line_purge_distance of %.4f mm is too high and will exceed the max_extrude_cross_section!" % prime_line_purge_distance)}
{% endif %}
{% set prime_line_purge_distance = 0.98 * (max_extrude_cross_section * prime_line_length) / (3.14159 * (filament_diameter / 2)**2) %}
{% set purge_volume = prime_line_purge_distance * 3.14159 * (filament_diameter / 2)**2 %}
{% set line_width = purge_volume / (line_height * prime_line_length) %}
{% set line_width = purge_volume / (prime_line_height * prime_line_length) %}
{% if verbose %}
{action_respond_info("Klippain corrected the prime_line_purge_distance to %.4f mm" % prime_line_purge_distance)}
{% endif %}
{% endif %}

# We then compute the height to width ratio and validate that the prime line will not be too thin
{% if (line_height / line_width) >= 0.5 %} # TODO: validate this 1/2 ratio is good for all
{% if (prime_line_height / line_width) >= 0.5 %} # TODO: validate this 1/2 ratio is good for all
{% if verbose %}
{action_raise_error("The prime line will be too thin and will probably not stick properly to the bed. Increase its purge distance or decrease its length! Aborting...")}
{% endif %}
{% endif %}

# Finally we compute the speed to get the correct flowrate for the prime line
{% set speed = (prime_line_flowrate / (line_height * line_width)) * 60 |float %}
{% set speed = (prime_line_flowrate / (prime_line_height * line_width)) * 60 |float %}

{% if klippain_ercf_enabled %}
{% if printer.ercf.enabled %}
Expand All @@ -78,7 +87,7 @@ gcode:
# Starting position
G90
G0 X{prime_line_x} Y{prime_line_y} F{St}
G1 Z{line_height} F{Sz|int / 2}
G1 Z{prime_line_height} F{Sz|int / 2}

# Add pressure in the nozzle
G92 E0
Expand Down
1 change: 1 addition & 0 deletions user_templates/variables.cfg
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@ variable_prime_line_direction: "X" # can also be set to "Y"
variable_prime_line_length: 40 # length of the prime line on the bed (in mm)
variable_prime_line_purge_distance: 30 # length of filament to purge (in mm)
variable_prime_line_flowrate: 10 # mm3/s used for the prime line
variable_prime_line_height: 0.6 # mm, used for actual cross section computation

## Park position used when pause, end_print, etc...
variable_park_position_xy: -1, -1
Expand Down