#2687 #2750 Add import ensamble command. Add import summary cases commands to plot tree nodes

This commit is contained in:
Bjørn Erik Jensen
2018-04-18 13:56:01 +02:00
parent 916fb59bee
commit 3ce2bfd67c
14 changed files with 309 additions and 40 deletions

View File

@@ -66,6 +66,7 @@ ${CMAKE_CURRENT_LIST_DIR}/RicShowGridStatisticsFeature.h
${CMAKE_CURRENT_LIST_DIR}/RicFileHierarchyDialog.h ${CMAKE_CURRENT_LIST_DIR}/RicFileHierarchyDialog.h
${CMAKE_CURRENT_LIST_DIR}/RicSummaryCaseRestartDialog.h ${CMAKE_CURRENT_LIST_DIR}/RicSummaryCaseRestartDialog.h
${CMAKE_CURRENT_LIST_DIR}/RicImportEnsambleFeature.h
) )
@@ -130,6 +131,7 @@ ${CMAKE_CURRENT_LIST_DIR}/RicShowGridStatisticsFeature.cpp
${CMAKE_CURRENT_LIST_DIR}/RicFileHierarchyDialog.cpp ${CMAKE_CURRENT_LIST_DIR}/RicFileHierarchyDialog.cpp
${CMAKE_CURRENT_LIST_DIR}/RicSummaryCaseRestartDialog.cpp ${CMAKE_CURRENT_LIST_DIR}/RicSummaryCaseRestartDialog.cpp
${CMAKE_CURRENT_LIST_DIR}/RicImportEnsambleFeature.cpp
) )

View File

@@ -33,6 +33,24 @@
CAF_CMD_SOURCE_INIT(RicCreateSummaryCaseCollectionFeature, "RicCreateSummaryCaseCollectionFeature"); CAF_CMD_SOURCE_INIT(RicCreateSummaryCaseCollectionFeature, "RicCreateSummaryCaseCollectionFeature");
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RicCreateSummaryCaseCollectionFeature::groupSummaryCases(std::vector<RimSummaryCase*> cases, const QString& groupName)
{
RimSummaryCaseMainCollection* summaryCaseMainCollection = nullptr;
if (!cases.empty())
{
cases[0]->firstAncestorOrThisOfTypeAsserted(summaryCaseMainCollection);
summaryCaseMainCollection->addCaseCollection(cases, groupName);
summaryCaseMainCollection->updateConnectedEditors();
RiuPlotMainWindowTools::showPlotMainWindow();
RiuPlotMainWindowTools::selectAsCurrentItem(summaryCaseMainCollection->summaryCaseCollections().back()->allSummaryCases().front());
}
}
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
@@ -65,14 +83,7 @@ void RicCreateSummaryCaseCollectionFeature::onActionTriggered(bool isChecked)
caf::SelectionManager::instance()->objectsByType(&selection); caf::SelectionManager::instance()->objectsByType(&selection);
if (selection.size() == 0) return; if (selection.size() == 0) return;
RimSummaryCaseMainCollection* summaryCaseMainCollection = nullptr; groupSummaryCases(selection, "");
selection[0]->firstAncestorOrThisOfTypeAsserted(summaryCaseMainCollection);
summaryCaseMainCollection->addCaseCollection(selection);
summaryCaseMainCollection->updateConnectedEditors();
RiuPlotMainWindowTools::showPlotMainWindow();
RiuPlotMainWindowTools::selectAsCurrentItem(summaryCaseMainCollection->summaryCaseCollections().back()->allSummaryCases().front());
} }
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------

View File

@@ -22,6 +22,8 @@
#include <vector> #include <vector>
class RimSummaryCase;
//================================================================================================== //==================================================================================================
/// ///
//================================================================================================== //==================================================================================================
@@ -29,6 +31,8 @@ class RicCreateSummaryCaseCollectionFeature : public caf::CmdFeature
{ {
CAF_CMD_HEADER_INIT; CAF_CMD_HEADER_INIT;
static void groupSummaryCases(std::vector<RimSummaryCase*> cases, const QString& groupName);
private: private:
virtual bool isCommandEnabled() override; virtual bool isCommandEnabled() override;
virtual void onActionTriggered(bool isChecked) override; virtual void onActionTriggered(bool isChecked) override;

View File

@@ -0,0 +1,157 @@
/////////////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2016- Statoil ASA
//
// ResInsight is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY
// WARRANTY; without even the implied warranty of MERCHANTABILITY or
// FITNESS FOR A PARTICULAR PURPOSE.
//
// See the GNU General Public License at <http://www.gnu.org/licenses/gpl.html>
// for more details.
//
/////////////////////////////////////////////////////////////////////////////////
#include "RicImportEnsambleFeature.h"
#include "RiaApplication.h"
#include "RiaPreferences.h"
#include "RicImportSummaryCasesFeature.h"
#include "RicCreateSummaryCaseCollectionFeature.h"
#include "RifSummaryCaseRestartSelector.h"
#include "RimGridSummaryCase.h"
#include "RimMainPlotCollection.h"
#include "RimOilField.h"
#include "RimProject.h"
#include "RimSummaryCase.h"
#include "RimSummaryCaseMainCollection.h"
#include "RimSummaryPlotCollection.h"
#include "RiuMainPlotWindow.h"
#include "RiuMainWindow.h"
#include "SummaryPlotCommands/RicNewSummaryPlotFeature.h"
#include <QAction>
#include <QFileDialog>
#include <QMessageBox>
#include <QInputDialog>
CAF_CMD_SOURCE_INIT(RicImportEnsambleFeature, "RicImportEnsambleFeature");
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
bool RicImportEnsambleFeature::isCommandEnabled()
{
return true;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RicImportEnsambleFeature::onActionTriggered(bool isChecked)
{
RiaApplication* app = RiaApplication::instance();
std::vector<RimSummaryCase*> cases = RicImportSummaryCasesFeature::importSummaryCases("Import Ensamble");
if (cases.empty()) return;
validateEnsambleCases(cases);
QString ensambleName = askForEnsambleName();
if (ensambleName.isEmpty()) return;
RicCreateSummaryCaseCollectionFeature::groupSummaryCases(cases, ensambleName);
std::vector<RimCase*> allCases;
app->project()->allCases(allCases);
if (allCases.size() == 0)
{
RiuMainWindow::instance()->close();
}
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RicImportEnsambleFeature::setupActionLook(QAction* actionToSetup)
{
actionToSetup->setIcon(QIcon(":/SummaryCase48x48.png"));
actionToSetup->setText("Import Ensamble");
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
bool RicImportEnsambleFeature::validateEnsambleCases(std::vector<RimSummaryCase*> cases)
{
// Validate ensamble parameters
try
{
std::hash<std::string> paramsHasher;
size_t paramsHash = 0;
for (RimSummaryCase* rimCase : cases)
{
if (rimCase->caseRealizationParameters().isNull() || rimCase->caseRealizationParameters()->parameters().empty())
{
throw QString("The case %1 has no ensamble parameters").arg(rimCase->summaryHeaderFilename());
}
else
{
QString paramNames;
for (std::pair<QString, double> paramPair : rimCase->caseRealizationParameters()->parameters())
{
paramNames.append(paramPair.first);
}
size_t currHash = paramsHasher(paramNames.toStdString());
if (paramsHash == 0)
{
paramsHash = currHash;
}
else if (paramsHash != currHash)
{
throw QString("Ensamble parameters differ between cases");
}
}
}
return true;
}
catch (QString errorMessage)
{
QMessageBox mbox;
mbox.setIcon(QMessageBox::Icon::Warning);
mbox.setInformativeText(errorMessage);
mbox.exec();
return false;
}
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
QString RicImportEnsambleFeature::askForEnsambleName()
{
RimProject* project = RiaApplication::instance()->project();
int groupCount = (int)project->summaryGroups().size();
QInputDialog dialog;
dialog.setInputMode(QInputDialog::TextInput);
dialog.setWindowTitle("Ensamble Name");
dialog.setLabelText("Ensamble Name");
dialog.setTextValue(QString("Ensamble %1").arg(groupCount));
dialog.resize(300, 50);
dialog.exec();
return dialog.result() == QDialog::Accepted ? dialog.textValue() : QString("");
}

View File

@@ -0,0 +1,48 @@
/////////////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2016- Statoil ASA
//
// ResInsight is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY
// WARRANTY; without even the implied warranty of MERCHANTABILITY or
// FITNESS FOR A PARTICULAR PURPOSE.
//
// See the GNU General Public License at <http://www.gnu.org/licenses/gpl.html>
// for more details.
//
/////////////////////////////////////////////////////////////////////////////////
#pragma once
#include "RiaPreferences.h"
#include "cafCmdFeature.h"
#include <QString>
class RimSummaryCase;
//==================================================================================================
///
//==================================================================================================
class RicImportEnsambleFeature : public caf::CmdFeature
{
CAF_CMD_HEADER_INIT;
protected:
// Overrides
virtual bool isCommandEnabled() override;
virtual void onActionTriggered( bool isChecked ) override;
virtual void setupActionLook( QAction* actionToSetup ) override;
bool validateEnsambleCases(std::vector<RimSummaryCase*> cases);
QString askForEnsambleName();
};

View File

@@ -43,6 +43,13 @@
CAF_CMD_SOURCE_INIT(RicImportSummaryCasesFeature, "RicImportSummaryCasesFeature"); CAF_CMD_SOURCE_INIT(RicImportSummaryCasesFeature, "RicImportSummaryCasesFeature");
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
QString RicImportSummaryCasesFeature::m_pathFilter = "*";
QString RicImportSummaryCasesFeature::m_fileNameFilter = "*";
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
@@ -56,32 +63,15 @@ bool RicImportSummaryCasesFeature::isCommandEnabled()
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
void RicImportSummaryCasesFeature::onActionTriggered(bool isChecked) void RicImportSummaryCasesFeature::onActionTriggered(bool isChecked)
{ {
RiaApplication* app = RiaApplication::instance(); RiaApplication* app = RiaApplication::instance();
QString defaultDir = app->lastUsedDialogDirectory("INPUT_FILES"); std::vector<RimSummaryCase*> cases = importSummaryCases("Import Summary Cases");
for (const auto& rimCase : cases) RiaApplication::instance()->addToRecentFiles(rimCase->summaryHeaderFilename());
RicFileHierarchyDialogResult result = RicFileHierarchyDialog::getOpenFileNames(nullptr, "Import Summary Cases", defaultDir, m_pathFilter, m_fileNameFilter, QStringList(".SMSPEC")); std::vector<RimCase*> allCases;
app->project()->allCases(allCases);
// Remember filters if (allCases.size() == 0)
m_pathFilter = result.pathFilter;
m_fileNameFilter = result.fileNameFilter;
if (!result.ok) return;
// Remember the path to next time
app->setLastUsedDialogDirectory("INPUT_FILES", QFileInfo(result.rootDir).absoluteFilePath());
QStringList fileNames = result.files;
if (fileNames.isEmpty()) return;
if (createAndAddSummaryCasesFromFiles(fileNames))
{
for (const auto& fileName : fileNames) RiaApplication::instance()->addToRecentFiles(fileName);
}
std::vector<RimCase*> cases;
app->project()->allCases(cases);
if (cases.size() == 0)
{ {
RiuMainWindow::instance()->close(); RiuMainWindow::instance()->close();
} }
@@ -99,11 +89,13 @@ void RicImportSummaryCasesFeature::setupActionLook(QAction* actionToSetup)
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
bool RicImportSummaryCasesFeature::createAndAddSummaryCasesFromFiles(const QStringList& fileNames) bool RicImportSummaryCasesFeature::createAndAddSummaryCasesFromFiles(const QStringList& fileNames, std::vector<RimSummaryCase*>* newCases)
{ {
RiaApplication* app = RiaApplication::instance(); RiaApplication* app = RiaApplication::instance();
RimProject* proj = app->project(); RimProject* proj = app->project();
RimSummaryCaseMainCollection* sumCaseColl = proj->activeOilField() ? proj->activeOilField()->summaryCaseMainCollection() : nullptr; RimSummaryCaseMainCollection* sumCaseColl = proj->activeOilField() ? proj->activeOilField()->summaryCaseMainCollection() : nullptr;
if (newCases) newCases->clear();
if (!sumCaseColl) return false; if (!sumCaseColl) return false;
RifSummaryCaseRestartSelector fileSelector; RifSummaryCaseRestartSelector fileSelector;
@@ -119,5 +111,34 @@ bool RicImportSummaryCasesFeature::createAndAddSummaryCasesFromFiles(const QStri
mainPlotWindow->updateSummaryPlotToolBar(); mainPlotWindow->updateSummaryPlotToolBar();
} }
if (newCases) newCases->insert(newCases->end(), sumCases.begin(), sumCases.end());
return true; return true;
} }
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
std::vector<RimSummaryCase*> RicImportSummaryCasesFeature::importSummaryCases(const QString& dialogTitle)
{
RiaApplication* app = RiaApplication::instance();
QString defaultDir = app->lastUsedDialogDirectory("INPUT_FILES");
RicFileHierarchyDialogResult result = RicFileHierarchyDialog::getOpenFileNames(nullptr, dialogTitle, defaultDir, m_pathFilter, m_fileNameFilter, QStringList(".SMSPEC"));
// Remember filters
m_pathFilter = result.pathFilter;
m_fileNameFilter = result.fileNameFilter;
if (!result.ok) return std::vector<RimSummaryCase*>();
// Remember the path to next time
app->setLastUsedDialogDirectory("INPUT_FILES", QFileInfo(result.rootDir).absoluteFilePath());
QStringList fileNames = result.files;
if (fileNames.isEmpty()) return std::vector<RimSummaryCase*>();
std::vector<RimSummaryCase*> newCases;
createAndAddSummaryCasesFromFiles(fileNames, &newCases);
return newCases;
}

View File

@@ -23,9 +23,10 @@
#include "cafCmdFeature.h" #include "cafCmdFeature.h"
#include <QString> #include <QString>
#include <vector>
class RicSummaryCaseRestartDialogResult; class RicSummaryCaseRestartDialogResult;
class RimSummaryCase;
//================================================================================================== //==================================================================================================
/// ///
@@ -35,9 +36,11 @@ class RicImportSummaryCasesFeature : public caf::CmdFeature
CAF_CMD_HEADER_INIT; CAF_CMD_HEADER_INIT;
public: public:
RicImportSummaryCasesFeature() : m_pathFilter("*"), m_fileNameFilter("*") { } RicImportSummaryCasesFeature() { }
static bool createAndAddSummaryCasesFromFiles(const QStringList& fileName); static bool createAndAddSummaryCasesFromFiles(const QStringList& fileName, std::vector<RimSummaryCase*>* newCases = nullptr);
static std::vector<RimSummaryCase*> importSummaryCases(const QString& dialogTitle);
protected: protected:
// Overrides // Overrides
@@ -46,8 +49,8 @@ protected:
virtual void setupActionLook( QAction* actionToSetup ) override; virtual void setupActionLook( QAction* actionToSetup ) override;
private: private:
QString m_pathFilter; static QString m_pathFilter;
QString m_fileNameFilter; static QString m_fileNameFilter;
}; };

View File

@@ -58,6 +58,8 @@
#include "RimSimWellInView.h" #include "RimSimWellInView.h"
#include "RimSimWellInViewCollection.h" #include "RimSimWellInViewCollection.h"
#include "RimSummaryCase.h" #include "RimSummaryCase.h"
#include "RimSummaryCaseCollection.h"
#include "RimSummaryCaseMainCollection.h"
#include "RimSummaryCrossPlot.h" #include "RimSummaryCrossPlot.h"
#include "RimSummaryCrossPlotCollection.h" #include "RimSummaryCrossPlotCollection.h"
#include "RimSummaryCurve.h" #include "RimSummaryCurve.h"
@@ -451,8 +453,24 @@ caf::CmdFeatureMenuBuilder RimContextCommandBuilder::commandsFromSelection()
{ {
menuBuilder << "RicNewSummaryEnsambleCurveSetFeature"; menuBuilder << "RicNewSummaryEnsambleCurveSetFeature";
} }
else if (dynamic_cast<RimSummaryCaseMainCollection*>(uiItem))
{
menuBuilder << "RicImportSummaryCaseFeature";
menuBuilder << "RicImportSummaryCasesFeature";
menuBuilder << "RicImportEnsambleFeature";
}
else if (dynamic_cast<RimSummaryCaseCollection*>(uiItem))
{
menuBuilder << "RicImportSummaryCaseFeature";
menuBuilder << "RicImportSummaryCasesFeature";
menuBuilder << "RicImportEnsambleFeature";
}
else if (dynamic_cast<RimSummaryCase*>(uiItem)) else if (dynamic_cast<RimSummaryCase*>(uiItem))
{ {
menuBuilder << "RicImportSummaryCaseFeature";
menuBuilder << "RicImportSummaryCasesFeature";
menuBuilder << "RicImportEnsambleFeature";
if (!dynamic_cast<RimObservedData*>(uiItem)) if (!dynamic_cast<RimObservedData*>(uiItem))
{ {
menuBuilder << "RicShowSummaryCurveCalculatorFeature"; menuBuilder << "RicShowSummaryCurveCalculatorFeature";

View File

@@ -466,6 +466,7 @@ void RimEnsambleCurveSet::fieldChangedByUi(const caf::PdmFieldHandle* changedFie
plot->updateAxes(); plot->updateAxes();
} }
} }
updateCurveColors();
} }
else if (changedField == &m_ensambleParameter || else if (changedField == &m_ensambleParameter ||
changedField == &m_color || changedField == &m_color ||

View File

@@ -36,6 +36,7 @@ public:
void addCase(RimSummaryCase* summaryCase); void addCase(RimSummaryCase* summaryCase);
std::vector<RimSummaryCase*> allSummaryCases(); std::vector<RimSummaryCase*> allSummaryCases();
void setName(const QString& name) { m_name = name; }
QString name() const { return m_name; } QString name() const { return m_name; }
private: private:

View File

@@ -193,9 +193,10 @@ void RimSummaryCaseMainCollection::removeCase(RimSummaryCase* summaryCase)
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
void RimSummaryCaseMainCollection::addCaseCollection(std::vector<RimSummaryCase*> summaryCases) void RimSummaryCaseMainCollection::addCaseCollection(std::vector<RimSummaryCase*> summaryCases, const QString& collectionName)
{ {
RimSummaryCaseCollection* summaryCaseCollection = new RimSummaryCaseCollection(); RimSummaryCaseCollection* summaryCaseCollection = new RimSummaryCaseCollection();
if(!collectionName.isEmpty()) summaryCaseCollection->setName(collectionName);
for (RimSummaryCase* summaryCase : summaryCases) for (RimSummaryCase* summaryCase : summaryCases)
{ {

View File

@@ -53,7 +53,7 @@ public:
void addCase(RimSummaryCase* summaryCase); void addCase(RimSummaryCase* summaryCase);
void removeCase(RimSummaryCase* summaryCase); void removeCase(RimSummaryCase* summaryCase);
void addCaseCollection(std::vector<RimSummaryCase*> summaryCases); void addCaseCollection(std::vector<RimSummaryCase*> summaryCases, const QString& coolectionName);
void removeCaseCollection(RimSummaryCaseCollection* caseCollection); void removeCaseCollection(RimSummaryCaseCollection* caseCollection);
void loadAllSummaryCaseData(); void loadAllSummaryCaseData();

View File

@@ -189,6 +189,7 @@ void RiuMainPlotWindow::createMenus()
importMenu->addAction(cmdFeatureMgr->action("RicImportInputEclipseCaseFeature")); importMenu->addAction(cmdFeatureMgr->action("RicImportInputEclipseCaseFeature"));
importMenu->addAction(cmdFeatureMgr->action("RicImportSummaryCaseFeature")); importMenu->addAction(cmdFeatureMgr->action("RicImportSummaryCaseFeature"));
importMenu->addAction(cmdFeatureMgr->action("RicImportSummaryCasesFeature")); importMenu->addAction(cmdFeatureMgr->action("RicImportSummaryCasesFeature"));
importMenu->addAction(cmdFeatureMgr->action("RicImportEnsambleFeature"));
importMenu->addAction(cmdFeatureMgr->action("RicImportObservedDataInMenuFeature")); importMenu->addAction(cmdFeatureMgr->action("RicImportObservedDataInMenuFeature"));
importMenu->addAction(cmdFeatureMgr->action("RicCreateGridCaseGroupFeature")); importMenu->addAction(cmdFeatureMgr->action("RicCreateGridCaseGroupFeature"));
importMenu->addAction(cmdFeatureMgr->action("RicCreateGridCaseGroupFromFilesFeature")); importMenu->addAction(cmdFeatureMgr->action("RicCreateGridCaseGroupFromFilesFeature"));

View File

@@ -381,6 +381,7 @@ void RiuMainWindow::createMenus()
#endif #endif
importMenu->addAction(cmdFeatureMgr->action("RicImportSummaryCaseFeature")); importMenu->addAction(cmdFeatureMgr->action("RicImportSummaryCaseFeature"));
importMenu->addAction(cmdFeatureMgr->action("RicImportSummaryCasesFeature")); importMenu->addAction(cmdFeatureMgr->action("RicImportSummaryCasesFeature"));
importMenu->addAction(cmdFeatureMgr->action("RicImportEnsambleFeature"));
importMenu->addAction(cmdFeatureMgr->action("RicImportObservedDataInMenuFeature")); importMenu->addAction(cmdFeatureMgr->action("RicImportObservedDataInMenuFeature"));
importMenu->addSeparator(); importMenu->addSeparator();