From fa61fbb78bde0d71fc27147988f5f43cf969d945 Mon Sep 17 00:00:00 2001 From: Magne Sjaastad Date: Tue, 6 May 2025 15:08:53 +0200 Subject: [PATCH] #12457 Move management of time axis annotations Use RimTimeAxisAnnotationUpdater for management of annotation objects. --- .../Annotations/CMakeLists_files.cmake | 2 + .../Annotations/RimTimeAxisAnnotation.cpp | 67 ++++++++----- .../Annotations/RimTimeAxisAnnotation.h | 14 ++- .../RimTimeAxisAnnotationUpdater.cpp | 76 +++++++++++++++ .../RimTimeAxisAnnotationUpdater.h | 32 +++++++ .../Summary/RimEnsembleCurveSet.cpp | 94 +++++++++++-------- .../Summary/RimEnsembleCurveSet.h | 3 + .../Summary/RimSummaryDeclineCurve.cpp | 38 ++++---- .../Summary/RimSummaryDeclineCurve.h | 5 +- .../Summary/RimSummaryMultiPlot.cpp | 16 ++-- .../Summary/RimSummaryPlot.cpp | 51 +--------- .../ProjectDataModel/Summary/RimSummaryPlot.h | 7 +- .../RimSummaryRegressionAnalysisCurve.cpp | 33 +++---- .../RimSummaryRegressionAnalysisCurve.h | 12 +-- 14 files changed, 284 insertions(+), 166 deletions(-) create mode 100644 ApplicationLibCode/ProjectDataModel/Annotations/RimTimeAxisAnnotationUpdater.cpp create mode 100644 ApplicationLibCode/ProjectDataModel/Annotations/RimTimeAxisAnnotationUpdater.h diff --git a/ApplicationLibCode/ProjectDataModel/Annotations/CMakeLists_files.cmake b/ApplicationLibCode/ProjectDataModel/Annotations/CMakeLists_files.cmake index c53dc65bb2..4abb4c1cf3 100644 --- a/ApplicationLibCode/ProjectDataModel/Annotations/CMakeLists_files.cmake +++ b/ApplicationLibCode/ProjectDataModel/Annotations/CMakeLists_files.cmake @@ -15,6 +15,7 @@ set(SOURCE_GROUP_HEADER_FILES ${CMAKE_CURRENT_LIST_DIR}/RimPolylineTarget.h ${CMAKE_CURRENT_LIST_DIR}/RimPlotAxisAnnotation.h ${CMAKE_CURRENT_LIST_DIR}/RimTimeAxisAnnotation.h + ${CMAKE_CURRENT_LIST_DIR}/RimTimeAxisAnnotationUpdater.h ${CMAKE_CURRENT_LIST_DIR}/RimEquilibriumAxisAnnotation.h ${CMAKE_CURRENT_LIST_DIR}/RimPlotRectAnnotation.h ) @@ -36,6 +37,7 @@ set(SOURCE_GROUP_SOURCE_FILES ${CMAKE_CURRENT_LIST_DIR}/RimPolylineTarget.cpp ${CMAKE_CURRENT_LIST_DIR}/RimPlotAxisAnnotation.cpp ${CMAKE_CURRENT_LIST_DIR}/RimTimeAxisAnnotation.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimTimeAxisAnnotationUpdater.cpp ${CMAKE_CURRENT_LIST_DIR}/RimEquilibriumAxisAnnotation.cpp ${CMAKE_CURRENT_LIST_DIR}/RimPlotRectAnnotation.cpp ) diff --git a/ApplicationLibCode/ProjectDataModel/Annotations/RimTimeAxisAnnotation.cpp b/ApplicationLibCode/ProjectDataModel/Annotations/RimTimeAxisAnnotation.cpp index e0c4382b08..261d539719 100644 --- a/ApplicationLibCode/ProjectDataModel/Annotations/RimTimeAxisAnnotation.cpp +++ b/ApplicationLibCode/ProjectDataModel/Annotations/RimTimeAxisAnnotation.cpp @@ -33,6 +33,21 @@ CAF_PDM_SOURCE_INIT( RimTimeAxisAnnotation, "RimTimeAxisAnnotation" ); +namespace internal +{ + +QString defaultDateTimeFormatString() +{ + auto dateFormatString = RiaQDateTimeTools::dateFormatString( RiaPreferences::current()->dateFormat(), + RiaDefines::DateFormatComponents::DATE_FORMAT_YEAR_MONTH_DAY ); + + auto timeFormatString = RiaQDateTimeTools::timeFormatString( RiaPreferences::current()->timeFormat(), + RiaDefines::TimeFormatComponents::TIME_FORMAT_HOUR_MINUTE ); + + return QString( "%1 %2" ).arg( dateFormatString ).arg( timeFormatString ); +} +} // namespace internal + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -44,6 +59,31 @@ RimTimeAxisAnnotation::RimTimeAxisAnnotation() m_value.uiCapability()->setUiHidden( true ); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimTimeAxisAnnotation* RimTimeAxisAnnotation::createTimeAnnotation( time_t time, const cvf::Color3f& color, const QString& dateTimeFormatString ) +{ + RimTimeAxisAnnotation* annotation = new RimTimeAxisAnnotation(); + annotation->setTime( time, dateTimeFormatString ); + annotation->setColor( color ); + return annotation; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimTimeAxisAnnotation* RimTimeAxisAnnotation::createTimeRangeAnnotation( time_t startTime, + time_t endTime, + const cvf::Color3f& color, + const QString& dateTimeFormatString ) +{ + RimTimeAxisAnnotation* annotation = new RimTimeAxisAnnotation(); + annotation->setTimeRange( startTime, endTime, dateTimeFormatString ); + annotation->setColor( color ); + return annotation; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -51,18 +91,7 @@ void RimTimeAxisAnnotation::setTime( time_t time, const QString& dateTimeFormatS { m_value = RiaTimeTTools::toDouble( time ); - QString formatString = dateTimeFormatString; - - if ( formatString.isEmpty() ) - { - QString dateFormatString = RiaQDateTimeTools::dateFormatString( RiaPreferences::current()->dateFormat(), - RiaDefines::DateFormatComponents::DATE_FORMAT_YEAR_MONTH_DAY ); - - QString timeFormatString = RiaQDateTimeTools::timeFormatString( RiaPreferences::current()->timeFormat(), - RiaDefines::TimeFormatComponents::TIME_FORMAT_HOUR_MINUTE ); - - QString dateTimeFormatString = QString( "%1 %2" ).arg( dateFormatString ).arg( timeFormatString ); - } + QString formatString = dateTimeFormatString.isEmpty() ? internal::defaultDateTimeFormatString() : dateTimeFormatString; m_name = RiaQDateTimeTools::toStringUsingApplicationLocale( RiaQDateTimeTools::fromTime_t( time ), formatString ); @@ -72,22 +101,16 @@ void RimTimeAxisAnnotation::setTime( time_t time, const QString& dateTimeFormatS //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void RimTimeAxisAnnotation::setTimeRange( time_t startTime, time_t endTime ) +void RimTimeAxisAnnotation::setTimeRange( time_t startTime, time_t endTime, const QString& dateTimeFormatString ) { m_rangeStart = RiaTimeTTools::toDouble( startTime ); m_rangeEnd = RiaTimeTTools::toDouble( endTime ); - QString dateFormatString = RiaQDateTimeTools::dateFormatString( RiaPreferences::current()->dateFormat(), - RiaDefines::DateFormatComponents::DATE_FORMAT_YEAR_MONTH_DAY ); - - QString timeFormatString = RiaQDateTimeTools::timeFormatString( RiaPreferences::current()->timeFormat(), - RiaDefines::TimeFormatComponents::TIME_FORMAT_HOUR_MINUTE ); - - QString dateTimeFormatString = QString( "%1 %2" ).arg( dateFormatString ).arg( timeFormatString ); + QString formatString = dateTimeFormatString.isEmpty() ? internal::defaultDateTimeFormatString() : dateTimeFormatString; m_name = QString( "%0 - %1" ) - .arg( RiaQDateTimeTools::toStringUsingApplicationLocale( RiaQDateTimeTools::fromTime_t( startTime ), dateTimeFormatString ) ) - .arg( RiaQDateTimeTools::toStringUsingApplicationLocale( RiaQDateTimeTools::fromTime_t( endTime ), dateTimeFormatString ) ); + .arg( RiaQDateTimeTools::toStringUsingApplicationLocale( RiaQDateTimeTools::fromTime_t( startTime ), formatString ) ) + .arg( RiaQDateTimeTools::toStringUsingApplicationLocale( RiaQDateTimeTools::fromTime_t( endTime ), formatString ) ); setAnnotationType( AnnotationType::RANGE ); } diff --git a/ApplicationLibCode/ProjectDataModel/Annotations/RimTimeAxisAnnotation.h b/ApplicationLibCode/ProjectDataModel/Annotations/RimTimeAxisAnnotation.h index 7073dac5dc..382e81e6b9 100644 --- a/ApplicationLibCode/ProjectDataModel/Annotations/RimTimeAxisAnnotation.h +++ b/ApplicationLibCode/ProjectDataModel/Annotations/RimTimeAxisAnnotation.h @@ -38,12 +38,20 @@ class RimTimeAxisAnnotation : public RimPlotAxisAnnotation public: RimTimeAxisAnnotation(); - void setTime( time_t time, const QString& dateTimeFormatString ); - void setTimeRange( time_t startTime, time_t endTime ); + static RimTimeAxisAnnotation* + createTimeAnnotation( time_t time, const cvf::Color3f& color, const QString& dateTimeFormatString = QString() ); + + static RimTimeAxisAnnotation* createTimeRangeAnnotation( time_t startTime, + time_t endTime, + const cvf::Color3f& color, + const QString& dateTimeFormatString = QString() ); + +private: + void setTime( time_t time, const QString& dateTimeFormatString = QString() ); + void setTimeRange( time_t startTime, time_t endTime, const QString& dateTimeFormatString = QString() ); void setDefaultColor(); -protected: void defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) override; void initAfterRead() override; diff --git a/ApplicationLibCode/ProjectDataModel/Annotations/RimTimeAxisAnnotationUpdater.cpp b/ApplicationLibCode/ProjectDataModel/Annotations/RimTimeAxisAnnotationUpdater.cpp new file mode 100644 index 0000000000..ab8c6a66e5 --- /dev/null +++ b/ApplicationLibCode/ProjectDataModel/Annotations/RimTimeAxisAnnotationUpdater.cpp @@ -0,0 +1,76 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2025 Equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#include "RimTimeAxisAnnotationUpdater.h" + +#include "RimEnsembleCurveSet.h" +#include "RimSummaryDeclineCurve.h" +#include "RimSummaryPlot.h" +#include "RimSummaryRegressionAnalysisCurve.h" +#include "RimSummaryTimeAxisProperties.h" + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::vector RimTimeAxisAnnotationUpdater::createTimeAnnotations( const RimSummaryPlot* summaryPlot ) +{ + if ( !summaryPlot ) return {}; + + std::vector timeAnnotations; + + for ( auto curve : summaryPlot->allCurves() ) + { + if ( auto declineCurve = dynamic_cast( curve ) ) + { + auto annotations = declineCurve->createTimeAnnotations(); + timeAnnotations.insert( timeAnnotations.end(), annotations.begin(), annotations.end() ); + } + else if ( auto regressionCurve = dynamic_cast( curve ) ) + { + auto annotations = regressionCurve->createTimeAnnotations(); + timeAnnotations.insert( timeAnnotations.end(), annotations.begin(), annotations.end() ); + } + } + + for ( auto curveSet : summaryPlot->curveSets() ) + { + auto annotations = curveSet->createTimeAnnotations(); + timeAnnotations.insert( timeAnnotations.end(), annotations.begin(), annotations.end() ); + } + + return timeAnnotations; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimTimeAxisAnnotationUpdater::updateTimeAnnotationObjects( RimSummaryPlot* summaryPlot ) +{ + if ( !summaryPlot ) return; + + if ( auto axisProps = summaryPlot->timeAxisProperties() ) + { + axisProps->removeAllAnnotations(); + + for ( auto annotation : createTimeAnnotations( summaryPlot ) ) + { + axisProps->appendAnnotation( annotation ); + } + summaryPlot->updateAxes(); + } +} diff --git a/ApplicationLibCode/ProjectDataModel/Annotations/RimTimeAxisAnnotationUpdater.h b/ApplicationLibCode/ProjectDataModel/Annotations/RimTimeAxisAnnotationUpdater.h new file mode 100644 index 0000000000..279ae15275 --- /dev/null +++ b/ApplicationLibCode/ProjectDataModel/Annotations/RimTimeAxisAnnotationUpdater.h @@ -0,0 +1,32 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2025 Equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#pragma once + +#include + +class RimEnsembleCurveSet; +class RimSummaryDeclineCurve; +class RimSummaryPlot; +class RimTimeAxisAnnotation; + +namespace RimTimeAxisAnnotationUpdater +{ +void updateTimeAnnotationObjects( RimSummaryPlot* summaryPlot ); +std::vector createTimeAnnotations( const RimSummaryPlot* summaryPlot ); +}; // namespace RimTimeAxisAnnotationUpdater diff --git a/ApplicationLibCode/ProjectDataModel/Summary/RimEnsembleCurveSet.cpp b/ApplicationLibCode/ProjectDataModel/Summary/RimEnsembleCurveSet.cpp index c19ec192de..a14d5a1bb5 100644 --- a/ApplicationLibCode/ProjectDataModel/Summary/RimEnsembleCurveSet.cpp +++ b/ApplicationLibCode/ProjectDataModel/Summary/RimEnsembleCurveSet.cpp @@ -53,6 +53,7 @@ #include "RimSummaryEnsemble.h" #include "RimSummaryMultiPlot.h" #include "RimSummaryPlot.h" +#include "RimTimeAxisAnnotation.h" #include "RimTimeStepFilter.h" #include "RiuAbstractLegendFrame.h" @@ -522,6 +523,57 @@ std::pair RimEnsembleCurveSet::selectedTimeStepRange() const return { selectedMin, selectedMax }; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::vector RimEnsembleCurveSet::createTimeAnnotations() const +{ + if ( !m_showCurves() ) return {}; + + bool showTimeRange = false; + bool showSelectedTimeSteps = false; + + if ( ( m_colorMode() == ColorMode::BY_OBJECTIVE_FUNCTION && + m_objectiveFunction()->functionType() == RimObjectiveFunction::FunctionType::F1 ) || + ( m_colorMode() == ColorMode::BY_CUSTOM_OBJECTIVE_FUNCTION && m_customObjectiveFunction() && + m_customObjectiveFunction()->weightContainsFunctionType( RimObjectiveFunction::FunctionType::F1 ) ) ) + { + showTimeRange = true; + } + + if ( ( m_colorMode() == ColorMode::BY_OBJECTIVE_FUNCTION && + m_objectiveFunction()->functionType() == RimObjectiveFunction::FunctionType::F2 ) || + ( m_colorMode() == ColorMode::BY_CUSTOM_OBJECTIVE_FUNCTION && m_customObjectiveFunction() && + m_customObjectiveFunction()->weightContainsFunctionType( RimObjectiveFunction::FunctionType::F2 ) ) ) + { + showSelectedTimeSteps = true; + } + + for ( auto filter : m_curveFilters->filters() ) + { + if ( filter->isActive() && filter->filterMode() == RimEnsembleCurveFilter::FilterMode::SUMMARY_VALUE ) showTimeRange = true; + } + + std::vector timeAnnotations; + if ( showTimeRange ) + { + auto [minTimeStep, maxTimeStep] = selectedTimeStepRange(); + + timeAnnotations.push_back( RimTimeAxisAnnotation::createTimeRangeAnnotation( minTimeStep, maxTimeStep, m_colorForRealizations ) ); + } + + if ( showSelectedTimeSteps ) + { + for ( QDateTime timeStep : m_selectedTimeSteps() ) + { + timeAnnotations.push_back( + RimTimeAxisAnnotation::createTimeAnnotation( RiaTimeTTools::fromQDateTime( timeStep ), m_colorForRealizations ) ); + } + } + + return timeAnnotations; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -2067,48 +2119,10 @@ void RimEnsembleCurveSet::updateCurveColors() //-------------------------------------------------------------------------------------------------- void RimEnsembleCurveSet::updateTimeAnnotations() { - auto plot = firstAncestorOrThisOfTypeAsserted(); - plot->removeAllTimeAnnotations(); - - bool showTimeRange = false; - bool showSelectedTimeSteps = false; - - if ( ( m_colorMode() == ColorMode::BY_OBJECTIVE_FUNCTION && - m_objectiveFunction()->functionType() == RimObjectiveFunction::FunctionType::F1 ) || - ( m_colorMode() == ColorMode::BY_CUSTOM_OBJECTIVE_FUNCTION && m_customObjectiveFunction() && - m_customObjectiveFunction()->weightContainsFunctionType( RimObjectiveFunction::FunctionType::F1 ) ) ) + if ( auto plot = firstAncestorOrThisOfType() ) { - showTimeRange = true; + plot->updateAndRedrawTimeAnnotations(); } - - if ( ( m_colorMode() == ColorMode::BY_OBJECTIVE_FUNCTION && - m_objectiveFunction()->functionType() == RimObjectiveFunction::FunctionType::F2 ) || - ( m_colorMode() == ColorMode::BY_CUSTOM_OBJECTIVE_FUNCTION && m_customObjectiveFunction() && - m_customObjectiveFunction()->weightContainsFunctionType( RimObjectiveFunction::FunctionType::F2 ) ) ) - { - showSelectedTimeSteps = true; - } - - for ( auto filter : m_curveFilters->filters() ) - { - if ( filter->isActive() && filter->filterMode() == RimEnsembleCurveFilter::FilterMode::SUMMARY_VALUE ) showTimeRange = true; - } - - if ( showTimeRange ) - { - auto [minTimeStep, maxTimeStep] = selectedTimeStepRange(); - plot->addTimeRangeAnnotation( minTimeStep, maxTimeStep ); - } - - if ( showSelectedTimeSteps ) - { - for ( QDateTime timeStep : m_selectedTimeSteps() ) - { - plot->addTimeAnnotation( RiaTimeTTools::fromQDateTime( timeStep ) ); - } - } - - plot->updateAxes(); } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/ProjectDataModel/Summary/RimEnsembleCurveSet.h b/ApplicationLibCode/ProjectDataModel/Summary/RimEnsembleCurveSet.h index 05f08a639f..02a910073c 100644 --- a/ApplicationLibCode/ProjectDataModel/Summary/RimEnsembleCurveSet.h +++ b/ApplicationLibCode/ProjectDataModel/Summary/RimEnsembleCurveSet.h @@ -65,6 +65,7 @@ class RiuPlotWidget; class RiuPlotCurve; class RimPlotAxisPropertiesInterface; class RimSummaryAddressSelector; +class RimTimeAxisAnnotation; class QwtPlot; class QwtPlotCurve; @@ -197,6 +198,8 @@ public: RiaDefines::HorizontalAxisType xAxisType() const; void findOrAssignBottomAxisX( RiuPlotAxis plotAxis ); + std::vector createTimeAnnotations() const; + protected: void initAfterRead() override; diff --git a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryDeclineCurve.cpp b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryDeclineCurve.cpp index c6e65a98ed..9493d7f799 100644 --- a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryDeclineCurve.cpp +++ b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryDeclineCurve.cpp @@ -70,15 +70,6 @@ RimSummaryDeclineCurve::RimSummaryDeclineCurve() CAF_PDM_InitField( &m_showTimeSelectionInPlot, "ShowTimeSelectionInPlot", true, "Show In Plot" ); } -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -RimSummaryDeclineCurve::~RimSummaryDeclineCurve() -{ - auto plot = firstAncestorOrThisOfType(); - if ( plot && m_timeRangeAnnotation ) plot->removeTimeAnnotation( m_timeRangeAnnotation ); -} - //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -99,6 +90,24 @@ std::vector RimSummaryDeclineCurve::valuesX() const return createDeclineCurveValues( RimSummaryCurve::valuesX(), RimSummaryCurve::timeStepsX(), minTimeStep, maxTimeStep, curveType() ); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::vector RimSummaryDeclineCurve::createTimeAnnotations() const +{ + if ( m_showTimeSelectionInPlot && isChecked() ) + { + auto [minTimeStep, maxTimeStep] = selectedTimeStepRange(); + + auto annotation = RimTimeAxisAnnotation::createTimeRangeAnnotation( minTimeStep, maxTimeStep, color() ); + annotation->setName( "" ); + + return { annotation }; + } + + return {}; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -445,16 +454,9 @@ QString RimSummaryDeclineCurve::curveExportDescription( const RifEclipseSummaryA //-------------------------------------------------------------------------------------------------- void RimSummaryDeclineCurve::updateTimeAnnotations() { - auto plot = firstAncestorOrThisOfTypeAsserted(); - if ( m_timeRangeAnnotation ) plot->removeTimeAnnotation( m_timeRangeAnnotation ); - - if ( m_showTimeSelectionInPlot && isChecked() ) + if ( auto plot = firstAncestorOrThisOfType() ) { - auto [minTimeStep, maxTimeStep] = selectedTimeStepRange(); - - m_timeRangeAnnotation = plot->addTimeRangeAnnotation( minTimeStep, maxTimeStep ); - m_timeRangeAnnotation->setColor( color() ); - m_timeRangeAnnotation->setName( "" ); + plot->updateAndRedrawTimeAnnotations(); } } diff --git a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryDeclineCurve.h b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryDeclineCurve.h index 7e59e4d639..b020f0bc21 100644 --- a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryDeclineCurve.h +++ b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryDeclineCurve.h @@ -45,7 +45,6 @@ public: }; RimSummaryDeclineCurve(); - ~RimSummaryDeclineCurve() override; void setDeclineCurveType( DeclineCurveType declineCurveType ); @@ -56,6 +55,8 @@ public: // X Axis functions std::vector valuesX() const override; + std::vector createTimeAnnotations() const; + protected: void updateTimeAnnotations() override; @@ -107,6 +108,4 @@ private: caf::PdmField m_maxTimeSliderPosition; caf::PdmField m_showTimeSelectionInPlot; - - caf::PdmPointer m_timeRangeAnnotation; }; diff --git a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryMultiPlot.cpp b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryMultiPlot.cpp index deb6fb7359..a3d13a8be0 100644 --- a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryMultiPlot.cpp +++ b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryMultiPlot.cpp @@ -1487,7 +1487,13 @@ void RimSummaryMultiPlot::updateReadOutSettings() { for ( auto plot : summaryPlots() ) { - if ( !m_readOutSettings->enableVerticalLine() ) plot->removeAllTimeAnnotations(); + if ( !m_readOutSettings->enableVerticalLine() ) + { + if ( auto axisProps = plot->timeAxisProperties() ) + { + axisProps->removeAllAnnotations(); + } + } if ( !m_readOutSettings->enableHorizontalLine() ) { @@ -1499,7 +1505,7 @@ void RimSummaryMultiPlot::updateReadOutSettings() plot->enableCurvePointTracking( m_readOutSettings->enableCurvePointTracking() ); - plot->updateAxes(); + plot->updateAndRedrawTimeAnnotations(); } } @@ -1769,15 +1775,11 @@ void RimSummaryMultiPlot::updateReadOutLines( double qwtTimeValue, double yValue { plot->timeAxisProperties()->removeAllAnnotations(); - auto anno = new RimTimeAxisAnnotation; - - anno->setTime( timeTValue, dateFormatString ); - auto lineAppearance = m_readOutSettings->lineAppearance(); + auto anno = RimTimeAxisAnnotation::createTimeAnnotation( timeTValue, lineAppearance->color() ); Qt::PenStyle style = lineAppearance->isDashed() ? Qt::PenStyle::DashLine : Qt::PenStyle::SolidLine; anno->setPenStyle( style ); - anno->setColor( lineAppearance->color() ); anno->setAlignment( m_readOutSettings->verticalLineLabelAlignment() ); plot->timeAxisProperties()->appendAnnotation( anno ); diff --git a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryPlot.cpp b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryPlot.cpp index c12a2bd557..05c320cf99 100644 --- a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryPlot.cpp +++ b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryPlot.cpp @@ -37,6 +37,7 @@ #include "SummaryPlotCommands/RicSummaryPlotEditorUi.h" +#include "Annotations/RimTimeAxisAnnotationUpdater.h" #include "RimAsciiDataCurve.h" #include "RimEnsembleCurveSet.h" #include "RimEnsembleCurveSetCollection.h" @@ -1348,54 +1349,11 @@ void RimSummaryPlot::updateCaseNameHasChanged() //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -RimTimeAxisAnnotation* RimSummaryPlot::addTimeAnnotation( time_t time ) +void RimSummaryPlot::updateAndRedrawTimeAnnotations() { - RimSummaryTimeAxisProperties* axisProps = timeAxisProperties(); - CAF_ASSERT( axisProps ); + RimTimeAxisAnnotationUpdater::updateTimeAnnotationObjects( this ); - auto* annotation = new RimTimeAxisAnnotation; - const QString formatString; - annotation->setTime( time, formatString ); - annotation->setDefaultColor(); - - axisProps->appendAnnotation( annotation ); - return annotation; -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -RimTimeAxisAnnotation* RimSummaryPlot::addTimeRangeAnnotation( time_t startTime, time_t endTime ) -{ - RimSummaryTimeAxisProperties* axisProps = timeAxisProperties(); - CAF_ASSERT( axisProps ); - - auto* annotation = new RimTimeAxisAnnotation; - annotation->setTimeRange( startTime, endTime ); - annotation->setDefaultColor(); - - axisProps->appendAnnotation( annotation ); - return annotation; -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -void RimSummaryPlot::removeAllTimeAnnotations() -{ - RimSummaryTimeAxisProperties* axisProps = timeAxisProperties(); - if ( axisProps ) axisProps->removeAllAnnotations(); -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -void RimSummaryPlot::removeTimeAnnotation( RimTimeAxisAnnotation* annotation ) -{ - RimSummaryTimeAxisProperties* axisProps = timeAxisProperties(); - CAF_ASSERT( axisProps ); - - axisProps->removeAnnotation( annotation ); + updateAxes(); } //-------------------------------------------------------------------------------------------------- @@ -2980,6 +2938,7 @@ void RimSummaryPlot::onCurveCollectionChanged( const SignalEmitter* emitter ) { curvesChanged.send(); + updateAndRedrawTimeAnnotations(); updateStackedCurveData(); scheduleReplotIfVisible(); diff --git a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryPlot.h b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryPlot.h index 4e4a853f38..ee4466499c 100644 --- a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryPlot.h +++ b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryPlot.h @@ -124,11 +124,8 @@ public: void reattachAllCurves() override; void updateCaseNameHasChanged(); - RimTimeAxisAnnotation* addTimeAnnotation( time_t time ); - RimTimeAxisAnnotation* addTimeRangeAnnotation( time_t startTime, time_t endTime ); - void removeTimeAnnotation( RimTimeAxisAnnotation* annotation ); - void removeAllTimeAnnotations(); - void updateAnnotationsInPlotWidget(); + void updateAndRedrawTimeAnnotations(); + void updateAnnotationsInPlotWidget(); void updateAxes() override; diff --git a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryRegressionAnalysisCurve.cpp b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryRegressionAnalysisCurve.cpp index a6e4464174..78d01cde1c 100644 --- a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryRegressionAnalysisCurve.cpp +++ b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryRegressionAnalysisCurve.cpp @@ -132,15 +132,6 @@ RimSummaryRegressionAnalysisCurve::RimSummaryRegressionAnalysisCurve() m_valueRangeY.uiCapability()->setUiLabelPosition( caf::PdmUiItemInfo::HIDDEN ); } -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -RimSummaryRegressionAnalysisCurve::~RimSummaryRegressionAnalysisCurve() -{ - auto plot = firstAncestorOrThisOfType(); - if ( plot && m_timeRangeAnnotation ) plot->removeTimeAnnotation( m_timeRangeAnnotation ); -} - //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -852,6 +843,21 @@ bool RimSummaryRegressionAnalysisCurve::isRegressionCurve() const return true; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::vector RimSummaryRegressionAnalysisCurve::createTimeAnnotations() const +{ + if ( m_showTimeSelectionInPlot && isChecked() ) + { + auto [minTimeStep, maxTimeStep] = selectedTimeStepRange(); + + return { RimTimeAxisAnnotation::createTimeRangeAnnotation( minTimeStep, maxTimeStep, color() ) }; + } + + return {}; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -925,14 +931,9 @@ std::pair, std::vector> RimSummaryRegressionAnalysis //-------------------------------------------------------------------------------------------------- void RimSummaryRegressionAnalysisCurve::updateTimeAnnotations() { - auto plot = firstAncestorOrThisOfTypeAsserted(); - if ( m_timeRangeAnnotation ) plot->removeTimeAnnotation( m_timeRangeAnnotation ); - - if ( m_showTimeSelectionInPlot && isChecked() ) + if ( auto plot = firstAncestorOrThisOfType() ) { - auto [minTimeStep, maxTimeStep] = selectedTimeStepRange(); - m_timeRangeAnnotation = plot->addTimeRangeAnnotation( minTimeStep, maxTimeStep ); - m_timeRangeAnnotation->setColor( color() ); + plot->updateAndRedrawTimeAnnotations(); } } diff --git a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryRegressionAnalysisCurve.h b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryRegressionAnalysisCurve.h index ce864c5adc..3e12eaeb9c 100644 --- a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryRegressionAnalysisCurve.h +++ b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryRegressionAnalysisCurve.h @@ -77,7 +77,6 @@ public: }; RimSummaryRegressionAnalysisCurve(); - ~RimSummaryRegressionAnalysisCurve() override; void setEnsembleCurveSet( RimEnsembleCurveSet* ensembleCurveSet ); @@ -93,6 +92,8 @@ public: bool isRegressionCurve() const override; + std::vector createTimeAnnotations() const; + protected: void updateTimeAnnotations() override; @@ -158,11 +159,10 @@ private: caf::PdmField> m_yRangeSelection; caf::PdmField> m_valueRangeY; - caf::PdmPointer m_timeRangeAnnotation; - std::vector m_valuesX; - std::vector m_timeStepsX; - std::vector m_valuesY; - std::vector m_timeStepsY; + std::vector m_valuesX; + std::vector m_timeStepsX; + std::vector m_valuesY; + std::vector m_timeStepsY; // Source curve data std::vector m_sourceValuesX;