From 42b96d629087195f77c1d9eac04e2b87634d4e0d Mon Sep 17 00:00:00 2001 From: Thomas Krijnen Date: Fri, 28 Jun 2024 13:41:01 +0200 Subject: [PATCH] Further work on trying to get orientation properly mapped --- src/ifcgeom/kernels/opencascade/loop.cpp | 29 ++++++++++++++--------- src/ifcgeom/mapping/IfcCompositeCurve.cpp | 7 +++--- src/ifcgeom/mapping/IfcTrimmedCurve.cpp | 2 +- 3 files changed, 22 insertions(+), 16 deletions(-) diff --git a/src/ifcgeom/kernels/opencascade/loop.cpp b/src/ifcgeom/kernels/opencascade/loop.cpp index 2c4992611b..a7443f772b 100644 --- a/src/ifcgeom/kernels/opencascade/loop.cpp +++ b/src/ifcgeom/kernels/opencascade/loop.cpp @@ -140,19 +140,22 @@ namespace { const bool reversed = !e->orientation.get_value_or(true); const bool is_conic = e_basis->kind() == taxonomy::ELLIPSE || e_basis->kind() == taxonomy::CIRCLE; - if (!e->curve_sense) { - curve->Reverse(); + auto e_start = e->start; + auto e_end = e->end; + + if (!e->curve_sense.get_value_or(true)) { + std::swap(e_start, e_end); } // @todo, copy over logic from previous IfcTrimmedCurve handling - if (e->start.which() == 0) { - auto p1 = OpenCascadeKernel::convert_xyz(*boost::get(e->start)); - auto p2 = OpenCascadeKernel::convert_xyz(*boost::get(e->end)); + if (e_start.which() == 0) { + auto p1 = OpenCascadeKernel::convert_xyz(*boost::get(e_start)); + auto p2 = OpenCascadeKernel::convert_xyz(*boost::get(e_end)); E = BRepBuilderAPI_MakeEdge(curve, p1, p2).Edge(); } else { - auto v1 = boost::get(e->start); - auto v2 = boost::get(e->end); + auto v1 = boost::get(e_start); + auto v2 = boost::get(e_end); if (is_conic && ALMOST_THE_SAME(fmod(v2 - v1, M_PI*2.), 0.)) { E = BRepBuilderAPI_MakeEdge(curve).Edge(); @@ -161,6 +164,14 @@ namespace { } } + // When SenseAgreement == .F. the vertices above have been reversed to + // comply with the direction of conical curves. The ordering of the + // vertices then still needs to be reversed in order to have begin and + // end vertex consistent with IFC. + if (!e->curve_sense.get_value_or(true)) { + E.Reverse(); + } + if (reversed) { E.Reverse(); } @@ -235,10 +246,6 @@ bool OpenCascadeKernel::convert(const taxonomy::loop::ptr loop, TopoDS_Wire& wir std::wcout << o_str.c_str() << std::endl; #endif - if (!segment->curve_sense.get_value_or(true)) { - segment_wire.Reverse(); - } - ShapeFix_ShapeTolerance FTol; FTol.SetTolerance(segment_wire, precision_, TopAbs_WIRE); diff --git a/src/ifcgeom/mapping/IfcCompositeCurve.cpp b/src/ifcgeom/mapping/IfcCompositeCurve.cpp index 70230da556..c70334b347 100644 --- a/src/ifcgeom/mapping/IfcCompositeCurve.cpp +++ b/src/ifcgeom/mapping/IfcCompositeCurve.cpp @@ -52,15 +52,14 @@ taxonomy::ptr mapping::map_impl(const IfcSchema::IfcCompositeCurve* inst) { else if (segment->as()) { auto crv = map(segment->as()->ParentCurve()); if (crv) { + if (!segment->as()->SameSense()) { + crv->reverse(); + } if (crv->kind() == taxonomy::EDGE) { auto ecrv = taxonomy::cast(crv); - ecrv->curve_sense.reset(segment->as()->SameSense()); loop->children.push_back(ecrv); } else if (crv->kind() == taxonomy::LOOP) { - if (!segment->as()->SameSense()) { - crv->reverse(); - } for (auto& s : taxonomy::cast(crv)->children) { loop->children.push_back(s); } diff --git a/src/ifcgeom/mapping/IfcTrimmedCurve.cpp b/src/ifcgeom/mapping/IfcTrimmedCurve.cpp index 815b4d6484..96aa6a83e4 100644 --- a/src/ifcgeom/mapping/IfcTrimmedCurve.cpp +++ b/src/ifcgeom/mapping/IfcTrimmedCurve.cpp @@ -44,7 +44,7 @@ taxonomy::ptr mapping::map_impl(const IfcSchema::IfcTrimmedCurve* inst) { bool has_flts[2] = {false,false}; bool has_pnts[2] = {false,false}; - tc->orientation = inst->SenseAgreement(); + tc->curve_sense = inst->SenseAgreement(); for (auto it = trims1->begin(); it != trims1->end(); it ++) { auto i = *it;