From 02864f96e0fbd0a6c958025f5a4d0df0020cd0db Mon Sep 17 00:00:00 2001 From: Thomas Krijnen Date: Thu, 15 Jun 2023 16:18:48 +0200 Subject: [PATCH] #2819 Handle periodic bspline curves in serialization --- src/ifcgeom/Serialization/schema/Serialization.cpp | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/ifcgeom/Serialization/schema/Serialization.cpp b/src/ifcgeom/Serialization/schema/Serialization.cpp index 80c6967c26..5433a2754e 100644 --- a/src/ifcgeom/Serialization/schema/Serialization.cpp +++ b/src/ifcgeom/Serialization/schema/Serialization.cpp @@ -30,6 +30,8 @@ #define INCLUDE_PARENT_PARENT_DIR(x) STRINGIFY(../../../ifcparse/x-definitions.h) #include INCLUDE_PARENT_PARENT_DIR(IfcSchema) +#include + template int convert_to_ifc(const T& t, U*& u, bool /*advanced*/) { std::vector coords(3); @@ -232,6 +234,15 @@ int convert_to_ifc(const Handle_Geom_Curve& c, IfcSchema::IfcCurve*& curve, bool } } + if (bspline->IsPeriodic() && points->size()) { + points->push(*points->begin()); + weights.push_back(weights[0]); + auto sum = std::accumulate(mults.begin(), mults.end(), 0); + auto d = sum - (bspline->Degree() + (int)points->size() + 1); + (*mults.begin()) -= d / 2; + (*mults.rbegin()) -= d / 2; + } + if (rational) { curve = new IfcSchema::IfcRationalBSplineCurveWithKnots( bspline->Degree(),