From 53e8cc82bddf9c22e401719dd899eec17ccb434f Mon Sep 17 00:00:00 2001 From: Magne Sjaastad Date: Sat, 19 Oct 2019 15:05:59 +0200 Subject: [PATCH] #4876 Resampeled Plot Data: Show time short text labels when possible --- .../Application/RiaPreferences.cpp | 29 ++++++-- ApplicationCode/Application/RiaPreferences.h | 2 + .../RicShowPlotDataFeature.cpp | 7 +- .../RicAsciiExportSummaryPlotFeature.cpp | 18 +++-- .../RicAsciiExportSummaryPlotFeature.h | 3 +- .../Summary/RimSummaryPlot.cpp | 71 ++++++++++++++++--- .../ProjectDataModel/Summary/RimSummaryPlot.h | 2 +- 7 files changed, 111 insertions(+), 21 deletions(-) diff --git a/ApplicationCode/Application/RiaPreferences.cpp b/ApplicationCode/Application/RiaPreferences.cpp index 06b71fbf01..6457dd2718 100644 --- a/ApplicationCode/Application/RiaPreferences.cpp +++ b/ApplicationCode/Application/RiaPreferences.cpp @@ -315,6 +315,15 @@ RiaPreferences::RiaPreferences( void ) CAF_PDM_InitFieldNoDefault( &m_defaultPlotTemplate, "defaultPlotTemplate", "Default Plot Template", "", "", "" ); // m_plotTemplateFolders.uiCapability()->setUiEditorTypeName( caf::PdmUiFilePathEditor::uiEditorTypeName() ); + + CAF_PDM_InitField( &m_showSummaryTimeAsLongString, + "showSummaryTimeAsLongString", + false, + "Show resample time text as long time text (2010-11-21 23:15:00)", + "", + "", + "" ); + m_showSummaryTimeAsLongString.uiCapability()->setUiLabelPosition( caf::PdmUiItemInfo::HIDDEN ); } //-------------------------------------------------------------------------------------------------- @@ -355,11 +364,12 @@ void RiaPreferences::defineEditorAttribute( const caf::PdmFieldHandle* field, } if ( field == &octaveShowHeaderInfoWhenExecutingScripts || field == &autocomputeDepthRelatedProperties || - field == &loadAndShowSoil || field == &useShaders || field == &showHud || field == &m_appendClassNameToUiText || - field == &m_appendFieldKeywordToToolTipText || field == &m_showTestToolbar || - field == &m_includeFractureDebugInfoFile || field == &showLasCurveWithoutTvdWarning || - field == &holoLensDisableCertificateVerification || field == &m_showProjectChangedDialog || - field == &m_searchPlotTemplateFoldersRecursively || field == &showLegendBackground ) + field == &loadAndShowSoil || field == &useShaders || field == &showHud || + field == &m_appendClassNameToUiText || field == &m_appendFieldKeywordToToolTipText || + field == &m_showTestToolbar || field == &m_includeFractureDebugInfoFile || + field == &showLasCurveWithoutTvdWarning || field == &holoLensDisableCertificateVerification || + field == &m_showProjectChangedDialog || field == &m_searchPlotTemplateFoldersRecursively || + field == &showLegendBackground || field == &m_showSummaryTimeAsLongString ) { caf::PdmUiCheckBoxEditorAttribute* myAttr = dynamic_cast( attribute ); if ( myAttr ) @@ -447,6 +457,7 @@ void RiaPreferences::defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering.add( &defaultSummaryHistoryCurveStyle ); uiOrdering.add( &m_dateFormat ); uiOrdering.add( &m_timeFormat ); + uiOrdering.add( &m_showSummaryTimeAsLongString ); caf::PdmUiGroup* group = uiOrdering.addNewGroup( "Plot Templates" ); group->add( &m_plotTemplateFolders ); @@ -762,6 +773,14 @@ void RiaPreferences::setDefaultPlotTemplatePath( const QString& templatePath ) m_defaultPlotTemplate = templatePath; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RiaPreferences::showSummaryTimeAsLongString() const +{ + return m_showSummaryTimeAsLongString; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationCode/Application/RiaPreferences.h b/ApplicationCode/Application/RiaPreferences.h index ce7a407021..a718fccfea 100644 --- a/ApplicationCode/Application/RiaPreferences.h +++ b/ApplicationCode/Application/RiaPreferences.h @@ -84,6 +84,7 @@ public: void appendPlotTemplateFolders( const QString& folder ); QString defaultPlotTemplateAbsolutePath() const; void setDefaultPlotTemplatePath( const QString& templatePath ); + bool showSummaryTimeAsLongString() const; std::map defaultFontSizes() const; @@ -168,6 +169,7 @@ private: caf::PdmField m_holoLensExportFolder; caf::PdmField m_dateFormat; caf::PdmField m_timeFormat; + caf::PdmField m_showSummaryTimeAsLongString; caf::PdmField m_plotTemplateFolders; caf::PdmField m_searchPlotTemplateFoldersRecursively; diff --git a/ApplicationCode/Commands/ApplicationCommands/RicShowPlotDataFeature.cpp b/ApplicationCode/Commands/ApplicationCommands/RicShowPlotDataFeature.cpp index 50a1ba6259..32f1fc7150 100644 --- a/ApplicationCode/Commands/ApplicationCommands/RicShowPlotDataFeature.cpp +++ b/ApplicationCode/Commands/ApplicationCommands/RicShowPlotDataFeature.cpp @@ -20,6 +20,7 @@ #include "RiaFeatureCommandContext.h" #include "RiaGuiApplication.h" +#include "RiaPreferences.h" #include "RimGridCrossPlot.h" #include "RimGridCrossPlotCurve.h" @@ -84,11 +85,13 @@ public: if ( m_summaryPlot->containsResamplableCurves() ) { - return m_summaryPlot->asciiDataForPlotExport( timePeriod ); + RiaPreferences* prefs = RiaApplication::instance()->preferences(); + + return m_summaryPlot->asciiDataForPlotExport( timePeriod, prefs->showSummaryTimeAsLongString() ); } else { - return m_summaryPlot->asciiDataForPlotExport(); + return m_summaryPlot->asciiDataForPlotExport( DateTimePeriod::NONE, true ); } } diff --git a/ApplicationCode/Commands/SummaryPlotCommands/RicAsciiExportSummaryPlotFeature.cpp b/ApplicationCode/Commands/SummaryPlotCommands/RicAsciiExportSummaryPlotFeature.cpp index 19d6a74f6d..b06f964e16 100644 --- a/ApplicationCode/Commands/SummaryPlotCommands/RicAsciiExportSummaryPlotFeature.cpp +++ b/ApplicationCode/Commands/SummaryPlotCommands/RicAsciiExportSummaryPlotFeature.cpp @@ -20,6 +20,7 @@ #include "RiaApplication.h" #include "RiaLogging.h" +#include "RiaPreferences.h" #include "RicResampleDialog.h" @@ -60,6 +61,8 @@ void RicAsciiExportSummaryPlotFeature::onActionTriggered( bool isChecked ) caf::SelectionManager::instance()->objectsByType( &selectedSummaryPlots ); QString defaultDir = defaultExportDir(); + RiaPreferences* prefs = RiaApplication::instance()->preferences(); + // Ask user about resampling auto result = RicResampleDialog::openDialog(); if ( !result.ok ) return; @@ -73,7 +76,10 @@ void RicAsciiExportSummaryPlotFeature::onActionTriggered( bool isChecked ) caf::ProgressInfo pi( selectedSummaryPlots.size(), QString( "Exporting plot data to ASCII" ) ); size_t progress = 0; - RicAsciiExportSummaryPlotFeature::exportAsciiForSummaryPlot( fileName, summaryPlot, result.period ); + RicAsciiExportSummaryPlotFeature::exportAsciiForSummaryPlot( fileName, + summaryPlot, + result.period, + prefs->showSummaryTimeAsLongString() ); progress++; pi.setProgress( progress ); @@ -98,7 +104,10 @@ void RicAsciiExportSummaryPlotFeature::onActionTriggered( bool isChecked ) for ( RimSummaryPlot* summaryPlot : selectedSummaryPlots ) { QString fileName = saveDir + "/" + caf::Utils::makeValidFileBasename( summaryPlot->description() ) + ".ascii"; - RicAsciiExportSummaryPlotFeature::exportAsciiForSummaryPlot( fileName, summaryPlot, result.period ); + RicAsciiExportSummaryPlotFeature::exportAsciiForSummaryPlot( fileName, + summaryPlot, + result.period, + prefs->showSummaryTimeAsLongString() ); progress++; pi.setProgress( progress ); } @@ -163,10 +172,11 @@ bool RicAsciiExportSummaryPlotFeature::exportTextToFile( const QString& fileName //-------------------------------------------------------------------------------------------------- bool RicAsciiExportSummaryPlotFeature::exportAsciiForSummaryPlot( const QString& fileName, const RimSummaryPlot* summaryPlot, - DateTimePeriod resamplingPeriod ) + DateTimePeriod resamplingPeriod, + bool showTimeAsLongString ) { QString text = summaryPlot->description(); - text.append( summaryPlot->asciiDataForPlotExport( resamplingPeriod ) ); + text.append( summaryPlot->asciiDataForPlotExport( resamplingPeriod, showTimeAsLongString ) ); text.append( "\n\n" ); return exportTextToFile( fileName, text ); diff --git a/ApplicationCode/Commands/SummaryPlotCommands/RicAsciiExportSummaryPlotFeature.h b/ApplicationCode/Commands/SummaryPlotCommands/RicAsciiExportSummaryPlotFeature.h index e1bd9f757b..14eae43e52 100644 --- a/ApplicationCode/Commands/SummaryPlotCommands/RicAsciiExportSummaryPlotFeature.h +++ b/ApplicationCode/Commands/SummaryPlotCommands/RicAsciiExportSummaryPlotFeature.h @@ -44,5 +44,6 @@ protected: private: static bool exportAsciiForSummaryPlot( const QString& fileName, const RimSummaryPlot* selectedSummaryPlots, - DateTimePeriod resamplingPeriod ); + DateTimePeriod resamplingPeriod, + bool showTimeAsLongString ); }; diff --git a/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlot.cpp b/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlot.cpp index 29f2c33ce9..af677dd272 100644 --- a/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlot.cpp +++ b/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlot.cpp @@ -132,7 +132,7 @@ void prepareCaseCurvesForExport( DateTimePeriod period, void appendToExportDataForCase( QString& out, const std::vector& timeSteps, const std::vector& curveData ); -void appendToExportData( QString& out, const std::vector& curvesData ); +void appendToExportData( QString& out, const std::vector& curvesData, bool showTimeAsLongString ); CurvesData concatCurvesData( const std::vector& curvesData ); //-------------------------------------------------------------------------------------------------- @@ -306,7 +306,7 @@ QWidget* RimSummaryPlot::viewWidget() //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -QString RimSummaryPlot::asciiDataForPlotExport( DateTimePeriod resamplingPeriod ) const +QString RimSummaryPlot::asciiDataForPlotExport( DateTimePeriod resamplingPeriod, bool showTimeAsLongString ) const { QString out; RiaTimeHistoryCurveResampler resampler; @@ -325,7 +325,7 @@ QString RimSummaryPlot::asciiDataForPlotExport( DateTimePeriod resamplingPeriod populateTimeHistoryCurvesData( m_gridTimeHistoryCurves.childObjects(), &timeHistoryCurvesData ); // Export observed data - appendToExportData( out, {summaryCurvesObsData} ); + appendToExportData( out, {summaryCurvesObsData}, showTimeAsLongString ); std::vector exportData( 2 ); @@ -339,7 +339,7 @@ QString RimSummaryPlot::asciiDataForPlotExport( DateTimePeriod resamplingPeriod prepareCaseCurvesForExport( resamplingPeriod, ResampleAlgorithm::PERIOD_END, timeHistoryCurvesData, &exportData[1] ); // Export resampled summary and time history data - appendToExportData( out, exportData ); + appendToExportData( out, exportData, showTimeAsLongString ); } // Pasted observed data @@ -347,7 +347,7 @@ QString RimSummaryPlot::asciiDataForPlotExport( DateTimePeriod resamplingPeriod CurvesData asciiCurvesData; populateAsciiDataCurvesData( m_asciiDataCurves.childObjects(), &asciiCurvesData ); - appendToExportData( out, {asciiCurvesData} ); + appendToExportData( out, {asciiCurvesData}, showTimeAsLongString ); } return out; @@ -2281,7 +2281,7 @@ void appendToExportDataForCase( QString& out, const std::vector& timeSte //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void appendToExportData( QString& out, const std::vector& curvesData ) +void appendToExportData( QString& out, const std::vector& curvesData, bool showTimeAsLongString ) { CurvesData data = concatCurvesData( curvesData ); @@ -2320,8 +2320,63 @@ void appendToExportData( QString& out, const std::vector& curvesData for ( auto timeStep : allTimeSteps ) { - QString tt = QDateTime::fromTime_t( timeStep ).toUTC().toString( "yyyy-MM-dd hh:mm:ss " ); - out += QDateTime::fromTime_t( timeStep ).toUTC().toString( "yyyy-MM-dd hh:mm:ss " ); + QDateTime timseStepUtc = QDateTime::fromTime_t( timeStep ).toUTC(); + QString timeText; + + if ( showTimeAsLongString ) + { + timeText = timseStepUtc.toString( "yyyy-MM-dd hh:mm:ss " ); + } + else + { + // Subtract one day to make sure the period is reported using the previous period as label + QDateTime oneDayEarlier = timseStepUtc.addDays( -1 ); + + QChar zeroChar( 48 ); + + switch ( data.resamplePeriod ) + { + default: + // Fall through to NONE + case DateTimePeriod::NONE: + timeText = timseStepUtc.toString( "yyyy-MM-dd hh:mm:ss " ); + break; + case DateTimePeriod::DAY: + timeText = oneDayEarlier.toString( "yyyy-MM-dd " ); + break; + case DateTimePeriod::WEEK: + { + timeText = oneDayEarlier.toString( "yyyy" ); + int weekNumber = oneDayEarlier.date().weekNumber(); + timeText += QString( "-W%1" ).arg( weekNumber, 2, 10, zeroChar ); + break; + } + case DateTimePeriod::MONTH: + timeText = oneDayEarlier.toString( "yyyy-MM" ); + break; + case DateTimePeriod::QUARTER: + { + int quarterNumber = oneDayEarlier.date().month() / 3; + timeText = oneDayEarlier.toString( "yyyy" ); + timeText += QString( "-Q%1" ).arg( quarterNumber ); + break; + } + case DateTimePeriod::HALFYEAR: + { + int halfYearNumber = oneDayEarlier.date().month() / 6; + timeText = oneDayEarlier.toString( "yyyy" ); + timeText += QString( "-H%1" ).arg( halfYearNumber ); + break; + } + case DateTimePeriod::YEAR: + timeText = oneDayEarlier.toString( "yyyy" ); + break; + case DateTimePeriod::DECADE: + timeText = oneDayEarlier.toString( "yyyy" ); + break; + } + } + out += timeText; for ( size_t i = 0; i < data.caseNames.size(); i++ ) // cases { diff --git a/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlot.h b/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlot.h index 252fab56f7..a26b6fcda6 100644 --- a/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlot.h +++ b/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlot.h @@ -115,7 +115,7 @@ public: QWidget* viewWidget() override; - QString asciiDataForPlotExport( DateTimePeriod resamplingPeriod = DateTimePeriod::NONE ) const; + QString asciiDataForPlotExport( DateTimePeriod resamplingPeriod, bool showTimeAsLongString ) const; std::vector summaryAndEnsembleCurves() const; std::set summaryAndEnsembleCurveDefinitions() const;