Skip to content

Commit e3d83e9

Browse files
committed
ADD: getPathName() method in Base, and return Sofa.Core.Link instead of the target with getattr
1 parent 26fa760 commit e3d83e9

File tree

4 files changed

+19
-3
lines changed

4 files changed

+19
-3
lines changed

Plugin/src/SofaPython3/DataHelper.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -618,7 +618,7 @@ BaseLink* addLink(py::object py_self, const std::string& name, py::object value,
618618
if (!link->read(linkpath))
619619
throw py::value_error("addLink: Cannot read link path " + linkpath + ": is link valid?");
620620
}
621-
else
621+
else if (py::isinstance<Base*>(value))
622622
link->setLinkedBase(py::cast<Base*>(value));
623623

624624
// self->addLink(link);

bindings/Sofa/src/SofaPython3/Sofa/Core/Binding_Base.cpp

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ py::object BindingBase::GetAttr(Base* self, const std::string& s, bool doThrowEx
9494
/// Search if there is a link with the given name.
9595
/// If this is the case returns the corresponding python type.
9696
if(BaseLink* l = self->findLink(s))
97-
return py::cast(l->getLinkedBase());
97+
return py::cast(l);
9898

9999
/// Search if we are quering for a 'magic' and private __data__ property
100100
/// this one allows to traverse all the data in the object
@@ -400,6 +400,12 @@ py::object BindingBase::getData(Base& self, const std::string& s)
400400
return py::none();
401401
}
402402

403+
404+
std::string BindingBase::getPathName(Base& self)
405+
{
406+
return self.toBaseNode() ? self.toBaseNode()->getPathName() : self.toBaseObject()->getPathName();
407+
}
408+
403409
void moduleAddBase(py::module &m)
404410
{
405411
py::class_<Base, Base::SPtr> base(m, "Base", py::dynamic_attr(), doc::base::BaseClass);
@@ -425,7 +431,7 @@ void moduleAddBase(py::module &m)
425431
base.def("getLinks", &BindingBase::getLinks, pybind11::return_value_policy::reference, sofapython3::doc::base::getLinks);
426432
base.def("addData", &BindingBase::addData, "name"_a, "value"_a = py::none(), "default"_a = py::none(), "help"_a = "", "group"_a = "", "type"_a = "", sofapython3::doc::base::addData);
427433
base.def("addData", &BindingBase::addDataFromData, sofapython3::doc::base::addDataInitialized);
428-
base.def("addLink", &BindingBase::addLink, "name"_a, "value"_a, "help"_a = "", sofapython3::doc::base::addLink);
434+
base.def("addLink", &BindingBase::addLink, "name"_a, "value"_a = py::none(), "help"_a = "", sofapython3::doc::base::addLink);
429435
base.def("__getattr__", &BindingBase::__getattr__);
430436
base.def("__setattr__", &BindingBase::__setattr__);
431437
base.def("getData", &BindingBase::getData, sofapython3::doc::base::getData);
@@ -434,6 +440,7 @@ void moduleAddBase(py::module &m)
434440
base.def("getLoggedMessagesAsString", &BindingBase::getLoggedMessagesAsString, sofapython3::doc::base::getLoggedMessagesAsString);
435441
base.def("countLoggedMessages", &BindingBase::countLoggedMessages, sofapython3::doc::base::countLoggedMessages);
436442
base.def("clearLoggedMessages", &BindingBase::clearLoggedMessages, sofapython3::doc::base::clearLoggedMessages);
443+
base.def("getPathName", &BindingBase::getPathName);
437444
}
438445

439446
} /// namespace sofapython3

bindings/Sofa/src/SofaPython3/Sofa/Core/Binding_Base.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@ class BindingBase
8080
static py::object getLoggedMessagesAsString(Base& self);
8181
static py::object countLoggedMessages(Base& self);
8282
static py::object clearLoggedMessages(Base& self);
83+
static std::string getPathName(Base& self);
8384
};
8485

8586

bindings/Sofa/src/SofaPython3/Sofa/Core/Binding_BaseLink.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,13 @@ py::object getOwnerBase(BaseLink& self)
6565
return PythonFactory::toPython(self.getOwnerBase());
6666
}
6767

68+
std::string getPathName(BaseLink& self)
69+
{
70+
auto n = self.getOwnerBase()->toBaseNode();
71+
auto o = self.getOwnerBase()->toBaseObject();
72+
return (n ? n->getPathName() : o->getPathName()) + "." + self.getName();
73+
}
74+
6875
void moduleAddBaseLink(py::module& m)
6976
{
7077
py::class_<BaseLink, std::unique_ptr<sofa::core::objectmodel::BaseLink, pybind11::nodelete>> link(m, "Link", sofapython3::doc::baseLink::baseLinkClass);
@@ -91,6 +98,7 @@ void moduleAddBaseLink(py::module& m)
9198

9299

93100
link.def("getLinkedPath", &BaseLink::getLinkedPath, "index"_a = 0, sofapython3::doc::baseLink::getLinkedPath);
101+
link.def("getPathName", getPathName, sofapython3::doc::baseLink::getLinkedPath);
94102
link.def("read", &BaseLink::read, sofapython3::doc::baseLink::read);
95103

96104
}

0 commit comments

Comments
 (0)