diff --git a/src/libslic3r/Clipper2Utils.cpp b/src/libslic3r/Clipper2Utils.cpp index 53b074fe7..2f62d77ba 100644 --- a/src/libslic3r/Clipper2Utils.cpp +++ b/src/libslic3r/Clipper2Utils.cpp @@ -79,6 +79,19 @@ static ExPolygons PolyTreeToExPolygons(Clipper2Lib::PolyTree64 &&polytree) return retval; } +Clipper2Lib::Paths64 Slic3rPolygons_to_Paths64(const Polygons &in) +{ + Clipper2Lib::Paths64 out; + out.reserve(in.size()); + for (const Polygon &poly : in) { + Clipper2Lib::Path64 path; + path.reserve(poly.points.size()); + for (const Slic3r::Point &point : poly.points) path.emplace_back(std::move(Clipper2Lib::Point64(point.x(), point.y()))); + out.emplace_back(std::move(path)); + } + return out; +} + Clipper2Lib::Paths64 Slic3rExPolygons_to_Paths64(const ExPolygons& in) { Clipper2Lib::Paths64 out; @@ -119,10 +132,10 @@ Slic3r::Polylines intersection_pl_2(const Slic3r::Polylines& subject, const Slic Slic3r::Polylines diff_pl_2(const Slic3r::Polylines& subject, const Slic3r::Polygons& clip) { return _clipper2_pl_open(Clipper2Lib::ClipType::Difference, subject, clip); } -ExPolygons union_ex2(const ExPolygons& expolygons) +ExPolygons union_ex2(const Polygons& polygons) { Clipper2Lib::Clipper64 c; - c.AddSubject(Slic3rExPolygons_to_Paths64(expolygons)); + c.AddSubject(Slic3rPolygons_to_Paths64(polygons)); Clipper2Lib::ClipType ct = Clipper2Lib::ClipType::Union; Clipper2Lib::FillRule fr = Clipper2Lib::FillRule::NonZero; @@ -134,4 +147,18 @@ ExPolygons union_ex2(const ExPolygons& expolygons) return results; } +ExPolygons union_ex2(const ExPolygons &expolygons) +{ + Clipper2Lib::Clipper64 c; + c.AddSubject(Slic3rExPolygons_to_Paths64(expolygons)); + + Clipper2Lib::ClipType ct = Clipper2Lib::ClipType::Union; + Clipper2Lib::FillRule fr = Clipper2Lib::FillRule::NonZero; + Clipper2Lib::PolyTree64 solution; + c.Execute(ct, fr, solution); + + ExPolygons results = PolyTreeToExPolygons(std::move(solution)); + + return results; +} } \ No newline at end of file diff --git a/src/libslic3r/Clipper2Utils.hpp b/src/libslic3r/Clipper2Utils.hpp index a612512f7..cd6e209fa 100644 --- a/src/libslic3r/Clipper2Utils.hpp +++ b/src/libslic3r/Clipper2Utils.hpp @@ -8,6 +8,7 @@ namespace Slic3r { Slic3r::Polylines intersection_pl_2(const Slic3r::Polylines& subject, const Slic3r::Polygons& clip); Slic3r::Polylines diff_pl_2(const Slic3r::Polylines& subject, const Slic3r::Polygons& clip); +ExPolygons union_ex2(const Polygons &expolygons); ExPolygons union_ex2(const ExPolygons &expolygons); } diff --git a/src/libslic3r/Support/TreeSupport.cpp b/src/libslic3r/Support/TreeSupport.cpp index ea7671850..d1c44c6cd 100644 --- a/src/libslic3r/Support/TreeSupport.cpp +++ b/src/libslic3r/Support/TreeSupport.cpp @@ -3873,24 +3873,20 @@ TreeSupportData::TreeSupportData(const PrintObject &object, coordf_t xy_distance m_max_move_distances.resize(object.layers().size(), 0); m_layer_outlines.resize(object.layers().size()); m_layer_outlines_below.resize(object.layer_count()); - for (std::size_t layer_nr = 0; layer_nr < object.layers().size(); ++layer_nr) { - // BOOST_LOG_TRIVIAL(debug) << "TreeSupportData construct "<< layer_nr<<"/"<height * branch_scale_factor; - ExPolygons &outline = m_layer_outlines[layer_nr]; + ExPolygons &outline = m_layer_outlines[layer_nr]; outline.clear(); outline.reserve(layer->lslices.size()); - for (const ExPolygon &poly : layer->lslices) { append(outline, to_expolygons( poly.simplify_p(scale_(m_radius_sample_resolution)))); } - if (layer_nr % 10 == 0) - outline = union_ex(outline); + for (const ExPolygon &poly : layer->lslices) { append(outline, union_ex2( poly.simplify_p(scale_(m_radius_sample_resolution)))); } if (layer_nr == 0) m_layer_outlines_below[layer_nr] = outline; else { m_layer_outlines_below[layer_nr] = m_layer_outlines_below[layer_nr - 1]; m_layer_outlines_below[layer_nr].insert(m_layer_outlines_below[layer_nr].end(), outline.begin(), outline.end()); - if (layer_nr%10==0) - m_layer_outlines_below[layer_nr] = union_ex2(m_layer_outlines_below[layer_nr]); + if (layer_nr % 10 == 0) m_layer_outlines_below[layer_nr] = union_ex2(m_layer_outlines_below[layer_nr]); } } }