diff --git a/src/libslic3r/GCode/ExtrusionProcessor.cpp b/src/libslic3r/GCode/ExtrusionProcessor.cpp index 3f5d8f1d54..f5acf4749a 100644 --- a/src/libslic3r/GCode/ExtrusionProcessor.cpp +++ b/src/libslic3r/GCode/ExtrusionProcessor.cpp @@ -86,16 +86,17 @@ ExtrusionPaths calculate_and_split_overhanging_extrusions(const ExtrusionPath return result; }; -ExtrusionEntityCollection calculate_and_split_overhanging_extrusions(const ExtrusionEntityCollection &ecc, +ExtrusionEntityCollection calculate_and_split_overhanging_extrusions(const ExtrusionEntityCollection *ecc, const AABBTreeLines::LinesDistancer &unscaled_prev_layer, const AABBTreeLines::LinesDistancer &prev_layer_curled_lines) { - ExtrusionEntityCollection result; - result.no_sort = ecc.no_sort; - for (const auto *e : ecc.entities) { - if (auto *col = static_cast(e)) { - auto new_col = calculate_and_split_overhanging_extrusions(*col, unscaled_prev_layer, prev_layer_curled_lines); - result.append(new_col); + ExtrusionEntityCollection result{}; + result.no_sort = ecc->no_sort; + for (const auto *e : ecc->entities) { + if (e == nullptr) { + BOOST_LOG_TRIVIAL(debug) << "perimeters collections contain nullptr entities for some reason"; + } else if (auto *col = static_cast(e)) { + result.append(calculate_and_split_overhanging_extrusions(col, unscaled_prev_layer, prev_layer_curled_lines)); } else if (auto *loop = static_cast(e)) { ExtrusionLoop new_loop = *loop; new_loop.paths.clear(); diff --git a/src/libslic3r/GCode/ExtrusionProcessor.hpp b/src/libslic3r/GCode/ExtrusionProcessor.hpp index 0d60ad9851..c303618e46 100644 --- a/src/libslic3r/GCode/ExtrusionProcessor.hpp +++ b/src/libslic3r/GCode/ExtrusionProcessor.hpp @@ -218,7 +218,7 @@ ExtrusionPaths calculate_and_split_overhanging_extrusions(const ExtrusionPath const AABBTreeLines::LinesDistancer &unscaled_prev_layer, const AABBTreeLines::LinesDistancer &prev_layer_curled_lines); -ExtrusionEntityCollection calculate_and_split_overhanging_extrusions(const ExtrusionEntityCollection &ecc, +ExtrusionEntityCollection calculate_and_split_overhanging_extrusions(const ExtrusionEntityCollection *ecc, const AABBTreeLines::LinesDistancer &unscaled_prev_layer, const AABBTreeLines::LinesDistancer &prev_layer_curled_lines); diff --git a/src/libslic3r/Print.cpp b/src/libslic3r/Print.cpp index 2dac942e9e..f9c74058eb 100644 --- a/src/libslic3r/Print.cpp +++ b/src/libslic3r/Print.cpp @@ -914,6 +914,8 @@ void Print::process() obj->generate_support_material(); for (PrintObject *obj : m_objects) obj->estimate_curled_extrusions(); + for (PrintObject *obj : m_objects) + obj->calculate_overhanging_perimeters(); if (this->set_started(psWipeTower)) { m_wipe_tower_data.clear(); m_tool_ordering.clear(); diff --git a/src/libslic3r/PrintObject.cpp b/src/libslic3r/PrintObject.cpp index fd457e1691..43e2937238 100644 --- a/src/libslic3r/PrintObject.cpp +++ b/src/libslic3r/PrintObject.cpp @@ -561,7 +561,7 @@ void PrintObject::calculate_overhanging_perimeters() continue; } ExPolygons prev_layer_polygon = l->lower_layer == nullptr ? ExPolygons() : l->lower_layer->lslices; - layer_region->m_perimeters = calculate_and_split_overhanging_extrusions(layer_region->m_perimeters, + layer_region->m_perimeters = calculate_and_split_overhanging_extrusions(&layer_region->m_perimeters, unscaled_polygons_lines[l->id()], curled_lines[l->id()]); }