From d4854c0df77e7d38dd13f244c19b97898d5763a7 Mon Sep 17 00:00:00 2001 From: "salt.wei" Date: Wed, 14 Sep 2022 21:54:33 +0800 Subject: [PATCH] ENH: fix empty infill layers This is fix for github issue #216 that sometimes the infill layer is empty. Signed-off-by: salt.wei Change-Id: Ie3be08b75506e48f5ae9dd6aae2ae729ba666e01 --- src/libslic3r/Layer.cpp | 8 ++++++-- src/libslic3r/Layer.hpp | 3 ++- src/libslic3r/LayerRegion.cpp | 9 ++++----- src/libslic3r/PerimeterGenerator.cpp | 2 +- src/libslic3r/PerimeterGenerator.hpp | 9 ++++++--- 5 files changed, 19 insertions(+), 12 deletions(-) diff --git a/src/libslic3r/Layer.cpp b/src/libslic3r/Layer.cpp index b60acff78..cb8e393d5 100644 --- a/src/libslic3r/Layer.cpp +++ b/src/libslic3r/Layer.cpp @@ -190,7 +190,7 @@ void Layer::make_perimeters() if (layerms.size() == 1) { // optimization (*layerm)->fill_surfaces.surfaces.clear(); - (*layerm)->make_perimeters((*layerm)->slices, &(*layerm)->fill_surfaces); + (*layerm)->make_perimeters((*layerm)->slices, &(*layerm)->fill_surfaces, &(*layerm)->fill_no_overlap_expolygons); (*layerm)->fill_expolygons = to_expolygons((*layerm)->fill_surfaces.surfaces); } else { SurfaceCollection new_slices; @@ -212,7 +212,9 @@ void Layer::make_perimeters() // make perimeters SurfaceCollection fill_surfaces; - layerm_config->make_perimeters(new_slices, &fill_surfaces); + //BBS + ExPolygons fill_no_overlap; + layerm_config->make_perimeters(new_slices, &fill_surfaces, &fill_no_overlap); // assign fill_surfaces to each layer if (!fill_surfaces.surfaces.empty()) { @@ -221,6 +223,8 @@ void Layer::make_perimeters() ExPolygons expp = intersection_ex(fill_surfaces.surfaces, (*l)->slices.surfaces); (*l)->fill_expolygons = expp; (*l)->fill_surfaces.set(std::move(expp), fill_surfaces.surfaces.front()); + //BBS: Separate fill_no_overlap + (*l)->fill_no_overlap_expolygons = intersection_ex((*l)->slices.surfaces, fill_no_overlap); } } } diff --git a/src/libslic3r/Layer.hpp b/src/libslic3r/Layer.hpp index 66cc0b589..414619788 100644 --- a/src/libslic3r/Layer.hpp +++ b/src/libslic3r/Layer.hpp @@ -68,7 +68,8 @@ public: void slices_to_fill_surfaces_clipped(); void prepare_fill_surfaces(); - void make_perimeters(const SurfaceCollection &slices, SurfaceCollection* fill_surfaces); + //BBS + void make_perimeters(const SurfaceCollection &slices, SurfaceCollection* fill_surfaces, ExPolygons* fill_no_overlap); void process_external_surfaces(const Layer *lower_layer, const Polygons *lower_layer_covered); double infill_area_threshold() const; // Trim surfaces by trimming polygons. Used by the elephant foot compensation at the 1st layer. diff --git a/src/libslic3r/LayerRegion.cpp b/src/libslic3r/LayerRegion.cpp index e57648237..d11c3d712 100644 --- a/src/libslic3r/LayerRegion.cpp +++ b/src/libslic3r/LayerRegion.cpp @@ -63,7 +63,7 @@ void LayerRegion::slices_to_fill_surfaces_clipped() } } -void LayerRegion::make_perimeters(const SurfaceCollection &slices, SurfaceCollection* fill_surfaces) +void LayerRegion::make_perimeters(const SurfaceCollection &slices, SurfaceCollection* fill_surfaces, ExPolygons* fill_no_overlap) { this->perimeters.clear(); this->thin_fills.clear(); @@ -90,7 +90,9 @@ void LayerRegion::make_perimeters(const SurfaceCollection &slices, SurfaceCollec // output: &this->perimeters, &this->thin_fills, - fill_surfaces + fill_surfaces, + //BBS + fill_no_overlap ); if (this->layer()->lower_layer != nullptr) @@ -105,9 +107,6 @@ void LayerRegion::make_perimeters(const SurfaceCollection &slices, SurfaceCollec g.solid_infill_flow = this->flow(frSolidInfill); g.process(); - - // BBS - this->fill_no_overlap_expolygons = g.fill_no_overlap; } //#define EXTERNAL_SURFACES_OFFSET_PARAMETERS ClipperLib::jtMiter, 3. diff --git a/src/libslic3r/PerimeterGenerator.cpp b/src/libslic3r/PerimeterGenerator.cpp index 7649fea9e..c997ec713 100644 --- a/src/libslic3r/PerimeterGenerator.cpp +++ b/src/libslic3r/PerimeterGenerator.cpp @@ -763,7 +763,7 @@ void PerimeterGenerator::process() double(-inset - infill_peri_overlap)); if (!top_fills.empty()) polyWithoutOverlap = union_ex(polyWithoutOverlap, top_infill_exp); - this->fill_no_overlap.insert(this->fill_no_overlap.end(), polyWithoutOverlap.begin(), polyWithoutOverlap.end()); + this->fill_no_overlap->insert(this->fill_no_overlap->end(), polyWithoutOverlap.begin(), polyWithoutOverlap.end()); } } // for each island diff --git a/src/libslic3r/PerimeterGenerator.hpp b/src/libslic3r/PerimeterGenerator.hpp index 3b70bfd77..2d64de497 100644 --- a/src/libslic3r/PerimeterGenerator.hpp +++ b/src/libslic3r/PerimeterGenerator.hpp @@ -29,13 +29,14 @@ public: ExtrusionEntityCollection *loops; ExtrusionEntityCollection *gap_fill; SurfaceCollection *fill_surfaces; + //BBS + ExPolygons *fill_no_overlap; //BBS Flow smaller_ext_perimeter_flow; std::map m_lower_polygons_series; std::map m_external_lower_polygons_series; std::map m_smaller_external_lower_polygons_series; - ExPolygons fill_no_overlap; PerimeterGenerator( // Input: @@ -52,14 +53,16 @@ public: // Gaps without the thin walls ExtrusionEntityCollection* gap_fill, // Infills without the gap fills - SurfaceCollection* fill_surfaces) + SurfaceCollection* fill_surfaces, + //BBS + ExPolygons* fill_no_overlap) : slices(slices), upper_slices(nullptr), lower_slices(nullptr), layer_height(layer_height), layer_id(-1), perimeter_flow(flow), ext_perimeter_flow(flow), overhang_flow(flow), solid_infill_flow(flow), config(config), object_config(object_config), print_config(print_config), m_spiral_vase(spiral_mode), m_scaled_resolution(scaled(print_config->resolution.value > EPSILON ? print_config->resolution.value : EPSILON)), - loops(loops), gap_fill(gap_fill), fill_surfaces(fill_surfaces), + loops(loops), gap_fill(gap_fill), fill_surfaces(fill_surfaces), fill_no_overlap(fill_no_overlap), m_ext_mm3_per_mm(-1), m_mm3_per_mm(-1), m_mm3_per_mm_overhang(-1), m_ext_mm3_per_mm_smaller_width(-1) {}