FIX: tree support missing in some case

jira: none
Change-Id: Idf0e6de7b395930423eca084c971b53db6c98e54
This commit is contained in:
Arthur 2025-01-16 19:32:36 +08:00 committed by lane.wei
parent 0c289ae9de
commit 8fcd627087
3 changed files with 35 additions and 11 deletions

View File

@ -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;
}
}

View File

@ -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);
}

View File

@ -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<<"/"<<object.layer_count();
const Layer* layer = object.get_layer(layer_nr);
for (std::size_t layer_nr = 0; layer_nr < object.layers().size(); ++layer_nr) {
const Layer *layer = object.get_layer(layer_nr);
m_max_move_distances[layer_nr] = layer->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]);
}
}
}