From 41af0915115c4a5384b0cb2be69b1b0d21042791 Mon Sep 17 00:00:00 2001 From: jonjenssen Date: Fri, 21 Mar 2025 20:48:52 +0100 Subject: [PATCH] Change contourmap default name and menu entry Look for formation names in multiple locations Skip realizations with missing formation names, if used --- ...reateGridCaseEnsemblesFromFilesFeature.cpp | 4 +- .../RicNewStatisticsContourMapFeature.cpp | 6 +-- .../ContourMap/RimStatisticsContourMap.cpp | 54 +++++++++++++------ .../Formations/RimFormationTools.cpp | 29 +++++++--- .../Formations/RimFormationTools.h | 5 +- .../RimEclipseCaseEnsemble.cpp | 2 +- .../ProjectDataModel/RimEclipseResultCase.cpp | 4 +- .../ProjectDataModel/RimEclipseView.cpp | 2 + 8 files changed, 72 insertions(+), 34 deletions(-) diff --git a/ApplicationLibCode/Commands/EclipseCommands/RicCreateGridCaseEnsemblesFromFilesFeature.cpp b/ApplicationLibCode/Commands/EclipseCommands/RicCreateGridCaseEnsemblesFromFilesFeature.cpp index 2b6522a0ba..5e58b6b0e7 100644 --- a/ApplicationLibCode/Commands/EclipseCommands/RicCreateGridCaseEnsemblesFromFilesFeature.cpp +++ b/ApplicationLibCode/Commands/EclipseCommands/RicCreateGridCaseEnsemblesFromFilesFeature.cpp @@ -128,8 +128,8 @@ RimEclipseCaseEnsemble* RicCreateGridCaseEnsemblesFromFilesFeature::importSingle rimResultCase->setCaseInfo( caseName, caseFileName ); eclipseCaseEnsemble->addCase( rimResultCase ); - auto folderName = RimFormationTools::formationFolderFromCaseFileName( caseFileName ); - RimFormationNames* formations = RimFormationTools::loadFormationNamesFromFolder( folderName ); + auto folderNames = RimFormationTools::formationFoldersFromCaseFileName( caseFileName ); + RimFormationNames* formations = RimFormationTools::loadFormationNamesFromFolder( folderNames ); if ( formations != nullptr ) rimResultCase->setFormationNames( formations ); } diff --git a/ApplicationLibCode/Commands/RicNewStatisticsContourMapFeature.cpp b/ApplicationLibCode/Commands/RicNewStatisticsContourMapFeature.cpp index d4eafa2537..42f43aef3b 100644 --- a/ApplicationLibCode/Commands/RicNewStatisticsContourMapFeature.cpp +++ b/ApplicationLibCode/Commands/RicNewStatisticsContourMapFeature.cpp @@ -39,7 +39,7 @@ void RicNewStatisticsContourMapFeature::addStatisticsContourMap( RimEclipseCaseE std::vector cases = eclipseCaseEnsemble->cases(); if ( cases.empty() ) return; - RimStatisticsContourMap* statisticsContourMap = new RimStatisticsContourMap; + auto statisticsContourMap = new RimStatisticsContourMap(); statisticsContourMap->setEclipseCase( cases[0] ); eclipseCaseEnsemble->addStatisticsContourMap( statisticsContourMap ); eclipseCaseEnsemble->updateConnectedEditors(); @@ -69,8 +69,8 @@ void RicNewStatisticsContourMapFeature::onActionTriggered( bool isChecked ) //-------------------------------------------------------------------------------------------------- void RicNewStatisticsContourMapFeature::setupActionLook( QAction* actionToSetup ) { - actionToSetup->setText( "New Statistics Contour Map" ); - actionToSetup->setIcon( QIcon( ":/3DView16x16.png" ) ); + actionToSetup->setText( "New Ensemble Contour Map" ); + actionToSetup->setIcon( QIcon( ":/Histogram16x16.png" ) ); } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/ProjectDataModel/ContourMap/RimStatisticsContourMap.cpp b/ApplicationLibCode/ProjectDataModel/ContourMap/RimStatisticsContourMap.cpp index 8620ccf41c..5103f9a0c7 100644 --- a/ApplicationLibCode/ProjectDataModel/ContourMap/RimStatisticsContourMap.cpp +++ b/ApplicationLibCode/ProjectDataModel/ContourMap/RimStatisticsContourMap.cpp @@ -82,7 +82,7 @@ void caf::AppEnum::setUp() //-------------------------------------------------------------------------------------------------- RimStatisticsContourMap::RimStatisticsContourMap() { - CAF_PDM_InitObject( "Statistics Contour Map", ":/Histogram16x16.png" ); + CAF_PDM_InitObject( "Ensemble Contour Map", ":/Histogram16x16.png" ); CAF_PDM_InitField( &m_boundingBoxExpPercent, "BoundingBoxExpPercent", @@ -376,7 +376,7 @@ QList RimStatisticsContourMap::calculateValueOptions( co { if ( formations->formationNamesData() ) { - for ( auto f : formations->formationNamesData()->formationNames() ) + for ( auto& f : formations->formationNamesData()->formationNames() ) { options.push_back( caf::PdmOptionItemInfo( f, f, false ) ); } @@ -559,31 +559,53 @@ void RimStatisticsContourMap::computeStatistics() std::set usedKLayers; auto formationNames = selectedFormations(); + bool formationNamesOk = true; if ( formationNames.size() > 0 ) { - usedKLayers = eCase->activeFormationNames()->formationNamesData()->findKLayers( formationNames ); + if ( auto names = eCase->activeFormationNames() ) + { + if ( auto fData = names->formationNamesData() ) + { + usedKLayers = fData->findKLayers( formationNames ); + } + else + { + formationNamesOk = false; + } + } + else + { + formationNamesOk = false; + } } - contourMapProjection.generateGridMapping( resultAggregation, {}, usedKLayers, selectedPolygons() ); - - if ( m_resultDefinition()->hasDynamicResult() ) + if ( formationNamesOk ) { - std::vector> timeSteps = mapLocalToGlobalTimeSteps( eCase->timeStepDates() ); + contourMapProjection.generateGridMapping( resultAggregation, {}, usedKLayers, selectedPolygons() ); - for ( auto [localTs, globalTs] : timeSteps ) + if ( m_resultDefinition()->hasDynamicResult() ) { - std::vector result = contourMapProjection.generateResults( m_resultDefinition()->eclipseResultAddress(), - resultAggregation, - localTs, - floodSettings ); - timestep_results[globalTs].push_back( result ); + std::vector> timeSteps = mapLocalToGlobalTimeSteps( eCase->timeStepDates() ); + + for ( auto [localTs, globalTs] : timeSteps ) + { + std::vector result = contourMapProjection.generateResults( m_resultDefinition()->eclipseResultAddress(), + resultAggregation, + localTs, + floodSettings ); + timestep_results[globalTs].push_back( result ); + } + } + else + { + std::vector result = + contourMapProjection.generateResults( m_resultDefinition()->eclipseResultAddress(), resultAggregation, 0, floodSettings ); + timestep_results[0].push_back( result ); } } else { - std::vector result = - contourMapProjection.generateResults( m_resultDefinition()->eclipseResultAddress(), resultAggregation, 0, floodSettings ); - timestep_results[0].push_back( result ); + RiaLogging::warning( QString( "Formation names are missing for case %1, skipping case." ).arg( eCase->caseUserDescription() ) ); } } eCase->setReaderSettings( oldSettings ); diff --git a/ApplicationLibCode/ProjectDataModel/Formations/RimFormationTools.cpp b/ApplicationLibCode/ProjectDataModel/Formations/RimFormationTools.cpp index 7f9fb2b136..d10148a7cd 100644 --- a/ApplicationLibCode/ProjectDataModel/Formations/RimFormationTools.cpp +++ b/ApplicationLibCode/ProjectDataModel/Formations/RimFormationTools.cpp @@ -32,32 +32,45 @@ //-------------------------------------------------------------------------------------------------- /// look for formation file two levels up from the egrid file //-------------------------------------------------------------------------------------------------- -QString RimFormationTools::formationFolderFromCaseFileName( const QString caseFileName ) +QStringList RimFormationTools::formationFoldersFromCaseFileName( const QString caseFileName ) { + QStringList folders; + QFileInfo fi( caseFileName ); auto formationFolder = QDir( fi.dir().path() + "/../../" ); - return formationFolder.absolutePath(); + auto rmsFolder = QDir( fi.dir().path() + "/../../rms/output/zone/" ); + + folders.push_back( rmsFolder.absolutePath() ); // rms folder is 1st pri. + folders.push_back( formationFolder.absolutePath() ); + + return folders; } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -RimFormationNames* RimFormationTools::loadFormationNamesFromFolder( const QString folderName ) +RimFormationNames* RimFormationTools::loadFormationNamesFromFolder( const QStringList& folderNames ) { QStringList filters; filters << "*.lyr"; - QStringList fileList = caf::Utils::getFilesInDirectory( folderName, filters, true /*absolute filename*/ ); + QStringList fileList; + + for ( auto& folder : folderNames ) + { + fileList.append( caf::Utils::getFilesInDirectory( folder, filters, true /*absolute filename*/ ) ); + if ( !fileList.isEmpty() ) break; + } + if ( fileList.isEmpty() ) return nullptr; - RimFormationNamesCollection* fomNameColl = new RimFormationNamesCollection(); - + RimFormationNamesCollection* fomNameColl = new RimFormationNamesCollection(); std::vector formationNames = fomNameColl->importFiles( fileList ); if ( formationNames.size() > 1 ) { - RiaLogging::warning( QString( "Multiple formation name files found in ensemble folder %1" ).arg( folderName ) ); + RiaLogging::warning( QString( "Multiple formation name files found in ensemble folders." ) ); } - return formationNames.back(); + return formationNames.front(); } diff --git a/ApplicationLibCode/ProjectDataModel/Formations/RimFormationTools.h b/ApplicationLibCode/ProjectDataModel/Formations/RimFormationTools.h index 08fe8a8516..d30ac4eb0f 100644 --- a/ApplicationLibCode/ProjectDataModel/Formations/RimFormationTools.h +++ b/ApplicationLibCode/ProjectDataModel/Formations/RimFormationTools.h @@ -18,14 +18,15 @@ #pragma once #include +#include class RimFormationNames; class RimFormationTools { public: - static QString formationFolderFromCaseFileName( const QString caseFileName ); - static RimFormationNames* loadFormationNamesFromFolder( const QString folderName ); + static QStringList formationFoldersFromCaseFileName( const QString caseFileName ); + static RimFormationNames* loadFormationNamesFromFolder( const QStringList& folderNames ); private: RimFormationTools(){}; diff --git a/ApplicationLibCode/ProjectDataModel/RimEclipseCaseEnsemble.cpp b/ApplicationLibCode/ProjectDataModel/RimEclipseCaseEnsemble.cpp index 21ef1bca78..ea30836d94 100644 --- a/ApplicationLibCode/ProjectDataModel/RimEclipseCaseEnsemble.cpp +++ b/ApplicationLibCode/ProjectDataModel/RimEclipseCaseEnsemble.cpp @@ -224,7 +224,7 @@ void RimEclipseCaseEnsemble::addWellTargetsGenerator( RimWellTargetCandidatesGen void RimEclipseCaseEnsemble::addStatisticsContourMap( RimStatisticsContourMap* statisticsContourMap ) { m_statisticsContourMaps.push_back( statisticsContourMap ); - statisticsContourMap->setName( QString( "Statistics Contour Map #%1" ).arg( m_statisticsContourMaps.size() ) ); + statisticsContourMap->setName( QString( "Ensemble Contour Map #%1" ).arg( m_statisticsContourMaps.size() ) ); } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/ProjectDataModel/RimEclipseResultCase.cpp b/ApplicationLibCode/ProjectDataModel/RimEclipseResultCase.cpp index 8aff61cd74..9192d8dd88 100644 --- a/ApplicationLibCode/ProjectDataModel/RimEclipseResultCase.cpp +++ b/ApplicationLibCode/ProjectDataModel/RimEclipseResultCase.cpp @@ -123,8 +123,8 @@ void RimEclipseResultCase::initAfterRead() // handle special formations for ensembles if ( firstAncestorOrThisOfType() != nullptr ) { - auto folderName = RimFormationTools::formationFolderFromCaseFileName( m_caseFileName().path() ); - m_activeFormationNames = RimFormationTools::loadFormationNamesFromFolder( folderName ); + auto folderNames = RimFormationTools::formationFoldersFromCaseFileName( m_caseFileName().path() ); + m_activeFormationNames = RimFormationTools::loadFormationNamesFromFolder( folderNames ); } } diff --git a/ApplicationLibCode/ProjectDataModel/RimEclipseView.cpp b/ApplicationLibCode/ProjectDataModel/RimEclipseView.cpp index 7b8f23c6c2..5e1e4e6cbb 100644 --- a/ApplicationLibCode/ProjectDataModel/RimEclipseView.cpp +++ b/ApplicationLibCode/ProjectDataModel/RimEclipseView.cpp @@ -2345,6 +2345,8 @@ void RimEclipseView::setOverridePropertyFilterCollection( RimEclipsePropertyFilt //-------------------------------------------------------------------------------------------------- void RimEclipseView::calculateCurrentTotalCellVisibility( cvf::UByteArray* totalVisibility, int timeStep ) { + if ( !mainGrid() ) return; + size_t cellCount = mainGrid()->totalCellCount(); totalVisibility->resize( cellCount );