From ab6f408db48643bcf0067332b579799dadb6060c Mon Sep 17 00:00:00 2001 From: Thomas Krijnen Date: Fri, 23 Aug 2024 20:41:42 +0200 Subject: [PATCH] Unify edge orientation logic among kernels --- src/ifcgeom/kernels/cgal/CgalKernel.cpp | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/src/ifcgeom/kernels/cgal/CgalKernel.cpp b/src/ifcgeom/kernels/cgal/CgalKernel.cpp index ff89feca0e..0e11a87b86 100644 --- a/src/ifcgeom/kernels/cgal/CgalKernel.cpp +++ b/src/ifcgeom/kernels/cgal/CgalKernel.cpp @@ -427,11 +427,19 @@ namespace { } void operator()(const taxonomy::trimmed_curve::ptr& e) { + auto e_basis = e->basis; + + while (e_basis->kind() == taxonomy::EDGE && e_basis->instance && e_basis->instance->declaration().name() == "IfcTrimmedCurve") { + // @todo we still might have something to wrt orientation on periodic curves + // to make sure we select the correct arc later on. + e_basis = taxonomy::cast(e_basis)->basis; + } + point_projection_visitor v1{ e->basis }, v2{ e->basis }; boost::apply_visitor(v1, e->start); boost::apply_visitor(v2, e->end); - if (!e->orientation.get_value_or(true)) { + if (!e->curve_sense.get_value_or(true)) { std::swap(v1.u, v2.u); } @@ -440,7 +448,7 @@ namespace { dispatch_curve_creation::dispatch(e->basis, v); this->points = v.points; - if (!e->orientation.get_value_or(true)) { + if (!e->curve_sense.get_value_or(true)) { std::reverse(this->points.begin(), this->points.end()); } } @@ -652,20 +660,19 @@ bool CgalKernel::convert(const taxonomy::loop::ptr loop, cgal_wire_t& result) { for (auto& e : loop->children) { std::vector edge; - if (e->basis) { + if (e->basis && e->basis->kind() != taxonomy::LINE) { convert_curve(settings_, e, edge); - if (!e->curve_sense.get_value_or(true)) { - std::reverse(edge.begin(), edge.end()); - } } else { edge = { *boost::get(e->start), *boost::get(e->end) }; } + if (!e->orientation.get_value_or(true)) { std::reverse(edge.begin(), edge.end()); } + extend_wire(points, edge); }