From 0502b95d86a2904ea1f5e4c9d9880d0f010b2aa0 Mon Sep 17 00:00:00 2001 From: Magne Sjaastad Date: Wed, 8 Nov 2017 07:38:25 +0100 Subject: [PATCH] #2091 Cross Plot : Improve interface of RiuLineSegmentQwtPlotCurve Remove duplicate code --- .../RimGridTimeHistoryCurve.cpp | 8 +- .../Summary/RimAsciiDataCurve.cpp | 6 +- .../Summary/RimSummaryCurve.cpp | 6 +- .../RiuFlowCharacteristicsPlot.cpp | 6 +- .../RiuLineSegmentQwtPlotCurve.cpp | 120 ++++++++---------- .../RiuLineSegmentQwtPlotCurve.h | 19 ++- .../UserInterface/RiuResultQwtPlot.cpp | 2 +- 7 files changed, 84 insertions(+), 83 deletions(-) diff --git a/ApplicationCode/ProjectDataModel/RimGridTimeHistoryCurve.cpp b/ApplicationCode/ProjectDataModel/RimGridTimeHistoryCurve.cpp index e223d95b65..0cf0f02765 100644 --- a/ApplicationCode/ProjectDataModel/RimGridTimeHistoryCurve.cpp +++ b/ApplicationCode/ProjectDataModel/RimGridTimeHistoryCurve.cpp @@ -322,11 +322,11 @@ void RimGridTimeHistoryCurve::onLoadDataAndUpdate(bool updateParentPlot) std::vector dateTimes = timeStepValues(); if (dateTimes.size() > 0 && dateTimes.size() == values.size()) { - m_qwtPlotCurve->setSamplesFromTimeTAndValues(dateTimes, values, isLogCurve); + m_qwtPlotCurve->setSamplesFromTimeTAndYValues(dateTimes, values, isLogCurve); } else { - m_qwtPlotCurve->setSamplesFromTimeTAndValues(std::vector(), std::vector(), isLogCurve); + m_qwtPlotCurve->setSamplesFromTimeTAndYValues(std::vector(), std::vector(), isLogCurve); } } else @@ -342,11 +342,11 @@ void RimGridTimeHistoryCurve::onLoadDataAndUpdate(bool updateParentPlot) times.push_back(timeScale * day); } - m_qwtPlotCurve->setSamplesFromTimeAndValues(times, values, isLogCurve); + m_qwtPlotCurve->setSamplesFromXValuesAndYValues(times, values, isLogCurve); } else { - m_qwtPlotCurve->setSamplesFromTimeTAndValues(std::vector(), std::vector(), isLogCurve); + m_qwtPlotCurve->setSamplesFromTimeTAndYValues(std::vector(), std::vector(), isLogCurve); } } diff --git a/ApplicationCode/ProjectDataModel/Summary/RimAsciiDataCurve.cpp b/ApplicationCode/ProjectDataModel/Summary/RimAsciiDataCurve.cpp index 5ccef4e0a4..0135181670 100644 --- a/ApplicationCode/ProjectDataModel/Summary/RimAsciiDataCurve.cpp +++ b/ApplicationCode/ProjectDataModel/Summary/RimAsciiDataCurve.cpp @@ -145,7 +145,7 @@ void RimAsciiDataCurve::onLoadDataAndUpdate(bool updateParentPlot) { if (plot->timeAxisProperties()->timeMode() == RimSummaryTimeAxisProperties::DATE) { - m_qwtPlotCurve->setSamplesFromTimeTAndValues(dateTimes, values, isLogCurve); + m_qwtPlotCurve->setSamplesFromTimeTAndYValues(dateTimes, values, isLogCurve); } else { @@ -161,13 +161,13 @@ void RimAsciiDataCurve::onLoadDataAndUpdate(bool updateParentPlot) } } - m_qwtPlotCurve->setSamplesFromTimeAndValues(times, values, isLogCurve); + m_qwtPlotCurve->setSamplesFromXValuesAndYValues(times, values, isLogCurve); } } else { - m_qwtPlotCurve->setSamplesFromTimeTAndValues(std::vector(), std::vector(), isLogCurve); + m_qwtPlotCurve->setSamplesFromTimeTAndYValues(std::vector(), std::vector(), isLogCurve); } updateZoomInParentPlot(); diff --git a/ApplicationCode/ProjectDataModel/Summary/RimSummaryCurve.cpp b/ApplicationCode/ProjectDataModel/Summary/RimSummaryCurve.cpp index 7859d1fb51..acca9bfcd4 100644 --- a/ApplicationCode/ProjectDataModel/Summary/RimSummaryCurve.cpp +++ b/ApplicationCode/ProjectDataModel/Summary/RimSummaryCurve.cpp @@ -407,7 +407,7 @@ void RimSummaryCurve::onLoadDataAndUpdate(bool updateParentPlot) { if (plot->timeAxisProperties()->timeMode() == RimSummaryTimeAxisProperties::DATE) { - m_qwtPlotCurve->setSamplesFromTimeTAndValues(dateTimes, values, isLogCurve); + m_qwtPlotCurve->setSamplesFromTimeTAndYValues(dateTimes, values, isLogCurve); } else { @@ -423,13 +423,13 @@ void RimSummaryCurve::onLoadDataAndUpdate(bool updateParentPlot) } } - m_qwtPlotCurve->setSamplesFromTimeAndValues(times, values, isLogCurve); + m_qwtPlotCurve->setSamplesFromXValuesAndYValues(times, values, isLogCurve); } } else { - m_qwtPlotCurve->setSamplesFromTimeTAndValues(std::vector(), std::vector(), isLogCurve); + m_qwtPlotCurve->setSamplesFromTimeTAndYValues(std::vector(), std::vector(), isLogCurve); } if ( updateParentPlot && m_parentQwtPlot) diff --git a/ApplicationCode/UserInterface/RiuFlowCharacteristicsPlot.cpp b/ApplicationCode/UserInterface/RiuFlowCharacteristicsPlot.cpp index 09a39eaa13..56000fe777 100644 --- a/ApplicationCode/UserInterface/RiuFlowCharacteristicsPlot.cpp +++ b/ApplicationCode/UserInterface/RiuFlowCharacteristicsPlot.cpp @@ -160,7 +160,7 @@ void RiuFlowCharacteristicsPlot::addCurveWithLargeSymbol(QwtPlot* plot, const QS timeHistoryValues.push_back(timeHistoryValue); timeHistoryValues.push_back(timeHistoryValue); - curve->setSamplesFromDateAndValues(dateTimes, timeHistoryValues, false); + curve->setSamplesFromDatesAndYValues(dateTimes, timeHistoryValues, false); } //-------------------------------------------------------------------------------------------------- @@ -184,7 +184,7 @@ void RiuFlowCharacteristicsPlot::addFlowCapStorageCapCurve(const QDateTime& date CVF_ASSERT(!m_dateToColorMap.empty()); RiuLineSegmentQwtPlotCurve* plotCurve = createEmptyCurve(m_flowCapVsStorageCapPlot, dateTime.toString(), m_dateToColorMap[dateTime]); - plotCurve->setSamplesFromTimeAndValues(xVals, yVals, false); + plotCurve->setSamplesFromXValuesAndYValues(xVals, yVals, false); m_flowCapVsStorageCapPlot->replot(); } @@ -196,7 +196,7 @@ void RiuFlowCharacteristicsPlot::addSweepEfficiencyCurve(const QDateTime& dateTi CVF_ASSERT(!m_dateToColorMap.empty()); RiuLineSegmentQwtPlotCurve* plotCurve = createEmptyCurve(m_sweepEffPlot, dateTime.toString(), m_dateToColorMap[dateTime]); - plotCurve->setSamplesFromTimeAndValues(xVals, yVals, false); + plotCurve->setSamplesFromXValuesAndYValues(xVals, yVals, false); m_sweepEffPlot->replot(); } diff --git a/ApplicationCode/UserInterface/RiuLineSegmentQwtPlotCurve.cpp b/ApplicationCode/UserInterface/RiuLineSegmentQwtPlotCurve.cpp index 7eedeb30ff..63198e4c98 100644 --- a/ApplicationCode/UserInterface/RiuLineSegmentQwtPlotCurve.cpp +++ b/ApplicationCode/UserInterface/RiuLineSegmentQwtPlotCurve.cpp @@ -51,30 +51,30 @@ RiuLineSegmentQwtPlotCurve::~RiuLineSegmentQwtPlotCurve() //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void RiuLineSegmentQwtPlotCurve::setSamplesFromDateAndValues(const std::vector& dateTimes, const std::vector& timeHistoryValues, bool removeNegativeValues) +void RiuLineSegmentQwtPlotCurve::setSamplesFromXValuesAndYValues(const std::vector& xValues, const std::vector& yValues, bool removeNegativeValues) { - CVF_ASSERT(dateTimes.size() == timeHistoryValues.size()); + CVF_ASSERT(xValues.size() == yValues.size()); QPolygonF points; std::vector< std::pair > filteredIntervals; { - std::vector filteredTimeHistoryValues; - std::vector filteredDateTimes; + std::vector filteredYValues; + std::vector filteredXValues; { std::vector< std::pair > intervalsOfValidValues; - RigCurveDataTools::calculateIntervalsOfValidValues(timeHistoryValues, &intervalsOfValidValues, removeNegativeValues); + RigCurveDataTools::calculateIntervalsOfValidValues(yValues, &intervalsOfValidValues, removeNegativeValues); - RigCurveDataTools::getValuesByIntervals(timeHistoryValues, intervalsOfValidValues, &filteredTimeHistoryValues); - RigCurveDataTools::getValuesByIntervals(dateTimes, intervalsOfValidValues, &filteredDateTimes); + RigCurveDataTools::getValuesByIntervals(yValues, intervalsOfValidValues, &filteredYValues); + RigCurveDataTools::getValuesByIntervals(xValues, intervalsOfValidValues, &filteredXValues); RigCurveDataTools::computePolyLineStartStopIndices(intervalsOfValidValues, &filteredIntervals); } - for ( size_t i = 0; i < filteredDateTimes.size(); i++ ) + points.reserve(static_cast(filteredXValues.size())); + for ( size_t i = 0; i < filteredXValues.size(); i++ ) { - double milliSecSinceEpoch = QwtDate::toDouble(filteredDateTimes[i]); - points << QPointF(milliSecSinceEpoch, filteredTimeHistoryValues[i]); + points << QPointF(filteredXValues[i], filteredYValues[i]); } } @@ -85,68 +85,17 @@ void RiuLineSegmentQwtPlotCurve::setSamplesFromDateAndValues(const std::vector& dateTimes, const std::vector& timeHistoryValues, bool removeNegativeValues) +void RiuLineSegmentQwtPlotCurve::setSamplesFromDatesAndYValues(const std::vector& dateTimes, const std::vector& yValues, bool removeNegativeValues) { - CVF_ASSERT(dateTimes.size() == timeHistoryValues.size()); - - QPolygonF points; - std::vector< std::pair > filteredIntervals; - { - std::vector filteredTimeHistoryValues; - std::vector filteredDateTimes; - - { - std::vector< std::pair > intervalsOfValidValues; - RigCurveDataTools::calculateIntervalsOfValidValues(timeHistoryValues, &intervalsOfValidValues, removeNegativeValues); - - RigCurveDataTools::getValuesByIntervals(timeHistoryValues, intervalsOfValidValues, &filteredTimeHistoryValues); - RigCurveDataTools::getValuesByIntervals(dateTimes, intervalsOfValidValues, &filteredDateTimes); - - RigCurveDataTools::computePolyLineStartStopIndices(intervalsOfValidValues, &filteredIntervals); - } - - for (size_t i = 0; i < filteredDateTimes.size(); i++) - { - double milliSecSinceEpoch = filteredDateTimes[i] * 1000; // This is kind of hack, as the c++ standard does not state what time_t is. "Almost always" secs since epoch according to cppreference.com - points << QPointF(milliSecSinceEpoch, filteredTimeHistoryValues[i]); - } - } - - this->setSamples(points); - this->setLineSegmentStartStopIndices(filteredIntervals); + setSamplesFromXValuesAndYValues(RiuLineSegmentQwtPlotCurve::fromQDateTime(dateTimes), yValues, removeNegativeValues); } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void RiuLineSegmentQwtPlotCurve::setSamplesFromTimeAndValues(const std::vector& times, const std::vector& timeHistoryValues, bool removeNegativeValues) +void RiuLineSegmentQwtPlotCurve::setSamplesFromTimeTAndYValues(const std::vector& dateTimes, const std::vector& yValues, bool removeNegativeValues) { - CVF_ASSERT(times.size() == timeHistoryValues.size()); - - QPolygonF points; - std::vector< std::pair > filteredIntervals; - { - std::vector filteredTimeHistoryValues; - std::vector filteredTimes; - - { - std::vector< std::pair > intervalsOfValidValues; - RigCurveDataTools::calculateIntervalsOfValidValues(timeHistoryValues, &intervalsOfValidValues, removeNegativeValues); - - RigCurveDataTools::getValuesByIntervals(timeHistoryValues, intervalsOfValidValues, &filteredTimeHistoryValues); - RigCurveDataTools::getValuesByIntervals(times, intervalsOfValidValues, &filteredTimes); - - RigCurveDataTools::computePolyLineStartStopIndices(intervalsOfValidValues, &filteredIntervals); - } - - for ( size_t i = 0; i < filteredTimes.size(); i++ ) - { - points << QPointF(filteredTimes[i], filteredTimeHistoryValues[i]); - } - } - - this->setSamples(points); - this->setLineSegmentStartStopIndices(filteredIntervals); + setSamplesFromXValuesAndYValues(RiuLineSegmentQwtPlotCurve::fromTime_t(dateTimes), yValues, removeNegativeValues); } //-------------------------------------------------------------------------------------------------- @@ -252,3 +201,44 @@ void RiuLineSegmentQwtPlotCurve::setSymbolSkipPixelDistance(float distance) { m_symbolSkipPixelDistance = distance >= 0.0f ? distance: 0.0f; } + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::vector RiuLineSegmentQwtPlotCurve::fromQDateTime(const std::vector& dateTimes) +{ + std::vector doubleValues; + + if (!dateTimes.empty()) + { + doubleValues.reserve(dateTimes.size()); + + for (const auto& dt : dateTimes) + { + doubleValues.push_back(QwtDate::toDouble(dt)); + } + } + + return doubleValues; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::vector RiuLineSegmentQwtPlotCurve::fromTime_t(const std::vector& timeSteps) +{ + std::vector doubleValues; + + if (!timeSteps.empty()) + { + doubleValues.reserve(timeSteps.size()); + for (const auto& time : timeSteps) + { + double milliSecSinceEpoch = time * 1000; // This is kind of hack, as the c++ standard does not state what time_t is. "Almost always" secs since epoch according to cppreference.com + + doubleValues.push_back(milliSecSinceEpoch); + } + } + + return doubleValues; +} diff --git a/ApplicationCode/UserInterface/RiuLineSegmentQwtPlotCurve.h b/ApplicationCode/UserInterface/RiuLineSegmentQwtPlotCurve.h index 4cd4235b74..5ec9ec5251 100644 --- a/ApplicationCode/UserInterface/RiuLineSegmentQwtPlotCurve.h +++ b/ApplicationCode/UserInterface/RiuLineSegmentQwtPlotCurve.h @@ -47,15 +47,22 @@ public: explicit RiuLineSegmentQwtPlotCurve(const QString &title = QString::null); virtual ~RiuLineSegmentQwtPlotCurve(); - void setSamplesFromDateAndValues(const std::vector& dateTimes, const std::vector& timeHistoryValues, bool removeNegativeValues); - void setSamplesFromTimeTAndValues(const std::vector& dateTimes, const std::vector& timeHistoryValues, bool removeNegativeValues); - void setSamplesFromTimeAndValues(const std::vector& times, const std::vector& timeHistoryValues, bool removeNegativeValues); + void setSamplesFromXValuesAndYValues(const std::vector& xValues, + const std::vector& yValues, + bool removeNegativeValues); + + void setSamplesFromDatesAndYValues(const std::vector& dateTimes, + const std::vector& yValues, + bool removeNegativeValues); + + void setSamplesFromTimeTAndYValues(const std::vector& dateTimes, + const std::vector& yValues, + bool removeNegativeValues); void setLineSegmentStartStopIndices(const std::vector< std::pair >& lineSegmentStartStopIndices); void setSymbolSkipPixelDistance(float distance); - protected: virtual void drawCurve(QPainter* p, int style, const QwtScaleMap& xMap, const QwtScaleMap& yMap, @@ -69,6 +76,10 @@ protected: const QRectF &canvasRect, int from, int to) const override; +private: + static std::vector fromQDateTime(const std::vector& dateTimes); + static std::vector fromTime_t(const std::vector& timeSteps); + private: std::vector< std::pair > m_polyLineStartStopIndices; float m_symbolSkipPixelDistance; diff --git a/ApplicationCode/UserInterface/RiuResultQwtPlot.cpp b/ApplicationCode/UserInterface/RiuResultQwtPlot.cpp index e69b5e16ff..1bc5a01d78 100644 --- a/ApplicationCode/UserInterface/RiuResultQwtPlot.cpp +++ b/ApplicationCode/UserInterface/RiuResultQwtPlot.cpp @@ -66,7 +66,7 @@ void RiuResultQwtPlot::addCurve(const QString& curveName, const cvf::Color3f& cu { RiuLineSegmentQwtPlotCurve* plotCurve = new RiuLineSegmentQwtPlotCurve("Curve 1"); - plotCurve->setSamplesFromDateAndValues(dateTimes, timeHistoryValues, false); + plotCurve->setSamplesFromDatesAndYValues(dateTimes, timeHistoryValues, false); plotCurve->setTitle(curveName); plotCurve->setPen(QPen(QColor(curveColor.rByte(), curveColor.gByte(), curveColor.bByte())));