From 04e71bbe94f36d5646e1a9d5b7bd07cdcff8006a Mon Sep 17 00:00:00 2001 From: Magne Sjaastad Date: Tue, 19 Nov 2019 14:56:51 +0100 Subject: [PATCH 01/50] Set version to 2019.11.RC01 --- ResInsightVersion.cmake | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/ResInsightVersion.cmake b/ResInsightVersion.cmake index 1a7e33c564..8581933979 100644 --- a/ResInsightVersion.cmake +++ b/ResInsightVersion.cmake @@ -1,16 +1,16 @@ set(RESINSIGHT_MAJOR_VERSION 2019) -set(RESINSIGHT_MINOR_VERSION 08) -set(RESINSIGHT_PATCH_VERSION 2) +set(RESINSIGHT_MINOR_VERSION 11) +set(RESINSIGHT_PATCH_VERSION 0) # Opional text with no restrictions -set(RESINSIGHT_VERSION_TEXT "-dev") +set(RESINSIGHT_VERSION_TEXT "-RC01") # Optional text # 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 ".07") +#set(RESINSIGHT_DEV_VERSION ".07") # https://github.com/CRAVA/crava/tree/master/libs/nrlib set(NRLIB_GITHUB_SHA "ba35d4359882f1c6f5e9dc30eb95fe52af50fd6f") From 6b782cb64643eb292447aead89b74b68d536c361 Mon Sep 17 00:00:00 2001 From: Magne Sjaastad Date: Wed, 20 Nov 2019 07:05:24 +0100 Subject: [PATCH 02/50] #5067 Janitor : Fix memory leak when opening summary files --- ApplicationCode/FileInterface/RifEclipseSummaryTools.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/ApplicationCode/FileInterface/RifEclipseSummaryTools.cpp b/ApplicationCode/FileInterface/RifEclipseSummaryTools.cpp index db10835285..4ed50f2a0c 100644 --- a/ApplicationCode/FileInterface/RifEclipseSummaryTools.cpp +++ b/ApplicationCode/FileInterface/RifEclipseSummaryTools.cpp @@ -65,6 +65,10 @@ void RifEclipseSummaryTools::findSummaryFiles( const QString& inputFile, QString std::string extention; if ( myExtention ) extention = myExtention; + free( myExtention ); + free( myBase ); + free( myPath ); + if ( path.isEmpty() || base.isEmpty() ) return; char* myHeaderFile = nullptr; From 88d961e516798da2e3a9c88146cf9790a8a2159b Mon Sep 17 00:00:00 2001 From: Magne Sjaastad Date: Wed, 20 Nov 2019 09:07:59 +0100 Subject: [PATCH 03/50] Janitor : Fix memory leak --- ApplicationCode/UserInterface/RiuQwtPlotCurve.cpp | 2 +- ApplicationCode/UserInterface/RiuQwtPlotCurve.h | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/ApplicationCode/UserInterface/RiuQwtPlotCurve.cpp b/ApplicationCode/UserInterface/RiuQwtPlotCurve.cpp index b53ca9d2db..6656d8ef36 100644 --- a/ApplicationCode/UserInterface/RiuQwtPlotCurve.cpp +++ b/ApplicationCode/UserInterface/RiuQwtPlotCurve.cpp @@ -52,7 +52,7 @@ RiuQwtPlotCurve::RiuQwtPlotCurve( const QString& title ) m_symbolSkipPixelDistance = 10.0f; - m_errorBars = new QwtPlotIntervalCurve(); + m_errorBars = std::unique_ptr( new QwtPlotIntervalCurve() ); m_errorBars->setStyle( QwtPlotIntervalCurve::CurveStyle::NoCurve ); m_errorBars->setSymbol( new QwtIntervalSymbol( QwtIntervalSymbol::Bar ) ); m_errorBars->setItemAttribute( QwtPlotItem::Legend, false ); diff --git a/ApplicationCode/UserInterface/RiuQwtPlotCurve.h b/ApplicationCode/UserInterface/RiuQwtPlotCurve.h index 908462217c..786cebf42c 100644 --- a/ApplicationCode/UserInterface/RiuQwtPlotCurve.h +++ b/ApplicationCode/UserInterface/RiuQwtPlotCurve.h @@ -150,10 +150,10 @@ private: std::vector> m_polyLineStartStopIndices; float m_symbolSkipPixelDistance; - bool m_showErrorBars; - QwtPlotIntervalCurve* m_errorBars; - QwtPlot* m_attachedToPlot; - bool m_blackAndWhiteLegendIcon; + bool m_showErrorBars; + std::unique_ptr m_errorBars; + QwtPlot* m_attachedToPlot; + bool m_blackAndWhiteLegendIcon; std::vector m_perPointLabels; }; From 4225e67834c1df8736c1fc1e258fb2dcc8573bc0 Mon Sep 17 00:00:00 2001 From: Magne Sjaastad Date: Wed, 20 Nov 2019 11:41:14 +0100 Subject: [PATCH 04/50] Janitor : Make sure memory is released by using unique_ptr --- .../SummaryPlotCommands/RicEditSummaryPlotFeature.cpp | 9 +++++++-- .../SummaryPlotCommands/RicSummaryCurveCreatorDialog.cpp | 9 ++++++--- .../SummaryPlotCommands/RicSummaryCurveCreatorDialog.h | 2 +- 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/ApplicationCode/Commands/SummaryPlotCommands/RicEditSummaryPlotFeature.cpp b/ApplicationCode/Commands/SummaryPlotCommands/RicEditSummaryPlotFeature.cpp index ae7d3f30ab..2eb44d8edd 100644 --- a/ApplicationCode/Commands/SummaryPlotCommands/RicEditSummaryPlotFeature.cpp +++ b/ApplicationCode/Commands/SummaryPlotCommands/RicEditSummaryPlotFeature.cpp @@ -60,9 +60,14 @@ void RicEditSummaryPlotFeature::closeDialogAndResetTargetPlot() //-------------------------------------------------------------------------------------------------- RicSummaryCurveCreatorDialog* RicEditSummaryPlotFeature::curveCreatorDialog() { - static RicSummaryCurveCreatorDialog* singletonDialog = new RicSummaryCurveCreatorDialog( nullptr ); + static std::unique_ptr singletonDialog; - return singletonDialog; + if ( !singletonDialog ) + { + singletonDialog.reset( new RicSummaryCurveCreatorDialog( nullptr ) ); + } + + return singletonDialog.get(); } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationCode/Commands/SummaryPlotCommands/RicSummaryCurveCreatorDialog.cpp b/ApplicationCode/Commands/SummaryPlotCommands/RicSummaryCurveCreatorDialog.cpp index 0f4b59a0ba..f7d8ca667a 100644 --- a/ApplicationCode/Commands/SummaryPlotCommands/RicSummaryCurveCreatorDialog.cpp +++ b/ApplicationCode/Commands/SummaryPlotCommands/RicSummaryCurveCreatorDialog.cpp @@ -36,7 +36,7 @@ RicSummaryCurveCreatorDialog::RicSummaryCurveCreatorDialog( QWidget* parent ) : QDialog( parent, RiuTools::defaultDialogFlags() ) { - m_curveCreatorSplitterUi = new RicSummaryCurveCreatorSplitterUi( this ); + m_curveCreatorSplitterUi.reset( new RicSummaryCurveCreatorSplitterUi( this ) ); QWidget* propertyWidget = m_curveCreatorSplitterUi->getOrCreateWidget( this ); @@ -46,7 +46,7 @@ RicSummaryCurveCreatorDialog::RicSummaryCurveCreatorDialog( QWidget* parent ) setWindowTitle( "Plot Editor" ); resize( 1200, 800 ); - connect( m_curveCreatorSplitterUi, SIGNAL( signalCloseButtonPressed() ), this, SLOT( accept() ) ); + connect( m_curveCreatorSplitterUi.get(), SIGNAL( signalCloseButtonPressed() ), this, SLOT( accept() ) ); connect( this, SIGNAL( finished( int ) ), this, SLOT( slotDialogFinished() ) ); } @@ -54,7 +54,10 @@ RicSummaryCurveCreatorDialog::RicSummaryCurveCreatorDialog( QWidget* parent ) //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -RicSummaryCurveCreatorDialog::~RicSummaryCurveCreatorDialog() {} +RicSummaryCurveCreatorDialog::~RicSummaryCurveCreatorDialog() +{ + m_curveCreatorSplitterUi->setPdmObject( nullptr ); +} //-------------------------------------------------------------------------------------------------- /// diff --git a/ApplicationCode/Commands/SummaryPlotCommands/RicSummaryCurveCreatorDialog.h b/ApplicationCode/Commands/SummaryPlotCommands/RicSummaryCurveCreatorDialog.h index 1c154052f4..88d6fee07c 100644 --- a/ApplicationCode/Commands/SummaryPlotCommands/RicSummaryCurveCreatorDialog.h +++ b/ApplicationCode/Commands/SummaryPlotCommands/RicSummaryCurveCreatorDialog.h @@ -47,5 +47,5 @@ private slots: void slotDialogFinished(); private: - RicSummaryCurveCreatorSplitterUi* m_curveCreatorSplitterUi; + std::unique_ptr m_curveCreatorSplitterUi; }; From 0bf782147abe447866e379c7a23ec16f37deba02 Mon Sep 17 00:00:00 2001 From: Magne Sjaastad Date: Wed, 20 Nov 2019 11:42:13 +0100 Subject: [PATCH 05/50] Janitor : RimProject : Skip obsolete delete in desctructor --- ApplicationCode/ProjectDataModel/RimProject.cpp | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/ApplicationCode/ProjectDataModel/RimProject.cpp b/ApplicationCode/ProjectDataModel/RimProject.cpp index 7fe4553816..b4cd5786d0 100644 --- a/ApplicationCode/ProjectDataModel/RimProject.cpp +++ b/ApplicationCode/ProjectDataModel/RimProject.cpp @@ -203,13 +203,7 @@ RimProject::RimProject( void ) //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -RimProject::~RimProject( void ) -{ - close(); - - oilFields.deleteAllChildObjects(); - if ( scriptCollection() ) delete scriptCollection(); -} +RimProject::~RimProject( void ) {} //-------------------------------------------------------------------------------------------------- /// From 5fc576b8f3fbbfe7e44893f78cecd95c0a1d8802 Mon Sep 17 00:00:00 2001 From: Magne Sjaastad Date: Wed, 20 Nov 2019 11:48:02 +0100 Subject: [PATCH 06/50] Janitor : Release memory to make it easier to detect memory leaks --- ApplicationCode/Application/RiaApplication.cpp | 3 +++ ApplicationCode/Application/RiaFontCache.cpp | 8 ++++++++ ApplicationCode/Application/RiaFontCache.h | 2 ++ 3 files changed, 13 insertions(+) diff --git a/ApplicationCode/Application/RiaApplication.cpp b/ApplicationCode/Application/RiaApplication.cpp index d32abca2ef..0958f875e3 100644 --- a/ApplicationCode/Application/RiaApplication.cpp +++ b/ApplicationCode/Application/RiaApplication.cpp @@ -153,6 +153,9 @@ RiaApplication::RiaApplication() RiaApplication::~RiaApplication() { delete m_preferences; + delete m_project; + + RiaFontCache::clear(); } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationCode/Application/RiaFontCache.cpp b/ApplicationCode/Application/RiaFontCache.cpp index bcf15128cb..3ffa7ec491 100644 --- a/ApplicationCode/Application/RiaFontCache.cpp +++ b/ApplicationCode/Application/RiaFontCache.cpp @@ -129,3 +129,11 @@ RiaFontCache::FontSize RiaFontCache::fontSizeEnumFromPointSize( int pointSize ) } return closestEnumValue; } + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RiaFontCache::clear() +{ + ms_fonts.clear(); +} diff --git a/ApplicationCode/Application/RiaFontCache.h b/ApplicationCode/Application/RiaFontCache.h index 27e1ac02cb..59b28cdd56 100644 --- a/ApplicationCode/Application/RiaFontCache.h +++ b/ApplicationCode/Application/RiaFontCache.h @@ -56,6 +56,8 @@ public: static int pointSizeFromFontSizeEnum( FontSize fontSize ); static FontSize fontSizeEnumFromPointSize( int pointSize ); + static void clear(); + private: static std::map> ms_fonts; }; From ec7f1a1a7f448d880923a7141666e380996c29bd Mon Sep 17 00:00:00 2001 From: Magne Sjaastad Date: Wed, 20 Nov 2019 15:24:05 +0100 Subject: [PATCH 07/50] #5028 Performance Summary : Add progress bar to summary reader --- .../Summary/RimSummaryCaseMainCollection.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/ApplicationCode/ProjectDataModel/Summary/RimSummaryCaseMainCollection.cpp b/ApplicationCode/ProjectDataModel/Summary/RimSummaryCaseMainCollection.cpp index e1c046ed81..7f9b4ff28f 100644 --- a/ApplicationCode/ProjectDataModel/Summary/RimSummaryCaseMainCollection.cpp +++ b/ApplicationCode/ProjectDataModel/Summary/RimSummaryCaseMainCollection.cpp @@ -399,9 +399,11 @@ void RimSummaryCaseMainCollection::loadFileSummaryCaseData( std::vector( fileSummaryCases.size() ); ++cIdx ) { RimFileSummaryCase* fileSummaryCase = fileSummaryCases[cIdx]; @@ -409,6 +411,8 @@ void RimSummaryCaseMainCollection::loadFileSummaryCaseData( std::vectorcreateSummaryReaderInterface(); } + + progInfo.setProgress( cIdx ); } for ( int cIdx = 0; cIdx < static_cast( fileSummaryCases.size() ); ++cIdx ) From caf5ce86663daa72ef3abe71ff4cf6d851c411c0 Mon Sep 17 00:00:00 2001 From: Magne Sjaastad Date: Wed, 20 Nov 2019 15:29:53 +0100 Subject: [PATCH 08/50] Janitor : Add missing includes --- .../Commands/SummaryPlotCommands/RicEditSummaryPlotFeature.cpp | 2 ++ .../Commands/SummaryPlotCommands/RicSummaryCurveCreatorDialog.h | 2 ++ ApplicationCode/UserInterface/RiuQwtPlotCurve.h | 2 ++ 3 files changed, 6 insertions(+) diff --git a/ApplicationCode/Commands/SummaryPlotCommands/RicEditSummaryPlotFeature.cpp b/ApplicationCode/Commands/SummaryPlotCommands/RicEditSummaryPlotFeature.cpp index 2eb44d8edd..03f46c0eee 100644 --- a/ApplicationCode/Commands/SummaryPlotCommands/RicEditSummaryPlotFeature.cpp +++ b/ApplicationCode/Commands/SummaryPlotCommands/RicEditSummaryPlotFeature.cpp @@ -33,6 +33,8 @@ #include +#include + CAF_CMD_SOURCE_INIT( RicEditSummaryPlotFeature, "RicEditSummaryPlotFeature" ); //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationCode/Commands/SummaryPlotCommands/RicSummaryCurveCreatorDialog.h b/ApplicationCode/Commands/SummaryPlotCommands/RicSummaryCurveCreatorDialog.h index 88d6fee07c..7573d1d015 100644 --- a/ApplicationCode/Commands/SummaryPlotCommands/RicSummaryCurveCreatorDialog.h +++ b/ApplicationCode/Commands/SummaryPlotCommands/RicSummaryCurveCreatorDialog.h @@ -20,6 +20,8 @@ #include +#include + namespace caf { class PdmObject; diff --git a/ApplicationCode/UserInterface/RiuQwtPlotCurve.h b/ApplicationCode/UserInterface/RiuQwtPlotCurve.h index 786cebf42c..d4006d20fd 100644 --- a/ApplicationCode/UserInterface/RiuQwtPlotCurve.h +++ b/ApplicationCode/UserInterface/RiuQwtPlotCurve.h @@ -23,6 +23,8 @@ #include "qwt_plot_intervalcurve.h" #include "qwt_symbol.h" +#include + class RiuErrorBarsQwtPlotCurve; //================================================================================================== From 5fae9646ae5dcc869be82c151c19214a81324efb Mon Sep 17 00:00:00 2001 From: Gaute Lindkvist Date: Thu, 21 Nov 2019 08:22:33 +0100 Subject: [PATCH 09/50] Fix curves not showing up after moving plots to multi plot (#5070) * Fix curves not showing up after moving plots to multi plot * Fix typo in RiuQwtPlotWidget::closeEvent * Fix incompatibility with release-branch --- .../UserInterface/RiuQwtPlotWidget.cpp | 19 +++++++++++++++---- .../UserInterface/RiuQwtPlotWidget.h | 1 + 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/ApplicationCode/UserInterface/RiuQwtPlotWidget.cpp b/ApplicationCode/UserInterface/RiuQwtPlotWidget.cpp index cd86472d61..977e38c0fc 100644 --- a/ApplicationCode/UserInterface/RiuQwtPlotWidget.cpp +++ b/ApplicationCode/UserInterface/RiuQwtPlotWidget.cpp @@ -78,10 +78,9 @@ RiuQwtPlotWidget::RiuQwtPlotWidget( RimPlotInterface* plotTrackDefinition, QWidg //-------------------------------------------------------------------------------------------------- RiuQwtPlotWidget::~RiuQwtPlotWidget() { - if ( plotDefinition() ) - { - plotDefinition()->detachAllCurves(); - } + // The destructor may be called later when deleting with QWidget::deleteLater() + // If you are recreating the widget, then calling something that detaches QwtCurves + // here may cause them to detach from the new widget rather than the old. } //-------------------------------------------------------------------------------------------------- @@ -567,6 +566,18 @@ void RiuQwtPlotWidget::showEvent( QShowEvent* event ) QwtPlot::showEvent( event ); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RiuQwtPlotWidget::closeEvent( QCloseEvent* event ) +{ + if ( plotDefinition() ) + { + plotDefinition()->detachAllCurves(); + } + QwtPlot::closeEvent( event ); +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationCode/UserInterface/RiuQwtPlotWidget.h b/ApplicationCode/UserInterface/RiuQwtPlotWidget.h index 05e5c0da8a..5db20b8afa 100644 --- a/ApplicationCode/UserInterface/RiuQwtPlotWidget.h +++ b/ApplicationCode/UserInterface/RiuQwtPlotWidget.h @@ -109,6 +109,7 @@ protected: bool eventFilter( QObject* watched, QEvent* event ) override; void hideEvent( QHideEvent* event ) override; void showEvent( QShowEvent* event ) override; + void closeEvent( QCloseEvent* event ) override; void applyAxisTitleToQwt( QwtPlot::Axis axis ); From d079f233a46bc284a5b52354ce3c53a1b1300fdf Mon Sep 17 00:00:00 2001 From: Magne Sjaastad Date: Wed, 20 Nov 2019 09:07:59 +0100 Subject: [PATCH 10/50] Revert "Janitor : Fix memory leak" This reverts commit 88d961e516798da2e3a9c88146cf9790a8a2159b. --- ApplicationCode/UserInterface/RiuQwtPlotCurve.cpp | 2 +- ApplicationCode/UserInterface/RiuQwtPlotCurve.h | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/ApplicationCode/UserInterface/RiuQwtPlotCurve.cpp b/ApplicationCode/UserInterface/RiuQwtPlotCurve.cpp index 6656d8ef36..b53ca9d2db 100644 --- a/ApplicationCode/UserInterface/RiuQwtPlotCurve.cpp +++ b/ApplicationCode/UserInterface/RiuQwtPlotCurve.cpp @@ -52,7 +52,7 @@ RiuQwtPlotCurve::RiuQwtPlotCurve( const QString& title ) m_symbolSkipPixelDistance = 10.0f; - m_errorBars = std::unique_ptr( new QwtPlotIntervalCurve() ); + m_errorBars = new QwtPlotIntervalCurve(); m_errorBars->setStyle( QwtPlotIntervalCurve::CurveStyle::NoCurve ); m_errorBars->setSymbol( new QwtIntervalSymbol( QwtIntervalSymbol::Bar ) ); m_errorBars->setItemAttribute( QwtPlotItem::Legend, false ); diff --git a/ApplicationCode/UserInterface/RiuQwtPlotCurve.h b/ApplicationCode/UserInterface/RiuQwtPlotCurve.h index d4006d20fd..596e2d7160 100644 --- a/ApplicationCode/UserInterface/RiuQwtPlotCurve.h +++ b/ApplicationCode/UserInterface/RiuQwtPlotCurve.h @@ -152,10 +152,10 @@ private: std::vector> m_polyLineStartStopIndices; float m_symbolSkipPixelDistance; - bool m_showErrorBars; - std::unique_ptr m_errorBars; - QwtPlot* m_attachedToPlot; - bool m_blackAndWhiteLegendIcon; + bool m_showErrorBars; + QwtPlotIntervalCurve* m_errorBars; + QwtPlot* m_attachedToPlot; + bool m_blackAndWhiteLegendIcon; std::vector m_perPointLabels; }; From 36772e77b141630e59302b40d5af20047547eb59 Mon Sep 17 00:00:00 2001 From: Magne Sjaastad Date: Fri, 22 Nov 2019 14:22:00 +0100 Subject: [PATCH 11/50] #5079 Curve Error Bars : Move to RimPlotCurve --- .../Application/Tools/RiaCurveDataTools.h | 6 + .../ProjectDataModel/RimPlotCurve.cpp | 121 ++++++++++- .../ProjectDataModel/RimPlotCurve.h | 15 +- .../ProjectDataModel/RimWellLogCurve.cpp | 2 +- .../ProjectDataModel/RimWellLogRftCurve.cpp | 49 +++-- .../Summary/RimSummaryCurve.cpp | 21 +- .../UserInterface/RiuQwtPlotCurve.cpp | 196 +++--------------- .../UserInterface/RiuQwtPlotCurve.h | 56 ++--- 8 files changed, 225 insertions(+), 241 deletions(-) diff --git a/ApplicationCode/Application/Tools/RiaCurveDataTools.h b/ApplicationCode/Application/Tools/RiaCurveDataTools.h index 235cc3543e..72508b1d54 100644 --- a/ApplicationCode/Application/Tools/RiaCurveDataTools.h +++ b/ApplicationCode/Application/Tools/RiaCurveDataTools.h @@ -36,6 +36,12 @@ class RiaCurveDataTools public: typedef std::vector> CurveIntervals; + enum ErrorAxis + { + ERROR_ALONG_X_AXIS, + ERROR_ALONG_Y_AXIS + }; + public: static CurveIntervals calculateIntervalsOfValidValues( const std::vector& values, bool includePositiveValuesOnly ); diff --git a/ApplicationCode/ProjectDataModel/RimPlotCurve.cpp b/ApplicationCode/ProjectDataModel/RimPlotCurve.cpp index 14cbf83229..1c2c78264b 100644 --- a/ApplicationCode/ProjectDataModel/RimPlotCurve.cpp +++ b/ApplicationCode/ProjectDataModel/RimPlotCurve.cpp @@ -18,7 +18,9 @@ #include "RimPlotCurve.h" +#include "RiaCurveDataTools.h" #include "RiaGuiApplication.h" + #include "RimEnsembleCurveSet.h" #include "RimEnsembleCurveSetCollection.h" #include "RimNameConfig.h" @@ -35,12 +37,16 @@ #include "cvfAssert.h" +#include "qwt_date.h" +#include "qwt_interval_symbol.h" #include "qwt_plot.h" #include "qwt_symbol.h" // NB! Special macro for pure virtual class CAF_PDM_XML_ABSTRACT_SOURCE_INIT( RimPlotCurve, "PlotCurve" ); +#define DOUBLE_INF std::numeric_limits::infinity() + namespace caf { template <> @@ -147,7 +153,12 @@ RimPlotCurve::RimPlotCurve() CAF_PDM_InitFieldNoDefault( &m_symbolLabelPosition, "SymbolLabelPosition", "Symbol Label Position", "", "", "" ); - m_qwtPlotCurve = new RiuRimQwtPlotCurve( this ); + m_qwtPlotCurve = new RiuRimQwtPlotCurve( this ); + m_qwtCurveErrorBars = new QwtPlotIntervalCurve(); + m_qwtCurveErrorBars->setStyle( QwtPlotIntervalCurve::CurveStyle::NoCurve ); + m_qwtCurveErrorBars->setSymbol( new QwtIntervalSymbol( QwtIntervalSymbol::Bar ) ); + m_qwtCurveErrorBars->setItemAttribute( QwtPlotItem::Legend, false ); + m_qwtCurveErrorBars->setZ( RiuQwtPlotCurve::Z_ERROR_BARS ); m_parentQwtPlot = nullptr; } @@ -164,6 +175,13 @@ RimPlotCurve::~RimPlotCurve() m_qwtPlotCurve = nullptr; } + if ( m_qwtCurveErrorBars ) + { + m_qwtCurveErrorBars->detach(); + delete m_qwtCurveErrorBars; + m_qwtCurveErrorBars = nullptr; + } + if ( m_parentQwtPlot ) { m_parentQwtPlot->replot(); @@ -220,7 +238,6 @@ void RimPlotCurve::fieldChangedByUi( const caf::PdmFieldHandle* changedField, } else if ( changedField == &m_showErrorBars ) { - m_qwtPlotCurve->showErrorBars( m_showErrorBars ); updateCurveAppearance(); } RiuPlotMainWindowTools::refreshToolbars(); @@ -271,11 +288,12 @@ void RimPlotCurve::updateCurveVisibility( bool updateParentPlot ) { if ( canCurveBeAttached() ) { - m_qwtPlotCurve->attach( m_parentQwtPlot ); + attachCurveAndErrorBars(); } else { m_qwtPlotCurve->detach(); + m_qwtCurveErrorBars->detach(); } if ( updateParentPlot ) @@ -323,7 +341,8 @@ void RimPlotCurve::setParentQwtPlotAndReplot( QwtPlot* plot ) m_parentQwtPlot = plot; if ( canCurveBeAttached() ) { - m_qwtPlotCurve->attach( m_parentQwtPlot ); + attachCurveAndErrorBars(); + m_parentQwtPlot->replot(); } } @@ -336,11 +355,12 @@ void RimPlotCurve::setParentQwtPlotNoReplot( QwtPlot* plot ) m_parentQwtPlot = plot; if ( canCurveBeAttached() ) { - m_qwtPlotCurve->attach( m_parentQwtPlot ); + attachCurveAndErrorBars(); } else { m_qwtPlotCurve->detach(); + m_qwtCurveErrorBars->detach(); } } @@ -366,6 +386,7 @@ void RimPlotCurve::setColor( const cvf::Color3f& color ) void RimPlotCurve::detachQwtCurve() { m_qwtPlotCurve->detach(); + m_qwtCurveErrorBars->detach(); } //-------------------------------------------------------------------------------------------------- @@ -376,7 +397,7 @@ void RimPlotCurve::reattachQwtCurve() detachQwtCurve(); if ( canCurveBeAttached() ) { - m_qwtPlotCurve->attach( m_parentQwtPlot ); + attachCurveAndErrorBars(); } } @@ -486,6 +507,75 @@ void RimPlotCurve::defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& u throw std::logic_error( "The method or operation is not implemented." ); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimPlotCurve::setSamplesFromXYErrorValues( + const std::vector& xValues, + const std::vector& yValues, + const std::vector& errorValues, + bool keepOnlyPositiveValues, + RiaCurveDataTools::ErrorAxis errorAxis /*= RiuQwtPlotCurve::ERROR_ALONG_Y_AXIS */ ) +{ + CVF_ASSERT( xValues.size() == yValues.size() ); + CVF_ASSERT( xValues.size() == errorValues.size() ); + + auto intervalsOfValidValues = RiaCurveDataTools::calculateIntervalsOfValidValues( yValues, keepOnlyPositiveValues ); + std::vector filteredYValues; + std::vector filteredXValues; + + RiaCurveDataTools::getValuesByIntervals( yValues, intervalsOfValidValues, &filteredYValues ); + RiaCurveDataTools::getValuesByIntervals( xValues, intervalsOfValidValues, &filteredXValues ); + + std::vector filteredErrorValues; + RiaCurveDataTools::getValuesByIntervals( errorValues, intervalsOfValidValues, &filteredErrorValues ); + + QVector errorIntervals; + + errorIntervals.reserve( static_cast( filteredXValues.size() ) ); + + for ( size_t i = 0; i < filteredXValues.size(); i++ ) + { + if ( filteredYValues[i] != DOUBLE_INF && filteredErrorValues[i] != DOUBLE_INF ) + { + if ( errorAxis == RiaCurveDataTools::ERROR_ALONG_Y_AXIS ) + { + errorIntervals << QwtIntervalSample( filteredXValues[i], + filteredYValues[i] - filteredErrorValues[i], + filteredYValues[i] + filteredErrorValues[i] ); + } + else + { + errorIntervals << QwtIntervalSample( filteredYValues[i], + filteredXValues[i] - filteredErrorValues[i], + filteredXValues[i] + filteredErrorValues[i] ); + } + } + } + + if ( m_qwtPlotCurve ) + { + m_qwtPlotCurve->setSamples( filteredXValues.data(), + filteredYValues.data(), + static_cast( filteredXValues.size() ) ); + + m_qwtPlotCurve->setLineSegmentStartStopIndices( intervalsOfValidValues ); + } + + if ( m_qwtCurveErrorBars ) + { + m_qwtCurveErrorBars->setSamples( errorIntervals ); + if ( errorAxis == RiaCurveDataTools::ERROR_ALONG_Y_AXIS ) + { + m_qwtCurveErrorBars->setOrientation( Qt::Vertical ); + } + else + { + m_qwtCurveErrorBars->setOrientation( Qt::Horizontal ); + } + } +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -557,6 +647,19 @@ bool RimPlotCurve::canCurveBeAttached() const return isVisibleInPossibleParent; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimPlotCurve::attachCurveAndErrorBars() +{ + m_qwtPlotCurve->attach( m_parentQwtPlot ); + + if ( m_showErrorBars ) + { + m_qwtCurveErrorBars->attach( m_parentQwtPlot ); + } +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -585,7 +688,11 @@ void RimPlotCurve::updateCurveAppearance() m_qwtPlotCurve->setSymbol( symbol ); m_qwtPlotCurve->setSymbolSkipPixelDistance( m_symbolSkipPixelDistance() ); - m_qwtPlotCurve->setErrorBarsColor( curveColor ); + { + QwtIntervalSymbol* newSymbol = new QwtIntervalSymbol( QwtIntervalSymbol::Bar ); + newSymbol->setPen( QPen( curveColor ) ); + m_qwtCurveErrorBars->setSymbol( newSymbol ); + } // Make sure the legend lines are long enough to distinguish between line types. // Standard width in Qwt is 8 which is too short. diff --git a/ApplicationCode/ProjectDataModel/RimPlotCurve.h b/ApplicationCode/ProjectDataModel/RimPlotCurve.h index d17a720bb7..d4696ccf87 100644 --- a/ApplicationCode/ProjectDataModel/RimPlotCurve.h +++ b/ApplicationCode/ProjectDataModel/RimPlotCurve.h @@ -18,6 +18,9 @@ #pragma once #include "RifEclipseSummaryAddress.h" + +#include "RiaCurveDataTools.h" + #include "RiuQwtPlotCurve.h" #include "RiuQwtSymbol.h" @@ -29,6 +32,7 @@ class QwtPlot; class QwtPlotCurve; +class QwtPlotIntervalCurve; //================================================================================================== /// @@ -120,6 +124,12 @@ protected: virtual void updateLegendsInPlot(); void defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) override; + void setSamplesFromXYErrorValues( const std::vector& xValues, + const std::vector& yValues, + const std::vector& errorValues, + bool keepOnlyPositiveValues, + RiaCurveDataTools::ErrorAxis errorAxis = RiaCurveDataTools::ERROR_ALONG_Y_AXIS ); + protected: // Overridden PDM methods void fieldChangedByUi( const caf::PdmFieldHandle* changedField, @@ -134,10 +144,13 @@ protected: private: bool canCurveBeAttached() const; + void attachCurveAndErrorBars(); protected: QPointer m_parentQwtPlot; - RiuQwtPlotCurve* m_qwtPlotCurve; + + RiuQwtPlotCurve* m_qwtPlotCurve; + QwtPlotIntervalCurve* m_qwtCurveErrorBars; caf::PdmField m_showCurve; caf::PdmField m_curveName; diff --git a/ApplicationCode/ProjectDataModel/RimWellLogCurve.cpp b/ApplicationCode/ProjectDataModel/RimWellLogCurve.cpp index f7dc139592..56e1ffdb47 100644 --- a/ApplicationCode/ProjectDataModel/RimWellLogCurve.cpp +++ b/ApplicationCode/ProjectDataModel/RimWellLogCurve.cpp @@ -47,7 +47,7 @@ RimWellLogCurve::RimWellLogCurve() CAF_PDM_InitObject( "WellLogCurve", ":/WellLogCurve16x16.png", "", "" ); m_qwtPlotCurve->setXAxis( QwtPlot::xTop ); - m_qwtPlotCurve->setErrorBarsXAxis( QwtPlot::xTop ); + m_qwtCurveErrorBars->setXAxis( QwtPlot::xTop ); m_qwtPlotCurve->setYAxis( QwtPlot::yLeft ); m_curveData = new RigWellLogCurveData; diff --git a/ApplicationCode/ProjectDataModel/RimWellLogRftCurve.cpp b/ApplicationCode/ProjectDataModel/RimWellLogRftCurve.cpp index b10ebca117..4c89bfa4d3 100644 --- a/ApplicationCode/ProjectDataModel/RimWellLogRftCurve.cpp +++ b/ApplicationCode/ProjectDataModel/RimWellLogRftCurve.cpp @@ -378,6 +378,7 @@ void RimWellLogRftCurve::onLoadDataAndUpdate( bool updateParentPlot ) RimWellRftPlot* rftPlot = dynamic_cast( wellLogPlot ); bool showErrorBarsInObservedData = rftPlot ? rftPlot->showErrorBarsForObservedData() : false; + m_showErrorBars = showErrorBarsInObservedData; std::vector measuredDepthVector = measuredDepthValues(); std::vector tvDepthVector = tvDepthValues(); @@ -447,14 +448,24 @@ void RimWellLogRftCurve::onLoadDataAndUpdate( bool updateParentPlot ) if ( wellLogPlot->depthType() == RiaDefines::MEASURED_DEPTH ) { - m_qwtPlotCurve->showErrorBars( showErrorBarsInObservedData ); m_qwtPlotCurve->setPerPointLabels( perPointLabels ); - m_qwtPlotCurve->setSamplesFromXValuesAndYValues( this->curveData()->xPlotValues(), - this->curveData()->depthPlotValues( RiaDefines::MEASURED_DEPTH, - displayUnit ), - errors, - false, - RiuQwtPlotCurve::ERROR_ALONG_X_AXIS ); + + auto xValues = this->curveData()->xPlotValues(); + auto yValues = this->curveData()->depthPlotValues( RiaDefines::MEASURED_DEPTH, displayUnit ); + bool keepOnlyPositiveValues = false; + + if ( !errors.empty() ) + { + this->setSamplesFromXYErrorValues( xValues, + yValues, + errors, + keepOnlyPositiveValues, + RiaCurveDataTools::ERROR_ALONG_X_AXIS ); + } + else + { + m_qwtPlotCurve->setSamplesFromXValuesAndYValues( xValues, yValues, keepOnlyPositiveValues ); + } RimWellLogTrack* wellLogTrack; firstAncestorOrThisOfType( wellLogTrack ); @@ -483,14 +494,24 @@ void RimWellLogRftCurve::onLoadDataAndUpdate( bool updateParentPlot ) } else { - m_qwtPlotCurve->showErrorBars( showErrorBarsInObservedData ); m_qwtPlotCurve->setPerPointLabels( perPointLabels ); - m_qwtPlotCurve->setSamplesFromXValuesAndYValues( this->curveData()->xPlotValues(), - this->curveData()->depthPlotValues( RiaDefines::TRUE_VERTICAL_DEPTH, - displayUnit ), - errors, - false, - RiuQwtPlotCurve::ERROR_ALONG_X_AXIS ); + + auto xValues = this->curveData()->xPlotValues(); + auto yValues = this->curveData()->depthPlotValues( RiaDefines::TRUE_VERTICAL_DEPTH, displayUnit ); + bool isLogCurve = false; + + if ( !errors.empty() ) + { + this->setSamplesFromXYErrorValues( xValues, + yValues, + errors, + isLogCurve, + RiaCurveDataTools::ERROR_ALONG_X_AXIS ); + } + else + { + m_qwtPlotCurve->setSamplesFromXValuesAndYValues( xValues, yValues, isLogCurve ); + } } m_qwtPlotCurve->setLineSegmentStartStopIndices( this->curveData()->polylineStartStopIndices() ); diff --git a/ApplicationCode/ProjectDataModel/Summary/RimSummaryCurve.cpp b/ApplicationCode/ProjectDataModel/Summary/RimSummaryCurve.cpp index 84fa1f6727..1511229997 100644 --- a/ApplicationCode/ProjectDataModel/Summary/RimSummaryCurve.cpp +++ b/ApplicationCode/ProjectDataModel/Summary/RimSummaryCurve.cpp @@ -151,7 +151,7 @@ void RimSummaryCurve::setSummaryCaseY( RimSummaryCase* sumCase ) { if ( m_yValuesSummaryCase != sumCase ) { - m_qwtPlotCurve->clearErrorBars(); + m_qwtCurveErrorBars->setSamples( nullptr ); } m_yValuesSummaryCase = sumCase; @@ -208,7 +208,7 @@ void RimSummaryCurve::setSummaryAddressY( const RifEclipseSummaryAddress& addres { if ( m_yValuesSummaryAddress->address() != address ) { - m_qwtPlotCurve->clearErrorBars(); + m_qwtCurveErrorBars->setSamples( nullptr ); } m_yValuesSummaryAddress->setAddress( address ); @@ -520,10 +520,17 @@ void RimSummaryCurve::onLoadDataAndUpdate( bool updateParentPlot ) { std::vector errValues; reader->values( errAddress, &errValues ); - m_qwtPlotCurve->setSamplesFromTimeTAndYValues( curveTimeStepsY, - curveValuesY, - errValues, - isLogCurve ); + + auto timeSteps = RiuQwtPlotCurve::fromTime_t( curveTimeStepsY ); + + if ( !errValues.empty() ) + { + this->setSamplesFromXYErrorValues( timeSteps, curveValuesY, errValues, isLogCurve ); + } + else + { + m_qwtPlotCurve->setSamplesFromXValuesAndYValues( timeSteps, curveValuesY, isLogCurve ); + } } else { @@ -564,8 +571,6 @@ void RimSummaryCurve::onLoadDataAndUpdate( bool updateParentPlot ) updateZoomInParentPlot(); m_parentQwtPlot->replot(); } - - m_qwtPlotCurve->showErrorBars( m_showErrorBars ); } if ( updateParentPlot ) updateQwtPlotAxis(); diff --git a/ApplicationCode/UserInterface/RiuQwtPlotCurve.cpp b/ApplicationCode/UserInterface/RiuQwtPlotCurve.cpp index b53ca9d2db..6cb0a6d6bf 100644 --- a/ApplicationCode/UserInterface/RiuQwtPlotCurve.cpp +++ b/ApplicationCode/UserInterface/RiuQwtPlotCurve.cpp @@ -21,12 +21,12 @@ #include "RiaCurveDataTools.h" #include "RiaImageTools.h" + #include "RiuQwtSymbol.h" #include "qwt_date.h" #include "qwt_interval_symbol.h" #include "qwt_painter.h" -#include "qwt_plot_intervalcurve.h" #include "qwt_point_mapper.h" #include "qwt_scale_map.h" #include "qwt_symbol.h" @@ -52,14 +52,6 @@ RiuQwtPlotCurve::RiuQwtPlotCurve( const QString& title ) m_symbolSkipPixelDistance = 10.0f; - m_errorBars = new QwtPlotIntervalCurve(); - m_errorBars->setStyle( QwtPlotIntervalCurve::CurveStyle::NoCurve ); - m_errorBars->setSymbol( new QwtIntervalSymbol( QwtIntervalSymbol::Bar ) ); - m_errorBars->setItemAttribute( QwtPlotItem::Legend, false ); - m_errorBars->setZ( Z_ERROR_BARS ); - - m_showErrorBars = true; - m_attachedToPlot = nullptr; m_blackAndWhiteLegendIcon = false; } @@ -68,81 +60,6 @@ RiuQwtPlotCurve::RiuQwtPlotCurve( const QString& title ) //-------------------------------------------------------------------------------------------------- RiuQwtPlotCurve::~RiuQwtPlotCurve() {} -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -void RiuQwtPlotCurve::setSamplesFromXValuesAndYValues( const std::vector& xValues, - const std::vector& yValues, - const std::vector& errorValues, - bool keepOnlyPositiveValues, - ErrorAxis errorAxis ) -{ - CVF_ASSERT( xValues.size() == yValues.size() ); - CVF_ASSERT( errorValues.empty() || errorValues.size() == xValues.size() ); - - bool showErrorBars = m_showErrorBars && !errorValues.empty(); - QPolygonF points; - QVector errorIntervals; - std::vector> filteredIntervals; - { - std::vector filteredYValues; - std::vector filteredXValues; - std::vector filteredErrorValues; - - { - auto intervalsOfValidValues = RiaCurveDataTools::calculateIntervalsOfValidValues( yValues, - keepOnlyPositiveValues ); - - RiaCurveDataTools::getValuesByIntervals( yValues, intervalsOfValidValues, &filteredYValues ); - RiaCurveDataTools::getValuesByIntervals( xValues, intervalsOfValidValues, &filteredXValues ); - - if ( showErrorBars ) - RiaCurveDataTools::getValuesByIntervals( errorValues, intervalsOfValidValues, &filteredErrorValues ); - - filteredIntervals = RiaCurveDataTools::computePolyLineStartStopIndices( intervalsOfValidValues ); - } - - points.reserve( static_cast( filteredXValues.size() ) ); - errorIntervals.reserve( static_cast( filteredXValues.size() ) ); - for ( size_t i = 0; i < filteredXValues.size(); i++ ) - { - points << QPointF( filteredXValues[i], filteredYValues[i] ); - - if ( showErrorBars && filteredYValues[i] != DOUBLE_INF && filteredErrorValues[i] != DOUBLE_INF ) - { - if ( errorAxis == ERROR_ALONG_Y_AXIS ) - { - errorIntervals << QwtIntervalSample( filteredXValues[i], - filteredYValues[i] - filteredErrorValues[i], - filteredYValues[i] + filteredErrorValues[i] ); - } - else - { - errorIntervals << QwtIntervalSample( filteredYValues[i], - filteredXValues[i] - filteredErrorValues[i], - filteredXValues[i] + filteredErrorValues[i] ); - } - } - } - } - - this->setSamples( points ); - this->setLineSegmentStartStopIndices( filteredIntervals ); - - if ( showErrorBars ) - { - m_errorBars->setSamples( errorIntervals ); - if ( errorAxis == ERROR_ALONG_Y_AXIS ) - { - m_errorBars->setOrientation( Qt::Vertical ); - } - else - { - m_errorBars->setOrientation( Qt::Horizontal ); - } - } -} - //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -150,7 +67,7 @@ void RiuQwtPlotCurve::setSamplesFromXValuesAndYValues( const std::vector const std::vector& yValues, bool keepOnlyPositiveValues ) { - setSamplesFromXValuesAndYValues( xValues, yValues, std::vector(), keepOnlyPositiveValues ); + computeValidIntervalsAndSetCurveData( xValues, yValues, keepOnlyPositiveValues ); } //-------------------------------------------------------------------------------------------------- @@ -160,10 +77,9 @@ void RiuQwtPlotCurve::setSamplesFromDatesAndYValues( const std::vector& yValues, bool keepOnlyPositiveValues ) { - setSamplesFromXValuesAndYValues( RiuQwtPlotCurve::fromQDateTime( dateTimes ), - yValues, - std::vector(), - keepOnlyPositiveValues ); + auto xValues = RiuQwtPlotCurve::fromQDateTime( dateTimes ); + + computeValidIntervalsAndSetCurveData( xValues, yValues, keepOnlyPositiveValues ); } //-------------------------------------------------------------------------------------------------- @@ -173,24 +89,9 @@ void RiuQwtPlotCurve::setSamplesFromTimeTAndYValues( const std::vector& const std::vector& yValues, bool keepOnlyPositiveValues ) { - setSamplesFromXValuesAndYValues( RiuQwtPlotCurve::fromTime_t( dateTimes ), - yValues, - std::vector(), - keepOnlyPositiveValues ); -} + auto xValues = RiuQwtPlotCurve::fromTime_t( dateTimes ); -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -void RiuQwtPlotCurve::setSamplesFromTimeTAndYValues( const std::vector& dateTimes, - const std::vector& yValues, - const std::vector& yErrorValues, - bool keepOnlyPositiveValues ) -{ - setSamplesFromXValuesAndYValues( RiuQwtPlotCurve::fromTime_t( dateTimes ), - yValues, - yErrorValues, - keepOnlyPositiveValues ); + computeValidIntervalsAndSetCurveData( xValues, yValues, keepOnlyPositiveValues ); } //-------------------------------------------------------------------------------------------------- @@ -348,69 +249,6 @@ void RiuQwtPlotCurve::setSymbolSkipPixelDistance( float distance ) m_symbolSkipPixelDistance = distance >= 0.0f ? distance : 0.0f; } -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -void RiuQwtPlotCurve::attach( QwtPlot* plot ) -{ - QwtPlotItem::attach( plot ); - if ( m_showErrorBars ) - { - m_errorBars->attach( plot ); - } - m_attachedToPlot = plot; -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -void RiuQwtPlotCurve::detach() -{ - QwtPlotItem::detach(); - m_errorBars->detach(); - m_attachedToPlot = nullptr; -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -void RiuQwtPlotCurve::clearErrorBars() -{ - m_errorBars->setSamples( nullptr ); -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -void RiuQwtPlotCurve::showErrorBars( bool show ) -{ - m_showErrorBars = show; - if ( m_showErrorBars && m_attachedToPlot ) - m_errorBars->attach( m_attachedToPlot ); - else - m_errorBars->detach(); -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -void RiuQwtPlotCurve::setErrorBarsColor( QColor color ) -{ - QwtIntervalSymbol* newSymbol = new QwtIntervalSymbol( QwtIntervalSymbol::Bar ); - newSymbol->setPen( QPen( color ) ); - m_errorBars->setSymbol( newSymbol ); -} - -//-------------------------------------------------------------------------------------------------- -/// Set the Qwt X-Axis (QwtPlot::xBottom or QwtPlot::xTop). -/// This is important to make sure the x-axis interval is set correctly. -/// WellLogPlots use top-axis and Summary uses bottom axis. -//-------------------------------------------------------------------------------------------------- -void RiuQwtPlotCurve::setErrorBarsXAxis( int axis ) -{ - m_errorBars->setXAxis( axis ); -} - //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -499,6 +337,26 @@ QwtGraphic RiuQwtPlotCurve::legendIcon( int index, const QSizeF& size ) const return icon; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RiuQwtPlotCurve::computeValidIntervalsAndSetCurveData( const std::vector& xValues, + const std::vector& yValues, + bool keepOnlyPositiveValues ) +{ + auto intervalsOfValidValues = RiaCurveDataTools::calculateIntervalsOfValidValues( yValues, keepOnlyPositiveValues ); + + std::vector validYValues; + std::vector validXValues; + + RiaCurveDataTools::getValuesByIntervals( yValues, intervalsOfValidValues, &validYValues ); + RiaCurveDataTools::getValuesByIntervals( xValues, intervalsOfValidValues, &validXValues ); + + setSamples( validXValues.data(), validYValues.data(), static_cast( validXValues.size() ) ); + + setLineSegmentStartStopIndices( intervalsOfValidValues ); +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationCode/UserInterface/RiuQwtPlotCurve.h b/ApplicationCode/UserInterface/RiuQwtPlotCurve.h index 596e2d7160..1e68655e65 100644 --- a/ApplicationCode/UserInterface/RiuQwtPlotCurve.h +++ b/ApplicationCode/UserInterface/RiuQwtPlotCurve.h @@ -23,10 +23,6 @@ #include "qwt_plot_intervalcurve.h" #include "qwt_symbol.h" -#include - -class RiuErrorBarsQwtPlotCurve; - //================================================================================================== // // If infinite data is present in the curve data, Qwt is not able to draw a nice curve. @@ -50,12 +46,6 @@ class RiuErrorBarsQwtPlotCurve; class RiuQwtPlotCurve : public QwtPlotCurve { public: - enum ErrorAxis - { - ERROR_ALONG_X_AXIS, - ERROR_ALONG_Y_AXIS - }; - enum CurveInterpolationEnum { INTERPOLATION_POINT_TO_POINT, @@ -89,12 +79,6 @@ public: const std::vector& yValues, bool keepOnlyPositiveValues ); - void setSamplesFromXValuesAndYValues( const std::vector& xValues, - const std::vector& yValues, - const std::vector& errorValues, - bool keepOnlyPositiveValues, - ErrorAxis errorAxis = ERROR_ALONG_Y_AXIS ); - void setSamplesFromDatesAndYValues( const std::vector& dateTimes, const std::vector& yValues, bool keepOnlyPositiveValues ); @@ -103,30 +87,22 @@ public: const std::vector& yValues, bool keepOnlyPositiveValues ); - void setSamplesFromTimeTAndYValues( const std::vector& dateTimes, - const std::vector& yValues, - const std::vector& yErrorValues, - bool keepOnlyPositiveValues ); - void setLineSegmentStartStopIndices( const std::vector>& lineSegmentStartStopIndices ); void setSymbolSkipPixelDistance( float distance ); - - void attach( QwtPlot* plot ); - void detach(); - void clearErrorBars(); - void showErrorBars( bool show ); - void setErrorBarsColor( QColor color ); - void setErrorBarsXAxis( int axis ); void setPerPointLabels( const std::vector& labels ); - void setAppearance( LineStyleEnum lineStyle, - CurveInterpolationEnum interpolationType, - int curveThickness, - const QColor& curveColor ); + void setAppearance( LineStyleEnum lineStyle, + CurveInterpolationEnum interpolationType, + int curveThickness, + const QColor& curveColor ); + void setBlackAndWhiteLegendIcon( bool blackAndWhite ); QwtGraphic legendIcon( int index, const QSizeF& size ) const override; + static std::vector fromQDateTime( const std::vector& dateTimes ); + static std::vector fromTime_t( const std::vector& timeSteps ); + protected: void drawCurve( QPainter* p, int style, @@ -145,17 +121,15 @@ protected: int to ) const override; private: - static std::vector fromQDateTime( const std::vector& dateTimes ); - static std::vector fromTime_t( const std::vector& timeSteps ); + void computeValidIntervalsAndSetCurveData( const std::vector& xValues, + const std::vector& yValues, + bool keepOnlyPositiveValues ); private: - std::vector> m_polyLineStartStopIndices; - float m_symbolSkipPixelDistance; - - bool m_showErrorBars; - QwtPlotIntervalCurve* m_errorBars; - QwtPlot* m_attachedToPlot; - bool m_blackAndWhiteLegendIcon; + float m_symbolSkipPixelDistance; + bool m_blackAndWhiteLegendIcon; std::vector m_perPointLabels; + + std::vector> m_polyLineStartStopIndices; }; From d6ec710fd9ab84c857765e0dfb4486c86c62fc94 Mon Sep 17 00:00:00 2001 From: Gaute Lindkvist Date: Fri, 22 Nov 2019 15:42:40 +0100 Subject: [PATCH 12/50] Fix crash when closing and reopening plots --- .../GridCrossPlots/RimGridCrossPlot.cpp | 2 +- .../GridCrossPlots/RimGridCrossPlot.h | 12 +++++++----- .../GridCrossPlots/RimGridCrossPlotCurve.cpp | 2 +- .../GridCrossPlots/RimGridCrossPlotDataSet.cpp | 2 +- .../ProjectDataModel/RimPlotInterface.h | 5 +++-- .../ProjectDataModel/RimWellLogTrack.h | 2 +- .../ProjectDataModel/Summary/RimSummaryPlot.h | 2 +- .../UserInterface/RiuQwtPlotWidget.cpp | 16 ++++++---------- ApplicationCode/UserInterface/RiuQwtPlotWidget.h | 1 - 9 files changed, 21 insertions(+), 23 deletions(-) diff --git a/ApplicationCode/ProjectDataModel/GridCrossPlots/RimGridCrossPlot.cpp b/ApplicationCode/ProjectDataModel/GridCrossPlots/RimGridCrossPlot.cpp index c3ed8f08a3..25a1fc3cbc 100644 --- a/ApplicationCode/ProjectDataModel/GridCrossPlots/RimGridCrossPlot.cpp +++ b/ApplicationCode/ProjectDataModel/GridCrossPlots/RimGridCrossPlot.cpp @@ -217,7 +217,7 @@ void RimGridCrossPlot::calculateZoomRangeAndUpdateQwt() //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void RimGridCrossPlot::reattachCurvesToQwtAndReplot() +void RimGridCrossPlot::reattachAllCurves() { if ( m_plotWidget ) { diff --git a/ApplicationCode/ProjectDataModel/GridCrossPlots/RimGridCrossPlot.h b/ApplicationCode/ProjectDataModel/GridCrossPlots/RimGridCrossPlot.h index bd403aad96..f188c6ade2 100644 --- a/ApplicationCode/ProjectDataModel/GridCrossPlots/RimGridCrossPlot.h +++ b/ApplicationCode/ProjectDataModel/GridCrossPlots/RimGridCrossPlot.h @@ -74,15 +74,17 @@ public: QImage snapshotWindowContent() override; void zoomAll() override; void calculateZoomRangeAndUpdateQwt(); - void reattachCurvesToQwtAndReplot(); QString createAutoName() const override; bool showInfoBox() const; caf::PdmFieldHandle* userDescriptionField() override; - void detachAllCurves() override; - void performAutoNameUpdate() override; - void updateCurveNamesAndPlotTitle(); - void swapAxes(); + + void detachAllCurves() override; + void reattachAllCurves() override; + + void performAutoNameUpdate() override; + void updateCurveNamesAndPlotTitle(); + void swapAxes(); QString asciiTitleForPlotExport( int dataSetIndex ) const; QString asciiDataForGridCrossPlotExport( int dataSetIndex ) const; diff --git a/ApplicationCode/ProjectDataModel/GridCrossPlots/RimGridCrossPlotCurve.cpp b/ApplicationCode/ProjectDataModel/GridCrossPlots/RimGridCrossPlotCurve.cpp index 578d2f6f68..9a83895aaa 100644 --- a/ApplicationCode/ProjectDataModel/GridCrossPlots/RimGridCrossPlotCurve.cpp +++ b/ApplicationCode/ProjectDataModel/GridCrossPlots/RimGridCrossPlotCurve.cpp @@ -147,7 +147,7 @@ void RimGridCrossPlotCurve::updateLegendsInPlot() this->firstAncestorOrThisOfType( plot ); if ( plot ) { - plot->reattachCurvesToQwtAndReplot(); + plot->reattachAllCurves(); } RimPlotCurve::updateLegendsInPlot(); } diff --git a/ApplicationCode/ProjectDataModel/GridCrossPlots/RimGridCrossPlotDataSet.cpp b/ApplicationCode/ProjectDataModel/GridCrossPlots/RimGridCrossPlotDataSet.cpp index d5d7f52c8f..5acfaf89a1 100644 --- a/ApplicationCode/ProjectDataModel/GridCrossPlots/RimGridCrossPlotDataSet.cpp +++ b/ApplicationCode/ProjectDataModel/GridCrossPlots/RimGridCrossPlotDataSet.cpp @@ -1216,7 +1216,7 @@ void RimGridCrossPlotDataSet::triggerPlotNameUpdateAndReplot() if ( parent ) { parent->updateCurveNamesAndPlotTitle(); - parent->reattachCurvesToQwtAndReplot(); + parent->reattachAllCurves(); parent->updateConnectedEditors(); } } diff --git a/ApplicationCode/ProjectDataModel/RimPlotInterface.h b/ApplicationCode/ProjectDataModel/RimPlotInterface.h index 8538fcb6ab..af3e554ec8 100644 --- a/ApplicationCode/ProjectDataModel/RimPlotInterface.h +++ b/ApplicationCode/ProjectDataModel/RimPlotInterface.h @@ -94,8 +94,9 @@ public: virtual QString asciiDataForPlotExport() const; - virtual void createPlotWidget() = 0; - virtual void detachAllCurves() = 0; + virtual void createPlotWidget() = 0; + virtual void detachAllCurves() = 0; + virtual void reattachAllCurves() = 0; virtual caf::PdmObject* findPdmObjectFromQwtCurve( const QwtPlotCurve* curve ) const = 0; diff --git a/ApplicationCode/ProjectDataModel/RimWellLogTrack.h b/ApplicationCode/ProjectDataModel/RimWellLogTrack.h index 0c13a4bb62..3cc57aee2a 100644 --- a/ApplicationCode/ProjectDataModel/RimWellLogTrack.h +++ b/ApplicationCode/ProjectDataModel/RimWellLogTrack.h @@ -125,7 +125,7 @@ public: void createPlotWidget(); void detachAllCurves(); - void reattachAllCurves(); + void reattachAllCurves() override; void loadDataAndUpdate() override; diff --git a/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlot.h b/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlot.h index ce97bd4809..95dc39d346 100644 --- a/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlot.h +++ b/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlot.h @@ -102,7 +102,7 @@ public: size_t curveCount() const; void detachAllCurves() override; - void reattachAllCurves(); + void reattachAllCurves() override; void updateCaseNameHasChanged(); void updateAxes() override; diff --git a/ApplicationCode/UserInterface/RiuQwtPlotWidget.cpp b/ApplicationCode/UserInterface/RiuQwtPlotWidget.cpp index 977e38c0fc..79a618305b 100644 --- a/ApplicationCode/UserInterface/RiuQwtPlotWidget.cpp +++ b/ApplicationCode/UserInterface/RiuQwtPlotWidget.cpp @@ -549,6 +549,10 @@ bool RiuQwtPlotWidget::eventFilter( QObject* watched, QEvent* event ) void RiuQwtPlotWidget::hideEvent( QHideEvent* event ) { resetCurveHighlighting(); + if ( plotDefinition() ) + { + plotDefinition()->detachAllCurves(); + } QwtPlot::hideEvent( event ); } @@ -563,19 +567,11 @@ void RiuQwtPlotWidget::showEvent( QShowEvent* event ) m_canvasStyleSheet = createCanvasStyleSheet(); m_canvasStyleSheet.applyToWidget( canvas() ); - QwtPlot::showEvent( event ); -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -void RiuQwtPlotWidget::closeEvent( QCloseEvent* event ) -{ if ( plotDefinition() ) { - plotDefinition()->detachAllCurves(); + plotDefinition()->reattachAllCurves(); } - QwtPlot::closeEvent( event ); + QwtPlot::showEvent( event ); } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationCode/UserInterface/RiuQwtPlotWidget.h b/ApplicationCode/UserInterface/RiuQwtPlotWidget.h index 5db20b8afa..05e5c0da8a 100644 --- a/ApplicationCode/UserInterface/RiuQwtPlotWidget.h +++ b/ApplicationCode/UserInterface/RiuQwtPlotWidget.h @@ -109,7 +109,6 @@ protected: bool eventFilter( QObject* watched, QEvent* event ) override; void hideEvent( QHideEvent* event ) override; void showEvent( QShowEvent* event ) override; - void closeEvent( QCloseEvent* event ) override; void applyAxisTitleToQwt( QwtPlot::Axis axis ); From 1d4d2611299ab6225080a064cdd1dbccd9b555ea Mon Sep 17 00:00:00 2001 From: Gaute Lindkvist Date: Wed, 20 Nov 2019 15:00:25 +0100 Subject: [PATCH 13/50] Disable multiplot functionality --- .../Application/RiaGuiApplication.cpp | 15 -------- .../Commands/RicNewGridPlotWindowFeature.cpp | 38 +------------------ .../RimMainPlotCollection.cpp | 30 --------------- .../ProjectDataModel/RimMainPlotCollection.h | 2 - .../ProjectDataModel/RimProject.cpp | 5 --- .../ProjectDataModel/RimReloadCaseTools.cpp | 9 ----- .../Summary/RimSummaryPlot.cpp | 2 +- .../UserInterface/RiuPlotMainWindow.cpp | 1 - .../UserInterface/RiuQwtPlotWidget.cpp | 2 +- 9 files changed, 3 insertions(+), 101 deletions(-) diff --git a/ApplicationCode/Application/RiaGuiApplication.cpp b/ApplicationCode/Application/RiaGuiApplication.cpp index 9a1b6f1bed..ed78bc93ee 100644 --- a/ApplicationCode/Application/RiaGuiApplication.cpp +++ b/ApplicationCode/Application/RiaGuiApplication.cpp @@ -311,7 +311,6 @@ void RiaGuiApplication::loadAndUpdatePlotData() RimPltPlotCollection* pltColl = nullptr; RimGridCrossPlotCollection* gcpColl = nullptr; RimSaturationPressurePlotCollection* sppColl = nullptr; - RimGridPlotWindowCollection* gpwColl = nullptr; if ( m_project->mainPlotCollection() ) { @@ -347,10 +346,6 @@ void RiaGuiApplication::loadAndUpdatePlotData() { sppColl = m_project->mainPlotCollection()->saturationPressurePlotCollection(); } - if ( m_project->mainPlotCollection()->combinationPlotCollection() ) - { - gpwColl = m_project->mainPlotCollection()->combinationPlotCollection(); - } } size_t plotCount = 0; @@ -362,7 +357,6 @@ void RiaGuiApplication::loadAndUpdatePlotData() plotCount += pltColl ? pltColl->pltPlots().size() : 0; plotCount += gcpColl ? gcpColl->gridCrossPlots().size() : 0; plotCount += sppColl ? sppColl->plots().size() : 0; - plotCount += gpwColl ? gpwColl->gridPlotWindows().size() : 0; if ( plotCount > 0 ) { @@ -436,15 +430,6 @@ void RiaGuiApplication::loadAndUpdatePlotData() plotProgress.incrementProgress(); } } - - if ( gpwColl ) - { - for ( const auto& gridPlotWindow : gpwColl->gridPlotWindows() ) - { - gridPlotWindow->loadDataAndUpdate(); - plotProgress.incrementProgress(); - } - } } } diff --git a/ApplicationCode/Commands/RicNewGridPlotWindowFeature.cpp b/ApplicationCode/Commands/RicNewGridPlotWindowFeature.cpp index b8122362bf..69bc7229e2 100644 --- a/ApplicationCode/Commands/RicNewGridPlotWindowFeature.cpp +++ b/ApplicationCode/Commands/RicNewGridPlotWindowFeature.cpp @@ -50,30 +50,6 @@ RicNewGridPlotWindowFeature::RicNewGridPlotWindowFeature() //-------------------------------------------------------------------------------------------------- RicfCommandResponse RicNewGridPlotWindowFeature::execute() { - RimProject* project = RiaApplication::instance()->project(); - RimGridPlotWindowCollection* plotCollection = project->mainPlotCollection()->combinationPlotCollection(); - - RimGridPlotWindow* plotWindow = new RimGridPlotWindow; - plotWindow->setDescription( QString( "Combination Plot %1" ).arg( plotCollection->gridPlotWindows().size() + 1 ) ); - plotWindow->setAsPlotMdiWindow(); - plotCollection->addGridPlotWindow( plotWindow ); - - if ( !m_plots().empty() ) - { - std::vector plotInterfaces; - for ( auto ptr : m_plots() ) - { - plotInterfaces.push_back( reinterpret_cast( ptr ) ); - } - plotWindow->movePlotsToThis( plotInterfaces, nullptr ); - } - - plotCollection->updateAllRequiredEditors(); - plotWindow->loadDataAndUpdate(); - - RiuPlotMainWindowTools::setExpanded( plotCollection, true ); - RiuPlotMainWindowTools::selectAsCurrentItem( plotWindow, true ); - return RicfCommandResponse(); } @@ -82,19 +58,7 @@ RicfCommandResponse RicNewGridPlotWindowFeature::execute() //-------------------------------------------------------------------------------------------------- bool RicNewGridPlotWindowFeature::isCommandEnabled() { - RimGridPlotWindowCollection* gridPlotCollection = - caf::SelectionManager::instance()->selectedItemOfType(); - if ( gridPlotCollection ) - { - return true; - } - - auto selectedPlots = selectedPlotInterfaces(); - - std::vector selectedUiItems; - caf::SelectionManager::instance()->selectedItems( selectedUiItems ); - - return !selectedPlots.empty() && selectedPlots.size() == selectedUiItems.size(); + return false; } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationCode/ProjectDataModel/RimMainPlotCollection.cpp b/ApplicationCode/ProjectDataModel/RimMainPlotCollection.cpp index 1aad146b0a..dbf8ff3332 100644 --- a/ApplicationCode/ProjectDataModel/RimMainPlotCollection.cpp +++ b/ApplicationCode/ProjectDataModel/RimMainPlotCollection.cpp @@ -85,9 +85,6 @@ RimMainPlotCollection::RimMainPlotCollection() "" ); m_saturationPressurePlotCollection.uiCapability()->setUiHidden( true ); - CAF_PDM_InitFieldNoDefault( &m_combinationPlotCollection, "RimGridPlotWindowCollection", "Combination Plots", "", "", "" ); - m_combinationPlotCollection.uiCapability()->setUiHidden( true ); - m_wellLogPlotCollection = new RimWellLogPlotCollection(); m_rftPlotCollection = new RimRftPlotCollection(); m_pltPlotCollection = new RimPltPlotCollection(); @@ -96,7 +93,6 @@ RimMainPlotCollection::RimMainPlotCollection() m_flowPlotCollection = new RimFlowPlotCollection(); m_gridCrossPlotCollection = new RimGridCrossPlotCollection; m_saturationPressurePlotCollection = new RimSaturationPressurePlotCollection; - m_combinationPlotCollection = new RimGridPlotWindowCollection; } //-------------------------------------------------------------------------------------------------- @@ -185,14 +181,6 @@ RimSaturationPressurePlotCollection* RimMainPlotCollection::saturationPressurePl return m_saturationPressurePlotCollection(); } -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -RimGridPlotWindowCollection* RimMainPlotCollection::combinationPlotCollection() -{ - return m_combinationPlotCollection(); -} - //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -205,8 +193,6 @@ void RimMainPlotCollection::deleteAllContainedObjects() m_summaryCrossPlotCollection()->deleteAllChildObjects(); m_gridCrossPlotCollection->deleteAllChildObjects(); m_flowPlotCollection()->closeDefaultPlotWindowAndDeletePlots(); - m_saturationPressurePlotCollection()->deleteAllChildObjects(); - m_combinationPlotCollection()->deleteAllChildObjects(); } //-------------------------------------------------------------------------------------------------- @@ -258,14 +244,6 @@ void RimMainPlotCollection::updatePlotsWithFormations() crossPlot->loadDataAndUpdate(); } } - - if ( m_combinationPlotCollection ) - { - for ( RimGridPlotWindow* plotWindow : m_combinationPlotCollection->gridPlotWindows() ) - { - plotWindow->loadDataAndUpdate(); - } - } } //-------------------------------------------------------------------------------------------------- @@ -280,14 +258,6 @@ void RimMainPlotCollection::updatePlotsWithCompletions() wellLogPlot->loadDataAndUpdate(); } } - - if ( m_combinationPlotCollection ) - { - for ( RimGridPlotWindow* plotWindow : m_combinationPlotCollection->gridPlotWindows() ) - { - plotWindow->loadDataAndUpdate(); - } - } } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationCode/ProjectDataModel/RimMainPlotCollection.h b/ApplicationCode/ProjectDataModel/RimMainPlotCollection.h index d98a25b872..e92a053ace 100644 --- a/ApplicationCode/ProjectDataModel/RimMainPlotCollection.h +++ b/ApplicationCode/ProjectDataModel/RimMainPlotCollection.h @@ -59,7 +59,6 @@ public: RimFlowPlotCollection* flowPlotCollection(); RimGridCrossPlotCollection* gridCrossPlotCollection(); RimSaturationPressurePlotCollection* saturationPressurePlotCollection(); - RimGridPlotWindowCollection* combinationPlotCollection(); void deleteAllContainedObjects(); void updateCurrentTimeStepInPlots(); @@ -84,7 +83,6 @@ private: caf::PdmChildField m_flowPlotCollection; caf::PdmChildField m_gridCrossPlotCollection; caf::PdmChildField m_saturationPressurePlotCollection; - caf::PdmChildField m_combinationPlotCollection; caf::PdmField m_show; }; diff --git a/ApplicationCode/ProjectDataModel/RimProject.cpp b/ApplicationCode/ProjectDataModel/RimProject.cpp index b4cd5786d0..b8ae0f155e 100644 --- a/ApplicationCode/ProjectDataModel/RimProject.cpp +++ b/ApplicationCode/ProjectDataModel/RimProject.cpp @@ -1295,11 +1295,6 @@ void RimProject::defineUiTreeOrdering( caf::PdmUiTreeOrdering& uiTreeOrdering, Q { itemCollection->add( mainPlotCollection->saturationPressurePlotCollection() ); } - - if ( mainPlotCollection->combinationPlotCollection() ) - { - itemCollection->add( mainPlotCollection->combinationPlotCollection() ); - } } } else diff --git a/ApplicationCode/ProjectDataModel/RimReloadCaseTools.cpp b/ApplicationCode/ProjectDataModel/RimReloadCaseTools.cpp index 7330475a51..3bc42d05eb 100644 --- a/ApplicationCode/ProjectDataModel/RimReloadCaseTools.cpp +++ b/ApplicationCode/ProjectDataModel/RimReloadCaseTools.cpp @@ -178,14 +178,5 @@ void RimReloadCaseTools::updateAllPlots() { flowPlotCollection->loadDataAndUpdate(); } - - RimGridPlotWindowCollection* gridPlotWindowCollection = project->mainPlotCollection()->combinationPlotCollection(); - if ( gridPlotWindowCollection ) - { - for ( RimGridPlotWindow* plotWindow : gridPlotWindowCollection->gridPlotWindows() ) - { - plotWindow->loadDataAndUpdate(); - } - } } } diff --git a/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlot.cpp b/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlot.cpp index 568f90892f..865d8edf5b 100644 --- a/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlot.cpp +++ b/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlot.cpp @@ -212,7 +212,7 @@ RimSummaryPlot::RimSummaryPlot() m_textCurveSetEditor = new RimSummaryPlotFilterTextCurveSetEditor; m_isCrossPlot = false; - m_isDraggable = true; + m_isDraggable = false; m_nameHelperAllCurves.reset( new RimSummaryPlotNameHelper ); diff --git a/ApplicationCode/UserInterface/RiuPlotMainWindow.cpp b/ApplicationCode/UserInterface/RiuPlotMainWindow.cpp index b13df48c45..e197164ae0 100644 --- a/ApplicationCode/UserInterface/RiuPlotMainWindow.cpp +++ b/ApplicationCode/UserInterface/RiuPlotMainWindow.cpp @@ -717,7 +717,6 @@ void RiuPlotMainWindow::slotSubWindowActivated( QMdiSubWindow* subWindow ) updateWellLogPlotToolBar(); updateSummaryPlotToolBar(); - updateGridPlotWindowToolBar(); } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationCode/UserInterface/RiuQwtPlotWidget.cpp b/ApplicationCode/UserInterface/RiuQwtPlotWidget.cpp index 977e38c0fc..42736be11e 100644 --- a/ApplicationCode/UserInterface/RiuQwtPlotWidget.cpp +++ b/ApplicationCode/UserInterface/RiuQwtPlotWidget.cpp @@ -62,7 +62,7 @@ //-------------------------------------------------------------------------------------------------- RiuQwtPlotWidget::RiuQwtPlotWidget( RimPlotInterface* plotTrackDefinition, QWidget* parent ) : QwtPlot( parent ) - , m_draggable( true ) + , m_draggable( false ) { m_plotOwner = dynamic_cast( plotTrackDefinition ); CAF_ASSERT( m_plotOwner ); From dc3c92ab261c94c94bca46a85f6643187fdbdf7e Mon Sep 17 00:00:00 2001 From: Gaute Lindkvist Date: Mon, 25 Nov 2019 10:46:17 +0100 Subject: [PATCH 14/50] Improve plot redraw scheduler --- ApplicationCode/Application/RiaGuiApplication.cpp | 2 ++ ApplicationCode/Application/RiaPlotWindowRedrawScheduler.cpp | 2 +- ApplicationCode/Application/RiaPlotWindowRedrawScheduler.h | 3 +++ .../ExportCommands/RicSnapshotAllViewsToFileFeature.cpp | 2 ++ 4 files changed, 8 insertions(+), 1 deletion(-) diff --git a/ApplicationCode/Application/RiaGuiApplication.cpp b/ApplicationCode/Application/RiaGuiApplication.cpp index ed78bc93ee..09f9b9bc6f 100644 --- a/ApplicationCode/Application/RiaGuiApplication.cpp +++ b/ApplicationCode/Application/RiaGuiApplication.cpp @@ -27,6 +27,7 @@ #include "RiaFontCache.h" #include "RiaImportEclipseCaseTools.h" #include "RiaLogging.h" +#include "RiaPlotWindowRedrawScheduler.h" #include "RiaPreferences.h" #include "RiaProjectModifier.h" #include "RiaRegressionTestRunner.h" @@ -1434,6 +1435,7 @@ void RiaGuiApplication::onProjectBeingClosed() RicHoloLensSessionManager::refreshToolbarState(); RiaViewRedrawScheduler::instance()->clearViewsScheduledForUpdate(); + RiaPlotWindowRedrawScheduler::instance()->clearAllScheduledUpdates(); RiaGuiApplication::clearAllSelections(); diff --git a/ApplicationCode/Application/RiaPlotWindowRedrawScheduler.cpp b/ApplicationCode/Application/RiaPlotWindowRedrawScheduler.cpp index 6c74ce30ee..7cbcc2f1ec 100644 --- a/ApplicationCode/Application/RiaPlotWindowRedrawScheduler.cpp +++ b/ApplicationCode/Application/RiaPlotWindowRedrawScheduler.cpp @@ -111,7 +111,7 @@ void RiaPlotWindowRedrawScheduler::slotUpdateAndReplotScheduledItemsWhenReady() { if ( caf::ProgressState::isActive() ) { - startTimer( 10 ); + startTimer( 100 ); return; } diff --git a/ApplicationCode/Application/RiaPlotWindowRedrawScheduler.h b/ApplicationCode/Application/RiaPlotWindowRedrawScheduler.h index 170c52f72b..db08474175 100644 --- a/ApplicationCode/Application/RiaPlotWindowRedrawScheduler.h +++ b/ApplicationCode/Application/RiaPlotWindowRedrawScheduler.h @@ -44,6 +44,9 @@ private slots: void slotUpdateAndReplotScheduledItemsWhenReady(); private: + RiaPlotWindowRedrawScheduler() = default; + ~RiaPlotWindowRedrawScheduler() = default; + void startTimer( int msecs ); private: diff --git a/ApplicationCode/Commands/ExportCommands/RicSnapshotAllViewsToFileFeature.cpp b/ApplicationCode/Commands/ExportCommands/RicSnapshotAllViewsToFileFeature.cpp index 84b39f65cf..103e2b08e8 100644 --- a/ApplicationCode/Commands/ExportCommands/RicSnapshotAllViewsToFileFeature.cpp +++ b/ApplicationCode/Commands/ExportCommands/RicSnapshotAllViewsToFileFeature.cpp @@ -20,6 +20,7 @@ #include "RiaGuiApplication.h" #include "RiaLogging.h" +#include "RiaPlotWindowRedrawScheduler.h" #include "RiaViewRedrawScheduler.h" #include "Rim3dOverlayInfoConfig.h" @@ -113,6 +114,7 @@ void RicSnapshotAllViewsToFileFeature::exportSnapshotOfViewsIntoFolder( const QS Riu3DMainWindowTools::setActiveViewer( viewer->layoutWidget() ); RiaViewRedrawScheduler::instance()->clearViewsScheduledForUpdate(); + RiaPlotWindowRedrawScheduler::instance()->clearAllScheduledUpdates(); // riv->updateCurrentTimeStepAndRedraw(); riv->createDisplayModelAndRedraw(); From 95f8c44f0f12b065c4619eb87fc3521cc20d2e10 Mon Sep 17 00:00:00 2001 From: Gaute Lindkvist Date: Mon, 25 Nov 2019 12:38:00 +0100 Subject: [PATCH 15/50] Improve RimNameConfig API --- .../ViewLink/RicUnLinkViewFeature.cpp | 2 +- .../GridCrossPlots/RimGridCrossPlot.cpp | 12 ++++++-- .../GridCrossPlots/RimGridCrossPlot.h | 5 +++- .../RimGridCrossPlotDataSet.cpp | 15 ++++++++-- .../GridCrossPlots/RimGridCrossPlotDataSet.h | 3 ++ .../ProjectDataModel/RimNameConfig.cpp | 18 +++++++++--- .../ProjectDataModel/RimNameConfig.h | 15 ++++++---- .../ProjectDataModel/RimPlotCurve.cpp | 2 +- .../ProjectDataModel/RimViewController.cpp | 4 +-- .../ProjectDataModel/RimViewLinker.cpp | 4 +-- .../ProjectDataModel/RimViewNameConfig.cpp | 6 ++-- .../ProjectDataModel/RimViewNameConfig.h | 5 ++-- .../RimWellLogExtractionCurveNameConfig.cpp | 6 ++-- .../RimWellLogExtractionCurveNameConfig.h | 5 ++-- .../RimWellLogFileCurveNameConfig.cpp | 8 +++-- .../RimWellLogFileCurveNameConfig.h | 3 ++ .../RimWellLogPlotNameConfig.cpp | 29 +++++++++++++------ .../RimWellLogPlotNameConfig.h | 6 +++- .../RimWellLogRftCurveNameConfig.cpp | 8 +++-- .../RimWellLogRftCurveNameConfig.h | 3 ++ 20 files changed, 110 insertions(+), 49 deletions(-) diff --git a/ApplicationCode/Commands/ViewLink/RicUnLinkViewFeature.cpp b/ApplicationCode/Commands/ViewLink/RicUnLinkViewFeature.cpp index 9415c436ce..5f952cf1ca 100644 --- a/ApplicationCode/Commands/ViewLink/RicUnLinkViewFeature.cpp +++ b/ApplicationCode/Commands/ViewLink/RicUnLinkViewFeature.cpp @@ -91,7 +91,7 @@ void RicUnLinkViewFeature::onActionTriggered( bool isChecked ) delete viewLinker; } - activeView->updateHolder(); + activeView->updateAutoName(); } RiaApplication::instance()->project()->viewLinkerCollection.uiCapability()->updateConnectedEditors(); diff --git a/ApplicationCode/ProjectDataModel/GridCrossPlots/RimGridCrossPlot.cpp b/ApplicationCode/ProjectDataModel/GridCrossPlots/RimGridCrossPlot.cpp index 25a1fc3cbc..c4ff5bc8c3 100644 --- a/ApplicationCode/ProjectDataModel/GridCrossPlots/RimGridCrossPlot.cpp +++ b/ApplicationCode/ProjectDataModel/GridCrossPlots/RimGridCrossPlot.cpp @@ -1138,13 +1138,11 @@ CAF_PDM_SOURCE_INIT( RimGridCrossPlotNameConfig, "RimGridCrossPlotNameConfig" ); /// //-------------------------------------------------------------------------------------------------- RimGridCrossPlotNameConfig::RimGridCrossPlotNameConfig() - : RimNameConfig() + : RimNameConfig( "Cross Plot" ) { CAF_PDM_InitObject( "Cross Plot Name Generator", "", "", "" ); CAF_PDM_InitField( &addDataSetNames, "AddDataSetNames", true, "Add Data Set Names", "", "", "" ); - - setCustomName( "Cross Plot" ); } //-------------------------------------------------------------------------------------------------- @@ -1155,3 +1153,11 @@ void RimGridCrossPlotNameConfig::defineUiOrdering( QString uiConfigName, caf::Pd RimNameConfig::defineUiOrdering( uiConfigName, uiOrdering ); uiOrdering.add( &addDataSetNames ); } + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimGridCrossPlotNameConfig::doEnableAllAutoNameTags( bool enable ) +{ + addDataSetNames = enable; +} diff --git a/ApplicationCode/ProjectDataModel/GridCrossPlots/RimGridCrossPlot.h b/ApplicationCode/ProjectDataModel/GridCrossPlots/RimGridCrossPlot.h index f188c6ade2..a44e790fc1 100644 --- a/ApplicationCode/ProjectDataModel/GridCrossPlots/RimGridCrossPlot.h +++ b/ApplicationCode/ProjectDataModel/GridCrossPlots/RimGridCrossPlot.h @@ -46,7 +46,10 @@ public: caf::PdmField addDataSetNames; protected: - virtual void defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) override; + void defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) override; + +private: + void doEnableAllAutoNameTags( bool enable ) override; }; class RimGridCrossPlot : public RimPlotWindow, public RimPlotInterface, public RimNameConfigHolderInterface diff --git a/ApplicationCode/ProjectDataModel/GridCrossPlots/RimGridCrossPlotDataSet.cpp b/ApplicationCode/ProjectDataModel/GridCrossPlots/RimGridCrossPlotDataSet.cpp index 5acfaf89a1..5e8ee9e577 100644 --- a/ApplicationCode/ProjectDataModel/GridCrossPlots/RimGridCrossPlotDataSet.cpp +++ b/ApplicationCode/ProjectDataModel/GridCrossPlots/RimGridCrossPlotDataSet.cpp @@ -1380,7 +1380,7 @@ CAF_PDM_SOURCE_INIT( RimGridCrossPlotDataSetNameConfig, "RimGridCrossPlotCurveSe /// //-------------------------------------------------------------------------------------------------- RimGridCrossPlotDataSetNameConfig::RimGridCrossPlotDataSetNameConfig() - : RimNameConfig() + : RimNameConfig( "" ) { CAF_PDM_InitObject( "Cross Plot Data Set NameGenerator", "", "", "" ); @@ -1388,8 +1388,6 @@ RimGridCrossPlotDataSetNameConfig::RimGridCrossPlotDataSetNameConfig() CAF_PDM_InitField( &addAxisVariables, "AddAxisVariables", true, "Add Axis Variables", "", "", "" ); CAF_PDM_InitField( &addTimestep, "AddTimeStep", true, "Add Time Step", "", "", "" ); CAF_PDM_InitField( &addGrouping, "AddGrouping", true, "Add Data Group", "", "", "" ); - - setCustomName( "" ); } //-------------------------------------------------------------------------------------------------- @@ -1402,3 +1400,14 @@ void RimGridCrossPlotDataSetNameConfig::defineUiOrdering( QString uiConfigName, uiOrdering.add( &addTimestep ); uiOrdering.add( &addGrouping ); } + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimGridCrossPlotDataSetNameConfig::doEnableAllAutoNameTags( bool enable ) +{ + addCaseName = enable; + addAxisVariables = enable; + addTimestep = enable; + addGrouping = enable; +} diff --git a/ApplicationCode/ProjectDataModel/GridCrossPlots/RimGridCrossPlotDataSet.h b/ApplicationCode/ProjectDataModel/GridCrossPlots/RimGridCrossPlotDataSet.h index ebeb26270f..4a4e4482ad 100644 --- a/ApplicationCode/ProjectDataModel/GridCrossPlots/RimGridCrossPlotDataSet.h +++ b/ApplicationCode/ProjectDataModel/GridCrossPlots/RimGridCrossPlotDataSet.h @@ -67,6 +67,9 @@ public: protected: void defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) override; + +private: + void doEnableAllAutoNameTags( bool enable ) override; }; //================================================================================================== diff --git a/ApplicationCode/ProjectDataModel/RimNameConfig.cpp b/ApplicationCode/ProjectDataModel/RimNameConfig.cpp index f4d6217a49..15086da532 100644 --- a/ApplicationCode/ProjectDataModel/RimNameConfig.cpp +++ b/ApplicationCode/ProjectDataModel/RimNameConfig.cpp @@ -26,12 +26,12 @@ /// //================================================================================================== -CAF_PDM_SOURCE_INIT( RimNameConfig, "RimCurveNameConfig" ); +CAF_PDM_ABSTRACT_SOURCE_INIT( RimNameConfig, "RimCurveNameConfig" ); //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -RimNameConfig::RimNameConfig() +RimNameConfig::RimNameConfig( const QString& customName ) { CAF_PDM_InitObject( "Curve Name Generator", "", "", "" ); @@ -42,6 +42,8 @@ RimNameConfig::RimNameConfig() m_autoName.registerGetMethod( this, &RimNameConfig::autoName ); m_autoName.xmlCapability()->disableIO(); m_autoName.uiCapability()->setUiReadOnly( true ); + + m_customName = customName; } //-------------------------------------------------------------------------------------------------- @@ -118,6 +120,14 @@ void RimNameConfig::setCustomName( const QString& name ) m_customName = name; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimNameConfig::enableAllAutoNameTags( bool enable ) +{ + doEnableAllAutoNameTags( enable ); +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -128,7 +138,7 @@ void RimNameConfig::updateAllSettings() RimNameConfigHolderInterface* holder; this->firstAncestorOrThisOfTypeAsserted( holder ); - holder->updateHolder(); + holder->updateAutoName(); caf::PdmObject* pdmObject = dynamic_cast( holder ); if ( pdmObject ) { @@ -144,6 +154,6 @@ void RimNameConfig::initAfterRead() // Now we just switch them all individually. if ( !m_isUsingAutoName_OBSOLETE() ) { - enableAllAutoNameTags( false ); + doEnableAllAutoNameTags( false ); } } diff --git a/ApplicationCode/ProjectDataModel/RimNameConfig.h b/ApplicationCode/ProjectDataModel/RimNameConfig.h index c413174427..b83cf50746 100644 --- a/ApplicationCode/ProjectDataModel/RimNameConfig.h +++ b/ApplicationCode/ProjectDataModel/RimNameConfig.h @@ -30,7 +30,7 @@ class RimNameConfigHolderInterface { public: virtual QString createAutoName() const = 0; - void updateHolder() + void updateAutoName() { performAutoNameUpdate(); } @@ -48,16 +48,16 @@ class RimNameConfig : public caf::PdmObject CAF_PDM_HEADER_INIT; public: - RimNameConfig(); + RimNameConfig( const QString& customName ); ~RimNameConfig() override; - QString customName() const; - void setCustomName( const QString& name ); - virtual void enableAllAutoNameTags( bool enable ) {} + QString customName() const; + void setCustomName( const QString& name ); caf::PdmFieldHandle* nameField(); QString name() const; void uiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ); + void enableAllAutoNameTags( bool enable ); protected: void defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) override; @@ -68,7 +68,10 @@ protected: virtual void updateAllSettings(); void initAfterRead() override; -protected: +private: + virtual void doEnableAllAutoNameTags( bool enable ) = 0; + +private: caf::PdmField m_isUsingAutoName_OBSOLETE; caf::PdmField m_customName; caf::PdmProxyValueField m_autoName; diff --git a/ApplicationCode/ProjectDataModel/RimPlotCurve.cpp b/ApplicationCode/ProjectDataModel/RimPlotCurve.cpp index 1c2c78264b..95ed87052f 100644 --- a/ApplicationCode/ProjectDataModel/RimPlotCurve.cpp +++ b/ApplicationCode/ProjectDataModel/RimPlotCurve.cpp @@ -484,7 +484,7 @@ void RimPlotCurve::updatePlotTitle() this->firstAncestorOrThisOfType( nameConfigHolder ); if ( nameConfigHolder ) { - nameConfigHolder->updateHolder(); + nameConfigHolder->updateAutoName(); } } diff --git a/ApplicationCode/ProjectDataModel/RimViewController.cpp b/ApplicationCode/ProjectDataModel/RimViewController.cpp index 6063e3e7a9..45f548fd4b 100644 --- a/ApplicationCode/ProjectDataModel/RimViewController.cpp +++ b/ApplicationCode/ProjectDataModel/RimViewController.cpp @@ -98,7 +98,7 @@ RimViewController::~RimViewController() RimGridView* managedView = m_managedView; m_managedView = nullptr; - if ( managedView ) managedView->updateHolder(); + if ( managedView ) managedView->updateAutoName(); } //-------------------------------------------------------------------------------------------------- @@ -482,7 +482,7 @@ void RimViewController::setManagedView( RimGridView* view ) if ( m_managedView ) { - m_managedView->updateHolder(); + m_managedView->updateAutoName(); } } diff --git a/ApplicationCode/ProjectDataModel/RimViewLinker.cpp b/ApplicationCode/ProjectDataModel/RimViewLinker.cpp index d8476eb153..0b1a7f8164 100644 --- a/ApplicationCode/ProjectDataModel/RimViewLinker.cpp +++ b/ApplicationCode/ProjectDataModel/RimViewLinker.cpp @@ -88,7 +88,7 @@ RimViewLinker::~RimViewLinker() m_viewControllers.deleteAllChildObjects(); RimGridView* masterView = m_masterView; m_masterView = nullptr; - if ( masterView ) masterView->updateHolder(); + if ( masterView ) masterView->updateAutoName(); } //-------------------------------------------------------------------------------------------------- @@ -415,7 +415,7 @@ void RimViewLinker::updateUiNameAndIcon() caf::QIconProvider iconProvider; RimViewLinker::findNameAndIconFromView( &m_name.v(), &iconProvider, m_masterView ); - if ( m_masterView ) m_masterView->updateHolder(); + if ( m_masterView ) m_masterView->updateAutoName(); setUiIcon( iconProvider ); } diff --git a/ApplicationCode/ProjectDataModel/RimViewNameConfig.cpp b/ApplicationCode/ProjectDataModel/RimViewNameConfig.cpp index 25df2185c6..b3f7378496 100644 --- a/ApplicationCode/ProjectDataModel/RimViewNameConfig.cpp +++ b/ApplicationCode/ProjectDataModel/RimViewNameConfig.cpp @@ -29,7 +29,7 @@ CAF_PDM_SOURCE_INIT( RimViewNameConfig, "RimViewNameConfig" ); /// //-------------------------------------------------------------------------------------------------- RimViewNameConfig::RimViewNameConfig() - : RimNameConfig() + : RimNameConfig( "" ) , m_hideCaseNameField( false ) , m_hideAggregationTypeField( false ) , m_hidePropertyField( false ) @@ -41,8 +41,6 @@ RimViewNameConfig::RimViewNameConfig() CAF_PDM_InitField( &m_addAggregationType, "AddAggregationType", true, "Add Aggregation Type", "", "", "" ); CAF_PDM_InitField( &m_addProperty, "AddProperty", true, "Add Property Type", "", "", "" ); CAF_PDM_InitField( &m_addSampleSpacing, "AddSampleSpacing", false, "Add Sample Spacing", "", "", "" ); - - m_customName = ""; } //-------------------------------------------------------------------------------------------------- @@ -112,7 +110,7 @@ bool RimViewNameConfig::addSampleSpacing() const //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void RimViewNameConfig::enableAllAutoNameTags( bool enable ) +void RimViewNameConfig::doEnableAllAutoNameTags( bool enable ) { m_addCaseName = enable; m_addAggregationType = enable; diff --git a/ApplicationCode/ProjectDataModel/RimViewNameConfig.h b/ApplicationCode/ProjectDataModel/RimViewNameConfig.h index 0e6ae66607..9ba2998c69 100644 --- a/ApplicationCode/ProjectDataModel/RimViewNameConfig.h +++ b/ApplicationCode/ProjectDataModel/RimViewNameConfig.h @@ -40,8 +40,6 @@ public: void setAddSampleSpacing( bool add ); bool addSampleSpacing() const; - void enableAllAutoNameTags( bool enable ) override; - void hideCaseNameField( bool hide ); void hideAggregationTypeField( bool hide ); void hidePropertyField( bool hide ); @@ -50,6 +48,9 @@ public: protected: void defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) override; +private: + void doEnableAllAutoNameTags( bool enable ) override; + private: caf::PdmField m_addCaseName; caf::PdmField m_addAggregationType; diff --git a/ApplicationCode/ProjectDataModel/RimWellLogExtractionCurveNameConfig.cpp b/ApplicationCode/ProjectDataModel/RimWellLogExtractionCurveNameConfig.cpp index d1737dedf6..903fbf0ff3 100644 --- a/ApplicationCode/ProjectDataModel/RimWellLogExtractionCurveNameConfig.cpp +++ b/ApplicationCode/ProjectDataModel/RimWellLogExtractionCurveNameConfig.cpp @@ -29,7 +29,7 @@ CAF_PDM_SOURCE_INIT( RimWellLogExtractionCurveNameConfig, "RimWellLogExtractionC /// //-------------------------------------------------------------------------------------------------- RimWellLogExtractionCurveNameConfig::RimWellLogExtractionCurveNameConfig() - : RimNameConfig() + : RimNameConfig( "Log Extraction" ) { CAF_PDM_InitObject( "Well Log Extraction Curve Name Generator", "", "", "" ); @@ -38,8 +38,6 @@ RimWellLogExtractionCurveNameConfig::RimWellLogExtractionCurveNameConfig() CAF_PDM_InitField( &m_addWellName, "AddWellName", true, "Add Well Name", "", "", "" ); CAF_PDM_InitField( &m_addTimestep, "AddTimeStep", true, "Add Time Step", "", "", "" ); CAF_PDM_InitField( &m_addDate, "AddDate", true, "Add Date", "", "", "" ); - - m_customName = "Log Extraction"; } //-------------------------------------------------------------------------------------------------- @@ -85,7 +83,7 @@ bool RimWellLogExtractionCurveNameConfig::addDate() const //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void RimWellLogExtractionCurveNameConfig::enableAllAutoNameTags( bool enable ) +void RimWellLogExtractionCurveNameConfig::doEnableAllAutoNameTags( bool enable ) { m_addCaseName = enable; m_addProperty = enable; diff --git a/ApplicationCode/ProjectDataModel/RimWellLogExtractionCurveNameConfig.h b/ApplicationCode/ProjectDataModel/RimWellLogExtractionCurveNameConfig.h index 16570b66d7..97dfd54327 100644 --- a/ApplicationCode/ProjectDataModel/RimWellLogExtractionCurveNameConfig.h +++ b/ApplicationCode/ProjectDataModel/RimWellLogExtractionCurveNameConfig.h @@ -37,11 +37,12 @@ public: bool addTimeStep() const; bool addDate() const; - void enableAllAutoNameTags( bool enable ) override; - protected: void defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) override; +private: + void doEnableAllAutoNameTags( bool enable ) override; + private: caf::PdmField m_addCaseName; caf::PdmField m_addProperty; diff --git a/ApplicationCode/ProjectDataModel/RimWellLogFileCurveNameConfig.cpp b/ApplicationCode/ProjectDataModel/RimWellLogFileCurveNameConfig.cpp index 3b3a6e2272..9e3cf2e739 100644 --- a/ApplicationCode/ProjectDataModel/RimWellLogFileCurveNameConfig.cpp +++ b/ApplicationCode/ProjectDataModel/RimWellLogFileCurveNameConfig.cpp @@ -29,8 +29,12 @@ CAF_PDM_SOURCE_INIT( RimWellLogFileCurveNameConfig, "RimWellLogFileCurveNameConf /// //-------------------------------------------------------------------------------------------------- RimWellLogFileCurveNameConfig::RimWellLogFileCurveNameConfig() - : RimNameConfig() + : RimNameConfig( "Las Curve" ) { CAF_PDM_InitObject( "Well Log File Curve Name Generator", "", "", "" ); - m_customName = "Las Curve"; } + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimWellLogFileCurveNameConfig::doEnableAllAutoNameTags( bool enable ) {} diff --git a/ApplicationCode/ProjectDataModel/RimWellLogFileCurveNameConfig.h b/ApplicationCode/ProjectDataModel/RimWellLogFileCurveNameConfig.h index e8e96e944c..75bd0a4700 100644 --- a/ApplicationCode/ProjectDataModel/RimWellLogFileCurveNameConfig.h +++ b/ApplicationCode/ProjectDataModel/RimWellLogFileCurveNameConfig.h @@ -30,4 +30,7 @@ class RimWellLogFileCurveNameConfig : public RimNameConfig public: RimWellLogFileCurveNameConfig(); + +private: + void doEnableAllAutoNameTags( bool enable ) override; }; diff --git a/ApplicationCode/ProjectDataModel/RimWellLogPlotNameConfig.cpp b/ApplicationCode/ProjectDataModel/RimWellLogPlotNameConfig.cpp index 269448f805..b58dfc395c 100644 --- a/ApplicationCode/ProjectDataModel/RimWellLogPlotNameConfig.cpp +++ b/ApplicationCode/ProjectDataModel/RimWellLogPlotNameConfig.cpp @@ -29,7 +29,7 @@ CAF_PDM_SOURCE_INIT( RimWellLogPlotNameConfig, "RimWellLogPlotNameConfig" ); /// //-------------------------------------------------------------------------------------------------- RimWellLogPlotNameConfig::RimWellLogPlotNameConfig() - : RimNameConfig() + : RimNameConfig( "Well Log Plot" ) { CAF_PDM_InitObject( "Well Log Plot Name Generator", "", "", "" ); @@ -38,8 +38,6 @@ RimWellLogPlotNameConfig::RimWellLogPlotNameConfig() CAF_PDM_InitField( &m_addTimestep, "AddTimeStep", false, "Add Time Step", "", "", "" ); CAF_PDM_InitField( &m_addAirGap, "AddAirGap", false, "Add Air Gap", "", "", "" ); CAF_PDM_InitField( &m_addWaterDepth, "AddWaterDepth", false, "Add Water Depth", "", "", "" ); - - m_customName = "Well Log Plot"; } //-------------------------------------------------------------------------------------------------- @@ -85,13 +83,25 @@ bool RimWellLogPlotNameConfig::addWaterDepth() const //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void RimWellLogPlotNameConfig::enableAllAutoNameTags( bool enable ) +void RimWellLogPlotNameConfig::setAutoNameTags( bool addCaseName, + bool addWellName, + bool addTimeStep, + bool addAirGap, + bool addWaterDepth ) { - m_addCaseName = enable; - m_addWellName = enable; - m_addTimestep = enable; - m_addAirGap = enable; - m_addWaterDepth = enable; + m_addCaseName = addCaseName; + m_addWellName = addWellName; + m_addTimestep = addTimeStep; + m_addAirGap = addAirGap; + m_addWaterDepth = addWaterDepth; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimWellLogPlotNameConfig::doEnableAllAutoNameTags( bool enable ) +{ + setAutoNameTags( enable, enable, enable, enable, enable ); } //-------------------------------------------------------------------------------------------------- @@ -100,6 +110,7 @@ void RimWellLogPlotNameConfig::enableAllAutoNameTags( bool enable ) void RimWellLogPlotNameConfig::defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) { RimNameConfig::defineUiOrdering( uiConfigName, uiOrdering ); + uiOrdering.add( &m_addCaseName ); uiOrdering.add( &m_addWellName ); uiOrdering.add( &m_addTimestep ); diff --git a/ApplicationCode/ProjectDataModel/RimWellLogPlotNameConfig.h b/ApplicationCode/ProjectDataModel/RimWellLogPlotNameConfig.h index 5f951e8db1..6786ae5537 100644 --- a/ApplicationCode/ProjectDataModel/RimWellLogPlotNameConfig.h +++ b/ApplicationCode/ProjectDataModel/RimWellLogPlotNameConfig.h @@ -36,11 +36,15 @@ public: bool addTimeStep() const; bool addAirGap() const; bool addWaterDepth() const; - void enableAllAutoNameTags( bool enable ) override; + + void setAutoNameTags( bool addCaseName, bool addWellName, bool addTimeStep, bool addAirGap, bool addWaterDepth ); protected: void defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) override; +private: + void doEnableAllAutoNameTags( bool enable ) override; + private: caf::PdmField m_addCaseName; caf::PdmField m_addWellName; diff --git a/ApplicationCode/ProjectDataModel/RimWellLogRftCurveNameConfig.cpp b/ApplicationCode/ProjectDataModel/RimWellLogRftCurveNameConfig.cpp index 8b69d2ae0d..9173c83a55 100644 --- a/ApplicationCode/ProjectDataModel/RimWellLogRftCurveNameConfig.cpp +++ b/ApplicationCode/ProjectDataModel/RimWellLogRftCurveNameConfig.cpp @@ -29,8 +29,12 @@ CAF_PDM_SOURCE_INIT( RimWellLogRftCurveNameConfig, "RimWellLogRftCurveNameConfig /// //-------------------------------------------------------------------------------------------------- RimWellLogRftCurveNameConfig::RimWellLogRftCurveNameConfig() - : RimNameConfig() + : RimNameConfig( "Rft Curve" ) { CAF_PDM_InitObject( "Well Log Rft Curve Name Generator", "", "", "" ); - m_customName = "Rft Curve"; } + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimWellLogRftCurveNameConfig::doEnableAllAutoNameTags( bool enable ) {} diff --git a/ApplicationCode/ProjectDataModel/RimWellLogRftCurveNameConfig.h b/ApplicationCode/ProjectDataModel/RimWellLogRftCurveNameConfig.h index 28b7a8f99a..07886be234 100644 --- a/ApplicationCode/ProjectDataModel/RimWellLogRftCurveNameConfig.h +++ b/ApplicationCode/ProjectDataModel/RimWellLogRftCurveNameConfig.h @@ -30,4 +30,7 @@ class RimWellLogRftCurveNameConfig : public RimNameConfig public: RimWellLogRftCurveNameConfig(); + +private: + void doEnableAllAutoNameTags( bool enable ) override; }; From d44775aba69d180b02926ef55549241a6ccd2f9e Mon Sep 17 00:00:00 2001 From: Gaute Lindkvist Date: Mon, 25 Nov 2019 12:40:51 +0100 Subject: [PATCH 16/50] #5063 Improve auto name for well log plots and use it for well allocation plots --- .../Flow/RimWellAllocationPlot.cpp | 8 ++++-- .../Flow/RimWellFlowRateCurve.cpp | 27 +++++++++++++++++++ .../Flow/RimWellFlowRateCurve.h | 6 +++-- .../RimWellLogCurveCommonDataSource.cpp | 10 +++++++ .../ProjectDataModel/RimWellLogPlot.cpp | 8 ++++++ .../ProjectDataModel/RimWellLogPlot.h | 3 ++- .../RimWellLogPlotNameConfig.cpp | 16 +++++++++++ .../RimWellLogPlotNameConfig.h | 5 ++++ 8 files changed, 78 insertions(+), 5 deletions(-) diff --git a/ApplicationCode/ProjectDataModel/Flow/RimWellAllocationPlot.cpp b/ApplicationCode/ProjectDataModel/Flow/RimWellAllocationPlot.cpp index 69bab4bf77..33be2e275d 100644 --- a/ApplicationCode/ProjectDataModel/Flow/RimWellAllocationPlot.cpp +++ b/ApplicationCode/ProjectDataModel/Flow/RimWellAllocationPlot.cpp @@ -40,6 +40,7 @@ #include "RimTotalWellAllocationPlot.h" #include "RimWellAllocationPlotLegend.h" #include "RimWellFlowRateCurve.h" +#include "RimWellLogCurveCommonDataSource.h" #include "RimWellLogPlot.h" #include "RimWellLogTrack.h" @@ -210,7 +211,11 @@ void RimWellAllocationPlot::updateFromWell() if ( m_flowType() == ACCUMULATED ) description = "Accumulated Flow"; if ( m_flowType() == INFLOW ) description = "Inflow Rates"; - accumulatedWellFlowPlot()->setDescription( description + " (" + m_wellName + ")" ); + RimWellLogPlotNameConfig* nameConfig = accumulatedWellFlowPlot()->nameConfig(); + nameConfig->setCustomName( description ); + nameConfig->setAutoNameTags( false, true, false, false, false ); + nameConfig->setFieldVisibility( true, true, true, false, false ); + accumulatedWellFlowPlot()->updateAutoName(); if ( !m_case ) return; @@ -356,7 +361,6 @@ void RimWellAllocationPlot::updateFromWell() m_totalWellAllocationPlot->updateConnectedEditors(); accumulatedWellFlowPlot()->updateConnectedEditors(); - m_tofAccumulatedPhaseFractionsPlot->reloadFromWell(); m_tofAccumulatedPhaseFractionsPlot->updateConnectedEditors(); diff --git a/ApplicationCode/ProjectDataModel/Flow/RimWellFlowRateCurve.cpp b/ApplicationCode/ProjectDataModel/Flow/RimWellFlowRateCurve.cpp index be43733c89..df4ab24312 100644 --- a/ApplicationCode/ProjectDataModel/Flow/RimWellFlowRateCurve.cpp +++ b/ApplicationCode/ProjectDataModel/Flow/RimWellFlowRateCurve.cpp @@ -56,6 +56,33 @@ RimWellFlowRateCurve::RimWellFlowRateCurve() //-------------------------------------------------------------------------------------------------- RimWellFlowRateCurve::~RimWellFlowRateCurve() {} +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimEclipseResultCase* RimWellFlowRateCurve::rimCase() +{ + RimWellAllocationPlot* wap = wellAllocationPlot(); + if ( wap ) + { + return wap->rimCase(); + } + return nullptr; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +int RimWellFlowRateCurve::timeStep() +{ + RimWellAllocationPlot* wap = wellAllocationPlot(); + + if ( wap ) + { + return wap->timeStep(); + } + return -1; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationCode/ProjectDataModel/Flow/RimWellFlowRateCurve.h b/ApplicationCode/ProjectDataModel/Flow/RimWellFlowRateCurve.h index c6385d4eed..585417c202 100644 --- a/ApplicationCode/ProjectDataModel/Flow/RimWellFlowRateCurve.h +++ b/ApplicationCode/ProjectDataModel/Flow/RimWellFlowRateCurve.h @@ -44,8 +44,10 @@ public: const std::vector& flowRates ); void updateStackedPlotData(); - QString wellName() const override; - QString wellLogChannelName() const override; + RimEclipseResultCase* rimCase(); + int timeStep(); + QString wellName() const override; + QString wellLogChannelName() const override; void setGroupId( int groupId ); int groupId() const; diff --git a/ApplicationCode/ProjectDataModel/RimWellLogCurveCommonDataSource.cpp b/ApplicationCode/ProjectDataModel/RimWellLogCurveCommonDataSource.cpp index 826a1e67ac..e8e7e0289a 100644 --- a/ApplicationCode/ProjectDataModel/RimWellLogCurveCommonDataSource.cpp +++ b/ApplicationCode/ProjectDataModel/RimWellLogCurveCommonDataSource.cpp @@ -21,10 +21,12 @@ #include "RimCase.h" #include "RimDataSourceSteppingTools.h" #include "RimEclipseCase.h" +#include "RimEclipseResultCase.h" #include "RimGeoMechCase.h" #include "RimOilField.h" #include "RimProject.h" #include "RimTools.h" +#include "RimWellFlowRateCurve.h" #include "RimWellLogExtractionCurve.h" #include "RimWellLogFileCurve.h" #include "RimWellLogPlot.h" @@ -285,6 +287,7 @@ void RimWellLogCurveCommonDataSource::updateDefaultOptions( const std::vector( curve ); RimWellLogFileCurve* fileCurve = dynamic_cast( curve ); + RimWellFlowRateCurve* flowRateCurve = dynamic_cast( curve ); if ( extractionCurve ) { RimWellLogWbsCurve* wbsCurve = dynamic_cast( extractionCurve ); @@ -322,6 +325,13 @@ void RimWellLogCurveCommonDataSource::updateDefaultOptions( const std::vectorwellPath() ); m_uniqueWellNames.insert( fileCurve->wellName() ); } + else if ( flowRateCurve ) + { + m_uniqueTrajectoryTypes.insert( RimWellLogExtractionCurve::SIMULATION_WELL ); + m_uniqueWellNames.insert( flowRateCurve->wellName() ); + m_uniqueCases.insert( flowRateCurve->rimCase() ); + m_uniqueTimeSteps.insert( flowRateCurve->timeStep() ); + } } for ( RimWellLogTrack* track : tracks ) { diff --git a/ApplicationCode/ProjectDataModel/RimWellLogPlot.cpp b/ApplicationCode/ProjectDataModel/RimWellLogPlot.cpp index 07b06aaf77..cef765f8ed 100644 --- a/ApplicationCode/ProjectDataModel/RimWellLogPlot.cpp +++ b/ApplicationCode/ProjectDataModel/RimWellLogPlot.cpp @@ -400,6 +400,14 @@ QString RimWellLogPlot::createAutoName() const return generatedCurveName.join( ": " ); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimWellLogPlotNameConfig* RimWellLogPlot::nameConfig() const +{ + return m_nameConfig; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationCode/ProjectDataModel/RimWellLogPlot.h b/ApplicationCode/ProjectDataModel/RimWellLogPlot.h index a6cf3fcb6a..2bb1dee06e 100644 --- a/ApplicationCode/ProjectDataModel/RimWellLogPlot.h +++ b/ApplicationCode/ProjectDataModel/RimWellLogPlot.h @@ -92,7 +92,8 @@ public: void uiOrderingForDepthAxis( caf::PdmUiOrdering& uiOrdering ); void uiOrderingForPlotLayout( caf::PdmUiOrdering& uiOrdering ) override; - QString createAutoName() const override; + QString createAutoName() const override; + RimWellLogPlotNameConfig* nameConfig() const; RimWellLogCurveCommonDataSource* commonDataSource() const; void updateCommonDataSource(); diff --git a/ApplicationCode/ProjectDataModel/RimWellLogPlotNameConfig.cpp b/ApplicationCode/ProjectDataModel/RimWellLogPlotNameConfig.cpp index b58dfc395c..d2e9b52495 100644 --- a/ApplicationCode/ProjectDataModel/RimWellLogPlotNameConfig.cpp +++ b/ApplicationCode/ProjectDataModel/RimWellLogPlotNameConfig.cpp @@ -96,6 +96,22 @@ void RimWellLogPlotNameConfig::setAutoNameTags( bool addCaseName, m_addWaterDepth = addWaterDepth; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimWellLogPlotNameConfig::setFieldVisibility( bool caseNameVisible, + bool wellNameVisible, + bool timeStepVisible, + bool airGapVisible, + bool waterDepthVisible ) +{ + m_addCaseName.uiCapability()->setUiHidden( !caseNameVisible ); + m_addWellName.uiCapability()->setUiHidden( !wellNameVisible ); + m_addTimestep.uiCapability()->setUiHidden( !timeStepVisible ); + m_addAirGap.uiCapability()->setUiHidden( !airGapVisible ); + m_addWaterDepth.uiCapability()->setUiHidden( !waterDepthVisible ); +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationCode/ProjectDataModel/RimWellLogPlotNameConfig.h b/ApplicationCode/ProjectDataModel/RimWellLogPlotNameConfig.h index 6786ae5537..bc1b2529b3 100644 --- a/ApplicationCode/ProjectDataModel/RimWellLogPlotNameConfig.h +++ b/ApplicationCode/ProjectDataModel/RimWellLogPlotNameConfig.h @@ -38,6 +38,11 @@ public: bool addWaterDepth() const; void setAutoNameTags( bool addCaseName, bool addWellName, bool addTimeStep, bool addAirGap, bool addWaterDepth ); + void setFieldVisibility( bool caseNameVisible, + bool wellNameVisible, + bool timeStepVisible, + bool airGapVisible, + bool waterDepthVisible ); protected: void defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) override; From 1e92687745867af96833e18fa146bccf3779ccbc Mon Sep 17 00:00:00 2001 From: Magne Sjaastad Date: Mon, 25 Nov 2019 15:51:20 +0100 Subject: [PATCH 17/50] #5077 Summary Plots: Simplify context menu --- ApplicationCode/ProjectDataModel/RimContextCommandBuilder.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/ApplicationCode/ProjectDataModel/RimContextCommandBuilder.cpp b/ApplicationCode/ProjectDataModel/RimContextCommandBuilder.cpp index c4c7bb7cb3..88e1310603 100644 --- a/ApplicationCode/ProjectDataModel/RimContextCommandBuilder.cpp +++ b/ApplicationCode/ProjectDataModel/RimContextCommandBuilder.cpp @@ -545,10 +545,7 @@ caf::CmdFeatureMenuBuilder RimContextCommandBuilder::commandsFromSelection() menuBuilder << "RicPasteEnsembleCurveSetFeature"; menuBuilder << "Separator"; menuBuilder << "RicEditSummaryPlotFeature"; - menuBuilder << "RicNewSummaryPlotFeature"; - menuBuilder << "RicNewDefaultSummaryPlotFeature"; menuBuilder << "RicDuplicateSummaryPlotFeature"; - menuBuilder << "RicNewSummaryCurveFeature"; menuBuilder << "RicNewSummaryEnsembleCurveSetFeature"; menuBuilder << "RicDuplicateSummaryCrossPlotFeature"; menuBuilder << "RicNewSummaryCrossPlotCurveFeature"; From b7588544631fc0d3e94749faeacdac777c3e3961 Mon Sep 17 00:00:00 2001 From: Magne Sjaastad Date: Tue, 26 Nov 2019 07:42:04 +0100 Subject: [PATCH 18/50] #5069 Janitor : Hide some menu items related to toggling --- .../RimContextCommandBuilder.cpp | 40 ++++++++++++++++++- 1 file changed, 38 insertions(+), 2 deletions(-) diff --git a/ApplicationCode/ProjectDataModel/RimContextCommandBuilder.cpp b/ApplicationCode/ProjectDataModel/RimContextCommandBuilder.cpp index 88e1310603..56a71f27be 100644 --- a/ApplicationCode/ProjectDataModel/RimContextCommandBuilder.cpp +++ b/ApplicationCode/ProjectDataModel/RimContextCommandBuilder.cpp @@ -33,6 +33,7 @@ #include "RimAnnotationInViewCollection.h" #include "RimCalcScript.h" #include "RimCaseCollection.h" +#include "RimCellEdgeColors.h" #include "RimCellRangeFilter.h" #include "RimCellRangeFilterCollection.h" #include "RimEclipseCase.h" @@ -40,6 +41,7 @@ #include "RimEclipseCellColors.h" #include "RimEclipseContourMapView.h" #include "RimEclipseContourMapViewCollection.h" +#include "RimEclipseFaultColors.h" #include "RimEclipseInputProperty.h" #include "RimEclipseInputPropertyCollection.h" #include "RimEclipsePropertyFilter.h" @@ -62,6 +64,7 @@ #include "RimFractureTemplate.h" #include "RimFractureTemplateCollection.h" #include "RimGeoMechCase.h" +#include "RimGeoMechCellColors.h" #include "RimGeoMechContourMapView.h" #include "RimGeoMechContourMapViewCollection.h" #include "RimGeoMechPropertyFilter.h" @@ -103,6 +106,7 @@ #include "RimViewController.h" #include "RimViewLinker.h" #include "RimViewLinkerCollection.h" +#include "RimVirtualPerforationResults.h" #include "RimWellAllocationPlot.h" #include "RimWellLogCurve.h" #include "RimWellLogFile.h" @@ -935,9 +939,37 @@ caf::CmdFeatureMenuBuilder RimContextCommandBuilder::commandsFromSelection() } { + bool toggleCommandCandidate = true; + { + if ( dynamic_cast( uiItems[0] ) ) + { + toggleCommandCandidate = false; + } + else if ( dynamic_cast( uiItems[0] ) ) + { + toggleCommandCandidate = false; + } + else if ( dynamic_cast( uiItems[0] ) ) + { + toggleCommandCandidate = false; + } + else if ( dynamic_cast( uiItems[0] ) ) + { + toggleCommandCandidate = false; + } + else if ( dynamic_cast( uiItems[0] ) ) + { + toggleCommandCandidate = false; + } + else if ( dynamic_cast( uiItems[0] ) ) + { + toggleCommandCandidate = false; + } + } + bool addSeparator = true; - if ( RicToggleItemsFeatureImpl::isToggleCommandsAvailable() ) + if ( toggleCommandCandidate && RicToggleItemsFeatureImpl::isToggleCommandsAvailable() ) { menuBuilder << "Separator"; menuBuilder << "RicToggleItemsOnFeature"; @@ -950,7 +982,11 @@ caf::CmdFeatureMenuBuilder RimContextCommandBuilder::commandsFromSelection() { menuBuilder.addSeparator(); } - menuBuilder << "RicToggleItemsOnOthersOffFeature"; + + if ( dynamic_cast( uiItems[0] ) == nullptr ) + { + menuBuilder << "RicToggleItemsOnOthersOffFeature"; + } if ( RicToggleItemsFeatureImpl::isToggleCommandsAvailable() ) { From 6264eb49c8707fde822f6713d7e836c1d2a510ac Mon Sep 17 00:00:00 2001 From: Magne Sjaastad Date: Tue, 26 Nov 2019 13:42:51 +0100 Subject: [PATCH 19/50] #5095 Summary Statistics : Guard vector acces when calculating statistics curves --- .../Summary/RimEnsembleStatisticsCase.cpp | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/ApplicationCode/ProjectDataModel/Summary/RimEnsembleStatisticsCase.cpp b/ApplicationCode/ProjectDataModel/Summary/RimEnsembleStatisticsCase.cpp index a73ae26d7d..29330e1c9f 100644 --- a/ApplicationCode/ProjectDataModel/Summary/RimEnsembleStatisticsCase.cpp +++ b/ApplicationCode/ProjectDataModel/Summary/RimEnsembleStatisticsCase.cpp @@ -133,18 +133,18 @@ void RimEnsembleStatisticsCase::calculate( const std::vector su const RifEclipseSummaryAddress& inputAddress ) { std::vector allTimeSteps; - std::vector> allValues; + std::vector> caseAndTimeStepValues; if ( !inputAddress.isValid() ) return; - allValues.reserve( sumCases.size() ); + caseAndTimeStepValues.reserve( sumCases.size() ); for ( const auto& sumCase : sumCases ) { const auto& reader = sumCase->summaryReader(); if ( reader ) { - std::vector timeSteps = reader->timeSteps( inputAddress ); - std::vector values; + const std::vector& timeSteps = reader->timeSteps( inputAddress ); + std::vector values; reader->values( inputAddress, &values ); if ( timeSteps.size() != values.size() ) continue; @@ -157,7 +157,7 @@ void RimEnsembleStatisticsCase::calculate( const std::vector su resampler.resampleAndComputeWeightedMeanValues( DateTimePeriod::DAY ); if ( allTimeSteps.empty() ) allTimeSteps = resampler.resampledTimeSteps(); - allValues.push_back( + caseAndTimeStepValues.push_back( std::vector( resampler.resampledValues().begin(), resampler.resampledValues().end() ) ); } } @@ -165,14 +165,17 @@ void RimEnsembleStatisticsCase::calculate( const std::vector su clearData(); m_timeSteps = allTimeSteps; - for ( int t = 0; t < (int)allTimeSteps.size(); t++ ) + for ( size_t timeStepIndex = 0; timeStepIndex < allTimeSteps.size(); timeStepIndex++ ) { std::vector valuesAtTimeStep; valuesAtTimeStep.reserve( sumCases.size() ); - for ( int c = 0; c < (int)sumCases.size(); c++ ) + for ( const std::vector& caseValues : caseAndTimeStepValues ) { - valuesAtTimeStep.push_back( allValues[c][t] ); + if ( timeStepIndex < caseValues.size() ) + { + valuesAtTimeStep.push_back( caseValues[timeStepIndex] ); + } } double p10, p50, p90, mean; From 6969c2f2990cdc934368da5944e55a8663bd3e75 Mon Sep 17 00:00:00 2001 From: Magne Sjaastad Date: Tue, 26 Nov 2019 15:02:52 +0100 Subject: [PATCH 20/50] #4155 Ensemble Statistics Curves : Add option to include partial curves when computing statistics --- .../Summary/RimEnsembleCurveSet.cpp | 2 +- .../Summary/RimEnsembleStatistics.cpp | 5 +++- .../Summary/RimEnsembleStatistics.h | 6 +++++ .../Summary/RimEnsembleStatisticsCase.cpp | 23 ++++++++++++++----- .../Summary/RimEnsembleStatisticsCase.h | 11 +++++---- 5 files changed, 35 insertions(+), 12 deletions(-) diff --git a/ApplicationCode/ProjectDataModel/Summary/RimEnsembleCurveSet.cpp b/ApplicationCode/ProjectDataModel/Summary/RimEnsembleCurveSet.cpp index bee72a7a5a..81faa8ffaa 100644 --- a/ApplicationCode/ProjectDataModel/Summary/RimEnsembleCurveSet.cpp +++ b/ApplicationCode/ProjectDataModel/Summary/RimEnsembleCurveSet.cpp @@ -1055,7 +1055,7 @@ void RimEnsembleCurveSet::updateStatisticsCurves( const std::vectorallSummaryCases(); } - m_ensembleStatCase->calculate( statCases ); + m_ensembleStatCase->calculate( statCases, m_statistics->includeIncompleteCurves() ); } RimSummaryPlot* plot = nullptr; diff --git a/ApplicationCode/ProjectDataModel/Summary/RimEnsembleStatistics.cpp b/ApplicationCode/ProjectDataModel/Summary/RimEnsembleStatistics.cpp index 85664b4d98..43fb09566e 100644 --- a/ApplicationCode/ProjectDataModel/Summary/RimEnsembleStatistics.cpp +++ b/ApplicationCode/ProjectDataModel/Summary/RimEnsembleStatistics.cpp @@ -43,6 +43,8 @@ RimEnsembleStatistics::RimEnsembleStatistics() CAF_PDM_InitField( &m_showP90Curve, "ShowP90Curve", true, "P10", "", "", "" ); // Yes, P10 CAF_PDM_InitField( &m_showMeanCurve, "ShowMeanCurve", true, "Mean", "", "", "" ); CAF_PDM_InitField( &m_showCurveLabels, "ShowCurveLabels", true, "Show Curve Labels", "", "", "" ); + CAF_PDM_InitField( &m_includeIncompleteCurves, "IncludeIncompleteCurves", false, "Include Incomplete Curves", "", "", "" ); + CAF_PDM_InitField( &m_warningLabel, "WarningLabel", QString( "Warning: Ensemble time range mismatch" ), "", "", "", "" ); CAF_PDM_InitField( &m_color, "Color", cvf::Color3f( cvf::Color3::BLACK ), "Color", "", "", "" ); @@ -100,7 +102,7 @@ void RimEnsembleStatistics::fieldChangedByUi( const caf::PdmFieldHandle* changed { if ( changedField == &m_active || changedField == &m_basedOnFilteredCases || changedField == &m_showP10Curve || changedField == &m_showP50Curve || changedField == &m_showP90Curve || changedField == &m_showMeanCurve || - changedField == &m_showCurveLabels || changedField == &m_color ) + changedField == &m_showCurveLabels || changedField == &m_color || changedField == &m_includeIncompleteCurves ) { auto curveSet = parentCurveSet(); if ( !curveSet ) return; @@ -129,6 +131,7 @@ void RimEnsembleStatistics::defineUiOrdering( QString uiConfigName, caf::PdmUiOr uiOrdering.add( &m_active ); uiOrdering.add( &m_hideEnsembleCurves ); uiOrdering.add( &m_basedOnFilteredCases ); + uiOrdering.add( &m_includeIncompleteCurves ); uiOrdering.add( &m_showCurveLabels ); uiOrdering.add( &m_color ); diff --git a/ApplicationCode/ProjectDataModel/Summary/RimEnsembleStatistics.h b/ApplicationCode/ProjectDataModel/Summary/RimEnsembleStatistics.h index c373e2a063..9a20dd769a 100644 --- a/ApplicationCode/ProjectDataModel/Summary/RimEnsembleStatistics.h +++ b/ApplicationCode/ProjectDataModel/Summary/RimEnsembleStatistics.h @@ -72,6 +72,11 @@ public: return m_color; } + bool includeIncompleteCurves() const + { + return m_includeIncompleteCurves; + } + void disableP10Curve( bool disable ); void disableP50Curve( bool disable ); void disableP90Curve( bool disable ); @@ -93,6 +98,7 @@ private: caf::PdmField m_showP90Curve; caf::PdmField m_showMeanCurve; caf::PdmField m_showCurveLabels; + caf::PdmField m_includeIncompleteCurves; caf::PdmField m_warningLabel; diff --git a/ApplicationCode/ProjectDataModel/Summary/RimEnsembleStatisticsCase.cpp b/ApplicationCode/ProjectDataModel/Summary/RimEnsembleStatisticsCase.cpp index 29330e1c9f..928b28ebb2 100644 --- a/ApplicationCode/ProjectDataModel/Summary/RimEnsembleStatisticsCase.cpp +++ b/ApplicationCode/ProjectDataModel/Summary/RimEnsembleStatisticsCase.cpp @@ -117,12 +117,16 @@ const RimEnsembleCurveSet* RimEnsembleStatisticsCase::curveSet() const //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void RimEnsembleStatisticsCase::calculate( const std::vector& sumCases ) +void RimEnsembleStatisticsCase::calculate( const std::vector& sumCases, bool includeIncompleteCurves ) { auto inputAddress = m_curveSet->summaryAddress(); if ( m_statisticsReader && inputAddress.isValid() ) { - calculate( validSummaryCases( sumCases, inputAddress ), inputAddress ); + const std::vector& validCases = validSummaryCases( sumCases, + inputAddress, + includeIncompleteCurves ); + + calculate( validCases, inputAddress, includeIncompleteCurves ); } } @@ -130,7 +134,8 @@ void RimEnsembleStatisticsCase::calculate( const std::vector& s /// //-------------------------------------------------------------------------------------------------- void RimEnsembleStatisticsCase::calculate( const std::vector sumCases, - const RifEclipseSummaryAddress& inputAddress ) + const RifEclipseSummaryAddress& inputAddress, + bool includeIncompleteCurves ) { std::vector allTimeSteps; std::vector> caseAndTimeStepValues; @@ -147,7 +152,7 @@ void RimEnsembleStatisticsCase::calculate( const std::vector su std::vector values; reader->values( inputAddress, &values ); - if ( timeSteps.size() != values.size() ) continue; + if ( !includeIncompleteCurves && timeSteps.size() != values.size() ) continue; RiaTimeHistoryCurveResampler resampler; resampler.setCurveData( values, timeSteps ); @@ -216,7 +221,8 @@ void RimEnsembleStatisticsCase::clearData() /// //-------------------------------------------------------------------------------------------------- std::vector RimEnsembleStatisticsCase::validSummaryCases( const std::vector allSumCases, - const RifEclipseSummaryAddress& inputAddress ) + const RifEclipseSummaryAddress& inputAddress, + bool includeIncompleteCurves ) { std::vector validCases; std::vector> times; @@ -248,8 +254,13 @@ std::vector RimEnsembleStatisticsCase::validSummaryCases( const time_t firstTimeStep = std::get<1>( item ); time_t lastTimeStep = std::get<2>( item ); - if ( firstTimeStep == minTimeStep && lastTimeStep == maxTimeStep ) + if ( firstTimeStep == minTimeStep ) { + if ( !includeIncompleteCurves && lastTimeStep != maxTimeStep ) + { + continue; + } + validCases.push_back( sumCase ); } } diff --git a/ApplicationCode/ProjectDataModel/Summary/RimEnsembleStatisticsCase.h b/ApplicationCode/ProjectDataModel/Summary/RimEnsembleStatisticsCase.h index 3e3ebf54a1..348de9f3f4 100644 --- a/ApplicationCode/ProjectDataModel/Summary/RimEnsembleStatisticsCase.h +++ b/ApplicationCode/ProjectDataModel/Summary/RimEnsembleStatisticsCase.h @@ -65,14 +65,17 @@ public: const RimEnsembleCurveSet* curveSet() const; - void calculate( const std::vector& sumCases ); + void calculate( const std::vector& sumCases, bool includeIncompleteCurves ); RiaEclipseUnitTools::UnitSystem unitSystem() const; private: - void calculate( const std::vector sumCases, const RifEclipseSummaryAddress& inputAddress ); - void clearData(); + void calculate( const std::vector sumCases, + const RifEclipseSummaryAddress& inputAddress, + bool includeIncompleteCurves ); + void clearData(); std::vector validSummaryCases( const std::vector allSumCases, - const RifEclipseSummaryAddress& inputAddress ); + const RifEclipseSummaryAddress& inputAddress, + bool includeIncompleteCurves ); private: std::unique_ptr m_statisticsReader; From a4b08fcd29d0c10973c2db0d51ac494f1712f020 Mon Sep 17 00:00:00 2001 From: Magne Sjaastad Date: Tue, 26 Nov 2019 15:39:59 +0100 Subject: [PATCH 21/50] #4155 Ensemble Statistics Curves : Guard empty vector --- .../ProjectDataModel/Summary/RimEnsembleStatisticsCase.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ApplicationCode/ProjectDataModel/Summary/RimEnsembleStatisticsCase.cpp b/ApplicationCode/ProjectDataModel/Summary/RimEnsembleStatisticsCase.cpp index 928b28ebb2..b246bca8fd 100644 --- a/ApplicationCode/ProjectDataModel/Summary/RimEnsembleStatisticsCase.cpp +++ b/ApplicationCode/ProjectDataModel/Summary/RimEnsembleStatisticsCase.cpp @@ -152,6 +152,8 @@ void RimEnsembleStatisticsCase::calculate( const std::vector su std::vector values; reader->values( inputAddress, &values ); + if ( values.empty() ) continue; + if ( !includeIncompleteCurves && timeSteps.size() != values.size() ) continue; RiaTimeHistoryCurveResampler resampler; From bfdc84a7445fe978e1ad88b5656171f2f07879b8 Mon Sep 17 00:00:00 2001 From: Magne Sjaastad Date: Wed, 27 Nov 2019 10:17:31 +0100 Subject: [PATCH 22/50] #5102 Janitor : Guard null pointer access --- .../RicPasteAsciiDataToSummaryPlotFeature.cpp | 3 +-- .../SummaryPlotCommands/RicPasteEnsembleCurveSetFeature.cpp | 1 + .../SummaryPlotCommands/RicPasteSummaryCaseFeature.cpp | 3 ++- .../SummaryPlotCommands/RicPasteSummaryCrossPlotFeature.cpp | 1 + .../SummaryPlotCommands/RicPasteSummaryCurveFeature.cpp | 1 + .../SummaryPlotCommands/RicPasteSummaryPlotFeature.cpp | 2 ++ .../Commands/WellLogCommands/RicPasteWellLogCurveFeature.cpp | 2 ++ .../Commands/WellLogCommands/RicPasteWellLogPlotFeature.cpp | 2 ++ .../Commands/WellLogCommands/RicPasteWellLogTrackFeature.cpp | 1 + 9 files changed, 13 insertions(+), 3 deletions(-) diff --git a/ApplicationCode/Commands/SummaryPlotCommands/RicPasteAsciiDataToSummaryPlotFeature.cpp b/ApplicationCode/Commands/SummaryPlotCommands/RicPasteAsciiDataToSummaryPlotFeature.cpp index a75bcabab0..cf6565b760 100644 --- a/ApplicationCode/Commands/SummaryPlotCommands/RicPasteAsciiDataToSummaryPlotFeature.cpp +++ b/ApplicationCode/Commands/SummaryPlotCommands/RicPasteAsciiDataToSummaryPlotFeature.cpp @@ -54,8 +54,7 @@ bool RicPasteAsciiDataToSummaryPlotFeature::isCommandEnabled() caf::PdmObjectHandle* destinationObject = dynamic_cast( caf::SelectionManager::instance()->selectedItem() ); - RimSummaryPlot* summaryPlot = nullptr; - destinationObject->firstAncestorOrThisOfType( summaryPlot ); + if ( !destinationObject ) return false; RimSummaryPlotCollection* summaryPlotCollection = nullptr; destinationObject->firstAncestorOrThisOfType( summaryPlotCollection ); diff --git a/ApplicationCode/Commands/SummaryPlotCommands/RicPasteEnsembleCurveSetFeature.cpp b/ApplicationCode/Commands/SummaryPlotCommands/RicPasteEnsembleCurveSetFeature.cpp index bc64cce823..e67f79f40e 100644 --- a/ApplicationCode/Commands/SummaryPlotCommands/RicPasteEnsembleCurveSetFeature.cpp +++ b/ApplicationCode/Commands/SummaryPlotCommands/RicPasteEnsembleCurveSetFeature.cpp @@ -67,6 +67,7 @@ RimEnsembleCurveSet* bool RicPasteEnsembleCurveSetFeature::isCommandEnabled() { caf::PdmObject* destinationObject = dynamic_cast( caf::SelectionManager::instance()->selectedItem() ); + if ( !destinationObject ) return false; RimSummaryPlot* plot = nullptr; RimEnsembleCurveSetCollection* coll = nullptr; diff --git a/ApplicationCode/Commands/SummaryPlotCommands/RicPasteSummaryCaseFeature.cpp b/ApplicationCode/Commands/SummaryPlotCommands/RicPasteSummaryCaseFeature.cpp index 3d96ce069e..9bd3640ca3 100644 --- a/ApplicationCode/Commands/SummaryPlotCommands/RicPasteSummaryCaseFeature.cpp +++ b/ApplicationCode/Commands/SummaryPlotCommands/RicPasteSummaryCaseFeature.cpp @@ -80,6 +80,7 @@ void RicPasteSummaryCaseFeature::onActionTriggered( bool isChecked ) { caf::PdmObjectHandle* destinationObject = dynamic_cast( caf::SelectionManager::instance()->selectedItem() ); + if ( !destinationObject ) return; std::vector> sourceObjects = RicPasteSummaryCaseFeature::summaryCases(); @@ -162,4 +163,4 @@ void RicPasteSummaryCaseFeature::removeFromSourceCollection( RimSummaryCase* sum sourceSummaryCaseMainCollection->removeCase( summaryCase ); sourceSummaryCaseMainCollection->updateConnectedEditors(); } -} \ No newline at end of file +} diff --git a/ApplicationCode/Commands/SummaryPlotCommands/RicPasteSummaryCrossPlotFeature.cpp b/ApplicationCode/Commands/SummaryPlotCommands/RicPasteSummaryCrossPlotFeature.cpp index 4fc3c90756..209cb861b8 100644 --- a/ApplicationCode/Commands/SummaryPlotCommands/RicPasteSummaryCrossPlotFeature.cpp +++ b/ApplicationCode/Commands/SummaryPlotCommands/RicPasteSummaryCrossPlotFeature.cpp @@ -69,6 +69,7 @@ bool RicPasteSummaryCrossPlotFeature::isCommandEnabled() { caf::PdmObjectHandle* destinationObject = dynamic_cast( caf::SelectionManager::instance()->selectedItem() ); + if ( !destinationObject ) return false; RimSummaryCrossPlotCollection* plotColl = nullptr; destinationObject->firstAncestorOrThisOfType( plotColl ); diff --git a/ApplicationCode/Commands/SummaryPlotCommands/RicPasteSummaryCurveFeature.cpp b/ApplicationCode/Commands/SummaryPlotCommands/RicPasteSummaryCurveFeature.cpp index e59838e194..16c3069f95 100644 --- a/ApplicationCode/Commands/SummaryPlotCommands/RicPasteSummaryCurveFeature.cpp +++ b/ApplicationCode/Commands/SummaryPlotCommands/RicPasteSummaryCurveFeature.cpp @@ -74,6 +74,7 @@ RimSummaryCurve* RicPasteSummaryCurveFeature::copyCurveAndAddToPlot( RimSummaryC bool RicPasteSummaryCurveFeature::isCommandEnabled() { caf::PdmObject* destinationObject = dynamic_cast( caf::SelectionManager::instance()->selectedItem() ); + if ( !destinationObject ) return false; RimSummaryPlot* summaryPlot = nullptr; destinationObject->firstAncestorOrThisOfType( summaryPlot ); diff --git a/ApplicationCode/Commands/SummaryPlotCommands/RicPasteSummaryPlotFeature.cpp b/ApplicationCode/Commands/SummaryPlotCommands/RicPasteSummaryPlotFeature.cpp index cad8b5eca4..ecf4e427b8 100644 --- a/ApplicationCode/Commands/SummaryPlotCommands/RicPasteSummaryPlotFeature.cpp +++ b/ApplicationCode/Commands/SummaryPlotCommands/RicPasteSummaryPlotFeature.cpp @@ -70,6 +70,8 @@ bool RicPasteSummaryPlotFeature::isCommandEnabled() caf::PdmObjectHandle* destinationObject = dynamic_cast( caf::SelectionManager::instance()->selectedItem() ); + if ( !destinationObject ) return false; + RimSummaryPlotCollection* plotColl = nullptr; destinationObject->firstAncestorOrThisOfType( plotColl ); if ( !plotColl ) diff --git a/ApplicationCode/Commands/WellLogCommands/RicPasteWellLogCurveFeature.cpp b/ApplicationCode/Commands/WellLogCommands/RicPasteWellLogCurveFeature.cpp index c320e3dbc6..eade406d3b 100644 --- a/ApplicationCode/Commands/WellLogCommands/RicPasteWellLogCurveFeature.cpp +++ b/ApplicationCode/Commands/WellLogCommands/RicPasteWellLogCurveFeature.cpp @@ -46,6 +46,7 @@ bool RicPasteWellLogCurveFeature::isCommandEnabled() caf::PdmObjectHandle* destinationObject = dynamic_cast( caf::SelectionManager::instance()->selectedItem() ); + if ( !destinationObject ) return false; RimWellLogTrack* wellLogTrack = nullptr; destinationObject->firstAncestorOrThisOfType( wellLogTrack ); @@ -66,6 +67,7 @@ void RicPasteWellLogCurveFeature::onActionTriggered( bool isChecked ) caf::PdmObjectHandle* destinationObject = dynamic_cast( caf::SelectionManager::instance()->selectedItem() ); + if ( !destinationObject ) return; RimWellLogTrack* wellLogTrack = nullptr; destinationObject->firstAncestorOrThisOfType( wellLogTrack ); diff --git a/ApplicationCode/Commands/WellLogCommands/RicPasteWellLogPlotFeature.cpp b/ApplicationCode/Commands/WellLogCommands/RicPasteWellLogPlotFeature.cpp index 0ba089d542..9b3de3496d 100644 --- a/ApplicationCode/Commands/WellLogCommands/RicPasteWellLogPlotFeature.cpp +++ b/ApplicationCode/Commands/WellLogCommands/RicPasteWellLogPlotFeature.cpp @@ -40,6 +40,7 @@ bool RicPasteWellLogPlotFeature::isCommandEnabled() { caf::PdmObjectHandle* destinationObject = dynamic_cast( caf::SelectionManager::instance()->selectedItem() ); + if ( !destinationObject ) return false; RimWellLogPlotCollection* wellLogPlotCollection = nullptr; destinationObject->firstAncestorOrThisOfType( wellLogPlotCollection ); @@ -58,6 +59,7 @@ void RicPasteWellLogPlotFeature::onActionTriggered( bool isChecked ) { caf::PdmObjectHandle* destinationObject = dynamic_cast( caf::SelectionManager::instance()->selectedItem() ); + if ( !destinationObject ) return; RimWellLogPlotCollection* wellLogPlotCollection = nullptr; destinationObject->firstAncestorOrThisOfType( wellLogPlotCollection ); diff --git a/ApplicationCode/Commands/WellLogCommands/RicPasteWellLogTrackFeature.cpp b/ApplicationCode/Commands/WellLogCommands/RicPasteWellLogTrackFeature.cpp index 9c50e0e78f..d4f278f4f9 100644 --- a/ApplicationCode/Commands/WellLogCommands/RicPasteWellLogTrackFeature.cpp +++ b/ApplicationCode/Commands/WellLogCommands/RicPasteWellLogTrackFeature.cpp @@ -44,6 +44,7 @@ bool RicPasteWellLogTrackFeature::isCommandEnabled() caf::PdmObjectHandle* destinationObject = dynamic_cast( caf::SelectionManager::instance()->selectedItem() ); + if ( !destinationObject ) return false; RimWellLogPlot* wellLogPlot = nullptr; RimWellRftPlot* rftPlot = nullptr; From f1b57f39207a014016847db71645fdb97ff278f4 Mon Sep 17 00:00:00 2001 From: Magne Sjaastad Date: Thu, 28 Nov 2019 07:50:07 +0100 Subject: [PATCH 23/50] #5100 Regression Test : Guard timer for holo lens if no session in running --- .../RicExportToSharingServerScheduler.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/ApplicationCode/Commands/HoloLensCommands/RicExportToSharingServerScheduler.cpp b/ApplicationCode/Commands/HoloLensCommands/RicExportToSharingServerScheduler.cpp index 74f4cdb38e..ad0ff2d0c0 100644 --- a/ApplicationCode/Commands/HoloLensCommands/RicExportToSharingServerScheduler.cpp +++ b/ApplicationCode/Commands/HoloLensCommands/RicExportToSharingServerScheduler.cpp @@ -19,6 +19,8 @@ #include "RicExportToSharingServerScheduler.h" #include "RicHoloLensAutoExportToSharingServerFeature.h" +#include "RicHoloLensSession.h" +#include "RicHoloLensSessionManager.h" #include "cafCmdFeatureManager.h" #include "cafProgressState.h" @@ -41,7 +43,11 @@ RicExportToSharingServerScheduler* RicExportToSharingServerScheduler::instance() //-------------------------------------------------------------------------------------------------- void RicExportToSharingServerScheduler::scheduleUpdateSession() { - startTimer( 0 ); + RicHoloLensSession* session = RicHoloLensSessionManager::instance()->session(); + if ( session && session->isSessionValid() ) + { + startTimer( 0 ); + } } //-------------------------------------------------------------------------------------------------- From 9d061e2a5a9439cc65c4651818be3945feb4860b Mon Sep 17 00:00:00 2001 From: Magne Sjaastad Date: Thu, 28 Nov 2019 08:01:08 +0100 Subject: [PATCH 24/50] #5100 AppFwk : ListEditor : Use timer locally to trigger scrollTo --- .../cafPdmUiFormLayoutObjectEditor.cpp | 15 --------- .../cafPdmUiFormLayoutObjectEditor.h | 3 -- .../cafUserInterface/cafPdmUiListEditor.cpp | 33 ++++++++++--------- .../cafUserInterface/cafPdmUiListEditor.h | 2 +- .../cafUserInterface/cafPdmUiPropertyView.cpp | 13 -------- .../cafUserInterface/cafPdmUiPropertyView.h | 1 - 6 files changed, 18 insertions(+), 49 deletions(-) diff --git a/Fwk/AppFwk/cafUserInterface/cafPdmUiFormLayoutObjectEditor.cpp b/Fwk/AppFwk/cafUserInterface/cafPdmUiFormLayoutObjectEditor.cpp index 6031c76d05..f5009c9595 100644 --- a/Fwk/AppFwk/cafUserInterface/cafPdmUiFormLayoutObjectEditor.cpp +++ b/Fwk/AppFwk/cafUserInterface/cafPdmUiFormLayoutObjectEditor.cpp @@ -68,21 +68,6 @@ caf::PdmUiFormLayoutObjectEditor::~PdmUiFormLayoutObjectEditor() CAF_ASSERT(m_fieldViews.size() == 0); } -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -void caf::PdmUiFormLayoutObjectEditor::slotScrollToSelectedItemsInFieldEditors() const -{ - for (auto fieldView : m_fieldViews) - { - auto listEditor = dynamic_cast(fieldView.second); - if (listEditor) - { - listEditor->scrollToSelectedItem(); - } - } -} - //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/Fwk/AppFwk/cafUserInterface/cafPdmUiFormLayoutObjectEditor.h b/Fwk/AppFwk/cafUserInterface/cafPdmUiFormLayoutObjectEditor.h index 077a13556a..f02a1d1220 100644 --- a/Fwk/AppFwk/cafUserInterface/cafPdmUiFormLayoutObjectEditor.h +++ b/Fwk/AppFwk/cafUserInterface/cafPdmUiFormLayoutObjectEditor.h @@ -66,9 +66,6 @@ public: PdmUiFormLayoutObjectEditor(); ~PdmUiFormLayoutObjectEditor() override; -public slots: - void slotScrollToSelectedItemsInFieldEditors() const; - protected: /// When overriding this function, use findOrCreateGroupBox() or findOrCreateFieldEditor() for detailed control /// Use recursivelyConfigureAndUpdateUiItemsInGridLayoutColumn() for automatic layout of group and field widgets diff --git a/Fwk/AppFwk/cafUserInterface/cafPdmUiListEditor.cpp b/Fwk/AppFwk/cafUserInterface/cafPdmUiListEditor.cpp index ee8b34d4f7..941ace1a5c 100644 --- a/Fwk/AppFwk/cafUserInterface/cafPdmUiListEditor.cpp +++ b/Fwk/AppFwk/cafUserInterface/cafPdmUiListEditor.cpp @@ -55,6 +55,7 @@ #include #include #include +#include @@ -150,21 +151,6 @@ PdmUiListEditor::~PdmUiListEditor() { } -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -void PdmUiListEditor::scrollToSelectedItem() const -{ - if (m_isScrollToItemAllowed) - { - QModelIndex mi = m_listView->currentIndex(); - if (mi.isValid()) - { - m_listView->scrollTo(mi); - } - } -} - //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -294,7 +280,7 @@ void PdmUiListEditor::configureAndUpdateUi(const QString& uiConfigName) m_listView->selectionModel()->blockSignals(false); } - //ensureCurrentItemIsVisible(); + QTimer::singleShot(150, this, SLOT(slotScrollToSelectedItem())); } //-------------------------------------------------------------------------------------------------- @@ -406,6 +392,21 @@ void PdmUiListEditor::slotListItemEdited(const QModelIndex&, const QModelIndex&) trimAndSetValuesToField(uiList); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void PdmUiListEditor::slotScrollToSelectedItem() const +{ + if (m_isScrollToItemAllowed) + { + QModelIndex mi = m_listView->currentIndex(); + if (mi.isValid()) + { + m_listView->scrollTo(mi); + } + } +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/Fwk/AppFwk/cafUserInterface/cafPdmUiListEditor.h b/Fwk/AppFwk/cafUserInterface/cafPdmUiListEditor.h index d2177dfbc8..bdc95617f9 100644 --- a/Fwk/AppFwk/cafUserInterface/cafPdmUiListEditor.h +++ b/Fwk/AppFwk/cafUserInterface/cafPdmUiListEditor.h @@ -83,7 +83,6 @@ public: PdmUiListEditor(); ~PdmUiListEditor() override; - void scrollToSelectedItem() const; protected: QWidget* createEditorWidget(QWidget * parent) override; @@ -95,6 +94,7 @@ protected: protected slots: void slotSelectionChanged( const QItemSelection & selected, const QItemSelection & deselected ); void slotListItemEdited(const QModelIndex&, const QModelIndex&); + void slotScrollToSelectedItem() const; private: QString contentAsString() const; diff --git a/Fwk/AppFwk/cafUserInterface/cafPdmUiPropertyView.cpp b/Fwk/AppFwk/cafUserInterface/cafPdmUiPropertyView.cpp index 0461de05cc..b3bbbac5c9 100644 --- a/Fwk/AppFwk/cafUserInterface/cafPdmUiPropertyView.cpp +++ b/Fwk/AppFwk/cafUserInterface/cafPdmUiPropertyView.cpp @@ -192,23 +192,10 @@ void PdmUiPropertyView::showProperties( PdmObjectHandle* object) m_defaultObjectEditor->setPdmObject(object); - QObject::connect(m_defaultObjectEditor, SIGNAL(uiUpdated()), this, SLOT(slotScheduleScrollToSelectedItemsInFieldEditors())); - m_defaultObjectEditor->updateUi(m_uiConfigName); m_scrollArea->updateGeometry(); } -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -void PdmUiPropertyView::slotScheduleScrollToSelectedItemsInFieldEditors() -{ - if (m_defaultObjectEditor) - { - QTimer::singleShot(150, m_defaultObjectEditor, SLOT(slotScrollToSelectedItemsInFieldEditors())); - } -} - //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/Fwk/AppFwk/cafUserInterface/cafPdmUiPropertyView.h b/Fwk/AppFwk/cafUserInterface/cafPdmUiPropertyView.h index a377eb9208..c15065aed1 100644 --- a/Fwk/AppFwk/cafUserInterface/cafPdmUiPropertyView.h +++ b/Fwk/AppFwk/cafUserInterface/cafPdmUiPropertyView.h @@ -85,7 +85,6 @@ public: public slots: void showProperties(caf::PdmObjectHandle* object); // Signal/Slot system needs caf:: prefix in some cases - void slotScheduleScrollToSelectedItemsInFieldEditors(); private: PdmUiDefaultObjectEditor* m_defaultObjectEditor; From 4026e859d2f72e9b7bd6d539ccca6eba8df17faf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacob=20St=C3=B8ren?= Date: Fri, 29 Nov 2019 13:37:38 +0100 Subject: [PATCH 25/50] #5011 Add icon to Replace Case commands --- .../Commands/RicReplaceCaseFeature.cpp | 3 +-- .../Commands/RicReplaceSummaryCaseFeature.cpp | 3 +-- ApplicationCode/Resources/ReplaceCase16x16.png | Bin 0 -> 839 bytes ApplicationCode/Resources/ResInsight.qrc | 1 + 4 files changed, 3 insertions(+), 4 deletions(-) create mode 100644 ApplicationCode/Resources/ReplaceCase16x16.png diff --git a/ApplicationCode/Commands/RicReplaceCaseFeature.cpp b/ApplicationCode/Commands/RicReplaceCaseFeature.cpp index 926156f588..3fd7a571e0 100644 --- a/ApplicationCode/Commands/RicReplaceCaseFeature.cpp +++ b/ApplicationCode/Commands/RicReplaceCaseFeature.cpp @@ -126,6 +126,5 @@ void RicReplaceCaseFeature::onActionTriggered( bool isChecked ) void RicReplaceCaseFeature::setupActionLook( QAction* actionToSetup ) { actionToSetup->setText( "Replace" ); - // TODO: icon? - // actionToSetup->setIcon( QIcon( ":/Refresh-32.png" ) ); + actionToSetup->setIcon( QIcon( ":/ReplaceCase16x16.png" ) ); } diff --git a/ApplicationCode/Commands/RicReplaceSummaryCaseFeature.cpp b/ApplicationCode/Commands/RicReplaceSummaryCaseFeature.cpp index 507ee9964b..cc7abf8ab3 100644 --- a/ApplicationCode/Commands/RicReplaceSummaryCaseFeature.cpp +++ b/ApplicationCode/Commands/RicReplaceSummaryCaseFeature.cpp @@ -78,6 +78,5 @@ void RicReplaceSummaryCaseFeature::onActionTriggered( bool isChecked ) void RicReplaceSummaryCaseFeature::setupActionLook( QAction* actionToSetup ) { actionToSetup->setText( "Replace" ); - // TODO: get an icon? - // actionToSetup->setIcon( QIcon( ":/Refresh-32.png" ) ); + actionToSetup->setIcon( QIcon( ":/ReplaceCase16x16.png" ) ); } diff --git a/ApplicationCode/Resources/ReplaceCase16x16.png b/ApplicationCode/Resources/ReplaceCase16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..2b880c02a2b39884e6341f8536865b192ebeba20 GIT binary patch literal 839 zcmV-N1GxN&P)e zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00OT`L_t(I%bk&5NK;W9$G_*^ zyX(E%+`XHrTk4!vglVXV7L-v+Q3OGyMhGE9S`h_3gfD@;3DJv5_#o6<5JB0CXcA)d z$5LX7=D(7;+}NgDb93(By{8vfk&B=&9L~!*pYuDPFTro=Z-oU6swZ986OJKd|AvLW zDYyYl;4dLVZOBU~kO_|pS+8jlMXsI@!bM|>8reup+MViP=MehbL5!sXa5-k-B4J3g z$a5A^$Lm5-g~k<-Y>6cTi)yVH+SMt<3qLy1-#voITL2cbBqdaJXCRayi!Oym#UfBv z0QI=2Mevitd`Z@6Bh5R^(f!>c%G96V;odvA6_w#*;0=N*Wf8Y8qyz)LaGp6=B1EQ1 zuY;H+f#~%@4zPN33t%B=$lx?QQ7KIZzkgYpnRg6EqHvZJo6eS$l~<~QO#P7v1fER* zt6Lq+O?@7xEFSnnz`O?myAv@LxNDL96Qgg2TQUuDjU<~a8a{(f+rs9~0HB-eXIiTu zy>p|@EW@VHfbZESOageC4n*;vVg7aC#T6^*yIP$(fk{WwndfDDrUiMg7=JfGWZHH$qHjpxF0?-SfBQ?hKa`g1UQsZ`$B$Ta0GxSf! zB1}*J5_`L$fIb}dx+Vw zdu>X4V=?U-@Y>diSedTdBLL1d)mdGEFfDQiVyknDo)1E(^lbP^8(!19taQ>EliU|rG7y5jNGVA5yKq`Ys%KTcWkgjN(ZvrB=mKLDou49GdB RXU6~l002ovPDHLkV1g8@b9n#& literal 0 HcmV?d00001 diff --git a/ApplicationCode/Resources/ResInsight.qrc b/ApplicationCode/Resources/ResInsight.qrc index 3534f617f4..784ec8e3f4 100644 --- a/ApplicationCode/Resources/ResInsight.qrc +++ b/ApplicationCode/Resources/ResInsight.qrc @@ -33,6 +33,7 @@ SummaryGroup16x16.png CreateGridCaseGroup16x16.png GridCaseGroup16x16.png + ReplaceCase16x16.png Histogram16x16.png Histograms16x16.png ZoomAll16x16.png From d4230416af7f0983d570a0be805393299d18b04b Mon Sep 17 00:00:00 2001 From: Magne Sjaastad Date: Fri, 29 Nov 2019 13:39:50 +0100 Subject: [PATCH 26/50] #5132 Janitor : Guard index out of bounds --- .../RimContextCommandBuilder.cpp | 234 +++++++++--------- 1 file changed, 122 insertions(+), 112 deletions(-) diff --git a/ApplicationCode/ProjectDataModel/RimContextCommandBuilder.cpp b/ApplicationCode/ProjectDataModel/RimContextCommandBuilder.cpp index 56a71f27be..efb5a74ecf 100644 --- a/ApplicationCode/ProjectDataModel/RimContextCommandBuilder.cpp +++ b/ApplicationCode/ProjectDataModel/RimContextCommandBuilder.cpp @@ -155,12 +155,17 @@ caf::CmdFeatureMenuBuilder RimContextCommandBuilder::commandsFromSelection() std::vector uiItems; caf::SelectionManager::instance()->selectedItems( uiItems ); + caf::PdmUiItem* firstUiItem = nullptr; + { + if ( !uiItems.empty() ) + { + firstUiItem = uiItems[0]; + } + } + if ( uiItems.size() == 1 ) { - caf::PdmUiItem* uiItem = uiItems[0]; - CVF_ASSERT( uiItem ); - - if ( dynamic_cast( uiItem ) ) + if ( dynamic_cast( firstUiItem ) ) { menuBuilder.subMenuStart( "Import" ); menuBuilder << "RicImportEclipseCaseFeature"; @@ -171,7 +176,7 @@ caf::CmdFeatureMenuBuilder RimContextCommandBuilder::commandsFromSelection() menuBuilder.subMenuEnd(); menuBuilder << "RicEclipseCaseNewGroupFeature"; } - else if ( dynamic_cast( uiItem ) ) + else if ( dynamic_cast( firstUiItem ) ) { menuBuilder << "RicPasteGeoMechViewsFeature"; menuBuilder << "Separator"; @@ -183,7 +188,7 @@ caf::CmdFeatureMenuBuilder RimContextCommandBuilder::commandsFromSelection() menuBuilder << "RicCopyReferencesToClipboardFeature"; menuBuilder << "RicExportContourMapToTextFeature"; } - else if ( dynamic_cast( uiItem ) ) + else if ( dynamic_cast( firstUiItem ) ) { menuBuilder << "RicPasteEclipseViewsFeature"; menuBuilder << "Separator"; @@ -197,27 +202,27 @@ caf::CmdFeatureMenuBuilder RimContextCommandBuilder::commandsFromSelection() menuBuilder << "RicExportContourMapToTextFeature"; menuBuilder << "RicSaveEclipseInputVisibleCellsFeature"; } - else if ( dynamic_cast( uiItem ) ) + else if ( dynamic_cast( firstUiItem ) ) { menuBuilder << "RicNewContourMapViewFeature"; } - else if ( dynamic_cast( uiItem ) ) + else if ( dynamic_cast( firstUiItem ) ) { menuBuilder << "RicNewContourMapViewFeature"; } - else if ( dynamic_cast( uiItem ) ) + else if ( dynamic_cast( firstUiItem ) ) { menuBuilder << "RicPasteEclipseCasesFeature"; menuBuilder << "Separator"; menuBuilder << "RicNewStatisticsCaseFeature"; } - else if ( dynamic_cast( uiItem ) ) + else if ( dynamic_cast( firstUiItem ) ) { menuBuilder << "RicNewViewFeature"; menuBuilder << "RicComputeStatisticsFeature"; menuBuilder << "Separator"; } - else if ( dynamic_cast( uiItem ) ) + else if ( dynamic_cast( firstUiItem ) ) { menuBuilder << "RicPasteEclipseCasesFeature"; menuBuilder << "RicPasteEclipseViewsFeature"; @@ -231,12 +236,12 @@ caf::CmdFeatureMenuBuilder RimContextCommandBuilder::commandsFromSelection() menuBuilder << "RicCopyReferencesToClipboardFeature"; menuBuilder << "Separator"; } - else if ( dynamic_cast( uiItem ) ) + else if ( dynamic_cast( firstUiItem ) ) { menuBuilder << "RicExportCompletionsForTemporaryLgrsFeature"; menuBuilder << "RicDeleteTemporaryLgrsFeature"; } - else if ( dynamic_cast( uiItem ) ) + else if ( dynamic_cast( firstUiItem ) ) { menuBuilder << "RicPasteGeoMechViewsFeature"; menuBuilder << "Separator"; @@ -246,60 +251,60 @@ caf::CmdFeatureMenuBuilder RimContextCommandBuilder::commandsFromSelection() menuBuilder << "RicImportElementPropertyFeature"; menuBuilder << "Separator"; } - else if ( dynamic_cast( uiItem ) ) + else if ( dynamic_cast( firstUiItem ) ) { menuBuilder << "RicPasteEclipseCasesFeature"; menuBuilder << "Separator"; menuBuilder << "RicEclipseCaseNewGroupFeature"; } - else if ( dynamic_cast( uiItem ) ) + else if ( dynamic_cast( firstUiItem ) ) { menuBuilder << "RicSaveEclipseResultAsInputPropertyFeature"; menuBuilder << "RicExportEclipseInputGridFeature"; menuBuilder << "RicSaveEclipseInputVisibleCellsFeature"; menuBuilder << "RicCreateGridCrossPlotFeature"; } - else if ( dynamic_cast( uiItem ) ) + else if ( dynamic_cast( firstUiItem ) ) { menuBuilder << "RicAddEclipseInputPropertyFeature"; } - else if ( dynamic_cast( uiItem ) ) + else if ( dynamic_cast( firstUiItem ) ) { menuBuilder << "RicSaveEclipseInputPropertyFeature"; } - else if ( dynamic_cast( uiItem ) ) + else if ( dynamic_cast( firstUiItem ) ) { menuBuilder << "RicRangeFilterNewFeature"; menuBuilder << "RicRangeFilterNewSliceIFeature"; menuBuilder << "RicRangeFilterNewSliceJFeature"; menuBuilder << "RicRangeFilterNewSliceKFeature"; } - else if ( dynamic_cast( uiItem ) ) + else if ( dynamic_cast( firstUiItem ) ) { menuBuilder << "RicRangeFilterInsertFeature"; menuBuilder << "RicRangeFilterNewSliceIFeature"; menuBuilder << "RicRangeFilterNewSliceJFeature"; menuBuilder << "RicRangeFilterNewSliceKFeature"; } - else if ( dynamic_cast( uiItem ) ) + else if ( dynamic_cast( firstUiItem ) ) { menuBuilder << "RicEclipsePropertyFilterNewFeature"; } - else if ( dynamic_cast( uiItem ) ) + else if ( dynamic_cast( firstUiItem ) ) { menuBuilder << "RicEclipsePropertyFilterInsertFeature"; menuBuilder << "RicApplyPropertyFilterAsCellResultFeature"; } - else if ( dynamic_cast( uiItem ) ) + else if ( dynamic_cast( firstUiItem ) ) { menuBuilder << "RicGeoMechPropertyFilterNewFeature"; } - else if ( dynamic_cast( uiItem ) ) + else if ( dynamic_cast( firstUiItem ) ) { menuBuilder << "RicGeoMechPropertyFilterInsertFeature"; menuBuilder << "RicApplyPropertyFilterAsCellResultFeature"; } - else if ( dynamic_cast( uiItem ) ) + else if ( dynamic_cast( firstUiItem ) ) { menuBuilder << "RicNewEditableWellPathFeature"; menuBuilder.addSeparator(); @@ -320,7 +325,7 @@ caf::CmdFeatureMenuBuilder RimContextCommandBuilder::commandsFromSelection() menuBuilder.subMenuEnd(); appendExportCompletions( menuBuilder ); } - else if ( dynamic_cast( uiItem ) ) + else if ( dynamic_cast( firstUiItem ) ) { menuBuilder << "RicNewEditableWellPathFeature"; menuBuilder << "RicNewWellPathIntersectionFeature"; @@ -351,12 +356,12 @@ caf::CmdFeatureMenuBuilder RimContextCommandBuilder::commandsFromSelection() menuBuilder.addSeparator(); - if ( dynamic_cast( uiItem ) ) + if ( dynamic_cast( firstUiItem ) ) { menuBuilder << "RicShowWellPlanFeature"; } } - else if ( dynamic_cast( uiItem ) ) + else if ( dynamic_cast( firstUiItem ) ) { menuBuilder.subMenuStart( "Create Completions", QIcon( ":/CompletionsSymbol16x16.png" ) ); menuBuilder << "RicNewPerforationIntervalFeature"; @@ -367,39 +372,43 @@ caf::CmdFeatureMenuBuilder RimContextCommandBuilder::commandsFromSelection() menuBuilder.addSeparator(); appendExportCompletions( menuBuilder ); } - else if ( dynamic_cast( uiItem ) || dynamic_cast( uiItem ) ) + else if ( dynamic_cast( firstUiItem ) || + dynamic_cast( firstUiItem ) ) { menuBuilder << "RicNewPerforationIntervalFeature"; - if ( dynamic_cast( uiItem ) ) menuBuilder << "RicNewValveFeature"; + if ( dynamic_cast( firstUiItem ) ) menuBuilder << "RicNewValveFeature"; menuBuilder.addSeparator(); menuBuilder << "RicEditPerforationCollectionFeature"; menuBuilder.addSeparator(); appendExportCompletions( menuBuilder ); } - else if ( dynamic_cast( uiItem ) || dynamic_cast( uiItem ) || - dynamic_cast( uiItem ) ) + else if ( dynamic_cast( firstUiItem ) || + dynamic_cast( firstUiItem ) || + dynamic_cast( firstUiItem ) ) { menuBuilder << "RicNewFishbonesSubsFeature"; appendExportCompletions( menuBuilder ); } - else if ( dynamic_cast( uiItem ) || dynamic_cast( uiItem ) ) + else if ( dynamic_cast( firstUiItem ) || + dynamic_cast( firstUiItem ) ) { menuBuilder << "RicNewWellPathFractureFeature"; appendExportCompletions( menuBuilder ); } - else if ( dynamic_cast( uiItem ) ) + else if ( dynamic_cast( firstUiItem ) ) { menuBuilder << "RicDeleteWellPathAttributeFeature"; } - else if ( dynamic_cast( uiItem ) || - dynamic_cast( uiItem ) || - dynamic_cast( uiItem ) || dynamic_cast( uiItem ) ) + else if ( dynamic_cast( firstUiItem ) || + dynamic_cast( firstUiItem ) || + dynamic_cast( firstUiItem ) || + dynamic_cast( firstUiItem ) ) { menuBuilder << "RicAdd3dWellLogCurveFeature"; menuBuilder << "RicAdd3dWellLogFileCurveFeature"; menuBuilder << "RicAdd3dWellLogRftCurveFeature"; } - else if ( dynamic_cast( uiItem ) ) + else if ( dynamic_cast( firstUiItem ) ) { menuBuilder << "RicWellPathsImportFileFeature"; menuBuilder << "RicWellLogsImportFileFeature"; @@ -422,15 +431,15 @@ caf::CmdFeatureMenuBuilder RimContextCommandBuilder::commandsFromSelection() } menuBuilder.subMenuEnd(); } - else if ( dynamic_cast( uiItem ) ) + else if ( dynamic_cast( firstUiItem ) ) { menuBuilder << "RicDeleteRftPlotFeature"; } - else if ( dynamic_cast( uiItem ) ) + else if ( dynamic_cast( firstUiItem ) ) { menuBuilder << "RicDeletePltPlotFeature"; } - else if ( dynamic_cast( uiItem ) ) + else if ( dynamic_cast( firstUiItem ) ) { menuBuilder << "RicEditScriptFeature"; menuBuilder << "Separator"; @@ -441,7 +450,7 @@ caf::CmdFeatureMenuBuilder RimContextCommandBuilder::commandsFromSelection() menuBuilder << "Separator"; menuBuilder << "RicExecuteScriptFeature"; } - else if ( dynamic_cast( uiItem ) ) + else if ( dynamic_cast( firstUiItem ) ) { menuBuilder << "RicNewOctaveScriptFeature"; #ifdef ENABLE_GRPC @@ -453,32 +462,32 @@ caf::CmdFeatureMenuBuilder RimContextCommandBuilder::commandsFromSelection() menuBuilder << "Separator"; menuBuilder << "RicDeleteScriptPathFeature"; } - else if ( dynamic_cast( uiItem ) ) + else if ( dynamic_cast( firstUiItem ) ) { menuBuilder << "RicShowAllLinkedViewsFeature"; } - else if ( dynamic_cast( uiItem ) || dynamic_cast( uiItem ) ) + else if ( dynamic_cast( firstUiItem ) || dynamic_cast( firstUiItem ) ) { menuBuilder << "RicShowAllLinkedViewsFeature"; menuBuilder << "Separator"; menuBuilder << "RicDeleteAllLinkedViewsFeature"; } - else if ( dynamic_cast( uiItem ) ) + else if ( dynamic_cast( firstUiItem ) ) { menuBuilder << "RicPasteWellLogPlotFeature"; menuBuilder << "Separator"; menuBuilder << "RicNewWellLogPlotFeature"; menuBuilder << "RicNewWellBoreStabilityPlotFeature"; } - else if ( dynamic_cast( uiItem ) ) + else if ( dynamic_cast( firstUiItem ) ) { menuBuilder << "RicNewRftPlotFeature"; } - else if ( dynamic_cast( uiItem ) ) + else if ( dynamic_cast( firstUiItem ) ) { menuBuilder << "RicNewPltPlotFeature"; } - else if ( dynamic_cast( uiItem ) ) + else if ( dynamic_cast( firstUiItem ) ) { menuBuilder << "RicPasteSummaryPlotFeature"; menuBuilder << "RicPasteAsciiDataToSummaryPlotFeature"; @@ -488,13 +497,13 @@ caf::CmdFeatureMenuBuilder RimContextCommandBuilder::commandsFromSelection() menuBuilder << "Separator"; menuBuilder << "RicShowSummaryCurveCalculatorFeature"; } - else if ( dynamic_cast( uiItem ) ) + else if ( dynamic_cast( firstUiItem ) ) { menuBuilder << "RicPasteSummaryCrossPlotFeature"; menuBuilder << "Separator"; menuBuilder << "RicNewSummaryCrossPlotFeature"; } - else if ( dynamic_cast( uiItem ) ) + else if ( dynamic_cast( firstUiItem ) ) { menuBuilder << "RicPasteWellLogPlotFeature"; menuBuilder << "RicPasteWellLogTrackFeature"; @@ -502,7 +511,7 @@ caf::CmdFeatureMenuBuilder RimContextCommandBuilder::commandsFromSelection() menuBuilder << "RicNewWellLogPlotTrackFeature"; menuBuilder << "RicAsciiExportWellLogPlotFeature"; } - else if ( dynamic_cast( uiItem ) ) + else if ( dynamic_cast( firstUiItem ) ) { menuBuilder << "RicPasteWellLogTrackFeature"; menuBuilder << "RicPasteWellLogCurveFeature"; @@ -513,34 +522,34 @@ caf::CmdFeatureMenuBuilder RimContextCommandBuilder::commandsFromSelection() menuBuilder << "Separator"; menuBuilder << "RicDeleteSubPlotFeature"; } - else if ( dynamic_cast( uiItem ) ) + else if ( dynamic_cast( firstUiItem ) ) { menuBuilder << "RicPasteWellLogCurveFeature"; } - else if ( dynamic_cast( uiItem ) ) + else if ( dynamic_cast( firstUiItem ) ) { menuBuilder << "RicCreateGridCrossPlotFeature"; } - else if ( dynamic_cast( uiItem ) ) + else if ( dynamic_cast( firstUiItem ) ) { menuBuilder << "RicCreateSaturationPressurePlotsFeature"; } - else if ( dynamic_cast( uiItem ) ) + else if ( dynamic_cast( firstUiItem ) ) { menuBuilder << "RicPasteGridCrossPlotDataSetFeature"; menuBuilder << "Separator"; menuBuilder << "RicCreateGridCrossPlotDataSetFeature"; menuBuilder << "RicSwapGridCrossPlotDataSetAxesFeature"; } - else if ( dynamic_cast( uiItem ) ) + else if ( dynamic_cast( firstUiItem ) ) { menuBuilder << "RicPasteGridCrossPlotDataSetFeature"; menuBuilder << "Separator"; menuBuilder << "RicSwapGridCrossPlotDataSetAxesFeature"; } - else if ( dynamic_cast( uiItem ) ) // This is also the definition for RimSummaryCrossPlot + else if ( dynamic_cast( firstUiItem ) ) // This is also the definition for RimSummaryCrossPlot { - RimSummaryCrossPlot* summaryCrossPlot = dynamic_cast( uiItem ); + RimSummaryCrossPlot* summaryCrossPlot = dynamic_cast( firstUiItem ); menuBuilder << "RicPasteSummaryCurveFeature"; menuBuilder << "RicPasteSummaryCrossPlotCurveFeature"; @@ -567,7 +576,7 @@ caf::CmdFeatureMenuBuilder RimContextCommandBuilder::commandsFromSelection() menuBuilder << "Separator"; menuBuilder << "RicDeleteSubPlotFeature"; } - else if ( dynamic_cast( uiItem ) ) + else if ( dynamic_cast( firstUiItem ) ) { menuBuilder << "RicPasteSummaryCurveFeature"; menuBuilder << "RicPasteSummaryCrossPlotCurveFeature"; @@ -585,7 +594,7 @@ caf::CmdFeatureMenuBuilder RimContextCommandBuilder::commandsFromSelection() menuBuilder << "Separator"; menuBuilder << "RicEditSummaryCurveCalculationFeature"; } - else if ( dynamic_cast( uiItem ) ) + else if ( dynamic_cast( firstUiItem ) ) { menuBuilder << "RicPasteSummaryCurveFeature"; menuBuilder << "RicPasteSummaryCrossPlotCurveFeature"; @@ -594,23 +603,23 @@ caf::CmdFeatureMenuBuilder RimContextCommandBuilder::commandsFromSelection() menuBuilder << "RicNewSummaryCurveFeature"; menuBuilder << "RicNewSummaryCrossPlotCurveFeature"; } - else if ( dynamic_cast( uiItem ) ) + else if ( dynamic_cast( firstUiItem ) ) { menuBuilder << "RicNewSummaryEnsembleCurveSetFeature"; menuBuilder << "RicPasteEnsembleCurveSetFeature"; } - else if ( dynamic_cast( uiItem ) ) + else if ( dynamic_cast( firstUiItem ) ) { menuBuilder << "RicNewSummaryEnsembleCurveSetFeature"; menuBuilder << "Separator"; menuBuilder << "RicSetSourceSteppingEnsembleCurveSetFeature"; menuBuilder << "RicClearSourceSteppingEnsembleCurveSetFeature"; } - else if ( dynamic_cast( uiItem ) ) + else if ( dynamic_cast( firstUiItem ) ) { menuBuilder << "RicNewEnsembleCurveFilterFeature"; } - else if ( dynamic_cast( uiItem ) ) + else if ( dynamic_cast( firstUiItem ) ) { menuBuilder << "RicImportSummaryCaseFeature"; menuBuilder << "RicImportSummaryCasesFeature"; @@ -618,7 +627,7 @@ caf::CmdFeatureMenuBuilder RimContextCommandBuilder::commandsFromSelection() menuBuilder << "RicImportEnsembleFeature"; menuBuilder << "RicNewDerivedEnsembleFeature"; } - else if ( dynamic_cast( uiItem ) ) + else if ( dynamic_cast( firstUiItem ) ) { menuBuilder.subMenuStart( "Import" ); menuBuilder << "RicImportSummaryCaseFeature"; @@ -635,7 +644,7 @@ caf::CmdFeatureMenuBuilder RimContextCommandBuilder::commandsFromSelection() menuBuilder << "RicConvertGroupToEnsembleFeature"; menuBuilder.addSeparator(); } - else if ( dynamic_cast( uiItem ) ) + else if ( dynamic_cast( firstUiItem ) ) { menuBuilder.subMenuStart( "Import" ); menuBuilder << "RicImportSummaryCaseFeature"; @@ -649,17 +658,17 @@ caf::CmdFeatureMenuBuilder RimContextCommandBuilder::commandsFromSelection() menuBuilder << "RicNewSummaryCrossPlotFeature"; menuBuilder.addSeparator(); - if ( !dynamic_cast( uiItem ) ) + if ( !dynamic_cast( firstUiItem ) ) { menuBuilder << "RicShowSummaryCurveCalculatorFeature"; // menuBuilder << "RicNewSummaryPlotFeature"; } } - else if ( dynamic_cast( uiItem ) ) + else if ( dynamic_cast( firstUiItem ) ) { menuBuilder << "RicAddWellLogToPlotFeature"; } - else if ( dynamic_cast( uiItem ) ) + else if ( dynamic_cast( firstUiItem ) ) { menuBuilder << "RicPasteIntersectionsFeature"; menuBuilder.addSeparator(); @@ -668,7 +677,7 @@ caf::CmdFeatureMenuBuilder RimContextCommandBuilder::commandsFromSelection() menuBuilder.addSeparator(); menuBuilder << "RicCopyIntersectionsToAllViewsInCaseFeature"; } - else if ( dynamic_cast( uiItem ) ) + else if ( dynamic_cast( firstUiItem ) ) { menuBuilder << "RicPasteIntersectionsFeature"; menuBuilder.addSeparator(); @@ -679,7 +688,7 @@ caf::CmdFeatureMenuBuilder RimContextCommandBuilder::commandsFromSelection() menuBuilder.addSeparator(); menuBuilder << "RicCopyIntersectionsToAllViewsInCaseFeature"; } - else if ( dynamic_cast( uiItem ) ) + else if ( dynamic_cast( firstUiItem ) ) { menuBuilder << "RicPasteIntersectionsFeature"; menuBuilder.addSeparator(); @@ -688,7 +697,7 @@ caf::CmdFeatureMenuBuilder RimContextCommandBuilder::commandsFromSelection() menuBuilder.addSeparator(); menuBuilder << "RicCopyIntersectionsToAllViewsInCaseFeature"; } - else if ( dynamic_cast( uiItem ) ) + else if ( dynamic_cast( firstUiItem ) ) { menuBuilder << "RicNewWellLogCurveExtractionFeature"; menuBuilder << "RicNewWellLogRftCurveFeature"; @@ -704,58 +713,58 @@ caf::CmdFeatureMenuBuilder RimContextCommandBuilder::commandsFromSelection() menuBuilder << "RicExportCompletionsForVisibleSimWellsFeature"; } - else if ( dynamic_cast( uiItem ) ) + else if ( dynamic_cast( firstUiItem ) ) { menuBuilder << "RicExportCompletionsForVisibleSimWellsFeature"; } - else if ( dynamic_cast( uiItem ) ) + else if ( dynamic_cast( firstUiItem ) ) { menuBuilder << "RicImportFormationNamesFeature"; menuBuilder << "RicReloadFormationNamesFeature"; } - else if ( dynamic_cast( uiItem ) ) + else if ( dynamic_cast( firstUiItem ) ) { menuBuilder << "RicImportFormationNamesFeature"; menuBuilder << "Separator"; menuBuilder << "RicReloadFormationNamesFeature"; } - else if ( dynamic_cast( uiItem ) ) + else if ( dynamic_cast( firstUiItem ) ) { menuBuilder << "RicExportFaultsFeature"; } - else if ( dynamic_cast( uiItem ) ) + else if ( dynamic_cast( firstUiItem ) ) { menuBuilder << "RicAddStoredWellAllocationPlotFeature"; } - else if ( dynamic_cast( uiItem ) ) + else if ( dynamic_cast( firstUiItem ) ) { menuBuilder << "RicAddStoredFlowCharacteristicsPlotFeature"; } - else if ( dynamic_cast( uiItem ) ) + else if ( dynamic_cast( firstUiItem ) ) { menuBuilder << "RicShowFlowCharacteristicsPlotFeature"; } - else if ( dynamic_cast( uiItem ) ) + else if ( dynamic_cast( firstUiItem ) ) { menuBuilder << "RicShowFlowCharacteristicsPlotFeature"; } - else if ( dynamic_cast( uiItem ) ) + else if ( dynamic_cast( firstUiItem ) ) { menuBuilder << "RicShowGridStatisticsFeature"; } - else if ( dynamic_cast( uiItem ) ) + else if ( dynamic_cast( firstUiItem ) ) { menuBuilder << "RicNewSimWellFractureFeature"; } - else if ( dynamic_cast( uiItem ) ) + else if ( dynamic_cast( firstUiItem ) ) { menuBuilder << "RicNewValveTemplateFeature"; } - else if ( dynamic_cast( uiItem ) ) + else if ( dynamic_cast( firstUiItem ) ) { menuBuilder << "RicDeleteValveTemplateFeature"; } - else if ( dynamic_cast( uiItem ) ) + else if ( dynamic_cast( firstUiItem ) ) { menuBuilder << "RicPasteEllipseFractureFeature"; menuBuilder << "RicPasteStimPlanFractureFeature"; @@ -766,7 +775,7 @@ caf::CmdFeatureMenuBuilder RimContextCommandBuilder::commandsFromSelection() menuBuilder << "RicConvertAllFractureTemplatesToMetricFeature"; menuBuilder << "RicConvertAllFractureTemplatesToFieldFeature"; } - else if ( dynamic_cast( uiItem ) ) + else if ( dynamic_cast( firstUiItem ) ) { menuBuilder << "RicPasteStimPlanFractureFeature"; menuBuilder << "RicPasteEllipseFractureFeature"; @@ -776,7 +785,7 @@ caf::CmdFeatureMenuBuilder RimContextCommandBuilder::commandsFromSelection() menuBuilder << "Separator"; menuBuilder << "RicConvertFractureTemplateUnitFeature"; } - else if ( dynamic_cast( uiItem ) ) + else if ( dynamic_cast( firstUiItem ) ) { menuBuilder << "RicPasteEllipseFractureFeature"; menuBuilder << "RicPasteStimPlanFractureFeature"; @@ -786,23 +795,24 @@ caf::CmdFeatureMenuBuilder RimContextCommandBuilder::commandsFromSelection() menuBuilder << "Separator"; menuBuilder << "RicConvertFractureTemplateUnitFeature"; } - else if ( dynamic_cast( uiItem ) || - dynamic_cast( uiItem ) ) + else if ( dynamic_cast( firstUiItem ) || + dynamic_cast( firstUiItem ) ) { menuBuilder << "RicCreateTextAnnotationFeature"; menuBuilder << "RicCreateReachCircleAnnotationFeature"; menuBuilder << "RicCreateUserDefinedPolylinesAnnotationFeature"; menuBuilder << "RicImportPolylinesAnnotationFeature"; } - else if ( dynamic_cast( uiItem ) ) + else if ( dynamic_cast( firstUiItem ) ) { menuBuilder << "RicCreateTextAnnotationFeature"; } - else if ( dynamic_cast( uiItem ) || dynamic_cast( uiItem ) ) + else if ( dynamic_cast( firstUiItem ) || + dynamic_cast( firstUiItem ) ) { menuBuilder << "RicReloadPlotTemplatesFeature"; } - if ( dynamic_cast( uiItem ) ) + if ( dynamic_cast( firstUiItem ) ) { menuBuilder << "Separator"; menuBuilder << "RicLinkVisibleViewsFeature"; @@ -812,7 +822,7 @@ caf::CmdFeatureMenuBuilder RimContextCommandBuilder::commandsFromSelection() } } - if ( uiItems.size() > 0 ) + if ( firstUiItem ) { // Work in progress -- Start // All commands should be aware of selection of multiple objects @@ -821,8 +831,6 @@ caf::CmdFeatureMenuBuilder RimContextCommandBuilder::commandsFromSelection() // is aware of multiple selected items, move the command to this list // without using dyncamic_cast. - caf::PdmUiItem* uiItem = uiItems[0]; - menuBuilder << "RicPasteTimeHistoryCurveFeature"; menuBuilder << "RicPasteAsciiDataCurveFeature"; menuBuilder << "RicPasteSummaryCaseFeature"; @@ -854,7 +862,7 @@ caf::CmdFeatureMenuBuilder RimContextCommandBuilder::commandsFromSelection() menuBuilder << "RicCutReferencesToClipboardFeature"; menuBuilder << "Separator"; - if ( dynamic_cast( uiItem ) || dynamic_cast( uiItem ) ) + if ( dynamic_cast( firstUiItem ) || dynamic_cast( firstUiItem ) ) { menuBuilder << "RicCreatePlotFromSelectionFeature"; menuBuilder << "RicCreatePlotFromTemplateByShortcutFeature"; @@ -878,15 +886,15 @@ caf::CmdFeatureMenuBuilder RimContextCommandBuilder::commandsFromSelection() menuBuilder.addSeparator(); } - if ( dynamic_cast( uiItem ) ) + if ( dynamic_cast( firstUiItem ) ) { menuBuilder << "RicAddWellLogToPlotFeature"; } - else if ( dynamic_cast( uiItem ) ) + else if ( dynamic_cast( firstUiItem ) ) { createExecuteScriptForCasesFeatureMenu( menuBuilder ); } - else if ( dynamic_cast( uiItem ) ) + else if ( dynamic_cast( firstUiItem ) ) { menuBuilder << "RicAddEclipseInputPropertyFeature"; menuBuilder << "RicReloadCaseFeature"; @@ -894,34 +902,34 @@ caf::CmdFeatureMenuBuilder RimContextCommandBuilder::commandsFromSelection() createExecuteScriptForCasesFeatureMenu( menuBuilder ); menuBuilder << "RicCloseSourSimDataFeature"; } - else if ( dynamic_cast( uiItem ) ) + else if ( dynamic_cast( firstUiItem ) ) { - RimSummaryCrossPlot* summaryCrossPlot = dynamic_cast( uiItem ); + RimSummaryCrossPlot* summaryCrossPlot = dynamic_cast( firstUiItem ); if ( !summaryCrossPlot ) { menuBuilder << "RicAsciiExportSummaryPlotFeature"; } } - else if ( dynamic_cast( uiItem ) ) + else if ( dynamic_cast( firstUiItem ) ) { menuBuilder << "RicAsciiExportWellLogPlotFeature"; menuBuilder << "RicExportToLasFileFeature"; menuBuilder << "RicChangeDataSourceFeature"; } - else if ( dynamic_cast( uiItem ) || dynamic_cast( uiItem ) ) + else if ( dynamic_cast( firstUiItem ) || dynamic_cast( firstUiItem ) ) { menuBuilder << "RicExportToLasFileFeature"; menuBuilder << "RicChangeDataSourceFeature"; } - else if ( dynamic_cast( uiItem ) ) + else if ( dynamic_cast( firstUiItem ) ) { menuBuilder << "RicExportToLasFileFeature"; } - else if ( dynamic_cast( uiItem ) ) + else if ( dynamic_cast( firstUiItem ) ) { menuBuilder << "RicExportFaultsFeature"; } - else if ( dynamic_cast( uiItem ) ) + else if ( dynamic_cast( firstUiItem ) ) { menuBuilder << "RicShowContributingWellsFeature"; menuBuilder << "Separator"; @@ -940,28 +948,30 @@ caf::CmdFeatureMenuBuilder RimContextCommandBuilder::commandsFromSelection() { bool toggleCommandCandidate = true; + + if ( firstUiItem ) { - if ( dynamic_cast( uiItems[0] ) ) + if ( dynamic_cast( firstUiItem ) ) { toggleCommandCandidate = false; } - else if ( dynamic_cast( uiItems[0] ) ) + else if ( dynamic_cast( firstUiItem ) ) { toggleCommandCandidate = false; } - else if ( dynamic_cast( uiItems[0] ) ) + else if ( dynamic_cast( firstUiItem ) ) { toggleCommandCandidate = false; } - else if ( dynamic_cast( uiItems[0] ) ) + else if ( dynamic_cast( firstUiItem ) ) { toggleCommandCandidate = false; } - else if ( dynamic_cast( uiItems[0] ) ) + else if ( dynamic_cast( firstUiItem ) ) { toggleCommandCandidate = false; } - else if ( dynamic_cast( uiItems[0] ) ) + else if ( dynamic_cast( firstUiItem ) ) { toggleCommandCandidate = false; } @@ -983,7 +993,7 @@ caf::CmdFeatureMenuBuilder RimContextCommandBuilder::commandsFromSelection() menuBuilder.addSeparator(); } - if ( dynamic_cast( uiItems[0] ) == nullptr ) + if ( dynamic_cast( firstUiItem ) == nullptr ) { menuBuilder << "RicToggleItemsOnOthersOffFeature"; } From dedb437ce52413990abf6ecdd73400679f1131d4 Mon Sep 17 00:00:00 2001 From: Gaute Lindkvist Date: Wed, 27 Nov 2019 11:22:34 +0100 Subject: [PATCH 27/50] #5051 Fix Well Log Plot zoom with scrolling with scrollbar --- ApplicationCode/ProjectDataModel/RimWellLogPlot.cpp | 9 +++++++++ ApplicationCode/ProjectDataModel/RimWellLogPlot.h | 1 + ApplicationCode/UserInterface/RiuWellLogPlot.cpp | 2 +- 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/ApplicationCode/ProjectDataModel/RimWellLogPlot.cpp b/ApplicationCode/ProjectDataModel/RimWellLogPlot.cpp index cef765f8ed..5dcae7214e 100644 --- a/ApplicationCode/ProjectDataModel/RimWellLogPlot.cpp +++ b/ApplicationCode/ProjectDataModel/RimWellLogPlot.cpp @@ -273,6 +273,15 @@ void RimWellLogPlot::availableDepthRange( double* minimumDepth, double* maximumD *maximumDepth = m_maxAvailableDepth; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimWellLogPlot::visibleDepthRange( double* minimumDepth, double* maximumDepth ) const +{ + *minimumDepth = m_minVisibleDepth; + *maximumDepth = m_maxVisibleDepth; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationCode/ProjectDataModel/RimWellLogPlot.h b/ApplicationCode/ProjectDataModel/RimWellLogPlot.h index 2bb1dee06e..938fced17d 100644 --- a/ApplicationCode/ProjectDataModel/RimWellLogPlot.h +++ b/ApplicationCode/ProjectDataModel/RimWellLogPlot.h @@ -85,6 +85,7 @@ public: void calculateAvailableDepthRange(); void availableDepthRange( double* minimumDepth, double* maximumDepth ) const; + void visibleDepthRange( double* minimumDepth, double* maximumDepth ) const; void setAutoScaleYEnabled( bool enabled ) override; void enableAllAutoNameTags( bool enable ); diff --git a/ApplicationCode/UserInterface/RiuWellLogPlot.cpp b/ApplicationCode/UserInterface/RiuWellLogPlot.cpp index 627bb32a11..77023ffc2c 100644 --- a/ApplicationCode/UserInterface/RiuWellLogPlot.cpp +++ b/ApplicationCode/UserInterface/RiuWellLogPlot.cpp @@ -119,7 +119,7 @@ void RiuWellLogPlot::slotSetMinDepth( int value ) { double minimumDepth; double maximumDepth; - wellLogPlotDefinition()->availableDepthRange( &minimumDepth, &maximumDepth ); + wellLogPlotDefinition()->visibleDepthRange( &minimumDepth, &maximumDepth ); double delta = value - minimumDepth; wellLogPlotDefinition()->setDepthAxisRange( minimumDepth + delta, maximumDepth + delta ); From 1267ba64d487c34550b066d4ebcfa668b4ae8d51 Mon Sep 17 00:00:00 2001 From: Gaute Lindkvist Date: Wed, 27 Nov 2019 14:03:20 +0100 Subject: [PATCH 28/50] #5051 Do not auto zoom when adding/removing curves in plot --- ApplicationCode/ProjectDataModel/RimPlotCurve.cpp | 13 ++++--------- ApplicationCode/ProjectDataModel/RimPlotCurve.h | 2 +- .../Summary/RimEnsembleCurveSet.cpp | 4 ++-- ApplicationCode/UserInterface/RiuSummaryQwtPlot.cpp | 2 ++ 4 files changed, 9 insertions(+), 12 deletions(-) diff --git a/ApplicationCode/ProjectDataModel/RimPlotCurve.cpp b/ApplicationCode/ProjectDataModel/RimPlotCurve.cpp index 95ed87052f..1645919324 100644 --- a/ApplicationCode/ProjectDataModel/RimPlotCurve.cpp +++ b/ApplicationCode/ProjectDataModel/RimPlotCurve.cpp @@ -197,8 +197,8 @@ void RimPlotCurve::fieldChangedByUi( const caf::PdmFieldHandle* changedField, { if ( changedField == &m_showCurve ) { - this->updateCurveVisibility( true ); - if ( m_showCurve() ) loadDataAndUpdate( true ); + this->updateCurveVisibility(); + if ( m_showCurve() ) loadDataAndUpdate( false ); } else if ( changedField == &m_curveName ) { @@ -284,7 +284,7 @@ void RimPlotCurve::setLegendEntryText( const QString& legendEntryText ) //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void RimPlotCurve::updateCurveVisibility( bool updateParentPlot ) +void RimPlotCurve::updateCurveVisibility() { if ( canCurveBeAttached() ) { @@ -295,11 +295,6 @@ void RimPlotCurve::updateCurveVisibility( bool updateParentPlot ) m_qwtPlotCurve->detach(); m_qwtCurveErrorBars->detach(); } - - if ( updateParentPlot ) - { - updateZoomInParentPlot(); - } } //-------------------------------------------------------------------------------------------------- @@ -318,7 +313,7 @@ void RimPlotCurve::initAfterRead() //-------------------------------------------------------------------------------------------------- void RimPlotCurve::updateCurvePresentation( bool updatePlotLegendAndTitle ) { - this->updateCurveVisibility( updatePlotLegendAndTitle ); + this->updateCurveVisibility(); if ( updatePlotLegendAndTitle ) { diff --git a/ApplicationCode/ProjectDataModel/RimPlotCurve.h b/ApplicationCode/ProjectDataModel/RimPlotCurve.h index d4696ccf87..6fb5cf0d96 100644 --- a/ApplicationCode/ProjectDataModel/RimPlotCurve.h +++ b/ApplicationCode/ProjectDataModel/RimPlotCurve.h @@ -100,7 +100,7 @@ public: QString legendEntryText() const; void setLegendEntryText( const QString& legendEntryText ); - void updateCurveVisibility( bool updateParentPlot ); + void updateCurveVisibility(); void updateLegendEntryVisibilityAndPlotLegend(); void updateLegendEntryVisibilityNoPlotUpdate(); diff --git a/ApplicationCode/ProjectDataModel/Summary/RimEnsembleCurveSet.cpp b/ApplicationCode/ProjectDataModel/Summary/RimEnsembleCurveSet.cpp index 81faa8ffaa..a7396418cd 100644 --- a/ApplicationCode/ProjectDataModel/Summary/RimEnsembleCurveSet.cpp +++ b/ApplicationCode/ProjectDataModel/Summary/RimEnsembleCurveSet.cpp @@ -1007,7 +1007,7 @@ void RimEnsembleCurveSet::updateEnsembleCurves( const std::vectorupdateCurveVisibility( false ); + curve->updateCurveVisibility(); curve->loadDataAndUpdate( false ); curve->updateQwtPlotAxis(); @@ -1104,7 +1104,7 @@ void RimEnsembleCurveSet::updateStatisticsCurves( const std::vectorsetSummaryAddressYAndApplyInterpolation( address ); curve->setLeftOrRightAxisY( m_plotAxis() ); - curve->updateCurveVisibility( false ); + curve->updateCurveVisibility(); curve->loadDataAndUpdate( false ); curve->updateQwtPlotAxis(); } diff --git a/ApplicationCode/UserInterface/RiuSummaryQwtPlot.cpp b/ApplicationCode/UserInterface/RiuSummaryQwtPlot.cpp index 6bca64d47e..96097c5b79 100644 --- a/ApplicationCode/UserInterface/RiuSummaryQwtPlot.cpp +++ b/ApplicationCode/UserInterface/RiuSummaryQwtPlot.cpp @@ -316,6 +316,8 @@ void RiuSummaryQwtPlot::endZoomOperations() //-------------------------------------------------------------------------------------------------- void RiuSummaryQwtPlot::onZoomedSlot() { + plotDefinition()->setAutoScaleXEnabled( false ); + plotDefinition()->setAutoScaleYEnabled( false ); plotDefinition()->updateZoomFromQwt(); } From e31f2d2b5036a47bb0298ff6f264694fe990b0b4 Mon Sep 17 00:00:00 2001 From: Gaute Lindkvist Date: Wed, 27 Nov 2019 14:03:35 +0100 Subject: [PATCH 29/50] Remove VS 2019 warnings --- ApplicationCode/CMakeLists.txt | 3 ++- .../UnitTests/RiaProjectFileVersionTools-Test.cpp | 6 +++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/ApplicationCode/CMakeLists.txt b/ApplicationCode/CMakeLists.txt index a55d4df86a..5d9401515d 100644 --- a/ApplicationCode/CMakeLists.txt +++ b/ApplicationCode/CMakeLists.txt @@ -379,11 +379,12 @@ add_executable( ResInsight ${EXE_FILES}) if (MSVC) # The following warnings are supposed to be used in ResInsight, but temporarily disabled to avoid too much noise # warning C4245: 'return': conversion from 'int' to 'size_t', signed/unsigned mismatch + # warning C4005: Macro redefinition for math constants (M_PI, M_SQRT2 etc) # If possible, the following command is supposed to be the final target # set_target_properties(ResInsight PROPERTIES COMPILE_FLAGS "/W4 /wd4190 /wd4100 /wd4127") - set_target_properties(ResInsight PROPERTIES COMPILE_FLAGS "/W4 /wd4190 /wd4100 /wd4127 /wd4245") + set_target_properties(ResInsight PROPERTIES COMPILE_FLAGS "/W4 /wd4190 /wd4100 /wd4127 /wd4245 /wd4005") if (CMAKE_CXX_COMPILER_VERSION LESS_EQUAL 19.14) # The following warning is generated over 800 times from a qwt header only using VS2015 # Disabling temporarily diff --git a/ApplicationCode/UnitTests/RiaProjectFileVersionTools-Test.cpp b/ApplicationCode/UnitTests/RiaProjectFileVersionTools-Test.cpp index 1aecbc15ab..43a175455e 100644 --- a/ApplicationCode/UnitTests/RiaProjectFileVersionTools-Test.cpp +++ b/ApplicationCode/UnitTests/RiaProjectFileVersionTools-Test.cpp @@ -157,9 +157,9 @@ TEST( RiaProjectFileVersionTools, OrderKnownVersionStrings ) QStringList sortedVersionList = versionStrings; { - qSort( sortedVersionList.begin(), - sortedVersionList.end(), - RiaProjectFileVersionTools::isCandidateVersionNewerThanOther ); + std::sort( sortedVersionList.begin(), + sortedVersionList.end(), + RiaProjectFileVersionTools::isCandidateVersionNewerThanOther ); } /* From 602751dccc72b6eb2d389a58631a3c04ddae3870 Mon Sep 17 00:00:00 2001 From: Gaute Lindkvist Date: Fri, 29 Nov 2019 10:02:34 +0100 Subject: [PATCH 30/50] #5129 Fix depth ranges when curve units don't match display units --- .../Flow/RimWellFlowRateCurve.cpp | 11 +++--- .../ProjectDataModel/RimWellLogCurve.cpp | 35 ++++--------------- .../ProjectDataModel/RimWellLogCurve.h | 9 ++--- .../ReservoirDataModel/RigLasFileExporter.cpp | 2 +- .../RigWellLogCurveData.cpp | 11 +++--- .../ReservoirDataModel/RigWellLogCurveData.h | 5 ++- 6 files changed, 28 insertions(+), 45 deletions(-) diff --git a/ApplicationCode/ProjectDataModel/Flow/RimWellFlowRateCurve.cpp b/ApplicationCode/ProjectDataModel/Flow/RimWellFlowRateCurve.cpp index df4ab24312..410ba406e1 100644 --- a/ApplicationCode/ProjectDataModel/Flow/RimWellFlowRateCurve.cpp +++ b/ApplicationCode/ProjectDataModel/Flow/RimWellFlowRateCurve.cpp @@ -246,13 +246,16 @@ void RimWellFlowRateCurve::updateStackedPlotData() bool isFirstTrack = ( wellLogTrack == wellLogPlot->plotByIndex( 0 ) ); RimWellLogPlot::DepthTypeEnum depthType = wellLogPlot->depthType(); - RiaDefines::DepthUnitType displayUnit = RiaDefines::UNIT_NONE; + RiaDefines::DepthUnitType displayUnit = wellLogPlot->depthUnit(); + if ( depthType == RiaDefines::CONNECTION_NUMBER ) + { + displayUnit = RiaDefines::UNIT_NONE; + } std::vector depthValues; std::vector stackedValues; std::vector> polyLineStartStopIndices; - double zPos = -10000.0 + - 100 * groupId(); // Z-position of curve, to draw them in correct order hiding the things behind + double zPos = -10000.0 + 100 * groupId(); // Z-position of curve, to draw them in correct order // Starting way behind the grid (z == 0) at -10000 giving room for 100 groups with 100 curves each before getting above the grid { std::map> stackedCurveGroups = wellLogTrack->visibleStackedCurves(); @@ -284,7 +287,7 @@ void RimWellFlowRateCurve::updateStackedPlotData() } RigWellLogCurveData tempCurveData; - tempCurveData.setValuesAndDepths( allStackedValues, allDepthValues, depthType, RiaDefines::UNIT_NONE, false ); + tempCurveData.setValuesAndDepths( allStackedValues, allDepthValues, depthType, displayUnit, false ); depthValues = tempCurveData.depthPlotValues( depthType, displayUnit ); stackedValues = tempCurveData.xPlotValues(); diff --git a/ApplicationCode/ProjectDataModel/RimWellLogCurve.cpp b/ApplicationCode/ProjectDataModel/RimWellLogCurve.cpp index 56e1ffdb47..140de1aae4 100644 --- a/ApplicationCode/ProjectDataModel/RimWellLogCurve.cpp +++ b/ApplicationCode/ProjectDataModel/RimWellLogCurve.cpp @@ -99,22 +99,10 @@ bool RimWellLogCurve::yValueRangeInData( double* minimumValue, double* maximumVa RimWellLogPlot* wellLogPlot = nullptr; firstAncestorOrThisOfTypeAsserted( wellLogPlot ); + auto depthType = wellLogPlot->depthType(); + auto displayUnit = wellLogPlot->depthUnit(); - auto depthRangeIt = m_curveDataDepthRange.find( wellLogPlot->depthType() ); - if ( depthRangeIt == m_curveDataDepthRange.end() ) - { - return false; - } - - if ( depthRangeIt->second.first == -std::numeric_limits::infinity() || - depthRangeIt->second.second == std::numeric_limits::infinity() ) - { - return false; - } - *minimumValue = depthRangeIt->second.first; - *maximumValue = depthRangeIt->second.second; - - return true; + return m_curveData->calculateDepthRange( depthType, displayUnit, minimumValue, maximumValue ); } //-------------------------------------------------------------------------------------------------- @@ -127,7 +115,7 @@ void RimWellLogCurve::setValuesAndDepths( const std::vector& xValues, bool isExtractionCurve ) { m_curveData->setValuesAndDepths( xValues, measuredDepths, depthType, depthUnit, isExtractionCurve ); - calculateCurveDataRanges(); + calculateCurveDataXRange(); } //-------------------------------------------------------------------------------------------------- @@ -139,7 +127,7 @@ void RimWellLogCurve::setValuesAndDepths( const std::vector& bool isExtractionCurve ) { m_curveData->setValuesAndDepths( xValues, depths, depthUnit, isExtractionCurve ); - calculateCurveDataRanges(); + calculateCurveDataXRange(); } //-------------------------------------------------------------------------------------------------- @@ -202,22 +190,11 @@ void RimWellLogCurve::setOverrideCurveDataXRange( double minimumValue, double ma //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void RimWellLogCurve::calculateCurveDataRanges() +void RimWellLogCurve::calculateCurveDataXRange() { // Invalidate range first m_curveDataXRange = std::make_pair( std::numeric_limits::infinity(), -std::numeric_limits::infinity() ); - - for ( auto depthType : m_curveData->availableDepthTypes() ) - { - m_curveDataDepthRange[depthType] = std::make_pair( std::numeric_limits::infinity(), - -std::numeric_limits::infinity() ); - - m_curveData->calculateDepthRange( depthType, - &m_curveDataDepthRange[depthType].first, - &m_curveDataDepthRange[depthType].second ); - } - for ( double xValue : m_curveData->xValues() ) { if ( RiaCurveDataTools::isValidValue( xValue, false ) ) diff --git a/ApplicationCode/ProjectDataModel/RimWellLogCurve.h b/ApplicationCode/ProjectDataModel/RimWellLogCurve.h index b54e6de656..d5034016ed 100644 --- a/ApplicationCode/ProjectDataModel/RimWellLogCurve.h +++ b/ApplicationCode/ProjectDataModel/RimWellLogCurve.h @@ -70,12 +70,9 @@ protected: void updateZoomInParentPlot() override; void updateLegendsInPlot() override; void setOverrideCurveDataXRange( double minimumValue, double maximumValue ); + void calculateCurveDataXRange(); private: - void calculateCurveDataRanges(); - -private: - cvf::ref m_curveData; - std::pair m_curveDataXRange; - std::map> m_curveDataDepthRange; + cvf::ref m_curveData; + std::pair m_curveDataXRange; }; diff --git a/ApplicationCode/ReservoirDataModel/RigLasFileExporter.cpp b/ApplicationCode/ReservoirDataModel/RigLasFileExporter.cpp index b343fa61fb..e1d2d09e45 100644 --- a/ApplicationCode/ReservoirDataModel/RigLasFileExporter.cpp +++ b/ApplicationCode/ReservoirDataModel/RigLasFileExporter.cpp @@ -251,7 +251,7 @@ public: double minDepth = 0.0; double maxDepth = 0.0; - firstCurveData->calculateDepthRange( RiaDefines::MEASURED_DEPTH, &minDepth, &maxDepth ); + firstCurveData->calculateDepthRange( RiaDefines::MEASURED_DEPTH, firstCurveData->depthUnit(), &minDepth, &maxDepth ); lasFile->setStartDepth( minDepth ); lasFile->setStopDepth( maxDepth ); diff --git a/ApplicationCode/ReservoirDataModel/RigWellLogCurveData.cpp b/ApplicationCode/ReservoirDataModel/RigWellLogCurveData.cpp index 5ef038a91e..11aae2ea1d 100644 --- a/ApplicationCode/ReservoirDataModel/RigWellLogCurveData.cpp +++ b/ApplicationCode/ReservoirDataModel/RigWellLogCurveData.cpp @@ -326,6 +326,7 @@ void RigWellLogCurveData::splitIntervalAtEmptySpace( const std::vector& /// //-------------------------------------------------------------------------------------------------- bool RigWellLogCurveData::calculateDepthRange( RiaDefines::DepthTypeEnum depthType, + RiaDefines::DepthUnitType depthUnit, double* minimumDepth, double* maximumDepth ) const { @@ -334,9 +335,10 @@ bool RigWellLogCurveData::calculateDepthRange( RiaDefines::DepthTypeEnum depthTy double minValue = HUGE_VAL; double maxValue = -HUGE_VAL; - for ( size_t vIdx = 0; vIdx < depths( depthType ).size(); vIdx++ ) + std::vector depthValues = depthPlotValues( depthType, depthUnit ); + for ( size_t vIdx = 0; vIdx < depthValues.size(); vIdx++ ) { - double value = depths( depthType )[vIdx]; + double value = depthValues[vIdx]; if ( value < minValue ) { @@ -406,12 +408,13 @@ std::vector RigWellLogCurveData::convertDepthValues( RiaDefines::DepthUn { CVF_ASSERT( destinationDepthUnit != m_depthUnit ); - if ( destinationDepthUnit == RiaDefines::UNIT_METER ) + if ( destinationDepthUnit == RiaDefines::UNIT_METER && m_depthUnit == RiaDefines::UNIT_FEET ) { return convertFromFeetToMeter( values ); } - else + else if ( destinationDepthUnit == RiaDefines::UNIT_FEET && m_depthUnit == RiaDefines::UNIT_METER ) { return convertFromMeterToFeet( values ); } + return values; } diff --git a/ApplicationCode/ReservoirDataModel/RigWellLogCurveData.h b/ApplicationCode/ReservoirDataModel/RigWellLogCurveData.h index c47572406d..002e6699a1 100644 --- a/ApplicationCode/ReservoirDataModel/RigWellLogCurveData.h +++ b/ApplicationCode/ReservoirDataModel/RigWellLogCurveData.h @@ -54,7 +54,10 @@ public: std::set availableDepthTypes() const; - bool calculateDepthRange( RiaDefines::DepthTypeEnum depthType, double* minMD, double* maxMD ) const; + bool calculateDepthRange( RiaDefines::DepthTypeEnum depthType, + RiaDefines::DepthUnitType depthUnit, + double* minMD, + double* maxMD ) const; RiaDefines::DepthUnitType depthUnit() const; From 9a01c769e9039ae83ee85739f7e3a17fea84c138 Mon Sep 17 00:00:00 2001 From: Gaute Lindkvist Date: Fri, 29 Nov 2019 10:13:39 +0100 Subject: [PATCH 31/50] #5128 Fix right y-axis titles in summary plots --- .../ProjectDataModel/Summary/RimSummaryCurvesCalculator.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/ApplicationCode/ProjectDataModel/Summary/RimSummaryCurvesCalculator.cpp b/ApplicationCode/ProjectDataModel/Summary/RimSummaryCurvesCalculator.cpp index e7eaaf4d1b..1ca8e8b445 100644 --- a/ApplicationCode/ProjectDataModel/Summary/RimSummaryCurvesCalculator.cpp +++ b/ApplicationCode/ProjectDataModel/Summary/RimSummaryCurvesCalculator.cpp @@ -134,6 +134,7 @@ void RimSummaryPlotYAxisFormatter::applyYAxisPropertiesToPlot( RiuSummaryQwtPlot true, titleAlignment ); qwtPlot->setAxisTitleText( m_axisProperties->qwtPlotAxisType(), axisTitle ); + qwtPlot->setAxisTitleEnabled( m_axisProperties->qwtPlotAxisType(), true ); } { From 2c1180fa85b2840a7bf53dbedcd9247e9a8b0a1a Mon Sep 17 00:00:00 2001 From: Gaute Lindkvist Date: Fri, 29 Nov 2019 11:44:51 +0100 Subject: [PATCH 32/50] Fix Pseudo-length labels for RFT plots --- .../RimWellLogExtractionCurve.cpp | 4 ++ .../ProjectDataModel/RimWellLogRftCurve.cpp | 39 +++++++++---------- .../ProjectDataModel/RimWellLogRftCurve.h | 2 - 3 files changed, 23 insertions(+), 22 deletions(-) diff --git a/ApplicationCode/ProjectDataModel/RimWellLogExtractionCurve.cpp b/ApplicationCode/ProjectDataModel/RimWellLogExtractionCurve.cpp index 4339ec8bb6..7627a57d36 100644 --- a/ApplicationCode/ProjectDataModel/RimWellLogExtractionCurve.cpp +++ b/ApplicationCode/ProjectDataModel/RimWellLogExtractionCurve.cpp @@ -344,6 +344,10 @@ void RimWellLogExtractionCurve::onLoadDataAndUpdate( bool updateParentPlot ) RiaDefines::DepthTypeEnum depthType = wellLogPlot->depthType(); RiaDefines::DepthUnitType displayUnit = wellLogPlot->depthUnit(); + if ( depthType == RiaDefines::TRUE_VERTICAL_DEPTH ) + { + isUsingPseudoLength = false; + } m_qwtPlotCurve->setSamples( curveData()->xPlotValues().data(), curveData()->depthPlotValues( depthType, displayUnit ).data(), diff --git a/ApplicationCode/ProjectDataModel/RimWellLogRftCurve.cpp b/ApplicationCode/ProjectDataModel/RimWellLogRftCurve.cpp index 4c89bfa4d3..99c37835df 100644 --- a/ApplicationCode/ProjectDataModel/RimWellLogRftCurve.cpp +++ b/ApplicationCode/ProjectDataModel/RimWellLogRftCurve.cpp @@ -121,8 +121,6 @@ RimWellLogRftCurve::RimWellLogRftCurve() "" ); CAF_PDM_InitFieldNoDefault( &m_wellLogChannelName, "WellLogChannelName", "Well Property", "", "", "" ); - - m_derivedMDSource = NO_SOURCE; } //-------------------------------------------------------------------------------------------------- @@ -368,7 +366,8 @@ void RimWellLogRftCurve::onLoadDataAndUpdate( bool updateParentPlot ) { this->RimPlotCurve::updateCurvePresentation( updateParentPlot ); - m_derivedMDSource = PSEUDO_LENGTH; + RiaDefines::DepthTypeEnum depthType = RiaDefines::TRUE_VERTICAL_DEPTH; + DerivedMDSource derivedMDSource = NO_SOURCE; if ( isCurveVisible() ) { @@ -376,6 +375,8 @@ void RimWellLogRftCurve::onLoadDataAndUpdate( bool updateParentPlot ) firstAncestorOrThisOfType( wellLogPlot ); CVF_ASSERT( wellLogPlot ); + depthType = wellLogPlot->depthType(); + RimWellRftPlot* rftPlot = dynamic_cast( wellLogPlot ); bool showErrorBarsInObservedData = rftPlot ? rftPlot->showErrorBarsForObservedData() : false; m_showErrorBars = showErrorBarsInObservedData; @@ -420,17 +421,17 @@ void RimWellLogRftCurve::onLoadDataAndUpdate( bool updateParentPlot ) { if ( deriveMeasuredDepthValuesFromWellPath( tvDepthVector, measuredDepthVector ) ) { - m_derivedMDSource = WELL_PATH; + derivedMDSource = WELL_PATH; } else if ( deriveMeasuredDepthFromObservedData( tvDepthVector, measuredDepthVector ) ) { - m_derivedMDSource = OBSERVED_DATA; + derivedMDSource = OBSERVED_DATA; } } if ( tvDepthVector.size() != measuredDepthVector.size() ) { - m_derivedMDSource = NO_SOURCE; + derivedMDSource = NO_SOURCE; measuredDepthVector = tvDepthVector; } @@ -474,21 +475,20 @@ void RimWellLogRftCurve::onLoadDataAndUpdate( bool updateParentPlot ) RiuQwtPlotWidget* viewer = wellLogTrack->viewer(); if ( viewer ) { - if ( m_derivedMDSource == NO_SOURCE ) + if ( derivedMDSource != NO_SOURCE ) { - viewer->setAxisTitleText( QwtPlot::yLeft, "TVDMSL" ); + if ( derivedMDSource == WELL_PATH ) + { + viewer->setAxisTitleText( QwtPlot::yLeft, "WELL/" + wellLogPlot->depthAxisTitle() ); + } + else + { + viewer->setAxisTitleText( QwtPlot::yLeft, "OBS/" + wellLogPlot->depthAxisTitle() ); + } } - else if ( m_derivedMDSource == PSEUDO_LENGTH ) + else // Standard depth title set from plot { - viewer->setAxisTitleText( QwtPlot::yLeft, "PL/" + wellLogPlot->depthAxisTitle() ); - } - else if ( m_derivedMDSource == WELL_PATH ) - { - viewer->setAxisTitleText( QwtPlot::yLeft, "WELL/" + wellLogPlot->depthAxisTitle() ); - } - else - { - viewer->setAxisTitleText( QwtPlot::yLeft, "OBS/" + wellLogPlot->depthAxisTitle() ); + viewer->setAxisTitleText( QwtPlot::yLeft, wellLogPlot->depthAxisTitle() ); } } } @@ -753,11 +753,10 @@ RigEclipseWellLogExtractor* RimWellLogRftCurve::extractor() auto wellPathBranch = wellPaths[m_branchIndex]; - eclExtractor = wellLogCollection->findOrCreateSimWellExtractor( simWellName, + eclExtractor = wellLogCollection->findOrCreateSimWellExtractor( simWellName, QString( "Find or create sim well extractor" ), wellPathBranch, m_eclipseResultCase->eclipseCaseData() ); - m_derivedMDSource = NO_SOURCE; } return eclExtractor; diff --git a/ApplicationCode/ProjectDataModel/RimWellLogRftCurve.h b/ApplicationCode/ProjectDataModel/RimWellLogRftCurve.h index 4f89c5f38f..3e41b5529a 100644 --- a/ApplicationCode/ProjectDataModel/RimWellLogRftCurve.h +++ b/ApplicationCode/ProjectDataModel/RimWellLogRftCurve.h @@ -50,7 +50,6 @@ public: enum DerivedMDSource { NO_SOURCE, - PSEUDO_LENGTH, WELL_PATH, OBSERVED_DATA }; @@ -127,6 +126,5 @@ private: caf::PdmField m_branchDetection; std::map m_idxInWellPathToIdxInRftFile; - DerivedMDSource m_derivedMDSource; caf::PdmField> m_wellLogChannelName; }; From ec4194c0b00ac20abb76b253b89c632d7d41aea9 Mon Sep 17 00:00:00 2001 From: Gaute Lindkvist Date: Fri, 29 Nov 2019 13:53:02 +0100 Subject: [PATCH 33/50] Fix Well Allocation Plot depth axis zoom --- .../Flow/RimWellAllocationPlot.cpp | 55 ++++++++++++++++--- .../Flow/RimWellFlowRateCurve.cpp | 51 ++--------------- 2 files changed, 52 insertions(+), 54 deletions(-) diff --git a/ApplicationCode/ProjectDataModel/Flow/RimWellAllocationPlot.cpp b/ApplicationCode/ProjectDataModel/Flow/RimWellAllocationPlot.cpp index 33be2e275d..4382d2890b 100644 --- a/ApplicationCode/ProjectDataModel/Flow/RimWellAllocationPlot.cpp +++ b/ApplicationCode/ProjectDataModel/Flow/RimWellAllocationPlot.cpp @@ -299,23 +299,60 @@ void RimWellAllocationPlot::updateFromWell() std::vector tracerNames = wfCalculator->tracerNames(); for ( const QString& tracerName : tracerNames ) { - const std::vector* accFlow = nullptr; + std::vector curveDepthValues = depthValues; + std::vector accFlow; if ( depthType == RiaDefines::CONNECTION_NUMBER ) { - accFlow = &( m_flowType == ACCUMULATED - ? wfCalculator->accumulatedTracerFlowPrConnection( tracerName, brIdx ) - : wfCalculator->tracerFlowPrConnection( tracerName, brIdx ) ); + accFlow = ( m_flowType == ACCUMULATED + ? wfCalculator->accumulatedTracerFlowPrConnection( tracerName, brIdx ) + : wfCalculator->tracerFlowPrConnection( tracerName, brIdx ) ); + + // Insert the first depth position again, to add a value pair + curveDepthValues.insert( curveDepthValues.begin(), curveDepthValues[0] ); + accFlow.insert( accFlow.begin(), 0.0 ); + + if ( brIdx == 0 && !accFlow.empty() ) // Add fictitious point to 0 for first branch + { + accFlow.push_back( accFlow.back() ); + curveDepthValues.push_back( 0.0 ); + } } else if ( depthType == RiaDefines::PSEUDO_LENGTH || depthType == RiaDefines::TRUE_VERTICAL_DEPTH ) { - accFlow = &( m_flowType == ACCUMULATED - ? wfCalculator->accumulatedTracerFlowPrPseudoLength( tracerName, brIdx ) - : wfCalculator->tracerFlowPrPseudoLength( tracerName, brIdx ) ); + accFlow = ( m_flowType == ACCUMULATED + ? wfCalculator->accumulatedTracerFlowPrPseudoLength( tracerName, brIdx ) + : wfCalculator->tracerFlowPrPseudoLength( tracerName, brIdx ) ); + + // Insert the first depth position again, to add a value pair + curveDepthValues.insert( curveDepthValues.begin(), curveDepthValues[0] ); + accFlow.insert( accFlow.begin(), 0.0 ); + + if ( brIdx == 0 && branchCount > 1 ) + { + // Add a dummy negative depth value to make the contribution + // from other branches connected to well head visible + + auto minmax_it = std::minmax_element( curveDepthValues.begin(), curveDepthValues.end() ); + double availableMinDepth = *( minmax_it.first ); + double availableMaxDepth = *( minmax_it.second ); + + double depthSpan = 0.1 * cvf::Math::abs( availableMinDepth - availableMaxDepth ); + + // Round off value to floored decade + double logDecValue = log10( depthSpan ); + logDecValue = cvf::Math::floor( logDecValue ); + depthSpan = pow( 10.0, logDecValue ); + + double dummyNegativeDepthValue = curveDepthValues.back() - depthSpan; + + curveDepthValues.push_back( dummyNegativeDepthValue ); + accFlow.push_back( accFlow.back() ); + } } - if ( accFlow ) + if ( !accFlow.empty() ) { - addStackedCurve( tracerName, depthType, depthValues, *accFlow, plotTrack ); + addStackedCurve( tracerName, depthType, curveDepthValues, accFlow, plotTrack ); // TODO: THIs is the data to be plotted... } } diff --git a/ApplicationCode/ProjectDataModel/Flow/RimWellFlowRateCurve.cpp b/ApplicationCode/ProjectDataModel/Flow/RimWellFlowRateCurve.cpp index 410ba406e1..267a73f97c 100644 --- a/ApplicationCode/ProjectDataModel/Flow/RimWellFlowRateCurve.cpp +++ b/ApplicationCode/ProjectDataModel/Flow/RimWellFlowRateCurve.cpp @@ -243,8 +243,6 @@ void RimWellFlowRateCurve::updateStackedPlotData() RimWellLogTrack* wellLogTrack; firstAncestorOrThisOfTypeAsserted( wellLogTrack ); - bool isFirstTrack = ( wellLogTrack == wellLogPlot->plotByIndex( 0 ) ); - RimWellLogPlot::DepthTypeEnum depthType = wellLogPlot->depthType(); RiaDefines::DepthUnitType displayUnit = wellLogPlot->depthUnit(); if ( depthType == RiaDefines::CONNECTION_NUMBER ) @@ -255,7 +253,10 @@ void RimWellFlowRateCurve::updateStackedPlotData() std::vector depthValues; std::vector stackedValues; std::vector> polyLineStartStopIndices; - double zPos = -10000.0 + 100 * groupId(); // Z-position of curve, to draw them in correct order + + // Z-position of curve, to draw them in correct order + double zPos = -10000.0 + 100.0 * static_cast( groupId() ); + // Starting way behind the grid (z == 0) at -10000 giving room for 100 groups with 100 curves each before getting above the grid { std::map> stackedCurveGroups = wellLogTrack->visibleStackedCurves(); @@ -268,6 +269,8 @@ void RimWellFlowRateCurve::updateStackedPlotData() } std::vector allDepthValues = curveData()->depths( depthType ); + if ( allDepthValues.empty() ) return; + std::vector allStackedValues( allDepthValues.size() ); for ( RimWellFlowRateCurve* stCurve : stackedCurves ) @@ -294,48 +297,6 @@ void RimWellFlowRateCurve::updateStackedPlotData() polyLineStartStopIndices = tempCurveData.polylineStartStopIndices(); } - // Insert the first depth position again, to add a value pair - - if ( depthValues.size() ) // Should we really do this for all curve variants ? - { - depthValues.insert( depthValues.begin(), depthValues[0] ); - stackedValues.insert( stackedValues.begin(), 0.0 ); - polyLineStartStopIndices.front().second += 1; - - if ( wellLogPlot->plotCount() > 1 && isFirstTrack ) - { - // Add a dummy negative depth value to make the contribution - // from other branches connected to well head visible - - double availableMinDepth; - double availableMaxDepth; - wellLogPlot->availableDepthRange( &availableMinDepth, &availableMaxDepth ); - - double depthSpan = 0.1 * cvf::Math::abs( availableMinDepth - availableMaxDepth ); - - // Round off value to floored decade - double logDecValue = log10( depthSpan ); - logDecValue = cvf::Math::floor( logDecValue ); - depthSpan = pow( 10.0, logDecValue ); - - double dummyNegativeDepthValue = depthValues.back() - depthSpan; - - depthValues.push_back( dummyNegativeDepthValue ); - stackedValues.push_back( stackedValues.back() ); - polyLineStartStopIndices.front().second += 1; - } - } - - // Add a dummy point for the zeroth connection to make the "end" distribution show better. - - if ( isFirstTrack && isUsingConnectionNumberDepthType() ) - { - stackedValues.push_back( stackedValues.back() ); - depthValues.push_back( 0.0 ); - - polyLineStartStopIndices.front().second += 1; - } - auto minmax_it = std::minmax_element( stackedValues.begin(), stackedValues.end() ); this->setOverrideCurveDataXRange( *( minmax_it.first ), *( minmax_it.second ) ); From 4029953c24b715def52be7386a784648f29aeb7d Mon Sep 17 00:00:00 2001 From: Gaute Lindkvist Date: Fri, 29 Nov 2019 14:00:22 +0100 Subject: [PATCH 34/50] Rename SummaryYAxisFormatter (it isn't just for the Y-axis) --- .../Summary/CMakeLists_files.cmake | 4 ++-- .../Summary/RimSummaryPlot.cpp | 22 +++++++++---------- ...or.cpp => RimSummaryPlotAxisFormatter.cpp} | 16 +++++++------- ...ulator.h => RimSummaryPlotAxisFormatter.h} | 12 +++++----- 4 files changed, 27 insertions(+), 27 deletions(-) rename ApplicationCode/ProjectDataModel/Summary/{RimSummaryCurvesCalculator.cpp => RimSummaryPlotAxisFormatter.cpp} (93%) rename ApplicationCode/ProjectDataModel/Summary/{RimSummaryCurvesCalculator.h => RimSummaryPlotAxisFormatter.h} (74%) diff --git a/ApplicationCode/ProjectDataModel/Summary/CMakeLists_files.cmake b/ApplicationCode/ProjectDataModel/Summary/CMakeLists_files.cmake index 27f61f9f4e..2de9d1ed87 100644 --- a/ApplicationCode/ProjectDataModel/Summary/CMakeLists_files.cmake +++ b/ApplicationCode/ProjectDataModel/Summary/CMakeLists_files.cmake @@ -10,7 +10,7 @@ ${CMAKE_CURRENT_LIST_DIR}/RimSummaryCurve.h ${CMAKE_CURRENT_LIST_DIR}/RimSummaryCurveAppearanceCalculator.h ${CMAKE_CURRENT_LIST_DIR}/RimSummaryCurveAutoName.h ${CMAKE_CURRENT_LIST_DIR}/RimSummaryCurveFilter.h -${CMAKE_CURRENT_LIST_DIR}/RimSummaryCurvesCalculator.h +${CMAKE_CURRENT_LIST_DIR}/RimSummaryPlotAxisFormatter.h ${CMAKE_CURRENT_LIST_DIR}/RimSummaryFilter.h ${CMAKE_CURRENT_LIST_DIR}/RimSummaryCurveCollection.h ${CMAKE_CURRENT_LIST_DIR}/RimSummaryPlot.h @@ -50,7 +50,7 @@ ${CMAKE_CURRENT_LIST_DIR}/RimSummaryCurve.cpp ${CMAKE_CURRENT_LIST_DIR}/RimSummaryCurveAppearanceCalculator.cpp ${CMAKE_CURRENT_LIST_DIR}/RimSummaryCurveAutoName.cpp ${CMAKE_CURRENT_LIST_DIR}/RimSummaryCurveFilter.cpp -${CMAKE_CURRENT_LIST_DIR}/RimSummaryCurvesCalculator.cpp +${CMAKE_CURRENT_LIST_DIR}/RimSummaryPlotAxisFormatter.cpp ${CMAKE_CURRENT_LIST_DIR}/RimSummaryFilter.cpp ${CMAKE_CURRENT_LIST_DIR}/RimSummaryCurveCollection.cpp ${CMAKE_CURRENT_LIST_DIR}/RimSummaryPlot.cpp diff --git a/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlot.cpp b/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlot.cpp index 865d8edf5b..d62ef1a34b 100644 --- a/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlot.cpp +++ b/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlot.cpp @@ -40,7 +40,7 @@ #include "RimSummaryCurve.h" #include "RimSummaryCurveCollection.h" #include "RimSummaryCurveFilter.h" -#include "RimSummaryCurvesCalculator.h" +#include "RimSummaryPlotAxisFormatter.h" #include "RimSummaryPlotCollection.h" #include "RimSummaryPlotFilterTextCurveSetEditor.h" #include "RimSummaryPlotNameHelper.h" @@ -807,11 +807,11 @@ void RimSummaryPlot::updateYAxis( RiaDefines::PlotAxis plotAxis ) timeHistoryQuantities.insert( c->quantityName() ); } - RimSummaryPlotYAxisFormatter calc( yAxisProperties, - visibleSummaryCurvesForAxis( plotAxis ), - visibleAsciiDataCurvesForAxis( plotAxis ), - timeHistoryQuantities ); - calc.applyYAxisPropertiesToPlot( m_plotWidget ); + RimSummaryPlotAxisFormatter calc( yAxisProperties, + visibleSummaryCurvesForAxis( plotAxis ), + visibleAsciiDataCurvesForAxis( plotAxis ), + timeHistoryQuantities ); + calc.applyAxisPropertiesToPlot( m_plotWidget ); } else { @@ -1108,11 +1108,11 @@ void RimSummaryPlot::updateBottomXAxis() std::set timeHistoryQuantities; - RimSummaryPlotYAxisFormatter calc( bottomAxisProperties, - visibleSummaryCurvesForAxis( RiaDefines::PLOT_AXIS_BOTTOM ), - visibleAsciiDataCurvesForAxis( RiaDefines::PLOT_AXIS_BOTTOM ), - timeHistoryQuantities ); - calc.applyYAxisPropertiesToPlot( m_plotWidget ); + RimSummaryPlotAxisFormatter calc( bottomAxisProperties, + visibleSummaryCurvesForAxis( RiaDefines::PLOT_AXIS_BOTTOM ), + visibleAsciiDataCurvesForAxis( RiaDefines::PLOT_AXIS_BOTTOM ), + timeHistoryQuantities ); + calc.applyAxisPropertiesToPlot( m_plotWidget ); } else { diff --git a/ApplicationCode/ProjectDataModel/Summary/RimSummaryCurvesCalculator.cpp b/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlotAxisFormatter.cpp similarity index 93% rename from ApplicationCode/ProjectDataModel/Summary/RimSummaryCurvesCalculator.cpp rename to ApplicationCode/ProjectDataModel/Summary/RimSummaryPlotAxisFormatter.cpp index 1ca8e8b445..c958aa7816 100644 --- a/ApplicationCode/ProjectDataModel/Summary/RimSummaryCurvesCalculator.cpp +++ b/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlotAxisFormatter.cpp @@ -16,7 +16,7 @@ // ///////////////////////////////////////////////////////////////////////////////// -#include "RimSummaryCurvesCalculator.h" +#include "RimSummaryPlotAxisFormatter.h" #include "RiaDefines.h" @@ -92,10 +92,10 @@ private: //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -RimSummaryPlotYAxisFormatter::RimSummaryPlotYAxisFormatter( RimPlotAxisProperties* axisProperties, - const std::vector& summaryCurves, - const std::vector& asciiCurves, - const std::set& timeHistoryCurveQuantities ) +RimSummaryPlotAxisFormatter::RimSummaryPlotAxisFormatter( RimPlotAxisProperties* axisProperties, + const std::vector& summaryCurves, + const std::vector& asciiCurves, + const std::set& timeHistoryCurveQuantities ) : m_axisProperties( axisProperties ) , m_summaryCurves( summaryCurves ) , m_asciiDataCurves( asciiCurves ) @@ -106,7 +106,7 @@ RimSummaryPlotYAxisFormatter::RimSummaryPlotYAxisFormatter( RimPlotAxisPropertie //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void RimSummaryPlotYAxisFormatter::applyYAxisPropertiesToPlot( RiuSummaryQwtPlot* qwtPlot ) +void RimSummaryPlotAxisFormatter::applyAxisPropertiesToPlot( RiuSummaryQwtPlot* qwtPlot ) { if ( !qwtPlot ) return; @@ -180,7 +180,7 @@ void RimSummaryPlotYAxisFormatter::applyYAxisPropertiesToPlot( RiuSummaryQwtPlot //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -QString RimSummaryPlotYAxisFormatter::autoAxisTitle() const +QString RimSummaryPlotAxisFormatter::autoAxisTitle() const { std::map> unitToQuantityNameMap; @@ -289,7 +289,7 @@ QString RimSummaryPlotYAxisFormatter::autoAxisTitle() const //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -std::string RimSummaryPlotYAxisFormatter::shortCalculationName( const std::string& calculationName ) +std::string RimSummaryPlotAxisFormatter::shortCalculationName( const std::string& calculationName ) { QString calculationShortName = QString::fromStdString( calculationName ); diff --git a/ApplicationCode/ProjectDataModel/Summary/RimSummaryCurvesCalculator.h b/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlotAxisFormatter.h similarity index 74% rename from ApplicationCode/ProjectDataModel/Summary/RimSummaryCurvesCalculator.h rename to ApplicationCode/ProjectDataModel/Summary/RimSummaryPlotAxisFormatter.h index f2cf333380..af835c897e 100644 --- a/ApplicationCode/ProjectDataModel/Summary/RimSummaryCurvesCalculator.h +++ b/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlotAxisFormatter.h @@ -32,15 +32,15 @@ class RiuSummaryQwtPlot; class QwtPlotCurve; -class RimSummaryPlotYAxisFormatter +class RimSummaryPlotAxisFormatter { public: - RimSummaryPlotYAxisFormatter( RimPlotAxisProperties* axisProperties, - const std::vector& summaryCurves, - const std::vector& asciiCurves, - const std::set& timeHistoryCurveQuantities ); + RimSummaryPlotAxisFormatter( RimPlotAxisProperties* axisProperties, + const std::vector& summaryCurves, + const std::vector& asciiCurves, + const std::set& timeHistoryCurveQuantities ); - void applyYAxisPropertiesToPlot( RiuSummaryQwtPlot* qwtPlot ); + void applyAxisPropertiesToPlot( RiuSummaryQwtPlot* qwtPlot ); private: QString autoAxisTitle() const; From cfcdfc8b9c0b9ed0104f2df5618653fbb1b5787c Mon Sep 17 00:00:00 2001 From: Gaute Lindkvist Date: Tue, 26 Nov 2019 13:24:38 +0100 Subject: [PATCH 35/50] Fix build issue in opm-flowdiagnostics for VS2019 --- .../opm/flowdiagnostics/DerivedQuantities.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/ThirdParty/custom-opm-flowdiagnostics/opm-flowdiagnostics/opm/flowdiagnostics/DerivedQuantities.cpp b/ThirdParty/custom-opm-flowdiagnostics/opm-flowdiagnostics/opm/flowdiagnostics/DerivedQuantities.cpp index 3736987e71..b99cf874f9 100644 --- a/ThirdParty/custom-opm-flowdiagnostics/opm-flowdiagnostics/opm/flowdiagnostics/DerivedQuantities.cpp +++ b/ThirdParty/custom-opm-flowdiagnostics/opm-flowdiagnostics/opm/flowdiagnostics/DerivedQuantities.cpp @@ -25,6 +25,7 @@ #include #include #include +#include namespace Opm { From 97329864d34dc077e8c87abbbc632162522d5beb Mon Sep 17 00:00:00 2001 From: Gaute Lindkvist Date: Tue, 26 Nov 2019 09:29:38 +0100 Subject: [PATCH 36/50] Fix potential incompatibility with grpc v1.23.0+ See: https://github.com/grpc/grpc/pull/19435 --- ApplicationCode/GrpcInterface/RiaGrpcCallbacks.h | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/ApplicationCode/GrpcInterface/RiaGrpcCallbacks.h b/ApplicationCode/GrpcInterface/RiaGrpcCallbacks.h index 40ca9c8bd2..5c8d085b38 100644 --- a/ApplicationCode/GrpcInterface/RiaGrpcCallbacks.h +++ b/ApplicationCode/GrpcInterface/RiaGrpcCallbacks.h @@ -22,6 +22,10 @@ #include #include #include +#include +#include +#include +#include using grpc::CompletionQueue; using grpc::ServerAsyncReader; @@ -29,7 +33,6 @@ using grpc::ServerAsyncResponseWriter; using grpc::ServerAsyncWriter; using grpc::ServerCompletionQueue; using grpc::ServerContext; -using grpc::ServerWriter; using grpc::Status; class RiaGrpcServiceInterface; From c215b3e946f9f45a35ba9ea7abba7087909581e6 Mon Sep 17 00:00:00 2001 From: Gaute Lindkvist Date: Tue, 26 Nov 2019 12:35:56 +0100 Subject: [PATCH 37/50] Fix CMake warning in GRPC code --- ApplicationCode/CMakeLists.txt | 2 +- ApplicationCode/GrpcInterface/CMakeLists.cmake | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ApplicationCode/CMakeLists.txt b/ApplicationCode/CMakeLists.txt index 5d9401515d..8aba9346fc 100644 --- a/ApplicationCode/CMakeLists.txt +++ b/ApplicationCode/CMakeLists.txt @@ -337,7 +337,7 @@ if (MSVC) set( EXE_FILES WIN32) if (RESINSIGHT_ENABLE_GRPC) # GRPC generates a lot of harmless warnings on MSVC - set_source_files_properties(${GRPC_CPP_SOURCES} ${GRPC_UNIT_TEST_SOURCE_FILES} PROPERTIES COMPILE_FLAGS "/wd4251 /wd4702 /wd4005 /wd4244 /wd4125") + set_source_files_properties(${GRPC_CPP_SOURCES} ${GRPC_UNIT_TEST_SOURCE_FILES} PROPERTIES COMPILE_FLAGS "/wd4251 /wd4702 /wd4005 /wd4244 /wd4125 /wd4267") endif(RESINSIGHT_ENABLE_GRPC) elseif (APPLE) set( EXE_FILES MACOSX_BUNDLE) diff --git a/ApplicationCode/GrpcInterface/CMakeLists.cmake b/ApplicationCode/GrpcInterface/CMakeLists.cmake index d467b67587..7fa9cbe241 100644 --- a/ApplicationCode/GrpcInterface/CMakeLists.cmake +++ b/ApplicationCode/GrpcInterface/CMakeLists.cmake @@ -33,7 +33,7 @@ if (MSVC) # Find Protobuf installation # Looks for protobuf-config.cmake file installed by Protobuf's cmake installation. - set(protobuf_MODULE_COMPATIBLE ON CACHE DBOOL "") + set(protobuf_MODULE_COMPATIBLE ON) find_package(Protobuf CONFIG 3.0 QUIET) if (Protobuf_FOUND) message(STATUS "Using protobuf ${protobuf_VERSION}") From 2284dadfecb407dc26c9677f90cb1baa1c049408 Mon Sep 17 00:00:00 2001 From: Gaute Lindkvist Date: Tue, 26 Nov 2019 14:51:39 +0100 Subject: [PATCH 38/50] Fix compile warning in RifActiveCellsReader-Test.cpp --- ApplicationCode/UnitTests/RifActiveCellsReader-Test.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ApplicationCode/UnitTests/RifActiveCellsReader-Test.cpp b/ApplicationCode/UnitTests/RifActiveCellsReader-Test.cpp index 13ceff5243..c4a06cc722 100644 --- a/ApplicationCode/UnitTests/RifActiveCellsReader-Test.cpp +++ b/ApplicationCode/UnitTests/RifActiveCellsReader-Test.cpp @@ -66,7 +66,7 @@ TEST( RifActiveCellsReaderTest, BasicTest10k ) ECL_FILE_CLOSE_STREAM ); activeCellsFromPorv = RifActiveCellsReader::activeCellsFromPorvKeyword( initFile, false ); - EXPECT_EQ( 2, activeCellsFromPorv.size() ); + EXPECT_EQ( 2, (int)activeCellsFromPorv.size() ); ecl_file_close( initFile ); } From 9656692afcd455349bd0b2b1b78338a24569ec96 Mon Sep 17 00:00:00 2001 From: Gaute Lindkvist Date: Wed, 27 Nov 2019 11:44:39 +0100 Subject: [PATCH 39/50] Improve canvas top alignment in well log plots --- .../ProjectDataModel/RimWellLogTrack.cpp | 85 +++++++++++-------- .../UserInterface/RiuQwtPlotWidget.cpp | 8 +- 2 files changed, 50 insertions(+), 43 deletions(-) diff --git a/ApplicationCode/ProjectDataModel/RimWellLogTrack.cpp b/ApplicationCode/ProjectDataModel/RimWellLogTrack.cpp index 8e4f0d9a4f..db312f9cd6 100644 --- a/ApplicationCode/ProjectDataModel/RimWellLogTrack.cpp +++ b/ApplicationCode/ProjectDataModel/RimWellLogTrack.cpp @@ -691,49 +691,62 @@ void RimWellLogTrack::updateXAxisAndGridTickIntervals() { if ( !m_plotWidget ) return; - if ( m_explicitTickIntervals ) + bool emptyRange = std::abs( m_visibleXRangeMax() - m_visibleXRangeMin ) < + 1.0e-6 * std::max( 1.0, std::max( m_visibleXRangeMax(), m_visibleXRangeMin() ) ); + + if ( emptyRange ) { - m_plotWidget->setMajorAndMinorTickIntervals( QwtPlot::xTop, - m_majorTickInterval(), - m_minorTickInterval(), - m_visibleXRangeMin(), - m_visibleXRangeMax() ); + m_plotWidget->enableGridLines( QwtPlot::xTop, false, false ); + m_plotWidget->setAxisRange( QwtPlot::xTop, 0.0, 1.0 ); + m_plotWidget->setAxisLabelsAndTicksEnabled( QwtPlot::xTop, false ); } else { - int majorTickIntervals = 3; - int minorTickIntervals = 0; - switch ( m_widthScaleFactor() ) + m_plotWidget->setAxisLabelsAndTicksEnabled( QwtPlot::xTop, true ); + + if ( m_explicitTickIntervals ) { - case EXTRA_NARROW: - majorTickIntervals = 3; - minorTickIntervals = 2; - break; - case NARROW: - majorTickIntervals = 3; - minorTickIntervals = 5; - break; - case NORMAL: - majorTickIntervals = 5; - minorTickIntervals = 5; - break; - case WIDE: - majorTickIntervals = 5; - minorTickIntervals = 10; - break; - case EXTRA_WIDE: - majorTickIntervals = 10; - minorTickIntervals = 10; - break; + m_plotWidget->setMajorAndMinorTickIntervals( QwtPlot::xTop, + m_majorTickInterval(), + m_minorTickInterval(), + m_visibleXRangeMin(), + m_visibleXRangeMax() ); } - m_plotWidget->setAutoTickIntervalCounts( QwtPlot::xTop, majorTickIntervals, minorTickIntervals ); - m_plotWidget->setAxisRange( QwtPlot::xTop, m_visibleXRangeMin, m_visibleXRangeMax ); + else + { + int majorTickIntervals = 3; + int minorTickIntervals = 0; + switch ( m_widthScaleFactor() ) + { + case EXTRA_NARROW: + majorTickIntervals = 3; + minorTickIntervals = 2; + break; + case NARROW: + majorTickIntervals = 3; + minorTickIntervals = 5; + break; + case NORMAL: + majorTickIntervals = 5; + minorTickIntervals = 5; + break; + case WIDE: + majorTickIntervals = 5; + minorTickIntervals = 10; + break; + case EXTRA_WIDE: + majorTickIntervals = 10; + minorTickIntervals = 10; + break; + } + m_plotWidget->setAutoTickIntervalCounts( QwtPlot::xTop, majorTickIntervals, minorTickIntervals ); + m_plotWidget->setAxisRange( QwtPlot::xTop, m_visibleXRangeMin, m_visibleXRangeMax ); + } + + m_plotWidget->enableGridLines( QwtPlot::xTop, + m_xAxisGridVisibility() & RimWellLogPlot::AXIS_GRID_MAJOR, + m_xAxisGridVisibility() & RimWellLogPlot::AXIS_GRID_MINOR ); } - - m_plotWidget->enableGridLines( QwtPlot::xTop, - m_xAxisGridVisibility() & RimWellLogPlot::AXIS_GRID_MAJOR, - m_xAxisGridVisibility() & RimWellLogPlot::AXIS_GRID_MINOR ); - RimWellLogPlot* wellLogPlot = nullptr; this->firstAncestorOrThisOfType( wellLogPlot ); if ( wellLogPlot ) diff --git a/ApplicationCode/UserInterface/RiuQwtPlotWidget.cpp b/ApplicationCode/UserInterface/RiuQwtPlotWidget.cpp index 68cd79b25b..e1f9d314f9 100644 --- a/ApplicationCode/UserInterface/RiuQwtPlotWidget.cpp +++ b/ApplicationCode/UserInterface/RiuQwtPlotWidget.cpp @@ -255,8 +255,6 @@ void RiuQwtPlotWidget::setAxisLabelsAndTicksEnabled( QwtPlot::Axis axis, bool en { this->axisScaleDraw( axis )->enableComponent( QwtAbstractScaleDraw::Ticks, enable ); this->axisScaleDraw( axis )->enableComponent( QwtAbstractScaleDraw::Labels, enable ); - axisScaleDraw( axis )->setMinimumExtent( axisExtent( axis ) ); - setMinimumWidth( defaultMinimumWidth() + axisExtent( axis ) ); } //-------------------------------------------------------------------------------------------------- @@ -351,12 +349,8 @@ int RiuQwtPlotWidget::axisExtent( QwtPlot::Axis axis ) const { int lineExtent = 5; - if ( this->axisScaleDraw( axis )->hasComponent( QwtAbstractScaleDraw::Ticks ) ) - { - lineExtent += this->axisScaleDraw( axis )->maxTickLength(); - } + lineExtent += this->axisScaleDraw( axis )->maxTickLength(); - if ( this->axisScaleDraw( axis )->hasComponent( QwtAbstractScaleDraw::Labels ) ) { QFont tickLabelFont = axisFont( axis ); // Make space for a fairly long value label From 4f7fc18e1ce5626e94bbf19b3ac41ca46de6e2a5 Mon Sep 17 00:00:00 2001 From: Gaute Lindkvist Date: Fri, 29 Nov 2019 15:03:02 +0100 Subject: [PATCH 40/50] More robust legend handling for Well Log Plots --- .../UserInterface/RiuGridPlotWindow.cpp | 59 ++++++------------- .../UserInterface/RiuGridPlotWindow.h | 3 +- .../UserInterface/RiuQwtPlotLegend.cpp | 51 ++++++++++++++-- .../UserInterface/RiuQwtPlotLegend.h | 11 +++- 4 files changed, 74 insertions(+), 50 deletions(-) diff --git a/ApplicationCode/UserInterface/RiuGridPlotWindow.cpp b/ApplicationCode/UserInterface/RiuGridPlotWindow.cpp index c913ced916..4e5fe9e276 100644 --- a/ApplicationCode/UserInterface/RiuGridPlotWindow.cpp +++ b/ApplicationCode/UserInterface/RiuGridPlotWindow.cpp @@ -150,7 +150,7 @@ void RiuGridPlotWindow::insertPlot( RiuQwtPlotWidget* plotWidget, size_t index ) int legendColumns = 1; if ( m_plotDefinition->legendsHorizontal() ) { - legendColumns = 0; // unlimited + legendColumns = 4; // unlimited } legend->setMaxColumns( legendColumns ); legend->horizontalScrollBar()->setVisible( false ); @@ -159,11 +159,11 @@ void RiuGridPlotWindow::insertPlot( RiuQwtPlotWidget* plotWidget, size_t index ) legend->connect( plotWidget, SIGNAL( legendDataChanged( const QVariant&, const QList& ) ), SLOT( updateLegend( const QVariant&, const QList& ) ) ); + QObject::connect( legend, SIGNAL( legendUpdated() ), this, SLOT( onLegendUpdated() ) ); legend->contentsWidget()->layout()->setAlignment( Qt::AlignBottom | Qt::AlignHCenter ); plotWidget->updateLegend(); m_legends.insert( static_cast( index ), legend ); - m_legendColumns.insert( static_cast( index ), -1 ); scheduleUpdate(); } @@ -184,7 +184,6 @@ void RiuGridPlotWindow::removePlot( RiuQwtPlotWidget* plotWidget ) RiuQwtPlotLegend* legend = m_legends[plotWidgetIdx]; legend->setParent( nullptr ); m_legends.removeAt( plotWidgetIdx ); - m_legendColumns.removeAt( plotWidgetIdx ); delete legend; QLabel* subTitle = m_subTitles[plotWidgetIdx]; @@ -318,42 +317,13 @@ QLabel* RiuGridPlotWindow::createTitleLabel() const return plotTitle; } -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -void RiuGridPlotWindow::resizeEvent( QResizeEvent* event ) -{ - QWidget::resizeEvent( event ); - bool needsUpdate = false; - for ( int i = 0; i < m_legends.size(); ++i ) - { - if ( m_legends[i]->isVisible() ) - { - int columnCount = m_legends[i]->columnCount(); - if ( columnCount != m_legendColumns[i] ) - { - int oldColumnCount = m_legendColumns[i]; - m_legendColumns[i] = columnCount; - if ( oldColumnCount != -1 ) - { - needsUpdate = true; - } - } - } - } - if ( needsUpdate ) - { - performUpdate(); - } -} - //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- void RiuGridPlotWindow::showEvent( QShowEvent* event ) { QWidget::showEvent( event ); - performUpdate(); + scheduleUpdate(); } //-------------------------------------------------------------------------------------------------- @@ -551,6 +521,13 @@ void RiuGridPlotWindow::performUpdate() alignCanvasTops(); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RiuGridPlotWindow::onLegendUpdated() +{ + scheduleUpdate(); +} //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -596,16 +573,19 @@ void RiuGridPlotWindow::reinsertPlotWidgets() subTitles[visibleIndex]->setVisible( m_plotDefinition->showPlotTitles() ); + plotWidgets[visibleIndex]->setAxisLabelsAndTicksEnabled( QwtPlot::yLeft, showYAxis( row, column ) ); + plotWidgets[visibleIndex]->setAxisTitleEnabled( QwtPlot::yLeft, showYAxis( row, column ) ); + + plotWidgets[visibleIndex]->show(); + if ( m_plotDefinition->legendsVisible() ) { int legendColumns = 1; if ( m_plotDefinition->legendsHorizontal() ) { - legendColumns = 0; // unlimited + legendColumns = 4; // unlimited } legends[visibleIndex]->setMaxColumns( legendColumns ); - int minimumHeight = legends[visibleIndex]->heightForWidth( plotWidgets[visibleIndex]->width() ); - legends[visibleIndex]->setMinimumHeight( minimumHeight ); QFont legendFont = legends[visibleIndex]->font(); legendFont.setPointSize( m_plotDefinition->legendFontSize() ); legends[visibleIndex]->setFont( legendFont ); @@ -616,11 +596,6 @@ void RiuGridPlotWindow::reinsertPlotWidgets() legends[visibleIndex]->hide(); } - plotWidgets[visibleIndex]->setAxisLabelsAndTicksEnabled( QwtPlot::yLeft, showYAxis( row, column ) ); - plotWidgets[visibleIndex]->setAxisTitleEnabled( QwtPlot::yLeft, showYAxis( row, column ) ); - - plotWidgets[visibleIndex]->show(); - // Set basic row and column stretches for ( int r = row; r < row + rowSpan; ++r ) { @@ -651,6 +626,7 @@ int RiuGridPlotWindow::alignCanvasTops() CVF_ASSERT( m_legends.size() == m_plotWidgets.size() ); QList> plotWidgets = visiblePlotWidgets(); + QList> legends = visibleLegends(); if ( plotWidgets.empty() ) return 0; auto rowAndColumnCount = this->rowAndColumnCount( plotWidgets.size() ); @@ -670,6 +646,7 @@ int RiuGridPlotWindow::alignCanvasTops() { int row = visibleIndex / rowAndColumnCount.second; plotWidgets[visibleIndex]->axisScaleDraw( QwtPlot::xTop )->setMinimumExtent( maxExtents[row] ); + legends[visibleIndex]->adjustSize(); } return maxExtents[0]; } diff --git a/ApplicationCode/UserInterface/RiuGridPlotWindow.h b/ApplicationCode/UserInterface/RiuGridPlotWindow.h index 73b9f17f3b..5cf720c10f 100644 --- a/ApplicationCode/UserInterface/RiuGridPlotWindow.h +++ b/ApplicationCode/UserInterface/RiuGridPlotWindow.h @@ -81,7 +81,6 @@ protected: void keyPressEvent( QKeyEvent* keyEvent ) override; QLabel* createTitleLabel() const; - void resizeEvent( QResizeEvent* event ) override; void showEvent( QShowEvent* event ) override; void dragEnterEvent( QDragEnterEvent* event ) override; void dragMoveEvent( QDragMoveEvent* event ) override; @@ -111,6 +110,7 @@ protected: private slots: virtual void performUpdate(); + virtual void onLegendUpdated(); protected: QPointer m_layout; @@ -118,7 +118,6 @@ protected: QPointer m_plotWidgetFrame; QPointer m_gridLayout; QPointer m_plotTitle; - QList m_legendColumns; QList> m_subTitles; QList> m_legends; QList> m_plotWidgets; diff --git a/ApplicationCode/UserInterface/RiuQwtPlotLegend.cpp b/ApplicationCode/UserInterface/RiuQwtPlotLegend.cpp index 1a008193c7..04ef9b9020 100644 --- a/ApplicationCode/UserInterface/RiuQwtPlotLegend.cpp +++ b/ApplicationCode/UserInterface/RiuQwtPlotLegend.cpp @@ -19,6 +19,7 @@ #include "qwt_dyngrid_layout.h" +#include #include #include @@ -28,7 +29,7 @@ //-------------------------------------------------------------------------------------------------- RiuQwtPlotLegend::RiuQwtPlotLegend( QWidget* parent /*= nullptr */ ) : QwtLegend( parent ) - , m_columnCount( -1 ) + , m_columnCount( 1 ) { } @@ -42,14 +43,56 @@ void RiuQwtPlotLegend::resizeEvent( QResizeEvent* event ) const QwtDynGridLayout* legendLayout = qobject_cast( contentsWidget()->layout() ); if ( legendLayout ) { - m_columnCount = legendLayout->columnsForWidth( size.width() ); + int left, right, top, bottom; + getContentsMargins( &left, &top, &right, &bottom ); + + m_columnCount = std::max( 1, (int)legendLayout->columnsForWidth( size.width() - left - right ) ); + + updateGeometry(); } } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -int RiuQwtPlotLegend::columnCount() const +QSize RiuQwtPlotLegend::sizeHint() const { - return m_columnCount; + QSize fullSizeHint = QwtLegend::sizeHint(); + // Update width + const QwtDynGridLayout* legendLayout = qobject_cast( contentsWidget()->layout() ); + if ( legendLayout ) + { + int numColumns = m_columnCount; + int numRows = legendLayout->itemCount() / numColumns; + if ( legendLayout->itemCount() % numColumns ) numRows++; + + int width = numColumns * legendLayout->maxItemWidth(); + + int maxHeight = 0; + for ( unsigned int i = 0; i < legendLayout->itemCount(); ++i ) + { + auto itemSize = legendLayout->itemAt( i )->sizeHint(); + maxHeight = std::max( maxHeight, itemSize.height() ); + } + QMargins margins = legendLayout->contentsMargins(); + int totalSpacing = ( numRows + 1 ) * legendLayout->spacing() + margins.top() + margins.bottom(); + + int height = maxHeight * numRows + totalSpacing; + + QSize layoutSize( width, height ); + QSize frameSize = layoutSize + QSize( 2 * frameWidth(), 2 * frameWidth() ); + + fullSizeHint.setWidth( std::max( fullSizeHint.width(), frameSize.width() ) ); + fullSizeHint.setHeight( std::max( fullSizeHint.height(), frameSize.height() ) ); + } + return fullSizeHint; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RiuQwtPlotLegend::updateLegend( const QVariant& variant, const QList& legendItems ) +{ + QwtLegend::updateLegend( variant, legendItems ); + emit legendUpdated(); } diff --git a/ApplicationCode/UserInterface/RiuQwtPlotLegend.h b/ApplicationCode/UserInterface/RiuQwtPlotLegend.h index b8f9836d9a..2209c8238a 100644 --- a/ApplicationCode/UserInterface/RiuQwtPlotLegend.h +++ b/ApplicationCode/UserInterface/RiuQwtPlotLegend.h @@ -24,9 +24,14 @@ class RiuQwtPlotLegend : public QwtLegend Q_OBJECT public: RiuQwtPlotLegend( QWidget* parent = nullptr ); - void resizeEvent( QResizeEvent* event ); - int columnCount() const; + void resizeEvent( QResizeEvent* event ); + QSize sizeHint() const override; +public slots: + void updateLegend( const QVariant&, const QList& ) override; + +signals: + void legendUpdated(); private: - mutable int m_columnCount; + int m_columnCount; }; From 2336ff4908155c7eced74db63bf466c9f234bed2 Mon Sep 17 00:00:00 2001 From: Gaute Lindkvist Date: Fri, 29 Nov 2019 15:41:28 +0100 Subject: [PATCH 41/50] #5135 Avoid crash when clicking on a simulation wlel in a statistics case --- .../Commands/FlowCommands/RicShowContributingWellsFeature.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ApplicationCode/Commands/FlowCommands/RicShowContributingWellsFeature.cpp b/ApplicationCode/Commands/FlowCommands/RicShowContributingWellsFeature.cpp index b23d63e031..bca3fac491 100644 --- a/ApplicationCode/Commands/FlowCommands/RicShowContributingWellsFeature.cpp +++ b/ApplicationCode/Commands/FlowCommands/RicShowContributingWellsFeature.cpp @@ -54,7 +54,7 @@ bool RicShowContributingWellsFeature::isCommandEnabled() if ( !flowDiagSolution ) { RimEclipseResultCase* eclipseResultCase = nullptr; - well->firstAncestorOrThisOfTypeAsserted( eclipseResultCase ); + well->firstAncestorOrThisOfType( eclipseResultCase ); if ( eclipseResultCase ) { From de35b6d76bc90b36ca397a5796b12fba0bc55ac3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacob=20St=C3=B8ren?= Date: Fri, 29 Nov 2019 16:00:38 +0100 Subject: [PATCH 42/50] #5145 Fix strange zigzag lines in summary curves --- ApplicationCode/UserInterface/RiuQwtPlotCurve.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ApplicationCode/UserInterface/RiuQwtPlotCurve.cpp b/ApplicationCode/UserInterface/RiuQwtPlotCurve.cpp index 6cb0a6d6bf..a42f00cea5 100644 --- a/ApplicationCode/UserInterface/RiuQwtPlotCurve.cpp +++ b/ApplicationCode/UserInterface/RiuQwtPlotCurve.cpp @@ -354,7 +354,7 @@ void RiuQwtPlotCurve::computeValidIntervalsAndSetCurveData( const std::vector( validXValues.size() ) ); - setLineSegmentStartStopIndices( intervalsOfValidValues ); + setLineSegmentStartStopIndices( RiaCurveDataTools::computePolyLineStartStopIndices( intervalsOfValidValues ) ); } //-------------------------------------------------------------------------------------------------- From eb246bd6fcaab2b57ca7a0d14265706fba9884b9 Mon Sep 17 00:00:00 2001 From: Gaute Lindkvist Date: Fri, 29 Nov 2019 15:22:13 +0100 Subject: [PATCH 43/50] #5137 load curve data after creating new well log curves --- ApplicationCode/Commands/RicWellLogTools.cpp | 10 ++++++++++ .../RicNewWellLogCurveExtractionFeature.cpp | 10 ---------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/ApplicationCode/Commands/RicWellLogTools.cpp b/ApplicationCode/Commands/RicWellLogTools.cpp index e53773e8e0..2413d48c60 100644 --- a/ApplicationCode/Commands/RicWellLogTools.cpp +++ b/ApplicationCode/Commands/RicWellLogTools.cpp @@ -19,6 +19,7 @@ #include "RicWellLogTools.h" #include "RiaGuiApplication.h" +#include "RigWellLogCurveData.h" #include "Rim3dView.h" #include "RimCase.h" @@ -273,7 +274,16 @@ ExtractionCurveType* RicWellLogTools::addExtractionCurve( RimWellLogTrack* plotTrack->addCurve( curve ); + if ( plot && curve->curveData() ) + { + plot->setDepthUnit( curve->curveData()->depthUnit() ); + } + + curve->loadDataAndUpdate( true ); + + curve->updateConnectedEditors(); plotTrack->updateConnectedEditors(); + plot->updateConnectedEditors(); RiaApplication::instance()->project()->updateConnectedEditors(); RiaGuiApplication::instance()->getOrCreateMainPlotWindow(); diff --git a/ApplicationCode/Commands/WellLogCommands/RicNewWellLogCurveExtractionFeature.cpp b/ApplicationCode/Commands/WellLogCommands/RicNewWellLogCurveExtractionFeature.cpp index 76fb7049b6..433903560f 100644 --- a/ApplicationCode/Commands/WellLogCommands/RicNewWellLogCurveExtractionFeature.cpp +++ b/ApplicationCode/Commands/WellLogCommands/RicNewWellLogCurveExtractionFeature.cpp @@ -123,16 +123,6 @@ void RicNewWellLogCurveExtractionFeature::onActionTriggered( bool isChecked ) simWell, branchIndex, useBranchDetection ); - - plotCurve->loadDataAndUpdate( true ); - - newWellLogPlotTrack->firstAncestorOrThisOfType( wellLogPlot ); - if ( wellLogPlot && plotCurve->curveData() ) - { - wellLogPlot->setDepthUnit( plotCurve->curveData()->depthUnit() ); - } - - plotCurve->updateConnectedEditors(); } } RiuPlotMainWindowTools::refreshToolbars(); From d09e33f6d8208207a1d4e7cb80218a6476bc7fb7 Mon Sep 17 00:00:00 2001 From: Gaute Lindkvist Date: Fri, 29 Nov 2019 15:38:37 +0100 Subject: [PATCH 44/50] Remove unused variable --- .../RicNewWellLogCurveExtractionFeature.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/ApplicationCode/Commands/WellLogCommands/RicNewWellLogCurveExtractionFeature.cpp b/ApplicationCode/Commands/WellLogCommands/RicNewWellLogCurveExtractionFeature.cpp index 433903560f..5070267c4a 100644 --- a/ApplicationCode/Commands/WellLogCommands/RicNewWellLogCurveExtractionFeature.cpp +++ b/ApplicationCode/Commands/WellLogCommands/RicNewWellLogCurveExtractionFeature.cpp @@ -116,13 +116,13 @@ void RicNewWellLogCurveExtractionFeature::onActionTriggered( bool isChecked ) newWellLogPlotTrack->setFormationCase( view->ownerCase() ); } - RimWellLogExtractionCurve* plotCurve = RicWellLogTools::addWellLogExtractionCurve( newWellLogPlotTrack, - ownerCase, - view, - wellPath, - simWell, - branchIndex, - useBranchDetection ); + RicWellLogTools::addWellLogExtractionCurve( newWellLogPlotTrack, + ownerCase, + view, + wellPath, + simWell, + branchIndex, + useBranchDetection ); } } RiuPlotMainWindowTools::refreshToolbars(); From 7ffdba0437ffc7522ac4151385f2ff9bb9653890 Mon Sep 17 00:00:00 2001 From: Gaute Lindkvist Date: Fri, 29 Nov 2019 16:05:21 +0100 Subject: [PATCH 45/50] Make well log curves work on statistics cases --- ApplicationCode/Application/Tools/RiaSimWellBranchTools.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/ApplicationCode/Application/Tools/RiaSimWellBranchTools.cpp b/ApplicationCode/Application/Tools/RiaSimWellBranchTools.cpp index c2d3f76772..e1b394d469 100644 --- a/ApplicationCode/Application/Tools/RiaSimWellBranchTools.cpp +++ b/ApplicationCode/Application/Tools/RiaSimWellBranchTools.cpp @@ -38,8 +38,10 @@ std::vector RiaSimWellBranchTools::simulationWellBranches( c RimProject* proj = app->project(); // Find first case containing the specified simulation well - auto simCases = proj->eclipseCases(); - auto caseItr = std::find_if( simCases.begin(), simCases.end(), [&simWellName]( const RimEclipseCase* eclCase ) { + std::vector simCases; + proj->descendantsIncludingThisOfType( simCases ); + + auto caseItr = std::find_if( simCases.begin(), simCases.end(), [&simWellName]( const RimEclipseCase* eclCase ) { const auto& eclData = eclCase->eclipseCaseData(); return eclData != nullptr && eclData->hasSimulationWell( simWellName ); } ); From bfa9ff637b7f33e1642773a163a285f994ae7350 Mon Sep 17 00:00:00 2001 From: Gaute Lindkvist Date: Fri, 29 Nov 2019 16:24:46 +0100 Subject: [PATCH 46/50] #5133 Reassign summary curves to the file summary case copy when closing a grid case --- .../Summary/RimSummaryCaseMainCollection.cpp | 42 +++++++++++++++++-- .../Summary/RimSummaryCaseMainCollection.h | 5 ++- 2 files changed, 42 insertions(+), 5 deletions(-) diff --git a/ApplicationCode/ProjectDataModel/Summary/RimSummaryCaseMainCollection.cpp b/ApplicationCode/ProjectDataModel/Summary/RimSummaryCaseMainCollection.cpp index 7f9b4ff28f..bbfa85ecb3 100644 --- a/ApplicationCode/ProjectDataModel/Summary/RimSummaryCaseMainCollection.cpp +++ b/ApplicationCode/ProjectDataModel/Summary/RimSummaryCaseMainCollection.cpp @@ -29,6 +29,7 @@ #include "RimProject.h" #include "RimSummaryCase.h" #include "RimSummaryCaseCollection.h" +#include "RimSummaryCurve.h" #include "cafProgressInfo.h" #include @@ -166,9 +167,6 @@ void RimSummaryCaseMainCollection::convertGridSummaryCasesToFileSummaryCases( Ri RimSummaryCaseCollection* collection; gridSummaryCase->firstAncestorOrThisOfType( collection ); - removeCase( gridSummaryCase ); - delete gridSummaryCase; - if ( collection ) { collection->addCase( fileSummaryCase ); @@ -179,7 +177,12 @@ void RimSummaryCaseMainCollection::convertGridSummaryCasesToFileSummaryCases( Ri this->addCase( fileSummaryCase ); this->updateConnectedEditors(); } + loadSummaryCaseData( {fileSummaryCase} ); + reassignSummaryCurves( gridSummaryCase, fileSummaryCase ); + + removeCase( gridSummaryCase ); + delete gridSummaryCase; } //-------------------------------------------------------------------------------------------------- @@ -426,6 +429,39 @@ void RimSummaryCaseMainCollection::loadFileSummaryCaseData( std::vector referringFields; + gridSummaryCase->referringPtrFields( referringFields ); + for ( caf::PdmFieldHandle* field : referringFields ) + { + RimSummaryCurve* summaryCurve = dynamic_cast( field->ownerObject() ); + if ( summaryCurve ) + { + bool updated = false; + if ( summaryCurve->summaryCaseX() == gridSummaryCase ) + { + summaryCurve->setSummaryCaseX( fileSummaryCase ); + updated = true; + } + if ( summaryCurve->summaryCaseY() == gridSummaryCase ) + { + summaryCurve->setSummaryCaseY( fileSummaryCase ); + updated = true; + } + if ( updated ) + { + summaryCurve->loadDataAndUpdate( false ); + summaryCurve->updateConnectedEditors(); + } + } + } +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationCode/ProjectDataModel/Summary/RimSummaryCaseMainCollection.h b/ApplicationCode/ProjectDataModel/Summary/RimSummaryCaseMainCollection.h index 0b8b2efc22..f51be0d645 100644 --- a/ApplicationCode/ProjectDataModel/Summary/RimSummaryCaseMainCollection.h +++ b/ApplicationCode/ProjectDataModel/Summary/RimSummaryCaseMainCollection.h @@ -73,8 +73,9 @@ public: void updateFilePathsFromProjectPath( const QString& newProjectPath, const QString& oldProjectPath ); private: - static void loadSummaryCaseData( std::vector summaryCases ); - static void loadFileSummaryCaseData( std::vector fileSummaryCases ); + static void loadSummaryCaseData( std::vector summaryCases ); + static void loadFileSummaryCaseData( std::vector fileSummaryCases ); + static void reassignSummaryCurves( const RimGridSummaryCase* fromGridCase, RimFileSummaryCase* toFileCase ); static RimSummaryCaseCollection* defaultAllocator(); private: From 82155ae779fff3754b8859f232e531d06cb78bee Mon Sep 17 00:00:00 2001 From: Gaute Lindkvist Date: Sat, 30 Nov 2019 10:23:24 +0100 Subject: [PATCH 47/50] #5106 Fix crash when importing multiple well paths with the same name --- ApplicationCode/Application/RiaApplication.cpp | 8 ++++---- ApplicationCode/Application/RiaApplication.h | 6 +++--- .../Commands/WellPathCommands/RicImportWellPaths.cpp | 10 +++++----- .../Commands/WellPathCommands/RicImportWellPaths.h | 7 +++---- .../ProjectDataModel/RimWellPathCollection.cpp | 7 ++++--- .../ProjectDataModel/RimWellPathCollection.h | 4 ++-- 6 files changed, 21 insertions(+), 21 deletions(-) diff --git a/ApplicationCode/Application/RiaApplication.cpp b/ApplicationCode/Application/RiaApplication.cpp index 0958f875e3..19babbd370 100644 --- a/ApplicationCode/Application/RiaApplication.cpp +++ b/ApplicationCode/Application/RiaApplication.cpp @@ -316,7 +316,7 @@ bool RiaApplication::openFile( const QString& fileName ) } else if ( fileType & RiaDefines::ANY_ECLIPSE_FILE ) { - loadingSucceded = RicImportGeneralDataFeature::openEclipseFilesFromFileNames( QStringList{fileName}, true ); + loadingSucceded = RicImportGeneralDataFeature::openEclipseFilesFromFileNames( QStringList{ fileName }, true ); lastUsedDialogTag = RiaDefines::defaultDirectoryLabel( fileType ); } @@ -849,8 +849,8 @@ bool RiaApplication::openOdbCaseFromFile( const QString& fileName, bool applyTim //-------------------------------------------------------------------------------------------------- /// Add a list of well path file paths (JSON files) to the well path collection //-------------------------------------------------------------------------------------------------- -std::vector RiaApplication::addWellPathsToModel( QList wellPathFilePaths, - QStringList* errorMessages ) +std::vector RiaApplication::addWellPathsToModel( QList wellPathFilePaths, + QStringList* errorMessages ) { CAF_ASSERT( errorMessages ); @@ -867,7 +867,7 @@ std::vector RiaApplication::addWellPathsToModel( QListupdateConnectedEditors(); } - std::vector wellPaths; + std::vector wellPaths; if ( oilField->wellPathCollection ) { wellPaths = oilField->wellPathCollection->addWellPaths( wellPathFilePaths, errorMessages ); diff --git a/ApplicationCode/Application/RiaApplication.h b/ApplicationCode/Application/RiaApplication.h index 622349afba..c6db277d32 100644 --- a/ApplicationCode/Application/RiaApplication.h +++ b/ApplicationCode/Application/RiaApplication.h @@ -54,7 +54,7 @@ class RigEclipseCaseData; class RimCommandObject; class RimEclipseCase; class RimEclipseView; -class RimFileWellPath; +class RimWellPath; class RimGridView; class RimProject; class RimSummaryPlot; @@ -144,8 +144,8 @@ public: bool openOdbCaseFromFile( const QString& fileName, bool applyTimeStepFilter = false ); - std::vector addWellPathsToModel( QList wellPathFilePaths, QStringList* errorMessages ); - void addWellPathFormationsToModel( QList wellPathFilePaths ); + std::vector addWellPathsToModel( QList wellPathFilePaths, QStringList* errorMessages ); + void addWellPathFormationsToModel( QList wellPathFilePaths ); std::vector addWellLogsToModel( const QList& wellLogFilePaths, QStringList* errorMessages ); QString scriptDirectories() const; diff --git a/ApplicationCode/Commands/WellPathCommands/RicImportWellPaths.cpp b/ApplicationCode/Commands/WellPathCommands/RicImportWellPaths.cpp index bce8f6a941..c4eaa34a82 100644 --- a/ApplicationCode/Commands/WellPathCommands/RicImportWellPaths.cpp +++ b/ApplicationCode/Commands/WellPathCommands/RicImportWellPaths.cpp @@ -103,11 +103,11 @@ RicfCommandResponse RicImportWellPaths::execute() RicfCommandResponse response; if ( !wellPathFiles.empty() ) { - std::vector importedWellPaths = importWellPaths( wellPathFiles, &warningMessages ); + std::vector importedWellPaths = importWellPaths( wellPathFiles, &warningMessages ); if ( !importedWellPaths.empty() ) { RicImportWellPathsResult* wellPathsResult = new RicImportWellPathsResult; - for ( RimFileWellPath* wellPath : importedWellPaths ) + for ( RimWellPath* wellPath : importedWellPaths ) { wellPathsResult->wellPathNames.v().push_back( wellPath->name() ); } @@ -136,15 +136,15 @@ RicfCommandResponse RicImportWellPaths::execute() //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -std::vector RicImportWellPaths::importWellPaths( const QStringList& wellPathFilePaths, - QStringList* errorMessages ) +std::vector RicImportWellPaths::importWellPaths( const QStringList& wellPathFilePaths, + QStringList* errorMessages ) { RiaApplication* app = RiaApplication::instance(); // Remember the path to next time app->setLastUsedDialogDirectory( "WELLPATH_DIR", QFileInfo( wellPathFilePaths.last() ).absolutePath() ); - std::vector wellPaths = app->addWellPathsToModel( wellPathFilePaths, errorMessages ); + std::vector wellPaths = app->addWellPathsToModel( wellPathFilePaths, errorMessages ); RimProject* project = app->project(); diff --git a/ApplicationCode/Commands/WellPathCommands/RicImportWellPaths.h b/ApplicationCode/Commands/WellPathCommands/RicImportWellPaths.h index fdf1da5ea8..d0e1933432 100644 --- a/ApplicationCode/Commands/WellPathCommands/RicImportWellPaths.h +++ b/ApplicationCode/Commands/WellPathCommands/RicImportWellPaths.h @@ -29,7 +29,7 @@ #include -class RimFileWellPath; +class RimWellPath; //================================================================================================== /// @@ -43,9 +43,8 @@ public: RicfCommandResponse execute() override; protected: - static std::vector importWellPaths( const QStringList& wellPathFilePaths, - QStringList* errorMessages ); - static QStringList wellPathNameFilters(); + static std::vector importWellPaths( const QStringList& wellPathFilePaths, QStringList* errorMessages ); + static QStringList wellPathNameFilters(); // Overrides bool isCommandEnabled() override; diff --git a/ApplicationCode/ProjectDataModel/RimWellPathCollection.cpp b/ApplicationCode/ProjectDataModel/RimWellPathCollection.cpp index cb845f1790..bb2e028c81 100644 --- a/ApplicationCode/ProjectDataModel/RimWellPathCollection.cpp +++ b/ApplicationCode/ProjectDataModel/RimWellPathCollection.cpp @@ -198,7 +198,7 @@ void RimWellPathCollection::loadDataAndUpdate() //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -std::vector RimWellPathCollection::addWellPaths( QStringList filePaths, QStringList* errorMessages ) +std::vector RimWellPathCollection::addWellPaths( QStringList filePaths, QStringList* errorMessages ) { CAF_ASSERT( errorMessages ); @@ -254,11 +254,12 @@ std::vector RimWellPathCollection::addWellPaths( QStringList f } readAndAddWellPaths( wellPathArray ); + CAF_ASSERT( wellPathArray.empty() ); scheduleRedrawAffectedViews(); updateAllRequiredEditors(); - return wellPathArray; + return wellPaths.childObjects(); } //-------------------------------------------------------------------------------------------------- @@ -299,7 +300,7 @@ void RimWellPathCollection::readAndAddWellPaths( std::vector& progress.incrementProgress(); } - + wellPathArray.clear(); // This should not be used again. We may have deleted items this->sortWellsByName(); } diff --git a/ApplicationCode/ProjectDataModel/RimWellPathCollection.h b/ApplicationCode/ProjectDataModel/RimWellPathCollection.h index 4d406638a5..649bc9308c 100644 --- a/ApplicationCode/ProjectDataModel/RimWellPathCollection.h +++ b/ApplicationCode/ProjectDataModel/RimWellPathCollection.h @@ -88,8 +88,8 @@ public: caf::PdmChildArrayField wellPaths; - void loadDataAndUpdate(); - std::vector addWellPaths( QStringList filePaths, QStringList* errorMessages ); + void loadDataAndUpdate(); + std::vector addWellPaths( QStringList filePaths, QStringList* errorMessages ); void removeWellPath( RimWellPath* wellPath ); void deleteAllWellPaths(); From e87466717cb6c6d4e50d7d46152505f196a3b983 Mon Sep 17 00:00:00 2001 From: Kristian Bendiksen Date: Tue, 19 Nov 2019 21:11:38 +0100 Subject: [PATCH 48/50] #5047 Remove input property collection from project tree. --- .../RicAddEclipseInputPropertyFeature.cpp | 26 ++++--------------- .../RimContextCommandBuilder.cpp | 5 ---- .../ProjectDataModel/RimEclipseCase.cpp | 5 ---- 3 files changed, 5 insertions(+), 31 deletions(-) diff --git a/ApplicationCode/Commands/EclipseCommands/RicAddEclipseInputPropertyFeature.cpp b/ApplicationCode/Commands/EclipseCommands/RicAddEclipseInputPropertyFeature.cpp index dfd43b197b..4e04afd650 100644 --- a/ApplicationCode/Commands/EclipseCommands/RicAddEclipseInputPropertyFeature.cpp +++ b/ApplicationCode/Commands/EclipseCommands/RicAddEclipseInputPropertyFeature.cpp @@ -40,8 +40,7 @@ CAF_CMD_SOURCE_INIT( RicAddEclipseInputPropertyFeature, "RicAddEclipseInputPrope //-------------------------------------------------------------------------------------------------- bool RicAddEclipseInputPropertyFeature::isCommandEnabled() { - return caf::SelectionManager::instance()->selectedItemOfType() || - caf::SelectionManager::instance()->selectedItemOfType() || + return caf::SelectionManager::instance()->selectedItemOfType() || caf::SelectionManager::instance()->selectedItemOfType(); } @@ -50,26 +49,11 @@ bool RicAddEclipseInputPropertyFeature::isCommandEnabled() //-------------------------------------------------------------------------------------------------- void RicAddEclipseInputPropertyFeature::onActionTriggered( bool isChecked ) { - RimEclipseCase* eclipseCase = nullptr; + RimEclipseCase* eclipseCase = caf::SelectionManager::instance()->selectedItemOfType(); + if ( !eclipseCase ) return; - RimEclipseInputPropertyCollection* inputPropertyCollection = - caf::SelectionManager::instance()->selectedItemOfType(); - if ( !inputPropertyCollection ) - { - // No property collection selected: triggered from RimEclipseInputCase/RimEclipseResultCase. - eclipseCase = caf::SelectionManager::instance()->selectedItemOfType(); - if ( eclipseCase ) - { - inputPropertyCollection = eclipseCase->inputPropertyCollection(); - } - } - else - { - // Triggered from collection: get eclipse case ancestor - inputPropertyCollection->firstAncestorOrThisOfTypeAsserted( eclipseCase ); - } - - if ( !inputPropertyCollection || !eclipseCase ) return; + RimEclipseInputPropertyCollection* inputPropertyCollection = eclipseCase->inputPropertyCollection(); + if ( !inputPropertyCollection ) return; QFileInfo fi( eclipseCase->gridFileName() ); QString casePath = fi.absolutePath(); diff --git a/ApplicationCode/ProjectDataModel/RimContextCommandBuilder.cpp b/ApplicationCode/ProjectDataModel/RimContextCommandBuilder.cpp index efb5a74ecf..b5e98c28ed 100644 --- a/ApplicationCode/ProjectDataModel/RimContextCommandBuilder.cpp +++ b/ApplicationCode/ProjectDataModel/RimContextCommandBuilder.cpp @@ -43,7 +43,6 @@ #include "RimEclipseContourMapViewCollection.h" #include "RimEclipseFaultColors.h" #include "RimEclipseInputProperty.h" -#include "RimEclipseInputPropertyCollection.h" #include "RimEclipsePropertyFilter.h" #include "RimEclipsePropertyFilterCollection.h" #include "RimEclipseStatisticsCase.h" @@ -264,10 +263,6 @@ caf::CmdFeatureMenuBuilder RimContextCommandBuilder::commandsFromSelection() menuBuilder << "RicSaveEclipseInputVisibleCellsFeature"; menuBuilder << "RicCreateGridCrossPlotFeature"; } - else if ( dynamic_cast( firstUiItem ) ) - { - menuBuilder << "RicAddEclipseInputPropertyFeature"; - } else if ( dynamic_cast( firstUiItem ) ) { menuBuilder << "RicSaveEclipseInputPropertyFeature"; diff --git a/ApplicationCode/ProjectDataModel/RimEclipseCase.cpp b/ApplicationCode/ProjectDataModel/RimEclipseCase.cpp index 5d63b559b5..c12e74cc22 100644 --- a/ApplicationCode/ProjectDataModel/RimEclipseCase.cpp +++ b/ApplicationCode/ProjectDataModel/RimEclipseCase.cpp @@ -550,11 +550,6 @@ void RimEclipseCase::defineUiTreeOrdering( caf::PdmUiTreeOrdering& uiTreeOrderin uiTreeOrdering.add( &m_contourMapCollection ); } - if ( !m_inputPropertyCollection->inputProperties.empty() ) - { - uiTreeOrdering.add( &m_inputPropertyCollection ); - } - uiTreeOrdering.skipRemainingChildren( true ); } From e03582ab4bed796beacd6f5abf9c2b4a03a55b7e Mon Sep 17 00:00:00 2001 From: Magne Sjaastad Date: Mon, 2 Dec 2019 12:17:50 +0100 Subject: [PATCH 49/50] Revert case Ids to start at 0 --- ApplicationCode/ProjectDataModel/RimProject.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ApplicationCode/ProjectDataModel/RimProject.cpp b/ApplicationCode/ProjectDataModel/RimProject.cpp index b8ae0f155e..91f56f28b1 100644 --- a/ApplicationCode/ProjectDataModel/RimProject.cpp +++ b/ApplicationCode/ProjectDataModel/RimProject.cpp @@ -101,8 +101,8 @@ CAF_PDM_SOURCE_INIT( RimProject, "ResInsightProject" ); /// //-------------------------------------------------------------------------------------------------- RimProject::RimProject( void ) - : m_nextValidCaseId( 1 ) - , m_nextValidCaseGroupId( 1 ) + : m_nextValidCaseId( 0 ) + , m_nextValidCaseGroupId( 0 ) , m_nextValidViewId( 1 ) { CAF_PDM_InitObject( "Project", "", "", "" ); From 631570f6a5decae125d43c31d4be6a78deab319e Mon Sep 17 00:00:00 2001 From: Gaute Lindkvist Date: Sat, 30 Nov 2019 12:08:42 +0100 Subject: [PATCH 50/50] #5150 Improve wheel zoom with logarithmic axes * Limit the amount to scroll at one time and set a fixed minimum --- .../Summary/RimSummaryPlot.cpp | 2 + .../UserInterface/RiuQwtPlotWheelZoomer.cpp | 41 ++++++++++++++++++- .../UserInterface/RiuQwtPlotWheelZoomer.h | 13 +++++- .../UserInterface/RiuSummaryQwtPlot.cpp | 12 +++++- .../UserInterface/RiuSummaryQwtPlot.h | 8 +++- 5 files changed, 70 insertions(+), 6 deletions(-) diff --git a/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlot.cpp b/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlot.cpp index d62ef1a34b..cc4c271261 100644 --- a/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlot.cpp +++ b/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlot.cpp @@ -859,6 +859,8 @@ void RimSummaryPlot::updateZoomForAxis( RiaDefines::PlotAxis plotAxis ) if ( yAxisProps->isAutoZoom() ) { + m_plotWidget->setAxisIsLogarithmic( yAxisProps->qwtPlotAxisType(), yAxisProps->isLogarithmicScaleEnabled ); + if ( yAxisProps->isLogarithmicScaleEnabled ) { std::vector plotCurves; diff --git a/ApplicationCode/UserInterface/RiuQwtPlotWheelZoomer.cpp b/ApplicationCode/UserInterface/RiuQwtPlotWheelZoomer.cpp index 57db90cdaf..17e9867a80 100644 --- a/ApplicationCode/UserInterface/RiuQwtPlotWheelZoomer.cpp +++ b/ApplicationCode/UserInterface/RiuQwtPlotWheelZoomer.cpp @@ -17,10 +17,15 @@ ///////////////////////////////////////////////////////////////////////////////// #include "RiuQwtPlotWheelZoomer.h" + +#include "cvfMath.h" + #include "qwt_plot.h" +#include "qwt_scale_div.h" #include #include +#define RIU_LOGARITHMIC_MINIMUM 1.0e-15 #define RIU_SCROLLWHEEL_ZOOMFACTOR 1.1 #define RIU_SCROLLWHEEL_PANFACTOR 0.1 @@ -37,15 +42,41 @@ RiuQwtPlotWheelZoomer::RiuQwtPlotWheelZoomer( QwtPlot* plot ) //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void zoomOnAxis( QwtPlot* plot, QwtPlot::Axis axis, double zoomFactor, int eventPos ) +void RiuQwtPlotWheelZoomer::zoomOnAxis( QwtPlot* plot, QwtPlot::Axis axis, double zoomFactor, int eventPos ) { QwtScaleMap scaleMap = plot->canvasMap( axis ); double zoomCenter = scaleMap.invTransform( eventPos ); double newMin = zoomCenter - zoomFactor * ( zoomCenter - scaleMap.s1() ); double newMax = zoomCenter + zoomFactor * ( -zoomCenter + scaleMap.s2() ); + + // the QwtScaleDiv::interval yields the current axis range + // The following thus doesn't limit the zoom to the min/max data but + // Stops the zoom from changing too much in one step + QwtInterval axisRange = plot->axisScaleDiv( axis ).interval(); + if ( axisIsLogarithmic( axis ) ) + { + // Handle inverted axes as well by not assuming maxValue > minValue + double minValue = std::max( RIU_LOGARITHMIC_MINIMUM, + 0.1 * std::min( axisRange.minValue(), axisRange.maxValue() ) ); + double maxValue = std::max( RIU_LOGARITHMIC_MINIMUM, + 10.0 * std::max( axisRange.minValue(), axisRange.maxValue() ) ); + + newMin = cvf::Math::clamp( newMin, minValue, maxValue ); + newMax = cvf::Math::clamp( newMax, minValue, maxValue ); + } + plot->setAxisScale( axis, newMin, newMax ); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RiuQwtPlotWheelZoomer::axisIsLogarithmic( QwtPlot::Axis axis ) const +{ + auto it = m_axesAreLogarithmic.find( axis ); + return it != m_axesAreLogarithmic.end() ? it->second : false; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -71,3 +102,11 @@ bool RiuQwtPlotWheelZoomer::eventFilter( QObject* watched, QEvent* event ) return false; } + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RiuQwtPlotWheelZoomer::setAxisIsLogarithmic( QwtPlot::Axis axis, bool logarithmic ) +{ + m_axesAreLogarithmic[axis] = logarithmic; +} diff --git a/ApplicationCode/UserInterface/RiuQwtPlotWheelZoomer.h b/ApplicationCode/UserInterface/RiuQwtPlotWheelZoomer.h index 2b8af751b1..e589c0aae5 100644 --- a/ApplicationCode/UserInterface/RiuQwtPlotWheelZoomer.h +++ b/ApplicationCode/UserInterface/RiuQwtPlotWheelZoomer.h @@ -17,9 +17,12 @@ ///////////////////////////////////////////////////////////////////////////////// #pragma once +#include "qwt_plot.h" + #include -class QwtPlot; +#include + class QEvent; class RiuQwtPlotWheelZoomer : public QObject @@ -30,9 +33,17 @@ public: bool eventFilter( QObject* watched, QEvent* event ) override; + void setAxisIsLogarithmic( QwtPlot::Axis axis, bool logarithmic ); + signals: void zoomUpdated(); +private: + void zoomOnAxis( QwtPlot* plot, QwtPlot::Axis axis, double zoomFactor, int eventPos ); + bool axisIsLogarithmic( QwtPlot::Axis axis ) const; + private: QwtPlot* m_plot; + + std::map m_axesAreLogarithmic; }; diff --git a/ApplicationCode/UserInterface/RiuSummaryQwtPlot.cpp b/ApplicationCode/UserInterface/RiuSummaryQwtPlot.cpp index 96097c5b79..5f6c997750 100644 --- a/ApplicationCode/UserInterface/RiuSummaryQwtPlot.cpp +++ b/ApplicationCode/UserInterface/RiuSummaryQwtPlot.cpp @@ -112,9 +112,9 @@ RiuSummaryQwtPlot::RiuSummaryQwtPlot( RimPlotInterface* plotDefinition, QWidget* QwtPlotPanner* panner = new QwtPlotPanner( canvas() ); panner->setMouseButton( Qt::MidButton ); - auto wheelZoomer = new RiuQwtPlotWheelZoomer( this ); + m_wheelZoomer = new RiuQwtPlotWheelZoomer( this ); - connect( wheelZoomer, SIGNAL( zoomUpdated() ), SLOT( onZoomedSlot() ) ); + connect( m_wheelZoomer, SIGNAL( zoomUpdated() ), SLOT( onZoomedSlot() ) ); connect( m_zoomerLeft, SIGNAL( zoomed( const QRectF& ) ), SLOT( onZoomedSlot() ) ); connect( m_zoomerRight, SIGNAL( zoomed( const QRectF& ) ), SLOT( onZoomedSlot() ) ); connect( panner, SIGNAL( panned( int, int ) ), SLOT( onZoomedSlot() ) ); @@ -240,6 +240,14 @@ void RiuSummaryQwtPlot::setLegendVisible( bool visible ) } } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RiuSummaryQwtPlot::setAxisIsLogarithmic( QwtPlot::Axis axis, bool logarithmic ) +{ + if ( m_wheelZoomer ) m_wheelZoomer->setAxisIsLogarithmic( axis, logarithmic ); +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationCode/UserInterface/RiuSummaryQwtPlot.h b/ApplicationCode/UserInterface/RiuSummaryQwtPlot.h index 45a38687b2..4ce9e5c751 100644 --- a/ApplicationCode/UserInterface/RiuSummaryQwtPlot.h +++ b/ApplicationCode/UserInterface/RiuSummaryQwtPlot.h @@ -29,6 +29,7 @@ class RimEnsembleCurveSet; class RiuCvfOverlayItemWidget; class RiuQwtPlotZoomer; +class RiuQwtPlotWheelZoomer; //================================================================================================== // @@ -58,6 +59,8 @@ public: void setLegendFontSize( int fontSize ); void setLegendVisible( bool visible ); + void setAxisIsLogarithmic( QwtPlot::Axis axis, bool logarithmic ); + protected: void keyPressEvent( QKeyEvent* ) override; void contextMenuEvent( QContextMenuEvent* ) override; @@ -74,6 +77,7 @@ private: std::map, QPointer> m_ensembleLegendWidgets; - QPointer m_zoomerLeft; - QPointer m_zoomerRight; + QPointer m_zoomerLeft; + QPointer m_zoomerRight; + QPointer m_wheelZoomer; };