From 3621b4ea57fc6f6c834c131d3067cc1fd79e166e Mon Sep 17 00:00:00 2001 From: Magne Sjaastad Date: Thu, 6 Nov 2025 10:56:33 +0100 Subject: [PATCH] #13137 Make sure calculated vectors appears in tree view When populating the addresses to be displayed in the tree view, the native file readers must be populated first. The calculated addresses depend on addresses available in native readers. --- .../RifMultipleSummaryReaders.cpp | 46 ++++++++++++++----- 1 file changed, 34 insertions(+), 12 deletions(-) diff --git a/ApplicationLibCode/FileInterface/RifMultipleSummaryReaders.cpp b/ApplicationLibCode/FileInterface/RifMultipleSummaryReaders.cpp index 1dd204ef1d..c36d9ce741 100644 --- a/ApplicationLibCode/FileInterface/RifMultipleSummaryReaders.cpp +++ b/ApplicationLibCode/FileInterface/RifMultipleSummaryReaders.cpp @@ -34,18 +34,19 @@ void RifMultipleSummaryReaders::addReader( std::unique_ptr( first.get() ) != nullptr; - bool isSecondCalc = dynamic_cast( second.get() ) != nullptr; - if ( isFirstCalc && !isSecondCalc ) return true; - if ( !isFirstCalc && isSecondCalc ) return false; - return first->serialNumber() < second->serialNumber(); - } ); + // Reorder readers so the calculated reader is at the front of the vector. This ensures that RifMultipleSummaryReaders::values() + // evaluates calculated reader first. + auto calculatedReaderFirst = []( const auto& first, const auto& second ) + { + bool isFirstCalc = dynamic_cast( first.get() ) != nullptr; + bool isSecondCalc = dynamic_cast( second.get() ) != nullptr; + if ( isFirstCalc && !isSecondCalc ) return true; + if ( !isFirstCalc && isSecondCalc ) return false; + return first->serialNumber() < second->serialNumber(); + }; + + std::sort( m_readers.begin(), m_readers.end(), calculatedReaderFirst ); } //-------------------------------------------------------------------------------------------------- @@ -140,7 +141,28 @@ void RifMultipleSummaryReaders::createAndSetAddresses() m_allErrorAddresses.clear(); m_allResultAddresses.clear(); - for ( auto& reader : m_readers ) + // Loop over readers in inverted order to ensure calculated readers are processed after native file readers. Creation of summary + // addresses for calculated readers depend on native readers. + // https://github.com/OPM/ResInsight/issues/13137 + + std::vector readers; + for ( auto& r : m_readers ) + { + readers.push_back( r.get() ); + } + + auto nativeReaderFirst = []( const auto& first, const auto& second ) + { + bool isFirstCalc = dynamic_cast( first ) != nullptr; + bool isSecondCalc = dynamic_cast( second ) != nullptr; + if ( isFirstCalc && !isSecondCalc ) return false; + if ( !isFirstCalc && isSecondCalc ) return true; + return first->serialNumber() < second->serialNumber(); + }; + + std::sort( readers.begin(), readers.end(), nativeReaderFirst ); + + for ( auto reader : readers ) { reader->createAndSetAddresses();