Refactor RimSummaryAddressModifier

Use std::variant to wrap curve and ensemble curve set.
Move some code into RimSummaryAddressModifier
This commit is contained in:
Magne Sjaastad
2023-11-01 14:18:40 +01:00
parent 12f24af154
commit 2069ad55cf
6 changed files with 212 additions and 136 deletions

View File

@@ -100,14 +100,11 @@ void RicAppendSummaryPlotsForObjectsFeature::appendPlots( RimSummaryMultiPlot*
}
else
{
auto adrMods = RimSummaryAddressModifier::createAddressModifiersForPlot( duplicatedPlot );
for ( auto adrMod : adrMods )
{
auto sourceAddress = adrMod.address();
auto modifiedAdr = modifyAddress( sourceAddress, summaryAdrCollection );
const auto objectName = summaryAdrCollection->name().toStdString();
auto contentType = summaryAdrCollection->contentType();
auto curveProviders = RimSummaryAddressModifier::createAddressProviders( duplicatedPlot );
RimSummaryAddressModifier::updateAddressesByObjectName( curveProviders, objectName, contentType );
adrMod.setAddress( modifiedAdr );
}
summaryMultiPlot->addPlot( duplicatedPlot );
duplicatedPlot->resolveReferencesRecursively();
}
@@ -249,7 +246,7 @@ bool RicAppendSummaryPlotsForObjectsFeature::isSelectionCompatibleWithPlot( cons
for ( auto plot : plotsForObjectType )
{
auto addresses = RimSummaryAddressModifier::createEclipseSummaryAddress( plot );
auto addresses = RimSummaryAddressModifier::allSummaryAddressesY( plot );
analyzer.appendAddresses( addresses );
}
}
@@ -286,45 +283,6 @@ bool RicAppendSummaryPlotsForObjectsFeature::isSelectionCompatibleWithPlot( cons
return true;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
RifEclipseSummaryAddress RicAppendSummaryPlotsForObjectsFeature::modifyAddress( const RifEclipseSummaryAddress& sourceAddress,
RimSummaryAddressCollection* summaryAddressCollection )
{
CAF_ASSERT( summaryAddressCollection );
auto adr = sourceAddress;
auto objectName = summaryAddressCollection->name().toStdString();
if ( summaryAddressCollection->contentType() == RimSummaryAddressCollection::CollectionContentType::WELL )
{
adr.setWellName( objectName );
}
else if ( summaryAddressCollection->contentType() == RimSummaryAddressCollection::CollectionContentType::GROUP )
{
adr.setGroupName( objectName );
}
else if ( summaryAddressCollection->contentType() == RimSummaryAddressCollection::CollectionContentType::REGION )
{
int intValue = RiaStdStringTools::toInt( objectName );
if ( intValue == -1 )
{
QString errorText = QString( "Failed to convert region text to region integer value "
"for region text : " ) +
summaryAddressCollection->name();
RiaLogging::error( errorText );
}
else
{
adr.setRegion( intValue );
}
}
return adr;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
@@ -343,7 +301,7 @@ std::vector<RimSummaryPlot*>
RiaSummaryAddressAnalyzer myAnalyser;
for ( auto sourcePlot : sourcePlots )
{
auto addresses = RimSummaryAddressModifier::createEclipseSummaryAddress( sourcePlot );
auto addresses = RimSummaryAddressModifier::allSummaryAddressesY( sourcePlot );
myAnalyser.appendAddresses( addresses );
}
@@ -398,7 +356,7 @@ std::vector<RimSummaryPlot*>
}
else
{
auto addresses = RimSummaryAddressModifier::createEclipseSummaryAddress( sourcePlot );
auto addresses = RimSummaryAddressModifier::allSummaryAddressesY( sourcePlot );
for ( const auto& a : addresses )
{

View File

@@ -62,7 +62,4 @@ protected:
private:
static std::vector<RimSummaryAddressCollection*> createAddressCollections( const std::vector<RimSummaryCase*>& cases,
const std::vector<RimSummaryCaseCollection*>& ensembles );
static RifEclipseSummaryAddress modifyAddress( const RifEclipseSummaryAddress& sourceAddress,
RimSummaryAddressCollection* summaryAddressCollection );
};

View File

@@ -18,6 +18,9 @@
#include "RimSummaryAddressModifier.h"
#include "RiaLogging.h"
#include "RiaStdStringTools.h"
#include "RifEclipseSummaryAddress.h"
#include "RimEnsembleCurveSet.h"
@@ -27,85 +30,183 @@
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
RimSummaryAddressModifier::RimSummaryAddressModifier( RimSummaryCurve* curve )
: m_curve( curve )
, m_curveSet( nullptr )
RifEclipseSummaryAddress RimSummaryAddressModifier::replaceObjectName( const RifEclipseSummaryAddress& sourceAdr,
std::string objectName,
RimSummaryAddressCollection::CollectionContentType contentType )
{
}
auto adr = sourceAdr;
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
RimSummaryAddressModifier::RimSummaryAddressModifier( RimEnsembleCurveSet* curveSet )
: m_curve( nullptr )
, m_curveSet( curveSet )
{
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
std::vector<RimSummaryAddressModifier> RimSummaryAddressModifier::createAddressModifiersForPlot( RimSummaryPlot* summaryPlot )
{
std::vector<RimSummaryAddressModifier> mods;
if ( summaryPlot )
if ( contentType == RimSummaryAddressCollection::CollectionContentType::WELL )
{
auto curveSets = summaryPlot->curveSets();
for ( auto curveSet : curveSets )
adr.setWellName( objectName );
}
else if ( contentType == RimSummaryAddressCollection::CollectionContentType::GROUP )
{
adr.setGroupName( objectName );
}
else if ( contentType == RimSummaryAddressCollection::CollectionContentType::REGION )
{
int intValue = RiaStdStringTools::toInt( objectName );
if ( intValue == -1 )
{
mods.emplace_back( RimSummaryAddressModifier( curveSet ) );
}
QString errorText = QString( "Failed to convert region text to region integer value "
"for region text : %1" )
.arg( QString::fromStdString( objectName ) );
auto curves = summaryPlot->allCurves();
for ( auto c : curves )
RiaLogging::error( errorText );
}
else
{
mods.emplace_back( RimSummaryAddressModifier( c ) );
adr.setRegion( intValue );
}
}
return mods;
return adr;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
std::vector<RifEclipseSummaryAddress> RimSummaryAddressModifier::createEclipseSummaryAddress( RimSummaryPlot* summaryPlot )
std::vector<RiaSummaryCurveAddress> RimSummaryAddressModifier::curveAddresses( const std::vector<CurveAddressProvider>& curveAddressProviders )
{
auto mods = createAddressModifiersForPlot( summaryPlot );
return convertToEclipseSummaryAddress( mods );
}
std::vector<RiaSummaryCurveAddress> addresses;
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
RifEclipseSummaryAddress RimSummaryAddressModifier::address() const
{
if ( m_curve ) return m_curve->summaryAddressY();
if ( m_curveSet ) return m_curveSet->summaryAddressY();
return {};
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimSummaryAddressModifier::setAddress( const RifEclipseSummaryAddress& address )
{
if ( m_curve ) m_curve->setSummaryAddressY( address );
if ( m_curveSet ) m_curveSet->setSummaryAddressYAndStatisticsFlag( address );
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
std::vector<RifEclipseSummaryAddress>
RimSummaryAddressModifier::convertToEclipseSummaryAddress( const std::vector<RimSummaryAddressModifier>& modifiers )
{
std::vector<RifEclipseSummaryAddress> tmp;
tmp.reserve( modifiers.size() );
for ( const auto& m : modifiers )
for ( auto& provider : curveAddressProviders )
{
tmp.emplace_back( m.address() );
}
return tmp;
std::visit(
[&addresses]( auto&& arg )
{
auto curveAdr = RimSummaryAddressModifier::curveAddress( arg );
addresses.push_back( curveAdr );
},
provider );
};
return addresses;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimSummaryAddressModifier::applyAddressesToCurveAddressProviders( const std::vector<CurveAddressProvider>& curveAddressProviders,
const std::vector<RiaSummaryCurveAddress>& addresses )
{
if ( curveAddressProviders.size() != addresses.size() ) return;
for ( size_t i = 0; i < curveAddressProviders.size(); i++ )
{
auto provider = curveAddressProviders[i];
const auto& address = addresses[i];
std::visit( [address]( auto&& arg ) { RimSummaryAddressModifier::setCurveAddress( arg, address ); }, provider );
};
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
std::vector<RimSummaryAddressModifier::CurveAddressProvider> RimSummaryAddressModifier::createAddressProviders( RimSummaryPlot* summaryPlot )
{
std::vector<CurveAddressProvider> providers;
for ( auto c : summaryPlot->allCurves() )
{
providers.push_back( c );
}
for ( auto cs : summaryPlot->curveSets() )
{
providers.push_back( cs );
}
return providers;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
std::vector<RifEclipseSummaryAddress> RimSummaryAddressModifier::allSummaryAddressesY( RimSummaryPlot* summaryPlot )
{
std::vector<RifEclipseSummaryAddress> addresses;
auto curveAddressProviders = createAddressProviders( summaryPlot );
for ( auto& provider : curveAddressProviders )
{
std::visit(
[&addresses]( auto&& arg )
{
auto curveAdr = RimSummaryAddressModifier::curveAddress( arg );
addresses.push_back( curveAdr.summaryAddressY() );
},
provider );
};
return addresses;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimSummaryAddressModifier::updateAddressesByObjectName( const std::vector<CurveAddressProvider>& curveAddressProviders,
const std::string& objectName,
RimSummaryAddressCollection::CollectionContentType contentType )
{
for ( auto& provider : curveAddressProviders )
{
std::visit(
[objectName, contentType]( auto&& arg )
{
const auto sourceAdr = RimSummaryAddressModifier::curveAddress( arg );
const auto sourceX = sourceAdr.summaryAddressX();
const auto sourceY = sourceAdr.summaryAddressY();
const auto newAdrX = RimSummaryAddressModifier::replaceObjectName( sourceX, objectName, contentType );
const auto newAdrY = RimSummaryAddressModifier::replaceObjectName( sourceY, objectName, contentType );
RimSummaryAddressModifier::setCurveAddress( arg, RiaSummaryCurveAddress( newAdrX, newAdrY ) );
},
provider );
};
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
RiaSummaryCurveAddress RimSummaryAddressModifier::curveAddress( RimEnsembleCurveSet* curveSet )
{
if ( curveSet == nullptr ) return RiaSummaryCurveAddress( RifEclipseSummaryAddress() );
return curveSet->curveAddress();
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
RiaSummaryCurveAddress RimSummaryAddressModifier::curveAddress( RimSummaryCurve* curve )
{
if ( curve == nullptr ) return RiaSummaryCurveAddress( RifEclipseSummaryAddress() );
return curve->curveAddress();
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimSummaryAddressModifier::setCurveAddress( RimEnsembleCurveSet* curveSet, const RiaSummaryCurveAddress& curveAdr )
{
if ( curveSet )
{
curveSet->setCurveAddress( curveAdr );
}
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimSummaryAddressModifier::setCurveAddress( RimSummaryCurve* curve, const RiaSummaryCurveAddress& curveAdr )
{
if ( curve )
{
curve->setSummaryAddressX( curveAdr.summaryAddressX() );
curve->setSummaryAddressY( curveAdr.summaryAddressY() );
}
}

View File

@@ -18,29 +18,44 @@
#pragma once
#include "RimSummaryAddressCollection.h"
#include <variant>
#include <vector>
class RimSummaryCurve;
class RimEnsembleCurveSet;
class RimSummaryPlot;
class RifEclipseSummaryAddress;
class RiaSummaryCurveAddress;
#include <vector>
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
class RimSummaryAddressModifier
{
public:
RimSummaryAddressModifier( RimSummaryCurve* curve );
RimSummaryAddressModifier( RimEnsembleCurveSet* curveSet );
// Define a variant for summary curves and ensemble curve set. This way we can treat them as similar object without a
// common base class
using CurveAddressProvider = std::variant<RimSummaryCurve*, RimEnsembleCurveSet*>;
static std::vector<RimSummaryAddressModifier> createAddressModifiersForPlot( RimSummaryPlot* summaryPlot );
static std::vector<RifEclipseSummaryAddress> createEclipseSummaryAddress( RimSummaryPlot* summaryPlot );
static std::vector<CurveAddressProvider> createAddressProviders( RimSummaryPlot* summaryPlot );
static std::vector<RiaSummaryCurveAddress> curveAddresses( const std::vector<CurveAddressProvider>& curveAddressProviders );
static void applyAddressesToCurveAddressProviders( const std::vector<CurveAddressProvider>& curveAddressProviders,
const std::vector<RiaSummaryCurveAddress>& addresses );
RifEclipseSummaryAddress address() const;
void setAddress( const RifEclipseSummaryAddress& address );
static std::vector<RifEclipseSummaryAddress> allSummaryAddressesY( RimSummaryPlot* summaryPlot );
static void updateAddressesByObjectName( const std::vector<CurveAddressProvider>& curveAddressProviders,
const std::string& objectName,
RimSummaryAddressCollection::CollectionContentType contentType );
private:
static std::vector<RifEclipseSummaryAddress> convertToEclipseSummaryAddress( const std::vector<RimSummaryAddressModifier>& modifiers );
private:
RimSummaryCurve* m_curve;
RimEnsembleCurveSet* m_curveSet;
static RiaSummaryCurveAddress curveAddress( RimSummaryCurve* curve );
static RiaSummaryCurveAddress curveAddress( RimEnsembleCurveSet* curveSet );
static void setCurveAddress( RimEnsembleCurveSet* curveSet, const RiaSummaryCurveAddress& curveAdr );
static void setCurveAddress( RimSummaryCurve* curve, const RiaSummaryCurveAddress& curveAdr );
static RifEclipseSummaryAddress replaceObjectName( const RifEclipseSummaryAddress& sourceAdr,
std::string objectName,
RimSummaryAddressCollection::CollectionContentType contentType );
};

View File

@@ -798,7 +798,7 @@ void RimSummaryMultiPlot::setDefaultRangeAggregationSteppingDimension()
for ( auto p : summaryPlots() )
{
auto addresses = RimSummaryAddressModifier::createEclipseSummaryAddress( p );
auto addresses = RimSummaryAddressModifier::allSummaryAddressesY( p );
analyzer.appendAddresses( addresses );
}
@@ -1267,7 +1267,7 @@ void RimSummaryMultiPlot::analyzePlotsAndAdjustAppearanceSettings()
for ( auto p : summaryPlots() )
{
auto addresses = RimSummaryAddressModifier::createEclipseSummaryAddress( p );
auto addresses = RimSummaryAddressModifier::allSummaryAddressesY( p );
analyzer.appendAddresses( addresses );
}
@@ -1549,12 +1549,17 @@ void RimSummaryMultiPlot::appendSubPlotByStepping( int direction )
}
else
{
auto mods = RimSummaryAddressModifier::createAddressModifiersForPlot( newPlot );
for ( auto& mod : mods )
std::vector<RiaSummaryCurveAddress> newCurveAdrs;
auto curveAddressProviders = RimSummaryAddressModifier::createAddressProviders( newPlot );
for ( const auto& adr : RimSummaryAddressModifier::curveAddresses( curveAddressProviders ) )
{
auto modifiedAdr = m_sourceStepping()->stepAddress( mod.address(), direction );
mod.setAddress( modifiedAdr );
const auto adrX = m_sourceStepping()->stepAddress( adr.summaryAddressX(), direction );
const auto adrY = m_sourceStepping()->stepAddress( adr.summaryAddressY(), direction );
newCurveAdrs.push_back( RiaSummaryCurveAddress( adrX, adrY ) );
}
RimSummaryAddressModifier::applyAddressesToCurveAddressProviders( curveAddressProviders, newCurveAdrs );
}
}

View File

@@ -1473,7 +1473,7 @@ std::vector<RimPlot*> RimSummaryPlotSourceStepping::plotsMatchingStepSettings( s
}
else
{
auto addresses = RimSummaryAddressModifier::createEclipseSummaryAddress( plot );
auto addresses = RimSummaryAddressModifier::allSummaryAddressesY( plot );
for ( const auto& a : addresses )
{