#2153 Cross Plot : Compute interpolated values based on missing timesteps relative other curve

This commit is contained in:
Magne Sjaastad 2017-11-21 10:39:20 +01:00
parent 4f653cbf3d
commit a51b4be1dc
2 changed files with 51 additions and 17 deletions

View File

@ -23,6 +23,8 @@
#include "RifReaderEclipseSummary.h" #include "RifReaderEclipseSummary.h"
#include "RigTimeHistoryCurveMerger.h"
#include "RimEclipseResultCase.h" #include "RimEclipseResultCase.h"
#include "RimProject.h" #include "RimProject.h"
#include "RimSummaryAddress.h" #include "RimSummaryAddress.h"
@ -379,53 +381,69 @@ void RimSummaryCurve::onLoadDataAndUpdate(bool updateParentPlot)
if (isCurveVisible()) if (isCurveVisible())
{ {
std::vector<double> yValues = this->valuesY(); std::vector<double> curveValuesY = this->valuesY();
RimSummaryPlot* plot = nullptr; RimSummaryPlot* plot = nullptr;
firstAncestorOrThisOfType(plot); firstAncestorOrThisOfTypeAsserted(plot);
bool isLogCurve = plot->isLogarithmicScaleEnabled(this->axisY()); bool isLogCurve = plot->isLogarithmicScaleEnabled(this->axisY());
bool shouldPopulateViewWithEmptyData = false; bool shouldPopulateViewWithEmptyData = false;
if (isCrossPlotCurve()) if (isCrossPlotCurve())
{ {
std::vector<double> xValues = this->valuesX(); auto curveValuesX = this->valuesX();
auto curveTimeStepsX = timeStepsX();
if (!yValues.empty() && yValues.size() == xValues.size()) auto curveTimeStepsY = timeSteps();
if (curveValuesY.empty() || curveValuesX.empty())
{ {
m_qwtPlotCurve->setSamplesFromXValuesAndYValues(xValues, yValues, isLogCurve); shouldPopulateViewWithEmptyData = true;
} }
else else
{ {
shouldPopulateViewWithEmptyData = true; RigTimeHistoryCurveMerger curveMerger;
curveMerger.addCurveData(curveValuesX, curveTimeStepsX);
curveMerger.addCurveData(curveValuesY, curveTimeStepsY);
curveMerger.computeInterpolatedValues();
if (curveMerger.allTimeSteps().size() > 0)
{
m_qwtPlotCurve->setSamplesFromXValuesAndYValues(curveMerger.interpolatedCurveValuesForAllTimeSteps(0),
curveMerger.interpolatedCurveValuesForAllTimeSteps(1),
isLogCurve);
}
else
{
shouldPopulateViewWithEmptyData = true;
}
} }
} }
else else
{ {
std::vector<time_t> dateTimes = this->timeSteps(); std::vector<time_t> curveTimeStepsY = this->timeSteps();
if (dateTimes.size() > 0 && dateTimes.size() == yValues.size()) if (curveTimeStepsY.size() > 0 && curveTimeStepsY.size() == curveValuesY.size())
{ {
if (plot->timeAxisProperties()->timeMode() == RimSummaryTimeAxisProperties::DATE) if (plot->timeAxisProperties()->timeMode() == RimSummaryTimeAxisProperties::DATE)
{ {
m_qwtPlotCurve->setSamplesFromTimeTAndYValues(dateTimes, yValues, isLogCurve); m_qwtPlotCurve->setSamplesFromTimeTAndYValues(curveTimeStepsY, curveValuesY, isLogCurve);
} }
else else
{ {
double timeScale = plot->timeAxisProperties()->fromTimeTToDisplayUnitScale(); double timeScale = plot->timeAxisProperties()->fromTimeTToDisplayUnitScale();
std::vector<double> times; std::vector<double> timeFromSimulationStart;
if ( dateTimes.size() ) if (curveTimeStepsY.size())
{ {
time_t startDate = dateTimes[0]; time_t startDate = curveTimeStepsY[0];
for ( time_t& date: dateTimes ) for (const auto& date : curveTimeStepsY)
{ {
times.push_back(timeScale*(date - startDate)); timeFromSimulationStart.push_back(timeScale*(date - startDate));
} }
} }
m_qwtPlotCurve->setSamplesFromXValuesAndYValues(times, yValues, isLogCurve); m_qwtPlotCurve->setSamplesFromXValuesAndYValues(timeFromSimulationStart, curveValuesY, isLogCurve);
} }
} }
else else
{ {
@ -697,6 +715,21 @@ RifSummaryReaderInterface* RimSummaryCurve::valuesSummaryReaderY() const
return m_yValuesSummaryCase()->summaryReader(); return m_yValuesSummaryCase()->summaryReader();
} }
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
const std::vector<time_t>& RimSummaryCurve::timeStepsX() const
{
static std::vector<time_t> emptyVector;
RifSummaryReaderInterface* reader = valuesSummaryReaderX();
if (!reader) return emptyVector;
RifEclipseSummaryAddress addr = m_xValuesCurveVariable()->address();
return reader->timeSteps(addr);
}
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------

View File

@ -81,6 +81,7 @@ protected:
private: private:
RifSummaryReaderInterface* valuesSummaryReaderX() const; RifSummaryReaderInterface* valuesSummaryReaderX() const;
RifSummaryReaderInterface* valuesSummaryReaderY() const; RifSummaryReaderInterface* valuesSummaryReaderY() const;
const std::vector<time_t>& timeStepsX() const;
void calculateCurveInterpolationFromAddress(); void calculateCurveInterpolationFromAddress();