diff --git a/src/libslic3r/GCode/WipeTower.cpp b/src/libslic3r/GCode/WipeTower.cpp index 947cf8580..84bfd42e8 100644 --- a/src/libslic3r/GCode/WipeTower.cpp +++ b/src/libslic3r/GCode/WipeTower.cpp @@ -2380,7 +2380,7 @@ void WipeTower::plan_toolchange(float z_par, float layer_height_par, unsigned in float nozzle_change_depth = 0; if (!m_filament_map.empty() && m_filament_map[old_tool] != m_filament_map[new_tool]) { - double e_flow = extrusion_flow(layer_height_par); + double e_flow = nozzle_change_extrusion_flow(layer_height_par); double length = m_filaments_change_length[old_tool] / e_flow; int nozzle_change_line_count = length / (m_wipe_tower_width - 2*m_perimeter_width) + 1; if (has_tpu_filament()) @@ -2636,6 +2636,7 @@ WipeTower::ToolChangeResult WipeTower::tool_change_new(size_t new_tool, bool sol float wipe_length = 0.f; float purge_volume = 0.f; float nozzle_change_depth = 0.f; + int nozzle_change_line_count = 0; if (new_tool != (unsigned int) (-1)) { for (const auto &b : m_layer_info->tool_changes) @@ -2644,6 +2645,10 @@ WipeTower::ToolChangeResult WipeTower::tool_change_new(size_t new_tool, bool sol wipe_depth = b.required_depth; purge_volume = b.purge_volume; nozzle_change_depth = b.nozzle_change_depth; + if (has_tpu_filament()) + nozzle_change_line_count = ((b.nozzle_change_depth + WT_EPSILON) / m_nozzle_change_perimeter_width) / 2; + else + nozzle_change_line_count = (b.nozzle_change_depth + WT_EPSILON) / m_nozzle_change_perimeter_width; break; } } @@ -2693,10 +2698,7 @@ WipeTower::ToolChangeResult WipeTower::tool_change_new(size_t new_tool, bool sol Vec2f start_pos = m_nozzle_change_result.origin_start_pos + Vec2f(0, m_nozzle_change_perimeter_width); bool left_to_right = true; - double tpu_travel_length = 5; - double e_flow = extrusion_flow(m_layer_height); - double length = tpu_travel_length / e_flow; - int tpu_line_count = length / (m_wipe_tower_width - 2 * m_perimeter_width) + 1; + int tpu_line_count = (nozzle_change_line_count + 2 - 1) / 2; // nozzle_change_line_count / 2 round up writer.travel(start_pos); @@ -2761,19 +2763,15 @@ WipeTower::NozzleChangeResult WipeTower::nozzle_change_new(int old_filament_id, return std::string(buff); }; - auto nozzle_change_extrusion_flow = [this](float layer_height) -> float { - return layer_height * (m_nozzle_change_perimeter_width - layer_height * (1.f - float(M_PI) / 4.f)) / filament_area(); - }; - float nz_extrusion_flow = nozzle_change_extrusion_flow(m_layer_height); float nozzle_change_speed = 60.0f * m_filpar[m_current_tool].max_e_speed / nz_extrusion_flow; nozzle_change_speed = solid_infill ? 40.f * 60.f : nozzle_change_speed; - float bridge_speed = 60.f * 50; // limit the bridge speed to 50 for nozzle change + //float bridge_speed = 60.f * 50; // limit the bridge speed to 50 for nozzle change //float nozzle_change_speed = is_first_layer() ? std::min(m_first_layer_speed * 60.f, 4800.f) : 4800.f; if (is_tpu_filament(m_current_tool)) { nozzle_change_speed *= 0.25; } - bridge_speed = nozzle_change_speed; + //bridge_speed = nozzle_change_speed; WipeTowerWriter writer(m_layer_height, m_nozzle_change_perimeter_width, m_gcode_flavor, m_filpar); writer.set_extrusion_flow(nz_extrusion_flow) @@ -2809,11 +2807,11 @@ WipeTower::NozzleChangeResult WipeTower::nozzle_change_new(int old_filament_id, nozzle_change_speed = 60.0f * m_filpar[m_current_tool].max_e_speed / get_extrusion_flow(); } #endif - bool need_change_flow = need_thick_bridge_flow(writer.y()); + //bool need_change_flow = need_thick_bridge_flow(writer.y()); if (m_left_to_right) - writer.extrude(xr + wipe_tower_wall_infill_overlap * m_perimeter_width, writer.y(), need_change_flow ? bridge_speed : nozzle_change_speed); + writer.extrude(xr + wipe_tower_wall_infill_overlap * m_perimeter_width, writer.y(), /*need_change_flow ? bridge_speed :*/ nozzle_change_speed); else - writer.extrude(xl - wipe_tower_wall_infill_overlap * m_perimeter_width, writer.y(), need_change_flow ? bridge_speed : nozzle_change_speed); + writer.extrude(xl - wipe_tower_wall_infill_overlap * m_perimeter_width, writer.y(), /*need_change_flow ? bridge_speed :*/ nozzle_change_speed); if (i == nozzle_change_line_count - 1) break; @@ -2829,10 +2827,7 @@ WipeTower::NozzleChangeResult WipeTower::nozzle_change_new(int old_filament_id, NozzleChangeResult result; if (is_tpu_filament(m_current_tool)) { bool left_to_right = !m_left_to_right; - double tpu_travel_length = 5; - double e_flow = extrusion_flow(m_layer_height); - double length = tpu_travel_length / e_flow; - int tpu_line_count = length / (m_wipe_tower_width - 2 * m_perimeter_width) + 1; + int tpu_line_count = (nozzle_change_line_count + 2 - 1) / 2; // nozzle_change_line_count / 2 round up writer.travel(writer.x(), writer.y() - m_nozzle_change_perimeter_width); diff --git a/src/libslic3r/GCode/WipeTower.hpp b/src/libslic3r/GCode/WipeTower.hpp index 65702c1c0..326080a18 100644 --- a/src/libslic3r/GCode/WipeTower.hpp +++ b/src/libslic3r/GCode/WipeTower.hpp @@ -277,6 +277,12 @@ public: if (layer_height < 0) return m_extrusion_flow; return layer_height * (m_perimeter_width - layer_height * (1.f - float(M_PI) / 4.f)) / filament_area(); } + float nozzle_change_extrusion_flow(float layer_height = -1.f) const // negative layer_height - return current m_extrusion_flow + { + if (layer_height < 0) + return m_extrusion_flow; + return layer_height * (m_nozzle_change_perimeter_width - layer_height * (1.f - float(M_PI) / 4.f)) / filament_area(); + } bool get_floating_area(float& start_pos_y, float& end_pos_y) const; bool need_thick_bridge_flow(float pos_y) const;