@@ -940,19 +940,20 @@ void fast_line_to_current(const AxisEnum fr_axis) { _line_to_current(fr_axis, 0.
940
940
* sync_plan_position_e();
941
941
*/
942
942
void extruder_cutting_recover (const_float_t e) {
943
- if (! too_cold (active_extruder)) {
944
- const float dist = toolchange_settings. extra_resume + toolchange_settings. wipe_retract ;
945
- FS_DEBUG ( " Performing Cutting Recover | Distance: " , dist, " | Speed: " , MMM_TO_MMS ( toolchange_settings.unretract_speed ), " mm/s " ) ;
946
- unscaled_e_move ( dist, MMM_TO_MMS (toolchange_settings.unretract_speed ));
947
- planner. synchronize ( );
948
- FS_DEBUG ( " Set position to: " , e);
949
- current_position. e = e ;
950
- sync_plan_position_e (); // Resume new E Position
951
- }
943
+ if (too_cold (active_extruder)) return ;
944
+
945
+ const float dist = toolchange_settings. extra_resume + toolchange_settings.wipe_retract ;
946
+ FS_DEBUG ( " Performing Cutting Recover | Distance: " , dist, " | Speed: " , MMM_TO_MMS (toolchange_settings.unretract_speed ), " mm/s " );
947
+ unscaled_e_move (dist, MMM_TO_MMS (toolchange_settings. unretract_speed ) );
948
+
949
+ FS_DEBUG ( " Set E position: " , e) ;
950
+ current_position. e = e;
951
+ sync_plan_position_e (); // Resume new E Position
952
952
}
953
953
954
954
/* *
955
955
* Prime the currently selected extruder (Filament loading only)
956
+ * Leave the E position unchanged so subsequent extrusion works properly.
956
957
*
957
958
* If too_cold(toolID) returns TRUE -> returns without moving extruder.
958
959
* Extruders filament = swap_length + extra prime, then performs cutting retraction if enabled.
@@ -966,6 +967,8 @@ void fast_line_to_current(const AxisEnum fr_axis) { _line_to_current(fr_axis, 0.
966
967
967
968
feedRate_t fr_mm_s = MMM_TO_MMS (toolchange_settings.unretract_speed ); // Set default speed for unretract
968
969
970
+ const float resume_current_e = current_position.e ;
971
+
969
972
#if ENABLED(TOOLCHANGE_FS_SLOW_FIRST_PRIME)
970
973
/* *
971
974
* Perform first unretract movement at the slower Prime_Speed to avoid breakage on first prime
@@ -1010,6 +1013,10 @@ void fast_line_to_current(const AxisEnum fr_axis) { _line_to_current(fr_axis, 0.
1010
1013
unscaled_e_move (-toolchange_settings.wipe_retract , MMM_TO_MMS (toolchange_settings.retract_speed ));
1011
1014
#endif
1012
1015
1016
+ // Leave E unchanged when priming
1017
+ current_position.e = resume_current_e;
1018
+ sync_plan_position_e ();
1019
+
1013
1020
// Cool down with fan
1014
1021
filament_swap_cooling ();
1015
1022
}
@@ -1061,17 +1068,19 @@ void fast_line_to_current(const AxisEnum fr_axis) { _line_to_current(fr_axis, 0.
1061
1068
}
1062
1069
#endif
1063
1070
1071
+ // Prime without changing E
1064
1072
extruder_prime ();
1065
1073
1066
1074
// Move back
1067
1075
#if ENABLED(TOOLCHANGE_PARK)
1068
1076
if (ok) {
1069
1077
#if ENABLED(TOOLCHANGE_NO_RETURN)
1070
- const float temp = destination.z ;
1071
- destination = current_position;
1072
- destination.z = temp;
1078
+ destination.x = current_position.x ;
1079
+ destination.y = current_position.y ;
1073
1080
#endif
1074
- prepare_internal_move_to_destination (TERN (TOOLCHANGE_NO_RETURN, planner.settings .max_feedrate_mm_s [Z_AXIS], MMM_TO_MMS (TOOLCHANGE_PARK_XY_FEEDRATE)));
1081
+ do_blocking_move_to_xy (destination, MMM_TO_MMS (TOOLCHANGE_PARK_XY_FEEDRATE));
1082
+ do_blocking_move_to_z (destination.z , planner.settings .max_feedrate_mm_s [Z_AXIS]);
1083
+ planner.synchronize ();
1075
1084
}
1076
1085
#endif
1077
1086
0 commit comments