#12215 Well target candidates: Adjust user interface for single case.

Fixes #12215.
This commit is contained in:
Kristian Bendiksen
2025-03-19 14:59:41 +01:00
parent 98a2de5bc8
commit 4ccf67beb5
7 changed files with 80 additions and 34 deletions
@@ -18,6 +18,7 @@
#include "RicNewWellTargetCandidatesGeneratorFeature.h"
#include "RimEclipseCase.h"
#include "RimEclipseCaseEnsemble.h"
#include "RimWellTargetCandidatesGenerator.h"
@@ -34,16 +35,24 @@ CAF_CMD_SOURCE_INIT( RicNewWellTargetCandidatesGeneratorFeature, "RicNewWellTarg
//--------------------------------------------------------------------------------------------------
void RicNewWellTargetCandidatesGeneratorFeature::onActionTriggered( bool isChecked )
{
auto ensembles = caf::selectedObjectsByTypeStrict<RimEclipseCaseEnsemble*>();
if ( ensembles.empty() ) return;
if ( auto ensembles = caf::selectedObjectsByTypeStrict<RimEclipseCaseEnsemble*>(); !ensembles.empty() )
{
auto ensemble = ensembles.front();
auto generator = new RimWellTargetCandidatesGenerator();
ensemble->addWellTargetsGenerator( generator );
auto ensemble = ensembles.front();
auto generator = new RimWellTargetCandidatesGenerator();
ensemble->addWellTargetsGenerator( generator );
ensemble->updateConnectedEditors();
RiuMainWindow::instance()->selectAsCurrentItem( generator );
}
else if ( auto eclipseCases = caf::selectedObjectsByTypeStrict<RimEclipseCase*>(); !eclipseCases.empty() )
{
auto eclipseCase = eclipseCases.front();
auto generator = new RimWellTargetCandidatesGenerator();
eclipseCase->addWellTargetsGenerator( generator );
ensemble->updateConnectedEditors();
RiuMainWindow::instance()->selectAsCurrentItem( generator );
eclipseCase->updateConnectedEditors();
RiuMainWindow::instance()->selectAsCurrentItem( generator );
}
}
//--------------------------------------------------------------------------------------------------
@@ -277,6 +277,8 @@ caf::CmdFeatureMenuBuilder RimContextCommandBuilder::commandsFromSelection()
menuBuilder << "RicEclipseCaseNewGroupFeature";
menuBuilder << "Separator";
menuBuilder << "RicCopyReferencesToClipboardFeature";
menuBuilder << "RicNewWellTargetCandidatesGeneratorFeature";
menuBuilder << "Separator";
}
else if ( dynamic_cast<RimGridInfoCollection*>( firstUiItem ) )
@@ -72,6 +72,7 @@
#include "RimWellLogPlotCollection.h"
#include "RimWellPath.h"
#include "RimWellPathCollection.h"
#include "RimWellTargetCandidatesGenerator.h"
#include "cafPdmDocument.h"
#include "cafPdmFieldScriptingCapability.h"
@@ -119,6 +120,8 @@ RimEclipseCase::RimEclipseCase()
CAF_PDM_InitFieldNoDefault( &m_viewCollection, "ViewCollection", "Views" );
m_viewCollection = new RimEclipseViewCollection;
CAF_PDM_InitFieldNoDefault( &m_wellTargetGenerators, "WellTargetGenerators", "Well Target Candidates Generators" );
// Init
m_matrixModelResults = new RimReservoirCellResultsStorage;
@@ -126,7 +129,6 @@ RimEclipseCase::RimEclipseCase()
m_fractureModelResults = new RimReservoirCellResultsStorage;
m_fractureModelResults.uiCapability()->setUiTreeChildrenHidden( true );
setReservoirData( nullptr );
m_readerSettings = RiaPreferencesGrid::current()->readerSettings();
@@ -557,6 +559,8 @@ void RimEclipseCase::defineUiTreeOrdering( caf::PdmUiTreeOrdering& uiTreeOrderin
{
uiTreeOrdering.add( &m_2dIntersectionViewCollection );
}
uiTreeOrdering.add( &m_wellTargetGenerators );
}
else if ( uiConfigName == "MainWindow.DataSources" )
{
@@ -1287,3 +1291,12 @@ std::vector<RimEclipseContourMapView*> RimEclipseCase::contourMapViews() const
return views;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimEclipseCase::addWellTargetsGenerator( RimWellTargetCandidatesGenerator* generator )
{
m_wellTargetGenerators.push_back( generator );
generator->updateResultDefinition();
}
@@ -40,6 +40,7 @@
class QString;
class RimWellTargetCandidatesGenerator;
class RigCaseCellResultsData;
class RigEclipseCaseData;
class RigGridBase;
@@ -130,6 +131,8 @@ public:
void setReaderSettings( RifReaderSettings& readerSettings );
RifReaderSettings readerSettings() const;
void addWellTargetsGenerator( RimWellTargetCandidatesGenerator* generator );
void updateResultAddressCollection();
protected:
@@ -174,6 +177,8 @@ private:
caf::PdmChildField<RimReservoirCellResultsStorage*> m_fractureModelResults;
caf::PdmChildField<RimEclipseViewCollection*> m_viewCollection;
caf::PdmChildArrayField<RimWellTargetCandidatesGenerator*> m_wellTargetGenerators;
caf::PdmField<std::vector<caf::FilePath>> m_filesContainingFaults;
// Obsolete fields:
@@ -118,8 +118,9 @@ RimWellTargetCandidatesGenerator::RimWellTargetCandidatesGenerator()
CAF_PDM_InitField( &m_cellCountJ, "CellCountJ", 100, "Cell Count J" );
CAF_PDM_InitField( &m_cellCountK, "CellCountK", 10, "Cell Count K" );
CAF_PDM_InitField( &m_generateEnsembleStatistics, "GenerateEnsembleStatistics", true, "Generate Ensemble Statistics" );
caf::PdmUiPushButtonEditor::configureEditorLabelHidden( &m_generateEnsembleStatistics );
CAF_PDM_InitField( &m_generateButton, "GenerateButton", true, "Generate" );
caf::PdmUiPushButtonEditor::configureEditorLabelHidden( &m_generateButton );
m_generateButton.xmlCapability()->disableIO();
CAF_PDM_InitFieldNoDefault( &m_ensembleStatisticsCase, "EnsembleStatisticsCase", "Ensemble Statistics Case" );
@@ -134,6 +135,8 @@ RimWellTargetCandidatesGenerator::RimWellTargetCandidatesGenerator()
m_minimumTransmissibility = cvf::UNDEFINED_DOUBLE;
m_maximumTransmissibility = cvf::UNDEFINED_DOUBLE;
setDeletable( true );
}
//--------------------------------------------------------------------------------------------------
@@ -149,11 +152,14 @@ RimWellTargetCandidatesGenerator::~RimWellTargetCandidatesGenerator()
void RimWellTargetCandidatesGenerator::fieldChangedByUi( const caf::PdmFieldHandle* changedField, const QVariant& oldValue, const QVariant& newValue )
{
updateAllBoundaries();
generateCandidates( firstCase() );
if ( changedField == &m_generateEnsembleStatistics )
if ( changedField == &m_generateButton )
{
generateEnsembleStatistics();
auto hasEnsembleParent = firstAncestorOrThisOfType<RimEclipseCaseEnsemble>() != nullptr;
if ( hasEnsembleParent )
generateEnsembleStatistics();
else if ( auto eclipseCase = firstCase() )
generateCandidates( eclipseCase );
}
}
@@ -180,12 +186,9 @@ QList<caf::PdmOptionItemInfo> RimWellTargetCandidatesGenerator::calculateValueOp
//--------------------------------------------------------------------------------------------------
void RimWellTargetCandidatesGenerator::updateAllBoundaries()
{
auto ensemble = firstAncestorOrThisOfType<RimEclipseCaseEnsemble>();
if ( !ensemble ) return;
RimEclipseCase* eclipseCase = firstCase();
if ( !eclipseCase ) return;
if ( ensemble->cases().empty() ) return;
RimEclipseCase* eclipseCase = ensemble->cases().front();
eclipseCase->ensureReservoirCaseIsOpen();
auto resultsData = eclipseCase->results( RiaDefines::PorosityModelType::MATRIX_MODEL );
@@ -285,11 +288,11 @@ void RimWellTargetCandidatesGenerator::defineEditorAttribute( const caf::PdmFiel
}
}
if ( field == &m_generateEnsembleStatistics )
if ( field == &m_generateButton )
{
if ( auto attrib = dynamic_cast<caf::PdmUiPushButtonEditorAttribute*>( attribute ) )
{
attrib->m_buttonText = "Create Ensemble Statistics";
attrib->m_buttonText = "Generate";
}
}
}
@@ -368,16 +371,23 @@ void RimWellTargetCandidatesGenerator::defineUiOrdering( QString uiConfigName, c
caf::PdmUiGroup* resultDefinitionGroup = uiOrdering.addNewGroup( "Cluster Filter" );
m_resultDefinition->uiOrdering( uiConfigName, *resultDefinitionGroup );
caf::PdmUiGroup* ensembleGridGroup = uiOrdering.addNewGroup( "Ensemble Statistics Grid" );
ensembleGridGroup->add( &m_cellCountI );
ensembleGridGroup->add( &m_cellCountJ );
ensembleGridGroup->add( &m_cellCountK );
auto hasEnsembleParent = firstAncestorOrThisOfType<RimEclipseCaseEnsemble>() != nullptr;
if ( hasEnsembleParent )
{
caf::PdmUiGroup* ensembleGridGroup = uiOrdering.addNewGroup( "Ensemble Statistics Grid" );
ensembleGridGroup->add( &m_cellCountI );
ensembleGridGroup->add( &m_cellCountJ );
ensembleGridGroup->add( &m_cellCountK );
}
caf::PdmUiGroup* advancedGroup = uiOrdering.addNewGroup( "Advanced" );
advancedGroup->add( &m_maxIterations );
advancedGroup->add( &m_maxClusters );
uiOrdering.add( &m_generateEnsembleStatistics );
uiOrdering.add( &m_generateButton );
uiOrdering.skipRemainingFields();
if ( m_minimumVolume == cvf::UNDEFINED_DOUBLE || m_maximumVolume == cvf::UNDEFINED_DOUBLE )
{
@@ -405,8 +415,10 @@ RigWellTargetCandidatesGenerator::ClusteringLimits RimWellTargetCandidatesGenera
RimEclipseCase* RimWellTargetCandidatesGenerator::firstCase() const
{
auto ensemble = firstAncestorOrThisOfType<RimEclipseCaseEnsemble>();
if ( !ensemble || ensemble->cases().empty() ) return nullptr;
return ensemble->cases()[0];
if ( ensemble && !ensemble->cases().empty() )
return ensemble->cases()[0];
else
return firstAncestorOrThisOfType<RimEclipseCase>();
}
//--------------------------------------------------------------------------------------------------
@@ -81,7 +81,7 @@ private:
caf::PdmField<int> m_cellCountJ;
caf::PdmField<int> m_cellCountK;
caf::PdmField<bool> m_generateEnsembleStatistics;
caf::PdmField<bool> m_generateButton;
caf::PdmChildField<RimEclipseCase*> m_ensembleStatisticsCase;
@@ -673,13 +673,18 @@ std::vector<RigWellTargetCandidatesGenerator::ClusterStatistics>
const std::vector<double>& porvSoilAndSgas = resultsData->cellScalarResults( porvSoilAndSgasAddress, timeStepIdx );
RigEclipseResultAddress fipOilAddress( RiaDefines::ResultCatType::DYNAMIC_NATIVE, "FIPOIL" );
resultsData->ensureKnownResultLoaded( fipOilAddress );
const std::vector<double>& fipOil = resultsData->cellScalarResults( fipOilAddress, timeStepIdx );
std::vector<double> fipOil;
if ( resultsData->ensureKnownResultLoaded( fipOilAddress ) )
{
fipOil = resultsData->cellScalarResults( fipOilAddress, timeStepIdx );
}
RigEclipseResultAddress fipGasAddress( RiaDefines::ResultCatType::DYNAMIC_NATIVE, "FIPGAS" );
resultsData->ensureKnownResultLoaded( fipGasAddress );
const std::vector<double>& fipGas = resultsData->cellScalarResults( fipGasAddress, timeStepIdx );
std::vector<double> fipGas;
if ( resultsData->ensureKnownResultLoaded( fipGasAddress ) )
{
fipGas = resultsData->cellScalarResults( fipGasAddress, timeStepIdx );
}
RigEclipseResultAddress clusterAddress( RiaDefines::ResultCatType::GENERATED, clusterResultName );
resultsData->ensureKnownResultLoaded( clusterAddress );
const std::vector<double>& clusterIds = resultsData->cellScalarResults( clusterAddress, 0 );