diff --git a/src/Mod/Part/App/BSplineCurvePyImp.cpp b/src/Mod/Part/App/BSplineCurvePyImp.cpp index 2b0d7b93f0..75e73d00fa 100644 --- a/src/Mod/Part/App/BSplineCurvePyImp.cpp +++ b/src/Mod/Part/App/BSplineCurvePyImp.cpp @@ -327,6 +327,26 @@ PyObject* BSplineCurvePy::segment(PyObject* args) } } +PyObject* BSplineCurvePy::split(PyObject* args) const +{ + double u {}; + double tolerance = 0.0; + if (!PyArg_ParseTuple(args, "d|d", &u, &tolerance)) { + return nullptr; + } + try { + auto curves = getGeomBSplineCurvePtr()->split(u, tolerance); + Py::Tuple tuple(2); + tuple.setItem(0, Py::asObject(std::get<0>(curves)->getPyObject())); + tuple.setItem(1, Py::asObject(std::get<1>(curves)->getPyObject())); + return Py::new_reference_to(tuple); + } + catch (Standard_Failure& e) { + PyErr_SetString(PartExceptionOCCError, e.GetMessageString()); + return nullptr; + } +} + PyObject* BSplineCurvePy::setKnot(PyObject* args) { int Index, M = -1; diff --git a/src/Mod/Part/App/Geometry.cpp b/src/Mod/Part/App/Geometry.cpp index 22f96b4eaf..7590249b3d 100644 --- a/src/Mod/Part/App/Geometry.cpp +++ b/src/Mod/Part/App/Geometry.cpp @@ -1711,6 +1711,18 @@ bool GeomBSplineCurve::join(const Handle(Geom_BoundedCurve) & other) return true; } +std::tuple GeomBSplineCurve::split(double u, double tol) const +{ + Handle(Geom_BSplineCurve) curveL + = GeomConvert::SplitBSplineCurve(myCurve, myCurve->FirstParameter(), u, tol, true); + Handle(Geom_BSplineCurve) curveR + = GeomConvert::SplitBSplineCurve(myCurve, u, myCurve->LastParameter(), tol, true); + return std::make_tuple( + std::make_shared(curveL), + std::make_shared(curveR) + ); +} + void GeomBSplineCurve::interpolate(const std::vector& p, Standard_Boolean periodic) { if (p.size() < 2) { diff --git a/src/Mod/Part/App/Geometry.h b/src/Mod/Part/App/Geometry.h index 49e58c638d..4d2e9f6754 100644 --- a/src/Mod/Part/App/Geometry.h +++ b/src/Mod/Part/App/Geometry.h @@ -311,6 +311,7 @@ private: Handle(Geom_BezierCurve) myCurve; }; +using GeomBSplineCurvePtr = std::shared_ptr; class PartExport GeomBSplineCurve: public GeomBoundedCurve { TYPESYSTEM_HEADER_WITH_OVERRIDE(); @@ -377,6 +378,7 @@ public: void setPeriodic() const; bool isRational() const; bool join(const Handle(Geom_BoundedCurve) &); + std::tuple split(double u, double tol) const; void makeC1Continuous(double, double); std::list toBiArcs(double tolerance) const;