I just got the printer working again and am back to this issue. This printer did have Marlin on it and it did the tool switching quite fast. I am using Simplify 3D and there are no offsets set in there and there are no tool change scripts set. I cannot find anything else in the slicer that would affect tool change.
Now to your post. I've been diggin through the Extruder.cpp and I only see 3 places where EXTRUDER_SWITCH_XY_SPEED is used. I'll go through and tell you what I see. Please correct me if I'm wrong on any of these.
1. This one only applies to dual x axis
#if DUAL_X_AXIS
#if LAZY_DUAL_X_AXIS
if(Printer::sledParked) {
dualXPosSteps = Printer::lastCmdPos[X_AXIS] * Printer::axisStepsPerMM[X_AXIS] - Printer::xMinSteps; // correct to where we should be
}
#endif // LAZY_DUAL_X_AXIS
if(Printer::isXHomed() && executeSelect
#if LAZY_DUAL_X_AXIS
&& !Printer::sledParked
#endif
) { // park extruder that will become inactive
bool oldDestCheck = Printer::isNoDestinationCheck();
Printer::setNoDestinationCheck(true);
PrintLine::moveRelativeDistanceInSteps(current->xOffset - dualXPosSteps, 0, 0, 0, EXTRUDER_SWITCH_XY_SPEED, true, false);
Printer::setNoDestinationCheck(oldDestCheck);
#if LAZY_DUAL_X_AXIS
Printer::sledParked = true;
#endif
}
#endif
2. This one also only applies to dual x axis, but NOT lazy dual x axis
#if DUAL_X_AXIS
// Unpark new current extruder
if(executeSelect) {// Run only when changing
Commands::waitUntilEndOfAllMoves();
Printer::updateCurrentPosition(true); // does not update x in lazy mode!
GCode::executeFString(next->selectCommands);
}
#if LAZY_DUAL_X_AXIS == 0
if (executeSelect) {
Printer::currentPositionSteps[X_AXIS] = Extruder::current->xOffset - dualXPosSteps;
if(Printer::isXHomed()) {
PrintLine::moveRelativeDistanceInSteps(-next->xOffset + dualXPosSteps, 0, 0, 0, EXTRUDER_SWITCH_XY_SPEED, true, false);
Printer::currentPositionSteps[X_AXIS] = dualXPosSteps + Printer::xMinSteps;
}
}
#endif // LAZY_DUAL_X_AXIS == 0
3. This one looks like it wants to work, but only if you home all... or is the isHomedAll referring to if a home all was done since power on?
#if DUAL_X_AXIS == 0 || LAZY_DUAL_X_AXIS == 0
#if RAISE_Z_ON_TOOLCHANGE > 0 && !LAZY_DUAL_X_AXIS
if (Printer::isZHomed()) {
Printer::moveToReal(IGNORE_COORDINATE, IGNORE_COORDINATE, cz, IGNORE_COORDINATE, Printer::homingFeedrate[Z_AXIS]);
Printer::lastCmdPos[Z_AXIS] = lastZ;
}
#endif
if(Printer::isHomedAll()) {
Printer::moveToReal(cx, cy, cz, IGNORE_COORDINATE, EXTRUDER_SWITCH_XY_SPEED);
}
#endif