diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index ecc4da446..d1119e6f2 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -579,6 +579,9 @@ static std::vector get_path_of_change_filament(const Print& print) throw Slic3r::InvalidArgument("Error: WipeTowerIntegration::append_tcr was asked to do a toolchange it didn't expect."); int new_extruder_id = get_extruder_index(*m_print_config, new_filament_id); + + bool is_nozzle_change = !tcr.nozzle_change_result.gcode.empty() && (gcodegen.config().nozzle_diameter.size() > 1); + std::string gcode; // Toolchangeresult.gcode assumes the wipe tower corner is at the origin (except for priming lines) @@ -662,7 +665,7 @@ static std::vector get_path_of_change_filament(const Print& print) auto_lift_type = LiftType::SpiralLift; // BBS: should be placed before toolchange parsing - std::string toolchange_retract_str = gcodegen.retract(true, false, auto_lift_type, true); + std::string toolchange_retract_str = gcodegen.retract(tcr.is_tool_change && !is_nozzle_change, false, auto_lift_type, true); check_add_eol(toolchange_retract_str); // Process the custom change_filament_gcode. If it is empty, provide a simple Tn command to change the filament. @@ -673,7 +676,7 @@ static std::vector get_path_of_change_filament(const Print& print) // add nozzle change gcode into change filament gcode std::string nozzle_change_gcode_trans; - if (!tcr.nozzle_change_result.gcode.empty() && (gcodegen.config().nozzle_diameter.size() > 1)) { + if (is_nozzle_change) { // move to start_pos before nozzle change std::string start_pos_str; start_pos_str = gcodegen.travel_to(wipe_tower_point_to_object_point(gcodegen, transform_wt_pt(tcr.nozzle_change_result.start_pos) + plate_origin_2d), erMixed, @@ -686,7 +689,7 @@ static std::vector get_path_of_change_filament(const Print& print) gcodegen.m_wipe.reset_path(); for (const Vec2f& wipe_pt : tcr.nozzle_change_result.wipe_path) gcodegen.m_wipe.path.points.emplace_back(wipe_tower_point_to_object_point(gcodegen, transform_wt_pt(wipe_pt) + plate_origin_2d)); - nozzle_change_gcode_trans += gcodegen.retract(true, false, auto_lift_type, true); + nozzle_change_gcode_trans += gcodegen.retract(tcr.is_tool_change, false, auto_lift_type, true); end_filament_gcode_str = nozzle_change_gcode_trans + end_filament_gcode_str; } @@ -904,7 +907,7 @@ static std::vector get_path_of_change_filament(const Print& print) gcodegen.m_wipe.reset_path(); for (const Vec2f& wipe_pt : tcr.wipe_path) gcodegen.m_wipe.path.points.emplace_back(wipe_tower_point_to_object_point(gcodegen, transform_wt_pt(wipe_pt) + plate_origin_2d)); - gcode += gcodegen.retract(true, false, auto_lift_type, true); + gcode += gcodegen.retract(false, false, auto_lift_type, true); } // Let the planner know we are traveling between objects.