Fix of weird double extrusions with multiple regions and their

parameters being changed between slicing runs.
This commit is contained in:
bubnikv 2020-03-20 13:37:13 +01:00
parent 38d06d57a0
commit a9fc39491e

View file

@ -112,7 +112,12 @@ void Layer::make_perimeters()
// keep track of regions whose perimeters we have already generated // keep track of regions whose perimeters we have already generated
std::vector<unsigned char> done(m_regions.size(), false); std::vector<unsigned char> done(m_regions.size(), false);
for (LayerRegionPtrs::iterator layerm = m_regions.begin(); layerm != m_regions.end(); ++ layerm) { for (LayerRegionPtrs::iterator layerm = m_regions.begin(); layerm != m_regions.end(); ++ layerm)
if ((*layerm)->slices.empty()) {
(*layerm)->perimeters.clear();
(*layerm)->fills.clear();
(*layerm)->thin_fills.clear();
} else {
size_t region_id = layerm - m_regions.begin(); size_t region_id = layerm - m_regions.begin();
if (done[region_id]) if (done[region_id])
continue; continue;
@ -123,7 +128,8 @@ void Layer::make_perimeters()
// find compatible regions // find compatible regions
LayerRegionPtrs layerms; LayerRegionPtrs layerms;
layerms.push_back(*layerm); layerms.push_back(*layerm);
for (LayerRegionPtrs::const_iterator it = layerm + 1; it != m_regions.end(); ++it) { for (LayerRegionPtrs::const_iterator it = layerm + 1; it != m_regions.end(); ++it)
if (! (*it)->slices.empty()) {
LayerRegion* other_layerm = *it; LayerRegion* other_layerm = *it;
const PrintRegionConfig &other_config = other_layerm->region()->config(); const PrintRegionConfig &other_config = other_layerm->region()->config();
if (config.perimeter_extruder == other_config.perimeter_extruder if (config.perimeter_extruder == other_config.perimeter_extruder
@ -135,7 +141,11 @@ void Layer::make_perimeters()
&& config.opt_serialize("perimeter_extrusion_width") == other_config.opt_serialize("perimeter_extrusion_width") && config.opt_serialize("perimeter_extrusion_width") == other_config.opt_serialize("perimeter_extrusion_width")
&& config.thin_walls == other_config.thin_walls && config.thin_walls == other_config.thin_walls
&& config.external_perimeters_first == other_config.external_perimeters_first && config.external_perimeters_first == other_config.external_perimeters_first
&& config.infill_overlap == other_config.infill_overlap) { && config.infill_overlap == other_config.infill_overlap)
{
other_layerm->perimeters.clear();
other_layerm->fills.clear();
other_layerm->thin_fills.clear();
layerms.push_back(other_layerm); layerms.push_back(other_layerm);
done[it - m_regions.begin()] = true; done[it - m_regions.begin()] = true;
} }