Skip to content

Commit

Permalink
#2687 #2750 Add import ensamble command. Add import summary cases com…
Browse files Browse the repository at this point in the history
…mands to plot tree nodes
  • Loading branch information
Bjørn Erik Jensen committed Apr 18, 2018
1 parent 916fb59 commit 3ce2bfd
Show file tree
Hide file tree
Showing 14 changed files with 309 additions and 40 deletions.
2 changes: 2 additions & 0 deletions ApplicationCode/Commands/CMakeLists_files.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,7 @@ ${CMAKE_CURRENT_LIST_DIR}/RicShowGridStatisticsFeature.h

${CMAKE_CURRENT_LIST_DIR}/RicFileHierarchyDialog.h
${CMAKE_CURRENT_LIST_DIR}/RicSummaryCaseRestartDialog.h
${CMAKE_CURRENT_LIST_DIR}/RicImportEnsambleFeature.h
)


Expand Down Expand Up @@ -130,6 +131,7 @@ ${CMAKE_CURRENT_LIST_DIR}/RicShowGridStatisticsFeature.cpp

${CMAKE_CURRENT_LIST_DIR}/RicFileHierarchyDialog.cpp
${CMAKE_CURRENT_LIST_DIR}/RicSummaryCaseRestartDialog.cpp
${CMAKE_CURRENT_LIST_DIR}/RicImportEnsambleFeature.cpp
)


Expand Down
27 changes: 19 additions & 8 deletions ApplicationCode/Commands/RicCreateSummaryCaseCollectionFeature.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,24 @@

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());
}
}

//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
Expand Down Expand Up @@ -65,14 +83,7 @@ void RicCreateSummaryCaseCollectionFeature::onActionTriggered(bool isChecked)
caf::SelectionManager::instance()->objectsByType(&selection);
if (selection.size() == 0) return;

RimSummaryCaseMainCollection* summaryCaseMainCollection = nullptr;
selection[0]->firstAncestorOrThisOfTypeAsserted(summaryCaseMainCollection);

summaryCaseMainCollection->addCaseCollection(selection);
summaryCaseMainCollection->updateConnectedEditors();

RiuPlotMainWindowTools::showPlotMainWindow();
RiuPlotMainWindowTools::selectAsCurrentItem(summaryCaseMainCollection->summaryCaseCollections().back()->allSummaryCases().front());
groupSummaryCases(selection, "");
}

//--------------------------------------------------------------------------------------------------
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,13 +22,17 @@

#include <vector>

class RimSummaryCase;

//==================================================================================================
///
//==================================================================================================
class RicCreateSummaryCaseCollectionFeature : public caf::CmdFeature
{
CAF_CMD_HEADER_INIT;

static void groupSummaryCases(std::vector<RimSummaryCase*> cases, const QString& groupName);

private:
virtual bool isCommandEnabled() override;
virtual void onActionTriggered(bool isChecked) override;
Expand Down
157 changes: 157 additions & 0 deletions ApplicationCode/Commands/RicImportEnsambleFeature.cpp
Original file line number Diff line number Diff line change
@@ -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("");
}
48 changes: 48 additions & 0 deletions ApplicationCode/Commands/RicImportEnsambleFeature.h
Original file line number Diff line number Diff line change
@@ -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();
};


71 changes: 46 additions & 25 deletions ApplicationCode/Commands/RicImportSummaryCasesFeature.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,13 @@

CAF_CMD_SOURCE_INIT(RicImportSummaryCasesFeature, "RicImportSummaryCasesFeature");


//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
QString RicImportSummaryCasesFeature::m_pathFilter = "*";
QString RicImportSummaryCasesFeature::m_fileNameFilter = "*";

//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
Expand All @@ -56,32 +63,15 @@ bool RicImportSummaryCasesFeature::isCommandEnabled()
//--------------------------------------------------------------------------------------------------
void RicImportSummaryCasesFeature::onActionTriggered(bool isChecked)
{
RiaApplication* app = RiaApplication::instance();
QString defaultDir = app->lastUsedDialogDirectory("INPUT_FILES");

RicFileHierarchyDialogResult result = RicFileHierarchyDialog::getOpenFileNames(nullptr, "Import Summary Cases", defaultDir, m_pathFilter, m_fileNameFilter, QStringList(".SMSPEC"));

// Remember filters
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());
RiaApplication* app = RiaApplication::instance();
std::vector<RimSummaryCase*> cases = importSummaryCases("Import Summary Cases");

for (const auto& rimCase : cases) RiaApplication::instance()->addToRecentFiles(rimCase->summaryHeaderFilename());

QStringList fileNames = result.files;
if (fileNames.isEmpty()) return;
std::vector<RimCase*> allCases;
app->project()->allCases(allCases);

if (createAndAddSummaryCasesFromFiles(fileNames))
{
for (const auto& fileName : fileNames) RiaApplication::instance()->addToRecentFiles(fileName);
}

std::vector<RimCase*> cases;
app->project()->allCases(cases);

if (cases.size() == 0)
if (allCases.size() == 0)
{
RiuMainWindow::instance()->close();
}
Expand All @@ -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();
RimProject* proj = app->project();
RimSummaryCaseMainCollection* sumCaseColl = proj->activeOilField() ? proj->activeOilField()->summaryCaseMainCollection() : nullptr;

if (newCases) newCases->clear();
if (!sumCaseColl) return false;

RifSummaryCaseRestartSelector fileSelector;
Expand All @@ -119,5 +111,34 @@ bool RicImportSummaryCasesFeature::createAndAddSummaryCasesFromFiles(const QStri

mainPlotWindow->updateSummaryPlotToolBar();
}

if (newCases) newCases->insert(newCases->end(), sumCases.begin(), sumCases.end());
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;
}
Loading

0 comments on commit 3ce2bfd

Please sign in to comment.