From 5f465bf19a3b3c9ed1ff3d15bd49ba64d8b6bf97 Mon Sep 17 00:00:00 2001 From: Kristian Bendiksen Date: Fri, 14 Aug 2026 10:37:26 +0200 Subject: [PATCH] #14524 Histogram: Set linear binning when selecting a non-logarithmic property Make the property-driven binning mode symmetric: selecting a non-logarithmic result (e.g. FLUXNUM) after a logarithmic one (e.g. PERMX) sets the binning mode and x-axis back to linear. Replace the one-way logarithmicBinningEnabled signal with a binningModeChanged signal carrying the new mode, so the x-axis scale follows the binning mode in both directions, also when the binning mode itself is changed in the UI. --- .../RimGridStatisticsHistogramDataSource.cpp | 20 ++++++++++------- .../RimGridStatisticsHistogramDataSource.h | 2 +- .../Histogram/RimHistogramCurve.cpp | 10 ++++----- .../Histogram/RimHistogramCurve.h | 4 +++- .../Histogram/RimHistogramDataSource.cpp | 12 +++++----- .../Histogram/RimHistogramDataSource.h | 8 +++---- .../UnitTests/RimHistogramDataSource-Test.cpp | 22 +++++++++---------- 7 files changed, 41 insertions(+), 37 deletions(-) diff --git a/ApplicationLibCode/ProjectDataModel/Histogram/RimGridStatisticsHistogramDataSource.cpp b/ApplicationLibCode/ProjectDataModel/Histogram/RimGridStatisticsHistogramDataSource.cpp index e3f85cc2e6..c2bfb9c8a9 100644 --- a/ApplicationLibCode/ProjectDataModel/Histogram/RimGridStatisticsHistogramDataSource.cpp +++ b/ApplicationLibCode/ProjectDataModel/Histogram/RimGridStatisticsHistogramDataSource.cpp @@ -352,23 +352,27 @@ void RimGridStatisticsHistogramDataSource::loadDataAndUpdate() } //-------------------------------------------------------------------------------------------------- -/// Logarithmic results are best viewed with logarithmic binning: enable it once when a logarithmic -/// property is selected. The user stays in control of the binning mode afterwards. +/// //-------------------------------------------------------------------------------------------------- -bool RimGridStatisticsHistogramDataSource::shouldEnableLogarithmicBinning( const QString& previousResultVariable, - const QString& newResultVariable ) +RigHistogramCalculator::BinningMode RimGridStatisticsHistogramDataSource::binningModeForResult( const QString& resultVariable ) { - return newResultVariable != previousResultVariable && RiaResultNames::isLogarithmicResult( newResultVariable ); + return RiaResultNames::isLogarithmicResult( resultVariable ) ? RigHistogramCalculator::BinningMode::LOGARITHMIC + : RigHistogramCalculator::BinningMode::LINEAR; } //-------------------------------------------------------------------------------------------------- -/// +/// The binning mode follows the selected property: logarithmic results are best viewed with +/// logarithmic binning, others with linear binning. Only an actual property change updates the +/// binning mode: the user stays in control of the setting afterwards. //-------------------------------------------------------------------------------------------------- void RimGridStatisticsHistogramDataSource::updateBinningModeOnPropertyChange() { const QString resultVariable = m_property()->resultVariable(); - if ( shouldEnableLogarithmicBinning( m_previousResultVariable, resultVariable ) ) enableLogarithmicBinning(); - m_previousResultVariable = resultVariable; + if ( resultVariable != m_previousResultVariable ) + { + setBinningMode( binningModeForResult( resultVariable ) ); + m_previousResultVariable = resultVariable; + } } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/ProjectDataModel/Histogram/RimGridStatisticsHistogramDataSource.h b/ApplicationLibCode/ProjectDataModel/Histogram/RimGridStatisticsHistogramDataSource.h index 4274d514f8..6b3c51c3e0 100644 --- a/ApplicationLibCode/ProjectDataModel/Histogram/RimGridStatisticsHistogramDataSource.h +++ b/ApplicationLibCode/ProjectDataModel/Histogram/RimGridStatisticsHistogramDataSource.h @@ -64,7 +64,7 @@ public: void setPropertiesFromView( RimEclipseView* view ); - static bool shouldEnableLogarithmicBinning( const QString& previousResultVariable, const QString& newResultVariable ); + static RigHistogramCalculator::BinningMode binningModeForResult( const QString& resultVariable ); protected: QList calculateValueOptions( const caf::PdmFieldHandle* fieldNeedingOptions ) override; diff --git a/ApplicationLibCode/ProjectDataModel/Histogram/RimHistogramCurve.cpp b/ApplicationLibCode/ProjectDataModel/Histogram/RimHistogramCurve.cpp index 5f8eba66c6..7864b3c0f0 100644 --- a/ApplicationLibCode/ProjectDataModel/Histogram/RimHistogramCurve.cpp +++ b/ApplicationLibCode/ProjectDataModel/Histogram/RimHistogramCurve.cpp @@ -117,7 +117,7 @@ void RimHistogramCurve::setDataSource( RimHistogramDataSource* dataSource ) m_dataSource->uiCapability()->setUiTreeHidden( true ); m_dataSource->dataSourceChanged.connect( this, &RimHistogramCurve::onDataSourceChanged ); m_dataSource->cumulativeChanged.connect( this, &RimHistogramCurve::onCumulativeChanged ); - m_dataSource->logarithmicBinningEnabled.connect( this, &RimHistogramCurve::onLogarithmicBinningEnabled ); + m_dataSource->binningModeChanged.connect( this, &RimHistogramCurve::onBinningModeChanged ); } } @@ -606,16 +606,16 @@ void RimHistogramCurve::onCumulativeChanged( const caf::SignalEmitter* emitter ) } //-------------------------------------------------------------------------------------------------- -/// Logarithmic bins are best viewed on a logarithmic axis: enable it once when logarithmic binning -/// is selected. The user stays in control of the axis setting afterwards. +/// Bins are best viewed on a matching axis: select a logarithmic axis for logarithmic binning and a +/// linear axis for linear binning. The user stays in control of the axis setting afterwards. //-------------------------------------------------------------------------------------------------- -void RimHistogramCurve::onLogarithmicBinningEnabled( const caf::SignalEmitter* emitter ) +void RimHistogramCurve::onBinningModeChanged( const caf::SignalEmitter* emitter, RigHistogramCalculator::BinningMode binningMode ) { auto plot = firstAncestorOrThisOfType(); if ( !plot ) return; auto axisProperties = dynamic_cast( plot->axisPropertiesForPlotAxis( axisX() ) ); - if ( axisProperties ) axisProperties->setLogarithmicScaleEnabled( true ); + if ( axisProperties ) axisProperties->setLogarithmicScaleEnabled( binningMode == RigHistogramCalculator::BinningMode::LOGARITHMIC ); } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/ProjectDataModel/Histogram/RimHistogramCurve.h b/ApplicationLibCode/ProjectDataModel/Histogram/RimHistogramCurve.h index 7addbf0e0c..daaac5a108 100644 --- a/ApplicationLibCode/ProjectDataModel/Histogram/RimHistogramCurve.h +++ b/ApplicationLibCode/ProjectDataModel/Histogram/RimHistogramCurve.h @@ -18,6 +18,8 @@ #pragma once +#include "RigStatisticsMath.h" + #include "RiuPlotAnnotationTool.h" #include "cafPdmChildField.h" #include "cafPdmField.h" @@ -86,7 +88,7 @@ protected: void onDataSourceChanged( const caf::SignalEmitter* emitter ); void onCumulativeChanged( const caf::SignalEmitter* emitter ); - void onLogarithmicBinningEnabled( const caf::SignalEmitter* emitter ); + void onBinningModeChanged( const caf::SignalEmitter* emitter, RigHistogramCalculator::BinningMode binningMode ); void updateCumulativeCurve(); void connectReferencedDataSourceSignals(); diff --git a/ApplicationLibCode/ProjectDataModel/Histogram/RimHistogramDataSource.cpp b/ApplicationLibCode/ProjectDataModel/Histogram/RimHistogramDataSource.cpp index b98f8ecf0d..de60c851d2 100644 --- a/ApplicationLibCode/ProjectDataModel/Histogram/RimHistogramDataSource.cpp +++ b/ApplicationLibCode/ProjectDataModel/Histogram/RimHistogramDataSource.cpp @@ -57,7 +57,7 @@ void caf::AppEnum::setUp() RimHistogramDataSource::RimHistogramDataSource() : dataSourceChanged( this ) , cumulativeChanged( this ) - , logarithmicBinningEnabled( this ) + , binningModeChanged( this ) { CAF_PDM_InitObject( "Histogram Data Source", ); @@ -93,10 +93,10 @@ void RimHistogramDataSource::setShowCumulativeCurve( bool showCumulativeCurve ) //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void RimHistogramDataSource::enableLogarithmicBinning() +void RimHistogramDataSource::setBinningMode( RigHistogramCalculator::BinningMode binningMode ) { - m_binningMode = RigHistogramCalculator::BinningMode::LOGARITHMIC; - logarithmicBinningEnabled.send(); + m_binningMode = binningMode; + binningModeChanged.send( binningMode ); } //-------------------------------------------------------------------------------------------------- @@ -122,9 +122,9 @@ QString RimHistogramDataSource::userDefinedRangeFilterText( double min, double m //-------------------------------------------------------------------------------------------------- void RimHistogramDataSource::fieldChangedByUi( const caf::PdmFieldHandle* changedField, const QVariant& oldValue, const QVariant& newValue ) { - if ( changedField == &m_binningMode && m_binningMode() == RigHistogramCalculator::BinningMode::LOGARITHMIC ) + if ( changedField == &m_binningMode ) { - logarithmicBinningEnabled.send(); + binningModeChanged.send( m_binningMode() ); } } diff --git a/ApplicationLibCode/ProjectDataModel/Histogram/RimHistogramDataSource.h b/ApplicationLibCode/ProjectDataModel/Histogram/RimHistogramDataSource.h index 30eb216b6e..6769b5fb5b 100644 --- a/ApplicationLibCode/ProjectDataModel/Histogram/RimHistogramDataSource.h +++ b/ApplicationLibCode/ProjectDataModel/Histogram/RimHistogramDataSource.h @@ -67,9 +67,9 @@ public: RimHistogramDataSource(); ~RimHistogramDataSource() override; - caf::Signal<> dataSourceChanged; - caf::Signal<> cumulativeChanged; - caf::Signal<> logarithmicBinningEnabled; + caf::Signal<> dataSourceChanged; + caf::Signal<> cumulativeChanged; + caf::Signal binningModeChanged; virtual std::string unitNameX() const = 0; virtual std::string unitNameY() const = 0; @@ -80,7 +80,7 @@ public: virtual bool showCumulativeCurve() const; virtual void setShowCumulativeCurve( bool showCumulativeCurve ); - void enableLogarithmicBinning(); + void setBinningMode( RigHistogramCalculator::BinningMode binningMode ); virtual std::vector filterDescriptions() const; static QString userDefinedRangeFilterText( double min, double max ); diff --git a/ApplicationLibCode/UnitTests/RimHistogramDataSource-Test.cpp b/ApplicationLibCode/UnitTests/RimHistogramDataSource-Test.cpp index 8cd268a851..3f8b2d3f4d 100644 --- a/ApplicationLibCode/UnitTests/RimHistogramDataSource-Test.cpp +++ b/ApplicationLibCode/UnitTests/RimHistogramDataSource-Test.cpp @@ -247,18 +247,16 @@ TEST( RimHistogramDataSourceTest, FilterDescriptionsDefaultIsEmpty ) //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -TEST( RimHistogramDataSourceTest, ShouldEnableLogarithmicBinning ) +TEST( RimHistogramDataSourceTest, BinningModeForResult ) { - // Selecting a logarithmic property enables logarithmic binning - EXPECT_TRUE( RimGridStatisticsHistogramDataSource::shouldEnableLogarithmicBinning( "", "PERMX" ) ); - EXPECT_TRUE( RimGridStatisticsHistogramDataSource::shouldEnableLogarithmicBinning( "PORO", "PERMZ" ) ); - EXPECT_TRUE( RimGridStatisticsHistogramDataSource::shouldEnableLogarithmicBinning( "PORO", "TRANX" ) ); - EXPECT_TRUE( RimGridStatisticsHistogramDataSource::shouldEnableLogarithmicBinning( "PERMX", "PERMZ" ) ); + // Logarithmic results get logarithmic binning + EXPECT_EQ( RigHistogramCalculator::BinningMode::LOGARITHMIC, RimGridStatisticsHistogramDataSource::binningModeForResult( "PERMX" ) ); + EXPECT_EQ( RigHistogramCalculator::BinningMode::LOGARITHMIC, RimGridStatisticsHistogramDataSource::binningModeForResult( "PERMZ" ) ); + EXPECT_EQ( RigHistogramCalculator::BinningMode::LOGARITHMIC, RimGridStatisticsHistogramDataSource::binningModeForResult( "TRANX" ) ); + EXPECT_EQ( RigHistogramCalculator::BinningMode::LOGARITHMIC, RimGridStatisticsHistogramDataSource::binningModeForResult( "MULTZ" ) ); - // Linear properties never enable logarithmic binning - EXPECT_FALSE( RimGridStatisticsHistogramDataSource::shouldEnableLogarithmicBinning( "", "PORO" ) ); - EXPECT_FALSE( RimGridStatisticsHistogramDataSource::shouldEnableLogarithmicBinning( "PERMX", "PORO" ) ); - - // An unchanged property must not re-enable logarithmic binning: the user stays in control - EXPECT_FALSE( RimGridStatisticsHistogramDataSource::shouldEnableLogarithmicBinning( "PERMX", "PERMX" ) ); + // All other results get linear binning + EXPECT_EQ( RigHistogramCalculator::BinningMode::LINEAR, RimGridStatisticsHistogramDataSource::binningModeForResult( "PORO" ) ); + EXPECT_EQ( RigHistogramCalculator::BinningMode::LINEAR, RimGridStatisticsHistogramDataSource::binningModeForResult( "FLUXNUM" ) ); + EXPECT_EQ( RigHistogramCalculator::BinningMode::LINEAR, RimGridStatisticsHistogramDataSource::binningModeForResult( "" ) ); }