mirror of
https://github.com/OPM/ResInsight.git
synced 2025-02-25 18:55:39 -06:00
Summary Table: Add user option to set time range on x-axis
* Make sure all evenly distributed labels are drawn * Add start and end data
This commit is contained in:
@@ -22,6 +22,7 @@
|
|||||||
#include "RiaQDateTimeTools.h"
|
#include "RiaQDateTimeTools.h"
|
||||||
#include "RiaStdStringTools.h"
|
#include "RiaStdStringTools.h"
|
||||||
#include "RiaTimeHistoryCurveResampler.h"
|
#include "RiaTimeHistoryCurveResampler.h"
|
||||||
|
#include "RiaTimeTTools.h"
|
||||||
#include "Summary/RiaSummaryTools.h"
|
#include "Summary/RiaSummaryTools.h"
|
||||||
|
|
||||||
#include "RifSummaryReaderInterface.h"
|
#include "RifSummaryReaderInterface.h"
|
||||||
@@ -35,6 +36,7 @@
|
|||||||
#include "RiuMatrixPlotWidget.h"
|
#include "RiuMatrixPlotWidget.h"
|
||||||
|
|
||||||
#include "cafPdmUiComboBoxEditor.h"
|
#include "cafPdmUiComboBoxEditor.h"
|
||||||
|
#include "cafPdmUiDateEditor.h"
|
||||||
#include "cafPdmUiPushButtonEditor.h"
|
#include "cafPdmUiPushButtonEditor.h"
|
||||||
#include "cafPdmUiToolButtonEditor.h"
|
#include "cafPdmUiToolButtonEditor.h"
|
||||||
#include "cafPdmUiTreeSelectionEditor.h"
|
#include "cafPdmUiTreeSelectionEditor.h"
|
||||||
@@ -105,6 +107,10 @@ RimSummaryTable::RimSummaryTable()
|
|||||||
CAF_PDM_InitFieldNoDefault( &m_mappingType, "MappingType", "Mapping Type" );
|
CAF_PDM_InitFieldNoDefault( &m_mappingType, "MappingType", "Mapping Type" );
|
||||||
CAF_PDM_InitFieldNoDefault( &m_rangeType, "RangeType", "Range Type" );
|
CAF_PDM_InitFieldNoDefault( &m_rangeType, "RangeType", "Range Type" );
|
||||||
|
|
||||||
|
CAF_PDM_InitField( &m_filterTimeSteps, "FilterTimeSteps", false, "Filter Time Steps" );
|
||||||
|
CAF_PDM_InitField( &m_startDate, "StartDate", QDateTime::currentDateTime(), "Start Date" );
|
||||||
|
CAF_PDM_InitField( &m_endDate, "EndDate", QDateTime::currentDateTime(), "End Date" );
|
||||||
|
|
||||||
setLegendsVisible( true );
|
setLegendsVisible( true );
|
||||||
setAsPlotMdiWindow();
|
setAsPlotMdiWindow();
|
||||||
setShowWindow( true );
|
setShowWindow( true );
|
||||||
@@ -145,6 +151,8 @@ void RimSummaryTable::setDefaultCaseAndCategoryAndVectorName()
|
|||||||
m_vector = *categoryVectors.begin();
|
m_vector = *categoryVectors.begin();
|
||||||
}
|
}
|
||||||
m_tableName = createTableName();
|
m_tableName = createTableName();
|
||||||
|
|
||||||
|
initializeDateRange();
|
||||||
}
|
}
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
@@ -158,6 +166,9 @@ void RimSummaryTable::setFromCaseAndCategoryAndVectorName( RimSummaryCase*
|
|||||||
m_category = category;
|
m_category = category;
|
||||||
m_vector = vectorName;
|
m_vector = vectorName;
|
||||||
m_tableName = createTableName();
|
m_tableName = createTableName();
|
||||||
|
|
||||||
|
initializeDateRange();
|
||||||
|
|
||||||
onLoadDataAndUpdate();
|
onLoadDataAndUpdate();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -285,7 +296,8 @@ void RimSummaryTable::fieldChangedByUi( const caf::PdmFieldHandle* changedField,
|
|||||||
}
|
}
|
||||||
onLoadDataAndUpdate();
|
onLoadDataAndUpdate();
|
||||||
}
|
}
|
||||||
else if ( changedField == &m_maxTimeLabelCount )
|
else if ( changedField == &m_maxTimeLabelCount || changedField == &m_startDate || changedField == &m_endDate ||
|
||||||
|
changedField == &m_filterTimeSteps )
|
||||||
{
|
{
|
||||||
onLoadDataAndUpdate();
|
onLoadDataAndUpdate();
|
||||||
}
|
}
|
||||||
@@ -316,6 +328,14 @@ void RimSummaryTable::defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering
|
|||||||
dataGroup.add( &m_thresholdValue );
|
dataGroup.add( &m_thresholdValue );
|
||||||
dataGroup.add( &m_excludedRowsUiField );
|
dataGroup.add( &m_excludedRowsUiField );
|
||||||
|
|
||||||
|
caf::PdmUiGroup* timeFilterGroup = dataGroup.addNewGroup( "Time Filter" );
|
||||||
|
timeFilterGroup->add( &m_filterTimeSteps );
|
||||||
|
timeFilterGroup->add( &m_startDate );
|
||||||
|
timeFilterGroup->add( &m_endDate );
|
||||||
|
|
||||||
|
m_startDate.uiCapability()->setUiReadOnly( !m_filterTimeSteps() );
|
||||||
|
m_endDate.uiCapability()->setUiReadOnly( !m_filterTimeSteps() );
|
||||||
|
|
||||||
caf::PdmUiGroup* tableSettingsGroup = uiOrdering.addNewGroup( "Table Settings" );
|
caf::PdmUiGroup* tableSettingsGroup = uiOrdering.addNewGroup( "Table Settings" );
|
||||||
tableSettingsGroup->add( &m_showValueLabels );
|
tableSettingsGroup->add( &m_showValueLabels );
|
||||||
m_legendConfig->uiOrdering( "FlagAndColorsOnly", *tableSettingsGroup );
|
m_legendConfig->uiOrdering( "FlagAndColorsOnly", *tableSettingsGroup );
|
||||||
@@ -334,6 +354,32 @@ void RimSummaryTable::defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering
|
|||||||
uiOrdering.skipRemainingFields( true );
|
uiOrdering.skipRemainingFields( true );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
///
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
void RimSummaryTable::defineEditorAttribute( const caf::PdmFieldHandle* field, QString uiConfigName, caf::PdmUiEditorAttribute* attribute )
|
||||||
|
{
|
||||||
|
if ( field == &m_startDate || field == &m_endDate )
|
||||||
|
{
|
||||||
|
if ( auto myAttr = dynamic_cast<caf::PdmUiDateEditorAttribute*>( attribute ) )
|
||||||
|
{
|
||||||
|
QString dateFormat = "yyyy-MM-dd";
|
||||||
|
if ( m_resamplingSelection() == RiaDefines::DateTimePeriod::DECADE || m_resamplingSelection() == RiaDefines::DateTimePeriod::YEAR )
|
||||||
|
{
|
||||||
|
dateFormat = "yyyy";
|
||||||
|
}
|
||||||
|
else if ( m_resamplingSelection() == RiaDefines::DateTimePeriod::MONTH ||
|
||||||
|
m_resamplingSelection() == RiaDefines::DateTimePeriod::QUARTER ||
|
||||||
|
m_resamplingSelection() == RiaDefines::DateTimePeriod::HALFYEAR )
|
||||||
|
{
|
||||||
|
dateFormat = "yyyy-MM";
|
||||||
|
}
|
||||||
|
|
||||||
|
myAttr->dateFormat = dateFormat;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
///
|
///
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
@@ -400,6 +446,7 @@ QList<caf::PdmOptionItemInfo> RimSummaryTable::calculateValueOptions( const caf:
|
|||||||
options.push_back( caf::PdmOptionItemInfo( caf::AppEnum<RimRegularLegendConfig::MappingType>::uiText( mappingType ), mappingType ) );
|
options.push_back( caf::PdmOptionItemInfo( caf::AppEnum<RimRegularLegendConfig::MappingType>::uiText( mappingType ), mappingType ) );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return options;
|
return options;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -674,6 +721,25 @@ std::vector<RimSummaryCase*> RimSummaryTable::getToplevelSummaryCases() const
|
|||||||
return summaryCaseMainCollection->topLevelSummaryCases();
|
return summaryCaseMainCollection->topLevelSummaryCases();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
///
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
void RimSummaryTable::initializeDateRange()
|
||||||
|
{
|
||||||
|
if ( !m_case ) return;
|
||||||
|
const auto summaryReader = m_case->summaryReader();
|
||||||
|
if ( !summaryReader ) return;
|
||||||
|
|
||||||
|
const std::set<RifEclipseSummaryAddress> allResultAddresses = summaryReader->allResultAddresses();
|
||||||
|
if ( allResultAddresses.empty() ) return;
|
||||||
|
|
||||||
|
auto timeSteps = summaryReader->timeSteps( *allResultAddresses.begin() );
|
||||||
|
if ( timeSteps.empty() ) return;
|
||||||
|
|
||||||
|
m_startDate = RiaQDateTimeTools::fromTime_t( timeSteps.front() );
|
||||||
|
m_endDate = RiaQDateTimeTools::fromTime_t( timeSteps.back() );
|
||||||
|
}
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
///
|
///
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
@@ -700,12 +766,49 @@ void RimSummaryTable::createTableData()
|
|||||||
const QString vectorName = QString::fromStdString( adr.vectorName() );
|
const QString vectorName = QString::fromStdString( adr.vectorName() );
|
||||||
const QString categoryName = getCategoryNameFromAddress( adr );
|
const QString categoryName = getCategoryNameFromAddress( adr );
|
||||||
|
|
||||||
// Get re-sampled time steps and values
|
// Get resampled time steps and values
|
||||||
const auto& [resampledTimeSteps, resampledValues] =
|
auto [resampledTimeSteps, resampledValues] =
|
||||||
RiaSummaryTools::resampledValuesForPeriod( adr, timeSteps, values, m_resamplingSelection() );
|
RiaSummaryTools::resampledValuesForPeriod( adr, timeSteps, values, m_resamplingSelection() );
|
||||||
|
|
||||||
if ( resampledValues.empty() ) continue;
|
if ( resampledValues.empty() ) continue;
|
||||||
|
|
||||||
|
if ( m_filterTimeSteps() )
|
||||||
|
{
|
||||||
|
auto filterTimeStepsAndValues = []( auto& resampledTimeSteps, auto& resampledValues, time_t startTime, time_t endTime )
|
||||||
|
{
|
||||||
|
auto lowerBound = std::lower_bound( resampledTimeSteps.begin(), resampledTimeSteps.end(), startTime );
|
||||||
|
if ( lowerBound != resampledTimeSteps.end() )
|
||||||
|
{
|
||||||
|
const auto baseIndex = lowerBound - resampledTimeSteps.begin();
|
||||||
|
|
||||||
|
// Use one time step less to make sure the start date is included
|
||||||
|
const auto startIndex = ( baseIndex > 1 ) ? baseIndex - 1 : 0;
|
||||||
|
|
||||||
|
resampledTimeSteps.erase( resampledTimeSteps.begin(), resampledTimeSteps.begin() + startIndex );
|
||||||
|
resampledValues.erase( resampledValues.begin(), resampledValues.begin() + startIndex );
|
||||||
|
}
|
||||||
|
|
||||||
|
const auto upperBound = std::upper_bound( resampledTimeSteps.begin(), resampledTimeSteps.end(), endTime );
|
||||||
|
if ( upperBound != resampledTimeSteps.end() )
|
||||||
|
{
|
||||||
|
const auto endIndex = ( upperBound - resampledTimeSteps.begin() ) + 1;
|
||||||
|
|
||||||
|
if ( endIndex < (int)resampledTimeSteps.size() )
|
||||||
|
{
|
||||||
|
resampledTimeSteps.erase( resampledTimeSteps.begin() + endIndex, resampledTimeSteps.end() );
|
||||||
|
resampledValues.erase( resampledValues.begin() + endIndex, resampledValues.end() );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
auto startTime = RiaTimeTTools::fromQDateTime( m_startDate );
|
||||||
|
auto endTime = std::max( startTime, RiaTimeTTools::fromQDateTime( m_endDate ) );
|
||||||
|
|
||||||
|
filterTimeStepsAndValues( resampledTimeSteps, resampledValues, startTime, endTime );
|
||||||
|
|
||||||
|
if ( resampledValues.empty() ) continue;
|
||||||
|
}
|
||||||
|
|
||||||
// Exclude vectors with values BELOW threshold - to include visualization of values equal to threshold!
|
// Exclude vectors with values BELOW threshold - to include visualization of values equal to threshold!
|
||||||
const auto maxRowValue = *std::max_element( resampledValues.begin(), resampledValues.end() );
|
const auto maxRowValue = *std::max_element( resampledValues.begin(), resampledValues.end() );
|
||||||
const auto minRowValue = *std::min_element( resampledValues.begin(), resampledValues.end() );
|
const auto minRowValue = *std::min_element( resampledValues.begin(), resampledValues.end() );
|
||||||
@@ -722,6 +825,7 @@ void RimSummaryTable::createTableData()
|
|||||||
std::find_if( resampledValues.rbegin(), resampledValues.rend(), [&]( double value ) { return value > 0.0; } );
|
std::find_if( resampledValues.rbegin(), resampledValues.rend(), [&]( double value ) { return value > 0.0; } );
|
||||||
const auto firstIdx = static_cast<size_t>( std::distance( resampledValues.begin(), firstTimeStepItr ) );
|
const auto firstIdx = static_cast<size_t>( std::distance( resampledValues.begin(), firstTimeStepItr ) );
|
||||||
const auto lastIdx = resampledValues.size() - static_cast<size_t>( std::distance( resampledValues.rbegin(), lastTimeStepItr ) ) - 1;
|
const auto lastIdx = resampledValues.size() - static_cast<size_t>( std::distance( resampledValues.rbegin(), lastTimeStepItr ) ) - 1;
|
||||||
|
|
||||||
const auto firstTimeStep = hasValueAboveThreshold ? resampledTimeSteps[firstIdx] : invalidTimeStep;
|
const auto firstTimeStep = hasValueAboveThreshold ? resampledTimeSteps[firstIdx] : invalidTimeStep;
|
||||||
const auto lastTimeStep = hasValueAboveThreshold ? resampledTimeSteps[lastIdx] : invalidTimeStep;
|
const auto lastTimeStep = hasValueAboveThreshold ? resampledTimeSteps[lastIdx] : invalidTimeStep;
|
||||||
|
|
||||||
|
|||||||
@@ -72,6 +72,7 @@ private:
|
|||||||
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 childFieldChangedByUi( const caf::PdmFieldHandle* changedChildField ) override;
|
void childFieldChangedByUi( const caf::PdmFieldHandle* changedChildField ) override;
|
||||||
void defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) override;
|
void defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) override;
|
||||||
|
void defineEditorAttribute( const caf::PdmFieldHandle* field, QString uiConfigName, caf::PdmUiEditorAttribute* attribute ) override;
|
||||||
|
|
||||||
QList<caf::PdmOptionItemInfo> calculateValueOptions( const caf::PdmFieldHandle* fieldNeedingOptions ) override;
|
QList<caf::PdmOptionItemInfo> calculateValueOptions( const caf::PdmFieldHandle* fieldNeedingOptions ) override;
|
||||||
|
|
||||||
@@ -94,7 +95,6 @@ private:
|
|||||||
|
|
||||||
QString createTableName() const;
|
QString createTableName() const;
|
||||||
|
|
||||||
private:
|
|
||||||
std::pair<double, double> createLegendMinMaxValues( const double maxTableValue ) const;
|
std::pair<double, double> createLegendMinMaxValues( const double maxTableValue ) const;
|
||||||
QString dateFormatString() const;
|
QString dateFormatString() const;
|
||||||
|
|
||||||
@@ -106,6 +106,7 @@ private:
|
|||||||
QString getCategoryNameFromAddress( const RifEclipseSummaryAddress& address ) const;
|
QString getCategoryNameFromAddress( const RifEclipseSummaryAddress& address ) const;
|
||||||
|
|
||||||
std::vector<RimSummaryCase*> getToplevelSummaryCases() const;
|
std::vector<RimSummaryCase*> getToplevelSummaryCases() const;
|
||||||
|
void initializeDateRange();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// Matrix plot for visualizing table data
|
// Matrix plot for visualizing table data
|
||||||
@@ -133,6 +134,10 @@ private:
|
|||||||
caf::PdmField<RimRegularLegendConfig::MappingEnum> m_mappingType;
|
caf::PdmField<RimRegularLegendConfig::MappingEnum> m_mappingType;
|
||||||
caf::PdmField<caf::AppEnum<RangeType>> m_rangeType;
|
caf::PdmField<caf::AppEnum<RangeType>> m_rangeType;
|
||||||
|
|
||||||
|
caf::PdmField<bool> m_filterTimeSteps;
|
||||||
|
caf::PdmField<QDateTime> m_startDate;
|
||||||
|
caf::PdmField<QDateTime> m_endDate;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
using VectorData = RimSummaryTableTools::VectorData;
|
using VectorData = RimSummaryTableTools::VectorData;
|
||||||
using TableData = RimSummaryTableTools::TableData;
|
using TableData = RimSummaryTableTools::TableData;
|
||||||
|
|||||||
@@ -458,10 +458,9 @@ std::map<size_t, QString> RiuMatrixPlotWidget::createIndexLabelMap( const std::v
|
|||||||
}
|
}
|
||||||
|
|
||||||
std::map<size_t, QString> indexLabelMap;
|
std::map<size_t, QString> indexLabelMap;
|
||||||
for ( size_t i = 0; i < std::min( labels.size(), size_t( maxLabelCount - 1 ) ); ++i )
|
for ( size_t i = 0; i < labels.size(); i += increment )
|
||||||
{
|
{
|
||||||
auto index = i * increment;
|
indexLabelMap.emplace( i, labels[i] );
|
||||||
indexLabelMap.emplace( index, labels[index] );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
indexLabelMap.emplace( labels.size() - 1, labels.back() );
|
indexLabelMap.emplace( labels.size() - 1, labels.back() );
|
||||||
|
|||||||
Reference in New Issue
Block a user