From 925747b9d421a5ea61379bc9bf7fcb335d0de555 Mon Sep 17 00:00:00 2001 From: Gaute Lindkvist Date: Tue, 12 Mar 2019 15:29:08 +0100 Subject: [PATCH 1/5] Fix warnings about QStyleFrameOptionsV4 --- Fwk/AppFwk/cafUserInterface/cafPdmUiTableViewDelegate.cpp | 4 ++++ Fwk/AppFwk/cafUserInterface/cafPdmUiTreeSelectionEditor.cpp | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/Fwk/AppFwk/cafUserInterface/cafPdmUiTableViewDelegate.cpp b/Fwk/AppFwk/cafUserInterface/cafPdmUiTableViewDelegate.cpp index d9eb426441..2d7bb54f6f 100644 --- a/Fwk/AppFwk/cafUserInterface/cafPdmUiTableViewDelegate.cpp +++ b/Fwk/AppFwk/cafUserInterface/cafPdmUiTableViewDelegate.cpp @@ -117,7 +117,11 @@ bool PdmUiTableViewDelegate::isEditorOpen() const //-------------------------------------------------------------------------------------------------- void PdmUiTableViewDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const { +#if QT_VERSION_MAJOR > 4 + QStyleOptionViewItem viewItemOption(option); +#else QStyleOptionViewItemV4 viewItemOption(option); +#endif QVariant fgText = index.data(Qt::ForegroundRole); diff --git a/Fwk/AppFwk/cafUserInterface/cafPdmUiTreeSelectionEditor.cpp b/Fwk/AppFwk/cafUserInterface/cafPdmUiTreeSelectionEditor.cpp index cb9f2fb15c..01e6d18d32 100644 --- a/Fwk/AppFwk/cafUserInterface/cafPdmUiTreeSelectionEditor.cpp +++ b/Fwk/AppFwk/cafUserInterface/cafPdmUiTreeSelectionEditor.cpp @@ -164,7 +164,11 @@ private: QRect r = rect(); QPalette pal = palette(); +#if QT_VERSION_MAJOR > 4 + QStyleOptionFrame panel; +#else QStyleOptionFrameV2 panel; +#endif initStyleOption(&panel); style()->drawPrimitive(QStyle::PE_PanelLineEdit, &panel, &p, this); r = style()->subElementRect(QStyle::SE_LineEditContents, &panel, this); From 0ce69d41dd56845360c5759ad0c9695d996c9c32 Mon Sep 17 00:00:00 2001 From: Gaute Lindkvist Date: Wed, 13 Mar 2019 08:38:18 +0100 Subject: [PATCH 2/5] Swap axis settings when swapping Grid Cross Plot axes + fix inverted axes for summary plot --- ...icSwapGridCrossPlotCurveSetAxesFeature.cpp | 2 +- .../GridCrossPlots/RimGridCrossPlot.cpp | 47 ++++++--- .../GridCrossPlots/RimGridCrossPlot.h | 2 +- .../RimPlotAxisProperties.cpp | 97 +++++++++++++++++++ .../ProjectDataModel/RimPlotAxisProperties.h | 26 +++++ .../Summary/RimSummaryCurvesCalculator.cpp | 85 ---------------- .../Summary/RimSummaryCurvesCalculator.h | 21 +--- .../Summary/RimSummaryPlot.cpp | 12 ++- 8 files changed, 173 insertions(+), 119 deletions(-) diff --git a/ApplicationCode/Commands/GridCrossPlotCommands/RicSwapGridCrossPlotCurveSetAxesFeature.cpp b/ApplicationCode/Commands/GridCrossPlotCommands/RicSwapGridCrossPlotCurveSetAxesFeature.cpp index 065dd37b76..708ddec4f6 100644 --- a/ApplicationCode/Commands/GridCrossPlotCommands/RicSwapGridCrossPlotCurveSetAxesFeature.cpp +++ b/ApplicationCode/Commands/GridCrossPlotCommands/RicSwapGridCrossPlotCurveSetAxesFeature.cpp @@ -40,7 +40,7 @@ void RicSwapGridCrossPlotCurveSetAxesFeature::onActionTriggered(bool isChecked) else if (caf::SelectionManager::instance()->selectedItemOfType()) { auto plot = caf::SelectionManager::instance()->selectedItemOfType(); - plot->swapAllAxisProperties(); + plot->swapAxes(); } } diff --git a/ApplicationCode/ProjectDataModel/GridCrossPlots/RimGridCrossPlot.cpp b/ApplicationCode/ProjectDataModel/GridCrossPlots/RimGridCrossPlot.cpp index ded3e5e677..2462cfe60f 100644 --- a/ApplicationCode/ProjectDataModel/GridCrossPlots/RimGridCrossPlot.cpp +++ b/ApplicationCode/ProjectDataModel/GridCrossPlots/RimGridCrossPlot.cpp @@ -521,13 +521,29 @@ void RimGridCrossPlot::updateCurveNamesAndPlotTitle() //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void RimGridCrossPlot::swapAllAxisProperties() +void RimGridCrossPlot::swapAxes() { + RimPlotAxisProperties* xAxisProperties = m_xAxisProperties(); + RimPlotAxisProperties* yAxisProperties = m_yAxisProperties(); + + QString tmpName = xAxisProperties->name(); + QwtPlot::Axis tmpAxis = xAxisProperties->qwtPlotAxisType(); + xAxisProperties->setNameAndAxis(yAxisProperties->name(), yAxisProperties->qwtPlotAxisType()); + yAxisProperties->setNameAndAxis(tmpName, tmpAxis); + + m_xAxisProperties.removeChildObject(xAxisProperties); + m_yAxisProperties.removeChildObject(yAxisProperties); + m_yAxisProperties = xAxisProperties; + m_xAxisProperties = yAxisProperties; + for (auto curveSet : m_crossPlotCurveSets) { curveSet->swapAxisProperties(false); } + loadDataAndUpdate(); + + updateAxisDisplay(); } //-------------------------------------------------------------------------------------------------- @@ -672,6 +688,15 @@ void RimGridCrossPlot::updateAxisInQwt(RiaDefines::PlotAxis axisType) m_qwtPlot->setAxisScaleEngine(axisProperties->qwtPlotAxisType(), new QwtLogScaleEngine); m_qwtPlot->setAxisMaxMinor(axisProperties->qwtPlotAxisType(), 5); } + + if (axisProperties->isAutoZoom()) + { + m_qwtPlot->setAxisAutoScale(qwtAxisId); + } + else + { + m_qwtPlot->setAxisScale(qwtAxisId, axisProperties->visibleRangeMin, axisProperties->visibleRangeMax); + } } else { @@ -682,19 +707,17 @@ void RimGridCrossPlot::updateAxisInQwt(RiaDefines::PlotAxis axisType) m_qwtPlot->setAxisScaleEngine(axisProperties->qwtPlotAxisType(), new QwtLinearScaleEngine); m_qwtPlot->setAxisMaxMinor(axisProperties->qwtPlotAxisType(), 3); } + + if (axisProperties->isAutoZoom()) + { + m_qwtPlot->setAxisAutoScale(qwtAxisId); + } + else + { + m_qwtPlot->setAxisScale(qwtAxisId, axisProperties->visibleRangeMin, axisProperties->visibleRangeMax); + } } m_qwtPlot->axisScaleEngine(axisProperties->qwtPlotAxisType())->setAttribute(QwtScaleEngine::Inverted, axisProperties->isAxisInverted()); - - if (axisProperties->isAutoZoom()) - { - m_qwtPlot->setAxisAutoScale(qwtAxisId); - } - else - { - m_qwtPlot->setAxisScale(qwtAxisId, axisProperties->visibleRangeMin, axisProperties->visibleRangeMax); - } - - } else { diff --git a/ApplicationCode/ProjectDataModel/GridCrossPlots/RimGridCrossPlot.h b/ApplicationCode/ProjectDataModel/GridCrossPlots/RimGridCrossPlot.h index f1feaaa722..0b049fd64e 100644 --- a/ApplicationCode/ProjectDataModel/GridCrossPlots/RimGridCrossPlot.h +++ b/ApplicationCode/ProjectDataModel/GridCrossPlots/RimGridCrossPlot.h @@ -70,7 +70,7 @@ public: void detachAllCurves(); void performAutoNameUpdate() override; void updateCurveNamesAndPlotTitle(); - void swapAllAxisProperties(); + void swapAxes(); QString asciiTitleForPlotExport(int curveSetIndex) const; QString asciiDataForPlotExport(int curveSetIndex) const; RiuGridCrossQwtPlot* qwtPlot() const; diff --git a/ApplicationCode/ProjectDataModel/RimPlotAxisProperties.cpp b/ApplicationCode/ProjectDataModel/RimPlotAxisProperties.cpp index 812aba04bc..c5c761d97b 100644 --- a/ApplicationCode/ProjectDataModel/RimPlotAxisProperties.cpp +++ b/ApplicationCode/ProjectDataModel/RimPlotAxisProperties.cpp @@ -20,6 +20,7 @@ #include "RimPlotAxisProperties.h" #include "RiaDefines.h" +#include "RigStatisticsCalculator.h" #include "RimRiuQwtPlotOwnerInterface.h" @@ -27,6 +28,8 @@ #include +#include + // clang-format off namespace caf { @@ -222,6 +225,14 @@ QwtPlot::Axis RimPlotAxisProperties::qwtPlotAxisType() const return m_axis; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QString RimPlotAxisProperties::name() const +{ + return m_name; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -358,3 +369,89 @@ caf::PdmFieldHandle* RimPlotAxisProperties::objectToggleField() { return &m_isActive; } + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimPlotAxisRangeCalculator::RimPlotAxisRangeCalculator(QwtPlot::Axis axis, + const std::vector& qwtCurves, + const std::vector& axisValuesForAllCurves) + : m_singleCurves(qwtCurves) + , m_axisValuesForAllCurves(axisValuesForAllCurves) +{ +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimPlotAxisRangeCalculator::computeAxisRange(double* min, double* max) const +{ + double minValue = HUGE_VAL; + double maxValue = -HUGE_VAL; + + for (QwtPlotCurve* curve : m_singleCurves) + { + double minCurveValue = HUGE_VAL; + double maxCurveValue = -HUGE_VAL; + + if (curveValueRange(curve, &minCurveValue, &maxCurveValue)) + { + if (minCurveValue < minValue) + { + minValue = minCurveValue; + } + + if (maxCurveValue > maxValue) + { + maxValue = maxCurveValue; + } + } + } + + if (minValue == HUGE_VAL) + { + minValue = RiaDefines::minimumDefaultValuePlot(); + maxValue = RiaDefines::maximumDefaultValuePlot(); + } + + // For logarithmic auto scaling, compute positive curve value closest to zero and use + // this value as the plot visible minimum + + double pos = HUGE_VAL; + double neg = -HUGE_VAL; + + RigStatisticsCalculator::posNegClosestToZero(m_axisValuesForAllCurves, pos, neg); + + if (pos != HUGE_VAL) + { + minValue = pos; + } + + *min = minValue; + *max = maxValue; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RimPlotAxisRangeCalculator::curveValueRange(const QwtPlotCurve* qwtCurve, double* min, double* max) const +{ + if (!qwtCurve) return false; + + if (qwtCurve->data()->size() < 1) + { + return false; + } + + if (m_axis == QwtPlot::xBottom || m_axis == QwtPlot::xTop) + { + *min = qwtCurve->minXValue(); + *max = qwtCurve->maxXValue(); + } + else + { + *min = qwtCurve->minYValue(); + *max = qwtCurve->maxYValue(); + } + return true; +} diff --git a/ApplicationCode/ProjectDataModel/RimPlotAxisProperties.h b/ApplicationCode/ProjectDataModel/RimPlotAxisProperties.h index 5229599534..66ac22b7a2 100644 --- a/ApplicationCode/ProjectDataModel/RimPlotAxisProperties.h +++ b/ApplicationCode/ProjectDataModel/RimPlotAxisProperties.h @@ -57,7 +57,9 @@ public: void setEnableTitleTextSettings(bool enable); void setNameAndAxis(const QString& name, QwtPlot::Axis axis); + QwtPlot::Axis qwtPlotAxisType() const; + QString name() const; RiaDefines::PlotAxis plotAxisType() const; bool useAutoTitle() const; bool showDescription() const; @@ -111,3 +113,27 @@ private: bool m_enableTitleTextSettings; }; + +class QwtPlotCurve; + +//================================================================================================== +/// +/// +//================================================================================================== +class RimPlotAxisRangeCalculator +{ +public: + RimPlotAxisRangeCalculator(QwtPlot::Axis axis, + const std::vector& qwtCurves, + const std::vector& axisValuesForAllCurves); + + void computeAxisRange(double* min, double* max) const; + +private: + bool curveValueRange(const QwtPlotCurve* qwtCurve, double* min, double* max) const; + +private: + QwtPlot::Axis m_axis; + const std::vector m_singleCurves; + const std::vector m_axisValuesForAllCurves; +}; diff --git a/ApplicationCode/ProjectDataModel/Summary/RimSummaryCurvesCalculator.cpp b/ApplicationCode/ProjectDataModel/Summary/RimSummaryCurvesCalculator.cpp index cff5a9fc9f..edecd02b51 100644 --- a/ApplicationCode/ProjectDataModel/Summary/RimSummaryCurvesCalculator.cpp +++ b/ApplicationCode/ProjectDataModel/Summary/RimSummaryCurvesCalculator.cpp @@ -18,8 +18,6 @@ #include "RimSummaryCurvesCalculator.h" -#include "RigStatisticsCalculator.h" - #include "RiaDefines.h" #include "RimSummaryCurve.h" #include "RimPlotAxisProperties.h" @@ -319,86 +317,3 @@ std::string RimSummaryPlotYAxisFormatter::shortCalculationName(const std::string return calculationShortName.toStdString(); } - - - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -RimSummaryPlotYAxisRangeCalculator::RimSummaryPlotYAxisRangeCalculator( - const std::vector& qwtCurves, - const std::vector& yValuesForAllCurves) - : - m_singleCurves(qwtCurves), - m_yValuesForAllCurves(yValuesForAllCurves) -{ -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -void RimSummaryPlotYAxisRangeCalculator::computeYRange(double* min, double* max) const -{ - double minValue = HUGE_VAL; - double maxValue = -HUGE_VAL; - - for (QwtPlotCurve* curve : m_singleCurves) - { - double minCurveValue = HUGE_VAL; - double maxCurveValue = -HUGE_VAL; - - if (curveValueRangeY(curve, &minCurveValue, &maxCurveValue)) - { - if (minCurveValue < minValue) - { - minValue = minCurveValue; - } - - if (maxCurveValue > maxValue) - { - maxValue = maxCurveValue; - } - } - } - - if (minValue == HUGE_VAL) - { - minValue = RiaDefines::minimumDefaultValuePlot(); - maxValue = RiaDefines::maximumDefaultValuePlot(); - } - - // For logarithmic auto scaling, compute positive curve value closest to zero and use - // this value as the plot visible minimum - - double pos = HUGE_VAL; - double neg = -HUGE_VAL; - - RigStatisticsCalculator::posNegClosestToZero(m_yValuesForAllCurves, pos, neg); - - if (pos != HUGE_VAL) - { - minValue = pos; - } - - *min = minValue; - *max = maxValue; -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -bool RimSummaryPlotYAxisRangeCalculator::curveValueRangeY(const QwtPlotCurve* qwtCurve, double* min, double* max) const -{ - if (!qwtCurve) return false; - - if (qwtCurve->data()->size() < 1) - { - return false; - } - - *min = qwtCurve->minYValue(); - *max = qwtCurve->maxYValue(); - - return true; -} - diff --git a/ApplicationCode/ProjectDataModel/Summary/RimSummaryCurvesCalculator.h b/ApplicationCode/ProjectDataModel/Summary/RimSummaryCurvesCalculator.h index 4cf4e6199f..ac06254368 100644 --- a/ApplicationCode/ProjectDataModel/Summary/RimSummaryCurvesCalculator.h +++ b/ApplicationCode/ProjectDataModel/Summary/RimSummaryCurvesCalculator.h @@ -22,6 +22,8 @@ #include #include +#include + class RimAsciiDataCurve; class RimSummaryCurve; class RimPlotAxisProperties; @@ -46,26 +48,9 @@ private: static std::string shortCalculationName(const std::string& calculationName); private: - RimPlotAxisProperties* m_axisProperties; + RimPlotAxisProperties* m_axisProperties; const std::vector m_summaryCurves; const std::vector m_asciiDataCurves; const std::set m_timeHistoryCurveQuantities; }; - -class RimSummaryPlotYAxisRangeCalculator -{ -public: - RimSummaryPlotYAxisRangeCalculator( const std::vector& qwtCurves, - const std::vector& yValuesForAllCurves); - - void computeYRange(double* min, double* max) const; - -private: - bool curveValueRangeY(const QwtPlotCurve* qwtCurve, double* min, double* max) const; - -private: - const std::vector m_singleCurves; - const std::vector m_yValuesForAllCurves; -}; - diff --git a/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlot.cpp b/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlot.cpp index a4ac146f06..171bb7e502 100644 --- a/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlot.cpp +++ b/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlot.cpp @@ -54,6 +54,7 @@ #include "qwt_plot_curve.h" #include "qwt_plot_renderer.h" #include "qwt_plot_textlabel.h" +#include "qwt_scale_engine.h" #include #include @@ -659,8 +660,13 @@ void RimSummaryPlot::updateZoomForAxis(RiaDefines::PlotAxis plotAxis) } double min, max; - RimSummaryPlotYAxisRangeCalculator calc(plotCurves, yValues); - calc.computeYRange(&min, &max); + RimPlotAxisRangeCalculator calc(QwtPlot::yLeft, plotCurves, yValues); + calc.computeAxisRange(&min, &max); + + if (yAxisProps->isAxisInverted()) + { + std::swap(min, max); + } m_qwtPlot->setAxisScale(yAxisProps->qwtPlotAxisType(), min, max); } @@ -673,6 +679,8 @@ void RimSummaryPlot::updateZoomForAxis(RiaDefines::PlotAxis plotAxis) { m_qwtPlot->setAxisScale(yAxisProps->qwtPlotAxisType(), yAxisProps->visibleRangeMin(), yAxisProps->visibleRangeMax()); } + + m_qwtPlot->axisScaleEngine(yAxisProps->qwtPlotAxisType())->setAttribute(QwtScaleEngine::Inverted, yAxisProps->isAxisInverted()); } } From 52d2eed98bbab4846212e7cf58dc1d99521b8853 Mon Sep 17 00:00:00 2001 From: Gaute Lindkvist Date: Wed, 13 Mar 2019 10:16:46 +0100 Subject: [PATCH 3/5] Fix log axis crash in Grid Cross Plot and refactor log axis range code --- ApplicationCode/Application/RiaDefines.cpp | 8 ++ ApplicationCode/Application/RiaDefines.h | 1 + .../GridCrossPlots/RimGridCrossPlot.cpp | 61 +++++++++++-- .../GridCrossPlots/RimGridCrossPlot.h | 6 +- .../RimGridCrossPlotCurveSet.cpp | 60 +++++++++++++ .../GridCrossPlots/RimGridCrossPlotCurveSet.h | 5 ++ .../ProjectDataModel/RimEclipseCellColors.cpp | 3 +- .../RimPlotAxisProperties.cpp | 85 ++++++++++--------- .../ProjectDataModel/RimPlotAxisProperties.h | 16 ++-- .../Summary/RimSummaryPlot.cpp | 11 +-- 10 files changed, 186 insertions(+), 70 deletions(-) diff --git a/ApplicationCode/Application/RiaDefines.cpp b/ApplicationCode/Application/RiaDefines.cpp index bd42aabda6..01fc5260ae 100644 --- a/ApplicationCode/Application/RiaDefines.cpp +++ b/ApplicationCode/Application/RiaDefines.cpp @@ -464,6 +464,14 @@ double RiaDefines::minimumDefaultValuePlot() return -10.0; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +double RiaDefines::minimumDefaultLogValuePlot() +{ + return 1.0; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationCode/Application/RiaDefines.h b/ApplicationCode/Application/RiaDefines.h index 5c2de20d28..80fa0330c7 100644 --- a/ApplicationCode/Application/RiaDefines.h +++ b/ApplicationCode/Application/RiaDefines.h @@ -135,6 +135,7 @@ namespace RiaDefines }; double minimumDefaultValuePlot(); + double minimumDefaultLogValuePlot(); double maximumDefaultValuePlot(); enum PhaseType { diff --git a/ApplicationCode/ProjectDataModel/GridCrossPlots/RimGridCrossPlot.cpp b/ApplicationCode/ProjectDataModel/GridCrossPlots/RimGridCrossPlot.cpp index 2462cfe60f..24ee533aba 100644 --- a/ApplicationCode/ProjectDataModel/GridCrossPlots/RimGridCrossPlot.cpp +++ b/ApplicationCode/ProjectDataModel/GridCrossPlots/RimGridCrossPlot.cpp @@ -269,7 +269,7 @@ void RimGridCrossPlot::detachAllCurves() //-------------------------------------------------------------------------------------------------- void RimGridCrossPlot::updateAxisScaling() { - updateAxisDisplay(); + loadDataAndUpdate(); } //-------------------------------------------------------------------------------------------------- @@ -379,13 +379,11 @@ void RimGridCrossPlot::onLoadDataAndUpdate() for (auto curveSet : m_crossPlotCurveSets) { curveSet->loadDataAndUpdate(false); + curveSet->updateConnectedEditors(); } updateCurveNamesAndPlotTitle(); - updateAllRequiredEditors(); - - updatePlot(); - + updatePlot(); } //-------------------------------------------------------------------------------------------------- @@ -542,7 +540,7 @@ void RimGridCrossPlot::swapAxes() } loadDataAndUpdate(); - + updateAxisDisplay(); } @@ -574,7 +572,6 @@ QString RimGridCrossPlot::asciiDataForPlotExport(int curveSetIndex) const formatter.setTableRowLineAppendText(""); formatter.setColumnSpacing(3); - m_crossPlotCurveSets[curveSetIndex]->exportFormattedData(formatter); formatter.tableCompleted(); return asciiData; @@ -593,6 +590,22 @@ RiuGridCrossQwtPlot* RimGridCrossPlot::qwtPlot() const return m_qwtPlot; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RimGridCrossPlot::isXAxisLogarithmic() const +{ + return m_xAxisProperties->isLogarithmicScaleEnabled(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RimGridCrossPlot::isYAxisLogarithmic() const +{ + return m_yAxisProperties->isLogarithmicScaleEnabled(); +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -691,7 +704,17 @@ void RimGridCrossPlot::updateAxisInQwt(RiaDefines::PlotAxis axisType) if (axisProperties->isAutoZoom()) { - m_qwtPlot->setAxisAutoScale(qwtAxisId); + std::vector plotCurves = visibleQwtCurves(); + + double min, max; + RimPlotAxisLogRangeCalculator logRangeCalculator(qwtAxisId, plotCurves); + logRangeCalculator.computeAxisRange(&min, &max); + if (axisProperties->isAxisInverted()) + { + std::swap(min, max); + } + + m_qwtPlot->setAxisScale(qwtAxisId, min, max); } else { @@ -750,6 +773,28 @@ void RimGridCrossPlot::updateAxisFromQwt(RiaDefines::PlotAxis axisType) axisProperties->updateConnectedEditors(); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::vector RimGridCrossPlot::visibleQwtCurves() const +{ + std::vector plotCurves; + for (auto curveSet : m_crossPlotCurveSets) + { + if (curveSet->isChecked()) + { + for (auto curve : curveSet->curves()) + { + if (curve->isCurveVisible()) + { + plotCurves.push_back(curve->qwtPlotCurve()); + } + } + } + } + return plotCurves; +} + //-------------------------------------------------------------------------------------------------- /// Name Configuration /// diff --git a/ApplicationCode/ProjectDataModel/GridCrossPlots/RimGridCrossPlot.h b/ApplicationCode/ProjectDataModel/GridCrossPlots/RimGridCrossPlot.h index 0b049fd64e..97870d774a 100644 --- a/ApplicationCode/ProjectDataModel/GridCrossPlots/RimGridCrossPlot.h +++ b/ApplicationCode/ProjectDataModel/GridCrossPlots/RimGridCrossPlot.h @@ -74,6 +74,8 @@ public: QString asciiTitleForPlotExport(int curveSetIndex) const; QString asciiDataForPlotExport(int curveSetIndex) const; RiuGridCrossQwtPlot* qwtPlot() const; + bool isXAxisLogarithmic() const; + bool isYAxisLogarithmic() const; public: // Rim2dPlotInterface overrides @@ -96,13 +98,13 @@ protected: bool* useOptionsOnly) override; void updatePlot(); - void updateCurveNames(); QString xAxisParameterString() const; QString yAxisParameterString() const; void updateAxisInQwt(RiaDefines::PlotAxis axisType); void updateAxisFromQwt(RiaDefines::PlotAxis axisType); + std::vector visibleQwtCurves() const; private: caf::PdmField m_showLegend; @@ -115,7 +117,7 @@ private: caf::PdmChildArrayField m_crossPlotCurveSets; QPointer m_qwtPlot; - + }; diff --git a/ApplicationCode/ProjectDataModel/GridCrossPlots/RimGridCrossPlotCurveSet.cpp b/ApplicationCode/ProjectDataModel/GridCrossPlots/RimGridCrossPlotCurveSet.cpp index a3c384e73e..6468afe615 100644 --- a/ApplicationCode/ProjectDataModel/GridCrossPlots/RimGridCrossPlotCurveSet.cpp +++ b/ApplicationCode/ProjectDataModel/GridCrossPlots/RimGridCrossPlotCurveSet.cpp @@ -406,6 +406,10 @@ void RimGridCrossPlotCurveSet::onLoadDataAndUpdate(bool updateParentPlot) RigEclipseCrossPlotResult result = RigEclipseCrossPlotDataExtractor::extract( eclipseCase->eclipseCaseData(), m_timeStep(), xAddress, yAddress, m_grouping(), groupAddress, timeStepCellVisibilityMap); + if (isXAxisLogarithmic() || isYAxisLogarithmic()) + { + filterInvalidCurveValues(&result); + } createCurves(result); if (updateParentPlot) @@ -877,6 +881,26 @@ void RimGridCrossPlotCurveSet::exportFormattedData(RifEclipseDataTableFormatter& } } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RimGridCrossPlotCurveSet::isXAxisLogarithmic() const +{ + RimGridCrossPlot* parent = nullptr; + firstAncestorOrThisOfTypeAsserted(parent); + return parent->isXAxisLogarithmic(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RimGridCrossPlotCurveSet::isYAxisLogarithmic() const +{ + RimGridCrossPlot* parent = nullptr; + firstAncestorOrThisOfTypeAsserted(parent); + return parent->isYAxisLogarithmic(); +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -1001,6 +1025,42 @@ bool RimGridCrossPlotCurveSet::hasMultipleTimeSteps() const } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimGridCrossPlotCurveSet::filterInvalidCurveValues(RigEclipseCrossPlotResult* result) +{ + bool xLog = isXAxisLogarithmic(); + bool yLog = isYAxisLogarithmic(); + + if (xLog || yLog) + { + + RigEclipseCrossPlotResult validResult; + for (size_t i = 0; i < result->xValues.size(); ++i) + { + double xValue = result->xValues[i]; + double yValue = result->yValues[i]; + bool invalid = (xLog && xValue <= 0.0) || (yLog && yValue <= 0.0); + if (!invalid) + { + validResult.xValues.push_back(xValue); + validResult.yValues.push_back(yValue); + if (i < result->groupValuesContinuous.size()) + { + validResult.groupValuesContinuous.push_back(result->groupValuesContinuous[i]); + } + if (i < result->groupValuesDiscrete.size()) + { + validResult.groupValuesDiscrete.push_back(result->groupValuesDiscrete[i]); + } + } + } + + *result = validResult; + } +} + CAF_PDM_SOURCE_INIT(RimGridCrossPlotCurveSetNameConfig, "RimGridCrossPlotCurveSetNameConfig"); //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationCode/ProjectDataModel/GridCrossPlots/RimGridCrossPlotCurveSet.h b/ApplicationCode/ProjectDataModel/GridCrossPlots/RimGridCrossPlotCurveSet.h index d3667519b4..e4d6ea13ed 100644 --- a/ApplicationCode/ProjectDataModel/GridCrossPlots/RimGridCrossPlotCurveSet.h +++ b/ApplicationCode/ProjectDataModel/GridCrossPlots/RimGridCrossPlotCurveSet.h @@ -117,6 +117,9 @@ public: void swapAxisProperties(bool updatePlot); void exportFormattedData(RifEclipseDataTableFormatter& formatter) const; + bool isXAxisLogarithmic() const; + bool isYAxisLogarithmic() const; + protected: void initAfterRead() override; void onLoadDataAndUpdate(bool updateParentPlot); @@ -139,6 +142,7 @@ protected: void defineUiTreeOrdering(caf::PdmUiTreeOrdering& uiTreeOrdering, QString uiConfigName = "") override; bool hasMultipleTimeSteps() const; + void filterInvalidCurveValues(RigEclipseCrossPlotResult* result); private: caf::PdmPtrField m_case; @@ -154,4 +158,5 @@ private: caf::PdmChildArrayField m_crossPlotCurves; std::map m_groupedResults; + }; diff --git a/ApplicationCode/ProjectDataModel/RimEclipseCellColors.cpp b/ApplicationCode/ProjectDataModel/RimEclipseCellColors.cpp index 0f9831067e..1ea696aae3 100644 --- a/ApplicationCode/ProjectDataModel/RimEclipseCellColors.cpp +++ b/ApplicationCode/ProjectDataModel/RimEclipseCellColors.cpp @@ -239,12 +239,11 @@ void RimEclipseCellColors::uiTreeOrdering(caf::PdmUiTreeOrdering& uiTreeOrdering //-------------------------------------------------------------------------------------------------- void RimEclipseCellColors::setReservoirView(RimEclipseView* ownerReservoirView) { + m_reservoirView = ownerReservoirView; if (ownerReservoirView) { this->setEclipseCase(ownerReservoirView->eclipseCase()); } - - m_reservoirView = ownerReservoirView; } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationCode/ProjectDataModel/RimPlotAxisProperties.cpp b/ApplicationCode/ProjectDataModel/RimPlotAxisProperties.cpp index c5c761d97b..265bd8231e 100644 --- a/ApplicationCode/ProjectDataModel/RimPlotAxisProperties.cpp +++ b/ApplicationCode/ProjectDataModel/RimPlotAxisProperties.cpp @@ -26,6 +26,8 @@ #include "cafPdmUiSliderEditor.h" +#include "cvfVector2.h" + #include #include @@ -373,32 +375,32 @@ caf::PdmFieldHandle* RimPlotAxisProperties::objectToggleField() //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -RimPlotAxisRangeCalculator::RimPlotAxisRangeCalculator(QwtPlot::Axis axis, - const std::vector& qwtCurves, - const std::vector& axisValuesForAllCurves) - : m_singleCurves(qwtCurves) - , m_axisValuesForAllCurves(axisValuesForAllCurves) +RimPlotAxisLogRangeCalculator::RimPlotAxisLogRangeCalculator(QwtPlot::Axis axis, + const std::vector& qwtCurves) + : m_axis(axis) + , m_curves(qwtCurves) { } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void RimPlotAxisRangeCalculator::computeAxisRange(double* min, double* max) const +void RimPlotAxisLogRangeCalculator::computeAxisRange(double* minPositive, double* max) const { - double minValue = HUGE_VAL; - double maxValue = -HUGE_VAL; + double minPosValue = HUGE_VAL; + double maxValue = -HUGE_VAL; - for (QwtPlotCurve* curve : m_singleCurves) + for (const QwtPlotCurve* curve : m_curves) { - double minCurveValue = HUGE_VAL; - double maxCurveValue = -HUGE_VAL; + double minPosCurveValue = HUGE_VAL; + double maxCurveValue = -HUGE_VAL; - if (curveValueRange(curve, &minCurveValue, &maxCurveValue)) + if (curveValueRange(curve, &minPosCurveValue, &maxCurveValue)) { - if (minCurveValue < minValue) + if (minPosCurveValue < minPosValue) { - minValue = minCurveValue; + CVF_ASSERT(minPosCurveValue > 0.0); + minPosValue = minPosCurveValue; } if (maxCurveValue > maxValue) @@ -408,33 +410,20 @@ void RimPlotAxisRangeCalculator::computeAxisRange(double* min, double* max) cons } } - if (minValue == HUGE_VAL) + if (minPosValue == HUGE_VAL) { - minValue = RiaDefines::minimumDefaultValuePlot(); - maxValue = RiaDefines::maximumDefaultValuePlot(); + minPosValue = RiaDefines::minimumDefaultLogValuePlot(); + maxValue = RiaDefines::maximumDefaultValuePlot(); } - - // For logarithmic auto scaling, compute positive curve value closest to zero and use - // this value as the plot visible minimum - - double pos = HUGE_VAL; - double neg = -HUGE_VAL; - - RigStatisticsCalculator::posNegClosestToZero(m_axisValuesForAllCurves, pos, neg); - - if (pos != HUGE_VAL) - { - minValue = pos; - } - - *min = minValue; - *max = maxValue; + + *minPositive = minPosValue; + *max = maxValue; } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -bool RimPlotAxisRangeCalculator::curveValueRange(const QwtPlotCurve* qwtCurve, double* min, double* max) const +bool RimPlotAxisLogRangeCalculator::curveValueRange(const QwtPlotCurve* qwtCurve, double* minPositive, double* max) const { if (!qwtCurve) return false; @@ -443,15 +432,31 @@ bool RimPlotAxisRangeCalculator::curveValueRange(const QwtPlotCurve* qwtCurve, d return false; } - if (m_axis == QwtPlot::xBottom || m_axis == QwtPlot::xTop) + float minPosF = std::numeric_limits::infinity(); + float maxF = -std::numeric_limits::infinity(); + + int axisValueIndex = 0; + if (m_axis == QwtPlot::yLeft || m_axis == QwtPlot::yRight) { - *min = qwtCurve->minXValue(); - *max = qwtCurve->maxXValue(); + axisValueIndex = 1; } - else + + for (size_t i = 0; i < qwtCurve->dataSize(); ++i) { - *min = qwtCurve->minYValue(); - *max = qwtCurve->maxYValue(); + QPointF sample = qwtCurve->sample((int) i); + cvf::Vec2f vec(sample.x(), sample.y()); + float value = vec[axisValueIndex]; + if (value == HUGE_VALF) continue; + + maxF = std::max(maxF, value); + if (value > 0.0f && value < minPosF) + { + minPosF = value; + } } + + *minPositive = minPosF; + *max = maxF; + return true; } diff --git a/ApplicationCode/ProjectDataModel/RimPlotAxisProperties.h b/ApplicationCode/ProjectDataModel/RimPlotAxisProperties.h index 66ac22b7a2..ce1f665aa1 100644 --- a/ApplicationCode/ProjectDataModel/RimPlotAxisProperties.h +++ b/ApplicationCode/ProjectDataModel/RimPlotAxisProperties.h @@ -120,20 +120,18 @@ class QwtPlotCurve; /// /// //================================================================================================== -class RimPlotAxisRangeCalculator +class RimPlotAxisLogRangeCalculator { public: - RimPlotAxisRangeCalculator(QwtPlot::Axis axis, - const std::vector& qwtCurves, - const std::vector& axisValuesForAllCurves); + RimPlotAxisLogRangeCalculator(QwtPlot::Axis axis, + const std::vector& qwtCurves); - void computeAxisRange(double* min, double* max) const; + void computeAxisRange(double* minPositive, double* max) const; private: - bool curveValueRange(const QwtPlotCurve* qwtCurve, double* min, double* max) const; + bool curveValueRange(const QwtPlotCurve* qwtCurve, double* minPositive, double* max) const; private: - QwtPlot::Axis m_axis; - const std::vector m_singleCurves; - const std::vector m_axisValuesForAllCurves; + QwtPlot::Axis m_axis; + const std::vector m_curves; }; diff --git a/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlot.cpp b/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlot.cpp index 171bb7e502..30cb9a63cc 100644 --- a/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlot.cpp +++ b/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlot.cpp @@ -635,32 +635,25 @@ void RimSummaryPlot::updateZoomForAxis(RiaDefines::PlotAxis plotAxis) { if (yAxisProps->isLogarithmicScaleEnabled) { - std::vector yValues; - std::vector plotCurves; + std::vector plotCurves; for (RimSummaryCurve* c : visibleSummaryCurvesForAxis(plotAxis)) { - std::vector curveValues = c->valuesY(); - yValues.insert(yValues.end(), curveValues.begin(), curveValues.end()); plotCurves.push_back(c->qwtPlotCurve()); } for (RimGridTimeHistoryCurve* c : visibleTimeHistoryCurvesForAxis(plotAxis)) { - std::vector curveValues = c->yValues(); - yValues.insert(yValues.end(), curveValues.begin(), curveValues.end()); plotCurves.push_back(c->qwtPlotCurve()); } for (RimAsciiDataCurve* c : visibleAsciiDataCurvesForAxis(plotAxis)) { - std::vector curveValues = c->yValues(); - yValues.insert(yValues.end(), curveValues.begin(), curveValues.end()); plotCurves.push_back(c->qwtPlotCurve()); } double min, max; - RimPlotAxisRangeCalculator calc(QwtPlot::yLeft, plotCurves, yValues); + RimPlotAxisLogRangeCalculator calc(QwtPlot::yLeft, plotCurves); calc.computeAxisRange(&min, &max); if (yAxisProps->isAxisInverted()) From 72d93ac6971d06dc288fba3e8db2e41d796f5db0 Mon Sep 17 00:00:00 2001 From: Magne Sjaastad Date: Thu, 14 Mar 2019 10:16:37 +0100 Subject: [PATCH 4/5] Upped to 2018.11.2-dev.04 --- ResInsightVersion.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ResInsightVersion.cmake b/ResInsightVersion.cmake index d53b7fbce3..f3317372e3 100644 --- a/ResInsightVersion.cmake +++ b/ResInsightVersion.cmake @@ -10,7 +10,7 @@ set(RESINSIGHT_VERSION_TEXT "-dev") # Must be unique and increasing within one combination of major/minor/patch version # The uniqueness of this text is independent of RESINSIGHT_VERSION_TEXT # Format of text must be ".xx" -set(RESINSIGHT_DEV_VERSION ".03") +set(RESINSIGHT_DEV_VERSION ".04") # https://github.com/CRAVA/crava/tree/master/libs/nrlib set(NRLIB_GITHUB_SHA "ba35d4359882f1c6f5e9dc30eb95fe52af50fd6f") From 136f13e14554bead352dbafaeea04af1dd9e224d Mon Sep 17 00:00:00 2001 From: Gaute Lindkvist Date: Thu, 14 Mar 2019 15:24:11 +0100 Subject: [PATCH 5/5] #4198 Make sure exit application works as expected with both windows open --- .../ApplicationCommands/RicExitApplicationFeature.cpp | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/ApplicationCode/Commands/ApplicationCommands/RicExitApplicationFeature.cpp b/ApplicationCode/Commands/ApplicationCommands/RicExitApplicationFeature.cpp index 24aaa0dd11..e5d164541a 100644 --- a/ApplicationCode/Commands/ApplicationCommands/RicExitApplicationFeature.cpp +++ b/ApplicationCode/Commands/ApplicationCommands/RicExitApplicationFeature.cpp @@ -19,8 +19,10 @@ #include "RicExitApplicationFeature.h" #include "RiaApplication.h" +#include "RiuMainWindow.h" #include +#include CAF_CMD_SOURCE_INIT(RicExitApplicationFeature, "RicExitApplicationFeature"); @@ -42,7 +44,13 @@ void RicExitApplicationFeature::onActionTriggered(bool isChecked) RiaApplication* app = RiaApplication::instance(); if (!app->askUserToSaveModifiedProject()) return; - app->closeAllWindows(); + // Hide all windows first to make sure they get closed properly + for (QWidget* topLevelWidget : app->topLevelWidgets()) + { + topLevelWidget->hide(); + } + // Close just the main window, it'll take care of closing the plot window + app->mainWindow()->close(); } //--------------------------------------------------------------------------------------------------