diff --git a/src/libslic3r/GCode/WipeTower.cpp b/src/libslic3r/GCode/WipeTower.cpp index 25aaf4f1d..b0d90ebcb 100644 --- a/src/libslic3r/GCode/WipeTower.cpp +++ b/src/libslic3r/GCode/WipeTower.cpp @@ -1516,7 +1516,8 @@ WipeTower::WipeTower(const PrintConfig& config, int plate_idx, Vec3d plate_origi m_used_fillet(config.prime_tower_fillet_wall.value), m_extra_spacing((float)config.prime_tower_infill_gap.value/100.f), m_tower_framework(config.prime_tower_enable_framework.value), - m_max_speed((float)config.prime_tower_max_speed.value*60.f) + m_max_speed((float)config.prime_tower_max_speed.value*60.f), + m_printable_height(config.extruder_printable_height.values) { // Read absolute value of first layer speed, if given as percentage, // it is taken over following default. Speeds from config are not @@ -1560,6 +1561,7 @@ WipeTower::WipeTower(const PrintConfig& config, int plate_idx, Vec3d plate_origi ? Vec2f(bed_points.front().x(), bed_points.front().y()) : Vec2f::Zero(); flat_ironing = config.nozzle_diameter.values.size() > 1;//Only used for dual extrusion + m_last_layer_id.resize(config.nozzle_diameter.size(), -1); } @@ -2789,7 +2791,9 @@ WipeTower::ToolChangeResult WipeTower::tool_change_new(size_t new_tool, bool sol { m_nozzle_change_result.gcode.clear(); if (!m_filament_map.empty() && new_tool < m_filament_map.size() && m_filament_map[m_current_tool] != m_filament_map[new_tool]) { - m_nozzle_change_result = nozzle_change_new(m_current_tool, new_tool, solid_nozzlechange); + //If it is the last layer and exceeds the printable height, cancel ramming + if (is_valid_last_layer(m_current_tool)) + m_nozzle_change_result = nozzle_change_new(m_current_tool, new_tool, solid_nozzlechange); } size_t old_tool = m_current_tool; @@ -3593,6 +3597,18 @@ void WipeTower::reset_block_status() block.last_nozzle_change_id = -1; } } +void WipeTower::set_nozzle_last_layer_id() +{ + for (int idx = 0; idx < m_plan.size(); idx++) { + auto &info = m_plan[idx]; + for(int i =0 ; i= 0) m_last_layer_id[m_filament_map[old_tool] - 1] = idx; + m_last_layer_id[m_filament_map[new_tool] - 1] = idx; + } + } +} void WipeTower::update_all_layer_depth(float wipe_tower_depth) { @@ -3804,6 +3820,7 @@ void WipeTower::plan_tower_new() } update_all_layer_depth(max_depth); + set_nozzle_last_layer_id(); m_rib_length = std::max({m_rib_length, sqrt(m_wipe_tower_depth * m_wipe_tower_depth + m_wipe_tower_width * m_wipe_tower_width)}); m_rib_length += m_extra_rib_length; m_rib_length = std::max(0.f, m_rib_length); @@ -3896,9 +3913,7 @@ void WipeTower::generate_new(std::vectordepth < m_perimeter_width) continue; - if (m_wipe_tower_blocks.size() == 1) { if (m_layer_info->depth < m_wipe_tower_depth - m_perimeter_width) { // align y shift to perimeter width @@ -3920,9 +3935,9 @@ void WipeTower::generate_new(std::vector= 0 && tool < m_filament_map.size() && m_last_layer_id[nozzle_id]==m_cur_layer_id && m_z_pos > m_printable_height[nozzle_id]) return false; + return true; +} + } // namespace Slic3r diff --git a/src/libslic3r/GCode/WipeTower.hpp b/src/libslic3r/GCode/WipeTower.hpp index b0f98d36e..1226cc003 100644 --- a/src/libslic3r/GCode/WipeTower.hpp +++ b/src/libslic3r/GCode/WipeTower.hpp @@ -240,7 +240,6 @@ public: // Calculate extrusion flow from desired line width, nozzle diameter, filament diameter and layer_height: m_extrusion_flow = extrusion_flow(layer_height); - // Advance m_layer_info iterator, making sure we got it right while (!m_plan.empty() && m_layer_info->z < print_z - WT_EPSILON && m_layer_info+1 != m_plan.end()) ++m_layer_info; @@ -390,6 +389,7 @@ public: void plan_tower_new(); void generate_wipe_tower_blocks(); void update_all_layer_depth(float wipe_tower_depth); + void set_nozzle_last_layer_id(); ToolChangeResult tool_change_new(size_t new_tool, bool solid_change = false, bool solid_nozzlechange=false); NozzleChangeResult nozzle_change_new(int old_filament_id, int new_filament_id, bool solid_change = false); @@ -431,7 +431,7 @@ private: float m_travel_speed = 0.f; float m_first_layer_speed = 0.f; size_t m_first_layer_idx = size_t(-1); - + std::vector m_last_layer_id; std::vector m_filaments_change_length; size_t m_cur_layer_id; NozzleChangeResult m_nozzle_change_result; @@ -497,7 +497,9 @@ private: float m_max_speed = 5400.f; // the maximum printing speed on the prime tower. std::vector m_wall_skip_points; std::map m_outer_wall; + std::vector m_printable_height; bool is_first_layer() const { return size_t(m_layer_info - m_plan.begin()) == m_first_layer_idx; } + bool is_valid_last_layer(int tool) const; // Calculates length of extrusion line to extrude given volume float volume_to_length(float volume, float line_width, float layer_height) const {