diff --git a/src/ifcgeom/kernels/cgal/CgalKernel.cpp b/src/ifcgeom/kernels/cgal/CgalKernel.cpp index 156bb36023..c8873711a6 100644 --- a/src/ifcgeom/kernels/cgal/CgalKernel.cpp +++ b/src/ifcgeom/kernels/cgal/CgalKernel.cpp @@ -386,6 +386,7 @@ namespace { void extend_wire(std::vector& a, const std::vector& b) { if (a.empty()) { a = b; + return; } if (b.empty()) { return; @@ -403,25 +404,29 @@ bool CgalKernel::convert(const taxonomy::loop* loop, cgal_wire_t& result) { std::vector points; for (auto& e : edges) { + std::vector edge; if (e->basis) { - std::vector edge; convert_curve(e, edge); if (!e->orientation_2.get_value_or(true)) { std::reverse(edge.begin(), edge.end()); } - extend_wire(points, edge); } else { - extend_wire(points, { + edge = { boost::get(e->start), boost::get(e->end) - }); + }; } + extend_wire(points, edge); } if (points.size() >= 2) { // the edges -> conversion left us with a duplicate global begin,end point. double d = (*points.back().components - *points.front().components).norm(); - points.erase(points.end() - 1); + if (d < 1.e-5) { + points.erase(points.end() - 1); + } else { + Logger::Warning("Loop not closed", loop->instance); + } } // Parse and store the points in a sequence