mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-09-18 14:31:39 +00:00
Don't fail on self-intersections in polygon with holes after triangulation
This commit is contained in:
@@ -794,6 +794,8 @@ bool CgalKernel::process_extrusion(const cgal_face_t& bottom_face, const taxonom
|
|||||||
if (has_inner_bounds) {
|
if (has_inner_bounds) {
|
||||||
CGAL::Polygon_with_holes_2<Kernel_> pwh;
|
CGAL::Polygon_with_holes_2<Kernel_> pwh;
|
||||||
CGAL::Aff_transformation_3<Kernel_> place;
|
CGAL::Aff_transformation_3<Kernel_> place;
|
||||||
|
// @todo check for segment intersections, analogous to other places.
|
||||||
|
// they are caught now below after triangulation.
|
||||||
face_to_poly_with_holes(bottom_face, pwh, place);
|
face_to_poly_with_holes(bottom_face, pwh, place);
|
||||||
CGAL::Polygon_triangulation_decomposition_2<Kernel_> decompositor;
|
CGAL::Polygon_triangulation_decomposition_2<Kernel_> decompositor;
|
||||||
std::list<CGAL::Polygon_2<Kernel_>> decom_polies;
|
std::list<CGAL::Polygon_2<Kernel_>> decom_polies;
|
||||||
@@ -825,21 +827,6 @@ bool CgalKernel::process_extrusion(const cgal_face_t& bottom_face, const taxonom
|
|||||||
}
|
}
|
||||||
auto p = external_edges.insert({ { i0, i1 }, { i, j} });
|
auto p = external_edges.insert({ { i0, i1 }, { i, j} });
|
||||||
if (!p.second) {
|
if (!p.second) {
|
||||||
|
|
||||||
Kernel_::Point_3 ppp0(p0.cartesian(0), p0.cartesian(1), 0);
|
|
||||||
ppp0 = ppp0.transform(place);
|
|
||||||
|
|
||||||
Kernel_::Point_3 ppp1(p1.cartesian(1), p1.cartesian(1), 0);
|
|
||||||
ppp1 = ppp1.transform(place);
|
|
||||||
|
|
||||||
auto pp0 = C(ppp0);
|
|
||||||
auto pp1 = C(ppp1);
|
|
||||||
|
|
||||||
std::ostringstream oss;
|
|
||||||
oss << pp0 << " - " << pp1;
|
|
||||||
auto ss = oss.str();
|
|
||||||
std::wcout << ss.c_str() << std::endl;
|
|
||||||
|
|
||||||
// not inserted, remove
|
// not inserted, remove
|
||||||
external_edges.erase(p.first);
|
external_edges.erase(p.first);
|
||||||
|
|
||||||
@@ -854,7 +841,6 @@ bool CgalKernel::process_extrusion(const cgal_face_t& bottom_face, const taxonom
|
|||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
polygon_2_to_wire wire_builder(place);
|
polygon_2_to_wire wire_builder(place);
|
||||||
std::transform(decom_polies.begin(), decom_polies.end(), std::back_inserter(faces_to_extrude), wire_builder);
|
std::transform(decom_polies.begin(), decom_polies.end(), std::back_inserter(faces_to_extrude), wire_builder);
|
||||||
} else {
|
} else {
|
||||||
@@ -1667,7 +1653,17 @@ void PolyhedronBuilder::operator()(CGAL::Polyhedron_3<Kernel_>::HalfedgeDS &hds)
|
|||||||
for (auto& p : decom_polies) {
|
for (auto& p : decom_polies) {
|
||||||
facet_vertices.emplace_back();
|
facet_vertices.emplace_back();
|
||||||
for (auto it = p.vertices_begin(); it != p.vertices_end(); ++it) {
|
for (auto it = p.vertices_begin(); it != p.vertices_end(); ++it) {
|
||||||
facet_vertices.back().push_back(points_2d.find(*it)->second);
|
auto pit = points_2d.find(*it);
|
||||||
|
if (pit == points_2d.end()) {
|
||||||
|
// Likely there are intersections in the polygonal boundaries.
|
||||||
|
// For now let's just skip over the triangle. We can also use
|
||||||
|
// the Aff_transformation_3 stored in place to convert the 2d
|
||||||
|
// coords back to 3d.
|
||||||
|
Logger::Warning("Ignoring triangulated facet with novel point likely due to self-intersections");
|
||||||
|
facet_vertices.erase(facet_vertices.end() - 1);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
facet_vertices.back().push_back(pit->second);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user