diff --git a/src/libslic3r/SLA/SLASupportTree.cpp b/src/libslic3r/SLA/SLASupportTree.cpp index d8cff35198..66ec0d5edd 100644 --- a/src/libslic3r/SLA/SLASupportTree.cpp +++ b/src/libslic3r/SLA/SLASupportTree.cpp @@ -644,6 +644,7 @@ class SLASupportTree::Impl { std::vector m_bridges; std::vector m_compact_bridges; public: + float model_height = 0; // the full height of the model template Head& add_head(Args&&... args) { m_heads.emplace_back(std::forward(args)...); @@ -1589,8 +1590,48 @@ void SLASupportTree::merged_mesh(TriangleMesh &outmesh) const } } -SlicedSupports SLASupportTree::slice() const +template void slice_part(const T& inp, + std::vector& mergev, + const std::vector& heights) { + for(auto& part : inp) { + TriangleMesh&& m = mesh(part.mesh); + TriangleMeshSlicer slicer(&m); + SlicedSupports slout; + slicer.slice(heights, &slout, [](){}); + + for(size_t i = 0; i < slout.size(); i++) { + // move the layers obtained from this mesh to the merge area + mergev[i].emplace_back(std::move(slout[i])); + } + } +} + +SlicedSupports SLASupportTree::slice(float layerh, float init_layerh) const +{ + if(init_layerh < 0) init_layerh = layerh; + auto& stree = get(); + const float modelh = stree.model_height; + + std::vector heights; heights.reserve(size_t(modelh/layerh) + 1); + for(float h = init_layerh; h <= modelh; h += layerh) { + heights.emplace_back(h); + } + + std::vector mergev(heights.size(), {}); + + slice_part(stree.heads(), mergev, heights); + slice_part(stree.pillars(), mergev, heights); + slice_part(stree.junctions(), mergev, heights); + slice_part(stree.bridges(), mergev, heights); + slice_part(stree.compact_bridges(), mergev, heights); + + // TODO: do this for all + + for(SlicedSupports& level : mergev) { + // TODO merge all expolygon in the current level + } + return {}; } diff --git a/src/libslic3r/SLA/SLASupportTree.hpp b/src/libslic3r/SLA/SLASupportTree.hpp index 1e913cf88c..1658eb6b38 100644 --- a/src/libslic3r/SLA/SLASupportTree.hpp +++ b/src/libslic3r/SLA/SLASupportTree.hpp @@ -143,7 +143,7 @@ public: void merged_mesh(TriangleMesh& outmesh) const; /// Get the sliced 2d layers of the support geometry. - SlicedSupports slice() const; + SlicedSupports slice(float layerh, float init_layerh = -1.0) const; }; }