Skip to content

Commit

Permalink
Refactor RimSummaryAddressModifier
Browse files Browse the repository at this point in the history
Use std::variant to wrap curve and ensemble curve set.
Move some code into RimSummaryAddressModifier
  • Loading branch information
magnesj committed Nov 6, 2023
1 parent 12f24af commit 2069ad5
Show file tree
Hide file tree
Showing 6 changed files with 184 additions and 108 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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();
}
Expand Down Expand Up @@ -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 );
}
}
Expand Down Expand Up @@ -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;
}

//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
Expand All @@ -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 );
}

Expand Down Expand Up @@ -398,7 +356,7 @@ std::vector<RimSummaryPlot*>
}
else
{
auto addresses = RimSummaryAddressModifier::createEclipseSummaryAddress( sourcePlot );
auto addresses = RimSummaryAddressModifier::allSummaryAddressesY( sourcePlot );

for ( const auto& a : addresses )
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,4 @@ class RicAppendSummaryPlotsForObjectsFeature : public caf::CmdFeature
private:
static std::vector<RimSummaryAddressCollection*> createAddressCollections( const std::vector<RimSummaryCase*>& cases,
const std::vector<RimSummaryCaseCollection*>& ensembles );

static RifEclipseSummaryAddress modifyAddress( const RifEclipseSummaryAddress& sourceAddress,
RimSummaryAddressCollection* summaryAddressCollection );
};
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,9 @@

#include "RimSummaryAddressModifier.h"

#include "RiaLogging.h"
#include "RiaStdStringTools.h"

#include "RifEclipseSummaryAddress.h"

#include "RimEnsembleCurveSet.h"
Expand All @@ -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;

if ( contentType == RimSummaryAddressCollection::CollectionContentType::WELL )
{
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 )
{
QString errorText = QString( "Failed to convert region text to region integer value "
"for region text : %1" )
.arg( QString::fromStdString( objectName ) );

RiaLogging::error( errorText );
}
else
{
adr.setRegion( intValue );
}
}

return adr;
}

//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
RimSummaryAddressModifier::RimSummaryAddressModifier( RimEnsembleCurveSet* curveSet )
: m_curve( nullptr )
, m_curveSet( curveSet )
std::vector<RiaSummaryCurveAddress> RimSummaryAddressModifier::curveAddresses( const std::vector<CurveAddressProvider>& curveAddressProviders )
{
std::vector<RiaSummaryCurveAddress> addresses;

for ( auto& provider : curveAddressProviders )
{
std::visit(
[&addresses]( auto&& arg )
{
auto curveAdr = RimSummaryAddressModifier::curveAddress( arg );
addresses.push_back( curveAdr );
},
provider );
};

return addresses;
}

//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
std::vector<RimSummaryAddressModifier> RimSummaryAddressModifier::createAddressModifiersForPlot( RimSummaryPlot* summaryPlot )
void RimSummaryAddressModifier::applyAddressesToCurveAddressProviders( const std::vector<CurveAddressProvider>& curveAddressProviders,
const std::vector<RiaSummaryCurveAddress>& addresses )
{
std::vector<RimSummaryAddressModifier> mods;
if ( summaryPlot )
if ( curveAddressProviders.size() != addresses.size() ) return;

for ( size_t i = 0; i < curveAddressProviders.size(); i++ )
{
auto curveSets = summaryPlot->curveSets();
for ( auto curveSet : curveSets )
{
mods.emplace_back( RimSummaryAddressModifier( curveSet ) );
}
auto provider = curveAddressProviders[i];
const auto& address = addresses[i];

auto curves = summaryPlot->allCurves();
for ( auto c : curves )
{
mods.emplace_back( RimSummaryAddressModifier( c ) );
}
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 );
}

return mods;
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;
}

//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
std::vector<RifEclipseSummaryAddress> RimSummaryAddressModifier::createEclipseSummaryAddress( RimSummaryPlot* summaryPlot )
void RimSummaryAddressModifier::updateAddressesByObjectName( const std::vector<CurveAddressProvider>& curveAddressProviders,
const std::string& objectName,
RimSummaryAddressCollection::CollectionContentType contentType )
{
auto mods = createAddressModifiersForPlot( summaryPlot );
return convertToEclipseSummaryAddress( mods );
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 );
};
}

//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
RifEclipseSummaryAddress RimSummaryAddressModifier::address() const
RiaSummaryCurveAddress RimSummaryAddressModifier::curveAddress( RimEnsembleCurveSet* curveSet )
{
if ( m_curve ) return m_curve->summaryAddressY();
if ( m_curveSet ) return m_curveSet->summaryAddressY();
if ( curveSet == nullptr ) return RiaSummaryCurveAddress( RifEclipseSummaryAddress() );
return curveSet->curveAddress();
}

return {};
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
RiaSummaryCurveAddress RimSummaryAddressModifier::curveAddress( RimSummaryCurve* curve )
{
if ( curve == nullptr ) return RiaSummaryCurveAddress( RifEclipseSummaryAddress() );
return curve->curveAddress();
}

//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimSummaryAddressModifier::setAddress( const RifEclipseSummaryAddress& address )
void RimSummaryAddressModifier::setCurveAddress( RimEnsembleCurveSet* curveSet, const RiaSummaryCurveAddress& curveAdr )
{
if ( m_curve ) m_curve->setSummaryAddressY( address );
if ( m_curveSet ) m_curveSet->setSummaryAddressYAndStatisticsFlag( address );
if ( curveSet )
{
curveSet->setCurveAddress( curveAdr );
}
}

//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
std::vector<RifEclipseSummaryAddress>
RimSummaryAddressModifier::convertToEclipseSummaryAddress( const std::vector<RimSummaryAddressModifier>& modifiers )
void RimSummaryAddressModifier::setCurveAddress( RimSummaryCurve* curve, const RiaSummaryCurveAddress& curveAdr )
{
std::vector<RifEclipseSummaryAddress> tmp;
tmp.reserve( modifiers.size() );
for ( const auto& m : modifiers )
if ( curve )
{
tmp.emplace_back( m.address() );
curve->setSummaryAddressX( curveAdr.summaryAddressX() );
curve->setSummaryAddressY( curveAdr.summaryAddressY() );
}
return tmp;
}
Original file line number Diff line number Diff line change
Expand Up @@ -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 );

private:
static std::vector<RifEclipseSummaryAddress> convertToEclipseSummaryAddress( const std::vector<RimSummaryAddressModifier>& modifiers );
static void updateAddressesByObjectName( const std::vector<CurveAddressProvider>& curveAddressProviders,
const std::string& objectName,
RimSummaryAddressCollection::CollectionContentType contentType );

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 );
};
Loading

0 comments on commit 2069ad5

Please sign in to comment.