From 97c7aefad7f31d330e391969aefe16496a27554f Mon Sep 17 00:00:00 2001 From: Thomas Krijnen Date: Tue, 29 Apr 2025 21:39:00 +0200 Subject: [PATCH] One more self-intersection check in cgal kernel #6589 --- src/ifcgeom/kernels/cgal/CgalKernel.cpp | 28 +++++++++++++------------ src/ifcgeom/kernels/cgal/CgalKernel.h | 2 -- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/src/ifcgeom/kernels/cgal/CgalKernel.cpp b/src/ifcgeom/kernels/cgal/CgalKernel.cpp index c79426e2ca..5d2c2740c7 100644 --- a/src/ifcgeom/kernels/cgal/CgalKernel.cpp +++ b/src/ifcgeom/kernels/cgal/CgalKernel.cpp @@ -38,16 +38,6 @@ using namespace IfcGeom; using namespace ifcopenshell::geometry; using namespace ifcopenshell::geometry::kernels; -void CgalKernel::remove_duplicate_points_from_loop(cgal_wire_t& polygon) { - std::set points; - for (int i = 0; i < polygon.size(); ++i) { - if (points.count(polygon[i])) { - polygon.erase(polygon.begin() + i); - --i; - } else points.insert(polygon[i]); - } -} - namespace { struct PolyhedronBuilder : public CGAL::Modifier_base::HalfedgeDS> { private: @@ -723,17 +713,29 @@ bool CgalKernel::convert(const taxonomy::loop::ptr loop, cgal_wire_t& result) { // A loop should consist of at least three vertices std::size_t original_count = polygon.size(); if (original_count < 3) { - Logger::Message(Logger::LOG_ERROR, "Not enough edges for:", loop->instance); + Logger::Warning("Not enough edges for:", loop->instance); return false; } // Remove points that are too close to one another - remove_duplicate_points_from_loop(polygon); + // this is done now in the mapping layer with Eigen + // remove_duplicate_points_from_loop(polygon); std::size_t count = polygon.size(); if (original_count - count != 0) { std::stringstream ss; ss << (original_count - count) << " edges removed for:"; - Logger::Message(Logger::LOG_WARNING, ss.str(), loop->instance); + Logger::Warning(ss.str(), loop->instance); + } + + { + std::set visited_points; + for (auto& p : polygon) { + if (visited_points.find(p) != visited_points.end()) { + Logger::Error("Skipping self-intersecting loop", loop->instance); + return false; + } + visited_points.insert(p); + } } std::vector segments; diff --git a/src/ifcgeom/kernels/cgal/CgalKernel.h b/src/ifcgeom/kernels/cgal/CgalKernel.h index c5a25104bd..eb1c91e605 100644 --- a/src/ifcgeom/kernels/cgal/CgalKernel.h +++ b/src/ifcgeom/kernels/cgal/CgalKernel.h @@ -94,8 +94,6 @@ namespace ifcopenshell { : AbstractKernel("cgal", settings) {} - void remove_duplicate_points_from_loop(cgal_wire_t& polygon); - bool convert(const taxonomy::extrusion::ptr, cgal_shape_t&); bool convert(const taxonomy::face::ptr, std::list&); bool convert(const taxonomy::loop::ptr, cgal_wire_t&);