[Part] Add methods to create an arc of the curve

This commit is contained in:
Ajinkya Dahale
2024-08-23 05:16:14 +05:30
parent ed59a23778
commit 427a6853b6
2 changed files with 50 additions and 1 deletions

View File

@@ -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<Part::GeomBSplineCurve*>(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<Part::GeomTrimmedCurve*>(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

View File

@@ -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;