Summary multiplot improvements (#8598)

* Create multi summary plot from summary plot(s)
* Rearrange multi summary plot properties
* Enable source stepping toolbar for multi summary plot
* Automatically activate new summary plot when creating from data sources -> data vector tree
* Enable global key controls for switching data in summary and multi summary plots
* Update tooltip texts for summary plot toolbar
This commit is contained in:
jonjenssen 2022-03-04 10:52:17 +01:00 committed by GitHub
parent a32dda2e65
commit abff06d2d5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
35 changed files with 793 additions and 422 deletions

View File

@ -125,6 +125,7 @@
#include <QDir>
#include <QErrorMessage>
#include <QGridLayout>
#include <QKeyEvent>
#include <QMdiSubWindow>
#include <QMessageBox>
#include <QProcessEnvironment>
@ -1681,13 +1682,24 @@ bool RiaGuiApplication::notify( QObject* receiver, QEvent* event )
"unstable and will probably crash soon." );
}
bool done = true;
bool done = false;
try
{
done = QApplication::notify( receiver, event );
if ( event->type() == QEvent::KeyPress )
{
QKeyEvent* keyEvent = static_cast<QKeyEvent*>( event );
RimPlotWindow* plot = dynamic_cast<RimPlotWindow*>( activePlotWindow() );
if ( plot ) done = plot->handleGlobalKeyEvent( keyEvent );
}
if ( !done )
{
done = QApplication::notify( receiver, event );
}
}
catch ( const std::bad_alloc& )
{
done = true;
if ( memoryExhaustedBox ) memoryExhaustedBox->exec();
std::cout << "ResInsight: Memory is Exhausted!\n ResInsight could not allocate the memory needed, and is now "
"unstable "

View File

@ -134,6 +134,8 @@ public:
void showFormattedTextInMessageBoxOrConsole( const QString& errMsg ) override;
protected:
bool notify( QObject* receiver, QEvent* event ) override;
// Protected RiaApplication overrides
void invokeProcessEvents( QEventLoop::ProcessEventsFlags flags = QEventLoop::AllEvents ) override;
void onFileSuccessfullyLoaded( const QString& fileName, RiaDefines::ImportFileType fileType ) override;
@ -159,8 +161,6 @@ private:
void storeTreeViewState();
bool notify( QObject*, QEvent* ) override;
private slots:
void slotWorkerProcessFinished( int exitCode, QProcess::ExitStatus exitStatus );
void onLastWindowClosed();

View File

@ -3,6 +3,7 @@ set(SOURCE_GROUP_HEADER_FILES
${CMAKE_CURRENT_LIST_DIR}/RicSummaryPlotBuilder.h
${CMAKE_CURRENT_LIST_DIR}/RicNewSummaryMultiPlotFeature.h
${CMAKE_CURRENT_LIST_DIR}/RicNewSummaryPlotFromDataVectorFeature.h
${CMAKE_CURRENT_LIST_DIR}/RicNewSummaryMultiPlotFromDataVectorFeature.h
)
set(SOURCE_GROUP_SOURCE_FILES
@ -10,6 +11,7 @@ set(SOURCE_GROUP_SOURCE_FILES
${CMAKE_CURRENT_LIST_DIR}/RicSummaryPlotBuilder.cpp
${CMAKE_CURRENT_LIST_DIR}/RicNewSummaryMultiPlotFeature.cpp
${CMAKE_CURRENT_LIST_DIR}/RicNewSummaryPlotFromDataVectorFeature.cpp
${CMAKE_CURRENT_LIST_DIR}/RicNewSummaryMultiPlotFromDataVectorFeature.cpp
)
list(APPEND COMMAND_CODE_HEADER_FILES ${SOURCE_GROUP_HEADER_FILES})

View File

@ -1,6 +1,6 @@
/////////////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2021 Equinor ASA
// Copyright (C) 2022 Equinor ASA
//
// ResInsight is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
@ -19,8 +19,10 @@
#include "RicNewSummaryMultiPlotFeature.h"
#include "RimMultiPlotCollection.h"
#include "RimPlot.h"
#include "RimSummaryMultiPlot.h"
#include "RimSummaryPlot.h"
#include "RicSummaryPlotBuilder.h"
#include "cafSelectionManager.h"
#include "cvfAssert.h"
@ -34,17 +36,7 @@ RICF_SOURCE_INIT( RicNewSummaryMultiPlotFeature, "RicNewSummaryMultiPlotFeature"
//--------------------------------------------------------------------------------------------------
RicNewSummaryMultiPlotFeature::RicNewSummaryMultiPlotFeature()
{
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
caf::PdmScriptResponse RicNewSummaryMultiPlotFeature::execute()
{
std::vector<RimSummaryPlot*> plots;
RimSummaryMultiPlot::createAndAppendMultiPlot( plots );
return caf::PdmScriptResponse();
CAF_PDM_InitFieldNoDefault( &m_plots, "plots", "Plots" );
}
//--------------------------------------------------------------------------------------------------
@ -52,16 +44,12 @@ caf::PdmScriptResponse RicNewSummaryMultiPlotFeature::execute()
//--------------------------------------------------------------------------------------------------
bool RicNewSummaryMultiPlotFeature::isCommandEnabled()
{
RimMultiPlotCollection* objToFind = nullptr;
auto plots = selectedPlots();
auto pdmUiItem = caf::SelectionManager::instance()->selectedItem();
auto objHandle = dynamic_cast<caf::PdmObjectHandle*>( pdmUiItem );
if ( objHandle )
{
objHandle->firstAncestorOrThisOfType( objToFind );
}
std::vector<caf::PdmUiItem*> selectedUiItems;
caf::SelectionManager::instance()->selectedItems( selectedUiItems );
return ( objToFind != nullptr );
return !plots.empty() && plots.size() == selectedUiItems.size();
}
//--------------------------------------------------------------------------------------------------
@ -69,6 +57,12 @@ bool RicNewSummaryMultiPlotFeature::isCommandEnabled()
//--------------------------------------------------------------------------------------------------
void RicNewSummaryMultiPlotFeature::onActionTriggered( bool isChecked )
{
m_plots.v().clear();
auto plots = selectedPlots();
for ( RimPlot* plot : plots )
{
m_plots.v().push_back( reinterpret_cast<uintptr_t>( plot ) );
}
execute();
}
@ -77,6 +71,47 @@ void RicNewSummaryMultiPlotFeature::onActionTriggered( bool isChecked )
//--------------------------------------------------------------------------------------------------
void RicNewSummaryMultiPlotFeature::setupActionLook( QAction* actionToSetup )
{
actionToSetup->setText( "Create Summary Multi Plot" );
actionToSetup->setText( "Create Summary Multi Plot from Selected Plots" );
actionToSetup->setIcon( QIcon( ":/MultiPlot16x16.png" ) );
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
std::vector<RimSummaryPlot*> RicNewSummaryMultiPlotFeature::selectedPlots()
{
std::vector<caf::PdmUiItem*> uiItems;
caf::SelectionManager::instance()->selectedItems( uiItems );
std::vector<RimSummaryPlot*> plots;
for ( caf::PdmUiItem* uiItem : uiItems )
{
RimSummaryPlot* summaryPlot = dynamic_cast<RimSummaryPlot*>( uiItem );
if ( summaryPlot )
{
plots.push_back( summaryPlot );
}
}
return plots;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
caf::PdmScriptResponse RicNewSummaryMultiPlotFeature::execute()
{
if ( !m_plots().empty() )
{
std::vector<RimSummaryPlot*> plots;
for ( auto ptr : m_plots() )
{
plots.push_back( reinterpret_cast<RimSummaryPlot*>( ptr ) );
}
auto copyOfPlots = RicSummaryPlotBuilder::duplicateSummaryPlots( plots );
RicSummaryPlotBuilder::createAndAppendSummaryMultiPlot( copyOfPlots );
}
return caf::PdmScriptResponse();
}

View File

@ -1,6 +1,6 @@
/////////////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2021 Equinor ASA
// Copyright (C) 2022 Equinor ASA
//
// ResInsight is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
@ -25,7 +25,7 @@
#include <vector>
class RimPlot;
class RimSummaryPlot;
//==================================================================================================
///
@ -43,4 +43,9 @@ protected:
bool isCommandEnabled() override;
void onActionTriggered( bool isChecked ) override;
void setupActionLook( QAction* actionToSetup ) override;
private:
static std::vector<RimSummaryPlot*> selectedPlots();
caf::PdmField<std::vector<uint64_t>> m_plots;
};

View File

@ -0,0 +1,115 @@
/////////////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2022 Equinor ASA
//
// ResInsight is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY
// WARRANTY; without even the implied warranty of MERCHANTABILITY or
// FITNESS FOR A PARTICULAR PURPOSE.
//
// See the GNU General Public License at <http://www.gnu.org/licenses/gpl.html>
// for more details.
//
/////////////////////////////////////////////////////////////////////////////////
#include "RicNewSummaryMultiPlotFromDataVectorFeature.h"
#include "RiaSummaryTools.h"
#include "RimSummaryAddress.h"
#include "RimSummaryPlot.h"
#include "RimSummaryPlotCollection.h"
#include "RicSummaryPlotBuilder.h"
#include "RifEclipseSummaryAddress.h"
#include "cafSelectionManagerTools.h"
#include "cvfAssert.h"
#include <QAction>
CAF_CMD_SOURCE_INIT( RicNewSummaryMultiPlotFromDataVectorFeature, "RicNewSummaryMultiPlotFromDataVectorFeature" );
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
bool RicNewSummaryMultiPlotFromDataVectorFeature::isCommandEnabled()
{
std::vector<caf::PdmUiItem*> selectedItems;
caf::SelectionManager::instance()->selectedItems( selectedItems );
std::vector<RimSummaryAddress*> selectedAddressItems = caf::selectedObjectsByType<RimSummaryAddress*>();
unsigned int nEnsembles = 0;
for ( auto adr : selectedAddressItems )
{
if ( adr->isEnsemble() ) nEnsembles++;
}
bool bOk = ( selectedAddressItems.size() > 0 );
if ( nEnsembles > 0 )
{
bOk = bOk && ( nEnsembles == selectedItems.size() );
}
bOk = bOk && ( selectedAddressItems.size() == selectedItems.size() );
return bOk;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RicNewSummaryMultiPlotFromDataVectorFeature::onActionTriggered( bool isChecked )
{
std::vector<RimSummaryAddress*> selectedAddressItems = caf::selectedObjectsByType<RimSummaryAddress*>();
std::set<int> caseIds;
std::set<int> ensembleIds;
std::vector<RimSummaryCase*> selectedCases;
std::set<RifEclipseSummaryAddress> eclipseAddresses;
std::vector<RimSummaryCaseCollection*> selectedEnsembles;
bool isEnsemble = false;
for ( auto adr : selectedAddressItems )
{
eclipseAddresses.insert( adr->address() );
caseIds.insert( adr->caseId() );
ensembleIds.insert( adr->ensembleId() );
isEnsemble = isEnsemble || adr->isEnsemble();
}
if ( isEnsemble )
{
for ( auto id : ensembleIds )
{
selectedEnsembles.push_back( RiaSummaryTools::ensembleById( id ) );
}
}
else
{
for ( auto id : caseIds )
{
selectedCases.push_back( RiaSummaryTools::summaryCaseById( id ) );
}
}
auto newPlot = RicSummaryPlotBuilder::createPlot( eclipseAddresses, selectedCases, selectedEnsembles );
std::vector<RimSummaryPlot*> plots{ newPlot };
RicSummaryPlotBuilder::createAndAppendSummaryMultiPlot( plots );
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RicNewSummaryMultiPlotFromDataVectorFeature::setupActionLook( QAction* actionToSetup )
{
actionToSetup->setText( "New Multi Summary Plot" );
actionToSetup->setIcon( QIcon( ":/SummaryPlotLight16x16.png" ) );
}

View File

@ -0,0 +1,37 @@
/////////////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2022 Equinor ASA
//
// ResInsight is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY
// WARRANTY; without even the implied warranty of MERCHANTABILITY or
// FITNESS FOR A PARTICULAR PURPOSE.
//
// See the GNU General Public License at <http://www.gnu.org/licenses/gpl.html>
// for more details.
//
/////////////////////////////////////////////////////////////////////////////////
#pragma once
#include "RicfCommandObject.h"
#include "cafCmdFeature.h"
//==================================================================================================
///
//==================================================================================================
class RicNewSummaryMultiPlotFromDataVectorFeature : public caf::CmdFeature
{
CAF_CMD_HEADER_INIT;
protected:
// Overrides
bool isCommandEnabled() override;
void onActionTriggered( bool isChecked ) override;
void setupActionLook( QAction* actionToSetup ) override;
};

View File

@ -27,6 +27,8 @@
#include "RifEclipseSummaryAddress.h"
#include "RiuPlotMainWindowTools.h"
#include "cafSelectionManagerTools.h"
#include "cvfAssert.h"
@ -108,6 +110,8 @@ void RicNewSummaryPlotFromDataVectorFeature::onActionTriggered( bool isChecked )
newPlot->loadDataAndUpdate();
plotCollection->updateConnectedEditors();
RiuPlotMainWindowTools::selectAsCurrentItem( newPlot, true );
}
//--------------------------------------------------------------------------------------------------

View File

@ -36,6 +36,8 @@
#include "RimSummaryCase.h"
#include "RimSummaryCaseCollection.h"
#include "RimSummaryCurve.h"
#include "RimSummaryMultiPlot.h"
#include "RimSummaryMultiPlotCollection.h"
#include "RimSummaryPlotCollection.h"
#include "RiuPlotMainWindowTools.h"
@ -292,6 +294,27 @@ std::vector<RimPlot*> RicSummaryPlotBuilder::duplicatePlots( const std::vector<R
return plots;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
std::vector<RimSummaryPlot*> RicSummaryPlotBuilder::duplicateSummaryPlots( const std::vector<RimSummaryPlot*>& sourcePlots )
{
std::vector<RimSummaryPlot*> plots;
for ( auto plot : sourcePlots )
{
auto copy =
dynamic_cast<RimSummaryPlot*>( plot->copyByXmlSerialization( caf::PdmDefaultObjectFactory::instance() ) );
if ( copy )
{
plots.push_back( copy );
}
}
return plots;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
@ -335,6 +358,49 @@ void RicSummaryPlotBuilder::appendPlotsToMultiPlot( RimMultiPlot* multiPlot, con
}
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
RimSummaryMultiPlot* RicSummaryPlotBuilder::createAndAppendSummaryMultiPlot( const std::vector<RimSummaryPlot*>& plots )
{
RimProject* project = RimProject::current();
auto* plotCollection = project->mainPlotCollection()->summaryMultiPlotCollection();
auto* plotWindow = new RimSummaryMultiPlot();
plotWindow->setMultiPlotTitle( QString( "Multi Summary Plot %1" ).arg( plotCollection->multiPlots().size() + 1 ) );
plotWindow->setAsPlotMdiWindow();
plotCollection->addMultiSummaryPlot( plotWindow );
appendPlotsToSummaryMultiPlot( plotWindow, plots );
plotCollection->updateAllRequiredEditors();
plotWindow->loadDataAndUpdate();
RiuPlotMainWindowTools::selectAsCurrentItem( plotWindow, true );
plotWindow->updateAllRequiredEditors();
return plotWindow;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RicSummaryPlotBuilder::appendPlotsToSummaryMultiPlot( RimSummaryMultiPlot* multiPlot,
const std::vector<RimSummaryPlot*>& plots )
{
for ( auto plot : plots )
{
plot->revokeMdiWindowStatus();
multiPlot->addPlot( plot );
plot->resolveReferencesRecursively();
plot->setShowWindow( true );
plot->loadDataAndUpdate();
}
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------

View File

@ -26,6 +26,7 @@ class RimSummaryCaseCollection;
class RimSummaryPlot;
class RimEnsembleCurveSet;
class RimSummaryCurve;
class RimSummaryMultiPlot;
namespace caf
{
@ -67,9 +68,14 @@ public:
static RimEnsembleCurveSet* createCurveSet( RimSummaryCaseCollection* ensemble, const RifEclipseSummaryAddress& addr );
static RimSummaryCurve* createCurve( RimSummaryCase* summaryCase, const RifEclipseSummaryAddress& addr );
static std::vector<RimPlot*> duplicatePlots( const std::vector<RimPlot*>& plots );
static RimMultiPlot* createAndAppendMultiPlot( const std::vector<RimPlot*>& plots );
static void appendPlotsToMultiPlot( RimMultiPlot* multiPlot, const std::vector<RimPlot*>& plots );
static std::vector<RimPlot*> duplicatePlots( const std::vector<RimPlot*>& plots );
static std::vector<RimSummaryPlot*> duplicateSummaryPlots( const std::vector<RimSummaryPlot*>& plots );
static RimMultiPlot* createAndAppendMultiPlot( const std::vector<RimPlot*>& plots );
static void appendPlotsToMultiPlot( RimMultiPlot* multiPlot, const std::vector<RimPlot*>& plots );
static RimSummaryMultiPlot* createAndAppendSummaryMultiPlot( const std::vector<RimSummaryPlot*>& plots );
static void appendPlotsToSummaryMultiPlot( RimSummaryMultiPlot* multiPlot, const std::vector<RimSummaryPlot*>& plots );
static RimSummaryPlot* createPlot( const std::set<RifEclipseSummaryAddress>& addresses,
const std::vector<RimSummaryCase*>& summaryCases,

View File

@ -68,7 +68,7 @@ public:
}
}
void addPlot( RimPlotType* plot ) { insertPlot( plot, plotCount() ); }
virtual void addPlot( RimPlotType* plot ) { insertPlot( plot, plotCount() ); }
virtual void insertPlot( RimPlotType* plot, size_t index ) = 0;
virtual void removePlot( RimPlotType* plot ) = 0;
void removeRimPlot( RimPlot* rimPlot ) override

View File

@ -1065,6 +1065,7 @@ caf::CmdFeatureMenuBuilder RimContextCommandBuilder::commandsFromSelection()
menuBuilder << "RicNewDerivedEnsembleFeature";
menuBuilder << "RicNewSummaryPlotFeature";
menuBuilder << "RicNewDefaultSummaryPlotFeature";
menuBuilder << "RicNewSummaryMultiPlotFeature";
menuBuilder << "RicNewSummaryCrossPlotFeature";
menuBuilder << "RicSummaryCurveSwitchAxisFeature";
menuBuilder << "RicNewDerivedSummaryFeature";
@ -1104,7 +1105,6 @@ caf::CmdFeatureMenuBuilder RimContextCommandBuilder::commandsFromSelection()
menuBuilder << "RicCloseObservedDataFeature";
menuBuilder << "RicNewMultiPlotFeature";
menuBuilder << "RicNewSummaryMultiPlotFeature";
// Work in progress -- End
@ -1189,6 +1189,7 @@ caf::CmdFeatureMenuBuilder RimContextCommandBuilder::commandsFromSelection()
else if ( dynamic_cast<RimSummaryAddress*>( firstUiItem ) )
{
menuBuilder << "RicNewSummaryPlotFromDataVectorFeature";
menuBuilder << "RicNewSummaryMultiPlotFromDataVectorFeature";
}
#ifdef USE_ODB_API
else if ( dynamic_cast<RimWellIASettings*>( firstUiItem ) )

View File

@ -38,6 +38,7 @@
#include "RimStimPlanModelPlotCollection.h"
#include "RimSummaryAddress.h"
#include "RimSummaryCrossPlotCollection.h"
#include "RimSummaryMultiPlotCollection.h"
#include "RimSummaryPlotCollection.h"
#include "RimVfpPlotCollection.h"
#include "RimViewWindow.h"
@ -82,6 +83,9 @@ RimMainPlotCollection::RimMainPlotCollection()
CAF_PDM_InitFieldNoDefault( &m_summaryPlotCollection, "SummaryPlotCollection", "Summary Plots" );
m_summaryPlotCollection.uiCapability()->setUiTreeHidden( true );
CAF_PDM_InitFieldNoDefault( &m_summaryMultiPlotCollection, "SummaryMultiPlotCollection", "Multi Summary Plots" );
m_summaryMultiPlotCollection.uiCapability()->setUiTreeHidden( true );
CAF_PDM_InitFieldNoDefault( &m_analysisPlotCollection, "AnalysisPlotCollection", "Analysis Plots" );
m_analysisPlotCollection.uiCapability()->setUiTreeHidden( true );
@ -122,6 +126,7 @@ RimMainPlotCollection::RimMainPlotCollection()
m_rftPlotCollection = new RimRftPlotCollection();
m_pltPlotCollection = new RimPltPlotCollection();
m_summaryPlotCollection = new RimSummaryPlotCollection();
m_summaryMultiPlotCollection = new RimSummaryMultiPlotCollection();
m_summaryCrossPlotCollection = new RimSummaryCrossPlotCollection();
m_flowPlotCollection = new RimFlowPlotCollection();
m_gridCrossPlotCollection = new RimGridCrossPlotCollection;
@ -193,6 +198,14 @@ RimSummaryPlotCollection* RimMainPlotCollection::summaryPlotCollection() const
return m_summaryPlotCollection();
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
RimSummaryMultiPlotCollection* RimMainPlotCollection::summaryMultiPlotCollection() const
{
return m_summaryMultiPlotCollection();
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
@ -403,6 +416,7 @@ std::vector<RimPlotCollection*> RimMainPlotCollection::allPlotCollections() cons
std::vector<RimPlotCollection*> plotCollections;
plotCollections.push_back( wellLogPlotCollection() );
plotCollections.push_back( summaryPlotCollection() );
plotCollections.push_back( summaryMultiPlotCollection() );
plotCollections.push_back( summaryCrossPlotCollection() );
plotCollections.push_back( gridCrossPlotCollection() );
plotCollections.push_back( analysisPlotCollection() );

View File

@ -33,6 +33,7 @@ class RimRftPlotCollection;
class RimPltPlotCollection;
class RimGridCrossPlotCollection;
class RimMultiPlotCollection;
class RimSummaryMultiPlotCollection;
class RimSummaryPlotCollection;
class RimSummaryCrossPlotCollection;
class RimSummaryPlot;
@ -65,6 +66,7 @@ public:
RimRftPlotCollection* rftPlotCollection() const;
RimPltPlotCollection* pltPlotCollection() const;
RimSummaryPlotCollection* summaryPlotCollection() const;
RimSummaryMultiPlotCollection* summaryMultiPlotCollection() const;
RimSummaryCrossPlotCollection* summaryCrossPlotCollection() const;
RimAnalysisPlotCollection* analysisPlotCollection() const;
RimCorrelationPlotCollection* correlationPlotCollection() const;
@ -105,6 +107,7 @@ private:
caf::PdmChildField<RimRftPlotCollection*> m_rftPlotCollection;
caf::PdmChildField<RimPltPlotCollection*> m_pltPlotCollection;
caf::PdmChildField<RimSummaryPlotCollection*> m_summaryPlotCollection;
caf::PdmChildField<RimSummaryMultiPlotCollection*> m_summaryMultiPlotCollection;
caf::PdmChildField<RimSummaryCrossPlotCollection*> m_summaryCrossPlotCollection;
caf::PdmChildField<RimAnalysisPlotCollection*> m_analysisPlotCollection;
caf::PdmChildField<RimCorrelationPlotCollection*> m_correlationPlotCollection;

View File

@ -757,22 +757,9 @@ void RimMultiPlot::uiOrderingForMultiPlotLayout( QString uiConfigName, caf::PdmU
uiOrdering.add( &m_showPlotWindowTitle );
uiOrdering.add( &m_plotWindowTitle );
uiOrdering.add( &m_showIndividualPlotTitles );
RimPlotWindow::uiOrderingForPlotLayout( uiConfigName, uiOrdering );
uiOrdering.add( &m_subTitleFontSize );
uiOrdering.add( &m_columnCount );
uiOrdering.add( &m_rowsPerPage );
uiOrdering.add( &m_majorTickmarkCount );
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimMultiPlot::uiOrderingForSummaryMultiPlot( caf::PdmUiOrdering& uiOrdering ) const
{
uiOrdering.add( &m_showPlotWindowTitle );
uiOrdering.add( &m_plotWindowTitle );
uiOrdering.add( &m_showIndividualPlotTitles );
uiOrdering.add( &m_subTitleFontSize );
RimPlotWindow::uiOrderingForPlotLayout( uiConfigName, uiOrdering );
uiOrdering.add( &m_columnCount );
uiOrdering.add( &m_rowsPerPage );
uiOrdering.add( &m_majorTickmarkCount );

View File

@ -79,7 +79,6 @@ public:
void insertPlots( const std::vector<RimPlot*>& plots );
void deleteAllPlots() override;
void uiOrderingForSummaryMultiPlot( caf::PdmUiOrdering& uiOrdering ) const;
size_t plotCount() const override;
size_t plotIndex( const RimPlot* plot ) const;
@ -140,11 +139,12 @@ protected:
void updateZoom();
void recreatePlotWidgets();
virtual void updatePlotWindowTitle();
private:
void cleanupBeforeClose();
void doUpdateLayout() override;
void updateSubPlotNames();
void updatePlotWindowTitle();
void doRenderWindowContent( QPaintDevice* paintDevice ) override;
void onPlotAdditionOrRemoval();
void onPlotsReordered( const caf::SignalEmitter* emitter );

View File

@ -19,7 +19,6 @@
#include "RimMultiPlot.h"
#include "RimProject.h"
#include "RimSummaryMultiPlot.h"
#include "cafPdmFieldReorderCapability.h"
@ -35,10 +34,6 @@ RimMultiPlotCollection::RimMultiPlotCollection()
CAF_PDM_InitFieldNoDefault( &m_multiPlots, "MultiPlots", "Plots Reports" );
m_multiPlots.uiCapability()->setUiTreeHidden( true );
caf::PdmFieldReorderCapability::addToField( &m_multiPlots );
CAF_PDM_InitFieldNoDefault( &m_multiSummaryPlots, "MultiSummaryPlots", "Multi Summary Plots" );
m_multiSummaryPlots.uiCapability()->setUiTreeHidden( true );
caf::PdmFieldReorderCapability::addToField( &m_multiSummaryPlots );
}
//--------------------------------------------------------------------------------------------------
@ -54,7 +49,6 @@ RimMultiPlotCollection::~RimMultiPlotCollection()
void RimMultiPlotCollection::deleteAllPlots()
{
m_multiPlots.deleteAllChildObjects();
m_multiSummaryPlots.deleteAllChildObjects();
}
//--------------------------------------------------------------------------------------------------
@ -65,18 +59,6 @@ std::vector<RimMultiPlot*> RimMultiPlotCollection::multiPlots() const
return m_multiPlots.childObjects();
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
RimMultiPlot* RimMultiPlotCollection::createMultiPlot()
{
RimMultiPlot* plot = new RimMultiPlot();
plot->setAsPlotMdiWindow();
addMultiPlot( plot );
return plot;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
@ -85,14 +67,6 @@ void RimMultiPlotCollection::addMultiPlot( RimMultiPlot* plot )
m_multiPlots().push_back( plot );
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimMultiPlotCollection::addMultiSummaryPlot( RimSummaryMultiPlot* plot )
{
m_multiSummaryPlots().push_back( plot );
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
@ -100,9 +74,6 @@ void RimMultiPlotCollection::loadDataAndUpdateAllPlots()
{
for ( const auto& p : m_multiPlots.childObjects() )
p->loadDataAndUpdate();
for ( const auto& p : m_multiSummaryPlots.childObjects() )
p->loadDataAndUpdate();
}
//--------------------------------------------------------------------------------------------------
@ -110,5 +81,5 @@ void RimMultiPlotCollection::loadDataAndUpdateAllPlots()
//--------------------------------------------------------------------------------------------------
size_t RimMultiPlotCollection::plotCount() const
{
return m_multiPlots.size() + m_multiSummaryPlots.size();
return m_multiPlots.size();
}

View File

@ -23,7 +23,6 @@
#include "cafPdmObject.h"
class RimMultiPlot;
class RimSummaryMultiPlot;
//==================================================================================================
///
@ -42,11 +41,9 @@ public:
size_t plotCount() const override;
std::vector<RimMultiPlot*> multiPlots() const;
RimMultiPlot* createMultiPlot();
void addMultiPlot( RimMultiPlot* plot );
void addMultiSummaryPlot( RimSummaryMultiPlot* plot );
void addMultiPlot( RimMultiPlot* plot );
private:
caf::PdmChildArrayField<RimMultiPlot*> m_multiPlots;
caf::PdmChildArrayField<RimSummaryMultiPlot*> m_multiSummaryPlots;
caf::PdmChildArrayField<RimMultiPlot*> m_multiPlots;
};

View File

@ -336,3 +336,11 @@ void RimPlotWindow::assignIdIfNecessary()
RimProject::current()->assignPlotIdToPlotWindow( this );
}
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
bool RimPlotWindow::handleGlobalKeyEvent( QKeyEvent* keyEvent )
{
return false;
}

View File

@ -75,6 +75,8 @@ public:
void renderWindowContent( QPaintDevice* painter );
QPageLayout pageLayout() const;
virtual bool handleGlobalKeyEvent( QKeyEvent* keyEvent );
protected:
void fieldChangedByUi( const caf::PdmFieldHandle* changedField, const QVariant& oldValue, const QVariant& newValue ) override;
@ -82,6 +84,7 @@ protected:
bool* useOptionsOnly ) override;
void uiOrderingForPlotLayout( QString uiConfigName, caf::PdmUiOrdering& uiOrdering );
void updateWindowVisibility();
private:

View File

@ -76,6 +76,7 @@
#include "RimSummaryCaseCollection.h"
#include "RimSummaryCaseMainCollection.h"
#include "RimSummaryCrossPlotCollection.h"
#include "RimSummaryMultiPlotCollection.h"
#include "RimSummaryPlotCollection.h"
#include "RimSurfaceCollection.h"
#include "RimTools.h"
@ -1377,6 +1378,11 @@ void RimProject::defineUiTreeOrdering( caf::PdmUiTreeOrdering& uiTreeOrdering, Q
uiTreeOrdering.add( mainPlotCollection->summaryPlotCollection() );
}
if ( mainPlotCollection->summaryMultiPlotCollection() )
{
uiTreeOrdering.add( mainPlotCollection->summaryMultiPlotCollection() );
}
if ( mainPlotCollection->analysisPlotCollection() )
{
uiTreeOrdering.add( mainPlotCollection->analysisPlotCollection() );

View File

@ -35,7 +35,7 @@ public:
RimVfpPlotCollection();
~RimVfpPlotCollection() override;
void addPlot( RimVfpPlot* newPlot );
void addPlot( RimVfpPlot* newPlot ) override;
std::vector<RimVfpPlot*> plots() const override;
void deleteAllChildObjects();

View File

@ -43,6 +43,8 @@ set(SOURCE_GROUP_HEADER_FILES
${CMAKE_CURRENT_LIST_DIR}/RimSummaryNameHelper.h
${CMAKE_CURRENT_LIST_DIR}/RimMultipleSummaryPlotNameHelper.h
${CMAKE_CURRENT_LIST_DIR}/RimSummaryAddressCollection.h
${CMAKE_CURRENT_LIST_DIR}/RimSummaryMultiPlotCollection.h
${CMAKE_CURRENT_LIST_DIR}/RimSummaryPlotControls.h
)
set(SOURCE_GROUP_SOURCE_FILES
@ -90,6 +92,8 @@ set(SOURCE_GROUP_SOURCE_FILES
${CMAKE_CURRENT_LIST_DIR}/RimSummaryNameHelper.cpp
${CMAKE_CURRENT_LIST_DIR}/RimMultipleSummaryPlotNameHelper.cpp
${CMAKE_CURRENT_LIST_DIR}/RimSummaryAddressCollection.cpp
${CMAKE_CURRENT_LIST_DIR}/RimSummaryMultiPlotCollection.cpp
${CMAKE_CURRENT_LIST_DIR}/RimSummaryPlotControls.cpp
)
list(APPEND CODE_HEADER_FILES ${SOURCE_GROUP_HEADER_FILES})

View File

@ -29,6 +29,7 @@
#include "RimSummaryCase.h"
#include "RimSummaryCaseCollection.h"
#include "RimSummaryCurve.h"
#include "RimSummaryPlotControls.h"
#include "RimSummaryMultiPlot.h"
#include "RimSummaryPlot.h"
@ -51,20 +52,8 @@ RimSummaryMultiPlot::RimSummaryMultiPlot()
CAF_PDM_InitObject( "Multi Summary Plot" );
this->setDeletable( true );
CAF_PDM_InitFieldNoDefault( &m_filterText, "FilterText", "Filter Text" );
m_filterText.uiCapability()->setUiEditorTypeName( caf::PdmUiComboBoxEditor::uiEditorTypeName() );
CAF_PDM_InitField( &m_individualPlotPerVector, "IndividualPlotPerVector", false, "One plot per Vector" );
CAF_PDM_InitField( &m_individualPlotPerObject, "IndividualPlotPerObject", false, "One plot per Object" );
CAF_PDM_InitField( &m_individualPlotPerDataSource, "IndividualPlotPerDataSource", false, "One plot per Data Source" );
CAF_PDM_InitField( &m_autoPlotTitles, "AutoPlotTitles", false, "Auto Plot Titles" );
CAF_PDM_InitField( &m_autoPlotTitlesOnSubPlots, "AutoPlotTitlesSubPlots", false, "Auto Plot Titles Sub Plots" );
CAF_PDM_InitField( &m_showMultiPlotInProjectTree, "ShowMultiPlotInProjectTree", true, "Show Multi Plot In Project Tree" );
CAF_PDM_InitFieldNoDefault( &m_multiPlot, "MultiPlot", "Multi Plot" );
m_multiPlot.uiCapability()->setUiTreeHidden( true );
m_multiPlot = new RimMultiPlot;
CAF_PDM_InitField( &m_autoPlotTitles, "AutoPlotTitles", true, "Auto Plot Titles" );
CAF_PDM_InitField( &m_autoPlotTitlesOnSubPlots, "AutoPlotTitlesSubPlots", true, "Auto Plot Titles Sub Plots" );
CAF_PDM_InitFieldNoDefault( &m_sourceStepping, "SourceStepping", "" );
m_sourceStepping = new RimSummaryPlotSourceStepping;
@ -82,67 +71,26 @@ RimSummaryMultiPlot::RimSummaryMultiPlot()
//--------------------------------------------------------------------------------------------------
RimSummaryMultiPlot::~RimSummaryMultiPlot()
{
removeMdiWindowFromMdiArea();
m_multiPlot->cleanupBeforeClose();
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
QWidget* RimSummaryMultiPlot::viewWidget()
void RimSummaryMultiPlot::addPlot( RimPlot* plot )
{
return m_multiPlot->viewWidget();
RimSummaryPlot* sumPlot = dynamic_cast<RimSummaryPlot*>( plot );
CVF_ASSERT( sumPlot != nullptr );
if ( sumPlot ) RimMultiPlot::addPlot( plot );
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
QImage RimSummaryMultiPlot::snapshotWindowContent()
void RimSummaryMultiPlot::insertPlot( RimPlot* plot, size_t index )
{
return m_multiPlot->snapshotWindowContent();
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimSummaryMultiPlot::zoomAll()
{
m_multiPlot->zoomAll();
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
QString RimSummaryMultiPlot::description() const
{
return "RimSummaryMultiPlot Placeholder Text";
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimSummaryMultiPlot::addPlot( RimSummaryPlot* plot )
{
m_multiPlot->addPlot( plot );
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
RimSummaryMultiPlot* RimSummaryMultiPlot::createAndAppendMultiPlot( const std::vector<RimSummaryPlot*>& plots )
{
RimProject* project = RimProject::current();
auto* plotCollection = project->mainPlotCollection()->multiPlotCollection();
auto* plotWindow = new RimSummaryMultiPlot;
plotWindow->setAsPlotMdiWindow();
plotCollection->addMultiSummaryPlot( plotWindow );
insertGraphsIntoPlot( plotWindow, plots );
plotCollection->updateAllRequiredEditors();
return plotWindow;
RimSummaryPlot* sumPlot = dynamic_cast<RimSummaryPlot*>( plot );
CVF_ASSERT( sumPlot != nullptr );
if ( sumPlot ) RimMultiPlot::insertPlot( plot, index );
}
//--------------------------------------------------------------------------------------------------
@ -235,83 +183,32 @@ void RimSummaryMultiPlot::populateNameHelper( RimSummaryPlotNameHelper* nameHelp
nameHelper->setEnsembleCases( ensembleCases );
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
QWidget* RimSummaryMultiPlot::createViewWidget( QWidget* mainWindowParent /*= nullptr*/ )
{
return m_multiPlot->createViewWidget( mainWindowParent );
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimSummaryMultiPlot::deleteViewWidget()
{
m_multiPlot->deleteViewWidget();
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimSummaryMultiPlot::onLoadDataAndUpdate()
{
updateMdiWindowVisibility();
if ( m_autoPlotTitles )
{
updatePlotTitles();
}
m_multiPlot->onLoadDataAndUpdate();
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimSummaryMultiPlot::doRenderWindowContent( QPaintDevice* paintDevice )
{
m_multiPlot->doRenderWindowContent( paintDevice );
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
QList<caf::PdmOptionItemInfo> RimSummaryMultiPlot::calculateValueOptions( const caf::PdmFieldHandle* fieldNeedingOptions,
bool* useOptionsOnly )
{
QList<caf::PdmOptionItemInfo> options;
return options;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimSummaryMultiPlot::defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering )
{
uiOrdering.add( &m_autoPlotTitles );
uiOrdering.add( &m_autoPlotTitlesOnSubPlots );
caf::PdmUiGroup* titlesGroup = uiOrdering.addNewGroup( "Titles" );
titlesGroup->add( &m_autoPlotTitles );
titlesGroup->add( &m_autoPlotTitlesOnSubPlots );
{
auto group = uiOrdering.addNewGroup( "Data Source" );
m_sourceStepping()->uiOrdering( uiConfigName, *group );
}
titlesGroup->add( &m_showPlotWindowTitle );
titlesGroup->add( &m_plotWindowTitle );
titlesGroup->add( &m_showIndividualPlotTitles );
titlesGroup->add( &m_titleFontSize );
titlesGroup->add( &m_subTitleFontSize );
auto group = uiOrdering.addNewGroup( "Multi Plot Options" );
m_multiPlot->uiOrderingForSummaryMultiPlot( *group );
caf::PdmUiGroup* legendsGroup = uiOrdering.addNewGroup( "Legends" );
legendsGroup->add( &m_showPlotLegends );
legendsGroup->add( &m_plotLegendsHorizontal );
legendsGroup->add( &m_legendFontSize );
{
auto group = uiOrdering.addNewGroup( "Graph Building" );
group->setCollapsedByDefault( true );
caf::PdmUiGroup* layoutGroup = uiOrdering.addNewGroup( "Layout" );
layoutGroup->add( &m_columnCount );
layoutGroup->add( &m_rowsPerPage );
layoutGroup->add( &m_majorTickmarkCount );
group->add( &m_filterText );
group->add( &m_individualPlotPerVector );
group->add( &m_individualPlotPerDataSource );
group->add( &m_individualPlotPerObject );
}
uiOrdering.add( &m_showMultiPlotInProjectTree );
uiOrdering.skipRemainingFields();
uiOrdering.skipRemainingFields( true );
}
//--------------------------------------------------------------------------------------------------
@ -321,110 +218,29 @@ void RimSummaryMultiPlot::fieldChangedByUi( const caf::PdmFieldHandle* changedFi
const QVariant& oldValue,
const QVariant& newValue )
{
RimPlotWindow::fieldChangedByUi( changedField, oldValue, newValue );
if ( changedField == &m_showWindow && m_showWindow() )
{
// Plots contained in a RimMultiPlot will automatically be set invisible
// Restore plot visibility
for ( auto p : m_multiPlot->plots() )
{
p->setShowWindow( true );
}
}
else if ( changedField == &m_filterText || changedField == &m_individualPlotPerDataSource ||
changedField == &m_individualPlotPerVector || changedField == &m_individualPlotPerObject )
{
updatePlots();
}
else if ( changedField == &m_autoPlotTitles || changedField == &m_autoPlotTitlesOnSubPlots )
if ( changedField == &m_autoPlotTitles || changedField == &m_autoPlotTitlesOnSubPlots )
{
onLoadDataAndUpdate();
updateLayout();
}
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimSummaryMultiPlot::defineEditorAttribute( const caf::PdmFieldHandle* field,
QString uiConfigName,
caf::PdmUiEditorAttribute* attribute )
{
if ( field == &m_filterText )
else
{
auto attr = dynamic_cast<caf::PdmUiComboBoxEditorAttribute*>( attribute );
if ( attr )
{
attr->enableEditableContent = true;
attr->enableAutoComplete = false;
attr->adjustWidthToContents = true;
attr->notifyWhenTextIsEdited = true;
}
RimMultiPlot::fieldChangedByUi( changedField, oldValue, newValue );
}
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimSummaryMultiPlot::defineUiTreeOrdering( caf::PdmUiTreeOrdering& uiTreeOrdering, QString uiConfigName )
void RimSummaryMultiPlot::updatePlotWindowTitle()
{
uiTreeOrdering.skipRemainingChildren( !m_showMultiPlotInProjectTree );
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimSummaryMultiPlot::updatePlots()
{
auto [addressFilters, dataSourceFilters] =
RiaSummaryStringTools::splitIntoAddressAndDataSourceFilters( m_filterText() );
auto [matchingSummaryCases, matchingEnsembles] = RiaSummaryStringTools::dataSourcesMatchingFilters( dataSourceFilters );
std::set<RifEclipseSummaryAddress> allAddresses;
if ( !matchingSummaryCases.empty() )
if ( m_autoPlotTitles )
{
allAddresses = RicSummaryPlotBuilder::addressesForSource( matchingSummaryCases.front() );
populateNameHelper( m_nameHelper.get() );
auto title = m_nameHelper->plotTitle();
setMultiPlotTitle( title );
}
else if ( !matchingEnsembles.empty() )
{
allAddresses = RicSummaryPlotBuilder::addressesForSource( matchingEnsembles.front() );
}
bool includeDiffCurves = false;
auto filteredAddresses =
RiaSummaryStringTools::computeFilteredAddresses( addressFilters, allAddresses, includeDiffCurves );
{
m_multiPlot->deleteAllPlots();
RicSummaryPlotBuilder plotBuilder;
plotBuilder.setAddresses( filteredAddresses );
plotBuilder.setDataSources( matchingSummaryCases, matchingEnsembles );
plotBuilder.setIndividualPlotPerDataSource( m_individualPlotPerDataSource );
RicSummaryPlotBuilder::RicGraphCurveGrouping groping = RicSummaryPlotBuilder::RicGraphCurveGrouping::NONE;
if ( m_individualPlotPerVector ) groping = RicSummaryPlotBuilder::RicGraphCurveGrouping::SINGLE_CURVES;
if ( m_individualPlotPerObject ) groping = RicSummaryPlotBuilder::RicGraphCurveGrouping::CURVES_FOR_OBJECT;
plotBuilder.setGrouping( groping );
auto plots = plotBuilder.createPlots();
insertGraphsIntoPlot( this, plots );
}
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimSummaryMultiPlot::updatePlotTitles()
{
populateNameHelper( m_nameHelper.get() );
auto title = m_nameHelper->plotTitle();
m_multiPlot->setMultiPlotTitle( title );
if ( m_autoPlotTitlesOnSubPlots )
{
@ -473,7 +289,7 @@ std::vector<RimSummaryPlot*> RimSummaryMultiPlot::summaryPlots() const
{
std::vector<RimSummaryPlot*> typedPlots;
for ( auto plot : m_multiPlot->plots() )
for ( auto plot : plots() )
{
auto summaryPlot = dynamic_cast<RimSummaryPlot*>( plot );
if ( summaryPlot ) typedPlots.push_back( summaryPlot );
@ -519,10 +335,10 @@ void RimSummaryMultiPlot::insertGraphsIntoPlot( RimSummaryMultiPlot* plot, const
plot->setAutoTitlePlot( true );
plot->setAutoTitleGraphs( showTitleSubGraph );
plot->m_multiPlot->setColumnCount( columnCount );
plot->m_multiPlot->setRowCount( rowCount );
plot->m_multiPlot->setShowPlotTitles( showTitleSubGraph );
plot->m_multiPlot->setTickmarkCount( tickmarkCount );
plot->setColumnCount( columnCount );
plot->setRowCount( rowCount );
plot->setShowPlotTitles( showTitleSubGraph );
plot->setTickmarkCount( tickmarkCount );
for ( auto graph : graphs )
{
@ -537,3 +353,28 @@ void RimSummaryMultiPlot::insertGraphsIntoPlot( RimSummaryMultiPlot* plot, const
plot->loadDataAndUpdate();
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
std::vector<caf::PdmFieldHandle*> RimSummaryMultiPlot::fieldsToShowInToolbar()
{
std::vector<caf::PdmFieldHandle*> toolBarFields;
auto& sourceObject = m_sourceStepping();
if ( sourceObject )
{
auto fields = sourceObject->fieldsToShowInToolbar();
toolBarFields.insert( std::end( toolBarFields ), std::begin( fields ), std::end( fields ) );
}
return toolBarFields;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
bool RimSummaryMultiPlot::handleGlobalKeyEvent( QKeyEvent* keyEvent )
{
return RimSummaryPlotControls::handleKeyEvents( m_sourceStepping(), keyEvent );
}

View File

@ -18,14 +18,15 @@
#pragma once
#include "RimPlotWindow.h"
#include "RimMultiPlot.h"
#include "RimSummaryDataSourceStepping.h"
#include "cafPdmChildField.h"
#include "cafPdmObject.h"
#include "cafPdmPtrArrayField.h"
class RimMultiPlot;
#include <vector>
class RimSummaryPlot;
class RimSummaryPlotSourceStepping;
class RimSummaryPlotNameHelper;
@ -35,7 +36,7 @@ class RimSummaryNameHelper;
///
///
//==================================================================================================
class RimSummaryMultiPlot : public RimPlotWindow, public RimSummaryDataSourceStepping
class RimSummaryMultiPlot : public RimMultiPlot, public RimSummaryDataSourceStepping
{
CAF_PDM_HEADER_INIT;
@ -43,60 +44,38 @@ public:
RimSummaryMultiPlot();
~RimSummaryMultiPlot() override;
QWidget* viewWidget() override;
QImage snapshotWindowContent() override;
void zoomAll() override;
QString description() const override;
void addPlot( RimSummaryPlot* plot );
void updatePlotTitles();
const RimSummaryNameHelper* nameHelper() const;
void setAutoTitlePlot( bool enable );
void setAutoTitleGraphs( bool enable );
static RimSummaryMultiPlot* createAndAppendMultiPlot( const std::vector<RimSummaryPlot*>& plots );
std::vector<RimSummaryDataSourceStepping::Axis> availableAxes() const override;
std::vector<RimSummaryCurve*> curvesForStepping( RimSummaryDataSourceStepping::Axis axis ) const override;
std::vector<RimEnsembleCurveSet*> curveSets() const override;
std::vector<RimSummaryCurve*> allCurves( RimSummaryDataSourceStepping::Axis axis ) const override;
void addPlot( RimPlot* plot ) override;
void insertPlot( RimPlot* plot, size_t index ) override;
std::vector<caf::PdmFieldHandle*> fieldsToShowInToolbar();
protected:
bool handleGlobalKeyEvent( QKeyEvent* keyEvent ) override;
private:
QWidget* createViewWidget( QWidget* mainWindowParent = nullptr ) override;
void deleteViewWidget() override;
void onLoadDataAndUpdate() override;
void doRenderWindowContent( QPaintDevice* paintDevice ) override;
QList<caf::PdmOptionItemInfo> calculateValueOptions( const caf::PdmFieldHandle* fieldNeedingOptions,
bool* useOptionsOnly ) override;
void defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) override;
void fieldChangedByUi( const caf::PdmFieldHandle* changedField, const QVariant& oldValue, const QVariant& newValue ) override;
void defineEditorAttribute( const caf::PdmFieldHandle* field,
QString uiConfigName,
caf::PdmUiEditorAttribute* attribute ) override;
void defineUiTreeOrdering( caf::PdmUiTreeOrdering& uiTreeOrdering, QString uiConfigName ) override;
void updatePlots();
void populateNameHelper( RimSummaryPlotNameHelper* nameHelper );
std::vector<RimSummaryPlot*> summaryPlots() const;
static void insertGraphsIntoPlot( RimSummaryMultiPlot* plot, const std::vector<RimSummaryPlot*>& graphs );
private:
caf::PdmField<QString> m_filterText;
caf::PdmField<bool> m_individualPlotPerVector;
caf::PdmField<bool> m_individualPlotPerDataSource;
caf::PdmField<bool> m_individualPlotPerObject;
caf::PdmField<bool> m_autoPlotTitles;
caf::PdmField<bool> m_autoPlotTitlesOnSubPlots;
void updatePlotWindowTitle() override;
caf::PdmField<bool> m_showMultiPlotInProjectTree;
caf::PdmChildField<RimMultiPlot*> m_multiPlot;
private:
caf::PdmField<bool> m_autoPlotTitles;
caf::PdmField<bool> m_autoPlotTitlesOnSubPlots;
caf::PdmChildField<RimSummaryPlotSourceStepping*> m_sourceStepping;

View File

@ -0,0 +1,85 @@
/////////////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2022 Equinor ASA
//
// ResInsight is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY
// WARRANTY; without even the implied warranty of MERCHANTABILITY or
// FITNESS FOR A PARTICULAR PURPOSE.
//
// See the GNU General Public License at <http://www.gnu.org/licenses/gpl.html>
// for more details.
//
/////////////////////////////////////////////////////////////////////////////////
#include "RimSummaryMultiPlotCollection.h"
#include "RimProject.h"
#include "RimSummaryMultiPlot.h"
#include "cafPdmFieldReorderCapability.h"
CAF_PDM_SOURCE_INIT( RimSummaryMultiPlotCollection, "RimSummaryMultiPlotCollection" );
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
RimSummaryMultiPlotCollection::RimSummaryMultiPlotCollection()
{
CAF_PDM_InitObject( "Summary Multi Plots", ":/MultiPlot16x16.png" );
CAF_PDM_InitFieldNoDefault( &m_summaryMultiPlots, "MultiSummaryPlots", "Multi Summary Plots" );
m_summaryMultiPlots.uiCapability()->setUiTreeHidden( true );
caf::PdmFieldReorderCapability::addToField( &m_summaryMultiPlots );
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
RimSummaryMultiPlotCollection::~RimSummaryMultiPlotCollection()
{
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimSummaryMultiPlotCollection::deleteAllPlots()
{
m_summaryMultiPlots.deleteAllChildObjects();
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
std::vector<RimSummaryMultiPlot*> RimSummaryMultiPlotCollection::multiPlots() const
{
return m_summaryMultiPlots.childObjects();
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimSummaryMultiPlotCollection::addMultiSummaryPlot( RimSummaryMultiPlot* plot )
{
m_summaryMultiPlots().push_back( plot );
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimSummaryMultiPlotCollection::loadDataAndUpdateAllPlots()
{
for ( const auto& p : m_summaryMultiPlots.childObjects() )
p->loadDataAndUpdate();
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
size_t RimSummaryMultiPlotCollection::plotCount() const
{
return m_summaryMultiPlots.size();
}

View File

@ -0,0 +1,49 @@
/////////////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2022 Equinor ASA
//
// ResInsight is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY
// WARRANTY; without even the implied warranty of MERCHANTABILITY or
// FITNESS FOR A PARTICULAR PURPOSE.
//
// See the GNU General Public License at <http://www.gnu.org/licenses/gpl.html>
// for more details.
//
/////////////////////////////////////////////////////////////////////////////////
#pragma once
#include "RimAbstractPlotCollection.h"
#include "cafPdmChildArrayField.h"
#include "cafPdmObject.h"
class RimSummaryMultiPlot;
//==================================================================================================
///
///
//==================================================================================================
class RimSummaryMultiPlotCollection : public caf::PdmObject, public RimPlotCollection
{
CAF_PDM_HEADER_INIT;
public:
RimSummaryMultiPlotCollection();
~RimSummaryMultiPlotCollection() override;
void deleteAllPlots() override;
void loadDataAndUpdateAllPlots() override;
size_t plotCount() const override;
std::vector<RimSummaryMultiPlot*> multiPlots() const;
void addMultiSummaryPlot( RimSummaryMultiPlot* plot );
private:
caf::PdmChildArrayField<RimSummaryMultiPlot*> m_summaryMultiPlots;
};

View File

@ -51,6 +51,7 @@
#include "RimSummaryCurvesData.h"
#include "RimSummaryPlotAxisFormatter.h"
#include "RimSummaryPlotCollection.h"
#include "RimSummaryPlotControls.h"
#include "RimSummaryPlotFilterTextCurveSetEditor.h"
#include "RimSummaryPlotNameHelper.h"
#include "RimSummaryTimeAxisProperties.h"
@ -2279,60 +2280,9 @@ void RimSummaryPlot::reattachAllCurves()
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimSummaryPlot::handleKeyPressEvent( QKeyEvent* keyEvent )
bool RimSummaryPlot::handleGlobalKeyEvent( QKeyEvent* keyEvent )
{
if ( !keyEvent ) return;
if ( RiuTreeViewEventFilter::activateFeatureFromKeyEvent( keyEvent ) )
{
return;
}
RimSummaryPlotSourceStepping* sourceStepping = sourceSteppingObjectForKeyEventHandling();
if ( !sourceStepping ) return;
if ( keyEvent->key() == Qt::Key_PageUp )
{
if ( keyEvent->modifiers() & Qt::ShiftModifier )
{
sourceStepping->applyPrevCase();
keyEvent->accept();
}
else if ( keyEvent->modifiers() & Qt::ControlModifier )
{
sourceStepping->applyPrevOtherIdentifier();
keyEvent->accept();
}
else
{
sourceStepping->applyPrevQuantity();
keyEvent->accept();
}
}
else if ( keyEvent->key() == Qt::Key_PageDown )
{
if ( keyEvent->modifiers() & Qt::ShiftModifier )
{
sourceStepping->applyNextCase();
keyEvent->accept();
}
else if ( keyEvent->modifiers() & Qt::ControlModifier )
{
sourceStepping->applyNextOtherIdentifier();
keyEvent->accept();
}
else
{
sourceStepping->applyNextQuantity();
keyEvent->accept();
}
}
return RimSummaryPlotControls::handleKeyEvents( sourceSteppingObjectForKeyEventHandling(), keyEvent );
}
//--------------------------------------------------------------------------------------------------

View File

@ -208,8 +208,6 @@ private:
void detachAllPlotItems();
void deleteAllPlotCurves();
void handleKeyPressEvent( QKeyEvent* keyEvent ) override;
void onCurveCollectionChanged( const SignalEmitter* emitter );
void connectCurveToPlot( RimSummaryCurve* curve, bool update, bool autoAssignPlotAxis );
@ -231,6 +229,8 @@ protected:
QImage snapshotWindowContent() override;
bool handleGlobalKeyEvent( QKeyEvent* keyEvent ) override;
private slots:
void onPlotZoomed();

View File

@ -0,0 +1,123 @@
////////////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2022 Equinor ASA
//
// ResInsight is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY
// WARRANTY; without even the implied warranty of MERCHANTABILITY or
// FITNESS FOR A PARTICULAR PURPOSE.
//
// See the GNU General Public License at <http://www.gnu.org/licenses/gpl.html>
// for more details.
//
/////////////////////////////////////////////////////////////////////////////////
#include "RimSummaryPlotControls.h"
#include "RimSummaryPlotSourceStepping.h"
#include <QKeyEvent>
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
bool RimSummaryPlotControls::handleKeyEvents( RimSummaryPlotSourceStepping* srcStepping, QKeyEvent* keyEvent )
{
if ( !keyEvent ) return false;
if ( !srcStepping ) return false;
if ( !( keyEvent->modifiers() & Qt::ControlModifier ) ) return false;
bool bHandled = false;
if ( keyEvent->key() == Qt::Key_Left )
{
srcStepping->applyPrevOtherIdentifier();
keyEvent->accept();
bHandled = true;
}
else if ( keyEvent->key() == Qt::Key_Right )
{
srcStepping->applyNextOtherIdentifier();
keyEvent->accept();
bHandled = true;
}
else if ( keyEvent->key() == Qt::Key_PageDown )
{
srcStepping->applyNextCase();
keyEvent->accept();
bHandled = true;
}
else if ( keyEvent->key() == Qt::Key_PageUp )
{
srcStepping->applyPrevCase();
keyEvent->accept();
bHandled = true;
}
else if ( keyEvent->key() == Qt::Key_Up )
{
srcStepping->applyPrevQuantity();
keyEvent->accept();
bHandled = true;
}
else if ( keyEvent->key() == Qt::Key_Down )
{
srcStepping->applyNextQuantity();
keyEvent->accept();
bHandled = true;
}
return bHandled;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
QString RimSummaryPlotControls::quantityNextKeyText()
{
return QString( "Ctrl-Down" );
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
QString RimSummaryPlotControls::quantityPrevKeyText()
{
return QString( "Ctrl-Up" );
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
QString RimSummaryPlotControls::caseNextKeyText()
{
return QString( "Ctrl-PgDown" );
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
QString RimSummaryPlotControls::casePrevKeyText()
{
return QString( "Ctrl-PgUp" );
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
QString RimSummaryPlotControls::otherNextKeyText()
{
return QString( "Ctrl-Right" );
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
QString RimSummaryPlotControls::otherPrevKeyText()
{
return QString( "Ctrl-Left" );
}

View File

@ -0,0 +1,40 @@
////////////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2022 Equinor ASA
//
// ResInsight is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY
// WARRANTY; without even the implied warranty of MERCHANTABILITY or
// FITNESS FOR A PARTICULAR PURPOSE.
//
// See the GNU General Public License at <http://www.gnu.org/licenses/gpl.html>
// for more details.
//
/////////////////////////////////////////////////////////////////////////////////
#pragma once
class RimSummaryPlotSourceStepping;
class QKeyEvent;
#include <QString>
class RimSummaryPlotControls
{
public:
static bool handleKeyEvents( RimSummaryPlotSourceStepping* srcStepping, QKeyEvent* keyEvent );
static QString quantityNextKeyText();
static QString quantityPrevKeyText();
static QString caseNextKeyText();
static QString casePrevKeyText();
static QString otherNextKeyText();
static QString otherPrevKeyText();
private:
RimSummaryPlotControls() = default;
};

View File

@ -399,9 +399,7 @@ void RimSummaryPlotManager::createNewPlot()
{
{
auto summaryPlots = plotBuilder.createPlots();
auto plot = RimSummaryMultiPlot::createAndAppendMultiPlot( summaryPlots );
RiuPlotMainWindowTools::selectAsCurrentItem( plot );
RicSummaryPlotBuilder::createAndAppendSummaryMultiPlot( summaryPlots );
}
bool createStandardMultiPlot = false;

View File

@ -35,6 +35,7 @@
#include "RimSummaryDataSourceStepping.h"
#include "RimSummaryMultiPlot.h"
#include "RimSummaryPlot.h"
#include "RimSummaryPlotControls.h"
#include "RiuPlotMainWindow.h"
@ -976,25 +977,29 @@ void RimSummaryPlotSourceStepping::defineEditorAttribute( const caf::PdmFieldHan
myAttr->nextIcon = QIcon( ":/ComboBoxDown.svg" );
myAttr->previousIcon = QIcon( ":/ComboBoxUp.svg" );
QString modifierText;
QString nextText;
QString prevText;
if ( field == &m_summaryCase )
{
modifierText = ( "(Shift+" );
nextText = RimSummaryPlotControls::caseNextKeyText();
prevText = RimSummaryPlotControls::casePrevKeyText();
}
else if ( field == &m_wellName || field == &m_wellGroupName || field == &m_region )
{
modifierText = ( "(Ctrl+" );
nextText = RimSummaryPlotControls::otherNextKeyText();
prevText = RimSummaryPlotControls::otherPrevKeyText();
}
else if ( field == &m_quantity )
{
modifierText = ( "(" );
nextText = RimSummaryPlotControls::quantityNextKeyText();
prevText = RimSummaryPlotControls::quantityPrevKeyText();
}
if ( !modifierText.isEmpty() )
if ( !nextText.isEmpty() )
{
myAttr->nextButtonText = "Next " + modifierText + "PgDown)";
myAttr->prevButtonText = "Previous " + modifierText + "PgUp)";
myAttr->nextButtonText = "Next (" + nextText + ")";
myAttr->prevButtonText = "Previous (" + prevText + ")";
}
}

View File

@ -255,7 +255,16 @@ void RiuMainWindowBase::selectAsCurrentItem( const caf::PdmObject* object, bool
m_allowActiveViewChangeFromSelection = allowActiveViewChange;
auto tv = getTreeViewWithItem( object );
if ( tv ) tv->selectAsCurrentItem( object );
if ( tv )
{
tv->selectAsCurrentItem( object );
QDockWidget* dw = dynamic_cast<QDockWidget*>( tv->parentWidget() );
if ( dw )
{
dw->show();
dw->raise();
}
}
m_allowActiveViewChangeFromSelection = true;
}

View File

@ -31,6 +31,7 @@
#include "RimProject.h"
#include "RimSummaryCaseMainCollection.h"
#include "RimSummaryCurveCollection.h"
#include "RimSummaryMultiPlot.h"
#include "RimSummaryPlot.h"
#include "RimSummaryPlotCollection.h"
#include "RimSummaryPlotFilterTextCurveSetEditor.h"
@ -702,17 +703,22 @@ void RiuPlotMainWindow::updateMultiPlotToolBar()
//--------------------------------------------------------------------------------------------------
void RiuPlotMainWindow::updateSummaryPlotToolBar( bool forceUpdateUi )
{
RimSummaryPlot* summaryPlot = dynamic_cast<RimSummaryPlot*>( m_activePlotViewWindow.p() );
RimMultiPlot* multiPlot = dynamic_cast<RimMultiPlot*>( m_activePlotViewWindow.p() );
if ( multiPlot )
RimSummaryPlot* summaryPlot = dynamic_cast<RimSummaryPlot*>( m_activePlotViewWindow.p() );
RimSummaryMultiPlot* summaryMultiPlot = dynamic_cast<RimSummaryMultiPlot*>( m_activePlotViewWindow.p() );
std::vector<caf::PdmFieldHandle*> toolBarFields;
if ( summaryMultiPlot )
{
summaryPlot = caf::SelectionManager::instance()->selectedItemOfType<RimSummaryPlot>();
toolBarFields = summaryMultiPlot->fieldsToShowInToolbar();
}
else if ( summaryPlot )
{
toolBarFields = summaryPlot->fieldsToShowInToolbar();
}
if ( summaryPlot )
if ( toolBarFields.size() > 0 )
{
std::vector<caf::PdmFieldHandle*> toolBarFields = summaryPlot->fieldsToShowInToolbar();
QString keyword;
if ( !m_summaryPlotToolBarEditor->isEditorDataValid( toolBarFields ) )
@ -997,6 +1003,16 @@ void RiuPlotMainWindow::selectedObjectsChanged()
{
updateSummaryPlotToolBar();
}
else
{
RimSummaryMultiPlot* multiSummaryPlot = nullptr;
firstSelectedObject->firstAncestorOrThisOfType( multiSummaryPlot );
if ( multiSummaryPlot )
{
updateSummaryPlotToolBar();
updateMultiPlotToolBar();
}
}
}
// The only way to get to this code is by selection change initiated from the project tree view