diff --git a/Core/src/IfcGeometryConverter/CurveConverter.h b/Core/src/IfcGeometryConverter/CurveConverter.h index 5fafa844f..5e7df7175 100644 --- a/Core/src/IfcGeometryConverter/CurveConverter.h +++ b/Core/src/IfcGeometryConverter/CurveConverter.h @@ -1593,11 +1593,16 @@ 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); direction = getDirectionOfCurve(curveSegment->ParentCurve.as(), runningLength); - } + } else if (curveSegment->ParentCurve.isOfType()) { point = getPointOnCurve(curveSegment->ParentCurve.as(), runningLength, length); @@ -2669,6 +2674,75 @@ 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] 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 + */ + 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 double& parameter) const noexcept(false) + { + // Interpret parameter + // SepticTerm is default parameter + auto SepticTerm = seventhOrderPolynomial->SepticTerm; + // SexticTerm, QuinticTerm, 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 + #if defined(OIP_MODULE_EARLYBINDING_IFC4X3_RC4) /*! \brief Calculates a trimming point on the third order polymonial spiral @@ -2677,7 +2751,7 @@ namespace OpenInfraPlatform * \return The location of the trimming point. * \note */ - template <> + template <> carve::geom::vector<3> getPointOnCurve(const EXPRESSReference& thirdOrderPolynomial, const typename IfcEntityTypesT::IfcParameterValue& parameter) const noexcept(false) { @@ -3104,6 +3178,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] seventhOrderPolynomial 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 + // SepticTerm is default parameter + auto SepticTerm = seventhOrderPolynomial->SepticTerm; + // SexticTerm, QuinticTerm, 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 #if defined(OIP_MODULE_EARLYBINDING_IFC4X3_RC4) /*! \brief Calculates an angle of the third order polynomial spiral. * \param[in] thirdOrderPolynomial A pointer to data from \c IfcThirdOrderPolynomialSpiral. diff --git a/Documentation/markdown/ReleaseNotes.md b/Documentation/markdown/ReleaseNotes.md index 3690e612a..72a95f113 100644 --- a/Documentation/markdown/ReleaseNotes.md +++ b/Documentation/markdown/ReleaseNotes.md @@ -11,6 +11,8 @@ * 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)) + * Supporting IfcThirdOrderPolynomialSpiral ([#553](https://github.com/tumcms/Open-Infra-Platform/pull/553)) ## 4.0.0 Release Notes diff --git a/Documentation/markdown/SupportedIFCrepresentations.md b/Documentation/markdown/SupportedIFCrepresentations.md index 08526ca12..7ae655293 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: | - |