From 7b970ab3b7f24bd3ef410390fcb6632dc3faa833 Mon Sep 17 00:00:00 2001 From: wmayer Date: Sun, 17 May 2020 23:25:07 +0200 Subject: [PATCH] Part: [skip ci] get n-th derivative of a curve via Python --- src/Mod/Part/App/GeometryCurvePy.xml | 25 +++++ src/Mod/Part/App/GeometryCurvePyImp.cpp | 130 ++++++++++++++++++++++++ 2 files changed, 155 insertions(+) diff --git a/src/Mod/Part/App/GeometryCurvePy.xml b/src/Mod/Part/App/GeometryCurvePy.xml index 2efb4fa3dc..6a76a796e6 100644 --- a/src/Mod/Part/App/GeometryCurvePy.xml +++ b/src/Mod/Part/App/GeometryCurvePy.xml @@ -58,6 +58,31 @@ Part.show(s) + + + Returns the point of given parameter + + + + + Returns the point and first derivative of given parameter + + + + + Returns the point, first and second derivatives + + + + + Returns the point, first, second and third derivatives + + + + + Returns the n-th derivative + + Computes the length of a curve diff --git a/src/Mod/Part/App/GeometryCurvePyImp.cpp b/src/Mod/Part/App/GeometryCurvePyImp.cpp index 0a02449d8f..b2cd23f61d 100644 --- a/src/Mod/Part/App/GeometryCurvePyImp.cpp +++ b/src/Mod/Part/App/GeometryCurvePyImp.cpp @@ -357,6 +357,136 @@ PyObject* GeometryCurvePy::parameterAtDistance(PyObject *args) return 0; } +PyObject* GeometryCurvePy::getD0(PyObject *args) +{ + Handle(Geom_Geometry) g = getGeometryPtr()->handle(); + Handle(Geom_Curve) c = Handle(Geom_Curve)::DownCast(g); + try { + if (!c.IsNull()) { + double u; + if (!PyArg_ParseTuple(args, "d", &u)) + return nullptr; + gp_Pnt p; + c->D0(u, p); + return new Base::VectorPy(Base::Vector3d(p.X(),p.Y(),p.Z())); + } + } + catch (Standard_Failure& e) { + PyErr_SetString(PartExceptionOCCError, e.GetMessageString()); + return nullptr; + } + + PyErr_SetString(PartExceptionOCCError, "Geometry is not a curve"); + return nullptr; +} + +PyObject* GeometryCurvePy::getD1(PyObject *args) +{ + Handle(Geom_Geometry) g = getGeometryPtr()->handle(); + Handle(Geom_Curve) c = Handle(Geom_Curve)::DownCast(g); + try { + if (!c.IsNull()) { + double u; + if (!PyArg_ParseTuple(args, "d", &u)) + return nullptr; + gp_Pnt p; + gp_Vec v; + c->D1(u, p, v); + Py::Tuple tuple(2); + tuple.setItem(0, Py::Vector(Base::Vector3d(p.X(),p.Y(),p.Z()))); + tuple.setItem(1, Py::Vector(Base::Vector3d(v.X(),v.Y(),v.Z()))); + return Py::new_reference_to(tuple); + } + } + catch (Standard_Failure& e) { + PyErr_SetString(PartExceptionOCCError, e.GetMessageString()); + return nullptr; + } + + PyErr_SetString(PartExceptionOCCError, "Geometry is not a curve"); + return nullptr; +} + +PyObject* GeometryCurvePy::getD2(PyObject *args) +{ + Handle(Geom_Geometry) g = getGeometryPtr()->handle(); + Handle(Geom_Curve) c = Handle(Geom_Curve)::DownCast(g); + try { + if (!c.IsNull()) { + double u; + if (!PyArg_ParseTuple(args, "d", &u)) + return nullptr; + gp_Pnt p1; + gp_Vec v1, v2; + c->D2(u, p1, v1, v2); + Py::Tuple tuple(3); + tuple.setItem(0, Py::Vector(Base::Vector3d(p1.X(),p1.Y(),p1.Z()))); + tuple.setItem(1, Py::Vector(Base::Vector3d(v1.X(),v1.Y(),v1.Z()))); + tuple.setItem(2, Py::Vector(Base::Vector3d(v2.X(),v2.Y(),v2.Z()))); + return Py::new_reference_to(tuple); + } + } + catch (Standard_Failure& e) { + PyErr_SetString(PartExceptionOCCError, e.GetMessageString()); + return nullptr; + } + + PyErr_SetString(PartExceptionOCCError, "Geometry is not a curve"); + return nullptr; +} + +PyObject* GeometryCurvePy::getD3(PyObject *args) +{ + Handle(Geom_Geometry) g = getGeometryPtr()->handle(); + Handle(Geom_Curve) c = Handle(Geom_Curve)::DownCast(g); + try { + if (!c.IsNull()) { + double u; + if (!PyArg_ParseTuple(args, "d", &u)) + return nullptr; + gp_Pnt p1; + gp_Vec v1, v2, v3; + c->D3(u, p1, v1, v2, v3); + Py::Tuple tuple(4); + tuple.setItem(0, Py::Vector(Base::Vector3d(p1.X(),p1.Y(),p1.Z()))); + tuple.setItem(1, Py::Vector(Base::Vector3d(v1.X(),v1.Y(),v1.Z()))); + tuple.setItem(2, Py::Vector(Base::Vector3d(v2.X(),v2.Y(),v2.Z()))); + tuple.setItem(3, Py::Vector(Base::Vector3d(v3.X(),v3.Y(),v3.Z()))); + return Py::new_reference_to(tuple); + } + } + catch (Standard_Failure& e) { + PyErr_SetString(PartExceptionOCCError, e.GetMessageString()); + return nullptr; + } + + PyErr_SetString(PartExceptionOCCError, "Geometry is not a curve"); + return nullptr; +} + +PyObject* GeometryCurvePy::getDN(PyObject *args) +{ + Handle(Geom_Geometry) g = getGeometryPtr()->handle(); + Handle(Geom_Curve) c = Handle(Geom_Curve)::DownCast(g); + try { + if (!c.IsNull()) { + int n; + double u; + if (!PyArg_ParseTuple(args, "di", &u, &n)) + return nullptr; + gp_Vec v = c->DN(u, n); + return new Base::VectorPy(Base::Vector3d(v.X(),v.Y(),v.Z())); + } + } + catch (Standard_Failure& e) { + PyErr_SetString(PartExceptionOCCError, e.GetMessageString()); + return nullptr; + } + + PyErr_SetString(PartExceptionOCCError, "Geometry is not a curve"); + return nullptr; +} + PyObject* GeometryCurvePy::value(PyObject *args) { Handle(Geom_Geometry) g = getGeometryPtr()->handle();