#include "cafPdmObject.h" using namespace caf; //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- void PdmObject::firstAncestorOrThisFromClassKeyword( const QString& classKeyword, PdmObject*& ancestor) const { ancestor = nullptr; // Check if this matches the type if (this->inheritsClassWithKeyword(classKeyword)) { ancestor = const_cast(this); return; } // Search parents for first type match PdmObject* parent = nullptr; PdmFieldHandle* parentField = this->parentField(); if (parentField) parent = dynamic_cast(parentField->ownerObject()); while (parent != nullptr) { if (parent->inheritsClassWithKeyword(classKeyword)) { ancestor = parent; return; } // Get next level parent PdmFieldHandle* nextParentField = parent->parentField(); if (nextParentField) { parent = dynamic_cast(nextParentField->ownerObject()); } else { parent = nullptr; } } } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- void PdmObject::descendantsIncludingThisFromClassKeyword( const QString& classKeyword, std::vector& descendants) const { if (this->inheritsClassWithKeyword(classKeyword)) { descendants.push_back(const_cast(this)); } std::vector fields; this->fields(fields); for (auto f : fields) { std::vector childObjects; f->childObjects(&childObjects); for (auto childObject : childObjects) { PdmObject* pdmObjectChild = dynamic_cast(childObject); if (pdmObjectChild) { pdmObjectChild->descendantsIncludingThisFromClassKeyword(classKeyword, descendants); } } } } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- void PdmObject::childrenFromClassKeyword( const QString& classKeyword, std::vector& children) const { std::vector fields; this->fields(fields); for (auto f : fields) { std::vector childObjects; f->childObjects(&childObjects); for (auto childObject : childObjects) { PdmObject* pdmObjectChild = dynamic_cast(childObject); if (pdmObjectChild && pdmObjectChild->classKeyword() == classKeyword) { children.push_back(pdmObjectChild); } } } }