#include "cafPdmObject.h" using namespace caf; CAF_PDM_ABSTRACT_SOURCE_INIT(PdmObject, "PdmObject"); //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- caf::PdmObject::PdmObject() : PdmObjectHandle(), PdmXmlObjectHandle(this, false), PdmUiObjectHandle(this, false) { CAF_PDM_InitObject("Base PDM Object", "", "", "The Abstract Base Class for the Project Data Model"); } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- 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->matchesClassKeyword(classKeyword)) { children.push_back(pdmObjectChild); } } } }