From 99eee4a2d6d1c91684528e7a4d20e6a4b33d8460 Mon Sep 17 00:00:00 2001 From: "qing.zhang" Date: Fri, 28 Oct 2022 18:18:46 +0800 Subject: [PATCH] ENH: reroder the path seq for concentric fill pattern Signed-off-by: qing.zhang Change-Id: I06bb9c5666e2205364d7031815e868eccfee6fd5 --- src/libslic3r/Fill/FillConcentric.cpp | 3 +++ src/libslic3r/Fill/FillConcentricInternal.cpp | 3 +++ src/libslic3r/Point.hpp | 3 +-- src/libslic3r/ShortestPath.hpp | 13 +++++++++++++ 4 files changed, 20 insertions(+), 2 deletions(-) diff --git a/src/libslic3r/Fill/FillConcentric.cpp b/src/libslic3r/Fill/FillConcentric.cpp index 3bcfc23b4..8595b1ec3 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 8b3e90930..702f01711 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 4ac4e1b69..a64b3b878 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 e68c0b629..e68e1c49d 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);