From 7b269c43d46f1eb41464bfff566306c8c4a92230 Mon Sep 17 00:00:00 2001 From: Magne Sjaastad Date: Wed, 26 Mar 2025 13:18:24 +0100 Subject: [PATCH] Ensemble curve issues * #12298 Make it possible to edit curve from a realization in an ensemble * #12299 Fix highlight of single realization curves * Disable serialization of ensemble curve set curves * Ensemble Curves: Make sure replot is called only once during reattach * Performance: Use a small set of header file names to compute name --- .../Tools/RiaEnsembleNameTools.cpp | 14 +++++++-- .../ProjectDataModel/RimPlotCurve.cpp | 11 +++++-- .../ProjectDataModel/RimPlotCurve.h | 2 +- .../Summary/RimEnsembleCurveSet.cpp | 13 +++++++- .../Summary/RimSummaryCurve.cpp | 30 ++----------------- .../Summary/RimSummaryCurve.h | 5 ---- .../Summary/RimSummaryEnsembleTools.cpp | 15 ++++++---- 7 files changed, 44 insertions(+), 46 deletions(-) diff --git a/ApplicationLibCode/Application/Tools/RiaEnsembleNameTools.cpp b/ApplicationLibCode/Application/Tools/RiaEnsembleNameTools.cpp index bdc9b4260f..c2a2a94c96 100644 --- a/ApplicationLibCode/Application/Tools/RiaEnsembleNameTools.cpp +++ b/ApplicationLibCode/Application/Tools/RiaEnsembleNameTools.cpp @@ -414,12 +414,20 @@ QString RiaEnsembleNameTools::uniqueShortNameForEnsembleCase( RimSummaryCase* su QStringList summaryFilePaths; summaryFilePaths.push_back( summaryCase->summaryHeaderFilename() ); - for ( auto otherSummaryCase : summaryCases ) + // Use a small number of names to find a short name for the ensemble, as RiaEnsembleNameTools::uniqueShortName is slow + if ( !summaryCases.empty() ) { - if ( otherSummaryCase != summaryCase ) + const int maxNameCount = 4; + for ( int i = 0; i < std::min( maxNameCount, static_cast( summaryCases.size() ) ); ++i ) { - summaryFilePaths.push_back( otherSummaryCase->summaryHeaderFilename() ); + auto otherSummaryCase = summaryCases[i]; + if ( otherSummaryCase != summaryCase ) + { + summaryFilePaths.push_back( otherSummaryCase->summaryHeaderFilename() ); + } } + + summaryFilePaths.push_back( summaryCases.back()->summaryHeaderFilename() ); } return RiaEnsembleNameTools::uniqueShortName( summaryCase->summaryHeaderFilename(), summaryFilePaths, ensembleCaseName ); diff --git a/ApplicationLibCode/ProjectDataModel/RimPlotCurve.cpp b/ApplicationLibCode/ProjectDataModel/RimPlotCurve.cpp index 13433e3c11..95971221a9 100644 --- a/ApplicationLibCode/ProjectDataModel/RimPlotCurve.cpp +++ b/ApplicationLibCode/ProjectDataModel/RimPlotCurve.cpp @@ -1194,9 +1194,16 @@ void RimPlotCurve::detach( bool deletePlotCurve ) //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void RimPlotCurve::reattach() +void RimPlotCurve::reattach( bool updateParentPlot ) { - if ( m_parentPlot && canCurveBeAttached() ) attach( m_parentPlot ); + if ( m_parentPlot && canCurveBeAttached() ) + { + setParentPlotNoReplot( m_parentPlot ); + if ( updateParentPlot ) + { + m_parentPlot->replot(); + } + } } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/ProjectDataModel/RimPlotCurve.h b/ApplicationLibCode/ProjectDataModel/RimPlotCurve.h index 14a744559f..cb6cef5407 100644 --- a/ApplicationLibCode/ProjectDataModel/RimPlotCurve.h +++ b/ApplicationLibCode/ProjectDataModel/RimPlotCurve.h @@ -133,7 +133,7 @@ public: void attach( RiuPlotWidget* ); void detach( bool deletePlotCurve = false ); - void reattach(); + void reattach( bool updateParentPlot = true ); bool isSameCurve( const RiuPlotCurve* plotCurve ) const; void deletePlotCurve(); RiuPlotCurve* plotCurve() const; diff --git a/ApplicationLibCode/ProjectDataModel/Summary/RimEnsembleCurveSet.cpp b/ApplicationLibCode/ProjectDataModel/Summary/RimEnsembleCurveSet.cpp index a485857bea..7d469032d6 100644 --- a/ApplicationLibCode/ProjectDataModel/Summary/RimEnsembleCurveSet.cpp +++ b/ApplicationLibCode/ProjectDataModel/Summary/RimEnsembleCurveSet.cpp @@ -125,6 +125,9 @@ RimEnsembleCurveSet::RimEnsembleCurveSet() CAF_PDM_InitFieldNoDefault( &m_curves, "EnsembleCurveSet", "Ensemble Curve Set" ); m_curves.uiCapability()->setUiTreeChildrenHidden( false ); + // The summary curves are always recreated in loadDataAndUpdate(), so we can disable IO for curves. This will reduce the size of the + // project files. + m_curves.xmlCapability()->disableIO(); CAF_PDM_InitField( &m_showCurves, "IsActive", true, "Show Curves" ); m_showCurves.uiCapability()->setUiHidden( true ); @@ -396,7 +399,15 @@ void RimEnsembleCurveSet::reattachPlotCurves() { for ( RimSummaryCurve* curve : m_curves ) { - curve->reattach(); + bool updateParentPlot = false; + curve->reattach( updateParentPlot ); + } + + if ( !m_curves.empty() ) + { + auto firstCurve = m_curves[0]; + + firstCurve->replotParentPlot(); } } diff --git a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryCurve.cpp b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryCurve.cpp index fab6a5d7f3..83596ffaac 100644 --- a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryCurve.cpp +++ b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryCurve.cpp @@ -114,10 +114,6 @@ RimSummaryCurve::RimSummaryCurve() m_xValuesSummaryAddress = new RimSummaryAddress; - // Other members - CAF_PDM_InitFieldNoDefault( &m_isEnsembleCurve, "IsEnsembleCurve", "Ensemble Curve" ); - m_isEnsembleCurve.v() = caf::Tristate::State::PartiallyTrue; - CAF_PDM_InitFieldNoDefault( &m_plotAxis_OBSOLETE, "PlotAxis", "Axis" ); m_plotAxis_OBSOLETE.xmlCapability()->setIOWritable( false ); @@ -178,11 +174,6 @@ void RimSummaryCurve::setSummaryCaseY( RimSummaryCase* sumCase ) clearErrorBars(); } - bool isEnsembleCurve = false; - if ( sumCase && sumCase->ensemble() ) isEnsembleCurve = true; - - setIsEnsembleCurve( isEnsembleCurve ); - m_yValuesSummaryCase = sumCase; } @@ -446,11 +437,6 @@ RiaDefines::HorizontalAxisType RimSummaryCurve::axisTypeX() const void RimSummaryCurve::setSummaryCaseX( RimSummaryCase* sumCase ) { m_xValuesSummaryCase = sumCase; - - bool isEnsembleCurve = false; - if ( sumCase && sumCase->ensemble() ) isEnsembleCurve = true; - - setIsEnsembleCurve( isEnsembleCurve ); } //-------------------------------------------------------------------------------------------------- @@ -490,15 +476,8 @@ RiuPlotAxis RimSummaryCurve::axisY() const //-------------------------------------------------------------------------------------------------- bool RimSummaryCurve::isEnsembleCurve() const { - return m_isEnsembleCurve().isTrue(); -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -void RimSummaryCurve::setIsEnsembleCurve( bool isEnsembleCurve ) -{ - m_isEnsembleCurve.v() = isEnsembleCurve ? caf::Tristate::State::True : caf::Tristate::State::False; + auto curveSet = firstAncestorOrThisOfType(); + return curveSet != nullptr; } //-------------------------------------------------------------------------------------------------- @@ -818,11 +797,6 @@ void RimSummaryCurve::initAfterRead() if ( plot ) m_yPlotAxisProperties = plot->axisPropertiesForPlotAxis( RiuPlotAxis( m_plotAxis_OBSOLETE() ) ); } - if ( m_isEnsembleCurve().isPartiallyTrue() ) - { - m_isEnsembleCurve.v() = ( summaryCaseY() && summaryCaseY()->ensemble() ) ? caf::Tristate::State::True : caf::Tristate::State::False; - } - if ( RimProject::current()->isProjectFileVersionEqualOrOlderThan( "2024.3" ) ) { calculateCurveInterpolationFromAddress(); diff --git a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryCurve.h b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryCurve.h index f1ad566eef..9a533d8a3d 100644 --- a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryCurve.h +++ b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryCurve.h @@ -34,7 +34,6 @@ #include "RimStackablePlotCurve.h" #include "cafAppEnum.h" -#include "cafTristate.h" class RifSummaryReaderInterface; class RimSummaryCase; @@ -93,7 +92,6 @@ public: // Other bool isEnsembleCurve() const; - void setIsEnsembleCurve( bool isEnsembleCurve ); void updatePlotAxis(); void enableVectorNameInCurveName( bool enable ); @@ -166,9 +164,6 @@ private: caf::PdmField m_xPushButtonSelectSummaryAddress; caf::PdmPtrField m_xPlotAxisProperties; - // Other fields - caf::PdmField m_isEnsembleCurve; - caf::PdmChildField m_curveNameConfig; caf::PdmField> m_plotAxis_OBSOLETE; caf::PdmField m_isTopZWithinCategory; diff --git a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryEnsembleTools.cpp b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryEnsembleTools.cpp index 7b1839b70a..0da54b9cb1 100644 --- a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryEnsembleTools.cpp +++ b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryEnsembleTools.cpp @@ -407,16 +407,19 @@ void RimSummaryEnsembleTools::highlightCurvesForSummaryCases( const std::vector< auto plotWidget = dynamic_cast( plot->plotWidget() ); if ( !plotWidget ) continue; - auto summaryCurves = plot->summaryAndEnsembleCurves(); + // Do nothing if no curve sets are present, as this will cause the single curve highlight to be removed + if ( plot->curveSets().empty() ) continue; std::vector curvesForSameRealization; - - for ( auto curve : summaryCurves ) + for ( const auto& curveSet : plot->curveSets() ) { - auto summaryCaseY = curve->summaryCaseY(); - if ( std::find( sourceCases.begin(), sourceCases.end(), summaryCaseY ) != sourceCases.end() ) + for ( auto ensembleCurve : curveSet->curves() ) { - curvesForSameRealization.push_back( curve ); + auto summaryCaseY = ensembleCurve->summaryCaseY(); + if ( std::find( sourceCases.begin(), sourceCases.end(), summaryCaseY ) != sourceCases.end() ) + { + curvesForSameRealization.push_back( ensembleCurve ); + } } }