From d0b8323bc81230365bcaca8d4b03a45c6899666c Mon Sep 17 00:00:00 2001 From: Pavel Date: Wed, 19 Jul 2023 17:27:02 +0200 Subject: [PATCH] Trying to fix the issue with segfault, so far unsucessfully. It seems that one ExtrusionCollection is moved and then accessed... --- src/libslic3r/GCode/ExtrusionProcessor.cpp | 15 ++++++++------- src/libslic3r/GCode/ExtrusionProcessor.hpp | 2 +- src/libslic3r/Print.cpp | 2 ++ src/libslic3r/PrintObject.cpp | 2 +- 4 files changed, 12 insertions(+), 9 deletions(-) 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()]); }