diff --git a/src/libslic3r/Fill/FillConcentric.cpp b/src/libslic3r/Fill/FillConcentric.cpp index 3bcfc23b46..8595b1ec31 100644 --- a/src/libslic3r/Fill/FillConcentric.cpp +++ b/src/libslic3r/Fill/FillConcentric.cpp @@ -5,6 +5,7 @@ #include "Arachne/WallToolPaths.hpp" #include "FillConcentric.hpp" +#include namespace Slic3r { @@ -133,6 +134,8 @@ void FillConcentric::_fill_surface_single(const FillParams& params, } if (j < thick_polylines_out.size()) thick_polylines_out.erase(thick_polylines_out.begin() + int(j), thick_polylines_out.end()); + + reorder_by_shortest_traverse(thick_polylines_out); } else { Polylines polylines; diff --git a/src/libslic3r/Fill/FillConcentricInternal.cpp b/src/libslic3r/Fill/FillConcentricInternal.cpp index 8b3e90930f..702f017115 100644 --- a/src/libslic3r/Fill/FillConcentricInternal.cpp +++ b/src/libslic3r/Fill/FillConcentricInternal.cpp @@ -5,6 +5,7 @@ #include "Arachne/WallToolPaths.hpp" #include "FillConcentricInternal.hpp" +#include namespace Slic3r { @@ -76,6 +77,8 @@ void FillConcentricInternal::fill_surface_extrusion(const Surface* surface, cons } if (j < thick_polylines_out.size()) thick_polylines_out.erase(thick_polylines_out.begin() + int(j), thick_polylines_out.end()); + + reorder_by_shortest_traverse(thick_polylines_out); } ExtrusionEntityCollection *coll_nosort = new ExtrusionEntityCollection(); diff --git a/src/libslic3r/Point.hpp b/src/libslic3r/Point.hpp index 4ac4e1b69d..a64b3b8786 100644 --- a/src/libslic3r/Point.hpp +++ b/src/libslic3r/Point.hpp @@ -8,8 +8,7 @@ #include #include #include - -#include +#include #include "LocalesUtils.hpp" diff --git a/src/libslic3r/ShortestPath.hpp b/src/libslic3r/ShortestPath.hpp index e68c0b6293..e68e1c49d0 100644 --- a/src/libslic3r/ShortestPath.hpp +++ b/src/libslic3r/ShortestPath.hpp @@ -24,6 +24,19 @@ void chain_and_reorder_extrusion_paths(std::vect Polylines chain_polylines(Polylines &&src, const Point *start_near = nullptr); inline Polylines chain_polylines(const Polylines& src, const Point* start_near = nullptr) { Polylines tmp(src); return chain_polylines(std::move(tmp), start_near); } +template inline void reorder_by_shortest_traverse(std::vector &polylines_out) +{ + Points start_point; + start_point.reserve(polylines_out.size()); + for (const T contour : polylines_out) start_point.push_back(contour.points.front()); + + std::vector order = chain_points(start_point); + + std::vector Temp = polylines_out; + polylines_out.erase(polylines_out.begin(), polylines_out.end()); + + for (size_t i:order) polylines_out.emplace_back(std::move(Temp[i])); +} std::vector chain_clipper_polynodes(const Points &points, const std::vector &items);