mirror of
https://github.com/OPM/ResInsight.git
synced 2026-09-03 20:53:13 -05:00
#2555. Add summary restart file import dialog
This commit is contained in:
@@ -65,6 +65,7 @@ ${CMAKE_CURRENT_LIST_DIR}/RicGridStatisticsDialog.h
|
|||||||
${CMAKE_CURRENT_LIST_DIR}/RicShowGridStatisticsFeature.h
|
${CMAKE_CURRENT_LIST_DIR}/RicShowGridStatisticsFeature.h
|
||||||
|
|
||||||
${CMAKE_CURRENT_LIST_DIR}/RicFileHierarchyDialog.h
|
${CMAKE_CURRENT_LIST_DIR}/RicFileHierarchyDialog.h
|
||||||
|
${CMAKE_CURRENT_LIST_DIR}/RicSummaryCaseRestartDialog.h
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@@ -128,6 +129,7 @@ ${CMAKE_CURRENT_LIST_DIR}/RicGridStatisticsDialog.cpp
|
|||||||
${CMAKE_CURRENT_LIST_DIR}/RicShowGridStatisticsFeature.cpp
|
${CMAKE_CURRENT_LIST_DIR}/RicShowGridStatisticsFeature.cpp
|
||||||
|
|
||||||
${CMAKE_CURRENT_LIST_DIR}/RicFileHierarchyDialog.cpp
|
${CMAKE_CURRENT_LIST_DIR}/RicFileHierarchyDialog.cpp
|
||||||
|
${CMAKE_CURRENT_LIST_DIR}/RicSummaryCaseRestartDialog.cpp
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@@ -142,6 +144,7 @@ ${SOURCE_GROUP_SOURCE_FILES}
|
|||||||
list(APPEND QT_MOC_HEADERS
|
list(APPEND QT_MOC_HEADERS
|
||||||
${CMAKE_CURRENT_LIST_DIR}/RicGridStatisticsDialog.h
|
${CMAKE_CURRENT_LIST_DIR}/RicGridStatisticsDialog.h
|
||||||
${CMAKE_CURRENT_LIST_DIR}/RicFileHierarchyDialog.h
|
${CMAKE_CURRENT_LIST_DIR}/RicFileHierarchyDialog.h
|
||||||
|
${CMAKE_CURRENT_LIST_DIR}/RicSummaryCaseRestartDialog.h
|
||||||
)
|
)
|
||||||
|
|
||||||
source_group( "CommandFeature" FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_files.cmake )
|
source_group( "CommandFeature" FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_files.cmake )
|
||||||
|
|||||||
@@ -21,6 +21,8 @@
|
|||||||
#include "RiaApplication.h"
|
#include "RiaApplication.h"
|
||||||
#include "RiaPreferences.h"
|
#include "RiaPreferences.h"
|
||||||
|
|
||||||
|
#include "RicSummaryCaseRestartDialog.h"
|
||||||
|
|
||||||
#include "RimGridSummaryCase.h"
|
#include "RimGridSummaryCase.h"
|
||||||
#include "RimMainPlotCollection.h"
|
#include "RimMainPlotCollection.h"
|
||||||
#include "RimOilField.h"
|
#include "RimOilField.h"
|
||||||
@@ -32,8 +34,6 @@
|
|||||||
#include "RiuMainPlotWindow.h"
|
#include "RiuMainPlotWindow.h"
|
||||||
#include "RiuMainWindow.h"
|
#include "RiuMainWindow.h"
|
||||||
|
|
||||||
#include "SummaryPlotCommands/RicNewSummaryPlotFeature.h"
|
|
||||||
|
|
||||||
#include <QAction>
|
#include <QAction>
|
||||||
#include <QFileDialog>
|
#include <QFileDialog>
|
||||||
|
|
||||||
@@ -99,19 +99,23 @@ bool RicImportSummaryCaseFeature::createAndAddSummaryCaseFromFile(const QString&
|
|||||||
RimSummaryCaseMainCollection* sumCaseColl = proj->activeOilField() ? proj->activeOilField()->summaryCaseMainCollection() : nullptr;
|
RimSummaryCaseMainCollection* sumCaseColl = proj->activeOilField() ? proj->activeOilField()->summaryCaseMainCollection() : nullptr;
|
||||||
if (!sumCaseColl) return false;
|
if (!sumCaseColl) return false;
|
||||||
|
|
||||||
RimSummaryCase* sumCase = sumCaseColl->createAndAddSummaryCaseFromFileName(fileName);
|
RicSummaryCaseRestartDialogResult result = RicSummaryCaseRestartDialog::openDialog(fileName);
|
||||||
sumCaseColl->updateAllRequiredEditors();
|
|
||||||
|
|
||||||
RiuMainPlotWindow* mainPlotWindow = app->getOrCreateAndShowMainPlotWindow();
|
if (result.ok)
|
||||||
if (mainPlotWindow)
|
|
||||||
{
|
{
|
||||||
mainPlotWindow->selectAsCurrentItem(sumCase);
|
RimSummaryCase* sumCase = sumCaseColl->createAndAddSummaryCaseFromFileName(fileName, result.option == RicSummaryCaseRestartDialog::READ_ALL);
|
||||||
|
sumCaseColl->updateAllRequiredEditors();
|
||||||
|
|
||||||
mainPlotWindow->updateSummaryPlotToolBar();
|
RiuMainPlotWindow* mainPlotWindow = app->getOrCreateAndShowMainPlotWindow();
|
||||||
|
if (mainPlotWindow)
|
||||||
|
{
|
||||||
|
mainPlotWindow->selectAsCurrentItem(sumCase);
|
||||||
|
|
||||||
|
mainPlotWindow->updateSummaryPlotToolBar();
|
||||||
|
}
|
||||||
|
|
||||||
|
app->addToRecentFiles(fileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
app->addToRecentFiles(fileName);
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -22,6 +22,7 @@
|
|||||||
#include "RiaPreferences.h"
|
#include "RiaPreferences.h"
|
||||||
|
|
||||||
#include "RicFileHierarchyDialog.h"
|
#include "RicFileHierarchyDialog.h"
|
||||||
|
#include "RicSummaryCaseRestartDialog.h"
|
||||||
|
|
||||||
#include "RimGridSummaryCase.h"
|
#include "RimGridSummaryCase.h"
|
||||||
#include "RimMainPlotCollection.h"
|
#include "RimMainPlotCollection.h"
|
||||||
@@ -108,19 +109,23 @@ bool RicImportSummaryCasesFeature::createAndAddSummaryCaseFromFile(const QString
|
|||||||
RimSummaryCaseMainCollection* sumCaseColl = proj->activeOilField() ? proj->activeOilField()->summaryCaseMainCollection() : nullptr;
|
RimSummaryCaseMainCollection* sumCaseColl = proj->activeOilField() ? proj->activeOilField()->summaryCaseMainCollection() : nullptr;
|
||||||
if (!sumCaseColl) return false;
|
if (!sumCaseColl) return false;
|
||||||
|
|
||||||
RimSummaryCase* sumCase = sumCaseColl->createAndAddSummaryCaseFromFileName(fileName);
|
RicSummaryCaseRestartDialogResult result = RicSummaryCaseRestartDialog::openDialog(fileName);
|
||||||
sumCaseColl->updateAllRequiredEditors();
|
|
||||||
|
|
||||||
RiuMainPlotWindow* mainPlotWindow = app->getOrCreateAndShowMainPlotWindow();
|
if (result.ok)
|
||||||
if (mainPlotWindow)
|
|
||||||
{
|
{
|
||||||
mainPlotWindow->selectAsCurrentItem(sumCase);
|
RimSummaryCase* sumCase = sumCaseColl->createAndAddSummaryCaseFromFileName(fileName, result.option == RicSummaryCaseRestartDialog::READ_ALL);
|
||||||
|
sumCaseColl->updateAllRequiredEditors();
|
||||||
|
|
||||||
mainPlotWindow->updateSummaryPlotToolBar();
|
RiuMainPlotWindow* mainPlotWindow = app->getOrCreateAndShowMainPlotWindow();
|
||||||
|
if (mainPlotWindow)
|
||||||
|
{
|
||||||
|
mainPlotWindow->selectAsCurrentItem(sumCase);
|
||||||
|
|
||||||
|
mainPlotWindow->updateSummaryPlotToolBar();
|
||||||
|
}
|
||||||
|
|
||||||
|
app->addToRecentFiles(fileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
app->addToRecentFiles(fileName);
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,193 @@
|
|||||||
|
/////////////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// Copyright (C) 2017- 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 "RicSummaryCaseRestartDialog.h"
|
||||||
|
#include "ExportCommands/RicSnapshotViewToClipboardFeature.h"
|
||||||
|
#include "ExportCommands/RicSnapshotViewToFileFeature.h"
|
||||||
|
#include "ExportCommands/RicSnapshotFilenameGenerator.h"
|
||||||
|
|
||||||
|
#include "RiaApplication.h"
|
||||||
|
|
||||||
|
#include "RifReaderEclipseSummary.h"
|
||||||
|
|
||||||
|
#include "RimEclipseView.h"
|
||||||
|
#include "Rim3dOverlayInfoConfig.h"
|
||||||
|
#include "RimTools.h"
|
||||||
|
|
||||||
|
#include "RiuMainPlotWindow.h"
|
||||||
|
#include "RiuSummaryQwtPlot.h"
|
||||||
|
#include "RiuTools.h"
|
||||||
|
|
||||||
|
#include <QVBoxLayout>
|
||||||
|
#include <QLabel>
|
||||||
|
#include <QLineEdit>
|
||||||
|
#include <QTextEdit>
|
||||||
|
#include <QDialogButtonBox>
|
||||||
|
#include <QPushButton>
|
||||||
|
#include <QRadioButton>
|
||||||
|
#include <QToolBar>
|
||||||
|
#include <QAction>
|
||||||
|
#include <QFileDialog>
|
||||||
|
#include <QGroupBox>
|
||||||
|
#include <QListWidget>
|
||||||
|
#include <QAbstractItemView>
|
||||||
|
#include <QMenu>
|
||||||
|
#include <QDateTime>
|
||||||
|
|
||||||
|
#include <vector>
|
||||||
|
#include <time.h>
|
||||||
|
#include <thread>
|
||||||
|
|
||||||
|
#define DEFAULT_DIALOG_WIDTH 550
|
||||||
|
#define DEFAULT_DIALOG_INIT_HEIGHT 150
|
||||||
|
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
///
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
RicSummaryCaseRestartDialog::RicSummaryCaseRestartDialog(QWidget* parent)
|
||||||
|
: QDialog(parent, RiuTools::defaultDialogFlags())
|
||||||
|
{
|
||||||
|
// Create widgets
|
||||||
|
m_readAllRadioButton = new QRadioButton(this);
|
||||||
|
m_notReadRadionButton = new QRadioButton(this);
|
||||||
|
m_separateCasesRadionButton = new QRadioButton(this);
|
||||||
|
|
||||||
|
m_buttons = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel);
|
||||||
|
|
||||||
|
// Connect to signals
|
||||||
|
connect(m_buttons, SIGNAL(accepted()), this, SLOT(slotDialogOkClicked()));
|
||||||
|
connect(m_buttons, SIGNAL(rejected()), this, SLOT(slotDialogCancelClicked()));
|
||||||
|
|
||||||
|
// Set widget properties
|
||||||
|
m_readAllRadioButton->setText("Import All Restart Files");
|
||||||
|
m_notReadRadionButton->setText("Do Not Import Restart Files");
|
||||||
|
m_separateCasesRadionButton->setText("Import Restart Files as Separate Cases");
|
||||||
|
|
||||||
|
// Define layout
|
||||||
|
QVBoxLayout* dialogLayout = new QVBoxLayout();
|
||||||
|
|
||||||
|
QGroupBox* filesGroup = new QGroupBox("Found Restart Files");
|
||||||
|
m_filesGridLayout = new QGridLayout();
|
||||||
|
filesGroup->setLayout(m_filesGridLayout);
|
||||||
|
|
||||||
|
QGroupBox* optionsGroup = new QGroupBox("Read Options");
|
||||||
|
QVBoxLayout* optionsLayout = new QVBoxLayout();
|
||||||
|
optionsLayout->addWidget(m_readAllRadioButton);
|
||||||
|
optionsLayout->addWidget(m_notReadRadionButton);
|
||||||
|
optionsLayout->addWidget(m_separateCasesRadionButton);
|
||||||
|
optionsGroup->setLayout(optionsLayout);
|
||||||
|
|
||||||
|
dialogLayout->addWidget(filesGroup);
|
||||||
|
dialogLayout->addWidget(optionsGroup);
|
||||||
|
dialogLayout->addWidget(m_buttons);
|
||||||
|
|
||||||
|
setLayout(dialogLayout);
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
///
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
RicSummaryCaseRestartDialog::~RicSummaryCaseRestartDialog()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
///
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
RicSummaryCaseRestartDialogResult RicSummaryCaseRestartDialog::openDialog(const QString& summaryHeaderFile, QWidget *parent)
|
||||||
|
{
|
||||||
|
RicSummaryCaseRestartDialog dialog(parent);
|
||||||
|
|
||||||
|
dialog.setWindowTitle("Summary Case Restart Files");
|
||||||
|
dialog.m_readAllRadioButton->setChecked(true);
|
||||||
|
|
||||||
|
std::vector<RifRestartFileInfo> files = dialog.getRestartFiles(summaryHeaderFile);
|
||||||
|
for (const auto& file : files)
|
||||||
|
{
|
||||||
|
dialog.appendToFileList(file);
|
||||||
|
}
|
||||||
|
|
||||||
|
// If no restart files are found, do not show dialog
|
||||||
|
if (files.empty())
|
||||||
|
{
|
||||||
|
return RicSummaryCaseRestartDialogResult(true, READ_ALL);
|
||||||
|
}
|
||||||
|
|
||||||
|
dialog.resize(DEFAULT_DIALOG_WIDTH, DEFAULT_DIALOG_INIT_HEIGHT);
|
||||||
|
dialog.exec();
|
||||||
|
|
||||||
|
return RicSummaryCaseRestartDialogResult(dialog.result() == QDialog::Accepted, dialog.selectedOption());
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
///
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
RicSummaryCaseRestartDialog::ReadOptions RicSummaryCaseRestartDialog::selectedOption() const
|
||||||
|
{
|
||||||
|
return
|
||||||
|
m_notReadRadionButton->isChecked() ? NOT_READ :
|
||||||
|
m_separateCasesRadionButton->isChecked() ? SEPARATE_CASES :
|
||||||
|
READ_ALL;
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
///
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
void RicSummaryCaseRestartDialog::appendToFileList(const RifRestartFileInfo& fileInfo)
|
||||||
|
{
|
||||||
|
QDateTime startDate = QDateTime::fromTime_t(fileInfo.startDate);
|
||||||
|
QString startDateString = startDate.toString(RimTools::dateFormatString());
|
||||||
|
QDateTime endDate = QDateTime::fromTime_t(fileInfo.endDate);
|
||||||
|
QString endDateString = endDate.toString(RimTools::dateFormatString());
|
||||||
|
int rowCount = m_filesGridLayout->rowCount();
|
||||||
|
|
||||||
|
QLabel* fileNameLabel = new QLabel();
|
||||||
|
QLabel* dateLabel = new QLabel();
|
||||||
|
fileNameLabel->setText(QFileInfo(fileInfo.fileName).fileName());
|
||||||
|
dateLabel->setText(startDateString + " - " + endDateString);
|
||||||
|
|
||||||
|
fileNameLabel->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
|
||||||
|
m_filesGridLayout->addWidget(fileNameLabel, rowCount, 0);
|
||||||
|
m_filesGridLayout->addWidget(dateLabel, rowCount, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
///
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
std::vector<RifRestartFileInfo> RicSummaryCaseRestartDialog::getRestartFiles(const QString& summaryHeaderFile)
|
||||||
|
{
|
||||||
|
RifReaderEclipseSummary reader;
|
||||||
|
return reader.getRestartFiles(summaryHeaderFile);
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
///
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
void RicSummaryCaseRestartDialog::slotDialogOkClicked()
|
||||||
|
{
|
||||||
|
accept();
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
///
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
void RicSummaryCaseRestartDialog::slotDialogCancelClicked()
|
||||||
|
{
|
||||||
|
reject();
|
||||||
|
}
|
||||||
@@ -0,0 +1,88 @@
|
|||||||
|
/////////////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// Copyright (C) 2017- 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 "Rim3dOverlayInfoConfig.h"
|
||||||
|
|
||||||
|
#include "RifReaderEclipseSummary.h"
|
||||||
|
|
||||||
|
#include "cafPdmPointer.h"
|
||||||
|
|
||||||
|
#include <QDialog>
|
||||||
|
|
||||||
|
class QLabel;
|
||||||
|
class QRadioButton;
|
||||||
|
class QLineEdit;
|
||||||
|
class QTextEdit;
|
||||||
|
class QDialogButtonBox;
|
||||||
|
class QPushButton;
|
||||||
|
class QMainWindow;
|
||||||
|
class QListWidget;
|
||||||
|
class QGridLayout;
|
||||||
|
class RicSummaryCaseRestartDialogResult;
|
||||||
|
|
||||||
|
//==================================================================================================
|
||||||
|
///
|
||||||
|
//==================================================================================================
|
||||||
|
class RicSummaryCaseRestartDialog : public QDialog
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
enum ReadOptions { READ_ALL, NOT_READ, SEPARATE_CASES };
|
||||||
|
|
||||||
|
RicSummaryCaseRestartDialog(QWidget* parent);
|
||||||
|
~RicSummaryCaseRestartDialog();
|
||||||
|
|
||||||
|
static RicSummaryCaseRestartDialogResult openDialog(const QString& summaryHeaderFile, QWidget *parent = nullptr);
|
||||||
|
|
||||||
|
ReadOptions selectedOption() const;
|
||||||
|
|
||||||
|
private:
|
||||||
|
void appendToFileList(const RifRestartFileInfo& fileInfo);
|
||||||
|
std::vector<RifRestartFileInfo> getRestartFiles(const QString& summaryHeaderFile);
|
||||||
|
|
||||||
|
private slots:
|
||||||
|
void slotDialogOkClicked();
|
||||||
|
void slotDialogCancelClicked();
|
||||||
|
|
||||||
|
private:
|
||||||
|
QGridLayout * m_filesGridLayout;
|
||||||
|
|
||||||
|
QRadioButton* m_readAllRadioButton;
|
||||||
|
QRadioButton* m_notReadRadionButton;
|
||||||
|
QRadioButton* m_separateCasesRadionButton;
|
||||||
|
|
||||||
|
QDialogButtonBox* m_buttons;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
//==================================================================================================
|
||||||
|
///
|
||||||
|
//==================================================================================================
|
||||||
|
class RicSummaryCaseRestartDialogResult
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
RicSummaryCaseRestartDialogResult(bool ok,
|
||||||
|
RicSummaryCaseRestartDialog::ReadOptions option) :
|
||||||
|
ok(ok), option(option) {}
|
||||||
|
|
||||||
|
bool ok;
|
||||||
|
RicSummaryCaseRestartDialog::ReadOptions option;
|
||||||
|
};
|
||||||
@@ -18,8 +18,8 @@
|
|||||||
|
|
||||||
#include "RifReaderEclipseSummary.h"
|
#include "RifReaderEclipseSummary.h"
|
||||||
#include "RiaStringEncodingTools.h"
|
#include "RiaStringEncodingTools.h"
|
||||||
|
#include "RifReaderEclipseOutput.h"
|
||||||
#include "ert/ecl/ecl_sum.h"
|
#include "RifEclipseSummaryTools.h"
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
@@ -27,8 +27,62 @@
|
|||||||
#include <QDateTime>
|
#include <QDateTime>
|
||||||
#include <QString>
|
#include <QString>
|
||||||
#include <QStringList>
|
#include <QStringList>
|
||||||
#include "ert/ecl/smspec_node.h"
|
#include <QDir>
|
||||||
|
|
||||||
|
#include "ert/ecl/ecl_sum.h"
|
||||||
|
#include "ert/ecl/smspec_node.h"
|
||||||
|
#include "ert/ecl/ecl_file.h"
|
||||||
|
#include "ert/ecl/ecl_kw_magic.h"
|
||||||
|
#include "ert/ecl/ecl_kw.h"
|
||||||
|
|
||||||
|
|
||||||
|
std::vector<time_t> getTimeSteps(ecl_sum_type* ecl_sum)
|
||||||
|
{
|
||||||
|
std::vector<time_t> timeSteps;
|
||||||
|
for (int time_index = 0; time_index < ecl_sum_get_data_length(ecl_sum); time_index++)
|
||||||
|
{
|
||||||
|
time_t sim_time = ecl_sum_iget_sim_time(ecl_sum, time_index);
|
||||||
|
timeSteps.push_back(sim_time);
|
||||||
|
}
|
||||||
|
return timeSteps;
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
///
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
ecl_sum_type* openEclSum(const QString& inHeaderFileName, bool includeRestartFiles)
|
||||||
|
{
|
||||||
|
QString headerFileName;
|
||||||
|
QStringList dataFileNames;
|
||||||
|
QString nativeHeaderFileName = QDir::toNativeSeparators(inHeaderFileName);
|
||||||
|
RifEclipseSummaryTools::findSummaryFiles(nativeHeaderFileName, &headerFileName, &dataFileNames);
|
||||||
|
|
||||||
|
if (headerFileName.isEmpty() || dataFileNames.size() == 0) return nullptr;
|
||||||
|
|
||||||
|
assert(!headerFileName.isEmpty());
|
||||||
|
assert(dataFileNames.size() > 0);
|
||||||
|
|
||||||
|
stringlist_type* dataFiles = stringlist_alloc_new();
|
||||||
|
for (int i = 0; i < dataFileNames.size(); i++)
|
||||||
|
{
|
||||||
|
stringlist_append_copy(dataFiles, RiaStringEncodingTools::toNativeEncoded(dataFileNames[i]).data());
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string itemSeparatorInVariableNames = ":";
|
||||||
|
ecl_sum_type* ecl_sum = ecl_sum_fread_alloc(RiaStringEncodingTools::toNativeEncoded(headerFileName).data(), dataFiles, itemSeparatorInVariableNames.data(), includeRestartFiles);
|
||||||
|
|
||||||
|
stringlist_free(dataFiles);
|
||||||
|
|
||||||
|
return ecl_sum;
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
///
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
void closeEclSum(ecl_sum_type* ecl_sum)
|
||||||
|
{
|
||||||
|
if(ecl_sum) ecl_sum_free(ecl_sum);
|
||||||
|
}
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
///
|
///
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
@@ -54,36 +108,17 @@ RifReaderEclipseSummary::~RifReaderEclipseSummary()
|
|||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
///
|
///
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
bool RifReaderEclipseSummary::open(const QString& headerFileName, const QStringList& dataFileNames)
|
bool RifReaderEclipseSummary::open(const QString& headerFileName, bool includeRestartFiles)
|
||||||
{
|
{
|
||||||
assert(m_ecl_sum == NULL);
|
assert(m_ecl_sum == NULL);
|
||||||
|
|
||||||
if (headerFileName.isEmpty() || dataFileNames.size() == 0) return false;
|
m_ecl_sum = openEclSum(headerFileName, includeRestartFiles);
|
||||||
|
|
||||||
assert(!headerFileName.isEmpty());
|
|
||||||
assert(dataFileNames.size() > 0);
|
|
||||||
|
|
||||||
stringlist_type* dataFiles = stringlist_alloc_new();
|
|
||||||
for (int i = 0; i < dataFileNames.size(); i++)
|
|
||||||
{
|
|
||||||
stringlist_append_copy(dataFiles, RiaStringEncodingTools::toNativeEncoded(dataFileNames[i]).data());
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string itemSeparatorInVariableNames = ":";
|
|
||||||
m_ecl_sum = ecl_sum_fread_alloc(RiaStringEncodingTools::toNativeEncoded(headerFileName).data(), dataFiles, itemSeparatorInVariableNames.data(), false);
|
|
||||||
|
|
||||||
stringlist_free(dataFiles);
|
|
||||||
|
|
||||||
if (m_ecl_sum)
|
if (m_ecl_sum)
|
||||||
{
|
{
|
||||||
m_timeSteps.clear();
|
m_timeSteps.clear();
|
||||||
m_ecl_SmSpec = ecl_sum_get_smspec(m_ecl_sum);
|
m_ecl_SmSpec = ecl_sum_get_smspec(m_ecl_sum);
|
||||||
|
m_timeSteps = getTimeSteps(m_ecl_sum);
|
||||||
for ( int time_index = 0; time_index < timeStepCount(); time_index++ )
|
|
||||||
{
|
|
||||||
time_t sim_time = ecl_sum_iget_sim_time(m_ecl_sum, time_index);
|
|
||||||
m_timeSteps.push_back(sim_time);
|
|
||||||
}
|
|
||||||
|
|
||||||
buildMetaData();
|
buildMetaData();
|
||||||
|
|
||||||
@@ -93,6 +128,24 @@ bool RifReaderEclipseSummary::open(const QString& headerFileName, const QStringL
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
///
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
std::vector<RifRestartFileInfo> RifReaderEclipseSummary::getRestartFiles(const QString& headerFileName)
|
||||||
|
{
|
||||||
|
std::vector<RifRestartFileInfo> restartFiles;
|
||||||
|
|
||||||
|
RifRestartFileInfo currFile;
|
||||||
|
currFile.fileName = headerFileName;
|
||||||
|
while(!currFile.fileName.isEmpty())
|
||||||
|
{
|
||||||
|
currFile = getRestartFile(currFile.fileName);
|
||||||
|
if (!currFile.fileName.isEmpty())
|
||||||
|
restartFiles.push_back(currFile);
|
||||||
|
}
|
||||||
|
return restartFiles;
|
||||||
|
}
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
///
|
///
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
@@ -326,6 +379,57 @@ void RifReaderEclipseSummary::buildMetaData()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
///
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
time_t getStartDate(ecl_file_type * header)
|
||||||
|
{
|
||||||
|
time_t startDate = 0;
|
||||||
|
ecl_kw_type *startdat = ecl_file_iget_named_kw(header, STARTDAT_KW, 0);
|
||||||
|
if (startdat)
|
||||||
|
{
|
||||||
|
int * date = ecl_kw_get_int_ptr(startdat);
|
||||||
|
startDate = ecl_util_make_date(date[STARTDAT_DAY_INDEX],
|
||||||
|
date[STARTDAT_MONTH_INDEX],
|
||||||
|
date[STARTDAT_YEAR_INDEX]);
|
||||||
|
}
|
||||||
|
return startDate;
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
///
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
RifRestartFileInfo RifReaderEclipseSummary::getRestartFile(const QString& headerFileName)
|
||||||
|
{
|
||||||
|
RifRestartFileInfo restartFile;
|
||||||
|
|
||||||
|
ecl_sum_type* ecl_sum = openEclSum(headerFileName, true);
|
||||||
|
|
||||||
|
const ecl_smspec_type* smspec = ecl_sum ? ecl_sum_get_smspec(ecl_sum) : nullptr;
|
||||||
|
const char* rstCase = smspec ? ecl_smspec_get_restart_case(smspec) : nullptr;
|
||||||
|
QString restartCase = rstCase? RiaStringEncodingTools::fromNativeEncoded(rstCase) : "";
|
||||||
|
closeEclSum(ecl_sum);
|
||||||
|
|
||||||
|
if (!restartCase.isEmpty())
|
||||||
|
{
|
||||||
|
QString path = QFileInfo(headerFileName).dir().path();
|
||||||
|
QString restartBase = QDir(restartCase).dirName();
|
||||||
|
|
||||||
|
char* smspec_header = ecl_util_alloc_exfilename(path.toStdString().data(), restartBase.toStdString().data(), ECL_SUMMARY_HEADER_FILE, false /*unformatted*/, 0);
|
||||||
|
restartFile.fileName = QDir::toNativeSeparators(RiaStringEncodingTools::fromNativeEncoded(smspec_header));
|
||||||
|
util_safe_free(smspec_header);
|
||||||
|
|
||||||
|
ecl_sum = openEclSum(headerFileName, false);
|
||||||
|
std::vector<time_t> timeSteps = getTimeSteps(ecl_sum);
|
||||||
|
if (timeSteps.size() > 0)
|
||||||
|
{
|
||||||
|
restartFile.startDate = timeSteps.front();
|
||||||
|
restartFile.endDate = timeSteps.back();
|
||||||
|
}
|
||||||
|
closeEclSum(ecl_sum);
|
||||||
|
}
|
||||||
|
return restartFile;
|
||||||
|
}
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
///
|
///
|
||||||
|
|||||||
@@ -21,13 +21,29 @@
|
|||||||
#include "RifEclipseSummaryAddress.h"
|
#include "RifEclipseSummaryAddress.h"
|
||||||
#include "RifSummaryReaderInterface.h"
|
#include "RifSummaryReaderInterface.h"
|
||||||
|
|
||||||
|
#include <QString>
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include <map>
|
#include <map>
|
||||||
|
|
||||||
class QString;
|
|
||||||
class QStringList;
|
class QStringList;
|
||||||
|
|
||||||
|
|
||||||
|
//==================================================================================================
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//==================================================================================================
|
||||||
|
class RifRestartFileInfo
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
RifRestartFileInfo() : startDate(0), endDate(0) {}
|
||||||
|
|
||||||
|
QString fileName;
|
||||||
|
time_t startDate;
|
||||||
|
time_t endDate;
|
||||||
|
};
|
||||||
|
|
||||||
//==================================================================================================
|
//==================================================================================================
|
||||||
//
|
//
|
||||||
//
|
//
|
||||||
@@ -38,7 +54,9 @@ public:
|
|||||||
RifReaderEclipseSummary();
|
RifReaderEclipseSummary();
|
||||||
~RifReaderEclipseSummary();
|
~RifReaderEclipseSummary();
|
||||||
|
|
||||||
bool open(const QString& headerFileName, const QStringList& dataFileNames);
|
bool open(const QString& headerFileName, bool includeRestartFiles);
|
||||||
|
|
||||||
|
std::vector<RifRestartFileInfo> getRestartFiles(const QString& headerFileName);
|
||||||
|
|
||||||
virtual const std::vector<time_t>& timeSteps(const RifEclipseSummaryAddress& resultAddress) const override;
|
virtual const std::vector<time_t>& timeSteps(const RifEclipseSummaryAddress& resultAddress) const override;
|
||||||
|
|
||||||
@@ -49,6 +67,7 @@ private:
|
|||||||
int timeStepCount() const;
|
int timeStepCount() const;
|
||||||
int indexFromAddress(const RifEclipseSummaryAddress& resultAddress) const;
|
int indexFromAddress(const RifEclipseSummaryAddress& resultAddress) const;
|
||||||
void buildMetaData();
|
void buildMetaData();
|
||||||
|
RifRestartFileInfo getRestartFile(const QString& headerFileName);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// Taken from ecl_sum.h
|
// Taken from ecl_sum.h
|
||||||
|
|||||||
@@ -39,9 +39,17 @@ CAF_PDM_SOURCE_INIT(RimFileSummaryCase,"FileSummaryCase");
|
|||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
///
|
///
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
RimFileSummaryCase::RimFileSummaryCase()
|
RimFileSummaryCase::RimFileSummaryCase() : m_includeRestartFiles(false)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
///
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
RimFileSummaryCase::RimFileSummaryCase(bool includeRestartFiles)
|
||||||
|
{
|
||||||
|
m_includeRestartFiles = includeRestartFiles;
|
||||||
}
|
}
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
@@ -83,22 +91,17 @@ void RimFileSummaryCase::updateFilePathsFromProjectPath(const QString & newProje
|
|||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
void RimFileSummaryCase::createSummaryReaderInterface()
|
void RimFileSummaryCase::createSummaryReaderInterface()
|
||||||
{
|
{
|
||||||
m_summaryFileReader = RimFileSummaryCase::findRelatedFilesAndCreateReader(this->summaryHeaderFilename());
|
m_summaryFileReader = RimFileSummaryCase::findRelatedFilesAndCreateReader(this->summaryHeaderFilename(), m_includeRestartFiles);
|
||||||
}
|
}
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
///
|
///
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
RifReaderEclipseSummary* RimFileSummaryCase::findRelatedFilesAndCreateReader(const QString& headerFileName)
|
RifReaderEclipseSummary* RimFileSummaryCase::findRelatedFilesAndCreateReader(const QString& headerFileName, bool includeRestartFiles)
|
||||||
{
|
{
|
||||||
QString headerFileNameStd;
|
|
||||||
QStringList dataFileNames;
|
|
||||||
QString nativeSumHeadFileName = QDir::toNativeSeparators(headerFileName);
|
|
||||||
RifEclipseSummaryTools::findSummaryFiles(nativeSumHeadFileName, &headerFileNameStd, &dataFileNames);
|
|
||||||
|
|
||||||
RifReaderEclipseSummary* summaryFileReader = new RifReaderEclipseSummary;
|
RifReaderEclipseSummary* summaryFileReader = new RifReaderEclipseSummary;
|
||||||
|
|
||||||
if (!summaryFileReader->open(headerFileNameStd, dataFileNames))
|
if (!summaryFileReader->open(headerFileName, includeRestartFiles))
|
||||||
{
|
{
|
||||||
RiaLogging::warning(QString("Failed to open summary file %1").arg(headerFileName));
|
RiaLogging::warning(QString("Failed to open summary file %1").arg(headerFileName));
|
||||||
|
|
||||||
|
|||||||
@@ -34,6 +34,7 @@ class RimFileSummaryCase: public RimSummaryCase
|
|||||||
CAF_PDM_HEADER_INIT;
|
CAF_PDM_HEADER_INIT;
|
||||||
public:
|
public:
|
||||||
RimFileSummaryCase();
|
RimFileSummaryCase();
|
||||||
|
RimFileSummaryCase(bool includeRestartFiles);
|
||||||
virtual ~RimFileSummaryCase();
|
virtual ~RimFileSummaryCase();
|
||||||
|
|
||||||
virtual QString summaryHeaderFilename() const override;
|
virtual QString summaryHeaderFilename() const override;
|
||||||
@@ -43,8 +44,9 @@ public:
|
|||||||
virtual void createSummaryReaderInterface() override;
|
virtual void createSummaryReaderInterface() override;
|
||||||
virtual RifSummaryReaderInterface* summaryReader() override;
|
virtual RifSummaryReaderInterface* summaryReader() override;
|
||||||
|
|
||||||
static RifReaderEclipseSummary* findRelatedFilesAndCreateReader(const QString& headerFileName);
|
static RifReaderEclipseSummary* findRelatedFilesAndCreateReader(const QString& headerFileName, bool includeRestartFiles);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
cvf::ref<RifReaderEclipseSummary> m_summaryFileReader;
|
cvf::ref<RifReaderEclipseSummary> m_summaryFileReader;
|
||||||
|
bool m_includeRestartFiles;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -175,7 +175,7 @@ void RimGridSummaryCase::updateFilePathsFromProjectPath(const QString & newProje
|
|||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
void RimGridSummaryCase::createSummaryReaderInterface()
|
void RimGridSummaryCase::createSummaryReaderInterface()
|
||||||
{
|
{
|
||||||
m_summaryFileReader = RimFileSummaryCase::findRelatedFilesAndCreateReader(this->summaryHeaderFilename());
|
m_summaryFileReader = RimFileSummaryCase::findRelatedFilesAndCreateReader(this->summaryHeaderFilename(), true /* read restart files */);
|
||||||
}
|
}
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
|||||||
@@ -282,9 +282,9 @@ RimSummaryCase* RimSummaryCaseMainCollection::createAndAddSummaryCaseFromEclipse
|
|||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
///
|
///
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
RimSummaryCase* RimSummaryCaseMainCollection::createAndAddSummaryCaseFromFileName(const QString& fileName)
|
RimSummaryCase* RimSummaryCaseMainCollection::createAndAddSummaryCaseFromFileName(const QString& fileName, bool includeRestartFiles)
|
||||||
{
|
{
|
||||||
RimFileSummaryCase* newSumCase = new RimFileSummaryCase();
|
RimFileSummaryCase* newSumCase = new RimFileSummaryCase(includeRestartFiles);
|
||||||
|
|
||||||
this->m_cases.push_back(newSumCase);
|
this->m_cases.push_back(newSumCase);
|
||||||
newSumCase->setSummaryHeaderFileName(fileName);
|
newSumCase->setSummaryHeaderFileName(fileName);
|
||||||
|
|||||||
@@ -45,7 +45,7 @@ public:
|
|||||||
|
|
||||||
void createSummaryCasesFromRelevantEclipseResultCases();
|
void createSummaryCasesFromRelevantEclipseResultCases();
|
||||||
RimSummaryCase* createAndAddSummaryCaseFromEclipseResultCase(RimEclipseResultCase* eclResCase);
|
RimSummaryCase* createAndAddSummaryCaseFromEclipseResultCase(RimEclipseResultCase* eclResCase);
|
||||||
RimSummaryCase* createAndAddSummaryCaseFromFileName(const QString& fileName);
|
RimSummaryCase* createAndAddSummaryCaseFromFileName(const QString& fileName, bool includeRestartFiles);
|
||||||
|
|
||||||
RimSummaryCase* findSummaryCaseFromEclipseResultCase(RimEclipseResultCase* eclResCase) const;
|
RimSummaryCase* findSummaryCaseFromEclipseResultCase(RimEclipseResultCase* eclResCase) const;
|
||||||
RimSummaryCase* findSummaryCaseFromFileName(const QString& fileName) const;
|
RimSummaryCase* findSummaryCaseFromFileName(const QString& fileName) const;
|
||||||
|
|||||||
Reference in New Issue
Block a user