From 402affb03521d0dbc159f98c24a5964edc23715b Mon Sep 17 00:00:00 2001 From: Vojtech Bubnik Date: Tue, 17 Jan 2023 14:58:07 +0100 Subject: [PATCH] Fix of #9399 Thick layers + thick raft + lightning infill = crash FillLightning::Filler infill wrapper was not aware of the fact that Layer::id() returns layer index that includes raft layers. This is newly handled by the FillLightning::Filler wrapper. --- src/libslic3r/Fill/Fill.cpp | 7 +++++-- src/libslic3r/Fill/FillLightning.cpp | 2 +- src/libslic3r/Fill/FillLightning.hpp | 1 + 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/libslic3r/Fill/Fill.cpp b/src/libslic3r/Fill/Fill.cpp index 01c551fb6..e0e3bdc5d 100644 --- a/src/libslic3r/Fill/Fill.cpp +++ b/src/libslic3r/Fill/Fill.cpp @@ -445,8 +445,11 @@ void Layer::make_fills(FillAdaptive::Octree* adaptive_fill_octree, FillAdaptive: f->angle = surface_fill.params.angle; f->adapt_fill_octree = (surface_fill.params.pattern == ipSupportCubic) ? support_fill_octree : adaptive_fill_octree; - if (surface_fill.params.pattern == ipLightning) - dynamic_cast(f.get())->generator = lightning_generator; + if (surface_fill.params.pattern == ipLightning) { + auto *lf = dynamic_cast(f.get()); + lf->generator = lightning_generator; + lf->num_raft_layers = this->object()->slicing_parameters().raft_layers(); + } if (perimeter_generator.value == PerimeterGeneratorType::Arachne && surface_fill.params.pattern == ipConcentric) { FillConcentric *fill_concentric = dynamic_cast(f.get()); diff --git a/src/libslic3r/Fill/FillLightning.cpp b/src/libslic3r/Fill/FillLightning.cpp index 36a48e554..8c3ac8f1a 100644 --- a/src/libslic3r/Fill/FillLightning.cpp +++ b/src/libslic3r/Fill/FillLightning.cpp @@ -13,7 +13,7 @@ void Filler::_fill_surface_single( ExPolygon expolygon, Polylines &polylines_out) { - const Layer &layer = generator->getTreesForLayer(this->layer_id); + const Layer &layer = generator->getTreesForLayer(this->layer_id - this->num_raft_layers); Polylines fill_lines = layer.convertToLines(to_polygons(expolygon), scaled(0.5 * this->spacing - this->overlap)); if (params.dont_connect() || fill_lines.size() <= 1) { diff --git a/src/libslic3r/Fill/FillLightning.hpp b/src/libslic3r/Fill/FillLightning.hpp index 341399508..0705dc657 100644 --- a/src/libslic3r/Fill/FillLightning.hpp +++ b/src/libslic3r/Fill/FillLightning.hpp @@ -22,6 +22,7 @@ public: ~Filler() override = default; Generator *generator { nullptr }; + size_t num_raft_layers { 0 }; protected: Fill* clone() const override { return new Filler(*this); }