From 5aeb737795c0ced52729c9f2ceeaed6da6907048 Mon Sep 17 00:00:00 2001 From: Magne Sjaastad Date: Tue, 13 Dec 2016 09:35:01 +0100 Subject: [PATCH] #1025 Refactored visibility to handle both well cell pipes and well cell spheres --- .../RivCellEdgeGeometryUtils.cpp | 2 +- .../RivTernaryTextureCoordsCreator.cpp | 2 +- .../RivTextureCoordsCreator.cpp | 2 +- .../ProjectDataModel/RimEclipseWell.cpp | 55 +++++++++++++++++-- .../ProjectDataModel/RimEclipseWell.h | 1 + .../RimEclipseWellCollection.cpp | 11 ++-- .../RimEclipseWellCollection.h | 4 +- 7 files changed, 64 insertions(+), 13 deletions(-) diff --git a/ApplicationCode/ModelVisualization/RivCellEdgeGeometryUtils.cpp b/ApplicationCode/ModelVisualization/RivCellEdgeGeometryUtils.cpp index 55008114cd..9e063bfbe1 100644 --- a/ApplicationCode/ModelVisualization/RivCellEdgeGeometryUtils.cpp +++ b/ApplicationCode/ModelVisualization/RivCellEdgeGeometryUtils.cpp @@ -95,7 +95,7 @@ void RivCellEdgeGeometryUtils::addCellEdgeResultsToDrawableGeo( if (opacityLevel < 1.0f) { - isWellPipeVisible = &(cellResultColors->reservoirView()->wellCollection()->resultWellPipeVisibilities(timeStepIndex)); + isWellPipeVisible = &(cellResultColors->reservoirView()->wellCollection()->resultWellGeometryVisibilities(timeStepIndex)); gridCellToWellindexMap = eclipseCase->gridCellToResultWellIndex(gridIndex); } diff --git a/ApplicationCode/ModelVisualization/RivTernaryTextureCoordsCreator.cpp b/ApplicationCode/ModelVisualization/RivTernaryTextureCoordsCreator.cpp index a1a1400bac..c6819e2ae1 100644 --- a/ApplicationCode/ModelVisualization/RivTernaryTextureCoordsCreator.cpp +++ b/ApplicationCode/ModelVisualization/RivTernaryTextureCoordsCreator.cpp @@ -63,7 +63,7 @@ RivTernaryTextureCoordsCreator::RivTernaryTextureCoordsCreator( m_resultAccessor->setTernaryResultAccessors(soil.p(), sgas.p(), swat.p()); cvf::ref pipeInCellEval = - new RigPipeInCellEvaluator(cellResultColors->reservoirView()->wellCollection()->resultWellPipeVisibilities(timeStepIndex), + new RigPipeInCellEvaluator(cellResultColors->reservoirView()->wellCollection()->resultWellGeometryVisibilities(timeStepIndex), eclipseCase->gridCellToResultWellIndex(gridIndex)); const RivTernaryScalarMapper* mapper = ternaryLegendConfig->scalarMapper(); diff --git a/ApplicationCode/ModelVisualization/RivTextureCoordsCreator.cpp b/ApplicationCode/ModelVisualization/RivTextureCoordsCreator.cpp index 1b95d89b3f..d0d8b77fe3 100644 --- a/ApplicationCode/ModelVisualization/RivTextureCoordsCreator.cpp +++ b/ApplicationCode/ModelVisualization/RivTextureCoordsCreator.cpp @@ -46,7 +46,7 @@ RivTextureCoordsCreator::RivTextureCoordsCreator(RimEclipseCellColors* cellResul m_resultAccessor = RigResultAccessorFactory::createResultAccessor(eclipseCase, gridIndex, timeStepIndex, cellResultColors); cvf::ref pipeInCellEval = - new RigPipeInCellEvaluator(cellResultColors->reservoirView()->wellCollection()->resultWellPipeVisibilities(timeStepIndex), + new RigPipeInCellEvaluator(cellResultColors->reservoirView()->wellCollection()->resultWellGeometryVisibilities(timeStepIndex), eclipseCase->gridCellToResultWellIndex(gridIndex)); const cvf::ScalarMapper* mapper = cellResultColors->legendConfig()->scalarMapper(); diff --git a/ApplicationCode/ProjectDataModel/RimEclipseWell.cpp b/ApplicationCode/ProjectDataModel/RimEclipseWell.cpp index 2d63588097..da0654dbd7 100644 --- a/ApplicationCode/ProjectDataModel/RimEclipseWell.cpp +++ b/ApplicationCode/ProjectDataModel/RimEclipseWell.cpp @@ -198,6 +198,56 @@ bool RimEclipseWell::calculateWellPipeVisibility(size_t frameIndex) return false; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RimEclipseWell::calculateWellSphereVisibility(size_t frameIndex) +{ + if (m_reservoirView == NULL) return false; + if (this->wellResults() == NULL) return false; + + if (frameIndex >= this->wellResults()->m_resultTimeStepIndexToWellTimeStepIndex.size()) + { + return false; + } + + size_t wellTimeStepIndex = this->wellResults()->m_resultTimeStepIndexToWellTimeStepIndex[frameIndex]; + if (wellTimeStepIndex == cvf::UNDEFINED_SIZE_T) + { + return false; + } + + if (!m_reservoirView->wellCollection()->isActive()) + return false; + + if (m_reservoirView->wellCollection()->wellSphereVisibility() == RimEclipseWellCollection::PIPES_FORCE_ALL_ON) + return true; + + if (m_reservoirView->wellCollection()->wellSphereVisibility() == RimEclipseWellCollection::PIPES_FORCE_ALL_OFF) + return false; + + if (this->showWell() == false) + return false; + + if (this->showWellSpheres() == false) + return false; + + if (m_reservoirView->wellCollection()->wellSphereVisibility() == RimEclipseWellCollection::PIPES_INDIVIDUALLY) + return true; + + if (m_reservoirView->crossSectionCollection()->hasActiveIntersectionForSimulationWell(this)) + return true; + + if (m_reservoirView->wellCollection()->wellSphereVisibility() == RimEclipseWellCollection::PIPES_OPEN_IN_VISIBLE_CELLS) + { + return visibleCellsInstersectsWell(frameIndex); + } + + CVF_ASSERT(false); // Never end here. have you added new pipe visibility modes ? + + return false; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -276,10 +326,7 @@ void RimEclipseWell::defineUiOrdering(QString uiConfigName, caf::PdmUiOrdering& //-------------------------------------------------------------------------------------------------- bool RimEclipseWell::isWellPipeVisible(size_t frameIndex) { - CVF_ASSERT(m_resultWellIndex != cvf::UNDEFINED_SIZE_T); - - // Return the possibly cached value - return m_reservoirView->wellCollection()->resultWellPipeVisibilities(frameIndex)[m_resultWellIndex]; + return calculateWellPipeVisibility(frameIndex); } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationCode/ProjectDataModel/RimEclipseWell.h b/ApplicationCode/ProjectDataModel/RimEclipseWell.h index a138d76457..cfe9ae2807 100644 --- a/ApplicationCode/ProjectDataModel/RimEclipseWell.h +++ b/ApplicationCode/ProjectDataModel/RimEclipseWell.h @@ -55,6 +55,7 @@ public: bool isWellPipeVisible(size_t frameIndex); bool calculateWellPipeVisibility(size_t frameIndex); + bool calculateWellSphereVisibility(size_t frameIndex); bool visibleCellsInstersectsWell(size_t frameIndex); diff --git a/ApplicationCode/ProjectDataModel/RimEclipseWellCollection.cpp b/ApplicationCode/ProjectDataModel/RimEclipseWellCollection.cpp index 2cc505de8a..eb3e0738b2 100644 --- a/ApplicationCode/ProjectDataModel/RimEclipseWellCollection.cpp +++ b/ApplicationCode/ProjectDataModel/RimEclipseWellCollection.cpp @@ -316,9 +316,9 @@ caf::PdmFieldHandle* RimEclipseWellCollection::objectToggleField() //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -const std::vector& RimEclipseWellCollection::resultWellPipeVisibilities(size_t frameIndex) +const std::vector& RimEclipseWellCollection::resultWellGeometryVisibilities(size_t frameIndex) { - calculateIsWellPipesVisible(frameIndex); + calculateWellGeometryVisibility(frameIndex); return m_framesOfResultWellPipeVisibilities[frameIndex]; } @@ -333,7 +333,7 @@ void RimEclipseWellCollection::scheduleIsWellPipesVisibleRecalculation() //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void RimEclipseWellCollection::calculateIsWellPipesVisible(size_t frameIndex) +void RimEclipseWellCollection::calculateWellGeometryVisibility(size_t frameIndex) { if (m_framesOfResultWellPipeVisibilities.size() > frameIndex && m_framesOfResultWellPipeVisibilities[frameIndex].size()) return; @@ -345,7 +345,10 @@ void RimEclipseWellCollection::calculateIsWellPipesVisible(size_t frameIndex) for (size_t i = 0; i < wells().size(); ++i) { - m_framesOfResultWellPipeVisibilities[frameIndex][wells[i]->resultWellIndex()] = wells[i]->calculateWellPipeVisibility(frameIndex); + bool wellPipeVisible = wells[i]->calculateWellPipeVisibility(frameIndex); + bool wellSphereVisible = wells[i]->calculateWellSphereVisibility(frameIndex); + + m_framesOfResultWellPipeVisibilities[frameIndex][wells[i]->resultWellIndex()] = wellPipeVisible || wellSphereVisible; } } diff --git a/ApplicationCode/ProjectDataModel/RimEclipseWellCollection.h b/ApplicationCode/ProjectDataModel/RimEclipseWellCollection.h index eb767274dc..c1a45fcac8 100644 --- a/ApplicationCode/ProjectDataModel/RimEclipseWellCollection.h +++ b/ApplicationCode/ProjectDataModel/RimEclipseWellCollection.h @@ -113,7 +113,7 @@ public: bool hasVisibleWellPipes(); void sortWellsByName(); - const std::vector& resultWellPipeVisibilities(size_t frameIndex); + const std::vector& resultWellGeometryVisibilities(size_t frameIndex); void scheduleIsWellPipesVisibleRecalculation(); protected: @@ -122,7 +122,7 @@ protected: virtual caf::PdmFieldHandle* objectToggleField(); private: - void calculateIsWellPipesVisible(size_t frameIndex); + void calculateWellGeometryVisibility(size_t frameIndex); RimEclipseView* m_reservoirView; std::vector< std::vector< cvf::ubyte > >