Part: [skip ci] get n-th derivative of a curve via Python

This commit is contained in:
wmayer
2020-05-17 23:25:07 +02:00
parent ff0e556b59
commit 7b970ab3b7
2 changed files with 155 additions and 0 deletions

View File

@@ -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();