From 5d557ed32fb2d7cdcaeb2d610fb4e86d4fad4b91 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luk=C3=A1=C5=A1=20Hejl?= Date: Thu, 30 Jun 2022 09:43:01 +0200 Subject: [PATCH] Fix of #8436 - Crash in the lightning infill when some region has zero infill density. --- src/libslic3r/Fill/FillLightning.cpp | 4 ++-- src/libslic3r/Fill/FillLightning.hpp | 2 +- src/libslic3r/Fill/Lightning/Generator.cpp | 4 ++-- src/libslic3r/Fill/Lightning/Generator.hpp | 2 +- src/libslic3r/PrintObject.cpp | 12 +++++++++--- 5 files changed, 15 insertions(+), 9 deletions(-) diff --git a/src/libslic3r/Fill/FillLightning.cpp b/src/libslic3r/Fill/FillLightning.cpp index dd2189e6b9..36a48e5547 100644 --- a/src/libslic3r/Fill/FillLightning.cpp +++ b/src/libslic3r/Fill/FillLightning.cpp @@ -26,9 +26,9 @@ void GeneratorDeleter::operator()(Generator *p) { delete p; } -GeneratorPtr build_generator(const PrintObject &print_object, const std::function &throw_on_cancel_callback) +GeneratorPtr build_generator(const PrintObject &print_object, const coordf_t fill_density, const std::function &throw_on_cancel_callback) { - return GeneratorPtr(new Generator(print_object, throw_on_cancel_callback)); + return GeneratorPtr(new Generator(print_object, fill_density, throw_on_cancel_callback)); } } // namespace Slic3r::FillAdaptive diff --git a/src/libslic3r/Fill/FillLightning.hpp b/src/libslic3r/Fill/FillLightning.hpp index 6e672783a1..341399508f 100644 --- a/src/libslic3r/Fill/FillLightning.hpp +++ b/src/libslic3r/Fill/FillLightning.hpp @@ -14,7 +14,7 @@ class Generator; struct GeneratorDeleter { void operator()(Generator *p); }; using GeneratorPtr = std::unique_ptr; -GeneratorPtr build_generator(const PrintObject &print_object, const std::function &throw_on_cancel_callback); +GeneratorPtr build_generator(const PrintObject &print_object, const coordf_t fill_density, const std::function &throw_on_cancel_callback); class Filler : public Slic3r::Fill { diff --git a/src/libslic3r/Fill/Lightning/Generator.cpp b/src/libslic3r/Fill/Lightning/Generator.cpp index ce527d3514..d770d97feb 100644 --- a/src/libslic3r/Fill/Lightning/Generator.cpp +++ b/src/libslic3r/Fill/Lightning/Generator.cpp @@ -24,7 +24,7 @@ namespace Slic3r::FillLightning { -Generator::Generator(const PrintObject &print_object, const std::function &throw_on_cancel_callback) +Generator::Generator(const PrintObject &print_object, const coordf_t fill_density, const std::function &throw_on_cancel_callback) { const PrintConfig &print_config = print_object.print()->config(); const PrintObjectConfig &object_config = print_object.config(); @@ -39,7 +39,7 @@ Generator::Generator(const PrintObject &print_object, const std::function(region_config.infill_extrusion_width.percent ? default_infill_extrusion_width * 0.01 * region_config.infill_extrusion_width : region_config.infill_extrusion_width != 0. ? region_config.infill_extrusion_width : default_infill_extrusion_width); - m_supporting_radius = coord_t(m_infill_extrusion_width) * 100 / coord_t(region_config.fill_density.value); + m_supporting_radius = coord_t(m_infill_extrusion_width * 100. / fill_density); const double lightning_infill_overhang_angle = M_PI / 4; // 45 degrees const double lightning_infill_prune_angle = M_PI / 4; // 45 degrees diff --git a/src/libslic3r/Fill/Lightning/Generator.hpp b/src/libslic3r/Fill/Lightning/Generator.hpp index d7e5f63f91..15ac7b2c72 100644 --- a/src/libslic3r/Fill/Lightning/Generator.hpp +++ b/src/libslic3r/Fill/Lightning/Generator.hpp @@ -44,7 +44,7 @@ public: * Lightning Infill for the infill areas in that mesh. The infill areas must * already be calculated at this point. */ - explicit Generator(const PrintObject &print_object, const std::function &throw_on_cancel_callback); + explicit Generator(const PrintObject &print_object, const coordf_t fill_density, const std::function &throw_on_cancel_callback); /*! * Get a tree of paths generated for a certain layer of the mesh. diff --git a/src/libslic3r/PrintObject.cpp b/src/libslic3r/PrintObject.cpp index 007c4796b7..aef5019220 100644 --- a/src/libslic3r/PrintObject.cpp +++ b/src/libslic3r/PrintObject.cpp @@ -457,14 +457,20 @@ std::pair PrintObject::prepare FillLightning::GeneratorPtr PrintObject::prepare_lightning_infill_data() { - bool has_lightning_infill = false; + bool has_lightning_infill = false; + coordf_t lightning_density = 0.; + size_t lightning_cnt = 0; for (size_t region_id = 0; region_id < this->num_printing_regions(); ++region_id) if (const PrintRegionConfig &config = this->printing_region(region_id).config(); config.fill_density > 0 && config.fill_pattern == ipLightning) { has_lightning_infill = true; - break; + lightning_density += config.fill_density; + ++lightning_cnt; } - return has_lightning_infill ? FillLightning::build_generator(std::as_const(*this), [this]() -> void { this->throw_if_canceled(); }) : FillLightning::GeneratorPtr(); + if (has_lightning_infill) + lightning_density /= coordf_t(lightning_cnt); + + return has_lightning_infill ? FillLightning::build_generator(std::as_const(*this), lightning_density, [this]() -> void { this->throw_if_canceled(); }) : FillLightning::GeneratorPtr(); } void PrintObject::clear_layers()