From e6d10fc74737430caac862d7bbe9a06fe9cdeb80 Mon Sep 17 00:00:00 2001 From: Vojtech Bubnik Date: Mon, 28 Nov 2022 10:07:22 +0100 Subject: [PATCH] Fixed crash on reslicing after infill invalidation. The crash was introduced with sorting the extrusions into islands. --- src/libslic3r/Fill/Fill.cpp | 14 ++++++++++---- src/libslic3r/Layer.cpp | 1 + src/libslic3r/Layer.hpp | 2 ++ src/libslic3r/PrintObject.cpp | 1 + 4 files changed, 14 insertions(+), 4 deletions(-) diff --git a/src/libslic3r/Fill/Fill.cpp b/src/libslic3r/Fill/Fill.cpp index 9fd20cf9f..c962bbeb0 100644 --- a/src/libslic3r/Fill/Fill.cpp +++ b/src/libslic3r/Fill/Fill.cpp @@ -408,12 +408,18 @@ static void insert_fills_into_islands(Layer &layer, uint32_t fill_region_id, uin } } -// friend to Layer +void Layer::clear_fills() +{ + for (LayerRegion *layerm : m_regions) + layerm->m_fills.clear(); + for (LayerSlice &lslice : lslices_ex) + for (LayerIsland &island : lslice.islands) + island.fills.clear(); +} + void Layer::make_fills(FillAdaptive::Octree* adaptive_fill_octree, FillAdaptive::Octree* support_fill_octree, FillLightning::Generator* lightning_generator) { - for (LayerRegion *layerm : m_regions) - layerm->m_fills.clear(); - + this->clear_fills(); #ifdef SLIC3R_DEBUG_SLICE_PROCESSING // this->export_region_fill_surfaces_to_svg_debug("10_fill-initial"); diff --git a/src/libslic3r/Layer.cpp b/src/libslic3r/Layer.cpp index 97c98a0e8..2fa0c5c3c 100644 --- a/src/libslic3r/Layer.cpp +++ b/src/libslic3r/Layer.cpp @@ -443,6 +443,7 @@ void Layer::make_perimeters() layerm.m_fill_expolygons_composite_bboxes.clear(); }; + // Remove layer islands, remove references to perimeters and fills from these layer islands to LayerRegion ExtrusionEntities. for (LayerSlice &lslice : this->lslices_ex) lslice.islands.clear(); diff --git a/src/libslic3r/Layer.hpp b/src/libslic3r/Layer.hpp index 0aa4c2aa3..024ed41a4 100644 --- a/src/libslic3r/Layer.hpp +++ b/src/libslic3r/Layer.hpp @@ -390,6 +390,8 @@ protected: slice_z(slice_z), print_z(print_z), height(height), m_id(id), m_object(object) {} virtual ~Layer(); + // Clear fill extrusions, remove them from layer islands. + void clear_fills(); private: void sort_perimeters_into_islands( diff --git a/src/libslic3r/PrintObject.cpp b/src/libslic3r/PrintObject.cpp index e7f2abe1c..1b3bf5d44 100644 --- a/src/libslic3r/PrintObject.cpp +++ b/src/libslic3r/PrintObject.cpp @@ -131,6 +131,7 @@ void PrintObject::make_perimeters() // Revert the typed slices into untyped slices. if (m_typed_slices) { for (Layer *layer : m_layers) { + layer->clear_fills(); layer->restore_untyped_slices(); m_print->throw_if_canceled(); }