Fix/crashing when generating walls (#6325)
* Fix crash when filling very tiny (1-5nm) gaps (#6279) Cherry-picked from prusa3d/PrusaSlicer@8784ca0ecf Co-authored-by: Lukáš Hejl <hejl.lukas@gmail.com> * SPE-2256: Fix the issue that we used the old Voronoi graph during the detection of invalid Voronoi diagrams. This happens because we didn't set a modified flag that is required to be set before we use the new Voronoi graph. Possibly related to #12385 Cherry-picked from prusa3d/PrusaSlicer@2de1f3aa45 Co-authored-by: Lukáš Hejl <hejl.lukas@gmail.com> --------- Co-authored-by: Lukáš Hejl <hejl.lukas@gmail.com>
This commit is contained in:
parent
b85c146499
commit
bb5e2af509
2 changed files with 16 additions and 3 deletions
|
@ -449,6 +449,19 @@ MedialAxis::MedialAxis(double min_width, double max_width, const ExPolygon &expo
|
||||||
void MedialAxis::build(ThickPolylines* polylines)
|
void MedialAxis::build(ThickPolylines* polylines)
|
||||||
{
|
{
|
||||||
m_vd.construct_voronoi(m_lines.begin(), m_lines.end());
|
m_vd.construct_voronoi(m_lines.begin(), m_lines.end());
|
||||||
|
|
||||||
|
// For several ExPolygons in SPE-1729, an invalid Voronoi diagram was produced that wasn't fixable by rotating input data.
|
||||||
|
// Those ExPolygons contain very thin lines and holes formed by very close (1-5nm) vertices that are on the edge of our resolution.
|
||||||
|
// Those thin lines and holes are both unprintable and cause the Voronoi diagram to be invalid.
|
||||||
|
// So we filter out such thin lines and holes and try to compute the Voronoi diagram again.
|
||||||
|
if (!m_vd.is_valid()) {
|
||||||
|
m_lines = to_lines(closing_ex({m_expolygon}, float(2. * SCALED_EPSILON)));
|
||||||
|
m_vd.construct_voronoi(m_lines.begin(), m_lines.end());
|
||||||
|
|
||||||
|
if (!m_vd.is_valid())
|
||||||
|
BOOST_LOG_TRIVIAL(error) << "MedialAxis - Invalid Voronoi diagram even after morphological closing.";
|
||||||
|
}
|
||||||
|
|
||||||
Slic3r::Voronoi::annotate_inside_outside(m_vd, m_lines);
|
Slic3r::Voronoi::annotate_inside_outside(m_vd, m_lines);
|
||||||
// static constexpr double threshold_alpha = M_PI / 12.; // 30 degrees
|
// static constexpr double threshold_alpha = M_PI / 12.; // 30 degrees
|
||||||
// std::vector<Vec2d> skeleton_edges = Slic3r::Voronoi::skeleton_edges_rough(vd, lines, threshold_alpha);
|
// std::vector<Vec2d> skeleton_edges = Slic3r::Voronoi::skeleton_edges_rough(vd, lines, threshold_alpha);
|
||||||
|
|
|
@ -146,6 +146,9 @@ void VoronoiDiagram::copy_to_local(voronoi_diagram_type &voronoi_diagram) {
|
||||||
new_edge.prev(&m_edges[prev_edge_idx]);
|
new_edge.prev(&m_edges[prev_edge_idx]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
m_voronoi_diagram.clear();
|
||||||
|
m_is_modified = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename SegmentIterator>
|
template<typename SegmentIterator>
|
||||||
|
@ -346,9 +349,6 @@ VoronoiDiagram::try_to_repair_degenerated_voronoi_diagram_by_rotation(const Segm
|
||||||
for (vertex_type &vertex : m_vertices)
|
for (vertex_type &vertex : m_vertices)
|
||||||
vertex.color(0);
|
vertex.color(0);
|
||||||
|
|
||||||
m_voronoi_diagram.clear();
|
|
||||||
m_is_modified = true;
|
|
||||||
|
|
||||||
return issue_type;
|
return issue_type;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue