diff --git a/src/libslic3r/Fill/Fill3DHoneycomb.cpp b/src/libslic3r/Fill/Fill3DHoneycomb.cpp index 7b7a3b8878..eadcfbf537 100644 --- a/src/libslic3r/Fill/Fill3DHoneycomb.cpp +++ b/src/libslic3r/Fill/Fill3DHoneycomb.cpp @@ -273,10 +273,7 @@ void Fill3DHoneycomb::_fill_surface_single( if (!polylines.empty()) { int infill_start_idx = polylines_out.size(); // only rotate what belongs to us. // connect lines - if (params.dont_connect() || polylines.size() <= 1) - append(polylines_out, chain_polylines(std::move(polylines))); - else - this->connect_infill(std::move(polylines), expolygon, polylines_out, this->spacing, params); + chain_or_connect_infill(std::move(polylines), expolygon, polylines_out, this->spacing, params); // rotate back if (std::abs(infill_angle) >= EPSILON) { diff --git a/src/libslic3r/Fill/FillAdaptive.cpp b/src/libslic3r/Fill/FillAdaptive.cpp index 8f28697eb8..d4b117b99d 100644 --- a/src/libslic3r/Fill/FillAdaptive.cpp +++ b/src/libslic3r/Fill/FillAdaptive.cpp @@ -1401,10 +1401,7 @@ void Filler::_fill_surface_single( } #endif /* ADAPTIVE_CUBIC_INFILL_DEBUG_OUTPUT */ - if (params.dont_connect() || all_polylines_with_hooks.size() <= 1) - append(polylines_out, chain_polylines(std::move(all_polylines_with_hooks))); - else - connect_infill(std::move(all_polylines_with_hooks), expolygon, polylines_out, this->spacing, params); + chain_or_connect_infill(std::move(all_polylines_with_hooks), expolygon, polylines_out, this->spacing, params); #ifdef ADAPTIVE_CUBIC_INFILL_DEBUG_OUTPUT { diff --git a/src/libslic3r/Fill/FillBase.cpp b/src/libslic3r/Fill/FillBase.cpp index 8ae8a6d4a7..1430e678bc 100644 --- a/src/libslic3r/Fill/FillBase.cpp +++ b/src/libslic3r/Fill/FillBase.cpp @@ -1787,6 +1787,18 @@ void Fill::connect_infill(Polylines &&infill_ordered, const std::vector 1) + infill_ordered = chain_polylines(std::move(infill_ordered)); + append(polylines_out, std::move(infill_ordered)); + } else + connect_infill(std::move(infill_ordered), boundary, polylines_out, spacing, params); + } +} + // Extend the infill lines along the perimeters, this is mainly useful for grid aligned support, where a perimeter line may be nearly // aligned with the infill lines. static inline void base_support_extend_infill_lines(Polylines &infill, BoundaryInfillGraph &graph, const double spacing, const FillParams ¶ms) diff --git a/src/libslic3r/Fill/FillBase.hpp b/src/libslic3r/Fill/FillBase.hpp index de93db3693..01aaf38d28 100644 --- a/src/libslic3r/Fill/FillBase.hpp +++ b/src/libslic3r/Fill/FillBase.hpp @@ -191,6 +191,8 @@ public: static void connect_infill(Polylines &&infill_ordered, const Polygons &boundary, const BoundingBox& bbox, Polylines &polylines_out, const double spacing, const FillParams ¶ms); static void connect_infill(Polylines &&infill_ordered, const std::vector &boundary, const BoundingBox &bbox, Polylines &polylines_out, double spacing, const FillParams ¶ms); + static void chain_or_connect_infill(Polylines &&infill_ordered, const ExPolygon &boundary, Polylines &polylines_out, const double spacing, const FillParams ¶ms); + static void connect_base_support(Polylines &&infill_ordered, const std::vector &boundary_src, const BoundingBox &bbox, Polylines &polylines_out, const double spacing, const FillParams ¶ms); static void connect_base_support(Polylines &&infill_ordered, const Polygons &boundary_src, const BoundingBox &bbox, Polylines &polylines_out, const double spacing, const FillParams ¶ms); diff --git a/src/libslic3r/Fill/FillCrossHatch.cpp b/src/libslic3r/Fill/FillCrossHatch.cpp index 10f421bef3..3772a1fec2 100644 --- a/src/libslic3r/Fill/FillCrossHatch.cpp +++ b/src/libslic3r/Fill/FillCrossHatch.cpp @@ -218,10 +218,7 @@ void FillCrossHatch ::_fill_surface_single( if (!polylines.empty()) { int infill_start_idx = polylines_out.size(); // only rotate what belongs to us. // connect lines - if (params.dont_connect() || polylines.size() <= 1) - append(polylines_out, chain_polylines(std::move(polylines))); - else - this->connect_infill(std::move(polylines), expolygon, polylines_out, this->spacing, params); + chain_or_connect_infill(std::move(polylines), expolygon, polylines_out, this->spacing, params); // rotate back if (std::abs(infill_angle) >= EPSILON) { diff --git a/src/libslic3r/Fill/FillGyroid.cpp b/src/libslic3r/Fill/FillGyroid.cpp index 5c555df88f..9040f740b2 100644 --- a/src/libslic3r/Fill/FillGyroid.cpp +++ b/src/libslic3r/Fill/FillGyroid.cpp @@ -194,10 +194,7 @@ void FillGyroid::_fill_surface_single( if (! polylines.empty()) { // connect lines size_t polylines_out_first_idx = polylines_out.size(); - if (params.dont_connect()) - append(polylines_out, chain_polylines(polylines)); - else - this->connect_infill(std::move(polylines), expolygon, polylines_out, this->spacing, params); + chain_or_connect_infill(std::move(polylines), expolygon, polylines_out, this->spacing, params); // new paths must be rotated back if (std::abs(infill_angle) >= EPSILON) { diff --git a/src/libslic3r/Fill/FillHoneycomb.cpp b/src/libslic3r/Fill/FillHoneycomb.cpp index 5dc2ed501c..3e37ddbc84 100644 --- a/src/libslic3r/Fill/FillHoneycomb.cpp +++ b/src/libslic3r/Fill/FillHoneycomb.cpp @@ -74,10 +74,7 @@ void FillHoneycomb::_fill_surface_single( } all_polylines = intersection_pl(std::move(all_polylines), expolygon); - if (params.dont_connect() || all_polylines.size() <= 1) - append(polylines_out, chain_polylines(std::move(all_polylines))); - else - connect_infill(std::move(all_polylines), expolygon, polylines_out, this->spacing, params); + chain_or_connect_infill(std::move(all_polylines), expolygon, polylines_out, this->spacing, params); } } // namespace Slic3r diff --git a/src/libslic3r/Fill/FillLightning.cpp b/src/libslic3r/Fill/FillLightning.cpp index dd2189e6b9..5cd7ae5797 100644 --- a/src/libslic3r/Fill/FillLightning.cpp +++ b/src/libslic3r/Fill/FillLightning.cpp @@ -16,10 +16,7 @@ void Filler::_fill_surface_single( const Layer &layer = generator->getTreesForLayer(this->layer_id); Polylines fill_lines = layer.convertToLines(to_polygons(expolygon), scaled(0.5 * this->spacing - this->overlap)); - if (params.dont_connect() || fill_lines.size() <= 1) { - append(polylines_out, chain_polylines(std::move(fill_lines))); - } else - connect_infill(std::move(fill_lines), expolygon, polylines_out, this->spacing, params); + chain_or_connect_infill(std::move(fill_lines), expolygon, polylines_out, this->spacing, params); } void GeneratorDeleter::operator()(Generator *p) { diff --git a/src/libslic3r/Fill/FillRectilinear.cpp b/src/libslic3r/Fill/FillRectilinear.cpp index c85d5e02fb..7fe310e14b 100644 --- a/src/libslic3r/Fill/FillRectilinear.cpp +++ b/src/libslic3r/Fill/FillRectilinear.cpp @@ -2928,7 +2928,7 @@ void make_fill_lines(const ExPolygonWithOffset &poly_with_offset, Point refpt, d bool FillRectilinear::fill_surface_by_multilines(const Surface *surface, FillParams params, const std::initializer_list &sweep_params, Polylines &polylines_out) { - assert(sweep_params.size() > 1); + assert(sweep_params.size() >= 1); assert(! params.full_infill()); params.density /= double(sweep_params.size()); assert(params.density > 0.0001f && params.density <= 1.f); @@ -2948,12 +2948,14 @@ bool FillRectilinear::fill_surface_by_multilines(const Surface *surface, FillPar make_fill_lines(ExPolygonWithOffset(poly_with_offset_base, - angle), rotate_vector.second.rotated(-angle), angle, line_width + coord_t(SCALED_EPSILON), line_spacing, coord_t(scale_(sweep.pattern_shift)), fill_lines); } - if (params.dont_connect() || fill_lines.size() <= 1) { - if (fill_lines.size() > 1) - fill_lines = chain_polylines(std::move(fill_lines)); - append(polylines_out, std::move(fill_lines)); - } else - connect_infill(std::move(fill_lines), poly_with_offset_base.polygons_outer, get_extents(surface->expolygon.contour), polylines_out, this->spacing, params); + if (!fill_lines.empty()) { + if (params.dont_connect()) { + if (fill_lines.size() > 1) + fill_lines = chain_polylines(std::move(fill_lines)); + append(polylines_out, std::move(fill_lines)); + } else + connect_infill(std::move(fill_lines), poly_with_offset_base.polygons_outer, get_extents(surface->expolygon.contour), polylines_out, this->spacing, params); + } return true; } @@ -2961,8 +2963,13 @@ bool FillRectilinear::fill_surface_by_multilines(const Surface *surface, FillPar Polylines FillRectilinear::fill_surface(const Surface *surface, const FillParams ¶ms) { Polylines polylines_out; - if (! fill_surface_by_lines(surface, params, 0.f, 0.f, polylines_out)) - BOOST_LOG_TRIVIAL(error) << "FillRectilinear::fill_surface() failed to fill a region."; + if (params.full_infill()) { + if (!fill_surface_by_lines(surface, params, 0.f, 0.f, polylines_out)) + BOOST_LOG_TRIVIAL(error) << "FillRectilinear::fill_surface() fill_surface_by_lines() failed to fill a region."; + } else { + if (!fill_surface_by_multilines(surface, params, {{0.f, 0.f}}, polylines_out)) + BOOST_LOG_TRIVIAL(error) << "FillRectilinear::fill_surface() fill_surface_by_multilines() failed to fill a region."; + } return polylines_out; }