FIX: tree support missing in some case
jira: none Change-Id: Idf0e6de7b395930423eca084c971b53db6c98e54
This commit is contained in:
parent
0c289ae9de
commit
8fcd627087
|
@ -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;
|
||||
}
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue