mirror of
https://github.com/OPM/ResInsight.git
synced 2025-02-25 18:55:39 -06:00
10214 ensemble appearance
* Regression Analysis: Use only positive values for Power Fit regression. * Add visible tag short cut for changning curve color. * #10214 Ensemble Curve Set: Fix color mode text. * #10214 Ensemble: Switch P10 and P90 symbols to point towards mean. * Cache hit rects for tree item tags. * #10214 Ensemble curve set: allow reordering with tree view tag * #10214 Keep curve legend text when ensemble curves are hidden
This commit is contained in:
committed by
GitHub
parent
329a199863
commit
94f7bd3c1a
@@ -32,13 +32,16 @@
|
||||
#include "RimSummaryCurveCollection.h"
|
||||
#include "RimSummaryPlot.h"
|
||||
|
||||
#include "RiuGuiTheme.h"
|
||||
#include "RiuPlotCurve.h"
|
||||
#include "RiuPlotCurveSymbol.h"
|
||||
#include "RiuPlotMainWindowTools.h"
|
||||
#include "RiuPlotWidget.h"
|
||||
|
||||
#include "cafAssert.h"
|
||||
#include "cafPdmUiColorEditor.h"
|
||||
#include "cafPdmUiComboBoxEditor.h"
|
||||
#include "cafPdmUiTreeAttributes.h"
|
||||
#include "cafPdmUiTreeSelectionEditor.h"
|
||||
|
||||
#include <QPen>
|
||||
@@ -1243,3 +1246,48 @@ QString RimPlotCurve::curveExportDescription( const RifEclipseSummaryAddress& ad
|
||||
{
|
||||
return m_curveName;
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
void RimPlotCurve::defineObjectEditorAttribute( QString uiConfigName, caf::PdmUiEditorAttribute* attribute )
|
||||
{
|
||||
if ( auto* treeItemAttribute = dynamic_cast<caf::PdmUiTreeViewItemAttribute*>( attribute ) )
|
||||
{
|
||||
treeItemAttribute->tags.clear();
|
||||
auto tag = caf::PdmUiTreeViewItemAttribute::Tag::create();
|
||||
|
||||
// Blend with background for a nice look
|
||||
auto backgroundColor = RiuGuiTheme::getColorByVariableName( "backgroundColor1" );
|
||||
auto color = RiaColorTools::toQColor( m_curveAppearance->color() );
|
||||
auto sourceWeight = 100;
|
||||
double transparency = 0.3;
|
||||
int backgroundWeight = std::max( 1, static_cast<int>( sourceWeight * 10 * transparency ) );
|
||||
auto blendedColor = RiaColorTools::blendQColors( backgroundColor, color, backgroundWeight, sourceWeight );
|
||||
|
||||
tag->bgColor = blendedColor;
|
||||
tag->fgColor = RiaColorTools::toQColor( m_curveAppearance->color() );
|
||||
tag->text = "---";
|
||||
|
||||
tag->clicked.connect( this, &RimPlotCurve::onColorTagClicked );
|
||||
|
||||
treeItemAttribute->tags.push_back( std::move( tag ) );
|
||||
}
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
void RimPlotCurve::onColorTagClicked( const SignalEmitter* emitter, size_t index )
|
||||
{
|
||||
QColor sourceColor = RiaColorTools::toQColor( m_curveAppearance->color() );
|
||||
QColor newColor = caf::PdmUiColorEditor::getColor( sourceColor );
|
||||
|
||||
if ( newColor.isValid() && newColor != sourceColor )
|
||||
{
|
||||
auto myColor = RiaColorTools::fromQColorTo3f( newColor );
|
||||
m_curveAppearance->setColor( myColor );
|
||||
updateCurveAppearance();
|
||||
replotParentPlot();
|
||||
}
|
||||
}
|
||||
|
@@ -185,6 +185,10 @@ protected:
|
||||
|
||||
virtual void updateAxisInPlot( RiuPlotAxis plotAxis );
|
||||
|
||||
void defineObjectEditorAttribute( QString uiConfigName, caf::PdmUiEditorAttribute* attribute ) override;
|
||||
|
||||
void onColorTagClicked( const SignalEmitter* emitter, size_t index );
|
||||
|
||||
private:
|
||||
bool isCurveNameTemplateSupported() const;
|
||||
|
||||
|
@@ -1777,7 +1777,6 @@ void RimEnsembleCurveSet::updateEnsembleCurves( const std::vector<RimSummaryCase
|
||||
auto plot = firstAncestorOrThisOfTypeAsserted<RimSummaryPlot>();
|
||||
|
||||
deleteEnsembleCurves();
|
||||
if ( m_plotCurveForLegendText ) m_plotCurveForLegendText->detach();
|
||||
deleteStatisticsCurves();
|
||||
|
||||
if ( m_statistics->hideEnsembleCurves() ) return;
|
||||
@@ -2187,8 +2186,8 @@ RiuPlotCurveSymbol::PointSymbolEnum statisticsCurveSymbolFromAddress( const RifE
|
||||
{
|
||||
auto qName = QString::fromStdString( address.vectorName() );
|
||||
|
||||
if ( qName.contains( ENSEMBLE_STAT_P10_QUANTITY_NAME ) ) return RiuPlotCurveSymbol::SYMBOL_TRIANGLE;
|
||||
if ( qName.contains( ENSEMBLE_STAT_P90_QUANTITY_NAME ) ) return RiuPlotCurveSymbol::SYMBOL_DOWN_TRIANGLE;
|
||||
if ( qName.contains( ENSEMBLE_STAT_P10_QUANTITY_NAME ) ) return RiuPlotCurveSymbol::SYMBOL_DOWN_TRIANGLE;
|
||||
if ( qName.contains( ENSEMBLE_STAT_P90_QUANTITY_NAME ) ) return RiuPlotCurveSymbol::SYMBOL_TRIANGLE;
|
||||
if ( qName.contains( ENSEMBLE_STAT_P50_QUANTITY_NAME ) ) return RiuPlotCurveSymbol::SYMBOL_DIAMOND;
|
||||
return RiuPlotCurveSymbol::SYMBOL_ELLIPSE;
|
||||
}
|
||||
|
@@ -31,6 +31,8 @@
|
||||
|
||||
#include "RiuPlotCurve.h"
|
||||
|
||||
#include "cafPdmFieldReorderCapability.h"
|
||||
|
||||
CAF_PDM_SOURCE_INIT( RimEnsembleCurveSetCollection, "RimEnsembleCurveSetCollection" );
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
@@ -43,6 +45,7 @@ RimEnsembleCurveSetCollection::RimEnsembleCurveSetCollection()
|
||||
CAF_PDM_InitFieldNoDefault( &m_curveSets, "EnsembleCurveSets", "Ensemble Curve Sets" );
|
||||
m_curveSets.uiCapability()->setUiTreeHidden( true );
|
||||
m_curveSets.uiCapability()->setUiTreeChildrenHidden( false );
|
||||
caf::PdmFieldReorderCapability::addToFieldWithCallback( &m_curveSets, this, &RimEnsembleCurveSetCollection::onCurveSetsReordered );
|
||||
|
||||
CAF_PDM_InitField( &m_showCurves, "IsActive", true, "Show Curves" );
|
||||
m_showCurves.uiCapability()->setUiHidden( true );
|
||||
@@ -339,3 +342,10 @@ void RimEnsembleCurveSetCollection::onChildDeleted( caf::PdmChildArrayFieldHandl
|
||||
auto plot = firstAncestorOrThisOfType<RimSummaryPlot>();
|
||||
if ( plot ) plot->updateConnectedEditors();
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
void RimEnsembleCurveSetCollection::onCurveSetsReordered( const SignalEmitter* emitter )
|
||||
{
|
||||
}
|
||||
|
@@ -76,6 +76,8 @@ private:
|
||||
|
||||
void defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) override;
|
||||
|
||||
void onCurveSetsReordered( const SignalEmitter* emitter );
|
||||
|
||||
private:
|
||||
caf::PdmField<bool> m_showCurves;
|
||||
caf::PdmChildArrayField<RimEnsembleCurveSet*> m_curveSets;
|
||||
|
@@ -39,7 +39,7 @@ template <>
|
||||
void AppEnum<RimEnsembleCurveSetColorManager::ColorMode>::setUp()
|
||||
{
|
||||
addItem( RimEnsembleCurveSetColorManager::ColorMode::SINGLE_COLOR, "SINGLE_COLOR", "Single Color" );
|
||||
addItem( RimEnsembleCurveSetColorManager::ColorMode::SINGLE_COLOR_WITH_ALPHA, "SINGLE_COLOR_WITH_ALPHA", "Single Color with alpha" );
|
||||
addItem( RimEnsembleCurveSetColorManager::ColorMode::SINGLE_COLOR_WITH_ALPHA, "SINGLE_COLOR_WITH_ALPHA", "Single Color with Transparency" );
|
||||
addItem( RimEnsembleCurveSetColorManager::ColorMode::BY_ENSEMBLE_PARAM, "BY_ENSEMBLE_PARAM", "By Ensemble Parameter" );
|
||||
addItem( RimEnsembleCurveSetColorManager::ColorMode::BY_OBJECTIVE_FUNCTION, "BY_OBJECTIVE_FUNCTION", "By Objective Function" );
|
||||
addItem( RimEnsembleCurveSetColorManager::ColorMode::BY_CUSTOM_OBJECTIVE_FUNCTION,
|
||||
|
@@ -26,6 +26,7 @@
|
||||
#include "PowerFitRegression.hpp"
|
||||
|
||||
#include <cmath>
|
||||
#include <vector>
|
||||
|
||||
CAF_PDM_SOURCE_INIT( RimSummaryRegressionAnalysisCurve, "RegressionAnalysisCurve" );
|
||||
|
||||
@@ -149,8 +150,23 @@ std::tuple<std::vector<time_t>, std::vector<double>, QString>
|
||||
}
|
||||
else if ( m_regressionType == RegressionType::POWER_FIT )
|
||||
{
|
||||
auto filterValues = []( const std::vector<double>& timeSteps, const std::vector<double>& values )
|
||||
{
|
||||
std::vector<double> filteredTimeSteps;
|
||||
std::vector<double> filteredValues;
|
||||
for ( size_t i = 0; i < timeSteps.size(); i++ )
|
||||
{
|
||||
if ( timeSteps[i] > 0.0 && values[i] > 0.0 )
|
||||
{
|
||||
filteredTimeSteps.push_back( timeSteps[i] );
|
||||
filteredValues.push_back( values[i] );
|
||||
}
|
||||
}
|
||||
return std::make_pair( filteredTimeSteps, filteredValues );
|
||||
};
|
||||
auto [filteredTimeSteps, filteredValues] = filterValues( timeStepsD, values );
|
||||
regression::PowerFitRegression powerFitRegression;
|
||||
powerFitRegression.fit( timeStepsD, values );
|
||||
powerFitRegression.fit( filteredTimeSteps, filteredValues );
|
||||
std::vector<double> predictedValues = powerFitRegression.predict( timeStepsD );
|
||||
return { timeSteps, predictedValues, generateRegressionText( powerFitRegression ) };
|
||||
}
|
||||
|
@@ -892,8 +892,8 @@ void RimEnsembleWellLogCurveSet::updateStatisticsCurves( const std::vector<RimWe
|
||||
|
||||
auto statisticsCurveSymbolFromStatistics = []( RimEnsembleWellLogStatistics::StatisticsType statisticsType )
|
||||
{
|
||||
if ( statisticsType == RimEnsembleWellLogStatistics::StatisticsType::P10 ) return RiuPlotCurveSymbol::SYMBOL_TRIANGLE;
|
||||
if ( statisticsType == RimEnsembleWellLogStatistics::StatisticsType::P90 ) return RiuPlotCurveSymbol::SYMBOL_DOWN_TRIANGLE;
|
||||
if ( statisticsType == RimEnsembleWellLogStatistics::StatisticsType::P10 ) return RiuPlotCurveSymbol::SYMBOL_DOWN_TRIANGLE;
|
||||
if ( statisticsType == RimEnsembleWellLogStatistics::StatisticsType::P90 ) return RiuPlotCurveSymbol::SYMBOL_TRIANGLE;
|
||||
if ( statisticsType == RimEnsembleWellLogStatistics::StatisticsType::P50 ) return RiuPlotCurveSymbol::SYMBOL_DIAMOND;
|
||||
return RiuPlotCurveSymbol::SYMBOL_ELLIPSE;
|
||||
};
|
||||
|
@@ -69,6 +69,7 @@ public:
|
||||
QColor bgColor;
|
||||
QColor fgColor;
|
||||
bool selectedOnly;
|
||||
QRect rect;
|
||||
|
||||
caf::Signal<size_t> clicked;
|
||||
|
||||
|
@@ -101,48 +101,12 @@ QRect PdmUiTreeViewItemDelegate::tagRect( const QRect& itemRect, QModelIndex ind
|
||||
auto it = m_tags.find( index );
|
||||
if ( it == m_tags.end() ) return QRect();
|
||||
|
||||
if ( it->second.size() == 1 )
|
||||
if ( tagIndex < it->second.size() )
|
||||
{
|
||||
const PdmUiTreeViewItemAttribute::Tag* tag = it->second[0].get();
|
||||
if ( !tag->icon.valid() && tag->position == PdmUiTreeViewItemAttribute::Tag::Position::AT_END )
|
||||
{
|
||||
// Special case for single tag at end, which is not an icon
|
||||
|
||||
QPoint bottomRight = itemRect.bottomRight();
|
||||
QPoint topLeft = itemRect.topRight() - QPoint( itemRect.height() * 1.5, 0 );
|
||||
return QRect( topLeft, bottomRight );
|
||||
}
|
||||
const PdmUiTreeViewItemAttribute::Tag* tag = it->second[tagIndex].get();
|
||||
return tag->rect;
|
||||
}
|
||||
|
||||
QSize fullSize = itemRect.size();
|
||||
|
||||
QPoint offset( 0, 0 );
|
||||
|
||||
for ( size_t i = 0; i < it->second.size(); ++i )
|
||||
{
|
||||
const PdmUiTreeViewItemAttribute::Tag* tag = it->second[i].get();
|
||||
if ( tag->icon.valid() )
|
||||
{
|
||||
auto icon = tag->icon.icon();
|
||||
QSize iconSize = icon->actualSize( fullSize );
|
||||
QRect iconRect;
|
||||
if ( tag->position == PdmUiTreeViewItemAttribute::Tag::Position::AT_END )
|
||||
{
|
||||
QPoint bottomRight = itemRect.bottomRight() - offset;
|
||||
QPoint topLeft = bottomRight - QPoint( iconSize.width(), iconSize.height() );
|
||||
iconRect = QRect( topLeft, bottomRight );
|
||||
}
|
||||
else
|
||||
{
|
||||
QPoint topLeft = itemRect.topLeft() + offset;
|
||||
QPoint bottomRight = topLeft + QPoint( iconSize.width(), iconSize.height() );
|
||||
iconRect = QRect( topLeft, bottomRight );
|
||||
}
|
||||
offset += QPoint( iconSize.width() + 2, 0 );
|
||||
|
||||
if ( i == tagIndex ) return iconRect;
|
||||
}
|
||||
}
|
||||
return QRect();
|
||||
}
|
||||
|
||||
@@ -189,6 +153,7 @@ void PdmUiTreeViewItemDelegate::paint( QPainter* painter, const QStyleOptionView
|
||||
}
|
||||
offset += QPoint( iconSize.width() + 2, 0 );
|
||||
icon->paint( painter, iconRect );
|
||||
tag->rect = iconRect;
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -246,6 +211,7 @@ void PdmUiTreeViewItemDelegate::paint( QPainter* painter, const QStyleOptionView
|
||||
|
||||
painter->setPen( fgColor );
|
||||
painter->drawText( textRect, Qt::AlignCenter, text );
|
||||
tag->rect = tagRect;
|
||||
}
|
||||
}
|
||||
// Restore painter
|
||||
|
Reference in New Issue
Block a user