diff --git a/python_orocos_kdl/PyKDL/pybind11/kinfam.cpp b/python_orocos_kdl/PyKDL/pybind11/kinfam.cpp index b99515e6c..36b3ef261 100644 --- a/python_orocos_kdl/PyKDL/pybind11/kinfam.cpp +++ b/python_orocos_kdl/PyKDL/pybind11/kinfam.cpp @@ -175,8 +175,12 @@ void init_kinfam(pybind11::module &m) chain.def("addChain", &Chain::addChain); chain.def("getNrOfJoints", &Chain::getNrOfJoints); chain.def("getNrOfSegments", &Chain::getNrOfSegments); - chain.def("getSegment", (Segment& (Chain::*)(unsigned int)) &Chain::getSegment); - chain.def("getSegment", (const Segment& (Chain::*)(unsigned int) const) &Chain::getSegment); + chain.def("getSegment", [](const Chain &c, unsigned int nr) + { + if (nr >= c.getNrOfSegments()) + throw py::index_error("Chain index out of range"); + return c.getSegment(nr); + }); chain.def("__repr__", [](const Chain &c) { std::ostringstream oss; diff --git a/python_orocos_kdl/PyKDL/sip/kinfam.sip b/python_orocos_kdl/PyKDL/sip/kinfam.sip index 4b68aa6e2..3df44ef2b 100644 --- a/python_orocos_kdl/PyKDL/sip/kinfam.sip +++ b/python_orocos_kdl/PyKDL/sip/kinfam.sip @@ -177,6 +177,17 @@ public: unsigned int getNrOfJoints()const; unsigned int getNrOfSegments()const; + Segment& getSegment(unsigned int nr); +%MethodCode + if (a0 < 0 || a0 >= sipCpp->getNrOfSegments()) { + PyErr_SetString(PyExc_IndexError, "Chain index out of range"); + sipError = sipErrorFail; + } + else { + sipRes = &(sipCpp->getSegment(a0)); + } +%End + const std::string* __repr__() const; %MethodCode std::ostringstream oss; @@ -184,9 +195,6 @@ public: std::string s(oss.str()); sipRes=&s; %End - - const Segment& getSegment(unsigned int nr)const /Factory/; - }; class Tree {