diff --git a/src/Mod/Part/App/Geometry.cpp b/src/Mod/Part/App/Geometry.cpp index 48583c3f34..d9634c8c57 100644 --- a/src/Mod/Part/App/Geometry.cpp +++ b/src/Mod/Part/App/Geometry.cpp @@ -620,6 +620,36 @@ GeomBSplineCurve::GeomBSplineCurve(const Handle_Geom_BSplineCurve& b) this->myCurve = Handle_Geom_BSplineCurve::DownCast(b->Copy()); } +GeomBSplineCurve::GeomBSplineCurve( const std::vector& poles, const std::vector& weights, + const std::vector& knots, const std::vector& multiplicities, + int degree, bool periodic, bool checkrational) +{ + if (poles.size() != weights.size()) + throw Base::ValueError("poles and weights mismatch"); + + if (knots.size() != multiplicities.size()) + throw Base::ValueError("knots and multiplicities mismatch"); + + TColgp_Array1OfPnt p(1,poles.size()); + TColStd_Array1OfReal w(1,poles.size()); + TColStd_Array1OfReal k(1,knots.size()); + TColStd_Array1OfInteger m(1,knots.size()); + + for (int i = 1; i <= poles.size(); i++) { + p.SetValue(i, gp_Pnt(poles[i-1].x,poles[i-1].y,poles[i-1].z)); + w.SetValue(i, weights[i-1]); + } + + for (int i = 1; i <= knots.size(); i++) { + k.SetValue(i, knots[i-1]); + m.SetValue(i, multiplicities[i-1]); + } + + this->myCurve = new Geom_BSplineCurve (p, w, k, m, degree, periodic?Standard_True:Standard_False, checkrational?Standard_True:Standard_False); + +} + + GeomBSplineCurve::~GeomBSplineCurve() { } @@ -669,7 +699,7 @@ void GeomBSplineCurve::setPole(int index, const Base::Vector3d& pole, double wei void GeomBSplineCurve::setPoles(const std::vector& poles, const std::vector& weights) { if (poles.size() != weights.size()) - throw Base::ValueError("knots and multiplicities mismatch"); + throw Base::ValueError("poles and weights mismatch"); Standard_Integer index=1; diff --git a/src/Mod/Part/App/Geometry.h b/src/Mod/Part/App/Geometry.h index 8dfffb067f..c96f9164d6 100644 --- a/src/Mod/Part/App/Geometry.h +++ b/src/Mod/Part/App/Geometry.h @@ -191,6 +191,11 @@ class PartExport GeomBSplineCurve : public GeomBoundedCurve public: GeomBSplineCurve(); GeomBSplineCurve(const Handle_Geom_BSplineCurve&); + + GeomBSplineCurve( const std::vector& poles, const std::vector& weights, + const std::vector& knots, const std::vector& multiplicities, + int degree, bool periodic=false, bool checkrational = true); + virtual ~GeomBSplineCurve(); virtual Geometry *clone(void) const;