Part: Add method to split B-spline curve

Add the method GeomBSplineCurve::split() to split a B-Spline curve into
two curves.
This commit is contained in:
wwmayer
2025-12-27 13:09:06 +01:00
committed by Chris Hennes
parent 12cced51f1
commit 603ec56151
3 changed files with 34 additions and 0 deletions
+20
View File
@@ -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;
+12
View File
@@ -1711,6 +1711,18 @@ bool GeomBSplineCurve::join(const Handle(Geom_BoundedCurve) & other)
return true;
}
std::tuple<GeomBSplineCurvePtr, GeomBSplineCurvePtr> 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<GeomBSplineCurve>(curveL),
std::make_shared<GeomBSplineCurve>(curveR)
);
}
void GeomBSplineCurve::interpolate(const std::vector<gp_Pnt>& p, Standard_Boolean periodic)
{
if (p.size() < 2) {
+2
View File
@@ -311,6 +311,7 @@ private:
Handle(Geom_BezierCurve) myCurve;
};
using GeomBSplineCurvePtr = std::shared_ptr<GeomBSplineCurve>;
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<GeomBSplineCurvePtr, GeomBSplineCurvePtr> split(double u, double tol) const;
void makeC1Continuous(double, double);
std::list<Geometry*> toBiArcs(double tolerance) const;