From eecd069b0af95eaf74050aa2637bd7f2ef039c5e Mon Sep 17 00:00:00 2001 From: Magne Sjaastad Date: Wed, 8 May 2013 10:41:56 +0200 Subject: [PATCH] Introduced caseId to RimCase. Project keeps track of largest used ID, and is responsible for assigning ID to cases. p4#: 21576 --- .../Application/RiaApplication.cpp | 2 + ApplicationCode/ProjectDataModel/RimCase.cpp | 4 + ApplicationCode/ProjectDataModel/RimCase.h | 1 + .../ProjectDataModel/RimProject.cpp | 81 +++++++++++++++++-- ApplicationCode/ProjectDataModel/RimProject.h | 34 ++++---- .../ProjectDataModel/RimResultCase.cpp | 7 +- .../ProjectDataModel/RimStatisticsCase.cpp | 2 + .../ProjectDataModel/RimUiTreeModelPdm.cpp | 8 +- 8 files changed, 112 insertions(+), 27 deletions(-) diff --git a/ApplicationCode/Application/RiaApplication.cpp b/ApplicationCode/Application/RiaApplication.cpp index 5e0b31ee67..bfec67d2f6 100644 --- a/ApplicationCode/Application/RiaApplication.cpp +++ b/ApplicationCode/Application/RiaApplication.cpp @@ -563,6 +563,8 @@ bool RiaApplication::openEclipseCase(const QString& caseName, const QString& cas bool RiaApplication::openInputEclipseCase(const QString& caseName, const QStringList& caseFileNames) { RimInputCase* rimInputReservoir = new RimInputCase(); + m_project->assignCaseIdToCase(rimInputReservoir); + rimInputReservoir->caseUserDescription = caseName; rimInputReservoir->openDataFileSet(caseFileNames); diff --git a/ApplicationCode/ProjectDataModel/RimCase.cpp b/ApplicationCode/ProjectDataModel/RimCase.cpp index 631a235759..c7ed53a9b8 100644 --- a/ApplicationCode/ProjectDataModel/RimCase.cpp +++ b/ApplicationCode/ProjectDataModel/RimCase.cpp @@ -65,6 +65,10 @@ CAF_PDM_SOURCE_INIT(RimCase, "RimReservoir"); RimCase::RimCase() { CAF_PDM_InitField(&caseUserDescription, "CaseUserDescription", QString(), "Case name", "", "" ,""); + + CAF_PDM_InitField(&caseId, "CaseId", -1, "Case ID", "", "" ,""); + caseId.setUiReadOnly(true); + CAF_PDM_InitFieldNoDefault(&reservoirViews, "ReservoirViews", "", "", "", ""); CAF_PDM_InitFieldNoDefault(&m_matrixModelResults, "MatrixModelResults", "", "", "", ""); diff --git a/ApplicationCode/ProjectDataModel/RimCase.h b/ApplicationCode/ProjectDataModel/RimCase.h index eee217dca7..cd24d0e209 100644 --- a/ApplicationCode/ProjectDataModel/RimCase.h +++ b/ApplicationCode/ProjectDataModel/RimCase.h @@ -48,6 +48,7 @@ public: // Fields: caf::PdmField caseUserDescription; + caf::PdmField caseId; caf::PdmField releaseResultMemory; caf::PdmPointersField reservoirViews; caf::PdmField flipXAxis; diff --git a/ApplicationCode/ProjectDataModel/RimProject.cpp b/ApplicationCode/ProjectDataModel/RimProject.cpp index 993f38cb7d..b7c2fdcfb2 100644 --- a/ApplicationCode/ProjectDataModel/RimProject.cpp +++ b/ApplicationCode/ProjectDataModel/RimProject.cpp @@ -44,6 +44,7 @@ #include "RimWellCollection.h" #include "RimCaseCollection.h" #include "RimResultSlot.h" +#include "RimStatisticsCase.h" CAF_PDM_SOURCE_INIT(RimProject, "ResInsightProject"); //-------------------------------------------------------------------------------------------------- @@ -54,6 +55,9 @@ RimProject::RimProject(void) CAF_PDM_InitFieldNoDefault(&m_projectFileVersionString, "ProjectFileVersionString", "", "", "", ""); m_projectFileVersionString.setUiHidden(true); + CAF_PDM_InitField(&nextValidCaseId, "NextValidCaseId", 0, "Next Valid Case ID", "", "" ,""); + nextValidCaseId.setUiHidden(true); + CAF_PDM_InitFieldNoDefault(&reservoirs, "Reservoirs", "", "", "", ""); CAF_PDM_InitFieldNoDefault(&caseGroups, "CaseGroups", "", "", "", ""); @@ -96,6 +100,8 @@ void RimProject::close() caseGroups.deleteAllChildObjects(); fileName = ""; + + nextValidCaseId = 0; } //-------------------------------------------------------------------------------------------------- @@ -110,6 +116,35 @@ void RimProject::initAfterRead() QString scriptDirectories = app->scriptDirectories(); this->setScriptDirectories(scriptDirectories); + + // Find largest used caseId read from file + int largestCaseId = -1; + + std::vector cases; + allCases(cases); + + for (size_t i = 0; i < cases.size(); i++) + { + if (cases[i]->caseId > largestCaseId) + { + largestCaseId = cases[i]->caseId; + } + } + + if (largestCaseId > nextValidCaseId) + { + nextValidCaseId = largestCaseId + 1; + } + + // Assign case Id to cases with an invalid case Id + for (size_t i = 0; i < cases.size(); i++) + { + if (cases[i]->caseId < 0) + { + assignCaseIdToCase(cases[i]); + } + } + } @@ -167,7 +202,9 @@ RimIdenticalGridCaseGroup* RimProject::createIdenticalCaseGroupFromMainCase(RimC CVF_ASSERT(equalGrid); RimIdenticalGridCaseGroup* group = new RimIdenticalGridCaseGroup; - group->createAndAppendStatisticsCase(); + RimCase* createdCase = group->createAndAppendStatisticsCase(); + assignCaseIdToCase(createdCase); + group->addCase(mainCase); caseGroups().push_back(group); @@ -288,29 +325,57 @@ void RimProject::setProjectFileNameAndUpdateDependencies(const QString& fileName // Replace with the new actual filename this->fileName = fileName; - // Loop over all reservoirs and update file path - QFileInfo fileInfo(fileName); QString newProjectPath = fileInfo.path(); QFileInfo fileInfoOld(oldProjectFileName); QString oldProjectPath = fileInfoOld.path(); + // Loop over all reservoirs and update file path + std::vector cases; + allCases(cases); + for (size_t i = 0; i < cases.size(); i++) + { + cases[i]->updateFilePathsFromProjectPath(newProjectPath, oldProjectPath); + } +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimProject::assignCaseIdToCase(RimCase* reservoirCase) +{ + if (reservoirCase) + { + reservoirCase->caseId = nextValidCaseId; + + nextValidCaseId = nextValidCaseId + 1; + } +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimProject::allCases(std::vector& cases) +{ for (size_t i = 0; i < reservoirs.size(); i++) { - reservoirs[i]->updateFilePathsFromProjectPath(newProjectPath, oldProjectPath); + cases.push_back(reservoirs[i]); } - // Case groups : Loop over all reservoirs in and update file path - for (size_t i = 0; i < caseGroups.size(); i++) { RimIdenticalGridCaseGroup* cg = caseGroups()[i]; - for (size_t j = 0; j < cg->caseCollection()->reservoirs().size(); j++) + for (size_t i = 0; i < cg->statisticsCaseCollection()->reservoirs.size(); i++) { - cg->caseCollection()->reservoirs()[j]->updateFilePathsFromProjectPath(newProjectPath, oldProjectPath); + cases.push_back(cg->statisticsCaseCollection()->reservoirs[i]); + } + + for (size_t i = 0; i < cg->caseCollection()->reservoirs.size(); i++) + { + cases.push_back(cg->caseCollection()->reservoirs[i]); } } } diff --git a/ApplicationCode/ProjectDataModel/RimProject.h b/ApplicationCode/ProjectDataModel/RimProject.h index a206359562..93e034e178 100644 --- a/ApplicationCode/ProjectDataModel/RimProject.h +++ b/ApplicationCode/ProjectDataModel/RimProject.h @@ -38,36 +38,38 @@ class RimProject : public caf::PdmDocument CAF_PDM_HEADER_INIT; public: + RimProject(void); + virtual ~RimProject(void); + caf::PdmPointersField reservoirs; caf::PdmPointersField caseGroups; caf::PdmField scriptCollection; caf::PdmField treeViewState; caf::PdmField currentModelIndexPath; + caf::PdmField nextValidCaseId; // Unique case ID within a project, used to identify a case from Octave scripts - void setScriptDirectories(const QString& scriptDirectories); + void setScriptDirectories(const QString& scriptDirectories); + QString projectFileVersionString() const; + void close(); - QString projectFileVersionString() const; + RimIdenticalGridCaseGroup* + createIdenticalCaseGroupFromMainCase(RimCase* mainCase); + void insertCaseInCaseGroup(RimIdenticalGridCaseGroup* caseGroup, RimCase* rimReservoir); + void moveEclipseCaseIntoCaseGroup(RimCase* rimReservoir); + void removeCaseFromAllGroups(RimCase* rimReservoir); - RimProject(void); - virtual ~RimProject(void); + void setProjectFileNameAndUpdateDependencies(const QString& fileName); - void close(); - - RimIdenticalGridCaseGroup* createIdenticalCaseGroupFromMainCase(RimCase* mainCase); - void insertCaseInCaseGroup(RimIdenticalGridCaseGroup* caseGroup, RimCase* rimReservoir); - - void moveEclipseCaseIntoCaseGroup(RimCase* rimReservoir); - void removeCaseFromAllGroups(RimCase* rimReservoir); - - void setProjectFileNameAndUpdateDependencies(const QString& fileName); + void assignCaseIdToCase(RimCase* reservoirCase); private: - RigMainGrid* registerCaseInGridCollection(RigCaseData* rigEclipseCase); + RigMainGrid* registerCaseInGridCollection(RigCaseData* rigEclipseCase); + void allCases(std::vector& cases); protected: // Overridden methods - virtual void initAfterRead(); - virtual void setupBeforeSave(); + virtual void initAfterRead(); + virtual void setupBeforeSave(); private: caf::PdmField m_projectFileVersionString; diff --git a/ApplicationCode/ProjectDataModel/RimResultCase.cpp b/ApplicationCode/ProjectDataModel/RimResultCase.cpp index 5e1190a0eb..59bce328eb 100644 --- a/ApplicationCode/ProjectDataModel/RimResultCase.cpp +++ b/ApplicationCode/ProjectDataModel/RimResultCase.cpp @@ -303,8 +303,11 @@ void RimResultCase::updateFilePathsFromProjectPath(const QString& newProjectPath //-------------------------------------------------------------------------------------------------- void RimResultCase::setCaseInfo(const QString& userDescription, const QString& caseFileName) { - this->caseUserDescription = userDescription; - this->caseFileName = caseFileName; + this->caseUserDescription = userDescription; + this->caseFileName = caseFileName; + + RimProject* proj = RiaApplication::instance()->project(); + proj->assignCaseIdToCase(this); } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationCode/ProjectDataModel/RimStatisticsCase.cpp b/ApplicationCode/ProjectDataModel/RimStatisticsCase.cpp index 498f009680..a864f220a8 100644 --- a/ApplicationCode/ProjectDataModel/RimStatisticsCase.cpp +++ b/ApplicationCode/ProjectDataModel/RimStatisticsCase.cpp @@ -331,6 +331,8 @@ void RimStatisticsCase::defineUiOrdering(QString uiConfigName, caf::PdmUiOrderin updatePercentileUiVisibility(); uiOrdering.add(&caseUserDescription); + + uiOrdering.add(&caseId); uiOrdering.add(&m_calculateEditCommand); uiOrdering.add(&m_selectionSummary); diff --git a/ApplicationCode/ProjectDataModel/RimUiTreeModelPdm.cpp b/ApplicationCode/ProjectDataModel/RimUiTreeModelPdm.cpp index 6427fc2f29..a9dca3d859 100644 --- a/ApplicationCode/ProjectDataModel/RimUiTreeModelPdm.cpp +++ b/ApplicationCode/ProjectDataModel/RimUiTreeModelPdm.cpp @@ -558,7 +558,10 @@ RimStatisticsCase* RimUiTreeModelPdm::addStatisticalCalculation(const QModelInde { beginInsertRows(collectionIndex, position, position); + RimProject* proj = RiaApplication::instance()->project(); RimStatisticsCase* createdObject = caseGroup->createAndAppendStatisticsCase(); + proj->assignCaseIdToCase(createdObject); + caf::PdmUiTreeItem* childItem = new caf::PdmUiTreeItem(parentCollectionItem, position, createdObject); endInsertRows(); @@ -596,7 +599,8 @@ RimIdenticalGridCaseGroup* RimUiTreeModelPdm::addCaseGroup(QModelIndex& inserted beginInsertRows(rootIndex, position, position); RimIdenticalGridCaseGroup* createdObject = new RimIdenticalGridCaseGroup; - createdObject->createAndAppendStatisticsCase(); + RimCase* createdReservoir = createdObject->createAndAppendStatisticsCase(); + proj->assignCaseIdToCase(createdReservoir); createdObject->name = QString("Grid Case Group %1").arg(position + 1); proj->caseGroups().push_back(createdObject); @@ -644,6 +648,8 @@ void RimUiTreeModelPdm::addObjects(const QModelIndex& itemIndex, caf::PdmObjectG { RimResultCase* rimResultReservoir = typedObjects[i]; + proj->assignCaseIdToCase(rimResultReservoir); + if (gridCaseGroup->contains(rimResultReservoir)) { continue;