#pragma once #include "cafPdmObject.h" #include "cafPdmChildArrayField.h" #include namespace caf { class PdmReferenceHelper; //================================================================================================== /// The PdmObjectGroup serves as a container of unknown PdmObjects //================================================================================================== class PdmObjectGroup : public PdmObject { CAF_PDM_HEADER_INIT; public: PdmObjectGroup(); ~PdmObjectGroup(); std::vector objects; void deleteObjects(); void addObject(PdmObjectHandle * obj); template void objectsByType(std::vector >* typedObjects ) const { if (!typedObjects) return; size_t it; for (it = 0; it != objects.size(); ++it) { T* obj = dynamic_cast(objects[it]); if (obj) typedObjects->push_back(obj); } } template void createCopyByType(std::vector >* copyOfTypedObjects, PdmObjectFactory* objectFactory) const; }; //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- template void PdmObjectGroup::createCopyByType(std::vector >* copyOfTypedObjects, PdmObjectFactory* objectFactory) const { std::vector > sourceTypedObjects; objectsByType(&sourceTypedObjects); QString encodedXml; { // Write original objects to XML file QXmlStreamWriter xmlStream(&encodedXml); xmlStream.setAutoFormatting(true); xmlStream.writeStartElement("", "PdmObjects"); for (size_t i = 0; i < sourceTypedObjects.size(); i++) { PdmXmlObjectHandle* xmlObjHandle = sourceTypedObjects[i]->capability(); assert(xmlObjHandle); QString className = xmlObjHandle->classKeyword(); xmlStream.writeStartElement("", className); xmlObjHandle->writeFields(xmlStream); xmlStream.writeEndElement(); } xmlStream.writeEndElement(); } // Read back XML into object group, factory methods will be called that will create new objects PdmObjectGroup destinationObjectGroup; QXmlStreamReader xmlStream(encodedXml); PdmXmlObjectHandle* xmlObjHandle = destinationObjectGroup.capability(); assert(xmlObjHandle); xmlObjHandle->readFields(xmlStream, objectFactory); for (size_t it = 0; it < destinationObjectGroup.objects.size(); it++) { T* obj = dynamic_cast(destinationObjectGroup.objects[it]); if (obj) copyOfTypedObjects->push_back(obj); } } //================================================================================================== /// The PdmObjectCollection serves as a container of unknown PdmObjects stored in a PdmChildArrayField //================================================================================================== class PdmObjectCollection : public PdmObject { CAF_PDM_HEADER_INIT; public: PdmObjectCollection(); ~PdmObjectCollection(); caf::PdmChildArrayField objects; }; } // End of namespace caf