From 8410d68418e9e04d310377891158b676af2c659f Mon Sep 17 00:00:00 2001 From: Elvira2227 Date: Mon, 13 Jun 2022 21:30:54 +0200 Subject: [PATCH 1/5] Implementation for IfcSeventhOrderPolynomialSpiral has been added --- .../src/IfcGeometryConverter/CurveConverter.h | 133 ++++++++++++++++++ 1 file changed, 133 insertions(+) diff --git a/Core/src/IfcGeometryConverter/CurveConverter.h b/Core/src/IfcGeometryConverter/CurveConverter.h index ef623c574..4b670d65f 100644 --- a/Core/src/IfcGeometryConverter/CurveConverter.h +++ b/Core/src/IfcGeometryConverter/CurveConverter.h @@ -1593,6 +1593,11 @@ namespace OpenInfraPlatform point = getPointOnCurve(curveSegment->ParentCurve.as(), runningLength); direction = getDirectionOfCurve(curveSegment->ParentCurve.as(), runningLength); } + else if (curveSegment->ParentCurve.isOfType()) + { + point = getPointOnCurve(curveSegment->ParentCurve.as(), runningLength); + direction = getDirectionOfCurve(curveSegment->ParentCurve.as(), runningLength); + } segmentPoints.push_back(point); segmentDirections.push_back(direction); // determine next length @@ -2615,7 +2620,73 @@ namespace OpenInfraPlatform return carve::geom::VECTOR(x, y, 0.); } #endif +#if defined(OIP_MODULE_EARLYBINDING_IFC4X3_RC4) + + /*! \brief Calculates a trimming point on the seventh order polymonial spiral + * \param[in] thirdOrderPolynomial A pointer to data from \c IfcSeventhOrderPolynomialSpiral. + * \param[in] parameter A pointer to data from \c IfcParameterValue. + * \return The location of the trimming point. + * \note + */ + template <> + carve::geom::vector<3> getPointOnCurve(const EXPRESSReference& seventhOrderPolynomial, + const typename IfcEntityTypesT::IfcParameterValue& parameter) const noexcept(false) + { + return getPointOnCurve(seventhOrderPolynomial, parameter * this->UnitConvert()->getLengthInMeterFactor()); + } + template <> + carve::geom::vector<3> getPointOnCurve(const EXPRESSReference& seventhOrderPolynomial, + const typename IfcEntityTypesT::IfcNonNegativeLengthMeasure& parameter) const noexcept(false) + { + return getPointOnCurve(seventhOrderPolynomial, parameter * this->UnitConvert()->getLengthInMeterFactor()); + } + carve::geom::vector<3> getPointOnCurve(const EXPRESSReference& seventhOrderPolynomial, + const typename IfcEntityTypesT::IfcParameterValue& parameter) const noexcept(false) + { + // Interpret parameter + // cubic is default parameter + auto SepticTerm = seventhOrderPolynomial->SepticTerm; + // QuadraticTerm, LinearTerm, ConstantTerm are optional parameters + EXPRESSOptional st = seventhOrderPolynomial->SexticTerm; + EXPRESSOptional quit = seventhOrderPolynomial->QuinticTerm; + EXPRESSOptional quat = seventhOrderPolynomial->QuarticTerm; + EXPRESSOptional cut = seventhOrderPolynomial->CubicTerm; + EXPRESSOptional qt = seventhOrderPolynomial->QuadraticTerm; + EXPRESSOptional lt = seventhOrderPolynomial->LinearTerm; + EXPRESSOptional ct = seventhOrderPolynomial->ConstantTerm; + //define variables + double SexticTerm, QuinticTerm, QuarticTerm, CubicTerm, QuadraticTerm, LinearTerm, ConstantTerm; + // check the existence + if (st) SexticTerm = st; + else SexticTerm = 0.; + + if (quit) QuinticTerm = quit; + else QuinticTerm = 0.; + + if (quat) QuarticTerm = quat; + else QuarticTerm = 0.; + + if (cut) CubicTerm = cut; + else CubicTerm = 0.; + + if (qt) QuadraticTerm = qt; + else QuadraticTerm = 0.; + + if (lt) LinearTerm = lt; + else LinearTerm = 0.; + + if (ct) ConstantTerm = ct; + else ConstantTerm = 0.; + // Implement Taylor series for x coordinate + double x = SpiralUtils::XbyAngleDeviationPolynomialByTerms(SepticTerm, SexticTerm, QuinticTerm, QuarticTerm, CubicTerm, QuadraticTerm, LinearTerm, ConstantTerm, parameter); + + // Implement Taylor series for y coordinate + double y = SpiralUtils::YbyAngleDeviationPolynomialByTerms(SepticTerm, SexticTerm, QuinticTerm, QuarticTerm, CubicTerm, QuadraticTerm, LinearTerm, ConstantTerm, parameter); + + return carve::geom::VECTOR(x, y, 0.); + } +#endif /**********************************************************************************************/ /*! \brief Calculates a direction of the curve. @@ -2895,7 +2966,69 @@ namespace OpenInfraPlatform return carve::geom::VECTOR(std::cos(angle), std::sin(angle), 0.); } #endif +#if defined(OIP_MODULE_EARLYBINDING_IFC4X3_RC4) + /*! \brief Calculates an angle of the seventh order polynomial spiral. + * \param[in] thirdOrderPolynomial A pointer to data from \c IfcSeventhOrderPolynomialSpiral. + * \param[in] parameter The length. + * \return The Angle in radians. + * \note + */ + template <> + carve::geom::vector<3> getDirectionOfCurve(const EXPRESSReference& seventhOrderPolynomial, + const typename IfcEntityTypesT::IfcParameterValue& parameter) const noexcept(false) + { + return getDirectionOfCurve(seventhOrderPolynomial, parameter * this->UnitConvert()->getLengthInMeterFactor()); + } + template <> + carve::geom::vector<3> getDirectionOfCurve(const EXPRESSReference& seventhOrderPolynomial, + const typename IfcEntityTypesT::IfcNonNegativeLengthMeasure& parameter) const noexcept(false) + { + return getDirectionOfCurve(seventhOrderPolynomial, parameter * this->UnitConvert()->getLengthInMeterFactor()); + } + template<> + carve::geom::vector<3> getDirectionOfCurve(const EXPRESSReference& seventhOrderPolynomial, + const double& parameter) const noexcept(false) + { + // Interpret parameter + // cubic is default parameter + auto SepticTerm = seventhOrderPolynomial->SepticTerm; + // QuadraticTerm, LinearTerm, ConstantTerm are optional parameters + EXPRESSOptional st = seventhOrderPolynomial->SexticTerm; + EXPRESSOptional quit = seventhOrderPolynomial->QuinticTerm; + EXPRESSOptional quat = seventhOrderPolynomial->QuarticTerm; + EXPRESSOptional cut = seventhOrderPolynomial->CubicTerm; + EXPRESSOptional qt = seventhOrderPolynomial->QuadraticTerm; + EXPRESSOptional lt = seventhOrderPolynomial->LinearTerm; + EXPRESSOptional ct = seventhOrderPolynomial->ConstantTerm; + //define variables + double SexticTerm, QuinticTerm, QuarticTerm, CubicTerm, QuadraticTerm, LinearTerm, ConstantTerm; + // check the existence + if (st) SexticTerm = st; + else SexticTerm = 0.; + + if (quit) QuinticTerm = quit; + else QuinticTerm = 0.; + + if (quat) QuarticTerm = quat; + else QuarticTerm = 0.; + + if (cut) CubicTerm = cut; + else CubicTerm = 0.; + + if (qt) QuadraticTerm = qt; + else QuadraticTerm = 0.; + + if (lt) LinearTerm = lt; + else LinearTerm = 0.; + + if (ct) ConstantTerm = ct; + else ConstantTerm = 0.; + //calculate angle + double angle = SpiralUtils::AngleByAngleDeviationPolynomialByTerms(SepticTerm, SexticTerm, QuinticTerm, QuarticTerm, CubicTerm, QuadraticTerm, LinearTerm, ConstantTerm, parameter); + return carve::geom::VECTOR(std::cos(angle), std::sin(angle), 0.); + } +#endif protected: From a95e68cca7f8b4d62704c2d90f1fcdfe9e43381a Mon Sep 17 00:00:00 2001 From: Elvira2227 Date: Mon, 13 Jun 2022 21:44:15 +0200 Subject: [PATCH 2/5] Small corrections --- Core/src/IfcGeometryConverter/CurveConverter.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Core/src/IfcGeometryConverter/CurveConverter.h b/Core/src/IfcGeometryConverter/CurveConverter.h index 4b670d65f..62e2caa64 100644 --- a/Core/src/IfcGeometryConverter/CurveConverter.h +++ b/Core/src/IfcGeometryConverter/CurveConverter.h @@ -2623,7 +2623,7 @@ namespace OpenInfraPlatform #if defined(OIP_MODULE_EARLYBINDING_IFC4X3_RC4) /*! \brief Calculates a trimming point on the seventh order polymonial spiral - * \param[in] thirdOrderPolynomial A pointer to data from \c IfcSeventhOrderPolynomialSpiral. + * \param[in] seventhOrderPolynomial A pointer to data from \c IfcSeventhOrderPolynomialSpiral. * \param[in] parameter A pointer to data from \c IfcParameterValue. * \return The location of the trimming point. * \note @@ -2968,9 +2968,9 @@ namespace OpenInfraPlatform #endif #if defined(OIP_MODULE_EARLYBINDING_IFC4X3_RC4) /*! \brief Calculates an angle of the seventh order polynomial spiral. - * \param[in] thirdOrderPolynomial A pointer to data from \c IfcSeventhOrderPolynomialSpiral. - * \param[in] parameter The length. - * \return The Angle in radians. + * \param[in] seventhOrderPolynomial A pointer to data from \c IfcSeventhOrderPolynomialSpiral. + * \param[in] parameter The length. + * \return The Angle in radians. * \note */ template <> From e7e3ea35fd9fe7d8e9d590ce9903d71ad6a7996f Mon Sep 17 00:00:00 2001 From: Elvira2227 Date: Fri, 15 Jul 2022 14:51:15 +0200 Subject: [PATCH 3/5] added improvements --- Core/src/IfcGeometryConverter/CurveConverter.h | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/Core/src/IfcGeometryConverter/CurveConverter.h b/Core/src/IfcGeometryConverter/CurveConverter.h index 62e2caa64..acec509e8 100644 --- a/Core/src/IfcGeometryConverter/CurveConverter.h +++ b/Core/src/IfcGeometryConverter/CurveConverter.h @@ -2629,12 +2629,6 @@ namespace OpenInfraPlatform * \note */ template <> - carve::geom::vector<3> getPointOnCurve(const EXPRESSReference& seventhOrderPolynomial, - const typename IfcEntityTypesT::IfcParameterValue& parameter) const noexcept(false) - { - return getPointOnCurve(seventhOrderPolynomial, parameter * this->UnitConvert()->getLengthInMeterFactor()); - } - template <> carve::geom::vector<3> getPointOnCurve(const EXPRESSReference& seventhOrderPolynomial, const typename IfcEntityTypesT::IfcNonNegativeLengthMeasure& parameter) const noexcept(false) { @@ -2644,9 +2638,9 @@ namespace OpenInfraPlatform const typename IfcEntityTypesT::IfcParameterValue& parameter) const noexcept(false) { // Interpret parameter - // cubic is default parameter + // SepticTerm is default parameter auto SepticTerm = seventhOrderPolynomial->SepticTerm; - // QuadraticTerm, LinearTerm, ConstantTerm are optional parameters + // SexticTerm, QuinticTerm, QuadraticTerm, LinearTerm, ConstantTerm are optional parameters EXPRESSOptional st = seventhOrderPolynomial->SexticTerm; EXPRESSOptional quit = seventhOrderPolynomial->QuinticTerm; EXPRESSOptional quat = seventhOrderPolynomial->QuarticTerm; @@ -2990,9 +2984,9 @@ namespace OpenInfraPlatform const double& parameter) const noexcept(false) { // Interpret parameter - // cubic is default parameter + // SepticTerm is default parameter auto SepticTerm = seventhOrderPolynomial->SepticTerm; - // QuadraticTerm, LinearTerm, ConstantTerm are optional parameters + // SexticTerm, QuinticTerm, QuadraticTerm, LinearTerm, ConstantTerm are optional parameters EXPRESSOptional st = seventhOrderPolynomial->SexticTerm; EXPRESSOptional quit = seventhOrderPolynomial->QuinticTerm; EXPRESSOptional quat = seventhOrderPolynomial->QuarticTerm; From 29737f3b98fdd838096521757f9086d0b5d1464e Mon Sep 17 00:00:00 2001 From: Elvira2227 Date: Tue, 9 Aug 2022 10:53:06 +0200 Subject: [PATCH 4/5] Fixed mistake; add info to documentation --- Core/src/IfcGeometryConverter/CurveConverter.h | 10 ++++++++-- Documentation/markdown/ReleaseNotes.md | 3 ++- Documentation/markdown/SupportedIFCrepresentations.md | 2 +- 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/Core/src/IfcGeometryConverter/CurveConverter.h b/Core/src/IfcGeometryConverter/CurveConverter.h index 7fda428d0..30dbaeb15 100644 --- a/Core/src/IfcGeometryConverter/CurveConverter.h +++ b/Core/src/IfcGeometryConverter/CurveConverter.h @@ -1597,12 +1597,12 @@ namespace OpenInfraPlatform { point = getPointOnCurve(curveSegment->ParentCurve.as(), runningLength); direction = getDirectionOfCurve(curveSegment->ParentCurve.as(), runningLength); - } + } else if (curveSegment->ParentCurve.isOfType()) { point = getPointOnCurve(curveSegment->ParentCurve.as(), runningLength); direction = getDirectionOfCurve(curveSegment->ParentCurve.as(), runningLength); - } + } else if (curveSegment->ParentCurve.isOfType()) { point = getPointOnCurve(curveSegment->ParentCurve.as(), runningLength, length); @@ -2684,6 +2684,12 @@ namespace OpenInfraPlatform * \note */ template <> + carve::geom::vector<3> getPointOnCurve(const EXPRESSReference& seventhOrderPolynomial, + const typename IfcEntityTypesT::IfcParameterValue& parameter) const noexcept(false) + { + return getPointOnCurve(seventhOrderPolynomial, parameter * this->UnitConvert()->getLengthInMeterFactor()); + } + template <> carve::geom::vector<3> getPointOnCurve(const EXPRESSReference& seventhOrderPolynomial, const typename IfcEntityTypesT::IfcNonNegativeLengthMeasure& parameter) const noexcept(false) { diff --git a/Documentation/markdown/ReleaseNotes.md b/Documentation/markdown/ReleaseNotes.md index b5ce3cc34..0c2ea6a9e 100644 --- a/Documentation/markdown/ReleaseNotes.md +++ b/Documentation/markdown/ReleaseNotes.md @@ -10,7 +10,8 @@ * Supporting IfcSine ([#553](https://github.com/tumcms/Open-Infra-Platform/pull/553)) * Adjusted the density of mesh grid lines on B-spline and NURBS surfaces ([#547](https://github.com/tumcms/Open-Infra-Platform/pull/547)) - + + * Supporting IfcSeventhOrderPolynomialSpiral ([#552](https://github.com/tumcms/Open-Infra-Platform/pull/552)) ## 4.0.0 Release Notes diff --git a/Documentation/markdown/SupportedIFCrepresentations.md b/Documentation/markdown/SupportedIFCrepresentations.md index 0209e35a0..c0be32adb 100644 --- a/Documentation/markdown/SupportedIFCrepresentations.md +++ b/Documentation/markdown/SupportedIFCrepresentations.md @@ -135,7 +135,7 @@ Meaning of columns: | `IfcSectionedSpine` | :x: | `RepresentationConverter` | - | - | | `IfcSegmentedReferenceCurve` | :x: | `CurveConverter` | - | - | | `IfcSeriesParameterCurve` | :x: | `CurveConverter` | - | - | -| `IfcSeventhOrderPolynomialSpiral` | :x: | `CurveConverter` | :x: | [#524](https://github.com/tumcms/Open-Infra-Platform/issues/524)| +| `IfcSeventhOrderPolynomialSpiral` | :heavy_check_mark: | `CurveConverter` | :x: | [#524](https://github.com/tumcms/Open-Infra-Platform/issues/524)| | `IfcShellBasedSurfaceModel` | :heavy_check_mark: | `FaceConverter` | :x: | - | | `IfcSine` | :heavy_check_mark: | `CurveConverter` | :x: | [#524](https://github.com/tumcms/Open-Infra-Platform/issues/524)| | `IfcSphere` | :heavy_check_mark: | `SolidModelConverter` | :x: | - | From bd72521eb9cfea38e119e16efd04fede1aafb447 Mon Sep 17 00:00:00 2001 From: Elvira2227 Date: Tue, 9 Aug 2022 14:57:55 +0200 Subject: [PATCH 5/5] Added improvements --- Core/src/IfcGeometryConverter/CurveConverter.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Core/src/IfcGeometryConverter/CurveConverter.h b/Core/src/IfcGeometryConverter/CurveConverter.h index 30dbaeb15..90be0fde6 100644 --- a/Core/src/IfcGeometryConverter/CurveConverter.h +++ b/Core/src/IfcGeometryConverter/CurveConverter.h @@ -2696,7 +2696,7 @@ namespace OpenInfraPlatform return getPointOnCurve(seventhOrderPolynomial, parameter * this->UnitConvert()->getLengthInMeterFactor()); } carve::geom::vector<3> getPointOnCurve(const EXPRESSReference& seventhOrderPolynomial, - const typename IfcEntityTypesT::IfcParameterValue& parameter) const noexcept(false) + const double& parameter) const noexcept(false) { // Interpret parameter // SepticTerm is default parameter