mirror of
https://github.com/OPM/ResInsight.git
synced 2025-01-01 03:37:15 -06:00
740 lines
28 KiB
C++
740 lines
28 KiB
C++
/////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Copyright (C) 2017 Statoil 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 "RimGridTimeHistoryCurve.h"
|
|
|
|
#include "RigCaseCellResultsData.h"
|
|
#include "RigEclipseCaseData.h"
|
|
#include "RigFemResultAddress.h"
|
|
#include "RigMainGrid.h"
|
|
#include "RigTimeHistoryResultAccessor.h"
|
|
|
|
#include "RimEclipseCase.h"
|
|
#include "RimEclipseCellColors.h"
|
|
#include "RimEclipseGeometrySelectionItem.h"
|
|
#include "RimEclipseResultDefinition.h"
|
|
#include "RimEclipseView.h"
|
|
#include "RimGeoMechCase.h"
|
|
#include "RimGeoMechGeometrySelectionItem.h"
|
|
#include "RimGeoMechResultDefinition.h"
|
|
#include "RimGeoMechView.h"
|
|
#include "RimProject.h"
|
|
#include "RimReservoirCellResultsStorage.h"
|
|
#include "RimSummaryPlot.h"
|
|
#include "RimSummaryTimeAxisProperties.h"
|
|
|
|
#include "Riu3dSelectionManager.h"
|
|
#include "RiuFemTimeHistoryResultAccessor.h"
|
|
#include "RiuQwtPlotCurve.h"
|
|
|
|
#include "SummaryPlotCommands/RicSummaryPlotFeatureImpl.h"
|
|
#include "qwt_plot.h"
|
|
|
|
CAF_PDM_SOURCE_INIT( RimGridTimeHistoryCurve, "GridTimeHistoryCurve" );
|
|
|
|
//--------------------------------------------------------------------------------------------------
|
|
///
|
|
//--------------------------------------------------------------------------------------------------
|
|
RimGridTimeHistoryCurve::RimGridTimeHistoryCurve()
|
|
{
|
|
CAF_PDM_InitObject( "Grid Time History Curve", ":/SummaryCurve16x16.png" );
|
|
|
|
CAF_PDM_InitFieldNoDefault( &m_geometrySelectionText, "GeometrySelectionText", "Cell Reference" );
|
|
m_geometrySelectionText.registerGetMethod( this, &RimGridTimeHistoryCurve::geometrySelectionText );
|
|
m_geometrySelectionText.uiCapability()->setUiReadOnly( true );
|
|
|
|
CAF_PDM_InitFieldNoDefault( &m_eclipseResultDefinition, "EclipseResultDefinition", "Eclipse Result Definition" );
|
|
m_eclipseResultDefinition.uiCapability()->setUiTreeChildrenHidden( true );
|
|
|
|
CAF_PDM_InitFieldNoDefault( &m_geoMechResultDefinition, "GeoMechResultDefinition", "GeoMech Result Definition" );
|
|
m_geoMechResultDefinition.uiCapability()->setUiTreeChildrenHidden( true );
|
|
|
|
CAF_PDM_InitFieldNoDefault( &m_geometrySelectionItem, "GeometrySelectionItem", "Geometry Selection" );
|
|
m_geometrySelectionItem.uiCapability()->setUiTreeChildrenHidden( true );
|
|
|
|
CAF_PDM_InitField( &m_plotAxis, "PlotAxis", caf::AppEnum<RiaDefines::PlotAxis>( RiaDefines::PlotAxis::PLOT_AXIS_LEFT ), "Axis" );
|
|
|
|
setDeletable( true );
|
|
}
|
|
|
|
//--------------------------------------------------------------------------------------------------
|
|
///
|
|
//--------------------------------------------------------------------------------------------------
|
|
RimGridTimeHistoryCurve::~RimGridTimeHistoryCurve()
|
|
{
|
|
}
|
|
|
|
//--------------------------------------------------------------------------------------------------
|
|
///
|
|
//--------------------------------------------------------------------------------------------------
|
|
void RimGridTimeHistoryCurve::setFromSelectionItem( const RiuSelectionItem* selectionItem )
|
|
{
|
|
if ( m_geometrySelectionItem() )
|
|
{
|
|
delete m_geometrySelectionItem();
|
|
}
|
|
|
|
if ( m_eclipseResultDefinition() )
|
|
{
|
|
delete m_eclipseResultDefinition();
|
|
}
|
|
|
|
if ( m_geoMechResultDefinition() )
|
|
{
|
|
delete m_geoMechResultDefinition();
|
|
}
|
|
|
|
const RiuEclipseSelectionItem* eclSelectionItem = dynamic_cast<const RiuEclipseSelectionItem*>( selectionItem );
|
|
if ( eclSelectionItem )
|
|
{
|
|
RimEclipseGeometrySelectionItem* geomSelectionItem = new RimEclipseGeometrySelectionItem;
|
|
m_geometrySelectionItem = geomSelectionItem;
|
|
|
|
geomSelectionItem->setFromSelectionItem( eclSelectionItem );
|
|
|
|
if ( eclSelectionItem->m_resultDefinition )
|
|
{
|
|
m_eclipseResultDefinition = new RimEclipseResultDefinition;
|
|
m_eclipseResultDefinition->simpleCopy( eclSelectionItem->m_resultDefinition );
|
|
}
|
|
}
|
|
|
|
const RiuGeoMechSelectionItem* geoMechSelectionItem = dynamic_cast<const RiuGeoMechSelectionItem*>( selectionItem );
|
|
if ( geoMechSelectionItem )
|
|
{
|
|
RimGeoMechGeometrySelectionItem* geomSelectionItem = new RimGeoMechGeometrySelectionItem;
|
|
m_geometrySelectionItem = geomSelectionItem;
|
|
|
|
geomSelectionItem->setFromSelectionItem( geoMechSelectionItem );
|
|
|
|
if ( geoMechSelectionItem->m_resultDefinition )
|
|
{
|
|
m_geoMechResultDefinition = new RimGeoMechResultDefinition;
|
|
m_geoMechResultDefinition->setGeoMechCase( geoMechSelectionItem->m_resultDefinition->geoMechCase() );
|
|
m_geoMechResultDefinition->setResultAddress( geoMechSelectionItem->m_resultDefinition->resultAddress() );
|
|
}
|
|
}
|
|
|
|
updateResultDefinitionFromCase();
|
|
}
|
|
|
|
//--------------------------------------------------------------------------------------------------
|
|
///
|
|
//--------------------------------------------------------------------------------------------------
|
|
void RimGridTimeHistoryCurve::setFromEclipseCellAndResult( RimEclipseCase* eclCase,
|
|
size_t gridIdx,
|
|
size_t i,
|
|
size_t j,
|
|
size_t k,
|
|
const RigEclipseResultAddress& resAddr )
|
|
{
|
|
delete m_geometrySelectionItem();
|
|
delete m_eclipseResultDefinition();
|
|
delete m_geoMechResultDefinition();
|
|
|
|
m_eclipseResultDefinition = new RimEclipseResultDefinition;
|
|
m_eclipseResultDefinition->setEclipseCase( eclCase );
|
|
m_eclipseResultDefinition->setFromEclipseResultAddress( resAddr );
|
|
|
|
RimEclipseGeometrySelectionItem* geomSelectionItem = new RimEclipseGeometrySelectionItem;
|
|
m_geometrySelectionItem = geomSelectionItem;
|
|
geomSelectionItem->setFromCaseGridAndIJK( eclCase, gridIdx, i, j, k );
|
|
}
|
|
|
|
//--------------------------------------------------------------------------------------------------
|
|
///
|
|
//--------------------------------------------------------------------------------------------------
|
|
RigGridCellResultAddress RimGridTimeHistoryCurve::resultAddress()
|
|
{
|
|
RimEclipseGeometrySelectionItem* eclipseGeomSelectionItem =
|
|
dynamic_cast<RimEclipseGeometrySelectionItem*>( m_geometrySelectionItem.value() );
|
|
|
|
if ( m_eclipseResultDefinition && eclipseGeomSelectionItem )
|
|
{
|
|
cvf::Vec3st IJK = eclipseGeomSelectionItem->cellIJK();
|
|
|
|
return RigGridCellResultAddress( eclipseGeomSelectionItem->gridIndex(),
|
|
IJK[0],
|
|
IJK[1],
|
|
IJK[2],
|
|
m_eclipseResultDefinition->eclipseResultAddress() );
|
|
}
|
|
|
|
// Todo: support geomech stuff
|
|
|
|
return RigGridCellResultAddress();
|
|
}
|
|
|
|
//--------------------------------------------------------------------------------------------------
|
|
///
|
|
//--------------------------------------------------------------------------------------------------
|
|
RiuPlotAxis RimGridTimeHistoryCurve::yAxis() const
|
|
{
|
|
return RiuPlotAxis( m_plotAxis() );
|
|
}
|
|
|
|
//--------------------------------------------------------------------------------------------------
|
|
///
|
|
//--------------------------------------------------------------------------------------------------
|
|
void RimGridTimeHistoryCurve::setYAxis( RiaDefines::PlotAxis plotAxis )
|
|
{
|
|
m_plotAxis = plotAxis;
|
|
|
|
updateQwtPlotAxis();
|
|
}
|
|
|
|
//--------------------------------------------------------------------------------------------------
|
|
///
|
|
//--------------------------------------------------------------------------------------------------
|
|
std::vector<double> RimGridTimeHistoryCurve::yValues() const
|
|
{
|
|
std::vector<double> values;
|
|
|
|
RimEclipseGeometrySelectionItem* eclTopItem = eclipseGeomSelectionItem();
|
|
if ( eclTopItem && eclTopItem->eclipseCase() )
|
|
{
|
|
size_t cellIndex = eclTopItem->cellIndex();
|
|
size_t gridIndex = eclTopItem->gridIndex();
|
|
|
|
CVF_ASSERT( m_eclipseResultDefinition() );
|
|
m_eclipseResultDefinition->loadResult();
|
|
|
|
RigCaseCellResultsData* cellResultsData = m_eclipseResultDefinition->currentGridCellResults();
|
|
|
|
if ( cellResultsData )
|
|
{
|
|
std::vector<QDateTime> timeStepDates = cellResultsData->timeStepDates();
|
|
|
|
values = RigTimeHistoryResultAccessor::timeHistoryValues( eclTopItem->eclipseCase()->eclipseCaseData(),
|
|
m_eclipseResultDefinition(),
|
|
gridIndex,
|
|
cellIndex,
|
|
timeStepDates.size() );
|
|
}
|
|
}
|
|
|
|
if ( geoMechGeomSelectionItem() && geoMechGeomSelectionItem()->geoMechCase() )
|
|
{
|
|
std::unique_ptr<RiuFemTimeHistoryResultAccessor> timeHistResultAccessor = femTimeHistoryResultAccessor();
|
|
|
|
if ( timeHistResultAccessor )
|
|
{
|
|
values = timeHistResultAccessor->timeHistoryValues();
|
|
}
|
|
}
|
|
|
|
auto plot = firstAncestorOrThisOfTypeAsserted<RimSummaryPlot>();
|
|
bool isNormalized = plot->isNormalizationEnabled();
|
|
if ( isNormalized )
|
|
{
|
|
auto minMaxPair = std::minmax_element( values.begin(), values.end() );
|
|
double min = *minMaxPair.first;
|
|
double max = *minMaxPair.second;
|
|
double range = max - min;
|
|
|
|
for ( double& v : values )
|
|
{
|
|
v = ( v - min ) / range;
|
|
}
|
|
}
|
|
|
|
return values;
|
|
}
|
|
|
|
//--------------------------------------------------------------------------------------------------
|
|
///
|
|
//--------------------------------------------------------------------------------------------------
|
|
QString RimGridTimeHistoryCurve::quantityName() const
|
|
{
|
|
RimEclipseGeometrySelectionItem* eclTopItem = eclipseGeomSelectionItem();
|
|
if ( eclTopItem )
|
|
{
|
|
CVF_ASSERT( m_eclipseResultDefinition() );
|
|
|
|
return m_eclipseResultDefinition->resultVariableUiName();
|
|
}
|
|
|
|
if ( geoMechGeomSelectionItem() )
|
|
{
|
|
CVF_ASSERT( m_geoMechResultDefinition() );
|
|
|
|
RimGeoMechGeometrySelectionItem* geoMechTopItem = geoMechGeomSelectionItem();
|
|
std::unique_ptr<RiuFemTimeHistoryResultAccessor> timeHistResultAccessor = femTimeHistoryResultAccessor();
|
|
|
|
QString text;
|
|
|
|
caf::AppEnum<RigFemResultPosEnum> resPosAppEnum = m_geoMechResultDefinition()->resultPositionType();
|
|
text.append( resPosAppEnum.uiText() + ", " );
|
|
text.append( m_geoMechResultDefinition()->resultFieldUiName() + ", " );
|
|
text.append( m_geoMechResultDefinition()->resultComponentUiName() + " " );
|
|
|
|
if ( resPosAppEnum == RIG_ELEMENT_NODAL_FACE )
|
|
{
|
|
if ( geoMechTopItem->m_elementFace >= 0 )
|
|
{
|
|
text.append( ", " + caf::AppEnum<cvf::StructGridInterface::FaceType>::textFromIndex( geoMechTopItem->m_elementFace ) );
|
|
}
|
|
else
|
|
{
|
|
text.append( ", from N[" + QString::number( timeHistResultAccessor->closestNodeId() ) + "] transformed onto intersection" );
|
|
}
|
|
}
|
|
|
|
return text;
|
|
}
|
|
|
|
return "";
|
|
}
|
|
|
|
//--------------------------------------------------------------------------------------------------
|
|
///
|
|
//--------------------------------------------------------------------------------------------------
|
|
QString RimGridTimeHistoryCurve::caseName() const
|
|
{
|
|
RimEclipseGeometrySelectionItem* eclTopItem = eclipseGeomSelectionItem();
|
|
if ( eclTopItem && eclTopItem->eclipseCase() )
|
|
{
|
|
return eclTopItem->eclipseCase()->caseUserDescription();
|
|
}
|
|
|
|
RimGeoMechGeometrySelectionItem* geoMechTopItem = geoMechGeomSelectionItem();
|
|
if ( geoMechTopItem && geoMechTopItem->geoMechCase() )
|
|
{
|
|
return geoMechTopItem->geoMechCase()->caseUserDescription();
|
|
}
|
|
|
|
return "";
|
|
}
|
|
|
|
//--------------------------------------------------------------------------------------------------
|
|
///
|
|
//--------------------------------------------------------------------------------------------------
|
|
RimCase* RimGridTimeHistoryCurve::gridCase() const
|
|
{
|
|
RimEclipseGeometrySelectionItem* eclTopItem = eclipseGeomSelectionItem();
|
|
if ( eclTopItem && eclTopItem->eclipseCase() )
|
|
{
|
|
return eclTopItem->eclipseCase();
|
|
}
|
|
|
|
RimGeoMechGeometrySelectionItem* geoMechTopItem = geoMechGeomSelectionItem();
|
|
if ( geoMechTopItem && geoMechTopItem->geoMechCase() )
|
|
{
|
|
return geoMechTopItem->geoMechCase();
|
|
}
|
|
|
|
return nullptr;
|
|
}
|
|
|
|
//--------------------------------------------------------------------------------------------------
|
|
///
|
|
//--------------------------------------------------------------------------------------------------
|
|
QString RimGridTimeHistoryCurve::createCurveAutoName()
|
|
{
|
|
QString text;
|
|
|
|
text += quantityName();
|
|
|
|
QString topoText = geometrySelectionText();
|
|
|
|
if ( !topoText.isEmpty() )
|
|
{
|
|
text += ", ";
|
|
text += topoText;
|
|
}
|
|
|
|
return text;
|
|
}
|
|
|
|
//--------------------------------------------------------------------------------------------------
|
|
///
|
|
//--------------------------------------------------------------------------------------------------
|
|
void RimGridTimeHistoryCurve::updateZoomInParentPlot()
|
|
{
|
|
auto plot = firstAncestorOrThisOfType<RimSummaryPlot>();
|
|
|
|
plot->updateZoomInParentPlot();
|
|
}
|
|
|
|
//--------------------------------------------------------------------------------------------------
|
|
///
|
|
//--------------------------------------------------------------------------------------------------
|
|
void RimGridTimeHistoryCurve::onLoadDataAndUpdate( bool updateParentPlot )
|
|
{
|
|
RimPlotCurve::updateCurvePresentation( updateParentPlot );
|
|
|
|
if ( isChecked() && m_plotCurve )
|
|
{
|
|
std::vector<double> values;
|
|
|
|
RimEclipseGeometrySelectionItem* eclTopItem = eclipseGeomSelectionItem();
|
|
if ( eclTopItem && eclTopItem->eclipseCase() )
|
|
{
|
|
m_eclipseResultDefinition->loadResult();
|
|
}
|
|
|
|
RimGeoMechGeometrySelectionItem* geoMechTopItem = geoMechGeomSelectionItem();
|
|
if ( geoMechTopItem && geoMechTopItem->geoMechCase() )
|
|
{
|
|
m_geoMechResultDefinition->loadResult();
|
|
}
|
|
|
|
values = yValues();
|
|
|
|
auto plot = firstAncestorOrThisOfType<RimSummaryPlot>();
|
|
bool useLogarithmicScale = plot->isLogarithmicScaleEnabled( yAxis() );
|
|
|
|
if ( plot->timeAxisProperties()->timeMode() == RimSummaryTimeAxisProperties::DATE )
|
|
{
|
|
std::vector<time_t> dateTimes = timeStepValues();
|
|
if ( !dateTimes.empty() && dateTimes.size() == values.size() )
|
|
{
|
|
m_plotCurve->setSamplesFromTimeTAndYValues( dateTimes, values, useLogarithmicScale );
|
|
}
|
|
else
|
|
{
|
|
m_plotCurve->setSamplesFromTimeTAndYValues( std::vector<time_t>(), std::vector<double>(), useLogarithmicScale );
|
|
}
|
|
}
|
|
else
|
|
{
|
|
std::vector<double> days = daysSinceSimulationStart();
|
|
if ( !days.empty() && days.size() == values.size() )
|
|
{
|
|
double timeScale = plot->timeAxisProperties()->fromDaysToDisplayUnitScale();
|
|
|
|
std::vector<double> times;
|
|
for ( double day : days )
|
|
{
|
|
times.push_back( timeScale * day );
|
|
}
|
|
|
|
m_plotCurve->setSamplesFromXValuesAndYValues( times, values, useLogarithmicScale );
|
|
}
|
|
else
|
|
{
|
|
m_plotCurve->setSamplesFromTimeTAndYValues( std::vector<time_t>(), std::vector<double>(), useLogarithmicScale );
|
|
}
|
|
}
|
|
|
|
updateZoomInParentPlot();
|
|
|
|
if ( m_parentPlot ) m_parentPlot->replot();
|
|
|
|
updateQwtPlotAxis();
|
|
plot->updateAxes();
|
|
}
|
|
}
|
|
|
|
//--------------------------------------------------------------------------------------------------
|
|
///
|
|
//--------------------------------------------------------------------------------------------------
|
|
std::vector<time_t> RimGridTimeHistoryCurve::timeStepValues() const
|
|
{
|
|
std::vector<time_t> dateTimes;
|
|
|
|
RimEclipseGeometrySelectionItem* eclTopItem = eclipseGeomSelectionItem();
|
|
if ( eclTopItem && eclTopItem->eclipseCase() )
|
|
{
|
|
RigCaseCellResultsData* cellResultsData = m_eclipseResultDefinition->currentGridCellResults();
|
|
|
|
if ( cellResultsData )
|
|
{
|
|
std::vector<QDateTime> timeStepDates = cellResultsData->timeStepDates();
|
|
|
|
for ( QDateTime dt : timeStepDates )
|
|
{
|
|
dateTimes.push_back( dt.toSecsSinceEpoch() );
|
|
}
|
|
}
|
|
}
|
|
|
|
RimGeoMechGeometrySelectionItem* geoMechTopItem = geoMechGeomSelectionItem();
|
|
if ( geoMechTopItem && geoMechTopItem->geoMechCase() )
|
|
{
|
|
std::unique_ptr<RiuFemTimeHistoryResultAccessor> timeHistResultAccessor = femTimeHistoryResultAccessor();
|
|
if ( timeHistResultAccessor )
|
|
{
|
|
std::vector<double> values = timeHistResultAccessor->timeHistoryValues();
|
|
|
|
std::vector<QDateTime> dates = geoMechTopItem->geoMechCase()->timeStepDates();
|
|
if ( dates.size() == values.size() )
|
|
{
|
|
for ( QDateTime dt : dates )
|
|
{
|
|
dateTimes.push_back( dt.toSecsSinceEpoch() );
|
|
}
|
|
}
|
|
else
|
|
{
|
|
for ( size_t i = 0; i < values.size(); i++ )
|
|
{
|
|
dateTimes.push_back( i );
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return dateTimes;
|
|
}
|
|
|
|
//--------------------------------------------------------------------------------------------------
|
|
///
|
|
//--------------------------------------------------------------------------------------------------
|
|
std::vector<double> RimGridTimeHistoryCurve::daysSinceSimulationStart() const
|
|
{
|
|
std::vector<double> daysSinceSimulationStart;
|
|
RimEclipseGeometrySelectionItem* eclTopItem = eclipseGeomSelectionItem();
|
|
if ( eclTopItem && eclTopItem->eclipseCase() )
|
|
{
|
|
RigCaseCellResultsData* cellResultsData = m_eclipseResultDefinition->currentGridCellResults();
|
|
|
|
if ( cellResultsData )
|
|
{
|
|
daysSinceSimulationStart = cellResultsData->daysSinceSimulationStart();
|
|
}
|
|
}
|
|
|
|
RimGeoMechGeometrySelectionItem* geoMechTopItem = geoMechGeomSelectionItem();
|
|
if ( geoMechTopItem && geoMechTopItem->geoMechCase() )
|
|
{
|
|
std::unique_ptr<RiuFemTimeHistoryResultAccessor> timeHistResultAccessor = femTimeHistoryResultAccessor();
|
|
if ( timeHistResultAccessor )
|
|
{
|
|
std::vector<double> values = timeHistResultAccessor->timeHistoryValues();
|
|
|
|
std::vector<QDateTime> dates = geoMechTopItem->geoMechCase()->timeStepDates();
|
|
if ( dates.size() == values.size() )
|
|
{
|
|
if ( !dates.empty() )
|
|
{
|
|
time_t startDate = dates[0].toSecsSinceEpoch();
|
|
double secondsToDaysConversion = ( 24.0 * 60.0 * 60.0 );
|
|
for ( QDateTime dt : dates )
|
|
{
|
|
double timeDifference = static_cast<double>( dt.toSecsSinceEpoch() - startDate );
|
|
daysSinceSimulationStart.push_back( timeDifference / secondsToDaysConversion );
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
for ( size_t i = 0; i < values.size(); i++ )
|
|
{
|
|
daysSinceSimulationStart.push_back( i );
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return daysSinceSimulationStart;
|
|
}
|
|
|
|
//--------------------------------------------------------------------------------------------------
|
|
///
|
|
//--------------------------------------------------------------------------------------------------
|
|
void RimGridTimeHistoryCurve::defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering )
|
|
{
|
|
RimPlotCurve::updateFieldUiState();
|
|
|
|
uiOrdering.add( &m_geometrySelectionText );
|
|
|
|
// Fields declared in RimResultDefinition
|
|
caf::PdmUiGroup* group1 = uiOrdering.addNewGroup( "Result" );
|
|
if ( eclipseGeomSelectionItem() )
|
|
{
|
|
CVF_ASSERT( m_eclipseResultDefinition() );
|
|
m_eclipseResultDefinition->uiOrdering( uiConfigName, *group1 );
|
|
}
|
|
|
|
if ( geoMechGeomSelectionItem() )
|
|
{
|
|
CVF_ASSERT( m_geoMechResultDefinition() );
|
|
m_geoMechResultDefinition->uiOrdering( uiConfigName, *group1 );
|
|
}
|
|
|
|
uiOrdering.add( &m_plotAxis );
|
|
|
|
caf::PdmUiGroup* appearanceGroup = uiOrdering.addNewGroup( "Appearance" );
|
|
RimPlotCurve::appearanceUiOrdering( *appearanceGroup );
|
|
|
|
caf::PdmUiGroup* nameGroup = uiOrdering.addNewGroup( "Curve Name" );
|
|
nameGroup->setCollapsedByDefault();
|
|
nameGroup->add( &m_showLegend );
|
|
RimPlotCurve::curveNameUiOrdering( *nameGroup );
|
|
}
|
|
|
|
//--------------------------------------------------------------------------------------------------
|
|
///
|
|
//--------------------------------------------------------------------------------------------------
|
|
void RimGridTimeHistoryCurve::initAfterRead()
|
|
{
|
|
RimPlotCurve::initAfterRead();
|
|
|
|
updateResultDefinitionFromCase();
|
|
}
|
|
|
|
//--------------------------------------------------------------------------------------------------
|
|
///
|
|
//--------------------------------------------------------------------------------------------------
|
|
void RimGridTimeHistoryCurve::fieldChangedByUi( const caf::PdmFieldHandle* changedField, const QVariant& oldValue, const QVariant& newValue )
|
|
{
|
|
if ( changedField == &m_plotAxis )
|
|
{
|
|
updateQwtPlotAxis();
|
|
|
|
auto plot = firstAncestorOrThisOfTypeAsserted<RimSummaryPlot>();
|
|
|
|
plot->updateAxes();
|
|
}
|
|
else
|
|
{
|
|
RimPlotCurve::fieldChangedByUi( changedField, oldValue, newValue );
|
|
}
|
|
}
|
|
|
|
//--------------------------------------------------------------------------------------------------
|
|
///
|
|
//--------------------------------------------------------------------------------------------------
|
|
RigMainGrid* RimGridTimeHistoryCurve::mainGrid()
|
|
{
|
|
if ( eclipseGeomSelectionItem() && eclipseGeomSelectionItem()->eclipseCase() &&
|
|
eclipseGeomSelectionItem()->eclipseCase()->eclipseCaseData() )
|
|
{
|
|
return eclipseGeomSelectionItem()->eclipseCase()->eclipseCaseData()->mainGrid();
|
|
}
|
|
|
|
return nullptr;
|
|
}
|
|
|
|
//--------------------------------------------------------------------------------------------------
|
|
///
|
|
//--------------------------------------------------------------------------------------------------
|
|
RimEclipseGeometrySelectionItem* RimGridTimeHistoryCurve::eclipseGeomSelectionItem() const
|
|
{
|
|
RimGeometrySelectionItem* pickItem = m_geometrySelectionItem();
|
|
|
|
return dynamic_cast<RimEclipseGeometrySelectionItem*>( pickItem );
|
|
}
|
|
|
|
//--------------------------------------------------------------------------------------------------
|
|
///
|
|
//--------------------------------------------------------------------------------------------------
|
|
RimGeoMechGeometrySelectionItem* RimGridTimeHistoryCurve::geoMechGeomSelectionItem() const
|
|
{
|
|
RimGeometrySelectionItem* pickItem = m_geometrySelectionItem();
|
|
|
|
return dynamic_cast<RimGeoMechGeometrySelectionItem*>( pickItem );
|
|
}
|
|
|
|
//--------------------------------------------------------------------------------------------------
|
|
///
|
|
//--------------------------------------------------------------------------------------------------
|
|
void RimGridTimeHistoryCurve::updateResultDefinitionFromCase()
|
|
{
|
|
if ( eclipseGeomSelectionItem() )
|
|
{
|
|
CVF_ASSERT( m_eclipseResultDefinition() );
|
|
|
|
m_eclipseResultDefinition->setEclipseCase( eclipseGeomSelectionItem()->eclipseCase() );
|
|
}
|
|
|
|
if ( geoMechGeomSelectionItem() )
|
|
{
|
|
CVF_ASSERT( m_geoMechResultDefinition() );
|
|
|
|
m_geoMechResultDefinition->setGeoMechCase( geoMechGeomSelectionItem()->geoMechCase() );
|
|
}
|
|
}
|
|
|
|
//--------------------------------------------------------------------------------------------------
|
|
///
|
|
//--------------------------------------------------------------------------------------------------
|
|
QString RimGridTimeHistoryCurve::geometrySelectionText() const
|
|
{
|
|
QString text;
|
|
|
|
if ( eclipseGeomSelectionItem() && m_geometrySelectionItem() )
|
|
{
|
|
text = m_geometrySelectionItem->geometrySelectionText();
|
|
}
|
|
else if ( geoMechGeomSelectionItem() )
|
|
{
|
|
std::unique_ptr<RiuFemTimeHistoryResultAccessor> timeHistResultAccessor = femTimeHistoryResultAccessor();
|
|
if ( timeHistResultAccessor )
|
|
{
|
|
text = timeHistResultAccessor->geometrySelectionText();
|
|
}
|
|
}
|
|
else
|
|
{
|
|
text = "No Geometry";
|
|
}
|
|
|
|
return text;
|
|
}
|
|
|
|
//--------------------------------------------------------------------------------------------------
|
|
///
|
|
//--------------------------------------------------------------------------------------------------
|
|
void RimGridTimeHistoryCurve::updateQwtPlotAxis()
|
|
{
|
|
if ( m_plotCurve ) updateYAxisInPlot( yAxis() );
|
|
}
|
|
|
|
//--------------------------------------------------------------------------------------------------
|
|
///
|
|
//--------------------------------------------------------------------------------------------------
|
|
std::unique_ptr<RiuFemTimeHistoryResultAccessor> RimGridTimeHistoryCurve::femTimeHistoryResultAccessor() const
|
|
{
|
|
std::unique_ptr<RiuFemTimeHistoryResultAccessor> timeHistResultAccessor;
|
|
|
|
if ( geoMechGeomSelectionItem() && geoMechGeomSelectionItem()->geoMechCase() && geoMechGeomSelectionItem()->geoMechCase()->geoMechData() )
|
|
{
|
|
RimGeoMechGeometrySelectionItem* geoMechTopItem = geoMechGeomSelectionItem();
|
|
if ( geoMechTopItem->m_hasIntersectionTriangle )
|
|
{
|
|
std::array<cvf::Vec3f, 3> intersectionTriangle;
|
|
intersectionTriangle[0] = cvf::Vec3f( geoMechTopItem->m_intersectionTriangle_0() );
|
|
intersectionTriangle[1] = cvf::Vec3f( geoMechTopItem->m_intersectionTriangle_1() );
|
|
intersectionTriangle[2] = cvf::Vec3f( geoMechTopItem->m_intersectionTriangle_2() );
|
|
|
|
timeHistResultAccessor = std::unique_ptr<RiuFemTimeHistoryResultAccessor>(
|
|
new RiuFemTimeHistoryResultAccessor( geoMechTopItem->geoMechCase()->geoMechData(),
|
|
m_geoMechResultDefinition()->resultAddress(),
|
|
geoMechTopItem->m_gridIndex,
|
|
static_cast<int>( geoMechTopItem->m_cellIndex ),
|
|
geoMechTopItem->m_elementFace,
|
|
geoMechTopItem->m_localIntersectionPoint,
|
|
intersectionTriangle ) );
|
|
}
|
|
else
|
|
{
|
|
timeHistResultAccessor = std::unique_ptr<RiuFemTimeHistoryResultAccessor>(
|
|
new RiuFemTimeHistoryResultAccessor( geoMechTopItem->geoMechCase()->geoMechData(),
|
|
m_geoMechResultDefinition()->resultAddress(),
|
|
geoMechTopItem->m_gridIndex,
|
|
static_cast<int>( geoMechTopItem->m_cellIndex ),
|
|
geoMechTopItem->m_elementFace,
|
|
geoMechTopItem->m_localIntersectionPoint ) );
|
|
}
|
|
}
|
|
|
|
return timeHistResultAccessor;
|
|
}
|