diff --git a/src/libslic3r/GCode/ToolOrdering.cpp b/src/libslic3r/GCode/ToolOrdering.cpp index 011420e71..43f498b60 100644 --- a/src/libslic3r/GCode/ToolOrdering.cpp +++ b/src/libslic3r/GCode/ToolOrdering.cpp @@ -355,7 +355,7 @@ void ToolOrdering::fill_wipe_tower_partitions(const PrintConfig &config, coordf_ max_layer_height = std::min(max_layer_height, mlh); } // The Prusa3D Fast (0.35mm layer height) print profile sets a higher layer height than what is normally allowed - // by the nozzle. This is a hack and it works by increasing extrusion width. + // by the nozzle. This is a hack and it works by increasing extrusion width. See GH #3919. max_layer_height = std::max(max_layer_height, max_object_layer_height); for (size_t i = 0; i + 1 < m_layer_tools.size(); ++ i) { @@ -400,47 +400,21 @@ void ToolOrdering::fill_wipe_tower_partitions(const PrintConfig &config, coordf_ // and maybe other problems. We will therefore go through layer_tools and detect and fix this. // So, if there is a non-object layer starting with different extruder than the last one ended with (or containing more than one extruder), // we'll mark it with has_wipe tower. - assert(! m_layer_tools.empty() && m_layer_tools.front().has_wipe_tower); - if (! m_layer_tools.empty() && m_layer_tools.front().has_wipe_tower) { - for (size_t i = 0; i + 1 < m_layer_tools.size();) { - const LayerTools < = m_layer_tools[i]; - assert(lt.has_wipe_tower); - assert(! lt.extruders.empty()); - // Find the next layer with wipe tower or mark a layer as such. - size_t j = i + 1; - for (; j < m_layer_tools.size() && ! m_layer_tools[j].has_wipe_tower; ++ j) { - LayerTools <_next = m_layer_tools[j]; - if (lt_next.extruders.empty()) { - //FIXME Vojtech: Lukasi, proc? - j = m_layer_tools.size(); - break; - } - if (lt_next.extruders.front() != lt.extruders.back() || lt_next.extruders.size() > 1) { - // Support only layer, soluble layers? Otherwise the layer should have been already marked as having wipe tower. - assert(lt_next.has_support && ! lt_next.has_object); - lt_next.has_wipe_tower = true; - break; - } + for (unsigned int i=0; i+1 1)) + lt_next.has_wipe_tower = true; + // We should also check that the next wipe tower layer is no further than max_layer_height: + unsigned int j = i+1; + double last_wipe_tower_print_z = lt_next.print_z; + while (++j < m_layer_tools.size()-1 && !m_layer_tools[j].has_wipe_tower) + if (m_layer_tools[j+1].print_z - last_wipe_tower_print_z > max_layer_height + EPSILON) { + m_layer_tools[j].has_wipe_tower = true; + last_wipe_tower_print_z = m_layer_tools[j].print_z; } - if (j == m_layer_tools.size()) - // No wipe tower above layer i, therefore no need to add any wipe tower layer above i. - break; - // We should also check that the next wipe tower layer is no further than max_layer_height. - // This algorith may in theory create very thin wipe layer j if layer closely below j is marked as wipe tower. - // This may happen if printing with non-soluble break away supports. - // On the other side it should not hurt as there will be no wipe, just perimeter and sparse infill printed - // at that particular wipe tower layer without extruder change. - double last_wipe_tower_print_z = lt.print_z; - assert(m_layer_tools[j].has_wipe_tower); - for (size_t k = i + 1; k < j; ++k) { - assert(! m_layer_tools[k].has_wipe_tower); - if (m_layer_tools[k + 1].print_z - last_wipe_tower_print_z > max_layer_height + EPSILON) { - m_layer_tools[k].has_wipe_tower = true; - last_wipe_tower_print_z = m_layer_tools[k].print_z; - } - } - i = j; - } } // Calculate the wipe_tower_layer_height values. diff --git a/src/slic3r/GUI/GUI_ObjectList.hpp b/src/slic3r/GUI/GUI_ObjectList.hpp index ad222a4a8..aa5264b07 100644 --- a/src/slic3r/GUI/GUI_ObjectList.hpp +++ b/src/slic3r/GUI/GUI_ObjectList.hpp @@ -13,6 +13,8 @@ #include "wxExtensions.hpp" #include "ObjectDataViewModel.hpp" +#include "libslic3r/PrintConfig.hpp" + class wxBoxSizer; class wxBitmapComboBox; class wxMenuItem;