diff --git a/ApplicationCode/ProjectDataModel/RimIdenticalGridCaseGroup.cpp b/ApplicationCode/ProjectDataModel/RimIdenticalGridCaseGroup.cpp index 002ab57a39..cc892787c9 100644 --- a/ApplicationCode/ProjectDataModel/RimIdenticalGridCaseGroup.cpp +++ b/ApplicationCode/ProjectDataModel/RimIdenticalGridCaseGroup.cpp @@ -22,6 +22,7 @@ #include "RimReservoir.h" #include "RimReservoirView.h" #include "RigEclipseCase.h" +#include "RimStatisticalCalculation.h" CAF_PDM_SOURCE_INIT(RimIdenticalGridCaseGroup, "RimIdenticalGridCaseGroup"); @@ -34,6 +35,12 @@ RimIdenticalGridCaseGroup::RimIdenticalGridCaseGroup() CAF_PDM_InitObject("Identical Grids", "", "", ""); CAF_PDM_InitFieldNoDefault(&reservoirs, "Reservoirs", "", "", "", ""); + CAF_PDM_InitFieldNoDefault(&statisticalReservoirs, "StatisticalReservoirs", "", "", "", ""); + + RimStatisticalCalculation* dummyStat = new RimStatisticalCalculation; + dummyStat->caseName = "Statistics 1"; + + statisticalReservoirs.push_back(dummyStat); } //-------------------------------------------------------------------------------------------------- @@ -81,3 +88,17 @@ RigMainGrid* RimIdenticalGridCaseGroup::mainGrid() return NULL; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimStatisticalCalculation* RimIdenticalGridCaseGroup::createAndAppendStatisticalCalculation() +{ + RimStatisticalCalculation* newObject = new RimStatisticalCalculation; + + newObject->caseName = "Statistics 1"; + + statisticalReservoirs.push_back(newObject); + + return newObject; +} + diff --git a/ApplicationCode/ProjectDataModel/RimIdenticalGridCaseGroup.h b/ApplicationCode/ProjectDataModel/RimIdenticalGridCaseGroup.h index 45ec34cacd..871ac4c1c6 100644 --- a/ApplicationCode/ProjectDataModel/RimIdenticalGridCaseGroup.h +++ b/ApplicationCode/ProjectDataModel/RimIdenticalGridCaseGroup.h @@ -25,6 +25,7 @@ class RimReservoir; class RigMainGrid; +class RimStatisticalCalculation; //================================================================================================== // @@ -42,9 +43,11 @@ public: void addCase(RimReservoir* reservoir); caf::PdmPointersField reservoirs; + caf::PdmPointersField statisticalReservoirs; RigMainGrid* mainGrid(); + RimStatisticalCalculation* createAndAppendStatisticalCalculation(); private: cvf::ref m_mainGrid; diff --git a/ApplicationCode/ProjectDataModel/RimStatisticalCalculation.cpp b/ApplicationCode/ProjectDataModel/RimStatisticalCalculation.cpp index b4000d482a..946768af61 100644 --- a/ApplicationCode/ProjectDataModel/RimStatisticalCalculation.cpp +++ b/ApplicationCode/ProjectDataModel/RimStatisticalCalculation.cpp @@ -20,6 +20,8 @@ #include "RimStatisticalCalculation.h" #include "RimReservoirView.h" +#include "cafPdmUiOrdering.h" +#include "RimIdenticalGridCaseGroup.h" CAF_PDM_SOURCE_INIT(RimStatisticalCalculation, "RimStatisticalCalculation"); @@ -34,6 +36,7 @@ RimStatisticalCalculation::RimStatisticalCalculation() CAF_PDM_InitField(&statisticsMax, "StatisticsMax", true, "Maximum", "", "" ,""); CAF_PDM_InitField(&statisticsMean, "StatisticsMean", true, "Mean", "", "" ,""); CAF_PDM_InitField(&statisticsStdDev, "StatisticsStdDev", true, "Std dev", "", "" ,""); + } //-------------------------------------------------------------------------------------------------- @@ -51,3 +54,100 @@ bool RimStatisticalCalculation::openEclipseGridFile() { return true; } + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimStatisticalCalculation::defineUiOrdering(QString uiConfigName, caf::PdmUiOrdering& uiOrdering) const +{ + // Fields declared in RimCellFilter + uiOrdering.add(&caseName); + + // Fields declared in RimResultDefinition + caf::PdmUiGroup* group1 = uiOrdering.addNewGroup("Statistical parameters"); + group1->add(&statisticsMin); + group1->add(&statisticsMax); + group1->add(&statisticsMean); + group1->add(&statisticsStdDev); + +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimIdenticalGridCaseGroup* RimStatisticalCalculation::parent() +{ + std::vector parentObjects; + this->parentObjects(parentObjects); + + RimIdenticalGridCaseGroup* parentObject = NULL; + for (size_t i = 0; i < parentObjects.size(); i++) + { + if (parentObject) continue; + + caf::PdmObject* obj = parentObjects[i]; + parentObject = dynamic_cast(obj); + } + + CVF_ASSERT(parentObject); + + return parentObject; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimStatisticalCalculation::computeStatistics() +{ + if (statisticsMin) + { + createAndComputeMin(); + } + + if (statisticsMax) + { + createAndComputeMax(); + } + + if (statisticsMean) + { + createAndComputeMean(); + } + + if (statisticsStdDev) + { + createAndComputeStdDev(); + } +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimStatisticalCalculation::createAndComputeMin() +{ + +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimStatisticalCalculation::createAndComputeMax() +{ + +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimStatisticalCalculation::createAndComputeMean() +{ + +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimStatisticalCalculation::createAndComputeStdDev() +{ + +} diff --git a/ApplicationCode/ProjectDataModel/RimStatisticalCalculation.h b/ApplicationCode/ProjectDataModel/RimStatisticalCalculation.h index 46d443b1fb..01e3be7428 100644 --- a/ApplicationCode/ProjectDataModel/RimStatisticalCalculation.h +++ b/ApplicationCode/ProjectDataModel/RimStatisticalCalculation.h @@ -25,6 +25,9 @@ #include "RimReservoir.h" +class RimIdenticalGridCaseGroup; +class RimResultDefinition; + //================================================================================================== // @@ -46,6 +49,15 @@ public: caf::PdmField statisticsMean; caf::PdmField statisticsStdDev; + RimIdenticalGridCaseGroup* parent(); + + virtual void defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) const; + void computeStatistics(); + private: + void createAndComputeMin(); + void createAndComputeMax(); + void createAndComputeMean(); + void createAndComputeStdDev(); }; diff --git a/ApplicationCode/ProjectDataModel/RimUiTreeModelPdm.cpp b/ApplicationCode/ProjectDataModel/RimUiTreeModelPdm.cpp index 34713d1ba4..ea5371925c 100644 --- a/ApplicationCode/ProjectDataModel/RimUiTreeModelPdm.cpp +++ b/ApplicationCode/ProjectDataModel/RimUiTreeModelPdm.cpp @@ -35,6 +35,7 @@ #include "RimInputPropertyCollection.h" #include "cafPdmField.h" #include "RimInputReservoir.h" +#include "RimStatisticalCalculation.h" //-------------------------------------------------------------------------------------------------- /// @@ -442,3 +443,43 @@ void RimUiTreeModelPdm::deleteInputProperty(const QModelIndex& itemIndex) delete inputProperty; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimStatisticalCalculation* RimUiTreeModelPdm::addStatisticalCalculation(const QModelIndex& itemIndex, QModelIndex& insertedModelIndex) +{ + caf::PdmUiTreeItem* currentItem = getTreeItemFromIndex(itemIndex); + + QModelIndex collectionIndex; + RimIdenticalGridCaseGroup* caseGroup = NULL; + caf::PdmUiTreeItem* parentCollectionItem = NULL; + int position = 0; + + if (dynamic_cast(currentItem->dataObject().p())) + { + RimStatisticalCalculation* currentObject = dynamic_cast(currentItem->dataObject().p()); + caseGroup = currentObject->parent(); + parentCollectionItem = currentItem->parent(); + position = itemIndex.row(); + collectionIndex = itemIndex.parent(); + } + else if (dynamic_cast(currentItem->dataObject().p())) + { + caseGroup = dynamic_cast(currentItem->dataObject().p()); + parentCollectionItem = currentItem; + position = parentCollectionItem->childCount(); + collectionIndex = itemIndex; + } + + beginInsertRows(collectionIndex, position, position); + + RimStatisticalCalculation* createdObject = caseGroup->createAndAppendStatisticalCalculation(); + caf::PdmUiTreeItem* childItem = new caf::PdmUiTreeItem(parentCollectionItem, position, createdObject); + + endInsertRows(); + + insertedModelIndex = index(position, 0, collectionIndex); + + return createdObject; +} + diff --git a/ApplicationCode/ProjectDataModel/RimUiTreeModelPdm.h b/ApplicationCode/ProjectDataModel/RimUiTreeModelPdm.h index 1e41d090a3..7e8e51db88 100644 --- a/ApplicationCode/ProjectDataModel/RimUiTreeModelPdm.h +++ b/ApplicationCode/ProjectDataModel/RimUiTreeModelPdm.h @@ -28,6 +28,7 @@ class RimCellPropertyFilter; class RimCellRangeFilter; class RimReservoirView; class RimInputProperty; +class RimStatisticalCalculation; //================================================================================================== /// @@ -54,6 +55,8 @@ public: RimCellRangeFilter* addRangeFilter(const QModelIndex& itemIndex, QModelIndex& insertedModelIndex); RimReservoirView* addReservoirView(const QModelIndex& itemIndex, QModelIndex& insertedModelIndex); void addInputProperty(const QModelIndex& itemIndex, const QStringList& fileNames); + + RimStatisticalCalculation* addStatisticalCalculation(const QModelIndex& itemIndex, QModelIndex& insertedModelIndex); void updateScriptPaths(); diff --git a/ApplicationCode/ProjectDataModel/RimUiTreeView.cpp b/ApplicationCode/ProjectDataModel/RimUiTreeView.cpp index 624104775e..84e41c024f 100644 --- a/ApplicationCode/ProjectDataModel/RimUiTreeView.cpp +++ b/ApplicationCode/ProjectDataModel/RimUiTreeView.cpp @@ -31,6 +31,7 @@ #include "RimInputReservoir.h" #include "RimBinaryExportSettings.h" #include "RigReservoirCellResults.h" +#include "RimStatisticalCalculation.h" //-------------------------------------------------------------------------------------------------- /// @@ -143,6 +144,19 @@ void RimUiTreeView::contextMenuEvent(QContextMenuEvent* event) menu.addAction(QString("Save Property To File"), this, SLOT(slotWriteBinaryResultAsInputProperty())); menu.exec(event->globalPos()); } + else if (dynamic_cast(uiItem->dataObject().p())) + { + QMenu menu; + menu.addAction(QString("New Statistical Case"), this, SLOT(slotNewStatisticalCase())); + menu.exec(event->globalPos()); + } + else if (dynamic_cast(uiItem->dataObject().p())) + { + QMenu menu; + menu.addAction(QString("Compute"), this, SLOT(slotComputeStatisticalCases())); + menu.addAction(QString("Close"), this, SLOT(slotCloseCase())); + menu.exec(event->globalPos()); + } else if (dynamic_cast(uiItem->dataObject().p())) { QMenu menu; @@ -750,3 +764,32 @@ void RimUiTreeView::slotCloseCase() } } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimUiTreeView::slotNewStatisticalCase() +{ + RimUiTreeModelPdm* myModel = dynamic_cast(model()); + if (myModel) + { + QModelIndex insertedIndex; + RimStatisticalCalculation* newObject = myModel->addStatisticalCalculation(currentIndex(), insertedIndex); + setCurrentIndex(insertedIndex); + } +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimUiTreeView::slotComputeStatisticalCases() +{ + QModelIndex index = currentIndex(); + RimUiTreeModelPdm* myModel = dynamic_cast(model()); + caf::PdmUiTreeItem* uiItem = myModel->getTreeItemFromIndex(currentIndex()); + + RimStatisticalCalculation* statisticalObject = dynamic_cast(uiItem->dataObject().p()); + if (!statisticalObject) return; + + statisticalObject->computeStatistics(); +} + diff --git a/ApplicationCode/ProjectDataModel/RimUiTreeView.h b/ApplicationCode/ProjectDataModel/RimUiTreeView.h index 30c4723e76..aa4a9e27ef 100644 --- a/ApplicationCode/ProjectDataModel/RimUiTreeView.h +++ b/ApplicationCode/ProjectDataModel/RimUiTreeView.h @@ -69,6 +69,9 @@ private slots: void slotCloseCase(); + void slotNewStatisticalCase(); + void slotComputeStatisticalCases(); + void slotSelectionChanged(const QItemSelection & selected, const QItemSelection & deselected); signals: