mirror of
https://github.com/OPM/ResInsight.git
synced 2025-02-25 18:55:39 -06:00
#7609 Refactor to reuse plotting part of Statistics Plot.
This commit is contained in:
parent
65afd84db5
commit
b662a87267
@ -310,11 +310,13 @@ ${CMAKE_CURRENT_LIST_DIR}/RimWellPathTieIn.cpp
|
|||||||
|
|
||||||
if(Qt5Charts_FOUND)
|
if(Qt5Charts_FOUND)
|
||||||
list(APPEND SOURCE_GROUP_HEADER_FILES
|
list(APPEND SOURCE_GROUP_HEADER_FILES
|
||||||
|
${CMAKE_CURRENT_LIST_DIR}/RimStatisticsPlot.h
|
||||||
${CMAKE_CURRENT_LIST_DIR}/RimGridStatisticsPlotCollection.h
|
${CMAKE_CURRENT_LIST_DIR}/RimGridStatisticsPlotCollection.h
|
||||||
${CMAKE_CURRENT_LIST_DIR}/RimGridStatisticsPlot.h)
|
${CMAKE_CURRENT_LIST_DIR}/RimGridStatisticsPlot.h)
|
||||||
|
|
||||||
|
|
||||||
list(APPEND SOURCE_GROUP_SOURCE_FILES
|
list(APPEND SOURCE_GROUP_SOURCE_FILES
|
||||||
|
${CMAKE_CURRENT_LIST_DIR}/RimStatisticsPlot.cpp
|
||||||
${CMAKE_CURRENT_LIST_DIR}/RimGridStatisticsPlotCollection.cpp
|
${CMAKE_CURRENT_LIST_DIR}/RimGridStatisticsPlotCollection.cpp
|
||||||
${CMAKE_CURRENT_LIST_DIR}/RimGridStatisticsPlot.cpp)
|
${CMAKE_CURRENT_LIST_DIR}/RimGridStatisticsPlot.cpp)
|
||||||
endif()
|
endif()
|
||||||
|
@ -33,25 +33,16 @@
|
|||||||
#include "RimProject.h"
|
#include "RimProject.h"
|
||||||
#include "RimTools.h"
|
#include "RimTools.h"
|
||||||
|
|
||||||
#include "RiuPlotMainWindow.h"
|
|
||||||
|
|
||||||
#include "RigHistogramData.h"
|
#include "RigHistogramData.h"
|
||||||
|
|
||||||
#include "cafPdmFieldScriptingCapability.h"
|
#include "cafPdmFieldScriptingCapability.h"
|
||||||
#include "cafPdmObjectScriptingCapability.h"
|
#include "cafPdmObjectScriptingCapability.h"
|
||||||
#include "cafPdmUiComboBoxEditor.h"
|
#include "cafPdmUiComboBoxEditor.h"
|
||||||
|
|
||||||
#include "cvfAssert.h"
|
#include "cvfAssert.h"
|
||||||
|
|
||||||
#include <QtCharts/QBarSeries>
|
|
||||||
#include <QtCharts/QBarSet>
|
|
||||||
#include <QtCharts/QCategoryAxis>
|
|
||||||
#include <QtCharts/QLineSeries>
|
|
||||||
#include <QtCharts/QValueAxis>
|
|
||||||
|
|
||||||
#include <cmath>
|
#include <cmath>
|
||||||
|
|
||||||
using namespace QtCharts;
|
|
||||||
|
|
||||||
CAF_PDM_SOURCE_INIT( RimGridStatisticsPlot, "GridStatisticsPlot" );
|
CAF_PDM_SOURCE_INIT( RimGridStatisticsPlot, "GridStatisticsPlot" );
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
@ -61,9 +52,6 @@ RimGridStatisticsPlot::RimGridStatisticsPlot()
|
|||||||
{
|
{
|
||||||
CAF_PDM_InitObject( "Grid Statistics Plot", "", "", "A Plot of Grid Statistics" );
|
CAF_PDM_InitObject( "Grid Statistics Plot", "", "", "A Plot of Grid Statistics" );
|
||||||
|
|
||||||
CAF_PDM_InitField( &m_plotWindowTitle, "PlotDescription", QString( "" ), "Name", "", "", "" );
|
|
||||||
m_plotWindowTitle.xmlCapability()->setIOWritable( false );
|
|
||||||
|
|
||||||
CAF_PDM_InitFieldNoDefault( &m_case, "Case", "Case", "", "", "" );
|
CAF_PDM_InitFieldNoDefault( &m_case, "Case", "Case", "", "", "" );
|
||||||
m_case.uiCapability()->setUiTreeChildrenHidden( true );
|
m_case.uiCapability()->setUiTreeChildrenHidden( true );
|
||||||
CAF_PDM_InitField( &m_timeStep, "TimeStep", -1, "Time Step", "", "", "" );
|
CAF_PDM_InitField( &m_timeStep, "TimeStep", -1, "Time Step", "", "", "" );
|
||||||
@ -89,8 +77,6 @@ RimGridStatisticsPlot::RimGridStatisticsPlot()
|
|||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
RimGridStatisticsPlot::~RimGridStatisticsPlot()
|
RimGridStatisticsPlot::~RimGridStatisticsPlot()
|
||||||
{
|
{
|
||||||
removeMdiWindowFromMdiArea();
|
|
||||||
cleanupBeforeClose();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
@ -113,110 +99,6 @@ void RimGridStatisticsPlot::setDefaults()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
|
||||||
///
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
|
||||||
QWidget* RimGridStatisticsPlot::viewWidget()
|
|
||||||
{
|
|
||||||
return m_viewer;
|
|
||||||
}
|
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
|
||||||
///
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
|
||||||
QWidget* RimGridStatisticsPlot::createPlotWidget( QWidget* mainWindowParent /*= nullptr */ )
|
|
||||||
{
|
|
||||||
return createViewWidget( mainWindowParent );
|
|
||||||
}
|
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
|
||||||
///
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
|
||||||
QString RimGridStatisticsPlot::description() const
|
|
||||||
{
|
|
||||||
return m_plotWindowTitle;
|
|
||||||
}
|
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
|
||||||
///
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
|
||||||
void RimGridStatisticsPlot::zoomAll()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
|
||||||
///
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
|
||||||
QImage RimGridStatisticsPlot::snapshotWindowContent()
|
|
||||||
{
|
|
||||||
QImage image;
|
|
||||||
|
|
||||||
if ( m_viewer )
|
|
||||||
{
|
|
||||||
QPixmap pix = m_viewer->grab();
|
|
||||||
image = pix.toImage();
|
|
||||||
}
|
|
||||||
|
|
||||||
return image;
|
|
||||||
}
|
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
|
||||||
///
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
|
||||||
QWidget* RimGridStatisticsPlot::createViewWidget( QWidget* mainWindowParent )
|
|
||||||
{
|
|
||||||
m_viewer = new RiuQtChartView( this, mainWindowParent );
|
|
||||||
return m_viewer;
|
|
||||||
}
|
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
|
||||||
///
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
|
||||||
void RimGridStatisticsPlot::deleteViewWidget()
|
|
||||||
{
|
|
||||||
cleanupBeforeClose();
|
|
||||||
}
|
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
|
||||||
///
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
|
||||||
void RimGridStatisticsPlot::onPlotAdditionOrRemoval()
|
|
||||||
{
|
|
||||||
updateAllRequiredEditors();
|
|
||||||
}
|
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
|
||||||
///
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
|
||||||
void RimGridStatisticsPlot::doRenderWindowContent( QPaintDevice* paintDevice )
|
|
||||||
{
|
|
||||||
if ( m_viewer )
|
|
||||||
{
|
|
||||||
QPainter painter( paintDevice );
|
|
||||||
m_viewer->render( &painter );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
|
||||||
///
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
|
||||||
void RimGridStatisticsPlot::doUpdateLayout()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
|
||||||
///
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
|
||||||
void RimGridStatisticsPlot::cleanupBeforeClose()
|
|
||||||
{
|
|
||||||
if ( m_viewer )
|
|
||||||
{
|
|
||||||
m_viewer->setParent( nullptr );
|
|
||||||
delete m_viewer;
|
|
||||||
m_viewer = nullptr;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
///
|
///
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
@ -329,133 +211,48 @@ void RimGridStatisticsPlot::cellFilterViewUpdated()
|
|||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
///
|
///
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
void RimGridStatisticsPlot::onLoadDataAndUpdate()
|
bool RimGridStatisticsPlot::hasStatisticsData() const
|
||||||
{
|
{
|
||||||
updateMdiWindowVisibility();
|
return ( m_viewer && m_case() && m_property() );
|
||||||
performAutoNameUpdate();
|
|
||||||
updatePlots();
|
|
||||||
updateLayout();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
///
|
///
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
void RimGridStatisticsPlot::updatePlots()
|
RigHistogramData RimGridStatisticsPlot::createStatisticsData() const
|
||||||
{
|
{
|
||||||
if ( m_viewer && m_case() && m_property() )
|
std::unique_ptr<RimHistogramCalculator> histogramCalculator;
|
||||||
|
histogramCalculator.reset( new RimHistogramCalculator );
|
||||||
|
|
||||||
|
RigHistogramData histogramData;
|
||||||
|
|
||||||
|
RimHistogramCalculator::StatisticsCellRangeType cellRange = RimHistogramCalculator::StatisticsCellRangeType::ALL_CELLS;
|
||||||
|
|
||||||
|
RimHistogramCalculator::StatisticsTimeRangeType timeRange =
|
||||||
|
RimHistogramCalculator::StatisticsTimeRangeType::ALL_TIMESTEPS;
|
||||||
|
int timeStep = 0;
|
||||||
|
if ( m_timeStep() != -1 && !m_property()->hasStaticResult() )
|
||||||
{
|
{
|
||||||
std::unique_ptr<RimHistogramCalculator> histogramCalculator;
|
timeStep = m_timeStep();
|
||||||
histogramCalculator.reset( new RimHistogramCalculator );
|
timeRange = RimHistogramCalculator::StatisticsTimeRangeType::CURRENT_TIMESTEP;
|
||||||
|
|
||||||
RigHistogramData histogramData;
|
|
||||||
|
|
||||||
RimHistogramCalculator::StatisticsCellRangeType cellRange =
|
|
||||||
RimHistogramCalculator::StatisticsCellRangeType::ALL_CELLS;
|
|
||||||
|
|
||||||
RimHistogramCalculator::StatisticsTimeRangeType timeRange =
|
|
||||||
RimHistogramCalculator::StatisticsTimeRangeType::ALL_TIMESTEPS;
|
|
||||||
int timeStep = 0;
|
|
||||||
if ( m_timeStep() != -1 && !m_property()->hasStaticResult() )
|
|
||||||
{
|
|
||||||
timeStep = m_timeStep();
|
|
||||||
timeRange = RimHistogramCalculator::StatisticsTimeRangeType::CURRENT_TIMESTEP;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( m_cellFilterView.value() )
|
|
||||||
{
|
|
||||||
// Filter by visible cells of the view
|
|
||||||
cellRange = RimHistogramCalculator::StatisticsCellRangeType::VISIBLE_CELLS;
|
|
||||||
RimEclipseView* eclipseView = dynamic_cast<RimEclipseView*>( m_cellFilterView.value() );
|
|
||||||
histogramData =
|
|
||||||
histogramCalculator->histogramData( eclipseView, m_property.value(), cellRange, timeRange, timeStep );
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
RimEclipseView* eclipseView = nullptr;
|
|
||||||
histogramData =
|
|
||||||
histogramCalculator->histogramData( eclipseView, m_property.value(), cellRange, timeRange, timeStep );
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( histogramData.isHistogramVectorValid() )
|
|
||||||
{
|
|
||||||
QBarSet* set0 = new QBarSet( m_plotWindowTitle );
|
|
||||||
double minValue = std::numeric_limits<double>::max();
|
|
||||||
double maxValue = -std::numeric_limits<double>::max();
|
|
||||||
for ( double value : *histogramData.histogram )
|
|
||||||
{
|
|
||||||
*set0 << value;
|
|
||||||
minValue = std::min( minValue, value );
|
|
||||||
maxValue = std::max( maxValue, value );
|
|
||||||
}
|
|
||||||
|
|
||||||
QBarSeries* series = new QBarSeries();
|
|
||||||
series->append( set0 );
|
|
||||||
|
|
||||||
QChart* chart = new QChart();
|
|
||||||
chart->addSeries( series );
|
|
||||||
chart->setTitle( uiName() );
|
|
||||||
|
|
||||||
// Axis
|
|
||||||
double xAxisSize = histogramData.max - histogramData.min;
|
|
||||||
double xAxisExtension = xAxisSize * 0.02;
|
|
||||||
|
|
||||||
QValueAxis* axisX = new QValueAxis();
|
|
||||||
axisX->setRange( histogramData.min - xAxisExtension, histogramData.max + xAxisExtension );
|
|
||||||
chart->addAxis( axisX, Qt::AlignBottom );
|
|
||||||
|
|
||||||
QValueAxis* axisY = new QValueAxis();
|
|
||||||
axisY->setRange( minValue, maxValue );
|
|
||||||
chart->addAxis( axisY, Qt::AlignLeft );
|
|
||||||
|
|
||||||
QLineSeries* p10series = new QLineSeries();
|
|
||||||
chart->addSeries( p10series );
|
|
||||||
p10series->setName( "P10" );
|
|
||||||
p10series->append( histogramData.p10, minValue );
|
|
||||||
p10series->append( histogramData.p10, maxValue );
|
|
||||||
p10series->attachAxis( axisX );
|
|
||||||
p10series->attachAxis( axisY );
|
|
||||||
|
|
||||||
QLineSeries* p90series = new QLineSeries();
|
|
||||||
chart->addSeries( p90series );
|
|
||||||
p90series->setName( "P90" );
|
|
||||||
p90series->append( histogramData.p90, minValue );
|
|
||||||
p90series->append( histogramData.p90, maxValue );
|
|
||||||
p90series->attachAxis( axisX );
|
|
||||||
p90series->attachAxis( axisY );
|
|
||||||
|
|
||||||
QLineSeries* meanSeries = new QLineSeries();
|
|
||||||
chart->addSeries( meanSeries );
|
|
||||||
meanSeries->setName( "Mean" );
|
|
||||||
meanSeries->append( histogramData.mean, minValue );
|
|
||||||
meanSeries->append( histogramData.mean, maxValue );
|
|
||||||
meanSeries->attachAxis( axisX );
|
|
||||||
meanSeries->attachAxis( axisY );
|
|
||||||
|
|
||||||
// Set font sizes
|
|
||||||
QFont titleFont = chart->titleFont();
|
|
||||||
titleFont.setPixelSize( titleFontSize() );
|
|
||||||
chart->setTitleFont( titleFont );
|
|
||||||
|
|
||||||
QLegend* legend = chart->legend();
|
|
||||||
if ( legend )
|
|
||||||
{
|
|
||||||
QFont legendFont = legend->font();
|
|
||||||
legendFont.setPixelSize( legendFontSize() );
|
|
||||||
legend->setFont( legendFont );
|
|
||||||
legend->setVisible( legendsVisible() );
|
|
||||||
}
|
|
||||||
|
|
||||||
m_viewer->setChart( chart );
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
if ( m_cellFilterView.value() )
|
||||||
///
|
{
|
||||||
//--------------------------------------------------------------------------------------------------
|
// Filter by visible cells of the view
|
||||||
caf::PdmFieldHandle* RimGridStatisticsPlot::userDescriptionField()
|
cellRange = RimHistogramCalculator::StatisticsCellRangeType::VISIBLE_CELLS;
|
||||||
{
|
RimEclipseView* eclipseView = dynamic_cast<RimEclipseView*>( m_cellFilterView.value() );
|
||||||
return &m_plotWindowTitle;
|
histogramData =
|
||||||
|
histogramCalculator->histogramData( eclipseView, m_property.value(), cellRange, timeRange, timeStep );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
RimEclipseView* eclipseView = nullptr;
|
||||||
|
histogramData =
|
||||||
|
histogramCalculator->histogramData( eclipseView, m_property.value(), cellRange, timeRange, timeStep );
|
||||||
|
}
|
||||||
|
|
||||||
|
return histogramData;
|
||||||
}
|
}
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
@ -481,16 +278,6 @@ QString RimGridStatisticsPlot::createAutoName() const
|
|||||||
return nameTags.join( ", " );
|
return nameTags.join( ", " );
|
||||||
}
|
}
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
|
||||||
///
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
|
||||||
void RimGridStatisticsPlot::performAutoNameUpdate()
|
|
||||||
{
|
|
||||||
QString name = createAutoName();
|
|
||||||
m_plotWindowTitle = name;
|
|
||||||
setUiName( name );
|
|
||||||
}
|
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
///
|
///
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
@ -19,9 +19,8 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "RiaDefines.h"
|
#include "RiaDefines.h"
|
||||||
#include "RimPlotWindow.h"
|
|
||||||
|
|
||||||
#include "RiuQtChartView.h"
|
#include "RimStatisticsPlot.h"
|
||||||
|
|
||||||
#include "cafPdmChildField.h"
|
#include "cafPdmChildField.h"
|
||||||
#include "cafPdmField.h"
|
#include "cafPdmField.h"
|
||||||
@ -29,8 +28,6 @@
|
|||||||
#include "cafPdmObject.h"
|
#include "cafPdmObject.h"
|
||||||
#include "cafPdmPtrField.h"
|
#include "cafPdmPtrField.h"
|
||||||
|
|
||||||
#include <QPointer>
|
|
||||||
|
|
||||||
class RimCase;
|
class RimCase;
|
||||||
class RimPlot;
|
class RimPlot;
|
||||||
class RimGridView;
|
class RimGridView;
|
||||||
@ -40,7 +37,7 @@ class RimEclipseResultDefinition;
|
|||||||
///
|
///
|
||||||
///
|
///
|
||||||
//==================================================================================================
|
//==================================================================================================
|
||||||
class RimGridStatisticsPlot : public RimPlotWindow
|
class RimGridStatisticsPlot : public RimStatisticsPlot
|
||||||
{
|
{
|
||||||
CAF_PDM_HEADER_INIT;
|
CAF_PDM_HEADER_INIT;
|
||||||
|
|
||||||
@ -48,48 +45,25 @@ public:
|
|||||||
RimGridStatisticsPlot();
|
RimGridStatisticsPlot();
|
||||||
~RimGridStatisticsPlot() override;
|
~RimGridStatisticsPlot() override;
|
||||||
|
|
||||||
QWidget* viewWidget() override;
|
|
||||||
QWidget* createPlotWidget( QWidget* mainWindowParent = nullptr );
|
|
||||||
QString description() const override;
|
|
||||||
|
|
||||||
void zoomAll() override;
|
|
||||||
|
|
||||||
void cellFilterViewUpdated();
|
void cellFilterViewUpdated();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
QImage snapshotWindowContent() override;
|
|
||||||
|
|
||||||
QWidget* createViewWidget( QWidget* mainWindowParent ) override;
|
|
||||||
void deleteViewWidget() override;
|
|
||||||
|
|
||||||
// Overridden PDM methods
|
// Overridden PDM methods
|
||||||
void fieldChangedByUi( const caf::PdmFieldHandle* changedField, const QVariant& oldValue, const QVariant& newValue ) override;
|
void fieldChangedByUi( const caf::PdmFieldHandle* changedField, const QVariant& oldValue, const QVariant& newValue ) override;
|
||||||
void defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) override;
|
void defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) override;
|
||||||
QList<caf::PdmOptionItemInfo> calculateValueOptions( const caf::PdmFieldHandle* fieldNeedingOptions,
|
QList<caf::PdmOptionItemInfo> calculateValueOptions( const caf::PdmFieldHandle* fieldNeedingOptions,
|
||||||
bool* useOptionsOnly ) override;
|
bool* useOptionsOnly ) override;
|
||||||
|
|
||||||
void initAfterRead() override;
|
void initAfterRead() override;
|
||||||
void onLoadDataAndUpdate() override;
|
|
||||||
void updatePlots();
|
|
||||||
caf::PdmFieldHandle* userDescriptionField() override;
|
|
||||||
|
|
||||||
void performAutoNameUpdate();
|
QString createAutoName() const override;
|
||||||
QString createAutoName() const;
|
|
||||||
QString timeStepString() const;
|
QString timeStepString() const;
|
||||||
|
|
||||||
void setDefaults();
|
void setDefaults();
|
||||||
|
bool hasStatisticsData() const override;
|
||||||
private:
|
RigHistogramData createStatisticsData() const override;
|
||||||
void cleanupBeforeClose();
|
|
||||||
void onPlotAdditionOrRemoval();
|
|
||||||
void doRenderWindowContent( QPaintDevice* paintDevice ) override;
|
|
||||||
void doUpdateLayout() override;
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
QPointer<RiuQtChartView> m_viewer;
|
|
||||||
|
|
||||||
caf::PdmField<QString> m_plotWindowTitle;
|
|
||||||
|
|
||||||
caf::PdmPtrField<RimCase*> m_case;
|
caf::PdmPtrField<RimCase*> m_case;
|
||||||
caf::PdmField<int> m_timeStep;
|
caf::PdmField<int> m_timeStep;
|
||||||
caf::PdmPtrField<RimGridView*> m_cellFilterView;
|
caf::PdmPtrField<RimGridView*> m_cellFilterView;
|
||||||
|
293
ApplicationLibCode/ProjectDataModel/RimStatisticsPlot.cpp
Normal file
293
ApplicationLibCode/ProjectDataModel/RimStatisticsPlot.cpp
Normal file
@ -0,0 +1,293 @@
|
|||||||
|
/////////////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// Copyright (C) 2020- 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 "RimStatisticsPlot.h"
|
||||||
|
|
||||||
|
#include "RiaGuiApplication.h"
|
||||||
|
#include "RiaPreferences.h"
|
||||||
|
|
||||||
|
#include "RimPlot.h"
|
||||||
|
#include "RimProject.h"
|
||||||
|
#include "RimTools.h"
|
||||||
|
|
||||||
|
#include "RiuPlotMainWindow.h"
|
||||||
|
|
||||||
|
#include "RigHistogramData.h"
|
||||||
|
|
||||||
|
#include "cafPdmFieldScriptingCapability.h"
|
||||||
|
#include "cafPdmObjectScriptingCapability.h"
|
||||||
|
#include "cafPdmUiComboBoxEditor.h"
|
||||||
|
#include "cvfAssert.h"
|
||||||
|
|
||||||
|
#include <QtCharts/QBarSeries>
|
||||||
|
#include <QtCharts/QBarSet>
|
||||||
|
#include <QtCharts/QCategoryAxis>
|
||||||
|
#include <QtCharts/QLineSeries>
|
||||||
|
#include <QtCharts/QValueAxis>
|
||||||
|
|
||||||
|
#include <cmath>
|
||||||
|
|
||||||
|
using namespace QtCharts;
|
||||||
|
|
||||||
|
CAF_PDM_ABSTRACT_SOURCE_INIT( RimStatisticsPlot, "StatisticsPlot" );
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
///
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
RimStatisticsPlot::RimStatisticsPlot()
|
||||||
|
{
|
||||||
|
// CAF_PDM_InitObject( "Grid Statistics Plot", "", "", "A Plot of Grid Statistics" );
|
||||||
|
CAF_PDM_InitField( &m_plotWindowTitle, "PlotDescription", QString( "" ), "Name", "", "", "" );
|
||||||
|
m_plotWindowTitle.xmlCapability()->setIOWritable( false );
|
||||||
|
|
||||||
|
m_plotLegendsHorizontal.uiCapability()->setUiHidden( true );
|
||||||
|
|
||||||
|
setDeletable( true );
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
///
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
RimStatisticsPlot::~RimStatisticsPlot()
|
||||||
|
{
|
||||||
|
removeMdiWindowFromMdiArea();
|
||||||
|
cleanupBeforeClose();
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
///
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
QWidget* RimStatisticsPlot::viewWidget()
|
||||||
|
{
|
||||||
|
return m_viewer;
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
///
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
QWidget* RimStatisticsPlot::createPlotWidget( QWidget* mainWindowParent /*= nullptr */ )
|
||||||
|
{
|
||||||
|
return createViewWidget( mainWindowParent );
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
///
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
QString RimStatisticsPlot::description() const
|
||||||
|
{
|
||||||
|
return m_plotWindowTitle;
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
///
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
void RimStatisticsPlot::zoomAll()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
///
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
QImage RimStatisticsPlot::snapshotWindowContent()
|
||||||
|
{
|
||||||
|
QImage image;
|
||||||
|
|
||||||
|
if ( m_viewer )
|
||||||
|
{
|
||||||
|
QPixmap pix = m_viewer->grab();
|
||||||
|
image = pix.toImage();
|
||||||
|
}
|
||||||
|
|
||||||
|
return image;
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
///
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
QWidget* RimStatisticsPlot::createViewWidget( QWidget* mainWindowParent )
|
||||||
|
{
|
||||||
|
m_viewer = new RiuQtChartView( this, mainWindowParent );
|
||||||
|
return m_viewer;
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
///
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
void RimStatisticsPlot::deleteViewWidget()
|
||||||
|
{
|
||||||
|
cleanupBeforeClose();
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
///
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
void RimStatisticsPlot::onPlotAdditionOrRemoval()
|
||||||
|
{
|
||||||
|
updateAllRequiredEditors();
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
///
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
void RimStatisticsPlot::doRenderWindowContent( QPaintDevice* paintDevice )
|
||||||
|
{
|
||||||
|
if ( m_viewer )
|
||||||
|
{
|
||||||
|
QPainter painter( paintDevice );
|
||||||
|
m_viewer->render( &painter );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
///
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
void RimStatisticsPlot::doUpdateLayout()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
///
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
void RimStatisticsPlot::cleanupBeforeClose()
|
||||||
|
{
|
||||||
|
if ( m_viewer )
|
||||||
|
{
|
||||||
|
m_viewer->setParent( nullptr );
|
||||||
|
delete m_viewer;
|
||||||
|
m_viewer = nullptr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
///
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
void RimStatisticsPlot::defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering )
|
||||||
|
{
|
||||||
|
caf::PdmUiGroup* plotLayoutGroup = uiOrdering.addNewGroup( "Plot Layout" );
|
||||||
|
RimPlotWindow::uiOrderingForPlotLayout( uiConfigName, *plotLayoutGroup );
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
///
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
void RimStatisticsPlot::onLoadDataAndUpdate()
|
||||||
|
{
|
||||||
|
updateMdiWindowVisibility();
|
||||||
|
performAutoNameUpdate();
|
||||||
|
updatePlots();
|
||||||
|
updateLayout();
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
///
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
void RimStatisticsPlot::updatePlots()
|
||||||
|
{
|
||||||
|
if ( !hasStatisticsData() ) return;
|
||||||
|
|
||||||
|
RigHistogramData histogramData = createStatisticsData();
|
||||||
|
|
||||||
|
if ( !histogramData.isHistogramVectorValid() ) return;
|
||||||
|
|
||||||
|
QBarSet* set0 = new QBarSet( m_plotWindowTitle );
|
||||||
|
double minValue = std::numeric_limits<double>::max();
|
||||||
|
double maxValue = -std::numeric_limits<double>::max();
|
||||||
|
for ( double value : *histogramData.histogram )
|
||||||
|
{
|
||||||
|
*set0 << value;
|
||||||
|
minValue = std::min( minValue, value );
|
||||||
|
maxValue = std::max( maxValue, value );
|
||||||
|
}
|
||||||
|
|
||||||
|
QBarSeries* series = new QBarSeries();
|
||||||
|
series->append( set0 );
|
||||||
|
|
||||||
|
QChart* chart = new QChart();
|
||||||
|
chart->addSeries( series );
|
||||||
|
chart->setTitle( uiName() );
|
||||||
|
|
||||||
|
// Axis
|
||||||
|
double xAxisSize = histogramData.max - histogramData.min;
|
||||||
|
double xAxisExtension = xAxisSize * 0.02;
|
||||||
|
|
||||||
|
QValueAxis* axisX = new QValueAxis();
|
||||||
|
axisX->setRange( histogramData.min - xAxisExtension, histogramData.max + xAxisExtension );
|
||||||
|
chart->addAxis( axisX, Qt::AlignBottom );
|
||||||
|
|
||||||
|
QValueAxis* axisY = new QValueAxis();
|
||||||
|
axisY->setRange( minValue, maxValue );
|
||||||
|
chart->addAxis( axisY, Qt::AlignLeft );
|
||||||
|
|
||||||
|
QLineSeries* p10series = new QLineSeries();
|
||||||
|
chart->addSeries( p10series );
|
||||||
|
p10series->setName( "P10" );
|
||||||
|
p10series->append( histogramData.p10, minValue );
|
||||||
|
p10series->append( histogramData.p10, maxValue );
|
||||||
|
p10series->attachAxis( axisX );
|
||||||
|
p10series->attachAxis( axisY );
|
||||||
|
|
||||||
|
QLineSeries* p90series = new QLineSeries();
|
||||||
|
chart->addSeries( p90series );
|
||||||
|
p90series->setName( "P90" );
|
||||||
|
p90series->append( histogramData.p90, minValue );
|
||||||
|
p90series->append( histogramData.p90, maxValue );
|
||||||
|
p90series->attachAxis( axisX );
|
||||||
|
p90series->attachAxis( axisY );
|
||||||
|
|
||||||
|
QLineSeries* meanSeries = new QLineSeries();
|
||||||
|
chart->addSeries( meanSeries );
|
||||||
|
meanSeries->setName( "Mean" );
|
||||||
|
meanSeries->append( histogramData.mean, minValue );
|
||||||
|
meanSeries->append( histogramData.mean, maxValue );
|
||||||
|
meanSeries->attachAxis( axisX );
|
||||||
|
meanSeries->attachAxis( axisY );
|
||||||
|
|
||||||
|
// Set font sizes
|
||||||
|
QFont titleFont = chart->titleFont();
|
||||||
|
titleFont.setPixelSize( titleFontSize() );
|
||||||
|
chart->setTitleFont( titleFont );
|
||||||
|
|
||||||
|
QLegend* legend = chart->legend();
|
||||||
|
if ( legend )
|
||||||
|
{
|
||||||
|
QFont legendFont = legend->font();
|
||||||
|
legendFont.setPixelSize( legendFontSize() );
|
||||||
|
legend->setFont( legendFont );
|
||||||
|
legend->setVisible( legendsVisible() );
|
||||||
|
}
|
||||||
|
|
||||||
|
m_viewer->setChart( chart );
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
///
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
caf::PdmFieldHandle* RimStatisticsPlot::userDescriptionField()
|
||||||
|
{
|
||||||
|
return &m_plotWindowTitle;
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
///
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
void RimStatisticsPlot::performAutoNameUpdate()
|
||||||
|
{
|
||||||
|
QString name = createAutoName();
|
||||||
|
m_plotWindowTitle = name;
|
||||||
|
setUiName( name );
|
||||||
|
}
|
80
ApplicationLibCode/ProjectDataModel/RimStatisticsPlot.h
Normal file
80
ApplicationLibCode/ProjectDataModel/RimStatisticsPlot.h
Normal file
@ -0,0 +1,80 @@
|
|||||||
|
/////////////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// Copyright (C) 2020- 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 "RiaDefines.h"
|
||||||
|
|
||||||
|
#include "RigHistogramData.h"
|
||||||
|
|
||||||
|
#include "RimPlotWindow.h"
|
||||||
|
|
||||||
|
#include "RiuQtChartView.h"
|
||||||
|
|
||||||
|
#include "cafPdmField.h"
|
||||||
|
|
||||||
|
#include <QPointer>
|
||||||
|
|
||||||
|
//==================================================================================================
|
||||||
|
///
|
||||||
|
///
|
||||||
|
//==================================================================================================
|
||||||
|
class RimStatisticsPlot : public RimPlotWindow
|
||||||
|
{
|
||||||
|
CAF_PDM_HEADER_INIT;
|
||||||
|
|
||||||
|
public:
|
||||||
|
RimStatisticsPlot();
|
||||||
|
~RimStatisticsPlot() override;
|
||||||
|
|
||||||
|
QWidget* viewWidget() override;
|
||||||
|
QWidget* createPlotWidget( QWidget* mainWindowParent = nullptr );
|
||||||
|
QString description() const override;
|
||||||
|
|
||||||
|
void zoomAll() override;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
QImage snapshotWindowContent() override;
|
||||||
|
|
||||||
|
QWidget* createViewWidget( QWidget* mainWindowParent ) override;
|
||||||
|
void deleteViewWidget() override;
|
||||||
|
|
||||||
|
// Overridden PDM methods
|
||||||
|
void defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) override;
|
||||||
|
|
||||||
|
void onLoadDataAndUpdate() override;
|
||||||
|
void updatePlots();
|
||||||
|
caf::PdmFieldHandle* userDescriptionField() override;
|
||||||
|
|
||||||
|
virtual bool hasStatisticsData() const = 0;
|
||||||
|
virtual RigHistogramData createStatisticsData() const = 0;
|
||||||
|
virtual QString createAutoName() const = 0;
|
||||||
|
|
||||||
|
void performAutoNameUpdate();
|
||||||
|
|
||||||
|
private:
|
||||||
|
void cleanupBeforeClose();
|
||||||
|
void onPlotAdditionOrRemoval();
|
||||||
|
void doRenderWindowContent( QPaintDevice* paintDevice ) override;
|
||||||
|
void doUpdateLayout() override;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
QPointer<RiuQtChartView> m_viewer;
|
||||||
|
|
||||||
|
caf::PdmField<QString> m_plotWindowTitle;
|
||||||
|
};
|
Loading…
Reference in New Issue
Block a user