Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/supermerill/SuperSlicer.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'xs/src/libslic3r/PolylineCollection.cpp')
-rw-r--r--xs/src/libslic3r/PolylineCollection.cpp57
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
+
+}