DataElement* ModelServicesImp::createElement(const DataDescriptor* pDescriptor, const string& id) { const DataDescriptorImp* pDescriptorImp = dynamic_cast<const DataDescriptorImp*>(pDescriptor); if (pDescriptorImp == NULL) { return NULL; } if (pDescriptorImp->getParent() == NULL && !pDescriptorImp->getParentDesignator().empty()) { // Set the parent element pointer into the data descriptor if the descriptor was created with the designator DataElement* pParent = getElement(pDescriptorImp->getParentDesignator(), string()); if (pParent == NULL) { // The parent element does not exist, so do not create the element return NULL; } const_cast<DataDescriptorImp*>(pDescriptorImp)->setParent(pParent); } // Check if an element with the same name, type, and parent already exists const string& name = pDescriptorImp->getName(); const string& type = pDescriptorImp->getType(); DataElement* pParent = pDescriptorImp->getParent(); if (getElement(name, type, pParent) != NULL) { return NULL; } // Create the element DataElement* pElement = NULL; if ((type == "AnnotationElement") || (type == "AnnotationElementAdapter")) { pElement = new AnnotationElementAdapter(*pDescriptorImp, id); } else if ((type == "AoiElement") || (type == "AoiElementAdapter")) { pElement = new AoiElementAdapter(*pDescriptorImp, id); } else if ((type == "DataElement") || (type == "DataElementAdapter")) { pElement = new DataElementAdapter(*pDescriptorImp, id); } else if ((type == "DataElementGroup") || (type == "DataElementGroupAdapter")) { pElement = new DataElementGroupAdapter(*pDescriptorImp, id); } else if ((type == "GcpList") || (type == "GcpListAdapter")) { pElement = new GcpListAdapter(*pDescriptorImp, id); } else if ((type == "RasterElement") || (type == "RasterElementAdapter")) { const RasterDataDescriptor* pRasterDescriptor = dynamic_cast<const RasterDataDescriptor*>(pDescriptor); if (pRasterDescriptor != NULL) { RasterElement* pRaster = new RasterElementAdapter(*pDescriptorImp, id); if (pRaster != NULL) { if (pDescriptorImp->getProcessingLocation() == IN_MEMORY) { if (!pRaster->createInMemoryPager()) { delete dynamic_cast<RasterElementImp*>(pRaster); pRaster = NULL; } } } pElement = pRaster; } } else if ((type == "Signature") || (type == "SignatureAdapter")) { pElement = new SignatureAdapter(*pDescriptorImp, id); } else if ((type == "SignatureLibrary") || (type == "SignatureLibraryAdapter")) { pElement = new SignatureLibraryAdapter(*pDescriptorImp, id); } else if ((type == "SignatureSet") || (type == "SignatureSetAdapter")) { pElement = new SignatureSetAdapter(*pDescriptorImp, id); } else if ((type == "TiePointList") || (type == "TiePointListAdapter")) { pElement = new TiePointListAdapter(*pDescriptorImp, id); } else if ((type == "Any") || (type == "AnyAdapter") || (hasElementType(type) == true)) { pElement = new AnyAdapter(type, *pDescriptorImp, id); } if (pElement != NULL) { // Add the element to the session addElement(pElement); // Notify of change notify(SIGNAL_NAME(ModelServices, ElementCreated), boost::any(pElement)); } return pElement; }