diff --git a/xs/src/TriangleMesh.cpp b/xs/src/TriangleMesh.cpp index ff135adf8f..3ebab04de8 100644 --- a/xs/src/TriangleMesh.cpp +++ b/xs/src/TriangleMesh.cpp @@ -1,4 +1,7 @@ #include "TriangleMesh.hpp" +#include +#include +#include #include #include #include @@ -468,4 +471,50 @@ TriangleMesh::slice(const std::vector &z) return layers; } +std::vector +TriangleMesh::split() const +{ + std::vector meshes; + std::set seen_facets; + + // loop while we have remaining facets + while (1) { + // get the first facet + std::queue facet_queue; + std::deque facets; + for (int facet_idx = 0; facet_idx < this->stl.stats.number_of_facets; facet_idx++) { + if (seen_facets.find(facet_idx) != seen_facets.end()) { + facet_queue.push(facet_idx); + break; + } + } + if (facet_queue.empty()) break; + + while (!facet_queue.empty()) { + int facet_idx = facet_queue.front(); + facet_queue.pop(); + if (seen_facets.find(facet_idx) == seen_facets.end()) continue; + facets.push_back(facet_idx); + for (int j = 0; j <= 2; j++) { + facet_queue.push(this->stl.neighbors_start[facet_idx].neighbor[j]); + } + seen_facets.insert(facet_idx); + } + + meshes.resize(meshes.size()+1); + TriangleMesh* mesh = &(meshes.back()); + stl_initialize(&mesh->stl); + mesh->stl.stats.type = inmemory; + mesh->stl.stats.number_of_facets = facets.size(); + mesh->stl.stats.original_num_facets = mesh->stl.stats.number_of_facets; + stl_allocate(&mesh->stl); + + for (std::deque::const_iterator facet = facets.begin(); facet != facets.end(); facet++) { + mesh->stl.facet_start[facet - facets.begin()] = this->stl.facet_start[*facet]; + } + } + + return meshes; +} + } diff --git a/xs/src/TriangleMesh.hpp b/xs/src/TriangleMesh.hpp index 44ee791dc6..a3f112052f 100644 --- a/xs/src/TriangleMesh.hpp +++ b/xs/src/TriangleMesh.hpp @@ -23,6 +23,7 @@ class TriangleMesh void align_to_origin(); void rotate(double angle, Point* center); std::vector* slice(const std::vector &z); + std::vector split() const; stl_file stl; };