diff --git a/src/Mod/Part/App/BSplineCurvePy.xml b/src/Mod/Part/App/BSplineCurvePy.xml
index 32529fdff5..5fa29e2305 100644
--- a/src/Mod/Part/App/BSplineCurvePy.xml
+++ b/src/Mod/Part/App/BSplineCurvePy.xml
@@ -464,5 +464,15 @@ from the knots table of this B-Spline curve.
+
+
+
+ Changes the bounds of the curve.
+ The geometry is not modified.
+ bspline_curve.setBounds(u0, u1)
+ Default arguments are (0.0, 1.0)
+
+
+
diff --git a/src/Mod/Part/App/BSplineCurvePyImp.cpp b/src/Mod/Part/App/BSplineCurvePyImp.cpp
index 31498fcc59..74733720fc 100644
--- a/src/Mod/Part/App/BSplineCurvePyImp.cpp
+++ b/src/Mod/Part/App/BSplineCurvePyImp.cpp
@@ -1392,6 +1392,29 @@ PyObject* BSplineCurvePy::makeC1Continuous(PyObject *args)
}
}
+PyObject* BSplineCurvePy::setBounds(PyObject *args)
+{
+ double u0=0.0;
+ double u1=1.0;
+ if (!PyArg_ParseTuple(args, "|dd", &u0, &u1))
+ return nullptr;
+ try {
+ if (u0 >= u1) {
+ Standard_Failure::Raise("Bad parameter range");
+ return nullptr;;
+ }
+ GeomBSplineCurve* curve = getGeomBSplineCurvePtr();
+ curve->setBounds(u0, u1);
+ Py_Return;
+ }
+ catch (Standard_Failure& e) {
+ std::string err = e.GetMessageString();
+ if (err.empty()) err = e.DynamicType()->Name();
+ PyErr_SetString(PartExceptionOCCError, err.c_str());
+ return nullptr;
+ }
+}
+
PyObject* BSplineCurvePy::getCustomAttributes(const char* /*attr*/) const
{
return nullptr;
diff --git a/src/Mod/Part/App/Geometry.cpp b/src/Mod/Part/App/Geometry.cpp
index 85237e21c8..2f352f7691 100644
--- a/src/Mod/Part/App/Geometry.cpp
+++ b/src/Mod/Part/App/Geometry.cpp
@@ -26,6 +26,7 @@
# include
# include
# include
+# include
# include
# include
# include
@@ -37,10 +38,10 @@
# include
# include
# include
-#include
-#include
-#include
-#include
+# include
+# include
+# include
+# include
# include
# include
# include
@@ -1615,6 +1616,25 @@ void GeomBSplineCurve::Trim(double u, double v)
}
}
+void GeomBSplineCurve::setBounds(double u0, double u1)
+{
+ try {
+ Handle(Geom_BSplineCurve) curve = Handle(Geom_BSplineCurve)::DownCast(myCurve->Copy());
+ Standard_RangeError_Raise_if (u1 <= u0, " ");
+ TColStd_Array1OfReal k(1,curve->NbKnots());
+ curve->Knots(k);
+ if ((abs(u0-k.First()) > Precision::Confusion()) || (abs(u1-k.Last()) > Precision::Confusion())) {
+ BSplCLib::Reparametrize(u0, u1, k);
+ curve->SetKnots(k);
+ }
+ myCurve = curve;
+ return;
+ }
+ catch (Standard_Failure& e) {
+ THROWM(Base::CADKernelError,e.GetMessageString())
+ }
+}
+
// Persistence implementer
unsigned int GeomBSplineCurve::getMemSize () const
{
@@ -4467,23 +4487,15 @@ void GeomBSplineSurface::setBounds(double u0, double u1, double v0, double v1)
surf->Bounds(bu0,bu1,bv0,bv1);
if ((abs(u0-bu0) > Precision::Confusion()) || (abs(u1-bu1) > Precision::Confusion())) {
TColStd_Array1OfReal uk(1,surf->NbUKnots());
- TColStd_Array1OfReal nuk(1,surf->NbUKnots());
surf->UKnots(uk);
- Standard_Real ur = uk(uk.Upper()) - uk(uk.Lower());
- for (Standard_Integer i=uk.Lower(); i<=uk.Upper(); i++) {
- nuk(i) = u0 + ((u1 - u0) * (uk(i) - uk(uk.Lower())) / ur);
- }
- surf->SetUKnots(nuk);
+ BSplCLib::Reparametrize(u0, u1, uk);
+ surf->SetUKnots(uk);
}
if ((abs(v0-bv0) > Precision::Confusion()) || (abs(v1-bv1) > Precision::Confusion())) {
TColStd_Array1OfReal vk(1,surf->NbVKnots());
- TColStd_Array1OfReal nvk(1,surf->NbVKnots());
surf->VKnots(vk);
- Standard_Real vr = vk(vk.Upper()) - vk(vk.Lower());
- for (Standard_Integer j=vk.Lower(); j<=vk.Upper(); j++) {
- nvk(j) = v0 + ((v1 - v0) * (vk(j) - vk(vk.Lower())) / vr);
- }
- surf->SetVKnots(nvk);
+ BSplCLib::Reparametrize(v0, v1, vk);
+ surf->SetVKnots(vk);
}
mySurface = surf;
return;
diff --git a/src/Mod/Part/App/Geometry.h b/src/Mod/Part/App/Geometry.h
index 51f5633356..b7661a673b 100644
--- a/src/Mod/Part/App/Geometry.h
+++ b/src/Mod/Part/App/Geometry.h
@@ -317,6 +317,7 @@ public:
bool removeKnot(int index, int multiplicity, double tolerance = Precision::PConfusion());
void Trim(double u, double v);
+ void setBounds(double u0, double u1);
// Persistence implementer ---------------------
unsigned int getMemSize() const override;