#2555 Add preferences for summary restart file import

This commit is contained in:
Bjørn Erik Jensen 2018-03-19 13:35:56 +01:00
parent 2a84cb6ddf
commit 2f11395525
11 changed files with 236 additions and 104 deletions

View File

@ -27,6 +27,18 @@
#include "cafPdmUiFieldHandle.h"
#include "cafPdmUiFilePathEditor.h"
template<>
void RiaPreferences::SummaryRestartFilesImportModeType::setUp()
{
addItem(RiaPreferences::ASK_USER, "ASK_USER", "Ask user");
addItem(RiaPreferences::IMPORT, "IMPORT", "Always import");
addItem(RiaPreferences::NOT_IMPORT, "NOT_IMPORT", "Never import");
addItem(RiaPreferences::SEPARATE_CASES, "SEPARATE_CASES", "Import as separate summary cases");
setDefault(RiaPreferences::ASK_USER);
}
CAF_PDM_SOURCE_INIT(RiaPreferences, "RiaPreferences");
//--------------------------------------------------------------------------------------------------
///
@ -88,6 +100,9 @@ RiaPreferences::RiaPreferences(void)
CAF_PDM_InitField(&loadAndShowSoil, "loadAndShowSoil", true, "Load and Show SOIL", "", "", "");
loadAndShowSoil.uiCapability()->setUiLabelPosition(caf::PdmUiItemInfo::HIDDEN);
CAF_PDM_InitFieldNoDefault(&summaryRestartFilesImportMode, "summaryRestartFilesImportMode", "Import summary restart files", "", "", "");
//loadAndShowSoil.uiCapability()->setUiLabelPosition(caf::PdmUiItemInfo::HIDDEN);
CAF_PDM_InitFieldNoDefault(&m_readerSettings, "readerSettings", "Reader Settings", "", "", "");
m_readerSettings = new RifReaderSettings;
@ -175,6 +190,9 @@ void RiaPreferences::defineUiOrdering(QString uiConfigName, caf::PdmUiOrdering&
newCaseBehaviourGroup->add(&loadAndShowSoil);
m_readerSettings->defineUiOrdering(uiConfigName, *newCaseBehaviourGroup);
caf::PdmUiGroup* restartBehaviourGroup = uiOrdering.addNewGroup("Summary Restart Files");
restartBehaviourGroup->add(&summaryRestartFilesImportMode);
}
else if (uiConfigName == m_tabNames[2])
{

View File

@ -37,6 +37,9 @@ class RiaPreferences : public caf::PdmObject
CAF_PDM_HEADER_INIT;
public:
enum SummaryRestartFilesImportMode { ASK_USER, IMPORT, NOT_IMPORT, SEPARATE_CASES };
typedef caf::AppEnum<SummaryRestartFilesImportMode> SummaryRestartFilesImportModeType;
RiaPreferences(void);
virtual ~RiaPreferences(void);
@ -77,6 +80,8 @@ public: // Pdm Fields
caf::PdmField<bool> autocomputeDepthRelatedProperties;
caf::PdmField<bool> loadAndShowSoil;
caf::PdmField<SummaryRestartFilesImportModeType> summaryRestartFilesImportMode;
protected:
virtual void defineEditorAttribute(const caf::PdmFieldHandle* field, QString uiConfigName, caf::PdmUiEditorAttribute* attribute);
virtual void defineUiOrdering(QString uiConfigName, caf::PdmUiOrdering& uiOrdering);

View File

@ -23,6 +23,7 @@ ${CMAKE_CURRENT_LIST_DIR}/RiaTextStringTools.h
${CMAKE_CURRENT_LIST_DIR}/RiaTextFileCompare.h
${CMAKE_CURRENT_LIST_DIR}/RiaRegressionTestRunner.h
${CMAKE_CURRENT_LIST_DIR}/RiaExtractionTools.h
${CMAKE_CURRENT_LIST_DIR}/RiaFilePathTools.h
)
set (SOURCE_GROUP_SOURCE_FILES
@ -49,6 +50,7 @@ ${CMAKE_CURRENT_LIST_DIR}/RiaTextStringTools.cpp
${CMAKE_CURRENT_LIST_DIR}/RiaTextFileCompare.cpp
${CMAKE_CURRENT_LIST_DIR}/RiaRegressionTestRunner.cpp
${CMAKE_CURRENT_LIST_DIR}/RiaExtractionTools.cpp
${CMAKE_CURRENT_LIST_DIR}/RiaFilePathTools.cpp
)
list(APPEND CODE_HEADER_FILES

View File

@ -0,0 +1,88 @@
/////////////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2011- Statoil ASA
// Copyright (C) 2013- Ceetron Solutions AS
// Copyright (C) 2011-2012 Ceetron AS
//
// 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 "RiaFilePathTools.h"
#include <QDir>
//--------------------------------------------------------------------------------------------------
/// Internal variables
//--------------------------------------------------------------------------------------------------
static QString SEPARATOR = "/";
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
QString RiaFilePathTools::toInternalSeparator(const QString& path)
{
QString currNativeSep = QDir::separator();
if (currNativeSep == "/")
{
// On Linux like system -> Do not convert separators
return path;
}
// On other systems (i.e. Windows) -> Convert to internal separator (/)
QString output = path;
return output.replace(QString("\\"), SEPARATOR);
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
QString& RiaFilePathTools::appendSeparatorIfNo(QString& path)
{
if (!path.endsWith(SEPARATOR))
{
path.append(SEPARATOR);
}
return path;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
QString RiaFilePathTools::relativePath(const QString& rootDir, const QString& dir)
{
if (dir.startsWith(rootDir))
{
QString relPath = dir;
relPath.remove(0, rootDir.size());
if (relPath.startsWith(SEPARATOR)) relPath.remove(0, 1);
return appendSeparatorIfNo(relPath);
}
else
{
return dir;
}
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
bool RiaFilePathTools::equalPaths(const QString& path1, const QString& path2)
{
QString p1 = path1;
QString p2 = path2;
appendSeparatorIfNo(p1);
appendSeparatorIfNo(p2);
return p1 == p2;
}

View File

@ -0,0 +1,39 @@
/////////////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2011- Statoil ASA
// Copyright (C) 2013- Ceetron Solutions AS
// Copyright (C) 2011-2012 Ceetron AS
//
// 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 <QString>
#include <QByteArray>
#include <string>
//==================================================================================================
//
//
//
//==================================================================================================
class RiaFilePathTools
{
public:
static QString toInternalSeparator(const QString& path);
static QString& appendSeparatorIfNo(QString& path);
static QString relativePath(const QString& rootDir, const QString& dir);
static bool equalPaths(const QString& path1, const QString& path2);
};

View File

@ -22,6 +22,7 @@
#include "ExportCommands/RicSnapshotFilenameGenerator.h"
#include "RiaApplication.h"
#include "RiaFilePathTools.h"
#include "RimEclipseView.h"
#include "Rim3dOverlayInfoConfig.h"
@ -66,11 +67,7 @@ static QString SEPARATOR = "/";
//--------------------------------------------------------------------------------------------------
/// Internal functions
//--------------------------------------------------------------------------------------------------
static QString toInternalSeparator(const QString& path);
static QString& appendSeparatorIfNo(QString& path);
static QStringList prefixStrings(const QStringList& strings, const QString& prefix);
static QString relativePath(const QString& rootDir, const QString& dir);
static bool equalPaths(const QString& path1, const QString& path2);
//--------------------------------------------------------------------------------------------------
///
@ -203,8 +200,8 @@ QStringList RicFileHierarchyDialog::files() const
//--------------------------------------------------------------------------------------------------
QString RicFileHierarchyDialog::rootDir() const
{
QString rootDir = toInternalSeparator(m_rootDir->text());
return appendSeparatorIfNo(rootDir);
QString rootDir = RiaFilePathTools::toInternalSeparator(m_rootDir->text());
return RiaFilePathTools::appendSeparatorIfNo(rootDir);
}
//--------------------------------------------------------------------------------------------------
@ -212,7 +209,7 @@ QString RicFileHierarchyDialog::rootDir() const
//--------------------------------------------------------------------------------------------------
QString RicFileHierarchyDialog::pathFilter() const
{
return toInternalSeparator(m_pathFilter->text());
return RiaFilePathTools::toInternalSeparator(m_pathFilter->text());
}
//--------------------------------------------------------------------------------------------------
@ -349,7 +346,7 @@ QStringList RicFileHierarchyDialog::buildDirectoryListRecursive(const QString& c
}
}
QString currRelPath = relativePath(rootDir(), currentDir);
QString currRelPath = RiaFilePathTools::relativePath(rootDir(), currentDir);
if (pathFilterMatch(currPathFilter, currRelPath))
{
allDirs.push_back(currentDir);
@ -437,7 +434,7 @@ void RicFileHierarchyDialog::updateEffectiveFilter()
.arg(m_fileFilter->text())
.arg(m_fileExtension->text());
QString internalFilter(toInternalSeparator(effFilter));
QString internalFilter(RiaFilePathTools::toInternalSeparator(effFilter));
// Remove duplicate separators
int len;
@ -619,36 +616,6 @@ void RicFileHierarchyDialog::slotBrowseButtonClicked()
/// Internal functions
//--------------------------------------------------------------------------------------------------
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
QString toInternalSeparator(const QString& path)
{
QString currNativeSep = QDir::separator();
if (currNativeSep == "/")
{
// On Linux like system -> Do not convert separators
return path;
}
// On other systems (i.e. Windows) -> Convert to internal separator (/)
QString output = path;
return output.replace(QString("\\"), SEPARATOR);
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
QString& appendSeparatorIfNo(QString& path)
{
if (!path.endsWith(SEPARATOR))
{
path.append(SEPARATOR);
}
return path;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
@ -668,34 +635,3 @@ QStringList prefixStrings(const QStringList& strings, const QString& prefix)
}
return prefixedStrings;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
QString relativePath(const QString& rootDir, const QString& dir)
{
if (dir.startsWith(rootDir))
{
QString relPath = dir;
relPath.remove(0, rootDir.size());
if (relPath.startsWith(SEPARATOR)) relPath.remove(0, 1);
return appendSeparatorIfNo(relPath);
}
else
{
return dir;
}
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
bool equalPaths(const QString& path1, const QString& path2)
{
QString p1 = path1;
QString p2 = path2;
appendSeparatorIfNo(p1);
appendSeparatorIfNo(p2);
return p1 == p2;
}

View File

@ -53,6 +53,7 @@ bool RicImportSummaryCaseFeature::isCommandEnabled()
void RicImportSummaryCaseFeature::onActionTriggered(bool isChecked)
{
RiaApplication* app = RiaApplication::instance();
RiaPreferences* prefs = app->preferences();
QString defaultDir = app->lastUsedDialogDirectory("INPUT_FILES");
QStringList fileNames = QFileDialog::getOpenFileNames(nullptr, "Import Summary Case", defaultDir, "Eclipse Summary File (*.SMSPEC);;All Files (*.*)");
@ -63,7 +64,15 @@ void RicImportSummaryCaseFeature::onActionTriggered(bool isChecked)
if (fileNames.isEmpty()) return;
std::vector<RicSummaryCaseFileInfo> fileInfos = RicImportSummaryCasesFeature::getFilesToImportWithDialog(fileNames, true);
std::vector<RicSummaryCaseFileInfo> fileInfos;
if (prefs->summaryRestartFilesImportMode == RiaPreferences::ASK_USER)
{
fileInfos = RicImportSummaryCasesFeature::getFilesToImportWithDialog(fileNames, true);
}
else
{
fileInfos = RicImportSummaryCasesFeature::getFilesToImportFromPrefs(fileNames, prefs->summaryRestartFilesImportMode);
}
RicImportSummaryCasesFeature::createAndAddSummaryCaseFromFileInfo(fileInfos);

View File

@ -56,6 +56,7 @@ bool RicImportSummaryCasesFeature::isCommandEnabled()
void RicImportSummaryCasesFeature::onActionTriggered(bool isChecked)
{
RiaApplication* app = RiaApplication::instance();
RiaPreferences* prefs = app->preferences();
QString defaultDir = app->lastUsedDialogDirectory("INPUT_FILES");
RicFileHierarchyDialogResult result = RicFileHierarchyDialog::getOpenFileNames(nullptr, "Import Summary Cases", defaultDir, m_pathFilter, m_fileNameFilter, QStringList(".SMSPEC"));
@ -72,10 +73,20 @@ void RicImportSummaryCasesFeature::onActionTriggered(bool isChecked)
QStringList fileNames = result.files;
if (fileNames.isEmpty()) return;
std::vector<RicSummaryCaseFileInfo> fileInfos = getFilesToImportWithDialog(fileNames, true);
std::vector<RicSummaryCaseFileInfo> fileInfos;
if (prefs->summaryRestartFilesImportMode == RiaPreferences::ASK_USER)
{
fileInfos = getFilesToImportWithDialog(fileNames, true);
}
else
{
fileInfos = getFilesToImportFromPrefs(fileNames, prefs->summaryRestartFilesImportMode);
}
createAndAddSummaryCaseFromFileInfo(fileInfos);
if (fileInfos.size() > 0) RiaApplication::instance()->addToRecentFiles(fileInfos.front().fileName);
std::vector<RimCase*> cases;
app->project()->allCases(cases);
@ -111,8 +122,6 @@ std::vector<RicSummaryCaseFileInfo> RicImportSummaryCasesFeature::getFilesToImpo
if (result.ok)
{
if(result.files.size() > 0) RiaApplication::instance()->addToRecentFiles(result.files.front());
for (const QString& file : result.files)
{
RicSummaryCaseFileInfo fi(file, result.option == RicSummaryCaseRestartDialog::READ_ALL);
@ -127,6 +136,38 @@ std::vector<RicSummaryCaseFileInfo> RicImportSummaryCasesFeature::getFilesToImpo
return std::vector<RicSummaryCaseFileInfo>(filesToImport.begin(), filesToImport.end());
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
std::vector<RicSummaryCaseFileInfo> RicImportSummaryCasesFeature::getFilesToImportFromPrefs(const QStringList& initialFiles,
RiaPreferences::SummaryRestartFilesImportModeType summaryRestartMode)
{
std::set<RicSummaryCaseFileInfo> filesToImport;
RicSummaryCaseRestartDialogResult lastResult;
for (const QString& file : initialFiles)
{
if (summaryRestartMode == RiaPreferences::IMPORT)
{
filesToImport.insert(RicSummaryCaseFileInfo(file, true));
}
else if (summaryRestartMode == RiaPreferences::NOT_IMPORT)
{
filesToImport.insert(RicSummaryCaseFileInfo(file, false));
}
else if (summaryRestartMode == RiaPreferences::SEPARATE_CASES)
{
filesToImport.insert(RicSummaryCaseFileInfo(file, false));
RifReaderEclipseSummary reader;
std::vector<RifRestartFileInfo> restartFileInfos = reader.getRestartFiles(file);
for (const auto& fi : restartFileInfos)
filesToImport.insert(RicSummaryCaseFileInfo(fi.fileName, false));
}
}
return std::vector<RicSummaryCaseFileInfo>(filesToImport.begin(), filesToImport.end());
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
@ -149,8 +190,21 @@ bool RicImportSummaryCasesFeature::createAndAddSummaryCaseFromFileInfo(const std
//--------------------------------------------------------------------------------------------------
bool RicImportSummaryCasesFeature::createAndAddSummaryCaseFromFileWithDialog(const QString& fileName)
{
RiaApplication* app = RiaApplication::instance();
RiaPreferences* prefs = app->preferences();
QStringList fileNames({ fileName });
std::vector<RicSummaryCaseFileInfo> fileInfos = getFilesToImportWithDialog(fileNames, false);
std::vector<RicSummaryCaseFileInfo> fileInfos;
if (prefs->summaryRestartFilesImportMode == RiaPreferences::ASK_USER)
{
fileInfos = getFilesToImportWithDialog(fileNames, false);
}
else
{
fileInfos = getFilesToImportFromPrefs(fileNames, prefs->summaryRestartFilesImportMode);
}
bool res = createAndAddSummaryCaseFromFileInfo(fileInfos);
RiaApplication::instance()->addToRecentFiles(fileName);
return res;

View File

@ -18,6 +18,8 @@
#pragma once
#include "RiaPreferences.h"
#include "cafCmdFeature.h"
#include <QString>
@ -54,6 +56,9 @@ public:
static std::vector<RicSummaryCaseFileInfo> getFilesToImportWithDialog(const QStringList& initialFiles,
bool enableApplyToAllField);
static std::vector<RicSummaryCaseFileInfo> getFilesToImportFromPrefs(const QStringList& initialFiles,
RiaPreferences::SummaryRestartFilesImportModeType summaryRestartMode);
static bool createAndAddSummaryCaseFromFileInfo(const std::vector<RicSummaryCaseFileInfo>& fileInfos);
static bool createAndAddSummaryCaseFromFileWithDialog(const QString& fileName);

View File

@ -22,6 +22,7 @@
#include "ExportCommands/RicSnapshotFilenameGenerator.h"
#include "RiaApplication.h"
#include "RiaFilePathTools.h"
#include "RifReaderEclipseSummary.h"
@ -57,15 +58,6 @@
#define DEFAULT_DIALOG_WIDTH 550
#define DEFAULT_DIALOG_INIT_HEIGHT 150
//--------------------------------------------------------------------------------------------------
/// Internal variables
//--------------------------------------------------------------------------------------------------
static QString SEPARATOR = "/";
//--------------------------------------------------------------------------------------------------
/// Internal functions
//--------------------------------------------------------------------------------------------------
static QString toInternalSeparator(const QString& path);
//--------------------------------------------------------------------------------------------------
///
@ -164,12 +156,12 @@ RicSummaryCaseRestartDialogResult RicSummaryCaseRestartDialog::openDialog(const
return RicSummaryCaseRestartDialogResult(false, READ_SINGLE, QStringList(), false);
}
QStringList files({ toInternalSeparator(summaryHeaderFile) });
QStringList files({ RiaFilePathTools::toInternalSeparator(summaryHeaderFile) });
if (dialog.selectedOption() == SEPARATE_CASES)
{
for (const auto& fileInfo : fileInfos)
{
files.push_back(toInternalSeparator(fileInfo.fileName));
files.push_back(RiaFilePathTools::toInternalSeparator(fileInfo.fileName));
}
}
return RicSummaryCaseRestartDialogResult(true, dialog.selectedOption(), files, dialog.applyToAllSelected());
@ -244,20 +236,3 @@ void RicSummaryCaseRestartDialog::slotDialogCancelClicked()
/// Internal functions
//--------------------------------------------------------------------------------------------------
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
QString toInternalSeparator(const QString& path)
{
QString currNativeSep = QDir::separator();
if (currNativeSep == "/")
{
// On Linux like system -> Do not convert separators
return path;
}
// On other systems (i.e. Windows) -> Convert to internal separator (/)
QString output = path;
return output.replace(QString("\\"), SEPARATOR);
}

View File

@ -18,6 +18,7 @@
#include "RifReaderEclipseSummary.h"
#include "RiaStringEncodingTools.h"
#include "RiaFilePathTools.h"
#include "RifReaderEclipseOutput.h"
#include "RifEclipseSummaryTools.h"
@ -416,7 +417,7 @@ RifRestartFileInfo RifReaderEclipseSummary::getRestartFile(const QString& header
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));
restartFile.fileName = RiaFilePathTools::toInternalSeparator(RiaStringEncodingTools::fromNativeEncoded(smspec_header));
util_safe_free(smspec_header);
ecl_sum = openEclSum(headerFileName, false);