diff --git a/CMakeLists.txt b/CMakeLists.txt index d668d9e12e69ca2a4809b07e0e97eb0aef9daa4c..a32ff0a735c029a1147628b252efa007d0a3882e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -39,7 +39,7 @@ SET(PKG_CONFIG_ADDITIONAL_VARIABLES plugindir ${PKG_CONFIG_ADDITIONAL_VARIABLES} SETUP_PROJECT() # Trigger dependency to dynamic-graph. -ADD_REQUIRED_DEPENDENCY("dynamic-graph >= 1.0") +ADD_REQUIRED_DEPENDENCY("dynamic-graph >= 2.5.5-6") # Add dependency toward dynamic graph library in pkg-config file. PKG_CONFIG_APPEND_LIBS("dynamic-graph-python") diff --git a/src/dynamic-graph-py.cc b/src/dynamic-graph-py.cc index 2b0ac14ec3b6255eb8a9e53b6f0bee53d059955e..d9a0e2ef4970d89047ed4f1868f0cf7a676cef94 100644 --- a/src/dynamic-graph-py.cc +++ b/src/dynamic-graph-py.cc @@ -48,6 +48,7 @@ namespace dynamicgraph { extern PyObject* display(PyObject* self, PyObject* args); extern PyObject* display(PyObject* self, PyObject* args); extern PyObject* getName(PyObject* self, PyObject* args); + extern PyObject* hasSignal(PyObject* self, PyObject* args); extern PyObject* getSignal(PyObject* self, PyObject* args); extern PyObject* listSignals(PyObject* self, PyObject* args); extern PyObject* executeCommand(PyObject* self, PyObject* args); @@ -179,6 +180,8 @@ static PyMethodDef dynamicGraphMethods[] = { "print an Entity C++ object"}, {"entity_get_name", dynamicgraph::python::entity::getName, METH_VARARGS, "get the name of an Entity"}, + {"entity_has_signal", dynamicgraph::python::entity::hasSignal, METH_VARARGS, + "return True if the entity has a signal with the given name"}, {"entity_get_signal", dynamicgraph::python::entity::getSignal, METH_VARARGS, "get signal by name from an Entity"}, {"entity_list_signals", dynamicgraph::python::entity::listSignals, diff --git a/src/dynamic_graph/entity.py b/src/dynamic_graph/entity.py index ddf7d2ff75c2dfebbb45d47372bed82f4e4f3141..bb3d2d53f87724e7e5683b6958c5169568610625 100644 --- a/src/dynamic_graph/entity.py +++ b/src/dynamic_graph/entity.py @@ -107,6 +107,12 @@ class Entity (object) : signalPt = wrap.entity_get_signal(self.obj, name) return signal_base.SignalBase(name = "", obj = signalPt) + def hasSignal(self, name) : + """ + Indicates if a signal with the given name exists in the entity + """ + return wrap.entity_has_signal(self.obj, name) + def displaySignals(self) : """ Print the list of signals into standard output: temporary. diff --git a/src/entity-py.cc b/src/entity-py.cc index 3901eb0a74e2d7e621a51a0e631b003ada817865..24837f49d952a87003bf823b2446fb08bf47cc42 100644 --- a/src/entity-py.cc +++ b/src/entity-py.cc @@ -113,7 +113,40 @@ namespace dynamicgraph { } /** - \brief Get a signal by name + \brief Check if the entity has a signal with the given name + */ + PyObject * hasSignal(PyObject* /*self*/, PyObject* args) + { + char *name = NULL; + PyObject* object = NULL; + void* pointer = NULL; + + if (!PyArg_ParseTuple(args, "Os", &object, &name)) + Py_RETURN_FALSE; + + if (!PyCObject_Check(object)) { + PyErr_SetString(PyExc_TypeError, + "function takes a PyCObject as argument"); + Py_RETURN_FALSE; + } + + pointer = PyCObject_AsVoidPtr(object); + Entity* entity = (Entity*)pointer; + + bool hasSignal = false; + try { + hasSignal = entity->hasSignal(std::string(name)); + } CATCH_ALL_EXCEPTIONS(); + + if (hasSignal) + Py_RETURN_TRUE; + else + Py_RETURN_FALSE; + } + + + /** + \brief Get a signal by name */ PyObject* getSignal(PyObject* /*self*/, PyObject* args) {