Improve reload and replace of cases

* Move code to from features to helper classes
* Ask user if replace case should also happen for the associated grid or summary file
This commit is contained in:
Magne Sjaastad authored and GitHub committed 2024-01-25 10:41:57 +01:00
1 parent cd0a56c924
commit 6922ba22b0
22 files changed
+299 -308

No files matched your search

@@ -215,7 +215,7 @@ void RiaSummaryTools::getSummaryCasesAndAddressesForCalculation( int
for ( RimUserDefinedCalculationVariable* v : calculation->allVariables() ) for ( RimUserDefinedCalculationVariable* v : calculation->allVariables() )
{ {
RimSummaryCalculationVariable* scv = dynamic_cast<RimSummaryCalculationVariable*>( v ); auto* scv = dynamic_cast<RimSummaryCalculationVariable*>( v );
if ( scv ) if ( scv )
{ {
cases.push_back( scv->summaryCase() ); cases.push_back( scv->summaryCase() );
@@ -328,3 +328,68 @@ void RiaSummaryTools::copyCurveAxisData( RimSummaryCurve& curve, const RimSummar
curve.setLeftOrRightAxisY( otherCurve.axisY() ); curve.setLeftOrRightAxisY( otherCurve.axisY() );
} }
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RiaSummaryTools::updateRequiredCalculatedCurves( RimSummaryCase* sourceSummaryCase )
{
RimSummaryCalculationCollection* calcColl = RimProject::current()->calculationCollection();
for ( RimUserDefinedCalculation* summaryCalculation : calcColl->calculations() )
{
bool needsUpdate = RiaSummaryTools::isCalculationRequired( summaryCalculation, sourceSummaryCase );
if ( needsUpdate )
{
summaryCalculation->parseExpression();
summaryCalculation->calculate();
summaryCalculation->updateDependentObjects();
}
}
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
bool RiaSummaryTools::isCalculationRequired( const RimUserDefinedCalculation* summaryCalculation, const RimSummaryCase* summaryCase )
{
std::vector<RimUserDefinedCalculationVariable*> variables = summaryCalculation->allVariables();
for ( RimUserDefinedCalculationVariable* variable : variables )
{
if ( auto* summaryVariable = dynamic_cast<RimSummaryCalculationVariable*>( variable ) )
{
return summaryVariable->summaryCase() == summaryCase;
}
}
return false;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RiaSummaryTools::reloadSummaryCase( RimSummaryCase* summaryCase )
{
if ( !summaryCase ) return;
summaryCase->updateAutoShortName();
summaryCase->createSummaryReaderInterface();
summaryCase->createRftReaderInterface();
summaryCase->refreshMetaData();
RiaSummaryTools::updateRequiredCalculatedCurves( summaryCase );
RimSummaryMultiPlotCollection* summaryPlotColl = RiaSummaryTools::summaryMultiPlotCollection();
for ( RimSummaryMultiPlot* multiPlot : summaryPlotColl->multiPlots() )
{
for ( RimSummaryPlot* summaryPlot : multiPlot->summaryPlots() )
{
summaryPlot->loadDataAndUpdate();
// Consider to make the zoom optional
summaryPlot->zoomAll();
}
multiPlot->updatePlotTitles();
}
}
@@ -25,6 +25,7 @@
#include <vector> #include <vector>
class RifEclipseSummaryAddress;
class RimSummaryPlot; class RimSummaryPlot;
class RimSummaryMultiPlot; class RimSummaryMultiPlot;
class RimSummaryMultiPlotCollection; class RimSummaryMultiPlotCollection;
@@ -35,8 +36,7 @@ class RimSummaryTable;
class RimSummaryTableCollection; class RimSummaryTableCollection;
class RimObservedDataCollection; class RimObservedDataCollection;
class RimSummaryCurve; class RimSummaryCurve;
class RimUserDefinedCalculation;
class RifEclipseSummaryAddress;
class QStringList; class QStringList;
@@ -85,4 +85,10 @@ public:
static void copyCurveDataSources( RimSummaryCurve& curve, const RimSummaryCurve& otherCurve ); static void copyCurveDataSources( RimSummaryCurve& curve, const RimSummaryCurve& otherCurve );
static void copyCurveAxisData( RimSummaryCurve& curve, const RimSummaryCurve& otherCurve ); static void copyCurveAxisData( RimSummaryCurve& curve, const RimSummaryCurve& otherCurve );
static void reloadSummaryCase( RimSummaryCase* summaryCase );
private:
static void updateRequiredCalculatedCurves( RimSummaryCase* sourceSummaryCase );
static bool isCalculationRequired( const RimUserDefinedCalculation* summaryCalculation, const RimSummaryCase* summaryCase );
}; };
@@ -34,12 +34,12 @@
#include "RimFractureTemplate.h" #include "RimFractureTemplate.h"
#include "RimObservedEclipseUserData.h" #include "RimObservedEclipseUserData.h"
#include "RimProject.h" #include "RimProject.h"
#include "RimReloadCaseTools.h"
#include "RimSimWellFracture.h" #include "RimSimWellFracture.h"
#include "RimSimWellFractureCollection.h" #include "RimSimWellFractureCollection.h"
#include "RimSimWellInView.h" #include "RimSimWellInView.h"
#include "RimStimPlanFractureTemplate.h" #include "RimStimPlanFractureTemplate.h"
#include "RimSummaryCase.h" #include "RimSummaryCase.h"
#include "RimSummaryCaseMainCollection.h"
#include "RimWellPath.h" #include "RimWellPath.h"
#include "RimWellPathCompletions.h" #include "RimWellPathCompletions.h"
#include "RimWellPathFracture.h" #include "RimWellPathFracture.h"
@@ -449,31 +449,27 @@ void RicExportFractureCompletionsImpl::getWellPressuresAndInitialProductionTimeS
currentDate = caseTimeSteps.back(); currentDate = caseTimeSteps.back();
} }
RifEclipseSummaryAddress wbhpPressureAddress = RifEclipseSummaryAddress::wellAddress( "WBHP", wellPathName.toStdString() ); RifEclipseSummaryAddress wbhpPressureAddress = RifEclipseSummaryAddress::wellAddress( "WBHP", wellPathName.toStdString() );
RimSummaryCaseMainCollection* mainCollection = RiaSummaryTools::summaryCaseMainCollection();
if ( mainCollection )
{
RimSummaryCase* summaryCase = mainCollection->findSummaryCaseFromEclipseResultCase( resultCase );
if ( summaryCase && summaryCase->summaryReader() ) auto summaryCase = RimReloadCaseTools::findSummaryCaseFromEclipseResultCase( resultCase );
if ( summaryCase && summaryCase->summaryReader() )
{
auto [isOk, values] = summaryCase->summaryReader()->values( wbhpPressureAddress );
if ( isOk )
{ {
auto [isOk, values] = summaryCase->summaryReader()->values( wbhpPressureAddress ); std::vector<time_t> summaryTimeSteps = summaryCase->summaryReader()->timeSteps( wbhpPressureAddress );
if ( isOk ) CVF_ASSERT( values.size() == summaryTimeSteps.size() );
for ( size_t i = 0; i < summaryTimeSteps.size(); ++i )
{ {
std::vector<time_t> summaryTimeSteps = summaryCase->summaryReader()->timeSteps( wbhpPressureAddress ); QDateTime summaryDate = RiaQDateTimeTools::fromTime_t( summaryTimeSteps[i] );
CVF_ASSERT( values.size() == summaryTimeSteps.size() ); if ( initialProductionDate.isNull() && values[i] > 0.0 )
for ( size_t i = 0; i < summaryTimeSteps.size(); ++i )
{ {
QDateTime summaryDate = RiaQDateTimeTools::fromTime_t( summaryTimeSteps[i] ); initialProductionDate = summaryDate;
if ( initialProductionDate.isNull() && values[i] > 0.0 ) *initialWellPressure = values[i];
{ }
initialProductionDate = summaryDate; if ( summaryDate <= currentDate )
*initialWellPressure = values[i]; {
} *currentWellPressure = values[i];
if ( summaryDate <= currentDate )
{
*currentWellPressure = values[i];
}
} }
} }
} }
@@ -41,7 +41,7 @@ void RicDeleteTemporaryLgrsFeature::deleteAllTemporaryLgrs( RimEclipseCase* ecli
if ( eclipseCase ) if ( eclipseCase )
{ {
RimReloadCaseTools::reloadAllEclipseGridData( eclipseCase ); RimReloadCaseTools::reloadEclipseGrid( eclipseCase );
} }
} }
@@ -18,64 +18,26 @@
#include "RicImportGridModelFromSummaryCaseFeature.h" #include "RicImportGridModelFromSummaryCaseFeature.h"
#include "ApplicationCommands/RicShowMainWindowFeature.h"
#include "RiaEclipseFileNameTools.h"
#include "RiaImportEclipseCaseTools.h" #include "RiaImportEclipseCaseTools.h"
#include "RiaLogging.h"
#include "RimEclipseCase.h" #include "RimEclipseCase.h"
#include "RimFileSummaryCase.h" #include "RimFileSummaryCase.h"
#include "RimGridView.h" #include "RimReloadCaseTools.h"
#include "RimProject.h"
#include "Riu3DMainWindowTools.h"
#include "cafSelectionManager.h" #include "cafSelectionManager.h"
#include <QAction> #include <QAction>
#include <QFileInfo>
CAF_CMD_SOURCE_INIT( RicImportGridModelFromSummaryCaseFeature, "RicImportGridModelFromSummaryCaseFeature" ); CAF_CMD_SOURCE_INIT( RicImportGridModelFromSummaryCaseFeature, "RicImportGridModelFromSummaryCaseFeature" );
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
bool RicImportGridModelFromSummaryCaseFeature::openOrImportGridModelFromSummaryCase( const RimFileSummaryCase* summaryCase )
{
if ( !summaryCase ) return false;
if ( findAndActivateFirstView( summaryCase ) ) return true;
QString summaryFileName = summaryCase->summaryHeaderFilename();
RiaEclipseFileNameTools fileHelper( summaryFileName );
auto candidateGridFileName = fileHelper.findRelatedGridFile();
if ( QFileInfo::exists( candidateGridFileName ) )
{
bool createView = true;
auto id = RiaImportEclipseCaseTools::openEclipseCaseFromFile( candidateGridFileName, createView );
if ( id > -1 )
{
RiaLogging::info( QString( "Imported %1" ).arg( candidateGridFileName ) );
return true;
}
}
RiaLogging::info( QString( "No grid case found based on summary file %1" ).arg( summaryFileName ) );
return false;
}
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
void RicImportGridModelFromSummaryCaseFeature::onActionTriggered( bool isChecked ) void RicImportGridModelFromSummaryCaseFeature::onActionTriggered( bool isChecked )
{ {
RimFileSummaryCase* summaryCase = caf::SelectionManager::instance()->selectedItemOfType<RimFileSummaryCase>(); auto* summaryCase = caf::SelectionManager::instance()->selectedItemOfType<RimFileSummaryCase>();
openOrImportGridModelFromSummaryCase( summaryCase ); RimReloadCaseTools::openOrImportGridModelFromSummaryCase( summaryCase );
} }
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
@@ -85,13 +47,13 @@ void RicImportGridModelFromSummaryCaseFeature::setupActionLook( QAction* actionT
{ {
actionToSetup->setIcon( QIcon( ":/3DWindow.svg" ) ); actionToSetup->setIcon( QIcon( ":/3DWindow.svg" ) );
RimFileSummaryCase* summaryCase = caf::SelectionManager::instance()->selectedItemOfType<RimFileSummaryCase>(); auto* summaryCase = caf::SelectionManager::instance()->selectedItemOfType<RimFileSummaryCase>();
QString summaryCaseName; QString summaryCaseName;
if ( summaryCase ) summaryCaseName = summaryCase->caseName(); if ( summaryCase ) summaryCaseName = summaryCase->caseName();
QString txt; QString txt;
auto gridCase = gridModelFromSummaryCase( summaryCase ); auto gridCase = RimReloadCaseTools::gridModelFromSummaryCase( summaryCase );
if ( gridCase ) if ( gridCase )
{ {
txt = "Open Grid Model View"; txt = "Open Grid Model View";
@@ -108,44 +70,3 @@ void RicImportGridModelFromSummaryCaseFeature::setupActionLook( QAction* actionT
actionToSetup->setText( txt ); actionToSetup->setText( txt );
} }
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
bool RicImportGridModelFromSummaryCaseFeature::findAndActivateFirstView( const RimFileSummaryCase* summaryCase )
{
auto gridCase = gridModelFromSummaryCase( summaryCase );
if ( gridCase )
{
if ( !gridCase->gridViews().empty() )
{
RicShowMainWindowFeature::showMainWindow();
Riu3DMainWindowTools::selectAsCurrentItem( gridCase->gridViews().front() );
return true;
}
}
return false;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
RimEclipseCase* RicImportGridModelFromSummaryCaseFeature::gridModelFromSummaryCase( const RimSummaryCase* summaryCase )
{
if ( summaryCase )
{
QString summaryFileName = summaryCase->summaryHeaderFilename();
RiaEclipseFileNameTools fileHelper( summaryFileName );
auto candidateGridFileName = fileHelper.findRelatedGridFile();
RimProject* project = RimProject::current();
auto gridCase = project->eclipseCaseFromGridFileName( candidateGridFileName );
return gridCase;
}
return nullptr;
}
@@ -31,13 +31,7 @@ class RicImportGridModelFromSummaryCaseFeature : public caf::CmdFeature
{ {
CAF_CMD_HEADER_INIT; CAF_CMD_HEADER_INIT;
public:
static bool openOrImportGridModelFromSummaryCase( const RimFileSummaryCase* summaryCase );
static RimEclipseCase* gridModelFromSummaryCase( const RimSummaryCase* summaryCase );
protected: protected:
void onActionTriggered( bool isChecked ) override; void onActionTriggered( bool isChecked ) override;
void setupActionLook( QAction* actionToSetup ) override; void setupActionLook( QAction* actionToSetup ) override;
static bool findAndActivateFirstView( const RimFileSummaryCase* summaryCase );
}; };
@@ -18,10 +18,9 @@
#include "RicImportGridModelFromSummaryCurveFeature.h" #include "RicImportGridModelFromSummaryCurveFeature.h"
#include "RicImportGridModelFromSummaryCaseFeature.h"
#include "RimFileSummaryCase.h" #include "RimFileSummaryCase.h"
#include "RimProject.h" #include "RimProject.h"
#include "RimReloadCaseTools.h"
#include "cafSelectionManager.h" #include "cafSelectionManager.h"
@@ -44,11 +43,9 @@ void RicImportGridModelFromSummaryCurveFeature::onActionTriggered( bool isChecke
{ {
if ( sumCase->caseId() == summaryCaseId ) if ( sumCase->caseId() == summaryCaseId )
{ {
auto fileSummaryCase = dynamic_cast<RimFileSummaryCase*>( sumCase ); if ( auto fileSummaryCase = dynamic_cast<RimFileSummaryCase*>( sumCase ) )
if ( fileSummaryCase )
{ {
RicImportGridModelFromSummaryCaseFeature::openOrImportGridModelFromSummaryCase( fileSummaryCase ); RimReloadCaseTools::openOrImportGridModelFromSummaryCase( fileSummaryCase );
return; return;
} }
@@ -70,7 +70,7 @@ void RicReloadCaseFeature::onActionTriggered( bool isChecked )
timeStepFilter[0]->clearFilteredTimeSteps(); timeStepFilter[0]->clearFilteredTimeSteps();
} }
RimReloadCaseTools::reloadAllEclipseData( selectedCase ); RimReloadCaseTools::reloadEclipseGridAndSummary( selectedCase );
selectedCase->updateConnectedEditors(); selectedCase->updateConnectedEditors();
} }
} }
@@ -20,17 +20,12 @@
#include "RiaLogging.h" #include "RiaLogging.h"
#include "RiaSummaryTools.h" #include "RiaSummaryTools.h"
#include "RicReplaceSummaryCaseFeature.h"
#include "RimMainPlotCollection.h"
#include "RimObservedDataCollection.h" #include "RimObservedDataCollection.h"
#include "RimObservedSummaryData.h" #include "RimObservedSummaryData.h"
#include "RimSummaryCase.h" #include "RimSummaryCase.h"
#include "RimSummaryCaseCollection.h" #include "RimSummaryCaseCollection.h"
#include "RimSummaryCaseMainCollection.h" #include "RimSummaryCaseMainCollection.h"
#include "RimSummaryMultiPlot.h"
#include "RimSummaryMultiPlotCollection.h"
#include "RimSummaryPlot.h"
#include "cafPdmObject.h" #include "cafPdmObject.h"
#include "cafSelectionManager.h" #include "cafSelectionManager.h"
@@ -39,18 +34,6 @@
CAF_CMD_SOURCE_INIT( RicReloadSummaryCaseFeature, "RicReloadSummaryCaseFeature" ); CAF_CMD_SOURCE_INIT( RicReloadSummaryCaseFeature, "RicReloadSummaryCaseFeature" );
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RicReloadSummaryCaseFeature::reloadSummaryCase( RimSummaryCase* summaryCase )
{
summaryCase->createSummaryReaderInterface();
summaryCase->createRftReaderInterface();
summaryCase->refreshMetaData();
RicReplaceSummaryCaseFeature::updateRequredCalculatedCurves( summaryCase );
}
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
@@ -69,12 +52,10 @@ void RicReloadSummaryCaseFeature::onActionTriggered( bool isChecked )
std::vector<RimSummaryCase*> caseSelection = selectedSummaryCases(); std::vector<RimSummaryCase*> caseSelection = selectedSummaryCases();
for ( RimSummaryCase* summaryCase : caseSelection ) for ( RimSummaryCase* summaryCase : caseSelection )
{ {
reloadSummaryCase( summaryCase ); RiaSummaryTools::reloadSummaryCase( summaryCase );
RiaLogging::info( QString( "Reloaded data for %1" ).arg( summaryCase->summaryHeaderFilename() ) ); RiaLogging::info( QString( "Reloaded data for %1" ).arg( summaryCase->summaryHeaderFilename() ) );
} }
RimMainPlotCollection::current()->loadDataAndUpdateAllPlots();
} }
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
@@ -28,9 +28,6 @@ class RicReloadSummaryCaseFeature : public caf::CmdFeature
{ {
CAF_CMD_HEADER_INIT; CAF_CMD_HEADER_INIT;
public:
static void reloadSummaryCase( RimSummaryCase* summaryCase );
protected: protected:
bool isCommandEnabled() const override; bool isCommandEnabled() const override;
void onActionTriggered( bool isChecked ) override; void onActionTriggered( bool isChecked ) override;
@@ -19,6 +19,7 @@
#include "RicReplaceCaseFeature.h" #include "RicReplaceCaseFeature.h"
#include "RiaEclipseFileNameTools.h"
#include "RiaGuiApplication.h" #include "RiaGuiApplication.h"
#include "RiaSummaryTools.h" #include "RiaSummaryTools.h"
@@ -41,6 +42,7 @@
#include <QAction> #include <QAction>
#include <QFileInfo> #include <QFileInfo>
#include <QMessageBox>
CAF_CMD_SOURCE_INIT( RicReplaceCaseFeature, "RicReplaceCaseFeature" ); CAF_CMD_SOURCE_INIT( RicReplaceCaseFeature, "RicReplaceCaseFeature" );
@@ -67,54 +69,54 @@ bool RicReplaceCaseFeature::isCommandEnabled() const
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
void RicReplaceCaseFeature::onActionTriggered( bool isChecked ) void RicReplaceCaseFeature::onActionTriggered( bool isChecked )
{ {
std::vector<RimEclipseResultCase*> selectedEclipseCases; auto eclipseResultCase = caf::SelectionManager::instance()->selectedItemOfType<RimEclipseResultCase>();
caf::SelectionManager::instance()->objectsByType( &selectedEclipseCases ); if ( !eclipseResultCase ) return;
auto summaryCase = RimReloadCaseTools::findSummaryCaseFromEclipseResultCase( eclipseResultCase );
RiaGuiApplication::clearAllSelections(); RiaGuiApplication::clearAllSelections();
const QStringList fileNames = RicImportGeneralDataFeature::getEclipseFileNamesWithDialog( RiaDefines::ImportFileType::ECLIPSE_RESULT_GRID ); const QStringList fileNames = RicImportGeneralDataFeature::getEclipseFileNamesWithDialog( RiaDefines::ImportFileType::ECLIPSE_RESULT_GRID );
if ( fileNames.isEmpty() ) return; if ( fileNames.isEmpty() ) return;
const QString fileName = fileNames[0]; const auto& fileName = fileNames.front();
for ( RimEclipseResultCase* selectedCase : selectedEclipseCases ) eclipseResultCase->setGridFileName( fileName );
eclipseResultCase->reloadEclipseGridFile();
std::vector<RimTimeStepFilter*> timeStepFilter = eclipseResultCase->descendantsIncludingThisOfType<RimTimeStepFilter>();
if ( timeStepFilter.size() == 1 )
{ {
selectedCase->setGridFileName( fileName ); timeStepFilter[0]->clearFilteredTimeSteps();
selectedCase->reloadEclipseGridFile(); }
std::vector<RimTimeStepFilter*> timeStepFilter = selectedCase->descendantsIncludingThisOfType<RimTimeStepFilter>(); RimReloadCaseTools::reloadEclipseGrid( eclipseResultCase );
if ( timeStepFilter.size() == 1 ) eclipseResultCase->updateConnectedEditors();
// Use the file base name as case user description
QFileInfo fileInfoNew( fileName );
eclipseResultCase->setCaseUserDescription( fileInfoNew.baseName() );
RiaEclipseFileNameTools helper( fileName );
auto summaryFileNames = helper.findSummaryFileCandidates();
if ( summaryCase && !summaryFileNames.empty() )
{
QMessageBox msgBox;
msgBox.setIcon( QMessageBox::Question );
QString questionText;
questionText = QString(
"Found an open summary case for the same reservoir model.\n\nDo you want to replace the file name for the summary case?" );
msgBox.setText( questionText );
msgBox.setStandardButtons( QMessageBox::Yes | QMessageBox::No );
int ret = msgBox.exec();
if ( ret == QMessageBox::Yes )
{ {
timeStepFilter[0]->clearFilteredTimeSteps(); summaryCase->setSummaryHeaderFileName( summaryFileNames.front() );
}
RimReloadCaseTools::reloadAllEclipseData( selectedCase ); RiaSummaryTools::reloadSummaryCase( summaryCase );
selectedCase->updateConnectedEditors();
// Use the file base name as case user description
QFileInfo fi( fileName );
selectedCase->setCaseUserDescription( fi.baseName() );
// Find and update attached grid summary cases.
RimSummaryCaseMainCollection* sumCaseColl = RiaSummaryTools::summaryCaseMainCollection();
if ( sumCaseColl )
{
auto summaryCase = sumCaseColl->findSummaryCaseFromEclipseResultCase( selectedCase );
if ( summaryCase )
{
summaryCase->updateAutoShortName();
summaryCase->createSummaryReaderInterface();
summaryCase->createRftReaderInterface();
RimSummaryMultiPlotCollection* summaryPlotColl = RiaSummaryTools::summaryMultiPlotCollection();
for ( RimSummaryMultiPlot* multiPlot : summaryPlotColl->multiPlots() )
{
for ( RimSummaryPlot* summaryPlot : multiPlot->summaryPlots() )
{
summaryPlot->loadDataAndUpdate();
}
}
}
} }
} }
} }
@@ -18,57 +18,31 @@
#include "RicReplaceSummaryCaseFeature.h" #include "RicReplaceSummaryCaseFeature.h"
#include "RiaEclipseFileNameTools.h"
#include "RiaLogging.h" #include "RiaLogging.h"
#include "RiaSummaryTools.h" #include "RiaSummaryTools.h"
#include "RicImportGeneralDataFeature.h" #include "RicImportGeneralDataFeature.h"
#include "RimEclipseCase.h"
#include "RimFileSummaryCase.h" #include "RimFileSummaryCase.h"
#include "RimProject.h" #include "RimReloadCaseTools.h"
#include "RimSummaryAddress.h"
#include "RimSummaryCalculation.h"
#include "RimSummaryCalculationCollection.h"
#include "RimSummaryCalculationVariable.h"
#include "RimSummaryCase.h"
#include "RimSummaryCaseCollection.h"
#include "RimSummaryCaseMainCollection.h"
#include "RimSummaryCurve.h"
#include "RimSummaryMultiPlot.h"
#include "RimSummaryMultiPlotCollection.h"
#include "RimSummaryPlot.h"
#include "cafPdmObject.h" #include "cafPdmObject.h"
#include "cafSelectionManager.h" #include "cafSelectionManager.h"
#include <QAction> #include <QAction>
#include <QFileInfo>
#include <QMessageBox>
CAF_CMD_SOURCE_INIT( RicReplaceSummaryCaseFeature, "RicReplaceSummaryCaseFeature" ); CAF_CMD_SOURCE_INIT( RicReplaceSummaryCaseFeature, "RicReplaceSummaryCaseFeature" );
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RicReplaceSummaryCaseFeature::updateRequredCalculatedCurves( RimSummaryCase* sourceSummaryCase )
{
RimSummaryCalculationCollection* calcColl = RimProject::current()->calculationCollection();
for ( RimUserDefinedCalculation* summaryCalculation : calcColl->calculations() )
{
bool needsUpdate = RicReplaceSummaryCaseFeature::checkIfCalculationNeedsUpdate( summaryCalculation, sourceSummaryCase );
if ( needsUpdate )
{
summaryCalculation->parseExpression();
summaryCalculation->calculate();
summaryCalculation->updateDependentObjects();
}
}
}
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
bool RicReplaceSummaryCaseFeature::isCommandEnabled() const bool RicReplaceSummaryCaseFeature::isCommandEnabled() const
{ {
RimSummaryCase* rimSummaryCase = caf::SelectionManager::instance()->selectedItemOfType<RimFileSummaryCase>(); auto rimSummaryCase = caf::SelectionManager::instance()->selectedItemOfType<RimFileSummaryCase>();
return rimSummaryCase != nullptr; return rimSummaryCase != nullptr;
} }
@@ -77,44 +51,48 @@ bool RicReplaceSummaryCaseFeature::isCommandEnabled() const
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
void RicReplaceSummaryCaseFeature::onActionTriggered( bool isChecked ) void RicReplaceSummaryCaseFeature::onActionTriggered( bool isChecked )
{ {
RimFileSummaryCase* summaryCase = caf::SelectionManager::instance()->selectedItemOfType<RimFileSummaryCase>(); auto* summaryCase = caf::SelectionManager::instance()->selectedItemOfType<RimFileSummaryCase>();
if ( !summaryCase ) return; if ( !summaryCase ) return;
const QStringList fileNames = const QStringList fileNames =
RicImportGeneralDataFeature::getEclipseFileNamesWithDialog( RiaDefines::ImportFileType::ECLIPSE_SUMMARY_FILE ); RicImportGeneralDataFeature::getEclipseFileNamesWithDialog( RiaDefines::ImportFileType::ECLIPSE_SUMMARY_FILE );
if ( fileNames.isEmpty() ) return; if ( fileNames.isEmpty() ) return;
auto gridModel = RimReloadCaseTools::gridModelFromSummaryCase( summaryCase );
QString oldSummaryHeaderFilename = summaryCase->summaryHeaderFilename(); QString oldSummaryHeaderFilename = summaryCase->summaryHeaderFilename();
summaryCase->setSummaryHeaderFileName( fileNames[0] );
summaryCase->updateAutoShortName(); const auto& newFileName = fileNames.front();
summaryCase->createSummaryReaderInterface(); summaryCase->setSummaryHeaderFileName( newFileName );
summaryCase->createRftReaderInterface(); RiaSummaryTools::reloadSummaryCase( summaryCase );
summaryCase->refreshMetaData();
RiaLogging::info( QString( "Replaced summary data for %1" ).arg( oldSummaryHeaderFilename ) ); RiaLogging::info( QString( "Replaced summary data for %1" ).arg( oldSummaryHeaderFilename ) );
RicReplaceSummaryCaseFeature::updateRequredCalculatedCurves( summaryCase ); RiaEclipseFileNameTools helper( newFileName );
auto newGridFileName = helper.findRelatedGridFile();
// Find and update all changed calculations if ( gridModel && !newGridFileName.isEmpty() )
std::set<int> ids;
RimSummaryCalculationCollection* calcColl = RimProject::current()->calculationCollection();
for ( RimUserDefinedCalculation* summaryCalculation : calcColl->calculations() )
{ {
bool needsUpdate = checkIfCalculationNeedsUpdate( summaryCalculation, summaryCase ); QMessageBox msgBox;
if ( needsUpdate ) msgBox.setIcon( QMessageBox::Question );
{
ids.insert( summaryCalculation->id() );
}
}
RimSummaryMultiPlotCollection* summaryPlotColl = RiaSummaryTools::summaryMultiPlotCollection(); QString questionText;
for ( RimSummaryMultiPlot* multiPlot : summaryPlotColl->multiPlots() ) questionText =
{ QString( "Found an open grid case for the same reservoir model.\n\nDo you want to replace the file name in the grid case?" );
for ( RimSummaryPlot* summaryPlot : multiPlot->summaryPlots() )
msgBox.setText( questionText );
msgBox.setStandardButtons( QMessageBox::Yes | QMessageBox::No );
int ret = msgBox.exec();
if ( ret == QMessageBox::Yes )
{ {
summaryPlot->loadDataAndUpdate(); auto previousGridFileName = gridModel->gridFileName();
gridModel->setGridFileName( newGridFileName );
RimReloadCaseTools::reloadEclipseGrid( gridModel );
RiaLogging::info( QString( "Replaced grid data for %1" ).arg( previousGridFileName ) );
} }
multiPlot->updatePlotTitles();
} }
} }
@@ -126,22 +104,3 @@ void RicReplaceSummaryCaseFeature::setupActionLook( QAction* actionToSetup )
actionToSetup->setText( "Replace" ); actionToSetup->setText( "Replace" );
actionToSetup->setIcon( QIcon( ":/ReplaceCase16x16.png" ) ); actionToSetup->setIcon( QIcon( ":/ReplaceCase16x16.png" ) );
} }
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
bool RicReplaceSummaryCaseFeature::checkIfCalculationNeedsUpdate( const RimUserDefinedCalculation* summaryCalculation,
const RimSummaryCase* summaryCase )
{
std::vector<RimUserDefinedCalculationVariable*> variables = summaryCalculation->allVariables();
for ( RimUserDefinedCalculationVariable* variable : variables )
{
RimSummaryCalculationVariable* summaryVariable = dynamic_cast<RimSummaryCalculationVariable*>( variable );
if ( summaryVariable->summaryCase() == summaryCase )
{
return true;
}
}
return false;
}
@@ -27,13 +27,8 @@ class RicReplaceSummaryCaseFeature : public caf::CmdFeature
{ {
CAF_CMD_HEADER_INIT; CAF_CMD_HEADER_INIT;
public:
static void updateRequredCalculatedCurves( RimSummaryCase* sourceSummaryCase );
protected: protected:
bool isCommandEnabled() const override; bool isCommandEnabled() const override;
void onActionTriggered( bool isChecked ) override; void onActionTriggered( bool isChecked ) override;
void setupActionLook( QAction* actionToSetup ) override; void setupActionLook( QAction* actionToSetup ) override;
static bool checkIfCalculationNeedsUpdate( const RimUserDefinedCalculation* summaryCalculation, const RimSummaryCase* summaryCase );
}; };
@@ -25,8 +25,6 @@
#include "RiaSimWellBranchTools.h" #include "RiaSimWellBranchTools.h"
#include "RiaSummaryTools.h" #include "RiaSummaryTools.h"
#include "RicImportGridModelFromSummaryCaseFeature.h"
#include "RifReaderEclipseRft.h" #include "RifReaderEclipseRft.h"
#include "RigCaseCellResultsData.h" #include "RigCaseCellResultsData.h"
@@ -44,6 +42,7 @@
#include "RimPressureDepthData.h" #include "RimPressureDepthData.h"
#include "RimProject.h" #include "RimProject.h"
#include "RimRegularLegendConfig.h" #include "RimRegularLegendConfig.h"
#include "RimReloadCaseTools.h"
#include "RimSummaryCase.h" #include "RimSummaryCase.h"
#include "RimSummaryCaseCollection.h" #include "RimSummaryCaseCollection.h"
#include "RimTools.h" #include "RimTools.h"
@@ -896,7 +895,7 @@ QList<caf::PdmOptionItemInfo> RimWellRftPlot::calculateValueOptionsForSources()
{ {
if ( summaryCase->rftReader() && summaryCase->rftReader()->wellNames().contains( m_wellPathNameOrSimWellName ) ) if ( summaryCase->rftReader() && summaryCase->rftReader()->wellNames().contains( m_wellPathNameOrSimWellName ) )
{ {
auto eclipeGridModel = RicImportGridModelFromSummaryCaseFeature::gridModelFromSummaryCase( summaryCase ); auto eclipeGridModel = RimReloadCaseTools::gridModelFromSummaryCase( summaryCase );
auto parentEnsemble = summaryCase->firstAncestorOrThisOfType<RimSummaryCaseCollection>(); auto parentEnsemble = summaryCase->firstAncestorOrThisOfType<RimSummaryCaseCollection>();
auto addr = RifDataSourceForRftPlt( summaryCase, parentEnsemble, eclipeGridModel ); auto addr = RifDataSourceForRftPlt( summaryCase, parentEnsemble, eclipeGridModel );
@@ -460,7 +460,7 @@ void RimEclipseCase::fieldChangedByUi( const caf::PdmFieldHandle* changedField,
RimCase::fieldChangedByUi( changedField, oldValue, newValue ); RimCase::fieldChangedByUi( changedField, oldValue, newValue );
if ( changedField == &m_releaseResultMemory ) if ( changedField == &m_releaseResultMemory )
{ {
RimReloadCaseTools::reloadAllEclipseGridData( this ); RimReloadCaseTools::reloadEclipseGrid( this );
m_releaseResultMemory = oldValue.toBool(); m_releaseResultMemory = oldValue.toBool();
} }
@@ -18,9 +18,14 @@
#include "RimReloadCaseTools.h" #include "RimReloadCaseTools.h"
#include "RiaEclipseFileNameTools.h"
#include "RiaFractureDefines.h" #include "RiaFractureDefines.h"
#include "RiaImportEclipseCaseTools.h"
#include "RiaLogging.h"
#include "RiaSummaryTools.h" #include "RiaSummaryTools.h"
#include "ApplicationCommands/RicShowMainWindowFeature.h"
#include "RigCaseCellResultsData.h" #include "RigCaseCellResultsData.h"
#include "RigEclipseCaseData.h" #include "RigEclipseCaseData.h"
@@ -31,33 +36,39 @@
#include "RimEclipseContourMapProjection.h" #include "RimEclipseContourMapProjection.h"
#include "RimEclipseContourMapView.h" #include "RimEclipseContourMapView.h"
#include "RimEclipseContourMapViewCollection.h" #include "RimEclipseContourMapViewCollection.h"
#include "RimEclipseResultCase.h"
#include "RimEclipseView.h" #include "RimEclipseView.h"
#include "RimGridCalculation.h" #include "RimGridCalculation.h"
#include "RimGridCalculationCollection.h" #include "RimGridCalculationCollection.h"
#include "RimMainPlotCollection.h" #include "RimMainPlotCollection.h"
#include "RimProject.h" #include "RimProject.h"
#include "RimSummaryCase.h"
#include "RimSummaryCaseMainCollection.h" #include "RimSummaryCaseMainCollection.h"
#include "Riu3DMainWindowTools.h"
#include <QFileInfo>
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
void RimReloadCaseTools::reloadAllEclipseData( RimEclipseCase* eclipseCase ) void RimReloadCaseTools::reloadEclipseGridAndSummary( RimEclipseCase* eclipseCase )
{ {
reloadAllEclipseData( eclipseCase, true ); reloadEclipseData( eclipseCase, true );
} }
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
void RimReloadCaseTools::reloadAllEclipseGridData( RimEclipseCase* eclipseCase ) void RimReloadCaseTools::reloadEclipseGrid( RimEclipseCase* eclipseCase )
{ {
reloadAllEclipseData( eclipseCase, false ); reloadEclipseData( eclipseCase, false );
} }
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
void RimReloadCaseTools::reloadAllEclipseData( RimEclipseCase* eclipseCase, bool reloadSummaryData ) void RimReloadCaseTools::reloadEclipseData( RimEclipseCase* eclipseCase, bool reloadSummaryData )
{ {
CVF_ASSERT( eclipseCase ); CVF_ASSERT( eclipseCase );
@@ -85,11 +96,8 @@ void RimReloadCaseTools::reloadAllEclipseData( RimEclipseCase* eclipseCase, bool
if ( reloadSummaryData ) if ( reloadSummaryData )
{ {
RimSummaryCaseMainCollection* sumCaseColl = RiaSummaryTools::summaryCaseMainCollection(); auto summaryCase = RimReloadCaseTools::findSummaryCaseFromEclipseResultCase( dynamic_cast<RimEclipseResultCase*>( eclipseCase ) );
if ( sumCaseColl ) RiaSummaryTools::reloadSummaryCase( summaryCase );
{
sumCaseColl->loadAllSummaryCaseData();
}
} }
updateAllPlots(); updateAllPlots();
@@ -155,6 +163,71 @@ void RimReloadCaseTools::updateAll3dViews( RimEclipseCase* eclipseCase )
} }
} }
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
RimEclipseCase* RimReloadCaseTools::gridModelFromSummaryCase( const RimSummaryCase* summaryCase )
{
if ( summaryCase )
{
QString summaryFileName = summaryCase->summaryHeaderFilename();
RiaEclipseFileNameTools fileHelper( summaryFileName );
auto candidateGridFileName = fileHelper.findRelatedGridFile();
return RimProject::current()->eclipseCaseFromGridFileName( candidateGridFileName );
}
return nullptr;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
RimSummaryCase* RimReloadCaseTools::findSummaryCaseFromEclipseResultCase( const RimEclipseResultCase* eclipseResultCase )
{
RiaEclipseFileNameTools helper( eclipseResultCase->gridFileName() );
RimSummaryCaseMainCollection* sumCaseColl = RiaSummaryTools::summaryCaseMainCollection();
auto summaryFileNames = helper.findSummaryFileCandidates();
for ( const auto& fileName : summaryFileNames )
{
return sumCaseColl->findTopLevelSummaryCaseFromFileName( fileName );
}
return nullptr;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
bool RimReloadCaseTools::openOrImportGridModelFromSummaryCase( const RimSummaryCase* summaryCase )
{
if ( !summaryCase ) return false;
if ( findGridModelAndActivateFirstView( summaryCase ) ) return true;
QString summaryFileName = summaryCase->summaryHeaderFilename();
RiaEclipseFileNameTools fileHelper( summaryFileName );
auto candidateGridFileName = fileHelper.findRelatedGridFile();
if ( QFileInfo::exists( candidateGridFileName ) )
{
bool createView = true;
auto id = RiaImportEclipseCaseTools::openEclipseCaseFromFile( candidateGridFileName, createView );
if ( id > -1 )
{
RiaLogging::info( QString( "Imported %1" ).arg( candidateGridFileName ) );
return true;
}
}
RiaLogging::info( QString( "No grid case found based on summary file %1" ).arg( summaryFileName ) );
return false;
}
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
@@ -162,3 +235,24 @@ void RimReloadCaseTools::updateAllPlots()
{ {
RimMainPlotCollection::current()->loadDataAndUpdateAllPlots(); RimMainPlotCollection::current()->loadDataAndUpdateAllPlots();
} }
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
bool RimReloadCaseTools::findGridModelAndActivateFirstView( const RimSummaryCase* summaryCase )
{
auto gridCase = RimReloadCaseTools::gridModelFromSummaryCase( summaryCase );
if ( gridCase )
{
if ( !gridCase->gridViews().empty() )
{
RicShowMainWindowFeature::showMainWindow();
Riu3DMainWindowTools::selectAsCurrentItem( gridCase->gridViews().front() );
}
return true;
}
return false;
}
@@ -20,6 +20,8 @@
class RimEclipseCase; class RimEclipseCase;
class RigEclipseCaseData; class RigEclipseCaseData;
class RimSummaryCase;
class RimEclipseResultCase;
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
@@ -28,15 +30,21 @@ class RimReloadCaseTools
{ {
public: public:
// Reload all eclipse data, both grid and summary // Reload all eclipse data, both grid and summary
static void reloadAllEclipseData( RimEclipseCase* eclipseCase ); static void reloadEclipseGridAndSummary( RimEclipseCase* eclipseCase );
// Reload grid data, but not summary // Reload grid data, but not summary
static void reloadAllEclipseGridData( RimEclipseCase* eclipseCase ); static void reloadEclipseGrid( RimEclipseCase* eclipseCase );
static void updateAll3dViews( RimEclipseCase* eclipseCase ); static void updateAll3dViews( RimEclipseCase* eclipseCase );
static RimEclipseCase* gridModelFromSummaryCase( const RimSummaryCase* summaryCase );
static RimSummaryCase* findSummaryCaseFromEclipseResultCase( const RimEclipseResultCase* eclResCase );
static bool openOrImportGridModelFromSummaryCase( const RimSummaryCase* summaryCase );
private: private:
static void reloadAllEclipseData( RimEclipseCase* eclipseCase, bool reloadSummaryData ); static void reloadEclipseData( RimEclipseCase* eclipseCase, bool reloadSummaryData );
static void clearAllGridData( RigEclipseCaseData* eclipseCaseData ); static void clearAllGridData( RigEclipseCaseData* eclipseCaseData );
static void updateAllPlots(); static void updateAllPlots();
static bool findGridModelAndActivateFirstView( const RimSummaryCase* summaryCase );
}; };
@@ -31,6 +31,7 @@
#include "RimEclipseResultCase.h" #include "RimEclipseResultCase.h"
#include "RimOilField.h" #include "RimOilField.h"
#include "RimProject.h" #include "RimProject.h"
#include "RimReloadCaseTools.h"
#include "RimSimWellInView.h" #include "RimSimWellInView.h"
#include "RimSimWellInViewCollection.h" #include "RimSimWellInViewCollection.h"
#include "RimSummaryCaseMainCollection.h" #include "RimSummaryCaseMainCollection.h"
@@ -45,13 +46,10 @@ RimSummaryCase* RimSimWellInViewTools::summaryCaseForWell( RimSimWellInView* wel
RimProject* project = RimProject::current(); RimProject* project = RimProject::current();
if ( !project ) return nullptr; if ( !project ) return nullptr;
RimSummaryCaseMainCollection* sumCaseColl = project->activeOilField() ? project->activeOilField()->summaryCaseMainCollection() : nullptr;
if ( !sumCaseColl ) return nullptr;
auto eclCase = well->firstAncestorOrThisOfType<RimEclipseResultCase>(); auto eclCase = well->firstAncestorOrThisOfType<RimEclipseResultCase>();
if ( eclCase ) if ( eclCase )
{ {
return sumCaseColl->findSummaryCaseFromEclipseResultCase( eclCase ); return RimReloadCaseTools::findSummaryCaseFromEclipseResultCase( eclCase );
} }
return nullptr; return nullptr;
@@ -289,7 +289,7 @@ void RimTimeStepFilter::fieldChangedByUi( const caf::PdmFieldHandle* changedFiel
if ( rimEclipseResultCase ) if ( rimEclipseResultCase )
{ {
RimReloadCaseTools::reloadAllEclipseGridData( rimEclipseResultCase ); RimReloadCaseTools::reloadEclipseGrid( rimEclipseResultCase );
} }
else if ( rimGeoMechCase ) else if ( rimGeoMechCase )
{ {
@@ -18,7 +18,7 @@
#include "RimRftCase.h" #include "RimRftCase.h"
#include "RicReloadSummaryCaseFeature.h" #include "RiaSummaryTools.h"
#include "RimMainPlotCollection.h" #include "RimMainPlotCollection.h"
#include "RimSummaryCase.h" #include "RimSummaryCase.h"
@@ -84,7 +84,7 @@ void RimRftCase::fieldChangedByUi( const caf::PdmFieldHandle* changedField, cons
{ {
auto parentCase = firstAncestorOfType<RimSummaryCase>(); auto parentCase = firstAncestorOfType<RimSummaryCase>();
if ( parentCase ) RicReloadSummaryCaseFeature::reloadSummaryCase( parentCase ); if ( parentCase ) RiaSummaryTools::reloadSummaryCase( parentCase );
RimMainPlotCollection::current()->loadDataAndUpdateAllPlots(); RimMainPlotCollection::current()->loadDataAndUpdateAllPlots();
} }
@@ -110,26 +110,6 @@ RimSummaryCaseMainCollection::~RimSummaryCaseMainCollection()
m_caseCollections.deleteChildrenAsync(); m_caseCollections.deleteChildrenAsync();
} }
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
RimSummaryCase* RimSummaryCaseMainCollection::findSummaryCaseFromEclipseResultCase( const RimEclipseResultCase* eclipseResultCase ) const
{
RiaEclipseFileNameTools helper( eclipseResultCase->gridFileName() );
auto summaryFileName = helper.findSummaryFileCandidates();
for ( const auto& candidateFileName : summaryFileName )
{
auto summaryCase = findTopLevelSummaryCaseFromFileName( candidateFileName );
if ( summaryCase )
{
return summaryCase;
}
}
return nullptr;
}
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
@@ -54,7 +54,6 @@ public:
std::vector<RimSummaryCase*> createSummaryCasesFromFileInfos( const std::vector<RifSummaryCaseFileResultInfo>& summaryHeaderFileInfos, std::vector<RimSummaryCase*> createSummaryCasesFromFileInfos( const std::vector<RifSummaryCaseFileResultInfo>& summaryHeaderFileInfos,
bool showProgress = false ); bool showProgress = false );
RimSummaryCase* findSummaryCaseFromEclipseResultCase( const RimEclipseResultCase* eclResCase ) const;
RimSummaryCase* findTopLevelSummaryCaseFromFileName( const QString& fileName ) const; RimSummaryCase* findTopLevelSummaryCaseFromFileName( const QString& fileName ) const;
void addCases( const std::vector<RimSummaryCase*> cases ); void addCases( const std::vector<RimSummaryCase*> cases );