#2794 Summary Case Import: Improve error reporting.

* When an error is found with one summary case file, continue importing all the files that worked.
* Report an error in the log window and a message box afterwards about the case that failed.
* Fix crash when loading .EGRID file without a summary case.
This commit is contained in:
Gaute Lindkvist
2018-04-24 14:12:02 +02:00
parent b6aa35bf11
commit f456911c80
8 changed files with 214 additions and 111 deletions

View File

@@ -21,6 +21,7 @@
#include "../SummaryPlotCommands/RicNewSummaryPlotFeature.h"
#include "RiaApplication.h"
#include "RiaLogging.h"
#include "RiaPreferences.h"
#include "RifEclipseSummaryTools.h"
@@ -51,6 +52,7 @@
#include "cafProgressInfo.h"
#include <QFileInfo>
#include <QMessageBox>
//--------------------------------------------------------------------------------------------------
@@ -64,11 +66,8 @@ bool RiaImportEclipseCaseTools::openEclipseCasesFromFile(const QStringList& file
// Get list of files to import
RifSummaryCaseRestartSelector selector;
if(noDialog) selector.showDialog(false);
std::vector<RifSummaryCaseFileInfo> summaryFileInfos;
if (selector.getFilesToImportFromGridFiles(fileNames))
{
summaryFileInfos = selector.summaryFileInfos();
}
selector.determineFilesToImportFromGridFiles(fileNames);
std::vector<RifSummaryCaseFileInfo> summaryFileInfos = selector.summaryFileInfos();
// Import eclipse case files
for (const QString& gridCaseFile : selector.gridCaseFiles())
@@ -80,52 +79,62 @@ bool RiaImportEclipseCaseTools::openEclipseCasesFromFile(const QStringList& file
}
// Import summary cases
RimSummaryCaseMainCollection* sumCaseColl = project->activeOilField() ? project->activeOilField()->summaryCaseMainCollection() : nullptr;
std::vector<RimSummaryCase*> newSumCases = sumCaseColl->createAndAddSummaryCasesFromFileInfos(summaryFileInfos);
for (RimSummaryCase* newSumCase : newSumCases)
if (!summaryFileInfos.empty())
{
QString gridCaseFile = RifEclipseSummaryTools::findGridCaseFileFromSummaryHeaderFile(newSumCase->summaryHeaderFilename());
RimEclipseCase* gridCase = project->eclipseCaseFromGridFileName(gridCaseFile);
if (gridCase)
RimSummaryCaseMainCollection* sumCaseColl = project->activeOilField() ? project->activeOilField()->summaryCaseMainCollection() : nullptr;
std::vector<RimSummaryCase*> newSumCases = sumCaseColl->createAndAddSummaryCasesFromFileInfos(summaryFileInfos);
for (RimSummaryCase* newSumCase : newSumCases)
{
RimSummaryCase* existingFileSummaryCase = sumCaseColl->findSummaryCaseFromFileName(newSumCase->summaryHeaderFilename());
if (existingFileSummaryCase)
QString gridCaseFile = RifEclipseSummaryTools::findGridCaseFileFromSummaryHeaderFile(newSumCase->summaryHeaderFilename());
RimEclipseCase* gridCase = project->eclipseCaseFromGridFileName(gridCaseFile);
if (gridCase)
{
// Replace all occurrences of file sum with ecl sum
std::vector<caf::PdmObjectHandle*> referringObjects;
existingFileSummaryCase->objectsWithReferringPtrFields(referringObjects);
// UI settings of a curve filter is updated based
// on the new case association for the curves in the curve filter
// UI is updated by loadDataAndUpdate()
for (caf::PdmObjectHandle* objHandle : referringObjects)
RimSummaryCase* existingFileSummaryCase = sumCaseColl->findSummaryCaseFromFileName(newSumCase->summaryHeaderFilename());
if (existingFileSummaryCase)
{
RimSummaryCurve* summaryCurve = dynamic_cast<RimSummaryCurve*>(objHandle);
if (summaryCurve)
// Replace all occurrences of file sum with ecl sum
std::vector<caf::PdmObjectHandle*> referringObjects;
existingFileSummaryCase->objectsWithReferringPtrFields(referringObjects);
// UI settings of a curve filter is updated based
// on the new case association for the curves in the curve filter
// UI is updated by loadDataAndUpdate()
for (caf::PdmObjectHandle* objHandle : referringObjects)
{
RimSummaryCurveCollection* parentCollection = nullptr;
summaryCurve->firstAncestorOrThisOfType(parentCollection);
if (parentCollection)
RimSummaryCurve* summaryCurve = dynamic_cast<RimSummaryCurve*>(objHandle);
if (summaryCurve)
{
parentCollection->loadDataAndUpdate(true);
parentCollection->updateConnectedEditors();
break;
RimSummaryCurveCollection* parentCollection = nullptr;
summaryCurve->firstAncestorOrThisOfType(parentCollection);
if (parentCollection)
{
parentCollection->loadDataAndUpdate(true);
parentCollection->updateConnectedEditors();
break;
}
}
}
sumCaseColl->removeCase(existingFileSummaryCase);
delete existingFileSummaryCase;
}
sumCaseColl->removeCase(existingFileSummaryCase);
delete existingFileSummaryCase;
sumCaseColl->updateAllRequiredEditors();
}
sumCaseColl->updateAllRequiredEditors();
}
}
if (selector.foundErrors())
{
QString errorMessage = selector.createCombinedErrorMessage();
RiaLogging::error(errorMessage);
}
return true;
}

View File

@@ -73,15 +73,18 @@ void RicImportSummaryCaseFeature::onActionTriggered(bool isChecked)
if (fileNames.isEmpty()) return;
if (RicImportSummaryCasesFeature::createAndAddSummaryCasesFromFiles(fileNames))
std::vector<RimSummaryCase*> newCases;
if (RicImportSummaryCasesFeature::createAndAddSummaryCasesFromFiles(fileNames, &newCases))
{
for(const auto& fileName : fileNames) RiaApplication::instance()->addToRecentFiles(fileName);
for (const RimSummaryCase* newCase : newCases)
{
RiaApplication::instance()->addToRecentFiles(newCase->summaryHeaderFilename());
}
}
std::vector<RimCase*> cases;
app->project()->allCases(cases);
if (cases.size() == 0)
if (cases.size() == 0 && !newCases.empty())
{
RiuMainWindow::instance()->close();
}

View File

@@ -19,6 +19,7 @@
#include "RicImportSummaryCasesFeature.h"
#include "RiaApplication.h"
#include "RiaLogging.h"
#include "RiaPreferences.h"
#include "RicFileHierarchyDialog.h"
@@ -40,6 +41,7 @@
#include <QAction>
#include <QFileDialog>
#include <QMessageBox>
CAF_CMD_SOURCE_INIT(RicImportSummaryCasesFeature, "RicImportSummaryCasesFeature");
@@ -116,16 +118,24 @@ bool RicImportSummaryCasesFeature::createSummaryCasesFromFiles(const QStringList
if (!sumCaseColl) return false;
RifSummaryCaseRestartSelector fileSelector;
std::vector<RifSummaryCaseFileInfo> importFileInfos;
if (fileSelector.getFilesToImportFromSummaryFiles(fileNames))
fileSelector.determineFilesToImportFromSummaryFiles(fileNames);
std::vector<RifSummaryCaseFileInfo> importFileInfos = fileSelector.summaryFileInfos();
if (!importFileInfos.empty())
{
importFileInfos = fileSelector.summaryFileInfos();
std::vector<RimSummaryCase*> sumCases = sumCaseColl->createSummaryCasesFromFileInfos(importFileInfos);
if (newCases) newCases->insert(newCases->end(), sumCases.begin(), sumCases.end());
}
std::vector<RimSummaryCase*> sumCases = sumCaseColl->createSummaryCasesFromFileInfos(importFileInfos);
if (fileSelector.foundErrors())
{
QString errorMessage = fileSelector.createCombinedErrorMessage();
RiaLogging::error(errorMessage);
QMessageBox::warning(NULL, QString("Problem Importing Summary Case File(s)"), errorMessage);
}
if (newCases) newCases->insert(newCases->end(), sumCases.begin(), sumCases.end());
return true;
return !importFileInfos.empty();
}
//--------------------------------------------------------------------------------------------------

View File

@@ -208,7 +208,7 @@ RicSummaryCaseRestartDialogResult RicSummaryCaseRestartDialog::openDialog(const
// If only grid file is present, return
if (initialSummaryFile.isEmpty() && !initialGridFile.isEmpty())
{
return RicSummaryCaseRestartDialogResult(true,
return RicSummaryCaseRestartDialogResult(RicSummaryCaseRestartDialogResult::OK,
defaultSummaryImportOption,
defaultGridImportOption,
{},
@@ -229,7 +229,7 @@ RicSummaryCaseRestartDialogResult RicSummaryCaseRestartDialog::openDialog(const
// If no restart files are found and no warnings, do not show dialog
if (originFileInfos.empty() &&!hasWarnings)
{
return RicSummaryCaseRestartDialogResult(true, NOT_IMPORT, NOT_IMPORT, QStringList({ initialSummaryFile }), QStringList({ initialGridFile }), false);
return RicSummaryCaseRestartDialogResult(RicSummaryCaseRestartDialogResult::OK, NOT_IMPORT, NOT_IMPORT, QStringList({ initialSummaryFile }), QStringList({ initialGridFile }), false);
}
RicSummaryCaseRestartDialogResult dialogResult;
@@ -310,7 +310,13 @@ RicSummaryCaseRestartDialogResult RicSummaryCaseRestartDialog::openDialog(const
dialog.resize(DEFAULT_DIALOG_WIDTH, DEFAULT_DIALOG_INIT_HEIGHT);
dialog.exec();
dialogResult = RicSummaryCaseRestartDialogResult(dialog.result() == QDialog::Accepted,
RicSummaryCaseRestartDialogResult::Status status = RicSummaryCaseRestartDialogResult::OK;
if (dialog.result() == QDialog::Rejected)
{
status = RicSummaryCaseRestartDialogResult::CANCELLED;
}
dialogResult = RicSummaryCaseRestartDialogResult(status,
dialog.selectedSummaryImportOption(),
dialog.selectedGridImportOption(),
{},
@@ -318,9 +324,9 @@ RicSummaryCaseRestartDialogResult RicSummaryCaseRestartDialog::openDialog(const
dialog.applyToAllSelected());
}
if (!dialogResult.ok)
if (dialogResult.status != RicSummaryCaseRestartDialogResult::OK)
{
return RicSummaryCaseRestartDialogResult(false, NOT_IMPORT, NOT_IMPORT, QStringList(), QStringList(), false);
return RicSummaryCaseRestartDialogResult(dialogResult.status, NOT_IMPORT, NOT_IMPORT, QStringList(), QStringList(), false);
}
dialogResult.summaryFiles.push_back(RiaFilePathTools::toInternalSeparator(initialSummaryFile));

View File

@@ -102,19 +102,25 @@ private:
class RicSummaryCaseRestartDialogResult
{
public:
RicSummaryCaseRestartDialogResult() :
ok(false),
enum Status
{
OK = 0,
CANCELLED = 1,
ERROR = 2
};
RicSummaryCaseRestartDialogResult(Status _status = ERROR) :
status(_status),
summaryImportOption(RicSummaryCaseRestartDialog::IMPORT_ALL),
gridImportOption(RicSummaryCaseRestartDialog::NOT_IMPORT),
applyToAll(false) {}
RicSummaryCaseRestartDialogResult(bool _ok,
RicSummaryCaseRestartDialogResult(Status _status,
RicSummaryCaseRestartDialog::ImportOptions _summaryImportOption,
RicSummaryCaseRestartDialog::ImportOptions _gridImportOption,
QStringList _summaryFiles,
QStringList _gridFiles,
bool _applyToAll) :
ok(_ok),
status(_status),
summaryImportOption(_summaryImportOption),
gridImportOption(_gridImportOption),
summaryFiles(_summaryFiles),
@@ -123,7 +129,7 @@ public:
{
}
bool ok;
Status status;
RicSummaryCaseRestartDialog::ImportOptions summaryImportOption;
RicSummaryCaseRestartDialog::ImportOptions gridImportOption;
QStringList summaryFiles;

View File

@@ -147,18 +147,6 @@ std::vector<RifRestartFileInfo> RifReaderEclipseSummary::getRestartFiles(const Q
currFile.fileName = headerFileName;
while(!currFile.fileName.isEmpty())
{
QString prevFile = currFile.fileName;
currFile = getRestartFile(currFile.fileName);
// Fix to stop potential infinite loop
if (currFile.fileName == prevFile)
{
m_warnings.push_back("RifReaderEclipseSummary: Restart file reference loop detected");
*hasWarnings = true;
break;
}
// Due to a weakness in libecl regarding restart summary header file selection,
// do some extra checking
{
@@ -187,6 +175,17 @@ std::vector<RifRestartFileInfo> RifReaderEclipseSummary::getRestartFiles(const Q
break;
}
}
QString prevFile = currFile.fileName;
currFile = getRestartFile(currFile.fileName);
// Fix to stop potential infinite loop
if (currFile.fileName == prevFile)
{
m_warnings.push_back("RifReaderEclipseSummary: Restart file reference loop detected");
*hasWarnings = true;
break;
}
}
if (!currFile.fileName.isEmpty())

View File

@@ -26,6 +26,7 @@
#include "RicSummaryCaseRestartDialog.h"
#include "RifEclipseSummaryTools.h"
#include "RifReaderEclipseSummary.h"
#include <string>
#include <assert.h>
@@ -85,54 +86,58 @@ RifSummaryCaseRestartSelector::~RifSummaryCaseRestartSelector()
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
bool RifSummaryCaseRestartSelector::getFilesToImportFromSummaryFiles(const QStringList& initialSummaryFiles)
void RifSummaryCaseRestartSelector::determineFilesToImportFromSummaryFiles(const QStringList& initialSummaryFiles)
{
std::vector<std::pair<QString, QString>> files;
for (QString f : initialSummaryFiles)
{
files.push_back(std::make_pair(f, ""));
}
return getFilesToImport(files);
determineFilesToImport(files);
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
bool RifSummaryCaseRestartSelector::getFilesToImportFromGridFiles(const QStringList& initialGridFiles)
void RifSummaryCaseRestartSelector::determineFilesToImportFromGridFiles(const QStringList& initialGridFiles)
{
std::vector<std::pair<QString, QString>> files;
for (QString f : initialGridFiles)
{
files.push_back(std::make_pair(getSummaryFileFromGridFile(f), f));
}
return getFilesToImport(files);
determineFilesToImport(files);
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
bool RifSummaryCaseRestartSelector::getFilesToImport(const std::vector<std::pair<QString /*sum*/, QString /*grid*/>>& initialFiles)
void RifSummaryCaseRestartSelector::determineFilesToImport(const std::vector<std::pair<QString /*sum*/, QString /*grid*/>>& initialFiles)
{
std::vector<RifSummaryCaseFileInfo> fileInfos;
if (m_showDialog)
{
bool enableApplyToAllField = initialFiles.size() > 1;
return getFilesToImportByAskingUser(initialFiles, enableApplyToAllField);
determineFilesToImportByAskingUser(initialFiles, enableApplyToAllField);
}
else
{
return getFilesToImportUsingPrefs(initialFiles);
determineFilesToImportUsingPrefs(initialFiles);
}
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
bool RifSummaryCaseRestartSelector::getFilesToImportByAskingUser(const std::vector<std::pair<QString /*sum*/, QString /*grid*/>>& initialFiles,
bool enableApplyToAllField)
void RifSummaryCaseRestartSelector::determineFilesToImportByAskingUser(const std::vector<std::pair<QString /*sum*/, QString /*grid*/>>& initialFiles,
bool enableApplyToAllField)
{
RicSummaryCaseRestartDialogResult lastResult;
m_summaryFileInfos.clear();
m_gridFiles.clear();
m_summaryFileErrors.clear();
for (const std::pair<QString, QString>& initialFile : initialFiles)
{
RicSummaryCaseRestartDialogResult result = RicSummaryCaseRestartDialog::openDialog(initialFile,
@@ -140,8 +145,9 @@ bool RifSummaryCaseRestartSelector::getFilesToImportByAskingUser(const std::vect
m_defaultSummaryImportMode,
m_defaultGridImportMode,
&lastResult);
if (result.ok)
switch (result.status)
{
case RicSummaryCaseRestartDialogResult::OK:
for (const QString& file : result.summaryFiles)
{
RifSummaryCaseFileInfo fi(file, result.summaryImportOption == RicSummaryCaseRestartDialog::IMPORT_ALL);
@@ -156,54 +162,76 @@ bool RifSummaryCaseRestartSelector::getFilesToImportByAskingUser(const std::vect
{
m_gridFiles.push_back(gridFile);
}
}
else
break;
case RicSummaryCaseRestartDialogResult::ERROR:
{
// An error occurred with one of the files. The others may still have worked.
m_summaryFileErrors.push_back(initialFile.first);
break;
}
case RicSummaryCaseRestartDialogResult::CANCELLED:
// Cancel pressed, cancel everything
m_summaryFileInfos.clear();
m_gridFiles.clear();
return false;
m_summaryFileErrors.clear();
}
}
return true;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
bool RifSummaryCaseRestartSelector::getFilesToImportUsingPrefs(const std::vector<std::pair<QString /*sum*/, QString /*grid*/>>& initialFiles)
void RifSummaryCaseRestartSelector::determineFilesToImportUsingPrefs(const std::vector<std::pair<QString /*sum*/, QString /*grid*/>>& initialFiles)
{
RicSummaryCaseRestartDialogResult lastResult;
m_summaryFileInfos.clear();
m_gridFiles.clear();
m_summaryFileErrors.clear();
for (const std::pair<QString, QString>& initialFile : initialFiles)
{
QString initialSummaryFile = RiaFilePathTools::toInternalSeparator(initialFile.first);
QString initialGridFile = RiaFilePathTools::toInternalSeparator(initialFile.second);
bool handleGridFile = !initialGridFile.isEmpty();
bool handleSummaryFile = false;
bool handleGridFile = !initialGridFile.isEmpty();
if (m_defaultSummaryImportMode == RicSummaryCaseRestartDialog::IMPORT_ALL)
{
m_summaryFileInfos.push_back(RifSummaryCaseFileInfo(initialSummaryFile, true));
}
else if (m_defaultSummaryImportMode == RicSummaryCaseRestartDialog::NOT_IMPORT)
{
m_summaryFileInfos.push_back(RifSummaryCaseFileInfo(initialSummaryFile, false));
}
else if (m_defaultSummaryImportMode == RicSummaryCaseRestartDialog::SEPARATE_CASES)
{
m_summaryFileInfos.push_back(RifSummaryCaseFileInfo(initialSummaryFile, false));
RifReaderEclipseSummary reader;
bool hasWarnings = false;
std::vector<RifRestartFileInfo> restartFileInfos = reader.getRestartFiles(initialSummaryFile, &hasWarnings);
for (const auto& rfi : restartFileInfos)
RifReaderEclipseSummary reader;
if (!initialSummaryFile.isEmpty())
{
RifRestartFileInfo fileInfo = reader.getFileInfo(initialSummaryFile);
if (!fileInfo.valid())
{
RifSummaryCaseFileInfo fi(rfi.fileName, false);
if (!vectorContains(m_summaryFileInfos, fi))
m_summaryFileErrors.push_back(initialSummaryFile);
}
else
{
handleSummaryFile = true;
}
}
if (handleSummaryFile)
{
if (m_defaultSummaryImportMode == RicSummaryCaseRestartDialog::IMPORT_ALL)
{
m_summaryFileInfos.push_back(RifSummaryCaseFileInfo(initialSummaryFile, true));
}
else if (m_defaultSummaryImportMode == RicSummaryCaseRestartDialog::NOT_IMPORT)
{
m_summaryFileInfos.push_back(RifSummaryCaseFileInfo(initialSummaryFile, false));
}
else if (m_defaultSummaryImportMode == RicSummaryCaseRestartDialog::SEPARATE_CASES)
{
m_summaryFileInfos.push_back(RifSummaryCaseFileInfo(initialSummaryFile, false));
bool hasWarnings = false;
std::vector<RifRestartFileInfo> restartFileInfos = reader.getRestartFiles(initialSummaryFile, &hasWarnings);
for (const auto& rfi : restartFileInfos)
{
m_summaryFileInfos.push_back(fi);
RifSummaryCaseFileInfo fi(RiaFilePathTools::toInternalSeparator(rfi.fileName), false);
if (!vectorContains(m_summaryFileInfos, fi))
{
m_summaryFileInfos.push_back(fi);
}
}
}
}
@@ -231,9 +259,46 @@ bool RifSummaryCaseRestartSelector::getFilesToImportUsingPrefs(const std::vector
for (const QString& warning : reader.warnings()) RiaLogging::error(warning);
}
}
}
}
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
bool RifSummaryCaseRestartSelector::foundErrors() const
{
return !m_summaryFileErrors.empty();
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
const QStringList& RifSummaryCaseRestartSelector::summaryFilesWithErrors() const
{
return m_summaryFileErrors;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
QString RifSummaryCaseRestartSelector::createCombinedErrorMessage() const
{
QString errorMessage;
if (!m_summaryFileErrors.empty())
{
errorMessage = QString("Failed to import the following summary file");
if (m_summaryFileErrors.size() > 1)
{
errorMessage += QString("s");
}
errorMessage += QString(":\n");
for (const QString& fileWarning : m_summaryFileErrors)
{
errorMessage += fileWarning + QString("\n");
}
}
return true;
return errorMessage;
}
//--------------------------------------------------------------------------------------------------

View File

@@ -41,22 +41,26 @@ public:
RifSummaryCaseRestartSelector();
~RifSummaryCaseRestartSelector();
bool getFilesToImportFromSummaryFiles(const QStringList& initialSummaryFiles);
bool getFilesToImportFromGridFiles(const QStringList& initialGridFiles);
void determineFilesToImportFromSummaryFiles(const QStringList& initialSummaryFiles);
void determineFilesToImportFromGridFiles(const QStringList& initialGridFiles);
void showDialog(bool show) { m_showDialog = show; }
std::vector<RifSummaryCaseFileInfo> summaryFileInfos() const { return m_summaryFileInfos; }
QStringList gridCaseFiles() const { return m_gridFiles; }
bool foundErrors() const;
const QStringList& summaryFilesWithErrors() const;
QString createCombinedErrorMessage() const;
static QStringList getSummaryFilesFromGridFiles(const QStringList& gridFiles);
static QString getSummaryFileFromGridFile(const QString& gridFile);
private:
bool getFilesToImport(const std::vector<std::pair<QString /*sum*/, QString /*grid*/>>& initialFiles);
void determineFilesToImport(const std::vector<std::pair<QString /*sum*/, QString /*grid*/>>& initialFiles);
bool getFilesToImportByAskingUser(const std::vector<std::pair<QString /*sum*/, QString /*grid*/>>& initialFiles,
void determineFilesToImportByAskingUser(const std::vector<std::pair<QString /*sum*/, QString /*grid*/>>& initialFiles,
bool enableApplyToAllField);
bool getFilesToImportUsingPrefs(const std::vector<std::pair<QString /*sum*/, QString /*grid*/>>& initialFiles);
void determineFilesToImportUsingPrefs(const std::vector<std::pair<QString /*sum*/, QString /*grid*/>>& initialFiles);
bool m_showDialog;
RicSummaryCaseRestartDialog::ImportOptions m_defaultSummaryImportMode;
@@ -64,6 +68,7 @@ private:
std::vector<RifSummaryCaseFileInfo> m_summaryFileInfos;
QStringList m_gridFiles;
QStringList m_summaryFileErrors;
};
//==================================================================================================