Merge branch 'lm_empty_layer_crash'
This commit is contained in:
commit
d95c151823
@ -355,7 +355,7 @@ void ToolOrdering::fill_wipe_tower_partitions(const PrintConfig &config, coordf_
|
|||||||
max_layer_height = std::min(max_layer_height, mlh);
|
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
|
// 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);
|
max_layer_height = std::max(max_layer_height, max_object_layer_height);
|
||||||
|
|
||||||
for (size_t i = 0; i + 1 < m_layer_tools.size(); ++ i) {
|
for (size_t i = 0; i + 1 < m_layer_tools.size(); ++ i) {
|
||||||
@ -400,46 +400,20 @@ 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.
|
// 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),
|
// 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.
|
// we'll mark it with has_wipe tower.
|
||||||
assert(! m_layer_tools.empty() && m_layer_tools.front().has_wipe_tower);
|
for (unsigned int i=0; i+1<m_layer_tools.size(); ++i) {
|
||||||
if (! m_layer_tools.empty() && m_layer_tools.front().has_wipe_tower) {
|
LayerTools& lt = m_layer_tools[i];
|
||||||
for (size_t i = 0; i + 1 < m_layer_tools.size();) {
|
LayerTools& lt_next = m_layer_tools[i+1];
|
||||||
const LayerTools < = m_layer_tools[i];
|
if (lt.extruders.empty() || lt_next.extruders.empty())
|
||||||
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;
|
break;
|
||||||
}
|
if (!lt_next.has_wipe_tower && (lt_next.extruders.front() != lt.extruders.back() || lt_next.extruders.size() > 1))
|
||||||
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;
|
lt_next.has_wipe_tower = true;
|
||||||
break;
|
// 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;
|
||||||
if (j == m_layer_tools.size())
|
while (++j < m_layer_tools.size()-1 && !m_layer_tools[j].has_wipe_tower)
|
||||||
// No wipe tower above layer i, therefore no need to add any wipe tower layer above i.
|
if (m_layer_tools[j+1].print_z - last_wipe_tower_print_z > max_layer_height + EPSILON) {
|
||||||
break;
|
m_layer_tools[j].has_wipe_tower = true;
|
||||||
// We should also check that the next wipe tower layer is no further than max_layer_height.
|
last_wipe_tower_print_z = m_layer_tools[j].print_z;
|
||||||
// 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;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -13,6 +13,8 @@
|
|||||||
#include "wxExtensions.hpp"
|
#include "wxExtensions.hpp"
|
||||||
#include "ObjectDataViewModel.hpp"
|
#include "ObjectDataViewModel.hpp"
|
||||||
|
|
||||||
|
#include "libslic3r/PrintConfig.hpp"
|
||||||
|
|
||||||
class wxBoxSizer;
|
class wxBoxSizer;
|
||||||
class wxBitmapComboBox;
|
class wxBitmapComboBox;
|
||||||
class wxMenuItem;
|
class wxMenuItem;
|
||||||
|
Loading…
Reference in New Issue
Block a user