From e3dd67ad9fdb1867bfede246514a0a2050c2d03c Mon Sep 17 00:00:00 2001 From: tomate44 Date: Sun, 21 Aug 2022 18:13:12 +0200 Subject: [PATCH] [Part] Add setBounds method to BSplineCurve and change BSplineSurface.setBounds() to use dedicated OCCT function --- src/Mod/Part/App/BSplineCurvePy.xml | 10 ++++++ src/Mod/Part/App/BSplineCurvePyImp.cpp | 23 ++++++++++++++ src/Mod/Part/App/Geometry.cpp | 44 ++++++++++++++++---------- src/Mod/Part/App/Geometry.h | 1 + 4 files changed, 62 insertions(+), 16 deletions(-) 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;