From f16228ecc5d331fe9c0beea27302eda4c7fca2c0 Mon Sep 17 00:00:00 2001 From: Magne Sjaastad Date: Wed, 11 Jan 2017 15:03:39 +0100 Subject: [PATCH] #1056 Added support for flow data for cell edge in 3D view --- .../RivCellEdgeGeometryUtils.cpp | 20 ++- .../ProjectDataModel/RimCellEdgeColors.cpp | 19 ++- .../ProjectDataModel/RimCellEdgeColors.h | 4 +- .../ProjectDataModel/RimEclipseCellColors.cpp | 107 ++++++++++++++++ .../ProjectDataModel/RimEclipseCellColors.h | 1 + .../ProjectDataModel/RimEclipseView.cpp | 121 ++++-------------- 6 files changed, 164 insertions(+), 108 deletions(-) diff --git a/ApplicationCode/ModelVisualization/RivCellEdgeGeometryUtils.cpp b/ApplicationCode/ModelVisualization/RivCellEdgeGeometryUtils.cpp index 5b3306d5d9..054d318df0 100644 --- a/ApplicationCode/ModelVisualization/RivCellEdgeGeometryUtils.cpp +++ b/ApplicationCode/ModelVisualization/RivCellEdgeGeometryUtils.cpp @@ -298,10 +298,22 @@ cvf::ref RivCellEdgeGeometryUtils::createCellEdgeResultAccess const RigGridBase* grid) { cvf::ref cellEdgeResultAccessor = new RigCellEdgeResultAccessor(); + + RifReaderInterface::PorosityModelResultType porosityModel = RigCaseCellResultsData::convertFromProjectModelPorosityModel(cellResultColors->porosityModel()); + + if (cellEdgeResultColors->propertyType() == RimCellEdgeColors::ANY_SINGLE_PROPERTY) + { + cvf::ref daObj = RivCellEdgeGeometryUtils::createCellCenterResultAccessor(cellEdgeResultColors->singleVarEdgeResultColors(), timeStepIndex, eclipseCase, grid); + + for (size_t cubeFaceIdx = 0; cubeFaceIdx < 6; cubeFaceIdx++) + { + cellEdgeResultAccessor->setDataAccessObjectForFace(static_cast(cubeFaceIdx), daObj.p()); + } + } + else { size_t resultIndices[6]; cellEdgeResultColors->gridScalarIndices(resultIndices); - RifReaderInterface::PorosityModelResultType porosityModel = RigCaseCellResultsData::convertFromProjectModelPorosityModel(cellResultColors->porosityModel()); std::vector metaData; cellEdgeResultColors->cellEdgeMetaData(&metaData); @@ -343,9 +355,3 @@ cvf::ref RivCellEdgeGeometryUtils::createCellCenterResultAcce return resultAccessor; } - - - - - - diff --git a/ApplicationCode/ProjectDataModel/RimCellEdgeColors.cpp b/ApplicationCode/ProjectDataModel/RimCellEdgeColors.cpp index fa1281a4b5..d1b457d4df 100644 --- a/ApplicationCode/ProjectDataModel/RimCellEdgeColors.cpp +++ b/ApplicationCode/ProjectDataModel/RimCellEdgeColors.cpp @@ -102,9 +102,9 @@ void RimCellEdgeColors::loadResult() if (isUsingSingleVariable()) { - size_t resultindex = m_reservoirView->currentGridCellResults()->findOrLoadScalarResult(m_singleVarEdgeResultColors->resultType(), - m_singleVarEdgeResultColors->resultVariable()); - + m_singleVarEdgeResultColors->loadResult();; + + size_t resultindex = m_singleVarEdgeResultColors->scalarResultIndex(); for (int cubeFaceIdx = 0; cubeFaceIdx < 6; ++cubeFaceIdx) { m_resultNameToIndexPairs[cubeFaceIdx] = std::make_pair(m_singleVarEdgeResultColors->resultVariable(), resultindex); @@ -397,6 +397,11 @@ bool RimCellEdgeColors::hasResult() const { if (!enableCellEdgeColors()) return false; + if (isUsingSingleVariable() && m_singleVarEdgeResultColors->resultType() == RimDefines::FLOW_DIAGNOSTICS) + { + return true; + } + bool hasResult = false; int cubeFaceIndex; for (cubeFaceIndex = 0; cubeFaceIndex < 6; ++cubeFaceIndex) @@ -549,3 +554,11 @@ RimLegendConfig* RimCellEdgeColors::legendConfig() } } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimCellEdgeColors::PropertyType RimCellEdgeColors::propertyType() const +{ + return m_propertyType(); +} + diff --git a/ApplicationCode/ProjectDataModel/RimCellEdgeColors.h b/ApplicationCode/ProjectDataModel/RimCellEdgeColors.h index 7cd10ee7f8..ac97c486fc 100644 --- a/ApplicationCode/ProjectDataModel/RimCellEdgeColors.h +++ b/ApplicationCode/ProjectDataModel/RimCellEdgeColors.h @@ -83,8 +83,11 @@ public: void loadResult(); bool hasResult() const; bool hasCategoryResult() const; + bool isUsingSingleVariable() const; + RimEclipseCellColors* singleVarEdgeResultColors(); RimLegendConfig* legendConfig(); + PropertyType propertyType() const; void minMaxCellEdgeValues(double& min, double& max); void posNegClosestToZero(double& pos, double& neg); @@ -115,7 +118,6 @@ private: caf::PdmPointer m_reservoirView; double m_ignoredResultScalar; - bool isUsingSingleVariable() const; caf::PdmField > m_propertyType; caf::PdmChildField m_legendConfig; diff --git a/ApplicationCode/ProjectDataModel/RimEclipseCellColors.cpp b/ApplicationCode/ProjectDataModel/RimEclipseCellColors.cpp index 827bd2be61..f861d5d880 100644 --- a/ApplicationCode/ProjectDataModel/RimEclipseCellColors.cpp +++ b/ApplicationCode/ProjectDataModel/RimEclipseCellColors.cpp @@ -20,7 +20,13 @@ #include "RimEclipseCellColors.h" +#include "RigCaseCellResultsData.h" +#include "RigEclipseCaseData.h" +#include "RigFlowDiagResults.h" +#include "RigFormationNames.h" + #include "RimCellEdgeColors.h" +#include "RimEclipseCase.h" #include "RimEclipseFaultColors.h" #include "RimEclipseView.h" #include "RimLegendConfig.h" @@ -234,6 +240,107 @@ RimEclipseView* RimEclipseCellColors::reservoirView() return m_reservoirView; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimEclipseCellColors::updateLegendData(size_t currentTimeStep) +{ + if (this->resultType() == RimDefines::FLOW_DIAGNOSTICS) + { + double globalMin, globalMax; + double globalPosClosestToZero, globalNegClosestToZero; + RigFlowDiagResults* flowResultsData = this->flowDiagSolution()->flowDiagResults(); + RigFlowDiagResultAddress resAddr = this->flowDiagResAddress(); + + int integerTimeStep = static_cast(currentTimeStep); + + flowResultsData->minMaxScalarValues(resAddr, integerTimeStep, &globalMin, &globalMax); + flowResultsData->posNegClosestToZero(resAddr, integerTimeStep, &globalPosClosestToZero, &globalNegClosestToZero); + + double localMin, localMax; + double localPosClosestToZero, localNegClosestToZero; + if (this->hasDynamicResult()) + { + flowResultsData->minMaxScalarValues(resAddr, integerTimeStep, &localMin, &localMax); + flowResultsData->posNegClosestToZero(resAddr, integerTimeStep, &localPosClosestToZero, &localNegClosestToZero); + } + else + { + localMin = globalMin; + localMax = globalMax; + + localPosClosestToZero = globalPosClosestToZero; + localNegClosestToZero = globalNegClosestToZero; + } + + CVF_ASSERT(this->legendConfig()); + + this->legendConfig()->disableAllTimeStepsRange(true); + this->legendConfig()->setClosestToZeroValues(globalPosClosestToZero, globalNegClosestToZero, localPosClosestToZero, localNegClosestToZero); + this->legendConfig()->setAutomaticRanges(globalMin, globalMax, localMin, localMax); + + if (this->hasCategoryResult()) + { + this->legendConfig()->setNamedCategories(this->flowDiagSolution()->tracerNames()); + } + } + else + { + RimEclipseCase* rimEclipseCase = nullptr; + this->firstAncestorOrThisOfType(rimEclipseCase); + CVF_ASSERT(rimEclipseCase); + if (!rimEclipseCase) return; + + RigEclipseCaseData* eclipseCase = rimEclipseCase->reservoirData(); + CVF_ASSERT(eclipseCase); + if (!eclipseCase) return; + + RifReaderInterface::PorosityModelResultType porosityModel = RigCaseCellResultsData::convertFromProjectModelPorosityModel(this->porosityModel()); + RigCaseCellResultsData* cellResultsData = eclipseCase->results(porosityModel); + CVF_ASSERT(cellResultsData); + + double globalMin, globalMax; + double globalPosClosestToZero, globalNegClosestToZero; + cellResultsData->minMaxCellScalarValues(this->scalarResultIndex(), globalMin, globalMax); + cellResultsData->posNegClosestToZero(this->scalarResultIndex(), globalPosClosestToZero, globalNegClosestToZero); + + double localMin, localMax; + double localPosClosestToZero, localNegClosestToZero; + if (this->hasDynamicResult()) + { + cellResultsData->minMaxCellScalarValues(this->scalarResultIndex(), currentTimeStep, localMin, localMax); + cellResultsData->posNegClosestToZero(this->scalarResultIndex(), currentTimeStep, localPosClosestToZero, localNegClosestToZero); + } + else + { + localMin = globalMin; + localMax = globalMax; + + localPosClosestToZero = globalPosClosestToZero; + localNegClosestToZero = globalNegClosestToZero; + } + + CVF_ASSERT(this->legendConfig()); + + this->legendConfig()->disableAllTimeStepsRange(false); + this->legendConfig()->setClosestToZeroValues(globalPosClosestToZero, globalNegClosestToZero, localPosClosestToZero, localNegClosestToZero); + this->legendConfig()->setAutomaticRanges(globalMin, globalMax, localMin, localMax); + + if (this->hasCategoryResult()) + { + if (this->resultType() != RimDefines::FORMATION_NAMES) + { + this->legendConfig()->setIntegerCategories(cellResultsData->uniqueCellScalarValues(this->scalarResultIndex())); + } + else + { + const std::vector& fnVector = eclipseCase->activeFormationNames()->formationNames(); + this->legendConfig()->setNamedCategoriesInverse(fnVector); + } + } + } +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationCode/ProjectDataModel/RimEclipseCellColors.h b/ApplicationCode/ProjectDataModel/RimEclipseCellColors.h index afce58e7b5..7139fd63a0 100644 --- a/ApplicationCode/ProjectDataModel/RimEclipseCellColors.h +++ b/ApplicationCode/ProjectDataModel/RimEclipseCellColors.h @@ -44,6 +44,7 @@ public: void setReservoirView(RimEclipseView* ownerReservoirView); RimEclipseView* reservoirView(); + void updateLegendData(size_t timestep); RimLegendConfig* legendConfig(); caf::PdmChildField ternaryLegendConfig; diff --git a/ApplicationCode/ProjectDataModel/RimEclipseView.cpp b/ApplicationCode/ProjectDataModel/RimEclipseView.cpp index f19403c9b4..089ae0c828 100644 --- a/ApplicationCode/ProjectDataModel/RimEclipseView.cpp +++ b/ApplicationCode/ProjectDataModel/RimEclipseView.cpp @@ -960,24 +960,31 @@ void RimEclipseView::updateLegends() if (this->cellEdgeResult()->hasResult()) { - double globalMin, globalMax; - double globalPosClosestToZero, globalNegClosestToZero; - this->cellEdgeResult()->minMaxCellEdgeValues(globalMin, globalMax); - this->cellEdgeResult()->posNegClosestToZero(globalPosClosestToZero, globalNegClosestToZero); - - this->cellEdgeResult()->legendConfig()->setClosestToZeroValues(globalPosClosestToZero, globalNegClosestToZero, globalPosClosestToZero, globalNegClosestToZero); - this->cellEdgeResult()->legendConfig()->setAutomaticRanges(globalMin, globalMax, globalMin, globalMax); - - if (this->cellEdgeResult()->hasCategoryResult()) + if (this->cellEdgeResult()->isUsingSingleVariable()) { - if(cellEdgeResult()->singleVarEdgeResultColors()->resultType() != RimDefines::FORMATION_NAMES) + this->cellEdgeResult()->singleVarEdgeResultColors()->updateLegendData(m_currentTimeStep); + } + else + { + double globalMin, globalMax; + double globalPosClosestToZero, globalNegClosestToZero; + this->cellEdgeResult()->minMaxCellEdgeValues(globalMin, globalMax); + this->cellEdgeResult()->posNegClosestToZero(globalPosClosestToZero, globalNegClosestToZero); + + this->cellEdgeResult()->legendConfig()->setClosestToZeroValues(globalPosClosestToZero, globalNegClosestToZero, globalPosClosestToZero, globalNegClosestToZero); + this->cellEdgeResult()->legendConfig()->setAutomaticRanges(globalMin, globalMax, globalMin, globalMax); + + if (this->cellEdgeResult()->hasCategoryResult()) { - cellEdgeResult()->legendConfig()->setIntegerCategories(results->uniqueCellScalarValues(cellEdgeResult()->singleVarEdgeResultColors()->scalarResultIndex())); - } - else - { - const std::vector& fnVector = eclipseCase->activeFormationNames()->formationNames(); - cellEdgeResult()->legendConfig()->setNamedCategoriesInverse(fnVector); + if(cellEdgeResult()->singleVarEdgeResultColors()->resultType() != RimDefines::FORMATION_NAMES) + { + cellEdgeResult()->legendConfig()->setIntegerCategories(results->uniqueCellScalarValues(cellEdgeResult()->singleVarEdgeResultColors()->scalarResultIndex())); + } + else + { + const std::vector& fnVector = eclipseCase->activeFormationNames()->formationNames(); + cellEdgeResult()->legendConfig()->setNamedCategoriesInverse(fnVector); + } } } @@ -998,92 +1005,12 @@ void RimEclipseView::updateMinMaxValuesAndAddLegendToView(QString legendLabel, R { if (resultColors->hasResult()) { - if (resultColors->resultType() == RimDefines::FLOW_DIAGNOSTICS) - { - double globalMin, globalMax; - double globalPosClosestToZero, globalNegClosestToZero; - RigFlowDiagResults* flowResultsData = resultColors->flowDiagSolution()->flowDiagResults(); - RigFlowDiagResultAddress resAddr = resultColors->flowDiagResAddress(); - - flowResultsData->minMaxScalarValues(resAddr, m_currentTimeStep, &globalMin, &globalMax); - flowResultsData->posNegClosestToZero(resAddr, m_currentTimeStep, &globalPosClosestToZero, &globalNegClosestToZero); - - double localMin, localMax; - double localPosClosestToZero, localNegClosestToZero; - if ( resultColors->hasDynamicResult() ) - { - flowResultsData->minMaxScalarValues(resAddr, m_currentTimeStep, &localMin, &localMax); - flowResultsData->posNegClosestToZero(resAddr, m_currentTimeStep, &localPosClosestToZero, &localNegClosestToZero); - } - else - { - localMin = globalMin; - localMax = globalMax; - - localPosClosestToZero = globalPosClosestToZero; - localNegClosestToZero = globalNegClosestToZero; - } - - CVF_ASSERT(resultColors->legendConfig()); - - resultColors->legendConfig()->disableAllTimeStepsRange(true); - resultColors->legendConfig()->setClosestToZeroValues(globalPosClosestToZero, globalNegClosestToZero, localPosClosestToZero, localNegClosestToZero); - resultColors->legendConfig()->setAutomaticRanges(globalMin, globalMax, localMin, localMax); - - if ( resultColors->hasCategoryResult() ) - { - resultColors->legendConfig()->setNamedCategories(resultColors->flowDiagSolution()->tracerNames()); - } - - } - else - { - double globalMin, globalMax; - double globalPosClosestToZero, globalNegClosestToZero; - cellResultsData->minMaxCellScalarValues(resultColors->scalarResultIndex(), globalMin, globalMax); - cellResultsData->posNegClosestToZero(resultColors->scalarResultIndex(), globalPosClosestToZero, globalNegClosestToZero); - - double localMin, localMax; - double localPosClosestToZero, localNegClosestToZero; - if ( resultColors->hasDynamicResult() ) - { - cellResultsData->minMaxCellScalarValues(resultColors->scalarResultIndex(), m_currentTimeStep, localMin, localMax); - cellResultsData->posNegClosestToZero(resultColors->scalarResultIndex(), m_currentTimeStep, localPosClosestToZero, localNegClosestToZero); - } - else - { - localMin = globalMin; - localMax = globalMax; - - localPosClosestToZero = globalPosClosestToZero; - localNegClosestToZero = globalNegClosestToZero; - } - - CVF_ASSERT(resultColors->legendConfig()); - - resultColors->legendConfig()->disableAllTimeStepsRange(false); - resultColors->legendConfig()->setClosestToZeroValues(globalPosClosestToZero, globalNegClosestToZero, localPosClosestToZero, localNegClosestToZero); - resultColors->legendConfig()->setAutomaticRanges(globalMin, globalMax, localMin, localMax); - - if ( resultColors->hasCategoryResult() ) - { - if ( resultColors->resultType() != RimDefines::FORMATION_NAMES ) - { - resultColors->legendConfig()->setIntegerCategories(cellResultsData->uniqueCellScalarValues(resultColors->scalarResultIndex())); - } - else - { - const std::vector& fnVector = eclipseCase()->reservoirData()->activeFormationNames()->formationNames(); - resultColors->legendConfig()->setNamedCategoriesInverse(fnVector); - } - } - } + resultColors->updateLegendData(m_currentTimeStep); m_viewer->addColorLegendToBottomLeftCorner(resultColors->legendConfig()->legend()); resultColors->legendConfig()->setTitle(cvfqt::Utils::toString(legendLabel + resultColors->resultVariableUiName())); } - size_t maxTimeStepCount = cellResultsData->maxTimeStepCount(); if (resultColors->isTernarySaturationSelected() && maxTimeStepCount > 1) {