diff --git a/Sofa/framework/Core/src/sofa/core/objectmodel/Base.h b/Sofa/framework/Core/src/sofa/core/objectmodel/Base.h index c554389c032..597c97148ac 100644 --- a/Sofa/framework/Core/src/sofa/core/objectmodel/Base.h +++ b/Sofa/framework/Core/src/sofa/core/objectmodel/Base.h @@ -97,6 +97,7 @@ class SOFA_CORE_API Base : public IntrusiveObject void addOutputsToCallback(const std::string& name, std::initializer_list outputs); + /// Returns the path to the Base. it is possible to use different character as separator. virtual std::string getPathName() const { return ""; } /// Accessor to the object name diff --git a/Sofa/framework/Core/src/sofa/core/objectmodel/BaseData.cpp b/Sofa/framework/Core/src/sofa/core/objectmodel/BaseData.cpp index d449b0b7a7e..d556cb41417 100644 --- a/Sofa/framework/Core/src/sofa/core/objectmodel/BaseData.cpp +++ b/Sofa/framework/Core/src/sofa/core/objectmodel/BaseData.cpp @@ -140,10 +140,17 @@ bool BaseData::setParent(BaseData* parent, const std::string& path) return true; } +std::string BaseData::getPathName() const +{ + if(m_owner) + return m_owner->getPathName()+"."+getName(); + return getName(); +} + std::string BaseData::getLinkPath() const { if(m_owner) - return "@"+m_owner->getPathName()+"."+getName(); + return "@"+getPathName(); return ""; } diff --git a/Sofa/framework/Core/src/sofa/core/objectmodel/BaseData.h b/Sofa/framework/Core/src/sofa/core/objectmodel/BaseData.h index 3c45a0d52dd..eafe21c81ca 100644 --- a/Sofa/framework/Core/src/sofa/core/objectmodel/BaseData.h +++ b/Sofa/framework/Core/src/sofa/core/objectmodel/BaseData.h @@ -194,6 +194,7 @@ class SOFA_CORE_API BaseData : public DDGNode /// If we use the Data as a link and not as value directly virtual std::string getLinkPath() const; + std::string getPathName()const; /// Return whether this %Data can be used as a linkPath. /// diff --git a/Sofa/framework/Core/src/sofa/core/objectmodel/BaseObject.cpp b/Sofa/framework/Core/src/sofa/core/objectmodel/BaseObject.cpp index 390116d17ef..6e7394fdbb9 100644 --- a/Sofa/framework/Core/src/sofa/core/objectmodel/BaseObject.cpp +++ b/Sofa/framework/Core/src/sofa/core/objectmodel/BaseObject.cpp @@ -342,22 +342,19 @@ SReal BaseObject::getTime() const return getContext()->getTime(); } -std::string BaseObject::getPathName() const { - - const BaseContext* context = this->getContext(); - std::string result = ""; - if( context ) - { - const BaseNode* node = context->toBaseNode(); - if( node ) { - result += node->getPathName(); - if (node->getPathName() != "/") - result += "/"; - } - - } - result += getName(); - return result; +std::string BaseObject::getPathName() const +{ + auto node = dynamic_cast(getContext()); + if(!node) + return getName(); + + auto pathname = node->getPathName(); + std::stringstream tmp; + tmp << pathname; + if (pathname != "/") + tmp << "/"; + tmp << getName(); + return tmp.str(); } } // namespace sofa::core::objectmodel