diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index d75366ae6..338e66ce6 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -529,31 +529,27 @@ static std::vector get_path_of_change_filament(const Print& print) // Process the custom change_filament_gcode. If it is empty, provide a simple Tn command to change the filament. // Otherwise, leave control to the user completely. std::string change_filament_gcode = gcodegen.config().change_filament_gcode.value; - // add nozzle change gcode into change filament gcode - { - std::string nozzle_change_gcode_trans; - if (!tcr.nozzle_change_result.gcode.empty()) { - // 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, - "Move to nozzle change start pos"); - check_add_eol(start_pos_str); - nozzle_change_gcode_trans += start_pos_str; - nozzle_change_gcode_trans += gcodegen.unretract(); - nozzle_change_gcode_trans += transform_gcode(tcr.nozzle_change_result.gcode, tcr.nozzle_change_result.start_pos, wipe_tower_offset, wipe_tower_rotation); - gcodegen.set_last_pos(wipe_tower_point_to_object_point(gcodegen, transform_wt_pt(tcr.nozzle_change_result.end_pos) + plate_origin_2d)); - 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); - } - std::string prefix_gcode = lift_gcode_after_printing_object; - if (gcodegen.config().nozzle_diameter.size() > 1) { - prefix_gcode += nozzle_change_gcode_trans; - } - change_filament_gcode = prefix_gcode + change_filament_gcode; + // add nozzle change gcode into change filament gcode + std::string prefix_gcode = lift_gcode_after_printing_object; + std::string nozzle_change_gcode_trans; + if (!tcr.nozzle_change_result.gcode.empty() && (gcodegen.config().nozzle_diameter.size() > 1)) { + // 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, + "Move to nozzle change start pos"); + check_add_eol(start_pos_str); + nozzle_change_gcode_trans += start_pos_str; + nozzle_change_gcode_trans += gcodegen.unretract(); + nozzle_change_gcode_trans += transform_gcode(tcr.nozzle_change_result.gcode, tcr.nozzle_change_result.start_pos, wipe_tower_offset, wipe_tower_rotation); + gcodegen.set_last_pos(wipe_tower_point_to_object_point(gcodegen, transform_wt_pt(tcr.nozzle_change_result.end_pos) + plate_origin_2d)); + 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); + prefix_gcode = nozzle_change_gcode_trans; } + change_filament_gcode = prefix_gcode + change_filament_gcode; if (! change_filament_gcode.empty()) { DynamicConfig config; @@ -720,7 +716,7 @@ static std::vector get_path_of_change_filament(const Print& print) // Prepare a future wipe. 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))); + gcodegen.m_wipe.path.points.emplace_back(wipe_tower_point_to_object_point(gcodegen, transform_wt_pt(wipe_pt) + plate_origin_2d)); } // Let the planner know we are traveling between objects. diff --git a/src/libslic3r/GCode/WipeTower.cpp b/src/libslic3r/GCode/WipeTower.cpp index bbaef5d1d..8c47800cd 100644 --- a/src/libslic3r/GCode/WipeTower.cpp +++ b/src/libslic3r/GCode/WipeTower.cpp @@ -1905,7 +1905,7 @@ WipeTower::ToolChangeResult WipeTower::tool_change_new(size_t new_tool) const float &xl = cleaning_box.ld.x(); const float &xr = cleaning_box.rd.x(); - Vec2f start_pos = m_nozzle_change_result.start_pos + Vec2f(0, m_perimeter_width); + Vec2f start_pos = m_nozzle_change_result.origin_start_pos + Vec2f(0, m_perimeter_width); bool left_to_right = true; double tpu_travel_length = 5; double e_flow = extrusion_flow(0.2); @@ -2058,6 +2058,7 @@ WipeTower::NozzleChangeResult WipeTower::nozzle_change_new(int old_filament_id, writer.append(format_nozzle_change_line(false, old_filament_id, new_filament_id)); result.start_pos = writer.start_pos_rotated(); + result.origin_start_pos = initial_position; result.end_pos = writer.pos(); result.gcode = writer.gcode(); return result; diff --git a/src/libslic3r/GCode/WipeTower.hpp b/src/libslic3r/GCode/WipeTower.hpp index 68e1c11cb..8800fad97 100644 --- a/src/libslic3r/GCode/WipeTower.hpp +++ b/src/libslic3r/GCode/WipeTower.hpp @@ -42,9 +42,11 @@ public: { std::string gcode; - Vec2f start_pos; + Vec2f start_pos; // rotated Vec2f end_pos; + Vec2f origin_start_pos; // not rotated + std::vector wipe_path; };