diff options
Diffstat (limited to 'xs/src/libslic3r/PolylineCollection.cpp')
-rw-r--r-- | xs/src/libslic3r/PolylineCollection.cpp | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/xs/src/libslic3r/PolylineCollection.cpp b/xs/src/libslic3r/PolylineCollection.cpp new file mode 100644 index 000000000..c2a142cf3 --- /dev/null +++ b/xs/src/libslic3r/PolylineCollection.cpp @@ -0,0 +1,57 @@ +#include "PolylineCollection.hpp" + +namespace Slic3r { + +void +PolylineCollection::chained_path(PolylineCollection* retval, bool no_reverse) const +{ + if (this->polylines.empty()) return; + this->chained_path_from(this->polylines.front().first_point(), retval, no_reverse); +} + +void +PolylineCollection::chained_path_from(Point start_near, PolylineCollection* retval, bool no_reverse) const +{ + Polylines my_paths = this->polylines; + + Points endpoints; + for (Polylines::const_iterator it = my_paths.begin(); it != my_paths.end(); ++it) { + endpoints.push_back(it->first_point()); + if (no_reverse) { + endpoints.push_back(it->first_point()); + } else { + endpoints.push_back(it->last_point()); + } + } + + while (!my_paths.empty()) { + // find nearest point + int start_index = start_near.nearest_point_index(endpoints); + int path_index = start_index/2; + if (start_index % 2 && !no_reverse) { + my_paths.at(path_index).reverse(); + } + retval->polylines.push_back(my_paths.at(path_index)); + my_paths.erase(my_paths.begin() + path_index); + endpoints.erase(endpoints.begin() + 2*path_index, endpoints.begin() + 2*path_index + 2); + start_near = retval->polylines.back().last_point(); + } +} + +Point +PolylineCollection::leftmost_point() const +{ + if (this->polylines.empty()) CONFESS("leftmost_point() called on empty PolylineCollection"); + Point p = this->polylines.front().leftmost_point(); + for (Polylines::const_iterator it = this->polylines.begin() + 1; it != this->polylines.end(); ++it) { + Point p2 = it->leftmost_point(); + if (p2.x < p.x) p = p2; + } + return p; +} + +#ifdef SLIC3RXS +REGISTER_CLASS(PolylineCollection, "Polyline::Collection"); +#endif + +} |