Skip to content

Commit

Permalink
start_end: Follow-up from PRINT_START split
Browse files Browse the repository at this point in the history
  • Loading branch information
jschuh committed May 24, 2023
1 parent fc6672e commit a7c928a
Show file tree
Hide file tree
Showing 4 changed files with 80 additions and 62 deletions.
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -228,6 +228,7 @@ filename: ~/printer_data/variables.cfg # UPDATE THIS FOR YOUR PATH!!!
[virtual_sdcard]
path: ~/gcode_files # UPDATE THIS FOR YOUR PATH!!!
on_error_gcode: CANCEL_PRINT
[display_status]
```
Expand Down
3 changes: 2 additions & 1 deletion globals.cfg
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,8 @@ gcode:
"pause_resume" : None,
"respond" : None,
"save_variables" : None,
"virtual_sdcard" : None
"virtual_sdcard" :
("on_error_gcode", "CANCEL_PRINT")
} %}
{% set custom_error = {
"start_extruder_set_target_before_level" :
Expand Down
4 changes: 3 additions & 1 deletion pause_resume_cancel.cfg
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,9 @@ gcode:
SAVE_GCODE_STATE NAME=_KM_PAUSE_OVERRIDE_STATE
_KM_PAUSE_BASE
M83
G1 E{'%.4f' % -E} F{km.load_speed}
{% if printer.extruder.can_extrude %}
G1 E{'%.4f' % -E} F{km.load_speed}
{% endif %}
PARK P=2{% for k in params|select("in", "XYZ") %}
{' '~k~'="'~params[k]~'"'}
{% endfor %}
Expand Down
134 changes: 74 additions & 60 deletions start_end.cfg
Original file line number Diff line number Diff line change
Expand Up @@ -30,10 +30,7 @@ gcode:
CHECK_KM_CONFIG # Need this in case startup errors were missed.
SET_GCODE_VARIABLE MACRO=_print_end_inner VARIABLE=cancelled VALUE="{False}"
_KM_APPLY_PRINT_OFFSET RESET=1
{% set settings = printer["gcode_macro print_start_set"].settings %}
{% if 'PRINT_START_PHASE' in settings %}
{ action_raise_error("Error in PRINT_START_PHASE: init") }
{% endif %}
_PRINT_START_PHASE_CHECK PHASE=none
{% set km = printer["gcode_macro _km_globals"] %}

{% if not params.BED %}
Expand Down Expand Up @@ -68,25 +65,23 @@ description: Inserted by slicer at start of print. Handles the bed and chamber
heating phases and ends when both are stabilized at their target temperatures.
Usage: See PRINT_START.
gcode:
{% set settings = printer["gcode_macro print_start_set"].settings %}
{% if settings.PRINT_START_PHASE != "preheat" %}
{ action_raise_error("Error in PRINT_START_PHASE: %s" %
(settings.PRINT_START_PHASE,)) }
{% endif %}
{% set BED = settings.BED|int %}
{% set EXTRUDER = settings.EXTRUDER|int %}
{% set CHAMBER = settings.CHAMBER|default(0)|int %}
# Clear the print settings after they are no longer needed.
{% set LAYERS = settings.LAYERS|default(0)|int %}
_PRINT_START_PHASE_CHECK PHASE=preheat
{% set print = printer["gcode_macro print_start_set"].print %}
{% set BED = print.BED|int %}
{% set EXTRUDER = print.EXTRUDER|int %}
{% set CHAMBER = print.CHAMBER|default(0)|int %}
{% set LAYERS = print.LAYERS|default(0)|int %}
{% set km = printer["gcode_macro _km_globals"] %}
# The bed started at no more than 0.2C below and 1.0C above the target temp.
{% set bed_at_target = (BED + 0.4 - printer.heater_bed.temperature) |
abs <= 0.6 %}
PRINT_START_SET BED_AT_TARGET={1 if bed_at_target else 0}
{% set start_level_bed_at_temp = km.start_level_bed_at_temp and
not printer.bed_mesh.profile_name %}
{% set actions_at_temp = start_level_bed_at_temp or
km.start_quad_gantry_level_at_temp or
km.start_z_tilt_adjust_at_temp %}
# The bed started at no more than 0.2C below and 1.0C above the target temp.
{% set bed_at_target = (BED + 0.4 - printer.heater_bed.temperature) |
abs <= 0.6 %}
km.start_z_tilt_adjust_at_temp or
(km.start_home_z_at_temp and not bed_at_target) %}
{% set bed_overshoot = (BED + (km.start_bed_heat_overshoot if
(BED and not bed_at_target) else 0.0),
printer.configfile.settings.heater_bed.max_temp ) | min %}
Expand Down Expand Up @@ -134,19 +129,15 @@ description: Inserted by slicer at start of print. Performs probing (including
chamber are stabilized at their target temps.
Usage: See PRINT_START.
gcode:
{% set settings = printer["gcode_macro print_start_set"].settings %}
_PRINT_START_PHASE_CHECK PHASE=probing
{% set print = printer["gcode_macro print_start_set"].print %}
{% set km = printer["gcode_macro _km_globals"] %}
{% if settings.PRINT_START_PHASE != "probing" %}
{ action_raise_error("Error in PRINT_START_PHASE: %s" %
(settings.PRINT_START_PHASE,)) }
{% endif %}

{% set MESH_MIN = settings.MESH_MIN|default(None) %}
{% set MESH_MAX = settings.MESH_MAX|default(None) %}
{% set MESH_MIN = print.MESH_MIN|default(None) %}
{% set MESH_MAX = print.MESH_MAX|default(None) %}
# Randomize the placement of the print on the bed.
{% if km.start_random_placement_max > 0 and settings.PRINT_MIN and MESH_MIN %}
{% set PRINT_MIN = settings.PRINT_MIN.split(",")|map('float')|list %}
{% set PRINT_MAX = settings.PRINT_MAX.split(",")|map('float')|list %}
{% if km.start_random_placement_max > 0 and print.PRINT_MIN and MESH_MIN %}
{% set PRINT_MIN = print.PRINT_MIN.split(",")|map('float')|list %}
{% set PRINT_MAX = print.PRINT_MAX.split(",")|map('float')|list %}
{% set x_offset = (((km.print_max[0] - km.print_min[0] - PRINT_MAX[0] +
PRINT_MIN[0] - 2 * km.start_random_placement_padding)|int,
km.start_random_placement_max * 2)|min, 0)|max %}
Expand Down Expand Up @@ -175,21 +166,24 @@ gcode:
PRINT_START_SET PRINT_OFFSET={"%d,%d" % (x_offset,y_offset)}
{% endif %}

{% set EXTRUDER = settings.EXTRUDER|int %}
{% set EXTRUDER = print.EXTRUDER|int %}
{% set km = printer["gcode_macro _km_globals"] %}
{% set start_level_bed_at_temp = km.start_level_bed_at_temp and
not printer.bed_mesh.profile_name %}
{% set start_home_z_at_temp = km.start_home_z_at_temp and
not print.BED_AT_TARGET|int %}
{% set actions_at_temp = start_level_bed_at_temp or
km.start_quad_gantry_level_at_temp or
km.start_z_tilt_adjust_at_temp %}
km.start_z_tilt_adjust_at_temp or
start_home_z_at_temp %}
{% if actions_at_temp %}
{% if km.start_extruder_probing_temp > 0 %}
_KM_PARK_IF_NEEDED HEATER={printer.toolhead.extruder} RANGE=2
M109 R{km.start_extruder_probing_temp}
{% else %}
M104 S{EXTRUDER} # set the final extruder target temperature
{% endif %}
{% if km.start_home_z_at_temp and not bed_at_target %}
{% if start_home_z_at_temp %}
G28 Z # Re-home only the Z axis now that the bed has stabilized.
{% endif %}
{% if km.start_z_tilt_adjust_at_temp %}
Expand All @@ -213,12 +207,9 @@ gcode:
description: Inserted by slicer at start of print. Preheats the extruder.
Usage: See PRINT_START.
gcode:
{% set settings = printer["gcode_macro print_start_set"].settings %}
{% if settings.PRINT_START_PHASE != "extruder" %}
{ action_raise_error("Error in PRINT_START_PHASE: %s" %
(settings.PRINT_START_PHASE,)) }
{% endif %}
{% set EXTRUDER = settings.EXTRUDER|default(settings.EXTRUDER_TEMP)|float %}
_PRINT_START_PHASE_CHECK PHASE=extruder
{% set print = printer["gcode_macro print_start_set"].print %}
{% set EXTRUDER = print.EXTRUDER|default(print.EXTRUDER_TEMP)|float %}
{% set km = printer["gcode_macro _km_globals"] %}
# Wait for extruder to reach temperature
_KM_PARK_IF_NEEDED HEATER={printer.toolhead.extruder} RANGE=ABOVE
Expand All @@ -233,14 +224,11 @@ gcode:
description: Inserted by slicer at start of print. Generates purge lines.
Usage: See PRINT_START.
gcode:
{% set settings = printer["gcode_macro print_start_set"].settings %}
{% if settings.PRINT_START_PHASE != "purge" %}
{ action_raise_error("Error in PRINT_START_PHASE: %s" %
(settings.PRINT_START_PHASE,)) }
{% endif %}
{% set MESH_MIN = settings.MESH_MIN|default(None) %}
{% set MESH_MAX = settings.MESH_MAX|default(None) %}
{% set NOZZLE_SIZE = settings.NOZZLE_SIZE|default(settings.NOZZLE_SIZE)|
_PRINT_START_PHASE_CHECK PHASE=purge
{% set print = printer["gcode_macro print_start_set"].print %}
{% set MESH_MIN = print.MESH_MIN|default(None) %}
{% set MESH_MAX = print.MESH_MAX|default(None) %}
{% set NOZZLE_SIZE = print.NOZZLE_SIZE|default(print.NOZZLE_SIZE)|
default(printer.configfile.settings.extruder.nozzle_diameter)|float %}
{% set km = printer["gcode_macro _km_globals"] %}
{% if km.start_purge_length > 0.0 and printer.extruder.can_extrude %}
Expand Down Expand Up @@ -279,13 +267,13 @@ gcode:
[gcode_macro _km_apply_print_offset]
variable_offset: []
gcode:
{% set settings = printer["gcode_macro print_start_set"].settings %}
{% set print = printer["gcode_macro print_start_set"].print %}
{% if params.RESET|default(0)|int and offset and
not printer["gcode_macro _km_save_state"].is_ephemeral%}
{% set PRINT_OFFSET = [offset.pop(0) * -1, offset.pop() * -1] %}
{% elif settings.PRINT_OFFSET and not offset and
{% elif print.PRINT_OFFSET and not offset and
not printer["gcode_macro _km_save_state"].is_ephemeral %}
{% set PRINT_OFFSET = settings.PRINT_OFFSET.split(",")|map('float')|list %}
{% set PRINT_OFFSET = print.PRINT_OFFSET.split(",")|map('float')|list %}
{% set dummy = offset.extend(PRINT_OFFSET) %}
{% endif %}

Expand All @@ -306,12 +294,38 @@ gcode:
[gcode_macro print_start_set]
description: Inserted by slicer to set values used by PRINT_START.
Usage: PRINT_START_SET <VARIABLE>=<value>
variable_settings: {}
variable_print: {}
gcode:
{%for k in params %}
{% set dummy = settings.__setitem__(k|upper, params[k]) %}
{% set dummy = print.__setitem__(k|upper, params[k]) %}
{% endfor %}

[gcode_macro _print_start_phase_check]
gcode:
{% set print = printer["gcode_macro print_start_set"].print %}
{% set PRINT_START_PHASE = print.PRINT_START_PHASE|default("none") %}
{% if PRINT_START_PHASE != params.PHASE %}
# Reset the phases manually just to be sure.
SET_GCODE_VARIABLE MACRO=print_start_set VARIABLE=print VALUE="{{}}"
{% if params.PHASE != 'none' %}
{% set error = "PRINT_START phase error. Expected '%s' but found '%s'" %
(params.PHASE, PRINT_START_PHASE) %}
# Do the cancel manually if we're not confident it will fire.
{% if not 'virtual_sdcard' in printer or
not printer.virtual_sdcard.is_active or 'CANCEL_PRINT' not in
printer.configfile.settings.virtual_sdcard.on_error_gcode|
default("")|upper %}
{action_respond_info(error)}
CANCEL_PRINT
{% else %}
{action_raise_error(error)}
{% endif %}
{% else %}
{ action_respond_info("Expected phase '%s' but found '%s'. Resetting."
% (params.PHASE, PRINT_START_PHASE)) }
{% endif %}
{% endif %}

[gcode_macro print_end]
description: Inserted by slicer at end of print.
Usage: PRINT_END
Expand All @@ -320,7 +334,6 @@ gcode:
M400
_PRINT_END_INNER

SET_GCODE_VARIABLE MACRO=print_start_set VARIABLE=settings VALUE="{{}}"
{% set km = printer["gcode_macro _km_globals"] %}

{% if km.start_clear_adjustments_at_end != 0 %}
Expand All @@ -340,6 +353,7 @@ gcode:
{% endif %}
M84 ; disable steppers
CLEAR_PAUSE
SET_GCODE_VARIABLE MACRO=print_start_set VARIABLE=print VALUE="{{}}"

[gcode_macro _print_end_inner]
variable_cancelled: False
Expand Down Expand Up @@ -384,15 +398,15 @@ gcode:
{% endif %}

[gcode_macro _km_check_and_set_print_bounds]
description: Validates all print bounds and caches their values in settings.
description: Validates all print bounds and caches their values.
gcode:
{% set km = printer["gcode_macro _km_globals"] %}
{% set settings = printer["gcode_macro print_start_set"].settings %}
{% set print = printer["gcode_macro print_start_set"].print %}

# Check the mesh bounds.
{% if settings.MESH_MIN %}
{% set MESH_MIN = settings.MESH_MIN.split(",")|map('float')|list %}
{% set MESH_MAX = settings.MESH_MAX.split(",")|map('float')|list %}
{% if print.MESH_MIN %}
{% set MESH_MIN = print.MESH_MIN.split(",")|map('float')|list %}
{% set MESH_MAX = print.MESH_MAX.split(",")|map('float')|list %}
{%if MESH_MIN[0] < km.print_min[0] or MESH_MIN[1] < km.print_min[1] %}
{action_raise_error("MESH_MIN %s is outside the printable bounds" %
(MESH_MIN|string, km.print_min|string))}
Expand All @@ -404,9 +418,9 @@ gcode:

# Find all the model bounds (including any bounds passed in).
{% set points = [] %}
{% if settings.MODEL_MIN or settings.MODEL_MAX %}
{% set MODEL_MIN = settings.MODEL_MIN.split(",")|map('float')|list %}
{% set MODEL_MAX = settings.MODEL_MAX.split(",")|map('float')|list %}
{% if print.MODEL_MIN or print.MODEL_MAX %}
{% set MODEL_MIN = print.MODEL_MIN.split(",")|map('float')|list %}
{% set MODEL_MAX = print.MODEL_MAX.split(",")|map('float')|list %}
{% set points = [MODEL_MIN, MODEL_MAX] %}
{% endif %}
{% if (printer.exclude_object|default({})).objects %}
Expand Down

0 comments on commit a7c928a

Please sign in to comment.