[gcode_macro PAUSE] description: Pauses the printer rename_existing: PAUSE_BASE variable_extrude: 1.5 gcode: SAVE_GCODE_STATE NAME=PAUSE_state # Define park positions {% set E = printer["gcode_macro PAUSE"].extrude|float %} {% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %} {% set z_speed = printer["gcode_macro RatOS"].macro_z_speed|float * 60 %} # Calculate safe Z position {% set max_z = printer.toolhead.axis_maximum.z|float %} {% set act_z = printer.toolhead.position.z|float %} {% if act_z < (max_z - 20.0) %} {% set z_safe = 20.0 %} {% else %} {% set z_safe = max_z - act_z %} {% endif %} PAUSE_BASE G91 # Retract {% if printer.extruder.can_extrude|lower == 'true' %} G1 E-{E} F2100 {% else %} {action_respond_info("Extruder not hot enough")} {% endif %} # Move to park position {% if "xyz" in printer.toolhead.homed_axes %} G1 Z{z_safe} F{z_speed} _PARK LOCATION={printer["gcode_macro RatOS"].pause_print_park_in} X={printer["gcode_macro RatOS"].pause_print_park_x} {% else %} {action_respond_info("Printer not homed")} {% endif %} {% if printer["gcode_macro RatOS"].tgbot_enabled|lower == 'true' %} RESPOND PREFIX=tgnotify MSG="Принтер встал на паузу" {% endif %} {% if printer["gcode_macro RatOS"].beep_enabled|lower == 'true' %} beep {% endif %} [gcode_macro RESUME] description: Resumes the print if the printer is paused. rename_existing: RESUME_BASE gcode: {% set E = printer["gcode_macro PAUSE"].extrude|float %} # Prime {% if printer.extruder.can_extrude|lower == 'true' %} G91 G1 E{E} F2100 G90 {% else %} {action_respond_info("Extruder not hot enough")} {% endif %} RESTORE_GCODE_STATE NAME=PAUSE_state MOVE=1 MOVE_SPEED={printer["gcode_macro RatOS"].macro_travel_speed|float} RESUME_BASE {% if printer["gcode_macro RatOS"].tgbot_enabled|lower == 'true' %} RESPOND PREFIX=tgnotify MSG="Принтер продолжил после паузы" {% endif %} [gcode_macro CANCEL_PRINT] description: Cancels the printer rename_existing: CANCEL_PRINT_BASE gcode: END_PRINT TURN_OFF_HEATERS CLEAR_PAUSE #SDCARD_RESET_FILE CANCEL_PRINT_BASE {% if printer["gcode_macro RatOS"].tgbot_enabled|lower == 'true' %} RESPOND PREFIX=tgnotify MSG="Отмена печати" {% endif %} [gcode_macro PRIME_LINE] description: Prints a primeline, used internally, if configured, as part of the START_PRINT macro. gcode: SAVE_GCODE_STATE NAME=prime_line_state {% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %} {% set z_speed = printer["gcode_macro RatOS"].macro_z_speed|float * 60 %} {% if printer["gcode_macro RatOS"].nozzle_prime_start_x|lower == 'min' %} {% set x_start = 5 %} {% elif printer["gcode_macro RatOS"].nozzle_prime_start_x|lower == 'max' %} {% set x_start = printer.toolhead.axis_maximum.x - 5 %} {% else %} {% set x_start = printer["gcode_macro RatOS"].nozzle_prime_start_x|float %} {% endif %} {% if printer["gcode_macro RatOS"].nozzle_prime_start_y|lower == 'min' %} {% set y_start = 5 %} {% set y_factor = 1 %} {% elif printer["gcode_macro RatOS"].nozzle_prime_start_y|lower == 'max' %} {% set y_start = printer.toolhead.axis_maximum.y - 5 %} {% set y_factor = -1 %} {% else %} {% set y_start = printer["gcode_macro RatOS"].nozzle_prime_start_y|float %} {% if printer["gcode_macro RatOS"].nozzle_prime_start_y|float < printer.toolhead.axis_maximum.y / 2 %} {% set y_factor = 1 %} {% else %} {% set y_factor = -1 %} {% endif %} {% endif %} {% if printer["gcode_macro RatOS"].nozzle_prime_direction|lower == 'forwards' %} {% set y_factor = 1 %} {% elif printer["gcode_macro RatOS"].nozzle_prime_direction|lower == 'backwards' %} {% set y_factor = -1 %} {% endif %} {% set z = printer["gcode_macro RatOS"].start_print_park_z_height|float %} # Absolute positioning G90 # Absolute extrusion M82 M117 Priming nozzle with prime line.. RESPOND MSG="Priming nozzle with prime line.." # Lift to start print Z height G0 Z{z} F{z_speed} # move to blob position along the edge of the bed G1 X{x_start} F{speed} G1 Y{y_start} F{speed} # Get ready to prime G1 Z0.3 F{z_speed} # Reset extrusion distance G92 E0 # Prime nozzle G1 Y{y_start + (70 * y_factor)} E16 F1200 # Wipe G1 Y{y_start + (90 * y_factor)} F{speed} RESTORE_GCODE_STATE NAME=prime_line_state [gcode_macro PRIME_BLOB] description: Prints a primeblob, used internally, if configured, as part of the START_PRINT macro. Slower than PRIME_LINE but much more effective. gcode: SAVE_GCODE_STATE NAME=prime_blob_state M117 Priming nozzle with prime blob.. RESPOND MSG="Priming nozzle with prime blob.." {% if printer["gcode_macro RatOS"].filament_encoder_enabled|lower == 'true' %} SET_FILAMENT_SENSOR SENSOR=encoder_sensor ENABLE=0 {% endif %} {% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %} {% set z_speed = printer["gcode_macro RatOS"].macro_z_speed|float * 60 %} {% set fan_speed = printer["gcode_macro RatOS"].nozzle_prime_bridge_fan|float %} {% if printer["gcode_macro RatOS"].nozzle_prime_start_x|lower == 'min' %} {% set x_start = 5 %} {% elif printer["gcode_macro RatOS"].nozzle_prime_start_x|lower == 'max' %} {% set x_start = printer.toolhead.axis_maximum.x - 5 %} {% else %} {% set x_start = printer["gcode_macro RatOS"].nozzle_prime_start_x|float %} {% endif %} {% if printer["gcode_macro RatOS"].nozzle_prime_start_y|lower == 'min' %} {% set y_start = 5 %} {% set y_factor = 1 %} {% elif printer["gcode_macro RatOS"].nozzle_prime_start_y|lower == 'max' %} {% set y_start = printer.toolhead.axis_maximum.y - 5 %} {% set y_factor = -1 %} {% else %} {% set y_start = printer["gcode_macro RatOS"].nozzle_prime_start_y|float %} {% if printer["gcode_macro RatOS"].nozzle_prime_start_y|float < printer.toolhead.axis_maximum.y / 2 %} {% set y_factor = 1 %} {% else %} {% set y_factor = -1 %} {% endif %} {% endif %} {% if printer["gcode_macro RatOS"].nozzle_prime_direction|lower == 'forwards' %} {% set y_factor = 1 %} {% elif printer["gcode_macro RatOS"].nozzle_prime_direction|lower == 'backwards' %} {% set y_factor = -1 %} {% endif %} {% set z = printer["gcode_macro RatOS"].start_print_park_z_height|float %} # Absolute positioning G90 # Relative extrusion M83 # Lift to start print Z height G0 Z{z} F{z_speed} # move close to blob position along the edge of the bed G1 X{x_start} F{speed} G1 Y{y_start + (15 * y_factor)} F{speed} # Lower to blob extrusion height G1 Z0.5 F{z_speed} # Move to final position horizontally G1 Y{y_start} F{speed} # Extrude a blob G1 F60 E20 # 40% fan M106 S{fan_speed} # Move the extruder up by 5mm while extruding, breaks away from blob G1 Z5 F100 E5 # Move to wipe position, but keep extruding so the wipe is attached to blob G1 F200 Y{y_start + (25 * y_factor)} E1 # Go down diagonally while extruding # Broken down in z moves under 2mm as a workaround for a tuning tower test. # The tuning tower command thinks a new print has been started when z moves over 2mm and aborts. G1 F200 Y{y_start + (30 * y_factor)} Z3.8 E0.5 G1 F200 Y{y_start + (35 * y_factor)} Z2.6 E0.5 G1 F200 Y{y_start + (40 * y_factor)} Z1.4 E0.5 G1 F200 Y{y_start + (45 * y_factor)} Z0.2 E0.5 # 0% fan M106 S0 # small wipe line G1 F200 Y{y_start + (50 * y_factor)} Z0.2 E0.6 # Break away wipe G1 F{speed} Y{y_start + (100 * y_factor)} {% if printer["gcode_macro RatOS"].filament_encoder_enabled|lower == 'true' %} SET_FILAMENT_SENSOR SENSOR=encoder_sensor ENABLE=1 {% endif %} RESTORE_GCODE_STATE NAME=prime_blob_state [gcode_macro _PARK] gcode: {% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %} # Get X position {% if params.X != '' %} {% if params.X|float >= printer.toolhead.axis_minimum.x + 5 and params.X|float <= printer.toolhead.axis_maximum.x - 5 %} {% set safe_x = params.X|float %} {% else %} {action_respond_info('The requested X co-ordinate is outside the defined axis bounds - using defaults')} {% set safe_x = printer.toolhead.axis_maximum.x / 2 %} {% endif %} {% else %} {% set safe_x = printer.toolhead.axis_maximum.x / 2 %} #{% set safe_x = printer.toolhead.axis_maximum.x / 2 %} {% endif %} # Get Y position {% if params.LOCATION|default('back')|lower == 'back' %} {% set y = printer.toolhead.axis_maximum.y - 5 %} {% elif params.LOCATION|lower == 'front' %} {% set y = printer.toolhead.axis_minimum.y + 5 %} {% elif params.LOCATION|lower == 'center' %} {% set y = printer.toolhead.axis_maximum.y / 2 %} {% endif %} # Absolute positioning G90 # Park G0 X{safe_x} Y{y} F{speed} ##### # COLOR CHANGE ##### [gcode_macro M600] description: Executes a color change by pausing the printer an unloading the filament. gcode: PAUSE UNLOAD_FILAMENT M117 Please load new filament and resume RESPOND MSG="Please load new filament and resume" {% if printer["gcode_macro RatOS"].tgbot_enabled|lower == 'true' %} RESPOND PREFIX=tgnotify MSG="Требуется замена филамента" {% endif %} {% if printer["gcode_macro RatOS"].beep_enabled|lower == 'true' %} beep {% endif %} ##### # FILAMENT MANAGEMENT ##### [gcode_macro UNLOAD_FILAMENT] description: Unloads the filament. Note: be careful with PETG, make sure you inspect the tip of your filament before reloading to avoid jams. gcode: SAVE_GCODE_STATE NAME=unload_state G91 {% if params.TEMP is defined or printer.extruder.can_extrude|lower == 'false' %} M117 Heating... # Heat up hotend to provided temp or 220 as default as that should work OK with most filaments. M104 S{params.TEMP|default(220, true)} TEMPERATURE_WAIT SENSOR=extruder MINIMUM={params.TEMP|default(220, true)} {% endif %} {% set unload_speed = printer["gcode_macro RatOS"].filament_unload_speed|float * 60 %} {% set unload_length = printer["gcode_macro RatOS"].filament_unload_length|float %} M117 Unloading filament... # Extrude a bit G0 E10 F300 # Extract filament to cold end area G0 E-5 F3600 # Wait for three seconds G4 P3000 # Push back the filament to smash any stringing G0 E5 F3600 # Extract back fast in to the cold zone G0 E-15 F3600 # Continue extraction slowly, allow the filament time to cool solid before it reaches the gears G0 E-{unload_length} F{unload_speed} M117 Filament unloaded! RESPOND MSG="Filament unloaded! Please inspect the tip of the filament before reloading." RESTORE_GCODE_STATE NAME=unload_state [gcode_macro LOAD_FILAMENT] description: Loads new filament. Note: be careful with PETG, make sure you inspect the tip of your filament before loading to avoid jams. gcode: SAVE_GCODE_STATE NAME=load_state G91 # Heat up hotend to provided temp or 220 as default as that should work OK with most filaments. {% if params.TEMP is defined or printer.extruder.can_extrude|lower == 'false' %} FORCE_MOVE STEPPER=extruder DISTANCE=15 VELOCITY=10 ACCEL=1000 M117 Heating... M104 S{params.TEMP|default(230, true)} TEMPERATURE_WAIT SENSOR=extruder MINIMUM={params.TEMP|default(230, true)} {% endif %} {% set load_speed = printer["gcode_macro RatOS"].filament_load_speed|float * 60 %} {% set load_length = printer["gcode_macro RatOS"].filament_load_length|float %} {% set load_second_speed = printer["gcode_macro RatOS"].filament_load_second_speed|float * 60 %} {% set load_second_length = printer["gcode_macro RatOS"].filament_load_second_length|float %} M117 Loading filament... # Load the filament into the hotend area. G0 E{load_length} F{load_speed} # Wait a secod G4 P1000 # Purge G0 E{load_second_length} F{load_second_speed} #G0 E40 F100 # Wait for purge to complete M400 M117 Filament loaded! RESPOND MSG="Filament loaded!" RESTORE_GCODE_STATE NAME=load_state [gcode_macro SET_CENTER_KINEMATIC_POSITION] description: FOR DEBUGGING PURPOSES ONLY. Sets the internal printer kinematic state to the center of all axes regardless of actual physical position. gcode: RESPOND MSG="WARNING: ONLY USE SET_CENTER_KINEMATIC_POSITION FOR DEBUGGING PURPOSES. YOU'RE OVERRIDING THE INTERNAL POSITIONING STATE OF THE PRINTER. PROCEED WITH CAUTION AND DO A PROPER G28 WHEN DONE." SET_GCODE_VARIABLE MACRO=MAYBE_HOME VARIABLE=is_kinematic_position_overriden VALUE=True SET_KINEMATIC_POSITION X={printer.toolhead.axis_maximum.x / 2} Y={printer.toolhead.axis_maximum.y / 2} Z={printer.toolhead.axis_maximum.z / 2} [gcode_macro MAYBE_HOME] description: Only home unhomed axis variable_is_kinematic_position_overriden: False gcode: {% if printer["gcode_macro MAYBE_HOME"].is_kinematic_position_overriden|lower == 'true' %} RESPOND MSG="SET_CENTER_KINEMATIC_POSITION has been abused. Homing all axes. Please refrain from using SET_CENTER_KINEMATIC_POSITION outside of debugging purposes." G28 SET_GCODE_VARIABLE MACRO=MAYBE_HOME VARIABLE=is_kinematic_position_overriden VALUE=False {% else %} {% set axes = '' %} {% set isHomed = true %} {% set axesToHome = '' %} {% if params.X is defined %} {% set axes = axes ~ 'X ' %} {% if 'x' not in printer.toolhead.homed_axes %} {% set isHomed = false %} {% set axesToHome = axesToHome ~ 'X ' %} {% endif %} {% endif %} {% if params.Y is defined %} {% set axes = axes ~ 'Y ' %} {% if 'y' not in printer.toolhead.homed_axes %} {% set isHomed = false %} {% set axesToHome = axesToHome ~ 'Y ' %} {% endif %} {% endif %} {% if params.Z is defined %} {% set axes = axes ~ 'Z ' %} {% if 'z' not in printer.toolhead.homed_axes %} {% set isHomed = false %} {% set axesToHome = axesToHome ~ 'Z ' %} {% endif %} {% endif %} {% if params.X is not defined and params.Y is not defined and params.Z is not defined %} {% set axes = '' %} {% if 'x' not in printer.toolhead.homed_axes %} {% set isHomed = false %} {% set axesToHome = axesToHome ~ 'X ' %} {% endif %} {% if 'y' not in printer.toolhead.homed_axes %} {% set isHomed = false %} {% set axesToHome = axesToHome ~ 'Y ' %} {% endif %} {% if 'z' not in printer.toolhead.homed_axes %} {% set isHomed = false %} {% set axesToHome = axesToHome ~ 'Z ' %} {% endif %} {% endif %} {% if isHomed is false %} M117 Homing {axesToHome} RESPOND MSG="Homing {axesToHome}" G28 {axesToHome} {% else %} RESPOND MSG="All requested axes already homed, skipping.." {% endif %} {% endif %} ##### # START PRINT MACROS # Call this from your slicer (custom g-code). # Read more here: https://rat-rig.github.io/V-CoreOS/#/slicers ##### [gcode_macro START_PRINT] description: Start print procedure, use this in your Slicer. gcode: CLEAR_PAUSE {% if printer["gcode_macro RatOS"].force_absolute_position|lower == 'true' %} G90 {% endif %} SAVE_GCODE_STATE NAME=start_print_state # Metric values G21 # Absolute positioning G90 # Set extruder to absolute mode M82 _USER_START_PRINT_BEFORE_HOMING # Home if needed MAYBE_HOME {% if params.CHAMBER_TEMP is defined %} _START_PRINT_HEAT_CHAMBER CHAMBER_TEMP={params.CHAMBER_TEMP} BED_TEMP={printer["gcode_macro RatOS"].start_print_heat_chamber_bed_temp} _USER_START_PRINT_HEAT_CHAMBER CHAMBER_TEMP={params.CHAMBER_TEMP} BED_TEMP={printer["gcode_macro RatOS"].start_print_heat_chamber_bed_temp} {% endif %} M117 Heating bed... RESPOND MSG="Heating bed..." # Wait for bed to heat up M190 S{params.BED_TEMP|default(printer.heater_bed.target, true) } # Run the user created "AFTER_HEATING_BED" macro _USER_START_PRINT_AFTER_HEATING_BED # Run the customizable "AFTER_HEATING_BED" macro. _START_PRINT_AFTER_HEATING_BED # Run the user created "START_PRINT_BED_MESH" macro _USER_START_PRINT_BED_MESH # Run the customizable "BED_MESH" macro _START_PRINT_BED_MESH X0={params.X0} X1={params.X1} Y0={params.Y0} Y1={params.Y1} # Start heating extruder M104 S{params.EXTRUDER_TEMP|default(printer.extruder.target, true) } # Run the users "PARK" macro _USER_START_PRINT_PARK # Run the customizable "PARK" macro _START_PRINT_PARK # Wait for extruder to heat up M117 Heating Extruder... RESPOND MSG="Heating Extruder..." M109 S{params.EXTRUDER_TEMP|default(printer.extruder.target, true) } # Run the user created "AFTER_HEATING_EXTRUDER" macro. _USER_START_PRINT_AFTER_HEATING_EXTRUDER # Run the customizable "AFTER_HEATING_EXTRUDER" macro. _START_PRINT_AFTER_HEATING_EXTRUDER M117 Printing... RESPOND MSG="Printing..." RESTORE_GCODE_STATE NAME=start_print_state # Set extrusion mode based on user configuration {% if printer["gcode_macro RatOS"].relative_extrusion|lower == 'true' %} M83 {% else %} M82 {% endif %} G92 E0 ##### # START PRINT MACRO HOOKS # You can copy these to printer.cfg and modify them to your liking, or just use them as is. #### [gcode_macro _USER_START_PRINT_BEFORE_HOMING] gcode: [gcode_macro _START_PRINT_AFTER_HEATING_BED] gcode: {% if printer["gcode_macro RatOS"].preheat_extruder|lower == 'true' %} {% set min_temp = printer["gcode_macro RatOS"].preheat_extruder_temp|float %} {% set max_temp = printer["gcode_macro RatOS"].preheat_extruder_temp|float + 5 %} M117 Pre-heating extruder... RESPOND MSG="Pre-heating extruder..." # Wait for extruder to reach a predefined preheat temp so an inductive probe (if present) is at a predictable temp. # Also allows the bed heat to spread a little, and softens any plastic that might be stuck to the nozzle. M104 S{min_temp} TEMPERATURE_WAIT SENSOR=extruder MINIMUM={min_temp} MAXIMUM={max_temp} {% endif %} {% if printer["gcode_macro RatOS"].variable_z_tilt_enabled|lower == 'true' %} {% set TARGET_TEMP = printer.heater_bed.target %} {% if printer["gcode_macro RatOS"].variable_high_power_bed|lower == 'true' %} M140 S0 {% endif %} M117 Adjusting Z tilt... RESPOND MSG="Adjusting Z tilt..." # Adjust bed tilt SAVE_GCODE_STATE NAME=STATE_Z_TILT BED_MESH_CLEAR {% if not printer.z_tilt.applied %} Z_TILT_ADJUST horizontal_move_z=10 retry_tolerance=1 {% endif %} Z_TILT_ADJUST horizontal_move_z=2 RESTORE_GCODE_STATE NAME=STATE_Z_TILT M190 S{TARGET_TEMP} M117 Rehoming Z after Z tilt adjustment... RESPOND MSG="Rehoming Z after Z tilt adjustment..." # Home again as Z will have changed after tilt adjustment and bed heating. G28 Z {% endif %} [gcode_macro _USER_START_PRINT_AFTER_HEATING_BED] gcode: [gcode_macro _START_PRINT_BED_MESH] gcode: {% set default_profile = printer["gcode_macro RatOS"].bed_mesh_profile|default('ratos') %} {% if printer["gcode_macro RatOS"].calibrate_bed_mesh|lower == 'true' %} BED_MESH_CLEAR {% set TARGET_TEMP = printer.heater_bed.target %} {% if printer["gcode_macro RatOS"].variable_high_power_bed|lower == 'true' %} M140 S0 {% endif %} {% if printer["gcode_macro RatOS"].adaptive_mesh|lower == 'true' %} ADAPTIVE_BED_MESH FORCE_MESH=1 {% else %} BED_MESH_CALIBRATE PROFILE={default_profile} BED_MESH_PROFILE LOAD={default_profile} {% endif %} {% if printer["gcode_macro RatOS"].touch_cart_enabled|lower == 'true' %} CARTOGRAPHER_TOUCH ; Perform touch probe {% endif %} M190 S{TARGET_TEMP} {% elif printer["gcode_macro RatOS"].bed_mesh_profile is defined %} BED_MESH_CLEAR BED_MESH_PROFILE LOAD={printer["gcode_macro RatOS"].bed_mesh_profile} {% endif %} [gcode_macro _USER_START_PRINT_BED_MESH] gcode: [gcode_macro _START_PRINT_PARK] gcode: {% set z = printer["gcode_macro RatOS"].start_print_park_z_height|float %} {% set zSpeed = printer["gcode_macro RatOS"].macro_z_speed|float * 60 %} _PARK LOCATION={printer["gcode_macro RatOS"].start_print_park_in} X={printer["gcode_macro RatOS"].start_print_park_x} G0 Z{z} F{zSpeed} [gcode_macro _USER_START_PRINT_PARK] gcode: [gcode_macro _START_PRINT_AFTER_HEATING_EXTRUDER] gcode: {% set has_offset = printer["gcode_macro RatOS"].probe_for_priming_result|float(9999.9) != 9999.9 %} {% if has_offset %} ADD_PRIME_PROBE_TO_OFFSET {% endif %} {% if printer["gcode_macro RatOS"].nozzle_priming|lower == 'primeline' %} PRIME_LINE {% endif %} {% if printer["gcode_macro RatOS"].nozzle_priming|lower == 'primeblob' %} PRIME_BLOB {% endif %} {% if has_offset %} SUBTRACT_PRIME_PROBE_FROM_OFFSET {% endif %} {% if printer["gcode_macro RatOS"].skew_profile is defined %} SKEW_PROFILE LOAD={printer["gcode_macro RatOS"].skew_profile} {% endif %} [gcode_macro _USER_START_PRINT_AFTER_HEATING_EXTRUDER] gcode: [gcode_macro _START_PRINT_HEAT_CHAMBER] description: Uses the extruder sensor to wait for chamber temp. Override the _START_PRINT_HEAT_CHAMBER macro to implement heated chamber handling. gcode: {% if params.CHAMBER_TEMP is defined and params.BED_TEMP is defined and params.CHAMBER_TEMP|int > 0 %} {% set z = printer["gcode_macro RatOS"].start_print_park_z_height|float %} {% set zSpeed = printer["gcode_macro RatOS"].macro_z_speed|float * 60 %} G0 Z{z} F{zSpeed} M84 M117 Heating chamber... RESPOND MSG="Heating chamber..." M140 S{params.BED_TEMP} TEMPERATURE_WAIT SENSOR=extruder MINIMUM={params.CHAMBER_TEMP} MAYBE_HOME {% endif %} [gcode_macro _USER_START_PRINT_HEAT_CHAMBER] description: Uses the extruder sensor to wait for chamber temp. Override the _START_PRINT_HEAT_CHAMBER macro to implement heated chamber handling. gcode: ##### # END PRINT MACROS # Call this from your slicer (custom g-code). # Read more here: https://rat-rig.github.io/V-CoreOS/#/slicers ##### # The end_print macro is also called from CANCEL_PRINT. [gcode_macro END_PRINT] description: End print procedure, use this in your Slicer. gcode: SAVE_GCODE_STATE NAME=end_print_state _USER_END_PRINT_BEFORE_HEATERS_OFF _END_PRINT_BEFORE_HEATERS_OFF TURN_OFF_HEATERS _USER_END_PRINT_AFTER_HEATERS_OFF _END_PRINT_AFTER_HEATERS_OFF _USER_END_PRINT_PARK _END_PRINT_PARK # Clear skew profile if any was loaded. {% if printer["gcode_macro RatOS"].skew_profile is defined %} SET_SKEW CLEAR=1 {% endif %} # Steppers off M84 # Part cooling fan off M107 # Clear bed mesh so that G28 doesn't fail. BED_MESH_CLEAR M117 Done :) RESPOND MSG="Done :)" RESTORE_GCODE_STATE NAME=end_print_state {% if printer["gcode_macro RatOS"].tgbot_enabled|lower == 'true' %} RESPOND PREFIX=tgnotify MSG="Допечатато! =)" {% endif %} {% if printer["gcode_macro RatOS"].beep_enabled|lower == 'true' %} beep {% endif %} ##### # END PRINT MACRO HOOKS # You can copy these to printer.cfg and modify them to your liking, or just use them as is. #### [gcode_macro _END_PRINT_BEFORE_HEATERS_OFF] gcode: RESPOND MSG="Cleaning up..." [gcode_macro _USER_END_PRINT_BEFORE_HEATERS_OFF] gcode: [gcode_macro _END_PRINT_AFTER_HEATERS_OFF] gcode: # Calculate safe Z position {% set max_z = printer.toolhead.axis_maximum.z|float %} {% set act_z = printer.toolhead.position.z|float %} {% set z_hop = printer["gcode_macro RatOS"].end_print_park_z_hop|float %} {% if act_z < (max_z - z_hop) %} {% set z_safe = z_hop %} {% else %} {% set z_safe = max_z - act_z %} {% endif %} # Relative positioning G91 # Retract the filament a bit before lifting the nozzle. G1 E-2 F3600 # Move to safe Z position G0 Z{z_safe} F3600 # Retract filament even more G1 E-2 F3600 # Back to absolute positioning G90 [gcode_macro _USER_END_PRINT_AFTER_HEATERS_OFF] gcode: [gcode_macro _END_PRINT_PARK] gcode: _PARK LOCATION={printer["gcode_macro RatOS"].end_print_park_in} X={printer["gcode_macro RatOS"].end_print_park_x} [gcode_macro _USER_END_PRINT_PARK] gcode: ##### # MESH MACROS #### [gcode_macro SAVE_PROBE_RESULT] gcode: {% set last_z = printer.probe.last_z_result %} SET_GCODE_VARIABLE MACRO=RatOS VARIABLE={params.VARIABLE|default('last_z')} VALUE={last_z} [gcode_macro PROBE_FOR_PRIMING] gcode: {% if printer["gcode_macro RatOS"].nozzle_priming|lower != 'false' %} SAVE_GCODE_STATE NAME=probe_for_priming_state RESPOND MSG="Probing the prime location.." {% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %} {% set z_speed = printer["gcode_macro RatOS"].macro_z_speed|float * 60 %} {% if printer["gcode_macro RatOS"].nozzle_prime_start_x|lower == 'min' %} {% set x_start = 5 %} {% elif printer["gcode_macro RatOS"].nozzle_prime_start_x|lower == 'max' %} {% set x_start = printer.toolhead.axis_maximum.x - 5 %} {% else %} {% set x_start = printer["gcode_macro RatOS"].nozzle_prime_start_x|float %} {% endif %} {% if printer["gcode_macro RatOS"].nozzle_prime_start_y|lower == 'min' %} {% set y_start = 5 %} {% elif printer["gcode_macro RatOS"].nozzle_prime_start_y|lower == 'max' %} {% set y_start = printer.toolhead.axis_maximum.y - 5 %} {% else %} {% set y_start = printer["gcode_macro RatOS"].nozzle_prime_start_y|float %} {% endif %} {% set z = printer.configfile.settings.bed_mesh.horizontal_move_z|float %} # get bed mesh config object {% set mesh_config = printer.configfile.config.bed_mesh %} # Get probe offsets {% if printer.configfile.settings.bltouch is defined %} {% set x_offset = printer.configfile.settings.bltouch.x_offset|float %} {% set y_offset = printer.configfile.settings.bltouch.y_offset|float %} {% elif printer.configfile.settings.probe is defined %} {% set x_offset = printer.configfile.settings.probe.x_offset|float %} {% set y_offset = printer.configfile.settings.probe.y_offset|float %} {% elif printer.configfile.settings.beacon is defined %} {% set x_offset = printer.configfile.settings.beacon.x_offset|float %} {% set y_offset = printer.configfile.settings.beacon.y_offset|float %} {% else %} { action_raise_error("No probe or bltouch section found. Adaptive priming only works with [probe] or [bltouch].") } {% endif %} # get configured bed mesh area {% set min_x = mesh_config.mesh_min.split(",")[0]|float - x_offset %} {% set min_y = mesh_config.mesh_min.split(",")[1]|float - y_offset %} {% set max_x = mesh_config.mesh_max.split(",")[0]|float - x_offset %} {% set max_y = mesh_config.mesh_max.split(",")[1]|float - y_offset %} # make sure probe coordinates lie within the configured mesh area {% set x_start = [[x_start, max_x]|min, min_x]|max %} {% set y_start = [[y_start, max_y]|min, min_y]|max %} RESPOND MSG="PROBE_FOR_PRIMING: Probing the prime location at X: {x_start} Y: {y_start}" # Absolute positioning G90 # Relative extrusion M83 # Lift to horizontal_move_z G0 Z{z} F{z_speed} # move close to blob position G1 X{x_start} Y{y_start} F{speed} PROBE_CURRENT_POSITION SAVE_PROBE_RESULT VARIABLE=probe_for_priming_result RESTORE_GCODE_STATE NAME=probe_for_priming_state {% endif %} [gcode_macro RESET_PRIME_PROBE_STATE] gcode: SET_GCODE_VARIABLE MACRO=RatOS VARIABLE=probe_for_priming_result VALUE=None [gcode_macro PROBE_CURRENT_POSITION] gcode: SAVE_GCODE_STATE NAME=probe_current_position_state PROBE RESTORE_GCODE_STATE NAME=probe_current_position_state MOVE=1 MOVE_SPEED={printer["gcode_macro RatOS"].macro_z_speed|float} [gcode_macro ADD_PRIME_PROBE_TO_OFFSET] gcode: {% set last_z = printer["gcode_macro RatOS"].probe_for_priming_result|float(9999.9) %} {% if printer.configfile.settings.bltouch is defined %} {% set z_offset = printer.configfile.settings.bltouch.z_offset|float %} {% elif printer.configfile.settings.probe is defined %} {% set z_offset = printer.configfile.settings.probe.z_offset|float %} {% else %} { action_raise_error("No probe or bltouch section found. Adaptive priming only works with [probe] or [bltouch].") } {% endif %} {% if last_z == 9999.9 %} { action_raise_error("No probe result found for prime area. This is likely a bug.") } {% endif %} {% set adjustment = last_z - z_offset %} {% set adjustment_threshold = printer["gcode_macro RatOS"].adaptive_prime_offset_threshold|float %} {% if adjustment < adjustment_threshold %} { action_raise_error("Abnormal probe offset detected. Needed offset of {adjustment} is below the offset threshold of -1mm. Please verify the probe is over the bed when probing for priming. If it isn't, you should adjust you min/max bed_mesh settings so the probe is always over the print area.") } {% endif %} RESPOND MSG="ADD_PRIME_PROBE_TO_OFFSET: adjusting z offset by {adjustment}" SET_GCODE_OFFSET Z_ADJUST={adjustment} MOVE=1 [gcode_macro SUBTRACT_PRIME_PROBE_FROM_OFFSET] gcode: {% set last_z = printer["gcode_macro RatOS"].probe_for_priming_result|float(9999.9) %} {% if printer.configfile.settings.bltouch is defined %} {% set z_offset = printer.configfile.settings.bltouch.z_offset|float %} {% elif printer.configfile.settings.probe is defined %} {% set z_offset = printer.configfile.settings.probe.z_offset|float %} {% else %} { action_raise_error("No probe or bltouch section found. Adaptive priming only works with [probe] or [bltouch].") } {% endif %} {% if last_z == 9999.9 %} { action_raise_error("No probe result found for prime area. This is likely a bug.") } {% endif %} RESPOND MSG="SUBTRACT_PRIME_PROBE_FROM_OFFSET: adjusting z offset by {z_offset - last_z}" SET_GCODE_OFFSET Z_ADJUST={z_offset - last_z} MOVE=1 [gcode_macro beep] gcode: SET_PIN PIN=_Beeper VALUE=1 # в завершающем коде слайсера напиши в конце beep G4 P5000 # и тогда после окончания печати он тебе пикнет 4 раза. это 5 секунд работы, SET_PIN PIN=_Beeper VALUE=0 # если хочется побольше то вместо 5000 поставь например 10000 будет пищать 10 секунд можно также вставить на замену филамента. на начало печати. [gcode_macro PID_E] gcode: {% set T = params.T|default(240) %} PID_CALIBRATE HEATER=extruder TARGET={T} [gcode_macro PID_B] gcode: {% set T = params.T|default(80) %} PID_CALIBRATE HEATER=heater_bed TARGET={T} [gcode_macro M106] rename_existing: G106 gcode: {% if params.P is defined %} {% if params.P|int == 2 %} {% if params.S is defined %} {% if params.S|int == 255 %} {% set realspeed = 1 %} {% else %} {% if params.S|int == 0 %} {% set realspeed = 0 %} {% else %} {% set realspeed = params.S|float/255 %} {% endif %} {% endif %} {% else %} {% set realspeed = 1 %} {% endif %} SET_FAN_SPEED FAN=Aux_Fan SPEED={realspeed} {% endif %} {% if params.P|int == 1 %} {% if params.S is defined %} {% if params.S|int == 255 %} {% set realspeed = 1 %} {% else %} {% if params.S|int == 0 %} {% set realspeed = 0 %} {% else %} {% set realspeed = params.S|float/255 %} {% endif %} {% endif %} {% else %} {% set realspeed = 1 %} {% endif %} SET_FAN_SPEED FAN=Exhaust_fan SPEED={realspeed} {% endif %} {% else %} {% if params.S is defined %} G106 S{params.S} {% else %} G106 S255 {% endif %} {% endif %} [gcode_macro M107] rename_existing: G107 gcode: {% if params.P is defined %} {% if params.P|int == 2 %} SET_FAN_SPEED FAN=Aux_Fan SPEED=0 {% endif %} {% else %} SET_FAN_SPEED FAN=Aux_Fan SPEED=0 G107 {% endif %}