diff --git a/ApplicationLibCode/Commands/SummaryPlotCommands/RicCreateDeclineCurvesFeature.cpp b/ApplicationLibCode/Commands/SummaryPlotCommands/RicCreateDeclineCurvesFeature.cpp index d9c6d39fec..b3bb98390e 100644 --- a/ApplicationLibCode/Commands/SummaryPlotCommands/RicCreateDeclineCurvesFeature.cpp +++ b/ApplicationLibCode/Commands/SummaryPlotCommands/RicCreateDeclineCurvesFeature.cpp @@ -102,7 +102,6 @@ RimSummaryDeclineCurve* RicCreateDeclineCurvesFeature::createDeclineCurveAndAddT RiaSummaryTools::copyCurveAxisData( *newCurve, *sourceCurve ); - newCurve->updateDefaultValues(); newCurve->loadDataAndUpdate( true ); newCurve->updateConnectedEditors(); diff --git a/ApplicationLibCode/ProjectDataModel/Summary/RimEnsembleCurveSet.cpp b/ApplicationLibCode/ProjectDataModel/Summary/RimEnsembleCurveSet.cpp index 6a9748661c..03f912f753 100644 --- a/ApplicationLibCode/ProjectDataModel/Summary/RimEnsembleCurveSet.cpp +++ b/ApplicationLibCode/ProjectDataModel/Summary/RimEnsembleCurveSet.cpp @@ -207,14 +207,14 @@ RimEnsembleCurveSet::RimEnsembleCurveSet() CAF_PDM_InitFieldNoDefault( &m_minDateRange, "MinDateRange", "From" ); m_minDateRange.uiCapability()->setUiEditorTypeName( caf::PdmUiDateEditor::uiEditorTypeName() ); - CAF_PDM_InitFieldNoDefault( &m_minTimeStep, "MinTimeStep", "" ); - m_minTimeStep.uiCapability()->setUiEditorTypeName( caf::PdmUiSliderEditor::uiEditorTypeName() ); + CAF_PDM_InitField( &m_minTimeSliderPosition, "MinTimeSliderPosition", 0, "" ); + m_minTimeSliderPosition.uiCapability()->setUiEditorTypeName( caf::PdmUiSliderEditor::uiEditorTypeName() ); CAF_PDM_InitFieldNoDefault( &m_maxDateRange, "MaxDateRange", "To" ); m_maxDateRange.uiCapability()->setUiEditorTypeName( caf::PdmUiDateEditor::uiEditorTypeName() ); - CAF_PDM_InitFieldNoDefault( &m_maxTimeStep, "MaxTimeStep", "" ); - m_maxTimeStep.uiCapability()->setUiEditorTypeName( caf::PdmUiSliderEditor::uiEditorTypeName() ); + CAF_PDM_InitField( &m_maxTimeSliderPosition, "MaxTimeSliderPosition", 100, "" ); + m_maxTimeSliderPosition.uiCapability()->setUiEditorTypeName( caf::PdmUiSliderEditor::uiEditorTypeName() ); // Time Step Selection CAF_PDM_InitFieldNoDefault( &m_timeStepFilter, "TimeStepFilter", "Available Time Steps" ); @@ -466,6 +466,37 @@ void RimEnsembleCurveSet::setSummaryAddressX( RifEclipseSummaryAddress address ) m_xAddressSelector->setAddress( address ); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::pair RimEnsembleCurveSet::fullTimeStepRange() const +{ + if ( !allAvailableTimeSteps().empty() ) + { + auto min = *allAvailableTimeSteps().begin(); + auto max = *allAvailableTimeSteps().rbegin(); + + return { min, max }; + } + + return {}; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::pair RimEnsembleCurveSet::selectedTimeStepRange() const +{ + // Scale the slider values to the full time step range + + auto [min, max] = fullTimeStepRange(); + auto range = max - min; + auto selectedMin = min + static_cast( range * ( m_minTimeSliderPosition / 100.0 ) ); + auto selectedMax = min + static_cast( range * ( m_maxTimeSliderPosition / 100.0 ) ); + + return { selectedMin, selectedMax }; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -867,8 +898,8 @@ void RimEnsembleCurveSet::fieldChangedByUi( const caf::PdmFieldHandle* changedFi summaryAddress->setAddress( m_yValuesSummaryAddress->address() ); m_objectiveValuesSummaryAddresses.push_back( summaryAddress ); updateAddressesUiField(); - m_minTimeStep = *allAvailableTimeSteps().begin(); - m_maxTimeStep = *allAvailableTimeSteps().rbegin(); + m_minTimeSliderPosition = 0; + m_maxTimeSliderPosition = 100; updateMaxMinAndDefaultValues(); } } @@ -893,7 +924,7 @@ void RimEnsembleCurveSet::fieldChangedByUi( const caf::PdmFieldHandle* changedFi updateObjectiveFunctionLegend(); updateMaxMinAndDefaultValues(); } - else if ( changedField == &m_minTimeStep || changedField == &m_maxTimeStep ) + else if ( changedField == &m_minTimeSliderPosition || changedField == &m_maxTimeSliderPosition ) { updateMaxMinAndDefaultValues(); updateCurveColors(); @@ -901,8 +932,18 @@ void RimEnsembleCurveSet::fieldChangedByUi( const caf::PdmFieldHandle* changedFi } else if ( changedField == &m_minDateRange || changedField == &m_maxDateRange ) { - m_minTimeStep = RiaTimeTTools::fromQDateTime( RiaQDateTimeTools::createDateTime( m_minDateRange() ) ); - m_maxTimeStep = RiaTimeTTools::fromQDateTime( RiaQDateTimeTools::createDateTime( m_maxDateRange() ) ); + auto [min, max] = fullTimeStepRange(); + auto range = max - min; + + auto minTime = RiaTimeTTools::fromQDateTime( RiaQDateTimeTools::createDateTime( m_minDateRange() ) ); + minTime = std::clamp( minTime, min, max ); + auto maxTime = RiaTimeTTools::fromQDateTime( RiaQDateTimeTools::createDateTime( m_maxDateRange() ) ); + maxTime = std::clamp( maxTime, min, max ); + + // Convert from date to normalized value between 0 and 100 + m_minTimeSliderPosition = static_cast( ( double( minTime - min ) / double( range ) ) * 100 ); + m_maxTimeSliderPosition = static_cast( ( double( maxTime - min ) / double( range ) ) * 100 ); + updateCurveColors(); updateTimeAnnotations(); } @@ -1005,8 +1046,8 @@ void RimEnsembleCurveSet::fieldChangedByUi( const caf::PdmFieldHandle* changedFi setTimeSteps( indices ); } - m_minTimeStep = *allAvailableTimeSteps().begin(); - m_maxTimeStep = *allAvailableTimeSteps().rbegin(); + m_minTimeSliderPosition = 0; + m_maxTimeSliderPosition = 100; updateLegendMappingMode(); updateCurveColors(); @@ -1142,8 +1183,10 @@ void RimEnsembleCurveSet::defineUiOrdering( QString uiConfigName, caf::PdmUiOrde //-------------------------------------------------------------------------------------------------- void RimEnsembleCurveSet::updateMaxMinAndDefaultValues() { - m_minDateRange = QDateTime::fromSecsSinceEpoch( m_minTimeStep ).date(); - m_maxDateRange = QDateTime::fromSecsSinceEpoch( m_maxTimeStep ).date(); + auto [minTimeStep, maxTimeStep] = selectedTimeStepRange(); + + m_minDateRange = QDateTime::fromSecsSinceEpoch( minTimeStep ).date(); + m_maxDateRange = QDateTime::fromSecsSinceEpoch( maxTimeStep ).date(); for ( auto filter : m_curveFilters->filters() ) { @@ -1299,9 +1342,9 @@ void RimEnsembleCurveSet::appendColorGroup( caf::PdmUiOrdering& uiOrdering ) m_customObjectiveFunction()->weightContainsFunctionType( RimObjectiveFunction::FunctionType::F1 ) ) ) { timeSelectionGroup->add( &m_minDateRange ); - timeSelectionGroup->add( &m_minTimeStep ); + timeSelectionGroup->add( &m_minTimeSliderPosition ); timeSelectionGroup->add( &m_maxDateRange ); - timeSelectionGroup->add( &m_maxTimeStep ); + timeSelectionGroup->add( &m_maxTimeSliderPosition ); } if ( m_objectiveFunction()->functionType() == RimObjectiveFunction::FunctionType::F2 || ( m_customObjectiveFunction() && @@ -1391,12 +1434,12 @@ void RimEnsembleCurveSet::defineEditorAttribute( const caf::PdmFieldHandle* fiel attrib->m_buttonText = "..."; } - if ( field == &m_minTimeStep || field == &m_maxTimeStep ) + if ( field == &m_minTimeSliderPosition || field == &m_maxTimeSliderPosition ) { if ( auto* myAttr = dynamic_cast( attribute ) ) { - myAttr->m_minimum = *allAvailableTimeSteps().begin(); - myAttr->m_maximum = *allAvailableTimeSteps().rbegin(); + myAttr->m_minimum = 0; + myAttr->m_maximum = 100; myAttr->m_showSpinBox = false; } } @@ -1544,7 +1587,7 @@ QList RimEnsembleCurveSet::calculateValueOptions( const //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -std::set RimEnsembleCurveSet::allAvailableTimeSteps() +std::set RimEnsembleCurveSet::allAvailableTimeSteps() const { std::set timeStepUnion; @@ -1734,7 +1777,8 @@ void RimEnsembleCurveSet::updateObjectiveFunctionLegend() //-------------------------------------------------------------------------------------------------- ObjectiveFunctionTimeConfig RimEnsembleCurveSet::objectiveFunctionTimeConfig() const { - return { m_minTimeStep(), m_maxTimeStep(), selectedTimeSteps() }; + auto [minTimeStep, maxTimeStep] = selectedTimeStepRange(); + return { minTimeStep, maxTimeStep, selectedTimeSteps() }; } //-------------------------------------------------------------------------------------------------- @@ -1934,7 +1978,8 @@ void RimEnsembleCurveSet::updateTimeAnnotations() ( m_colorMode() == ColorMode::BY_CUSTOM_OBJECTIVE_FUNCTION && m_customObjectiveFunction() && m_customObjectiveFunction()->weightContainsFunctionType( RimObjectiveFunction::FunctionType::F1 ) ) ) { - plot->addTimeRangeAnnotation( m_minTimeStep, m_maxTimeStep ); + auto [minTimeStep, maxTimeStep] = selectedTimeStepRange(); + plot->addTimeRangeAnnotation( minTimeStep, maxTimeStep ); } if ( ( m_colorMode() == ColorMode::BY_OBJECTIVE_FUNCTION && diff --git a/ApplicationLibCode/ProjectDataModel/Summary/RimEnsembleCurveSet.h b/ApplicationLibCode/ProjectDataModel/Summary/RimEnsembleCurveSet.h index 07ac38f20e..bcc7805f30 100644 --- a/ApplicationLibCode/ProjectDataModel/Summary/RimEnsembleCurveSet.h +++ b/ApplicationLibCode/ProjectDataModel/Summary/RimEnsembleCurveSet.h @@ -209,7 +209,7 @@ private: void defineEditorAttribute( const caf::PdmFieldHandle* field, QString uiConfigName, caf::PdmUiEditorAttribute* attribute ) override; QList calculateValueOptions( const caf::PdmFieldHandle* fieldNeedingOptions ) override; - std::set allAvailableTimeSteps(); + std::set allAvailableTimeSteps() const; std::set timestepDefiningSourceCases(); RiaSummaryCurveDefinitionAnalyser* getOrCreateSelectedCurveDefAnalyser(); std::vector curveDefinitions() const; @@ -241,6 +241,9 @@ private: void setSummaryAddressX( RifEclipseSummaryAddress address ); + std::pair fullTimeStepRange() const; + std::pair selectedTimeStepRange() const; + private: caf::PdmField m_showCurves; caf::PdmChildArrayField m_curves; @@ -277,8 +280,8 @@ private: caf::PdmField m_objectiveValuesSummaryAddressesUiField; caf::PdmField m_objectiveValuesSelectSummaryAddressPushButton; caf::PdmPtrField m_customObjectiveFunction; - caf::PdmField m_minTimeStep; - caf::PdmField m_maxTimeStep; + caf::PdmField m_minTimeSliderPosition; + caf::PdmField m_maxTimeSliderPosition; caf::PdmField m_minDateRange; caf::PdmField m_maxDateRange; caf::PdmField m_timeStepFilter; diff --git a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryDeclineCurve.cpp b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryDeclineCurve.cpp index 6bcad110ef..7467baf6fb 100644 --- a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryDeclineCurve.cpp +++ b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryDeclineCurve.cpp @@ -61,11 +61,11 @@ RimSummaryDeclineCurve::RimSummaryDeclineCurve() CAF_PDM_InitField( &m_hyperbolicDeclineConstant, "HyperbolicDeclineConstant", 0.5, "Decline Constant" ); m_hyperbolicDeclineConstant.uiCapability()->setUiEditorTypeName( caf::PdmUiDoubleSliderEditor::uiEditorTypeName() ); - CAF_PDM_InitFieldNoDefault( &m_minTimeStep, "MinTimeStep", "From" ); - m_minTimeStep.uiCapability()->setUiEditorTypeName( caf::PdmUiSliderEditor::uiEditorTypeName() ); + CAF_PDM_InitField( &m_minTimeSliderPosition, "MinTimeSliderPosition", 75, "From" ); + m_minTimeSliderPosition.uiCapability()->setUiEditorTypeName( caf::PdmUiSliderEditor::uiEditorTypeName() ); - CAF_PDM_InitFieldNoDefault( &m_maxTimeStep, "MaxTimeStep", "To" ); - m_maxTimeStep.uiCapability()->setUiEditorTypeName( caf::PdmUiSliderEditor::uiEditorTypeName() ); + CAF_PDM_InitField( &m_maxTimeSliderPosition, "MaxTimeSliderPosition", 100, "To" ); + m_maxTimeSliderPosition.uiCapability()->setUiEditorTypeName( caf::PdmUiSliderEditor::uiEditorTypeName() ); CAF_PDM_InitField( &m_showTimeSelectionInPlot, "ShowTimeSelectionInPlot", true, "Show In Plot" ); } @@ -84,10 +84,12 @@ RimSummaryDeclineCurve::~RimSummaryDeclineCurve() //-------------------------------------------------------------------------------------------------- std::vector RimSummaryDeclineCurve::valuesY() const { + auto [minTimeStep, maxTimeStep] = selectedTimeStepRange(); + return createDeclineCurveValues( RimSummaryCurve::valuesY(), RimSummaryCurve::timeStepsY(), - m_minTimeStep, - m_maxTimeStep, + minTimeStep, + maxTimeStep, RiaSummaryTools::hasAccumulatedData( summaryAddressY() ) ); } @@ -96,10 +98,12 @@ std::vector RimSummaryDeclineCurve::valuesY() const //-------------------------------------------------------------------------------------------------- std::vector RimSummaryDeclineCurve::valuesX() const { + auto [minTimeStep, maxTimeStep] = selectedTimeStepRange(); + return createDeclineCurveValues( RimSummaryCurve::valuesX(), RimSummaryCurve::timeStepsX(), - m_minTimeStep, - m_maxTimeStep, + minTimeStep, + maxTimeStep, RiaSummaryTools::hasAccumulatedData( summaryAddressX() ) ); } @@ -108,7 +112,9 @@ std::vector RimSummaryDeclineCurve::valuesX() const //-------------------------------------------------------------------------------------------------- std::vector RimSummaryDeclineCurve::timeStepsY() const { - std::vector timeSteps = getTimeStepsInRange( RimSummaryCurve::timeStepsY(), m_minTimeStep, m_maxTimeStep ); + auto [minTimeStep, maxTimeStep] = selectedTimeStepRange(); + + std::vector timeSteps = getTimeStepsInRange( RimSummaryCurve::timeStepsY(), minTimeStep, maxTimeStep ); appendFutureTimeSteps( timeSteps ); return timeSteps; } @@ -118,7 +124,9 @@ std::vector RimSummaryDeclineCurve::timeStepsY() const //-------------------------------------------------------------------------------------------------- std::vector RimSummaryDeclineCurve::timeStepsX() const { - std::vector timeSteps = getTimeStepsInRange( RimSummaryCurve::timeStepsX(), m_minTimeStep, m_maxTimeStep ); + auto [minTimeStep, maxTimeStep] = selectedTimeStepRange(); + + std::vector timeSteps = getTimeStepsInRange( RimSummaryCurve::timeStepsX(), minTimeStep, maxTimeStep ); appendFutureTimeSteps( timeSteps ); return timeSteps; } @@ -135,7 +143,7 @@ std::vector RimSummaryDeclineCurve::createDeclineCurveValues( const std: if ( values.empty() || timeSteps.empty() ) return values; // Use only the values inside the range specified - auto [timeStepsInRange, valuesInRange] = getInRangeValues( timeSteps, values, m_minTimeStep, m_maxTimeStep ); + auto [timeStepsInRange, valuesInRange] = getInRangeValues( timeSteps, values, minTimeStep, maxTimeStep ); if ( timeStepsInRange.empty() || valuesInRange.empty() ) return values; @@ -162,6 +170,9 @@ std::vector RimSummaryDeclineCurve::createDeclineCurveValues( const std: return outValues; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- std::pair RimSummaryDeclineCurve::computeInitialProductionAndDeclineRate( const std::vector& values, const std::vector& timeSteps, bool isAccumulatedResult ) @@ -265,6 +276,35 @@ double RimSummaryDeclineCurve::computePredictedValue( double initialProductionRa return 0.0; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::pair RimSummaryDeclineCurve::fullTimeStepRange() const +{ + auto timeSteps = RimSummaryCurve::timeStepsY(); + if ( !timeSteps.empty() ) + { + return std::make_pair( *timeSteps.begin(), *timeSteps.rbegin() ); + } + + return {}; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::pair RimSummaryDeclineCurve::selectedTimeStepRange() const +{ + // Scale the slider values to the full time step range + + auto [min, max] = fullTimeStepRange(); + auto range = max - min; + auto selectedMin = min + static_cast( range * ( m_minTimeSliderPosition / 100.0 ) ); + auto selectedMax = min + static_cast( range * ( m_maxTimeSliderPosition / 100.0 ) ); + + return { selectedMin, selectedMax }; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -315,8 +355,8 @@ void RimSummaryDeclineCurve::defineUiOrdering( QString uiConfigName, caf::PdmUiO } caf::PdmUiGroup* timeSelectionGroup = uiOrdering.addNewGroup( "Time Selection" ); - timeSelectionGroup->add( &m_minTimeStep ); - timeSelectionGroup->add( &m_maxTimeStep ); + timeSelectionGroup->add( &m_minTimeSliderPosition ); + timeSelectionGroup->add( &m_maxTimeSliderPosition ); timeSelectionGroup->add( &m_showTimeSelectionInPlot ); RimSummaryCurve::defineUiOrdering( uiConfigName, uiOrdering ); @@ -327,19 +367,19 @@ void RimSummaryDeclineCurve::defineUiOrdering( QString uiConfigName, caf::PdmUiO //-------------------------------------------------------------------------------------------------- void RimSummaryDeclineCurve::fieldChangedByUi( const caf::PdmFieldHandle* changedField, const QVariant& oldValue, const QVariant& newValue ) { - if ( &m_minTimeStep == changedField && m_minTimeStep > m_maxTimeStep ) + if ( &m_minTimeSliderPosition == changedField && m_minTimeSliderPosition > m_maxTimeSliderPosition ) { - m_maxTimeStep = m_minTimeStep; + m_maxTimeSliderPosition = m_minTimeSliderPosition; } - if ( &m_maxTimeStep == changedField && m_maxTimeStep < m_minTimeStep ) + if ( &m_maxTimeSliderPosition == changedField && m_maxTimeSliderPosition < m_minTimeSliderPosition ) { - m_minTimeStep = m_maxTimeStep; + m_minTimeSliderPosition = m_maxTimeSliderPosition; } RimSummaryCurve::fieldChangedByUi( changedField, oldValue, newValue ); if ( changedField == &m_declineCurveType || changedField == &m_predictionYears || changedField == &m_hyperbolicDeclineConstant || - changedField == &m_minTimeStep || changedField == &m_maxTimeStep || changedField == &m_showTimeSelectionInPlot ) + changedField == &m_minTimeSliderPosition || changedField == &m_maxTimeSliderPosition || changedField == &m_showTimeSelectionInPlot ) { loadAndUpdateDataAndPlot(); auto plot = firstAncestorOrThisOfTypeAsserted(); @@ -373,16 +413,12 @@ void RimSummaryDeclineCurve::defineEditorAttribute( const caf::PdmFieldHandle* f myAttr->m_decimals = 2; } } - else if ( field == &m_minTimeStep || field == &m_maxTimeStep ) + else if ( field == &m_minTimeSliderPosition || field == &m_maxTimeSliderPosition ) { if ( auto* myAttr = dynamic_cast( attribute ) ) { - auto timeSteps = RimSummaryCurve::timeStepsY(); - if ( !timeSteps.empty() ) - { - myAttr->m_minimum = *timeSteps.begin(); - myAttr->m_maximum = *timeSteps.rbegin(); - } + myAttr->m_minimum = 0; + myAttr->m_maximum = 100; myAttr->m_showSpinBox = false; } } @@ -422,28 +458,14 @@ void RimSummaryDeclineCurve::updateTimeAnnotations() if ( m_showTimeSelectionInPlot && isChecked() ) { - m_timeRangeAnnotation = plot->addTimeRangeAnnotation( m_minTimeStep, m_maxTimeStep ); + auto [minTimeStep, maxTimeStep] = selectedTimeStepRange(); + + m_timeRangeAnnotation = plot->addTimeRangeAnnotation( minTimeStep, maxTimeStep ); m_timeRangeAnnotation->setColor( color() ); m_timeRangeAnnotation->setName( "" ); } } -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -void RimSummaryDeclineCurve::updateDefaultValues() -{ - auto timeSteps = RimSummaryCurve::timeStepsY(); - if ( !timeSteps.empty() ) - { - // Default min time step is 3/4 into the data - const double historyStep = 0.75; - const size_t idx = static_cast( timeSteps.size() * historyStep ); - m_minTimeStep = timeSteps[idx]; - m_maxTimeStep = timeSteps.back(); - } -} - //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryDeclineCurve.h b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryDeclineCurve.h index 05c9b17a61..35e2b6aa38 100644 --- a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryDeclineCurve.h +++ b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryDeclineCurve.h @@ -56,8 +56,6 @@ public: // X Axis functions std::vector valuesX() const override; - void updateDefaultValues(); - protected: void updateTimeAnnotations() override; @@ -93,12 +91,19 @@ private: double computePredictedValue( double initialProductionRate, double initialDeclineRate, double timeSinceStart, bool isAccumulatedResult ) const; + std::pair fullTimeStepRange() const; + std::pair selectedTimeStepRange() const; + +private: caf::PdmField> m_declineCurveType; caf::PdmField m_predictionYears; caf::PdmField m_hyperbolicDeclineConstant; - caf::PdmField m_minTimeStep; - caf::PdmField m_maxTimeStep; - caf::PdmField m_showTimeSelectionInPlot; + + // Time step range defined in the range [0..100] as time_t can hold values that do not fit into int used by QSpinBox + caf::PdmField m_minTimeSliderPosition; + caf::PdmField m_maxTimeSliderPosition; + + caf::PdmField m_showTimeSelectionInPlot; caf::PdmPointer m_timeRangeAnnotation; }; diff --git a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryRegressionAnalysisCurve.cpp b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryRegressionAnalysisCurve.cpp index fc9da67264..2d80d6a4a2 100644 --- a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryRegressionAnalysisCurve.cpp +++ b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryRegressionAnalysisCurve.cpp @@ -107,11 +107,11 @@ RimSummaryRegressionAnalysisCurve::RimSummaryRegressionAnalysisCurve() CAF_PDM_InitField( &m_polynomialDegree, "PolynomialDegree", 3, "Degree" ); CAF_PDM_InitFieldNoDefault( &m_timeRangeSelection, "TimeRangeSelection", "Time Range" ); - CAF_PDM_InitFieldNoDefault( &m_minTimeStep, "MinTimeStep", "From" ); - m_minTimeStep.uiCapability()->setUiEditorTypeName( caf::PdmUiSliderEditor::uiEditorTypeName() ); + CAF_PDM_InitFieldNoDefault( &m_minTimeSliderPosition, "MinTimeSliderPosition", "From" ); + m_minTimeSliderPosition.uiCapability()->setUiEditorTypeName( caf::PdmUiSliderEditor::uiEditorTypeName() ); - CAF_PDM_InitFieldNoDefault( &m_maxTimeStep, "MaxTimeStep", "To" ); - m_maxTimeStep.uiCapability()->setUiEditorTypeName( caf::PdmUiSliderEditor::uiEditorTypeName() ); + CAF_PDM_InitFieldNoDefault( &m_maxTimeSliderPosition, "MaxTimeSliderPosition", "To" ); + m_maxTimeSliderPosition.uiCapability()->setUiEditorTypeName( caf::PdmUiSliderEditor::uiEditorTypeName() ); CAF_PDM_InitField( &m_showTimeSelectionInPlot, "ShowTimeSelectionInPlot", false, "Show In Plot" ); @@ -349,7 +349,8 @@ std::tuple, std::vector, QString> { if ( values.empty() || timeSteps.empty() ) return { timeSteps, values, "" }; - auto [timeStepsInRange, valuesInRange] = getInRangeValues( timeSteps, values, m_minTimeStep, m_maxTimeStep ); + auto [minTimeStep, maxTimeStep] = selectedTimeStepRange(); + auto [timeStepsInRange, valuesInRange] = getInRangeValues( timeSteps, values, minTimeStep, maxTimeStep ); if ( timeStepsInRange.empty() || valuesInRange.empty() ) return {}; @@ -473,8 +474,8 @@ void RimSummaryRegressionAnalysisCurve::defineUiOrdering( QString uiConfigName, timeSelectionGroup->add( &m_timeRangeSelection ); if ( m_timeRangeSelection() == RangeType::USER_DEFINED_RANGE ) { - timeSelectionGroup->add( &m_minTimeStep ); - timeSelectionGroup->add( &m_maxTimeStep ); + timeSelectionGroup->add( &m_minTimeSliderPosition ); + timeSelectionGroup->add( &m_maxTimeSliderPosition ); } timeSelectionGroup->add( &m_showTimeSelectionInPlot ); } @@ -511,14 +512,14 @@ void RimSummaryRegressionAnalysisCurve::fieldChangedByUi( const caf::PdmFieldHan { RimSummaryCurve::fieldChangedByUi( changedField, oldValue, newValue ); - if ( &m_minTimeStep == changedField && m_minTimeStep > m_maxTimeStep ) + if ( &m_minTimeSliderPosition == changedField && m_minTimeSliderPosition > m_maxTimeSliderPosition ) { - m_maxTimeStep = m_minTimeStep; + m_maxTimeSliderPosition = m_minTimeSliderPosition; } - if ( &m_maxTimeStep == changedField && m_maxTimeStep < m_minTimeStep ) + if ( &m_maxTimeSliderPosition == changedField && m_maxTimeSliderPosition < m_minTimeSliderPosition ) { - m_minTimeStep = m_maxTimeStep; + m_minTimeSliderPosition = m_maxTimeSliderPosition; } loadAndUpdateDataAndPlot(); @@ -552,16 +553,12 @@ void RimSummaryRegressionAnalysisCurve::defineEditorAttribute( const caf::PdmFie lineEditorAttr->validator = new QIntValidator( 0, 50, nullptr ); } } - else if ( field == &m_minTimeStep || field == &m_maxTimeStep ) + else if ( field == &m_minTimeSliderPosition || field == &m_maxTimeSliderPosition ) { if ( auto* myAttr = dynamic_cast( attribute ) ) { - auto timeSteps = m_sourceTimeStepsY; - if ( !timeSteps.empty() ) - { - myAttr->m_minimum = *timeSteps.begin(); - myAttr->m_maximum = *timeSteps.rbegin(); - } + myAttr->m_minimum = 0; + myAttr->m_maximum = 100; myAttr->m_showSpinBox = false; } } @@ -716,6 +713,35 @@ void RimSummaryRegressionAnalysisCurve::appendTimeSteps( std::vector& de destinationTimeSteps.push_back( RiaTimeTTools::fromQDateTime( t ) ); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::pair RimSummaryRegressionAnalysisCurve::fullTimeStepRange() const +{ + auto timeSteps = RimSummaryCurve::timeStepsY(); + if ( !timeSteps.empty() ) + { + return std::make_pair( *timeSteps.begin(), *timeSteps.rbegin() ); + } + + return {}; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::pair RimSummaryRegressionAnalysisCurve::selectedTimeStepRange() const +{ + // Scale the slider values to the full time step range + + auto [min, max] = fullTimeStepRange(); + auto range = max - min; + auto selectedMin = min + static_cast( range * ( m_minTimeSliderPosition / 100.0 ) ); + auto selectedMax = min + static_cast( range * ( m_maxTimeSliderPosition / 100.0 ) ); + + return { selectedMin, selectedMax }; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -843,7 +869,8 @@ void RimSummaryRegressionAnalysisCurve::updateTimeAnnotations() if ( m_showTimeSelectionInPlot && isChecked() ) { - m_timeRangeAnnotation = plot->addTimeRangeAnnotation( m_minTimeStep, m_maxTimeStep ); + auto [minTimeStep, maxTimeStep] = selectedTimeStepRange(); + m_timeRangeAnnotation = plot->addTimeRangeAnnotation( minTimeStep, maxTimeStep ); m_timeRangeAnnotation->setColor( color() ); } } @@ -855,8 +882,8 @@ void RimSummaryRegressionAnalysisCurve::updateDefaultValues() { if ( !m_sourceTimeStepsY.empty() && m_timeRangeSelection() == RangeType::FULL_RANGE ) { - m_minTimeStep = m_sourceTimeStepsY.front(); - m_maxTimeStep = m_sourceTimeStepsY.back(); + m_minTimeSliderPosition = 0; + m_maxTimeSliderPosition = 100; } if ( !m_sourceValuesX.empty() && m_xRangeSelection() == RangeType::FULL_RANGE ) diff --git a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryRegressionAnalysisCurve.h b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryRegressionAnalysisCurve.h index 1b5a6cadaa..baa9380766 100644 --- a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryRegressionAnalysisCurve.h +++ b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryRegressionAnalysisCurve.h @@ -133,6 +133,9 @@ private: static void appendTimeSteps( std::vector& destinationTimeSteps, const std::set& sourceTimeSteps ); + std::pair fullTimeStepRange() const; + std::pair selectedTimeStepRange() const; + private: caf::PdmField> m_dataSourceForRegression; caf::PdmPtrField m_ensembleCurveSet; @@ -141,8 +144,8 @@ private: caf::PdmField> m_regressionType; caf::PdmField> m_timeRangeSelection; - caf::PdmField m_minTimeStep; - caf::PdmField m_maxTimeStep; + caf::PdmField m_minTimeSliderPosition; + caf::PdmField m_maxTimeSliderPosition; caf::PdmField m_showTimeSelectionInPlot; caf::PdmField m_polynomialDegree;