From 8d91d70448092488f6d5d9a46037b0774db912c4 Mon Sep 17 00:00:00 2001 From: remi durand Date: Thu, 1 Jul 2021 09:55:45 +0200 Subject: [PATCH] temporary fix for bug in rectilinear --- src/libslic3r/Fill/FillRectilinear.cpp | 65 ++++++++++++++++++++++++-- 1 file changed, 62 insertions(+), 3 deletions(-) diff --git a/src/libslic3r/Fill/FillRectilinear.cpp b/src/libslic3r/Fill/FillRectilinear.cpp index dcceb3f2d..5a93371ae 100644 --- a/src/libslic3r/Fill/FillRectilinear.cpp +++ b/src/libslic3r/Fill/FillRectilinear.cpp @@ -873,7 +873,7 @@ std::vector FillRectilinear::_vert_lines_for_polygon( } -static void slice_region_by_vertical_lines(std::vector& segs, +static void slice_region_by_vertical_lines(const FillRectilinear* filler, std::vector& segs, const ExPolygonWithOffset& poly_with_offset)//, size_t n_vlines, coord_t x0, coord_t line_spacing) { // Sort the intersections along their segments, specify the intersection types. @@ -953,7 +953,17 @@ static void slice_region_by_vertical_lines(std::vector 1) { + BOOST_LOG_TRIVIAL(error) << "FillRectilinear::fill_surface() failed to fill a region: impair number of intersections at layer " << filler->layer_id << " @z="<< filler->z; + if (sil.intersections.back().iContour == 0 && sil.intersections[sil.intersections.size() - 2].iContour == 0) + sil.intersections.pop_back(); + } + } + try { // Verify the segments. If something is wrong, give up. #define ASSERT_THROW(CONDITION) do { assert(CONDITION); if (! (CONDITION)) throw InfillFailedException(); } while (0) for (size_t i_seg = 0; i_seg < segs.size(); ++i_seg) { @@ -974,6 +984,55 @@ static void slice_region_by_vertical_lines(std::vector segs = _vert_lines_for_polygon(poly_with_offset, bounding_box, params, line_spacing); - slice_region_by_vertical_lines(segs, poly_with_offset); + slice_region_by_vertical_lines(this, segs, poly_with_offset); //all the works is done HERE // Connect by horizontal / vertical links, classify the links based on link_max_length as too long. @@ -2929,7 +2988,7 @@ bool FillRectilinear::fill_surface_by_multilines(const Surface* surface, FillPar const double sin_a = sin(angle); std::vector segs = _vert_lines_for_polygon(poly_with_offset, bounding_box, params, line_spacing); - slice_region_by_vertical_lines(segs, poly_with_offset); + slice_region_by_vertical_lines(this, segs, poly_with_offset); for (const SegmentedIntersectionLine& vline : segs) if (vline.pos > x_min) { if (vline.pos >= x_max)