From 0d55524fca6ea1ea4ca6387df8cfb725a90269c9 Mon Sep 17 00:00:00 2001 From: "zhimin.zeng" Date: Wed, 4 Dec 2024 14:33:17 +0800 Subject: [PATCH] FIX: fix the error retract of nozzle change jira: none Change-Id: I4773307263cbbca0955dd44bbf046e45d91f1b5f --- src/libslic3r/GCode.cpp | 22 +++++++++++++++++----- src/libslic3r/GCode/WipeTower.cpp | 25 +++++-------------------- 2 files changed, 22 insertions(+), 25 deletions(-) diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index f26687966..9907bbc87 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -515,11 +515,6 @@ static std::vector get_path_of_change_filament(const Print& print) } } - std::string nozzle_change_gcode_trans; - if (!tcr.nozzle_change_result.gcode.empty()) { - nozzle_change_gcode_trans = transform_gcode(tcr.nozzle_change_result.gcode, tcr.start_pos, wipe_tower_offset, wipe_tower_rotation); - } - //BBS: increase toolchange count gcodegen.m_toolchange_count++; @@ -532,6 +527,23 @@ static std::vector get_path_of_change_filament(const Print& print) std::string toolchange_gcode_str; std::string change_filament_gcode = gcodegen.config().change_filament_gcode.value; + 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; diff --git a/src/libslic3r/GCode/WipeTower.cpp b/src/libslic3r/GCode/WipeTower.cpp index 58eb91e67..e3b9d23e0 100644 --- a/src/libslic3r/GCode/WipeTower.cpp +++ b/src/libslic3r/GCode/WipeTower.cpp @@ -993,9 +993,6 @@ WipeTower::NozzleChangeResult WipeTower::nozzle_change(int old_filament_id, int (new_filament_id != (unsigned int) (-1) ? wipe_depth + m_depth_traversed - m_perimeter_width : m_wipe_tower_depth - m_perimeter_width)); Vec2f initial_position = cleaning_box.ld + Vec2f(0.f, m_depth_traversed); - writer.travel(initial_position, 30000); - writer.append("G1 Z" + std::to_string(m_z_pos) + "\n"); - writer.append("G1 E2 F1800\n"); writer.set_initial_position(initial_position, m_wipe_tower_width, m_wipe_tower_depth, m_internal_rotation); const float &xl = cleaning_box.ld.x(); @@ -1032,6 +1029,8 @@ WipeTower::NozzleChangeResult WipeTower::nozzle_change(int old_filament_id, int m_depth_traversed += nozzle_change_line_count * dy; + NozzleChangeResult result; + if (is_tpu_filament(m_current_tool)) { bool left_to_right = !m_left_to_right; @@ -1056,30 +1055,16 @@ WipeTower::NozzleChangeResult WipeTower::nozzle_change(int old_filament_id, int } } else { - auto float_to_string_with_precision = [](float value, int precision) { - std::ostringstream out; - out << std::fixed << std::setprecision(precision) << value; - return out.str(); - }; - - float wipe_distance = 2; - Vec2f wipe_pos = writer.pos(); + result.wipe_path.push_back(writer.pos()); if (m_left_to_right) { - wipe_pos.x() -= wipe_distance; + result.wipe_path.push_back(Vec2f(0, writer.y())); } else { - wipe_pos.x() += wipe_distance; + result.wipe_path.push_back(Vec2f(m_wipe_tower_width, writer.y())); } - writer.append("; WIPE_START\n"); - writer.extrude_explicit(wipe_pos, -2); - writer.append("; WIPE_END\n"); - - std::string lift_gcode = "G2 Z" + float_to_string_with_precision(m_z_pos + 0.4, 3) + " I0.86 J0.86 P1 F10000\n"; - writer.append(lift_gcode); } writer.append(format_nozzle_change_line(false, old_filament_id, new_filament_id)); - NozzleChangeResult result; result.start_pos = initial_position; result.end_pos = writer.pos(); result.gcode = writer.gcode();