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;
|
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 Slic3rExPolygons_to_Paths64(const ExPolygons& in)
|
||||||
{
|
{
|
||||||
Clipper2Lib::Paths64 out;
|
Clipper2Lib::Paths64 out;
|
||||||
|
@ -119,7 +132,22 @@ Slic3r::Polylines intersection_pl_2(const Slic3r::Polylines& subject, const Slic
|
||||||
Slic3r::Polylines diff_pl_2(const Slic3r::Polylines& subject, const Slic3r::Polygons& clip)
|
Slic3r::Polylines diff_pl_2(const Slic3r::Polylines& subject, const Slic3r::Polygons& clip)
|
||||||
{ return _clipper2_pl_open(Clipper2Lib::ClipType::Difference, subject, 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(Slic3rPolygons_to_Paths64(polygons));
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
ExPolygons union_ex2(const ExPolygons &expolygons)
|
||||||
{
|
{
|
||||||
Clipper2Lib::Clipper64 c;
|
Clipper2Lib::Clipper64 c;
|
||||||
c.AddSubject(Slic3rExPolygons_to_Paths64(expolygons));
|
c.AddSubject(Slic3rExPolygons_to_Paths64(expolygons));
|
||||||
|
@ -133,5 +161,4 @@ ExPolygons union_ex2(const ExPolygons& expolygons)
|
||||||
|
|
||||||
return results;
|
return results;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
|
@ -8,6 +8,7 @@ namespace Slic3r {
|
||||||
|
|
||||||
Slic3r::Polylines intersection_pl_2(const Slic3r::Polylines& subject, const Slic3r::Polygons& clip);
|
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);
|
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);
|
ExPolygons union_ex2(const ExPolygons &expolygons);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -3874,23 +3874,19 @@ TreeSupportData::TreeSupportData(const PrintObject &object, coordf_t xy_distance
|
||||||
m_layer_outlines.resize(object.layers().size());
|
m_layer_outlines.resize(object.layers().size());
|
||||||
m_layer_outlines_below.resize(object.layer_count());
|
m_layer_outlines_below.resize(object.layer_count());
|
||||||
for (std::size_t layer_nr = 0; layer_nr < object.layers().size(); ++layer_nr) {
|
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);
|
||||||
const Layer* layer = object.get_layer(layer_nr);
|
|
||||||
m_max_move_distances[layer_nr] = layer->height * branch_scale_factor;
|
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.clear();
|
||||||
outline.reserve(layer->lslices.size());
|
outline.reserve(layer->lslices.size());
|
||||||
for (const ExPolygon &poly : layer->lslices) { append(outline, to_expolygons( poly.simplify_p(scale_(m_radius_sample_resolution)))); }
|
for (const ExPolygon &poly : layer->lslices) { append(outline, union_ex2( poly.simplify_p(scale_(m_radius_sample_resolution)))); }
|
||||||
if (layer_nr % 10 == 0)
|
|
||||||
outline = union_ex(outline);
|
|
||||||
|
|
||||||
if (layer_nr == 0)
|
if (layer_nr == 0)
|
||||||
m_layer_outlines_below[layer_nr] = outline;
|
m_layer_outlines_below[layer_nr] = outline;
|
||||||
else {
|
else {
|
||||||
m_layer_outlines_below[layer_nr] = m_layer_outlines_below[layer_nr - 1];
|
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());
|
m_layer_outlines_below[layer_nr].insert(m_layer_outlines_below[layer_nr].end(), outline.begin(), outline.end());
|
||||||
if (layer_nr%10==0)
|
if (layer_nr % 10 == 0) m_layer_outlines_below[layer_nr] = union_ex2(m_layer_outlines_below[layer_nr]);
|
||||||
m_layer_outlines_below[layer_nr] = union_ex2(m_layer_outlines_below[layer_nr]);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue