Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .gitmodules
Original file line number Diff line number Diff line change
Expand Up @@ -28,3 +28,6 @@
[submodule "ThirdParty/custom-opm-flowdiag-app/opm-flowdiagnostics-applications"]
path = ThirdParty/custom-opm-flowdiag-app/opm-flowdiagnostics-applications
url = https://github.com/CeetronSolutions/opm-flowdiagnostics-applications
[submodule "ThirdParty/fesapi"]
path = ThirdParty/fesapi
url = https://github.com/F2I-CONSULTING/fesapi.git
4 changes: 4 additions & 0 deletions ApplicationLibCode/Application/RiaDefines.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -316,6 +316,10 @@ RiaDefines::ImportFileType RiaDefines::obtainFileTypeFromFileName( const QString
{
return ImportFileType::ROFF_FILE;
}
else if ( fileName.endsWith( "epc", Qt::CaseInsensitive ) )
{
return ImportFileType::RESQML_FILE;
}
else if ( fileName.endsWith( "SMSPEC", Qt::CaseInsensitive ) )
{
return ImportFileType::ECLIPSE_SUMMARY_FILE;
Expand Down
1 change: 1 addition & 0 deletions ApplicationLibCode/Application/RiaDefines.h
Original file line number Diff line number Diff line change
Expand Up @@ -139,6 +139,7 @@ enum class ImportFileType : uint32_t
EM_H5GRID = 1 << 8,
ROFF_FILE = 1 << 9,
GEOMECH_VTK_FILE = 1 << 10,
RESQML_FILE = 1 << 11,
ECLIPSE_RESULT_GRID = ECLIPSE_GRID_FILE | ECLIPSE_EGRID_FILE,
ANY_ECLIPSE_FILE = ECLIPSE_RESULT_GRID | ECLIPSE_INPUT_FILE | ECLIPSE_SUMMARY_FILE | ROFF_FILE | EM_H5GRID,
ANY_GEOMECH_FILE = GEOMECH_ODB_FILE | GEOMECH_INP_FILE | GEOMECH_VTK_FILE,
Expand Down
101 changes: 101 additions & 0 deletions ApplicationLibCode/Application/Tools/RiaImportEclipseCaseTools.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@
#include "RimMainPlotCollection.h"
#include "RimOilField.h"
#include "RimProject.h"
#include "RimResqmlCase.h"
#include "RimRoffCase.h"
#include "RimSummaryCase.h"
#include "RimSummaryCaseMainCollection.h"
Expand Down Expand Up @@ -662,3 +663,103 @@ bool RiaImportEclipseCaseTools::openEmFilesFromFileNames( const QStringList& fil

return true;
}

//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
std::vector<int> RiaImportEclipseCaseTools::openResqmlCasesFromFileNames( const QStringList& fileNames, bool createDefaultView )
{
CAF_ASSERT( !fileNames.empty() );

RimProject* project = RimProject::current();
if ( !project ) return {};

RimEclipseCaseCollection* analysisModels = project->activeOilField() ? project->activeOilField()->analysisModels() : nullptr;
if ( !analysisModels ) return {};

std::vector<int> resqmlCaseIds;
for ( const auto& fileName : fileNames )
{
auto* resqmlCase = new RimResqmlCase();
project->assignCaseIdToCase( resqmlCase );
resqmlCase->setGridFileName( fileName );

bool gridImportSuccess = resqmlCase->openEclipseGridFile();
if ( !gridImportSuccess )
{
const auto errMsg = "Failed to import grid from file: " + fileName.toStdString();
RiaLogging::error( errMsg.c_str() );
delete resqmlCase;
continue;
}

analysisModels->cases.push_back( resqmlCase );

RimEclipseView* eclipseView = nullptr;
if ( createDefaultView )
{
eclipseView = resqmlCase->createAndAddReservoirView();

eclipseView->cellResult()->setResultType( RiaDefines::ResultCatType::INPUT_PROPERTY );

if ( RiaGuiApplication::isRunning() )
{
if ( RiuMainWindow::instance() ) RiuMainWindow::instance()->selectAsCurrentItem( eclipseView->cellResult() );
}

eclipseView->loadDataAndUpdate();
}

analysisModels->updateConnectedEditors();
resqmlCaseIds.push_back( resqmlCase->caseId() );
}
return resqmlCaseIds;
}

//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
RimResqmlCase* RiaImportEclipseCaseTools::openResqmlCaseFromFileName( const QString& fileName, bool createDefaultView )
{
RimProject* project = RimProject::current();
if ( !project ) return nullptr;

RimEclipseCaseCollection* analysisModels = project->activeOilField() ? project->activeOilField()->analysisModels() : nullptr;
if ( !analysisModels ) return nullptr;

auto* resqmlCase = new RimResqmlCase();
project->assignCaseIdToCase( resqmlCase );
resqmlCase->setGridFileName( fileName );

bool gridImportSuccess = resqmlCase->openEclipseGridFile();
if ( !gridImportSuccess )
{
const auto errMsg = "Failed to import grid from file: " + fileName.toStdString();
RiaLogging::error( errMsg.c_str() );
delete resqmlCase;
return nullptr;
}

analysisModels->cases.push_back( resqmlCase );
analysisModels->updateConnectedEditors();

RimEclipseView* eclipseView = nullptr;
if ( createDefaultView )
{
eclipseView = resqmlCase->createAndAddReservoirView();

eclipseView->cellResult()->setResultType( RiaDefines::ResultCatType::INPUT_PROPERTY );
eclipseView->loadDataAndUpdate();

resqmlCase->updateAllRequiredEditors();
if ( RiaGuiApplication::isRunning() )
{
if ( RiuMainWindow::instance() ) RiuMainWindow::instance()->selectAsCurrentItem( eclipseView->cellResult() );

// Make sure the call to setExpanded is done after the call to selectAsCurrentItem
Riu3DMainWindowTools::setExpanded( eclipseView );
}
}

return resqmlCase;
}
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
class QString;
class RimIdenticalGridCaseGroup;
class RimRoffCase;
class RimResqmlCase;

struct RifReaderSettings;

Expand Down Expand Up @@ -62,6 +63,9 @@ class RiaImportEclipseCaseTools
static std::vector<int> openRoffCasesFromFileNames( const QStringList& fileNames, bool createDefaultView );
static RimRoffCase* openRoffCaseFromFileName( const QString& fileName, bool createDefaultView );

static std::vector<int> openResqmlCasesFromFileNames( const QStringList& fileNames, bool createDefaultView );
static RimResqmlCase* openResqmlCaseFromFileName( const QString& fileName, bool createDefaultView );

static bool openEmFilesFromFileNames( const QStringList& fileNames, bool createDefaultView, std::vector<int>& createdCaseIds );

private:
Expand Down
8 changes: 8 additions & 0 deletions ApplicationLibCode/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -216,6 +216,14 @@ if(RESINSIGHT_FOUND_HDF5)
endif() # MSVC
endif()

#
# RESQML (fesapi)
#
if(RESINSIGHT_FOUND_RESQML)
add_definitions(-DRESINSIGHT_HAVE_RESQML)
list(APPEND RI_PRIVATE_INCLUDES "${CMAKE_SOURCE_DIR}/ThirdParty/fesapi/src")
endif()

#
# OpenTelemetry
#
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ set(SOURCE_GROUP_HEADER_FILES
${CMAKE_CURRENT_LIST_DIR}/RicEclipseShowOnlyFaultFeature.h
${CMAKE_CURRENT_LIST_DIR}/RicRenameCaseFeature.h
${CMAKE_CURRENT_LIST_DIR}/RicImportRoffCaseFeature.h
${CMAKE_CURRENT_LIST_DIR}/RicImportResqmlCaseFeature.h
${CMAKE_CURRENT_LIST_DIR}/RicAddGridCalculationFeature.h
${CMAKE_CURRENT_LIST_DIR}/RicCreateGridCaseEnsemblesFromFilesFeature.h
${CMAKE_CURRENT_LIST_DIR}/RicAddLinkedEclipsePropertyFilterFeature.h
Expand Down Expand Up @@ -47,6 +48,7 @@ set(SOURCE_GROUP_SOURCE_FILES
${CMAKE_CURRENT_LIST_DIR}/RicEclipseShowOnlyFaultFeature.cpp
${CMAKE_CURRENT_LIST_DIR}/RicRenameCaseFeature.cpp
${CMAKE_CURRENT_LIST_DIR}/RicImportRoffCaseFeature.cpp
${CMAKE_CURRENT_LIST_DIR}/RicImportResqmlCaseFeature.cpp
${CMAKE_CURRENT_LIST_DIR}/RicAddGridCalculationFeature.cpp
${CMAKE_CURRENT_LIST_DIR}/RicCreateGridCaseEnsemblesFromFilesFeature.cpp
${CMAKE_CURRENT_LIST_DIR}/RicAddLinkedEclipsePropertyFilterFeature.cpp
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
#include "RimEclipseInputPropertyCollection.h"
#include "RimEclipseResultCase.h"
#include "RimEclipseView.h"
#include "RimResqmlCase.h"
#include "RimRoffCase.h"

#include "Riu3DMainWindowTools.h"
Expand All @@ -50,6 +51,7 @@ bool RicAddEclipseInputPropertyFeature::isCommandEnabled() const
return caf::SelectionManager::instance()->selectedItemOfType<RimEclipseInputCase>() ||
caf::SelectionManager::instance()->selectedItemOfType<RimEclipseResultCase>() ||
caf::SelectionManager::instance()->selectedItemOfType<RimRoffCase>() ||
caf::SelectionManager::instance()->selectedItemOfType<RimResqmlCase>() ||
caf::SelectionManager::instance()->selectedItemOfType<RimEclipseCellColors>() ||
caf::SelectionManager::instance()->selectedItemOfType<RimEclipseView>();
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
/////////////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2024- Equinor 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 "RicImportResqmlCaseFeature.h"

#include <QAction>

CAF_CMD_SOURCE_INIT( RicImportResqmlCaseFeature, "RicImportResqmlCaseFeature" );

//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RicImportResqmlCaseFeature::onActionTriggered( bool isChecked )
{
RicImportGeneralDataFeature::openFileDialog( RiaDefines::ImportFileType::RESQML_FILE );
}

//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RicImportResqmlCaseFeature::setupActionLook( QAction* actionToSetup )
{
actionToSetup->setIcon( QIcon( ":/EclipseInput48x48.png" ) );
actionToSetup->setText( "Import RESQML Case" );
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
/////////////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2024- Equinor 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 "RicImportGeneralDataFeature.h"

//==================================================================================================
///
//==================================================================================================
class RicImportResqmlCaseFeature : public RicImportGeneralDataFeature
{
CAF_CMD_HEADER_INIT;

protected:
void onActionTriggered( bool isChecked ) override;
void setupActionLook( QAction* actionToSetup ) override;
};
48 changes: 48 additions & 0 deletions ApplicationLibCode/Commands/RicImportGeneralDataFeature.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,7 @@ RicImportGeneralDataFeature::OpenCaseResults RicImportGeneralDataFeature::openEc
QStringList eclipseSummaryFiles;
QStringList roffFiles;
QStringList emFiles;
QStringList resqmlFiles;

for ( const QString& fileName : fileNames )
{
Expand All @@ -96,6 +97,10 @@ RicImportGeneralDataFeature::OpenCaseResults RicImportGeneralDataFeature::openEc
{
emFiles.push_back( fileName );
}
else if ( fileType == ImportFileType::RESQML_FILE )
{
resqmlFiles.push_back( fileName );
}
}

OpenCaseResults results;
Expand Down Expand Up @@ -144,6 +149,16 @@ RicImportGeneralDataFeature::OpenCaseResults RicImportGeneralDataFeature::openEc
}
}

if ( !resqmlFiles.empty() )
{
if ( !openResqmlFilesFromFileNames( resqmlFiles, createDefaultView, results.createdCaseIds ) )
{
return OpenCaseResults();
}
results.resqmlFiles = resqmlFiles;
RiaApplication::instance()->setLastUsedDialogDirectory( defaultDirectoryLabel( ImportFileType::RESQML_FILE ), defaultDir );
}

return results;
}

Expand Down Expand Up @@ -275,6 +290,11 @@ QString RicImportGeneralDataFeature::getFilePattern( RiaDefines::ImportFileType
return QString( "Roff File (%1)" ).arg( roffFilePattern );
}

if ( fileType == ImportFileType::RESQML_FILE )
{
return QString( "RESQML EPC File (*.epc)" );
}

return "";
}

Expand Down Expand Up @@ -312,6 +332,10 @@ QStringList RicImportGeneralDataFeature::getEclipseFileNamesWithDialog( RiaDefin
{
filePatternTexts += getFilePattern( ImportFileType::ROFF_FILE );
}
if ( fileType == ImportFileType::RESQML_FILE )
{
filePatternTexts += getFilePattern( ImportFileType::RESQML_FILE );
}

QString fullPattern = filePatternTexts.join( ";;" );

Expand Down Expand Up @@ -568,3 +592,27 @@ bool RicImportGeneralDataFeature::openRoffCaseAndPropertiesFromFileNames( const

return true;
}

//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
bool RicImportGeneralDataFeature::openResqmlFilesFromFileNames( const QStringList& fileNames,
bool createDefaultView,
std::vector<int>& createdCaseIds )
{
if ( fileNames.empty() ) return false;

const size_t initialNumCases = createdCaseIds.size();
auto generatedCaseIds = RiaImportEclipseCaseTools::openResqmlCasesFromFileNames( fileNames, createDefaultView );

for ( int i = 0; i < fileNames.size(); ++i )
{
const auto caseId = generatedCaseIds[static_cast<size_t>( i )];
if ( caseId >= 0 )
{
RiaApplication::instance()->addToRecentFiles( fileNames[i] );
createdCaseIds.push_back( caseId );
}
}
return initialNumCases != createdCaseIds.size();
}
6 changes: 5 additions & 1 deletion ApplicationLibCode/Commands/RicImportGeneralDataFeature.h
Original file line number Diff line number Diff line change
Expand Up @@ -43,12 +43,14 @@ class RicImportGeneralDataFeature : public caf::CmdFeature
QStringList eclipseInputFiles;
QStringList eclipseSummaryFiles;
QStringList roffFiles;
QStringList resqmlFiles;

std::vector<int> createdCaseIds;

operator bool() const
{
return !( eclipseCaseFiles.empty() && eclipseInputFiles.empty() && eclipseSummaryFiles.empty() && roffFiles.empty() );
return !( eclipseCaseFiles.empty() && eclipseInputFiles.empty() && eclipseSummaryFiles.empty() && roffFiles.empty() &&
resqmlFiles.empty() );
}
};

Expand Down Expand Up @@ -85,4 +87,6 @@ class RicImportGeneralDataFeature : public caf::CmdFeature
static bool openRoffFilesFromFileNames( const QStringList& fileNames, bool createDefaultView, std::vector<int>& createdCaseIds );
static bool openRoffCasesFromFileNames( const QStringList& fileNames, bool createDefaultView, std::vector<int>& createdCaseIds );
static bool openRoffCaseAndPropertiesFromFileNames( const QStringList& fileNames, bool createDefaultView, std::vector<int>& createdCaseIds );

static bool openResqmlFilesFromFileNames( const QStringList& fileNames, bool createDefaultView, std::vector<int>& createdCaseIds );
};
Loading
Loading