From 427a6853b62bbacfdb5f33a3e6105e639663f86a Mon Sep 17 00:00:00 2001 From: Ajinkya Dahale Date: Fri, 23 Aug 2024 05:16:14 +0530 Subject: [PATCH] [Part] Add methods to create an arc of the curve --- src/Mod/Part/App/Geometry.cpp | 37 +++++++++++++++++++++++++++++++++++ src/Mod/Part/App/Geometry.h | 14 ++++++++++++- 2 files changed, 50 insertions(+), 1 deletion(-) diff --git a/src/Mod/Part/App/Geometry.cpp b/src/Mod/Part/App/Geometry.cpp index 307fddb0aa..95d3db67ef 100644 --- a/src/Mod/Part/App/Geometry.cpp +++ b/src/Mod/Part/App/Geometry.cpp @@ -793,6 +793,11 @@ GeomBSplineCurve* GeomCurve::toNurbs(double first, double last) const return toBSpline(first, last); } +GeomCurve* GeomCurve::createArc([[maybe_unused]] double first, [[maybe_unused]] double last) const +{ + return nullptr; +} + bool GeomCurve::tangent(double u, gp_Dir& dir) const { Handle(Geom_Curve) curve = Handle(Geom_Curve)::DownCast(handle()); @@ -1380,6 +1385,14 @@ Geometry *GeomBSplineCurve::copy() const } } +GeomCurve* GeomBSplineCurve::createArc(double first, double last) const +{ + auto newBsp = static_cast(this->copy()); + newBsp->Trim(first, last); + + return newBsp; +} + int GeomBSplineCurve::countPoles() const { return myCurve->NbPoles(); @@ -2270,6 +2283,14 @@ Geometry *GeomTrimmedCurve::copy() const return newCurve; } +GeomCurve* GeomTrimmedCurve::createArc(double first, double last) const +{ + auto newArc = static_cast(this->copy()); + newArc->setRange(first, last); + + return newArc; +} + // Persistence implementer unsigned int GeomTrimmedCurve::getMemSize () const { @@ -2592,6 +2613,14 @@ Geometry *GeomCircle::copy() const return newCirc; } +GeomCurve* GeomCircle::createArc(double first, double last) const +{ + auto newArc = new GeomArcOfCircle(Handle(Geom_Circle)::DownCast(this->handle()->Copy())); + newArc->setRange(first, last, false); + + return newArc; +} + GeomBSplineCurve* GeomCircle::toNurbs(double first, double last) const { // for an arc of circle use the generic method @@ -3030,6 +3059,14 @@ Geometry *GeomEllipse::copy() const return newEllipse; } +GeomCurve* GeomEllipse::createArc(double first, double last) const +{ + auto newArc = new GeomArcOfEllipse(Handle(Geom_Ellipse)::DownCast(this->handle()->Copy())); + newArc->setRange(first, last, false); + + return newArc; +} + GeomBSplineCurve* GeomEllipse::toNurbs(double first, double last) const { // for an arc of ellipse use the generic method diff --git a/src/Mod/Part/App/Geometry.h b/src/Mod/Part/App/Geometry.h index 2525281493..1d78d24258 100644 --- a/src/Mod/Part/App/Geometry.h +++ b/src/Mod/Part/App/Geometry.h @@ -209,8 +209,15 @@ public: The default implementation does the same as \ref toBSpline. In sub-classes this can be reimplemented to create a real NURBS curve and not just an approximation. - */ + */ virtual GeomBSplineCurve* toNurbs(double first, double last) const; + /*! + * \brief getArc Generates a curve that is an arc of this curve between given parameters + * \param first Parameter at start of arc + * \param last Parameter at end of arc. This may be < `first` for periodic curves. + * \return the new curve + */ + virtual GeomCurve* createArc(double first, double last) const; bool tangent(double u, gp_Dir&) const; bool tangent(double u, Base::Vector3d& dir) const; Base::Vector3d pointAtParameter(double u) const; @@ -294,6 +301,8 @@ public: ~GeomBSplineCurve() override; Geometry *copy() const override; + GeomCurve* createArc(double first, double last) const override; + /*! * Interpolate a spline passing through the given points without tangency. */ @@ -430,6 +439,7 @@ public: ~GeomTrimmedCurve() override; Geometry *copy() const override; + GeomCurve* createArc(double first, double last) const override; // Persistence implementer --------------------- unsigned int getMemSize() const override; void Save(Base::Writer &/*writer*/) const override; @@ -514,6 +524,7 @@ public: ~GeomCircle() override; Geometry *copy() const override; + GeomCurve* createArc(double first, double last) const override; double getRadius() const; void setRadius(double Radius); @@ -575,6 +586,7 @@ public: ~GeomEllipse() override; Geometry *copy() const override; + GeomCurve* createArc(double first, double last) const override; double getMajorRadius() const; void setMajorRadius(double Radius); double getMinorRadius() const;