|  |  | @ -6501,6 +6501,13 @@ inline void gcode_T(uint8_t tmp_extruder) { | 
			
		
	
		
		
			
				
					
					|  |  |  |     return; |  |  |  |     return; | 
			
		
	
		
		
			
				
					
					|  |  |  |   } |  |  |  |   } | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   #if ENABLED(DEBUG_LEVELING_FEATURE) | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     if (DEBUGGING(LEVELING)) { | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |       SERIAL_ECHOLNPGM(">>> gcode_T"); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |       DEBUG_POS("BEFORE", current_position); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     } | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   #endif | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |   #if HOTENDS > 1 |  |  |  |   #if HOTENDS > 1 | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |     float old_feedrate = feedrate; |  |  |  |     float old_feedrate = feedrate; | 
			
		
	
	
		
		
			
				
					|  |  | @ -6583,11 +6590,6 @@ inline void gcode_T(uint8_t tmp_extruder) { | 
			
		
	
		
		
			
				
					
					|  |  |  |         // Z software endstop. But this is technically correct (and
 |  |  |  |         // Z software endstop. But this is technically correct (and
 | 
			
		
	
		
		
			
				
					
					|  |  |  |         // there is no viable alternative).
 |  |  |  |         // there is no viable alternative).
 | 
			
		
	
		
		
			
				
					
					|  |  |  |         //
 |  |  |  |         //
 | 
			
		
	
		
		
			
				
					
					|  |  |  |         float xydiff[2] = { |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |           hotend_offset[X_AXIS][tmp_extruder] - hotend_offset[X_AXIS][active_extruder], |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |           hotend_offset[Y_AXIS][tmp_extruder] - hotend_offset[Y_AXIS][active_extruder] |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         }; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         #if ENABLED(AUTO_BED_LEVELING_FEATURE) |  |  |  |         #if ENABLED(AUTO_BED_LEVELING_FEATURE) | 
			
		
	
		
		
			
				
					
					|  |  |  |           // Offset extruder, make sure to apply the bed level rotation matrix
 |  |  |  |           // Offset extruder, make sure to apply the bed level rotation matrix
 | 
			
		
	
		
		
			
				
					
					|  |  |  |           vector_3 tmp_offset_vec = vector_3(hotend_offset[X_AXIS][tmp_extruder], |  |  |  |           vector_3 tmp_offset_vec = vector_3(hotend_offset[X_AXIS][tmp_extruder], | 
			
		
	
	
		
		
			
				
					|  |  | @ -6600,31 +6602,29 @@ inline void gcode_T(uint8_t tmp_extruder) { | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |           #if ENABLED(DEBUG_LEVELING_FEATURE) |  |  |  |           #if ENABLED(DEBUG_LEVELING_FEATURE) | 
			
		
	
		
		
			
				
					
					|  |  |  |             if (DEBUGGING(LEVELING)) { |  |  |  |             if (DEBUGGING(LEVELING)) { | 
			
		
	
		
		
			
				
					
					|  |  |  |               SERIAL_ECHOLNPGM(">>> gcode_T"); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |               tmp_offset_vec.debug("tmp_offset_vec"); |  |  |  |               tmp_offset_vec.debug("tmp_offset_vec"); | 
			
		
	
		
		
			
				
					
					|  |  |  |               act_offset_vec.debug("act_offset_vec"); |  |  |  |               act_offset_vec.debug("act_offset_vec"); | 
			
		
	
		
		
			
				
					
					|  |  |  |               offset_vec.debug("offset_vec (BEFORE)"); |  |  |  |               offset_vec.debug("offset_vec (BEFORE)"); | 
			
		
	
		
		
			
				
					
					|  |  |  |               DEBUG_POS("BEFORE rotation", current_position); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |             } |  |  |  |             } | 
			
		
	
		
		
			
				
					
					|  |  |  |           #endif |  |  |  |           #endif | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |           offset_vec.apply_rotation(planner.bed_level_matrix.transpose(planner.bed_level_matrix)); |  |  |  |           offset_vec.apply_rotation(planner.bed_level_matrix.transpose(planner.bed_level_matrix)); | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |           // Adjust the current position
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |           current_position[X_AXIS] += offset_vec.x; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |           current_position[Y_AXIS] += offset_vec.y; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |           current_position[Z_AXIS] += offset_vec.z; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |           #if ENABLED(DEBUG_LEVELING_FEATURE) |  |  |  |           #if ENABLED(DEBUG_LEVELING_FEATURE) | 
			
		
	
		
		
			
				
					
					|  |  |  |             if (DEBUGGING(LEVELING)) { |  |  |  |             if (DEBUGGING(LEVELING)) offset_vec.debug("offset_vec (AFTER)"); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |               offset_vec.debug("offset_vec (AFTER)"); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |               DEBUG_POS("AFTER rotation", current_position); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |               SERIAL_ECHOLNPGM("<<< gcode_T"); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |             } |  |  |  |  | 
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |           #endif |  |  |  |           #endif | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |           // Adjustments to the current position
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |           float xydiff[2] = { offset_vec.x, offset_vec.y }; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |           current_position[Z_AXIS] += offset_vec.z; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |         #else // !AUTO_BED_LEVELING_FEATURE
 |  |  |  |         #else // !AUTO_BED_LEVELING_FEATURE
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |           float xydiff[2] = { | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |             hotend_offset[X_AXIS][tmp_extruder] - hotend_offset[X_AXIS][active_extruder], | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |             hotend_offset[Y_AXIS][tmp_extruder] - hotend_offset[Y_AXIS][active_extruder] | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |           }; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |           #if ENABLED(MESH_BED_LEVELING) |  |  |  |           #if ENABLED(MESH_BED_LEVELING) | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |             if (mbl.active()) { |  |  |  |             if (mbl.active()) { | 
			
		
	
	
		
		
			
				
					|  |  | @ -6635,12 +6635,11 @@ inline void gcode_T(uint8_t tmp_extruder) { | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |           #endif // MESH_BED_LEVELING
 |  |  |  |           #endif // MESH_BED_LEVELING
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |           // The newly-selected extruder XY is actually at...
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |           current_position[X_AXIS] += xydiff[X_AXIS]; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |           current_position[Y_AXIS] += xydiff[Y_AXIS]; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         #endif // !AUTO_BED_LEVELING_FEATURE
 |  |  |  |         #endif // !AUTO_BED_LEVELING_FEATURE
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         // The newly-selected extruder XY is actually at...
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         current_position[X_AXIS] += xydiff[X_AXIS]; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         current_position[Y_AXIS] += xydiff[Y_AXIS]; | 
			
		
	
		
		
			
				
					
					|  |  |  |         for (uint8_t i = X_AXIS; i <= Y_AXIS; i++) { |  |  |  |         for (uint8_t i = X_AXIS; i <= Y_AXIS; i++) { | 
			
		
	
		
		
			
				
					
					|  |  |  |           position_shift[i] += xydiff[i]; |  |  |  |           position_shift[i] += xydiff[i]; | 
			
		
	
		
		
			
				
					
					|  |  |  |           update_software_endstops((AxisEnum)i); |  |  |  |           update_software_endstops((AxisEnum)i); | 
			
		
	
	
		
		
			
				
					|  |  | @ -6674,6 +6673,13 @@ inline void gcode_T(uint8_t tmp_extruder) { | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |   #endif |  |  |  |   #endif | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   #if ENABLED(DEBUG_LEVELING_FEATURE) | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     if (DEBUGGING(LEVELING)) { | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |       DEBUG_POS("AFTER", current_position); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |       SERIAL_ECHOLNPGM("<<< gcode_T"); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     } | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   #endif | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |   SERIAL_ECHO_START; |  |  |  |   SERIAL_ECHO_START; | 
			
		
	
		
		
			
				
					
					|  |  |  |   SERIAL_ECHOPGM(MSG_ACTIVE_EXTRUDER); |  |  |  |   SERIAL_ECHOPGM(MSG_ACTIVE_EXTRUDER); | 
			
		
	
		
		
			
				
					
					|  |  |  |   SERIAL_PROTOCOLLN((int)active_extruder); |  |  |  |   SERIAL_PROTOCOLLN((int)active_extruder); | 
			
		
	
	
		
		
			
				
					|  |  | 
 |