Skip to content

Commit fd27722

Browse files
committed
RicImportGridAndSummaryEnsembleFeature: Add feature for importing grid and summary ensembles
- Add RicImportGridAndSummaryEnsembleFeature with icon and menu/toolbar registration - Register in main window toolbar, import menu (both windows) - Add feature to plot window Standard toolbar - Wire up post-import view and plot creation - Skip grid/summary ensemble creation when no files of that type are found - Keep focus in plot window when no grid ensembles are created
1 parent 5b07323 commit fd27722

15 files changed

Lines changed: 223 additions & 16 deletions
Lines changed: 19 additions & 0 deletions
Loading

ApplicationExeCode/Resources/ResInsight.qrc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,7 @@
142142
<file>SummaryCases16x16.png</file>
143143
<file>SummaryCurve16x16.png</file>
144144
<file>SummaryCurveFilter16x16.png</file>
145+
<file>GridAndSummaryEnsemble.svg</file>
145146
<file>SummaryEnsemble.svg</file>
146147
<file>SummaryGroup16x16.png</file>
147148
<file>SummaryPlotLight16x16.png</file>

ApplicationLibCode/Commands/CMakeLists_files.cmake

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,8 @@ set(SOURCE_GROUP_HEADER_FILES
101101
${CMAKE_CURRENT_LIST_DIR}/RicCreateContourMapPolygonTools.h
102102
${CMAKE_CURRENT_LIST_DIR}/RicPolygonFromImageDialog.h
103103
${CMAKE_CURRENT_LIST_DIR}/RicCreateSummaryEnsembleFeature.h
104+
${CMAKE_CURRENT_LIST_DIR}/RicImportGridAndSummaryEnsembleDialog.h
105+
${CMAKE_CURRENT_LIST_DIR}/RicImportGridAndSummaryEnsembleFeature.h
104106
${CMAKE_CURRENT_LIST_DIR}/RicHistogramPlotTools.h
105107
${CMAKE_CURRENT_LIST_DIR}/RicCreateGridStatisticsPlotFeature.h
106108
)
@@ -208,6 +210,8 @@ set(SOURCE_GROUP_SOURCE_FILES
208210
${CMAKE_CURRENT_LIST_DIR}/RicCreateContourMapPolygonTools.cpp
209211
${CMAKE_CURRENT_LIST_DIR}/RicPolygonFromImageDialog.cpp
210212
${CMAKE_CURRENT_LIST_DIR}/RicCreateSummaryEnsembleFeature.cpp
213+
${CMAKE_CURRENT_LIST_DIR}/RicImportGridAndSummaryEnsembleDialog.cpp
214+
${CMAKE_CURRENT_LIST_DIR}/RicImportGridAndSummaryEnsembleFeature.cpp
211215
${CMAKE_CURRENT_LIST_DIR}/RicHistogramPlotTools.cpp
212216
${CMAKE_CURRENT_LIST_DIR}/RicCreateGridStatisticsPlotFeature.cpp
213217
)

ApplicationLibCode/Commands/RicImportEnsembleFeature.h

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
#include <QString>
2727

2828
class RimSummaryCase;
29+
class RimSummaryEnsemble;
2930

3031
//==================================================================================================
3132
///
@@ -41,6 +42,12 @@ class RicImportEnsembleFeature : public caf::CmdFeature
4142
RiaDefines::EnsembleGroupingMode groupingMode,
4243
bool isEnsemble = false );
4344

45+
static RimSummaryEnsemble* importSingleEnsembleFileSet( const QStringList& fileNames,
46+
bool useEnsembleNameDialog,
47+
RiaDefines::EnsembleGroupingMode groupingMode,
48+
RiaDefines::FileType fileType,
49+
const QString& defaultEnsembleName = QString() );
50+
4451
private:
4552
void onActionTriggered( bool isChecked ) override;
4653
void setupActionLook( QAction* actionToSetup ) override;
@@ -51,10 +58,4 @@ class RicImportEnsembleFeature : public caf::CmdFeature
5158
RiaDefines::EnsembleGroupingMode groupingMode,
5259
RiaDefines::FileType fileType,
5360
const QString& defaultEnsembleName = QString() );
54-
55-
static RimSummaryEnsemble* importSingleEnsembleFileSet( const QStringList& fileNames,
56-
bool useEnsembleNameDialog,
57-
RiaDefines::EnsembleGroupingMode groupingMode,
58-
RiaDefines::FileType fileType,
59-
const QString& defaultEnsembleName = QString() );
6061
};

ApplicationLibCode/Commands/RicImportGridAndSummaryEnsembleDialog.cpp

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,8 @@
5555
//--------------------------------------------------------------------------------------------------
5656
///
5757
//--------------------------------------------------------------------------------------------------
58-
RicImportGridAndSummaryEnsembleDialogResult RicImportGridAndSummaryEnsembleDialog::runDialog( QWidget* parent )
58+
RicImportGridAndSummaryEnsembleDialogResult
59+
RicImportGridAndSummaryEnsembleDialog::runDialog( QWidget* parent, bool defaultGridChecked, bool defaultSummaryChecked )
5960
{
6061
const QString pathRegistryKey = "RicImportGridAndSummaryEnsembleDialog_path";
6162

@@ -89,6 +90,9 @@ RicImportGridAndSummaryEnsembleDialogResult RicImportGridAndSummaryEnsembleDialo
8990
dialog.m_ensembleGroupingMode->addItem( s );
9091
}
9192

93+
dialog.m_createGridEnsembleCheckBox->setChecked( defaultGridChecked );
94+
dialog.m_createSummaryEnsembleCheckBox->setChecked( defaultSummaryChecked );
95+
9296
dialog.updateEffectiveFilter();
9397
dialog.clearFileList();
9498
dialog.setOkButtonEnabled( false );
@@ -434,9 +438,7 @@ void RicImportGridAndSummaryEnsembleDialog::updateFileListWidget()
434438
auto mode = ensembleGroupingMode();
435439

436440
auto ensembleLabel = []( const QString& name, int gridCount, int summaryCount )
437-
{
438-
return QString( "%1 (%2 grids, %3 summary cases)" ).arg( name ).arg( gridCount ).arg( summaryCount );
439-
};
441+
{ return QString( "%1 (%2 grids, %3 summary cases)" ).arg( name ).arg( gridCount ).arg( summaryCount ); };
440442

441443
if ( mode == RiaDefines::EnsembleGroupingMode::NONE )
442444
{
@@ -547,7 +549,6 @@ RiaDefines::EnsembleGroupingMode RicImportGridAndSummaryEnsembleDialog::ensemble
547549
return RiaDefines::EnsembleGroupingMode::FMU_FOLDER_STRUCTURE;
548550
}
549551

550-
551552
//--------------------------------------------------------------------------------------------------
552553
///
553554
//--------------------------------------------------------------------------------------------------

ApplicationLibCode/Commands/RicImportGridAndSummaryEnsembleDialog.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ class RicImportGridAndSummaryEnsembleDialog : public QDialog
5555
Q_OBJECT
5656

5757
public:
58-
static RicImportGridAndSummaryEnsembleDialogResult runDialog( QWidget* parent );
58+
static RicImportGridAndSummaryEnsembleDialogResult runDialog( QWidget* parent, bool defaultGridChecked, bool defaultSummaryChecked );
5959

6060
private:
6161
explicit RicImportGridAndSummaryEnsembleDialog( QWidget* parent );
Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,126 @@
1+
/////////////////////////////////////////////////////////////////////////////////
2+
//
3+
// Copyright (C) 2026- Equinor ASA
4+
//
5+
// ResInsight is free software: you can redistribute it and/or modify
6+
// it under the terms of the GNU General Public License as published by
7+
// the Free Software Foundation, either version 3 of the License, or
8+
// (at your option) any later version.
9+
//
10+
// ResInsight is distributed in the hope that it will be useful, but WITHOUT
11+
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12+
// FITNESS FOR A PARTICULAR PURPOSE.
13+
//
14+
// See the GNU General Public License at <http://www.gnu.org/licenses/gpl.html>
15+
// for more details.
16+
//
17+
/////////////////////////////////////////////////////////////////////////////////
18+
19+
#include "RicImportGridAndSummaryEnsembleFeature.h"
20+
21+
#include "RiaGuiApplication.h"
22+
#include "Summary/RiaSummaryPlotTools.h"
23+
24+
#include "RicImportGridAndSummaryEnsembleDialog.h"
25+
#include "RicNewViewFeature.h"
26+
27+
#include "EnsembleFileSet/RimEnsembleFileSetTools.h"
28+
#include "Rim3dView.h"
29+
#include "RimReservoirGridEnsemble.h"
30+
#include "RimSummaryEnsemble.h"
31+
#include "RimViewNameConfig.h"
32+
33+
#include "RiuPlotMainWindow.h"
34+
#include "RiuPlotMainWindowTools.h"
35+
36+
#include <QAction>
37+
#include <QIcon>
38+
#include <QSet>
39+
#include <QTimer>
40+
41+
CAF_CMD_SOURCE_INIT( RicImportGridAndSummaryEnsembleFeature, "RicImportGridAndSummaryEnsembleFeature" );
42+
43+
//--------------------------------------------------------------------------------------------------
44+
///
45+
//--------------------------------------------------------------------------------------------------
46+
void RicImportGridAndSummaryEnsembleFeature::onActionTriggered( bool isChecked )
47+
{
48+
QPointer<QWidget> activeWindowBeforeImport = RiaGuiApplication::widgetToUseAsParent();
49+
50+
bool startedFromPlotWindow = ( RiaGuiApplication::activeMainWindow() == RiaGuiApplication::instance()->mainPlotWindow() );
51+
52+
auto result = RicImportGridAndSummaryEnsembleDialog::runDialog( activeWindowBeforeImport, !startedFromPlotWindow, startedFromPlotWindow );
53+
54+
if ( !result.ok ) return;
55+
if ( !result.createGridEnsemble && !result.createSummaryEnsemble ) return;
56+
57+
// Build the union of base paths (extension-stripped) from both lists so every realization
58+
// appears exactly once. findPathPattern requires each realization number to be unique across
59+
// the input; duplicating paths with different extensions breaks the pattern detection.
60+
auto stripExtension = []( const QString& path ) -> QString
61+
{
62+
int dot = path.lastIndexOf( '.' );
63+
return dot != -1 ? path.left( dot ) : path;
64+
};
65+
66+
QStringList strippedPaths;
67+
68+
for ( const auto& f : result.gridFiles )
69+
strippedPaths << stripExtension( f );
70+
for ( const auto& f : result.summaryFiles )
71+
strippedPaths << stripExtension( f );
72+
73+
strippedPaths.removeDuplicates();
74+
75+
if ( strippedPaths.isEmpty() ) return;
76+
77+
auto fileSets = RimEnsembleFileSetTools::createEnsembleFileSets( strippedPaths, result.groupingMode );
78+
if ( fileSets.empty() ) return;
79+
80+
bool gridEnsemblesCreated = false;
81+
if ( result.createGridEnsemble && !result.gridFiles.isEmpty() )
82+
{
83+
auto gridEnsembles = RimEnsembleFileSetTools::createGridEnsemblesFromFileSets( fileSets );
84+
if ( !gridEnsembles.empty() )
85+
{
86+
gridEnsemblesCreated = true;
87+
auto firstEnsemble = gridEnsembles.front();
88+
auto cases = firstEnsemble->cases();
89+
if ( !cases.empty() )
90+
{
91+
auto view = RicNewViewFeature::addReservoirView( cases.front(), nullptr, firstEnsemble->viewCollection() );
92+
if ( view ) view->nameConfig()->setAddCaseName( true );
93+
}
94+
}
95+
}
96+
97+
if ( result.createSummaryEnsemble && !result.summaryFiles.isEmpty() )
98+
{
99+
auto summaryEnsembles = RimEnsembleFileSetTools::createSummaryEnsemblesFromFileSets( fileSets );
100+
for ( auto ensemble : summaryEnsembles )
101+
{
102+
RiaSummaryPlotTools::createAndAppendDefaultSummaryMultiPlot( {}, { ensemble } );
103+
}
104+
if ( !summaryEnsembles.empty() ) RiuPlotMainWindowTools::showPlotMainWindow();
105+
}
106+
107+
if ( gridEnsemblesCreated && activeWindowBeforeImport )
108+
{
109+
QTimer::singleShot( 500,
110+
activeWindowBeforeImport,
111+
[activeWindowBeforeImport]()
112+
{
113+
activeWindowBeforeImport->raise();
114+
activeWindowBeforeImport->activateWindow();
115+
} );
116+
}
117+
}
118+
119+
//--------------------------------------------------------------------------------------------------
120+
///
121+
//--------------------------------------------------------------------------------------------------
122+
void RicImportGridAndSummaryEnsembleFeature::setupActionLook( QAction* actionToSetup )
123+
{
124+
actionToSetup->setIcon( QIcon( ":/GridAndSummaryEnsemble.svg" ) );
125+
actionToSetup->setText( "Grid and Summary Ensemble" );
126+
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
/////////////////////////////////////////////////////////////////////////////////
2+
//
3+
// Copyright (C) 2026- Equinor ASA
4+
//
5+
// ResInsight is free software: you can redistribute it and/or modify
6+
// it under the terms of the GNU General Public License as published by
7+
// the Free Software Foundation, either version 3 of the License, or
8+
// (at your option) any later version.
9+
//
10+
// ResInsight is distributed in the hope that it will be useful, but WITHOUT
11+
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12+
// FITNESS FOR A PARTICULAR PURPOSE.
13+
//
14+
// See the GNU General Public License at <http://www.gnu.org/licenses/gpl.html>
15+
// for more details.
16+
//
17+
/////////////////////////////////////////////////////////////////////////////////
18+
19+
#pragma once
20+
21+
#include "cafCmdFeature.h"
22+
23+
//==================================================================================================
24+
///
25+
//==================================================================================================
26+
class RicImportGridAndSummaryEnsembleFeature : public caf::CmdFeature
27+
{
28+
CAF_CMD_HEADER_INIT;
29+
30+
protected:
31+
void onActionTriggered( bool isChecked ) override;
32+
void setupActionLook( QAction* actionToSetup ) override;
33+
};

ApplicationLibCode/Commands/RicRecursiveFileSearchDialog.cpp

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -770,9 +770,7 @@ void RicRecursiveFileSearchDialog::setCheckedStateChildItems( QStandardItem* par
770770
//--------------------------------------------------------------------------------------------------
771771
///
772772
//--------------------------------------------------------------------------------------------------
773-
void RicRecursiveFileSearchDialog::findItemsMatching( QStandardItem* parentItem,
774-
const QString& substring,
775-
QList<QStandardItem*>& matchingItems )
773+
void RicRecursiveFileSearchDialog::findItemsMatching( QStandardItem* parentItem, const QString& substring, QList<QStandardItem*>& matchingItems )
776774
{
777775
if ( !parentItem ) return;
778776
for ( int i = 0; i < parentItem->rowCount(); ++i )

ApplicationLibCode/ProjectDataModel/EnsembleFileSet/RimEnsembleFileSetTools.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,7 @@ std::vector<RimReservoirGridEnsemble*> createGridEnsemblesFromFileSets( const st
103103
project->assignIdToCaseGroup( ensemble );
104104
eclipseCaseColl->reservoirGridEnsembles.push_back( ensemble );
105105

106+
ensemble->createGridCasesFromEnsembleFileSet();
106107
ensemble->loadDataAndUpdate();
107108
ensembles.push_back( ensemble );
108109
}

0 commit comments

Comments
 (0)