From ca48841b8c05c2d7a67c1bdb63431c2010e75f75 Mon Sep 17 00:00:00 2001 From: Abdullah Tahiri Date: Sun, 26 Feb 2017 22:43:27 +0100 Subject: [PATCH] Part: GeomBSplineCurve extension to get, increase or reduce multiplicity --- src/Mod/Part/App/Geometry.cpp | 37 +++++++++++++++++++++++++++++++++++ src/Mod/Part/App/Geometry.h | 6 +++++- 2 files changed, 42 insertions(+), 1 deletion(-) diff --git a/src/Mod/Part/App/Geometry.cpp b/src/Mod/Part/App/Geometry.cpp index 2ebf25ad84..48583c3f34 100644 --- a/src/Mod/Part/App/Geometry.cpp +++ b/src/Mod/Part/App/Geometry.cpp @@ -793,6 +793,17 @@ std::vector GeomBSplineCurve::getMultiplicities() const return mults; } +int GeomBSplineCurve::getMultiplicity(int index) const +{ + try { + return myCurve->Multiplicity(index); + } + catch (Standard_Failure) { + Handle_Standard_Failure e = Standard_Failure::Caught(); + throw Base::RuntimeError(e->GetMessageString()); + } +} + int GeomBSplineCurve::getDegree() const { return myCurve->Degree(); @@ -914,6 +925,32 @@ void GeomBSplineCurve::increaseDegree(double degree) } } +void GeomBSplineCurve::increaseMultiplicity(int index, int multiplicity) +{ + try { + Handle_Geom_BSplineCurve curve = Handle_Geom_BSplineCurve::DownCast(this->handle()); + curve->IncreaseMultiplicity(index, multiplicity); + return; + } + catch (Standard_Failure) { + Handle_Standard_Failure e = Standard_Failure::Caught(); + throw Base::RuntimeError(e->GetMessageString()); + } +} + +bool GeomBSplineCurve::removeKnot(int index, int multiplicity, double tolerance) +{ + try { + Handle_Geom_BSplineCurve curve = Handle_Geom_BSplineCurve::DownCast(this->handle()); + return curve->RemoveKnot(index, multiplicity, tolerance) == Standard_True; + } + catch (Standard_Failure) { + Handle_Standard_Failure e = Standard_Failure::Caught(); + throw Base::RuntimeError(e->GetMessageString()); + } +} + + // Persistence implementer unsigned int GeomBSplineCurve::getMemSize (void) const { diff --git a/src/Mod/Part/App/Geometry.h b/src/Mod/Part/App/Geometry.h index bb579d4e70..8dfffb067f 100644 --- a/src/Mod/Part/App/Geometry.h +++ b/src/Mod/Part/App/Geometry.h @@ -226,14 +226,18 @@ public: std::vector getWeights() const; std::vector getKnots() const; std::vector getMultiplicities() const; + int getMultiplicity(int index) const; int getDegree() const; bool isPeriodic() const; bool join(const Handle_Geom_BSplineCurve&); void makeC1Continuous(double, double); std::list toBiArcs(double tolerance) const; - + void increaseDegree(double degree); + void increaseMultiplicity(int index, int multiplicity); + bool removeKnot(int index, int multiplicity, double tolerance = Precision::PConfusion()); + // Persistence implementer --------------------- virtual unsigned int getMemSize(void) const; virtual void Save(Base::Writer &/*writer*/) const;