diff --git a/ApplicationLibCode/Commands/EclipseCommands/CMakeLists_files.cmake b/ApplicationLibCode/Commands/EclipseCommands/CMakeLists_files.cmake index f9428cf735..4fc0c3efdd 100644 --- a/ApplicationLibCode/Commands/EclipseCommands/CMakeLists_files.cmake +++ b/ApplicationLibCode/Commands/EclipseCommands/CMakeLists_files.cmake @@ -17,6 +17,7 @@ set(SOURCE_GROUP_HEADER_FILES ${CMAKE_CURRENT_LIST_DIR}/RicImportEclipseCaseTimeStepFilterFeature.h ${CMAKE_CURRENT_LIST_DIR}/RicEclipsePropertyFilterNewInViewFeature.h ${CMAKE_CURRENT_LIST_DIR}/RicEclipseHideFaultFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicEclipseShowOnlyFaultFeature.h ) set(SOURCE_GROUP_SOURCE_FILES @@ -38,6 +39,7 @@ set(SOURCE_GROUP_SOURCE_FILES ${CMAKE_CURRENT_LIST_DIR}/RicImportEclipseCaseTimeStepFilterFeature.cpp ${CMAKE_CURRENT_LIST_DIR}/RicEclipsePropertyFilterNewInViewFeature.cpp ${CMAKE_CURRENT_LIST_DIR}/RicEclipseHideFaultFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicEclipseShowOnlyFaultFeature.cpp ) list(APPEND COMMAND_CODE_HEADER_FILES ${SOURCE_GROUP_HEADER_FILES}) diff --git a/ApplicationLibCode/Commands/EclipseCommands/RicEclipseShowOnlyFaultFeature.cpp b/ApplicationLibCode/Commands/EclipseCommands/RicEclipseShowOnlyFaultFeature.cpp new file mode 100644 index 0000000000..cdfaaca98c --- /dev/null +++ b/ApplicationLibCode/Commands/EclipseCommands/RicEclipseShowOnlyFaultFeature.cpp @@ -0,0 +1,105 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2021 Equinor 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 +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#include "RicEclipseShowOnlyFaultFeature.h" + +#include "RicEclipsePropertyFilterFeatureImpl.h" +#include "RicEclipsePropertyFilterNewExec.h" + +#include "RiaApplication.h" + +#include "Rim3dView.h" +#include "RimEclipseCellColors.h" +#include "RimEclipsePropertyFilterCollection.h" +#include "RimEclipseView.h" +#include "RimFaultInView.h" +#include "RimFaultInViewCollection.h" + +#include "RigFault.h" +#include "RigMainGrid.h" + +#include "cafCmdExecCommandManager.h" +#include "cafPdmUiObjectHandle.h" +#include "cvfStructGrid.h" + +#include + +CAF_CMD_SOURCE_INIT( RicEclipseShowOnlyFaultFeature, "RicEclipseShowOnlyFaultFeature" ); + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RicEclipseShowOnlyFaultFeature::isCommandEnabled() +{ + Rim3dView* view = RiaApplication::instance()->activeReservoirView(); + if ( !view ) return false; + + RimEclipseView* eclView = dynamic_cast( view ); + if ( !eclView ) return false; + + return true; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RicEclipseShowOnlyFaultFeature::onActionTriggered( bool isChecked ) +{ + QVariant userData = this->userData(); + if ( userData.isNull() || userData.type() != QVariant::String ) return; + + QString faultName = userData.toString(); + + Rim3dView* view = RiaApplication::instance()->activeReservoirView(); + if ( !view ) return; + + RimEclipseView* eclView = dynamic_cast( view ); + if ( !eclView ) return; + + RimFaultInViewCollection* coll = eclView->faultCollection(); + RimFaultInView* rimFault = coll->findFaultByName( faultName ); + if ( !rimFault ) return; + if ( !rimFault->parentField() ) return; + + std::vector children; + rimFault->parentField()->childObjects( &children ); + + for ( auto& child : children ) + { + caf::PdmUiObjectHandle* childUiObject = uiObj( child ); + if ( childUiObject && childUiObject->objectToggleField() ) + { + caf::PdmField* field = dynamic_cast*>( childUiObject->objectToggleField() ); + + if ( field ) field->setValueWithFieldChanged( false ); + } + } + + if ( rimFault ) + { + rimFault->showFault.setValueWithFieldChanged( true ); + } +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RicEclipseShowOnlyFaultFeature::setupActionLook( QAction* actionToSetup ) +{ + actionToSetup->setIcon( QIcon( ":/draw_style_faults_24x24.png" ) ); +} diff --git a/ApplicationLibCode/Commands/EclipseCommands/RicEclipseShowOnlyFaultFeature.h b/ApplicationLibCode/Commands/EclipseCommands/RicEclipseShowOnlyFaultFeature.h new file mode 100644 index 0000000000..d4325fee94 --- /dev/null +++ b/ApplicationLibCode/Commands/EclipseCommands/RicEclipseShowOnlyFaultFeature.h @@ -0,0 +1,34 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2021 Equinor 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 +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#pragma once + +#include "cafCmdFeature.h" + +//================================================================================================== +/// +//================================================================================================== +class RicEclipseShowOnlyFaultFeature : public caf::CmdFeature +{ + CAF_CMD_HEADER_INIT; + +protected: + bool isCommandEnabled() override; + void onActionTriggered( bool isChecked ) override; + void setupActionLook( QAction* actionToSetup ) override; +}; diff --git a/ApplicationLibCode/ModelVisualization/RivFaultGeometryGenerator.cpp b/ApplicationLibCode/ModelVisualization/RivFaultGeometryGenerator.cpp index 2e76b81f5a..8b8a436a6b 100644 --- a/ApplicationLibCode/ModelVisualization/RivFaultGeometryGenerator.cpp +++ b/ApplicationLibCode/ModelVisualization/RivFaultGeometryGenerator.cpp @@ -29,16 +29,20 @@ #include "cvfScalarMapper.h" #include "RigFault.h" +#include "RigNNCData.h" +#include "RigNncConnection.h" //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- RivFaultGeometryGenerator::RivFaultGeometryGenerator( const cvf::StructGridInterface* grid, const RigFault* fault, + RigNNCData* nncData, bool computeNativeFaultFaces ) : m_grid( grid ) , m_fault( fault ) , m_computeNativeFaultFaces( computeNativeFaultFaces ) + , m_nncData( nncData ) { m_quadMapper = new cvf::StructGridQuadToCellFaceMapper; m_triangleMapper = new cvf::StuctGridTriangleToCellFaceMapper( m_quadMapper.p() ); @@ -54,9 +58,9 @@ RivFaultGeometryGenerator::~RivFaultGeometryGenerator() //-------------------------------------------------------------------------------------------------- /// Generate surface drawable geo from the specified region //-------------------------------------------------------------------------------------------------- -cvf::ref RivFaultGeometryGenerator::generateSurface() +cvf::ref RivFaultGeometryGenerator::generateSurface( bool onlyShowFacesWithDefinedNeighbors ) { - computeArrays(); + computeArrays( onlyShowFacesWithDefinedNeighbors ); CVF_ASSERT( m_vertices.notNull() ); @@ -119,7 +123,28 @@ cvf::ref RivFaultGeometryGenerator::createOutlineMeshDrawable( //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void RivFaultGeometryGenerator::computeArrays() +bool RivFaultGeometryGenerator::hasConnection( size_t cellIdx, + cvf::StructGridInterface::FaceType face, + RigConnectionContainer& conns ) +{ + cvf::StructGridInterface::FaceType oppositeFace = cvf::StructGridInterface::oppositeFace( face ); + + for ( size_t i = 0; i < conns.size(); i++ ) + { + auto& r = conns[i]; + + if ( ( r.c1GlobIdx() == cellIdx ) && ( r.face() == face ) && r.hasCommonArea() ) return true; + + if ( ( r.c2GlobIdx() == cellIdx ) && ( r.face() == oppositeFace ) && r.hasCommonArea() ) return true; + } + + return false; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RivFaultGeometryGenerator::computeArrays( bool onlyShowFacesWithDefinedNeighbors ) { std::vector vertices; m_quadMapper->quadToCellIndexMap().clear(); @@ -127,6 +152,8 @@ void RivFaultGeometryGenerator::computeArrays() cvf::Vec3d offset = m_grid->displayModelOffset(); + auto& connections = m_nncData->connections(); + const std::vector& faultFaces = m_fault->faultFaces(); #pragma omp parallel for @@ -135,23 +162,25 @@ void RivFaultGeometryGenerator::computeArrays() size_t cellIndex = faultFaces[fIdx].m_nativeReservoirCellIndex; cvf::StructGridInterface::FaceType face = faultFaces[fIdx].m_nativeFace; - if ( cellIndex >= m_cellVisibility->size() ) continue; - if ( !m_computeNativeFaultFaces ) { cellIndex = faultFaces[fIdx].m_oppositeReservoirCellIndex; - face = cvf::StructGridInterface::oppositeFace( faultFaces[fIdx].m_nativeFace ); + face = cvf::StructGridInterface::oppositeFace( face ); } + if ( cellIndex >= m_cellVisibility->size() ) continue; + if ( !( *m_cellVisibility )[cellIndex] ) continue; + if ( onlyShowFacesWithDefinedNeighbors && !hasConnection( cellIndex, face, connections ) ) continue; + cvf::Vec3d cornerVerts[8]; m_grid->cellCornerVertices( cellIndex, cornerVerts ); cvf::ubyte faceConn[4]; m_grid->cellFaceVertexIndices( face, faceConn ); - // Critical section to avoid two threads accessing the arrays at the same time. +// Critical section to avoid two threads accessing the arrays at the same time. #pragma omp critical( critical_section_RivFaultGeometryGenerator_computeArrays ) { int n; diff --git a/ApplicationLibCode/ModelVisualization/RivFaultGeometryGenerator.h b/ApplicationLibCode/ModelVisualization/RivFaultGeometryGenerator.h index cdf24c0688..0d4f74f5f4 100644 --- a/ApplicationLibCode/ModelVisualization/RivFaultGeometryGenerator.h +++ b/ApplicationLibCode/ModelVisualization/RivFaultGeometryGenerator.h @@ -32,6 +32,8 @@ class Transform; class Part; } // namespace cvf +class RigNNCData; +class RigConnectionContainer; class RigFault; //================================================================================================== @@ -42,7 +44,10 @@ class RigFault; class RivFaultGeometryGenerator : public cvf::Object { public: - RivFaultGeometryGenerator( const cvf::StructGridInterface* grid, const RigFault* fault, bool computeNativeFaultFaces ); + RivFaultGeometryGenerator( const cvf::StructGridInterface* grid, + const RigFault* fault, + RigNNCData* nncData, + bool computeNativeFaultFaces ); ~RivFaultGeometryGenerator() override; void setCellVisibility( const cvf::UByteArray* cellVisibilities ); @@ -53,18 +58,21 @@ public: const cvf::StuctGridTriangleToCellFaceMapper* triangleToCellFaceMapper() { return m_triangleMapper.p(); } // Generated geometry - cvf::ref generateSurface(); + cvf::ref generateSurface( bool onlyShowFacesWithDefinedNeighbors ); cvf::ref createMeshDrawable(); cvf::ref createOutlineMeshDrawable( double creaseAngle ); private: - void computeArrays(); + void computeArrays( bool onlyShowFacesWithDefinedNeighbors ); + + bool hasConnection( size_t cellIdx, cvf::StructGridInterface::FaceType face, RigConnectionContainer& conns ); private: // Input cvf::cref m_grid; cvf::cref m_fault; cvf::cref m_cellVisibility; + cvf::ref m_nncData; bool m_computeNativeFaultFaces; diff --git a/ApplicationLibCode/ModelVisualization/RivFaultPartMgr.cpp b/ApplicationLibCode/ModelVisualization/RivFaultPartMgr.cpp index f31d2e46e2..5de9277273 100644 --- a/ApplicationLibCode/ModelVisualization/RivFaultPartMgr.cpp +++ b/ApplicationLibCode/ModelVisualization/RivFaultPartMgr.cpp @@ -24,6 +24,7 @@ #include "RigCaseCellResultsData.h" #include "RigMainGrid.h" +#include "RigNNCData.h" #include "RigResultAccessor.h" #include "RimEclipseCase.h" @@ -74,8 +75,11 @@ RivFaultPartMgr::RivFaultPartMgr( const RigGridBase* grid, cvf::ref> connIdxes = new cvf::Array; connIdxes->assign( rimFault->faultGeometry()->connectionIndices() ); - m_nativeFaultGenerator = new RivFaultGeometryGenerator( grid, rimFault->faultGeometry(), true ); - m_oppositeFaultGenerator = new RivFaultGeometryGenerator( grid, rimFault->faultGeometry(), false ); + m_nativeFaultGenerator = + new RivFaultGeometryGenerator( grid, rimFault->faultGeometry(), grid->mainGrid()->nncData(), true ); + + m_oppositeFaultGenerator = + new RivFaultGeometryGenerator( grid, rimFault->faultGeometry(), grid->mainGrid()->nncData(), false ); m_nativeFaultFacesTextureCoords = new cvf::Vec2fArray; m_oppositeFaultFacesTextureCoords = new cvf::Vec2fArray; @@ -280,7 +284,8 @@ void RivFaultPartMgr::generatePartGeometry() bool useBufferObjects = true; // Surface geometry { - cvf::ref geo = m_nativeFaultGenerator->generateSurface(); + cvf::ref geo = + m_nativeFaultGenerator->generateSurface( m_rimFaultCollection->onlyShowFacesWithDefinedNeighbor() ); if ( geo.notNull() ) { geo->computeNormals(); @@ -333,7 +338,8 @@ void RivFaultPartMgr::generatePartGeometry() // Surface geometry { - cvf::ref geo = m_oppositeFaultGenerator->generateSurface(); + cvf::ref geo = + m_oppositeFaultGenerator->generateSurface( m_rimFaultCollection->onlyShowFacesWithDefinedNeighbor() ); if ( geo.notNull() ) { geo->computeNormals(); diff --git a/ApplicationLibCode/ModelVisualization/RivFaultPartMgr.h b/ApplicationLibCode/ModelVisualization/RivFaultPartMgr.h index cc0519b0d9..2b3340a7a9 100644 --- a/ApplicationLibCode/ModelVisualization/RivFaultPartMgr.h +++ b/ApplicationLibCode/ModelVisualization/RivFaultPartMgr.h @@ -37,6 +37,7 @@ class RimEclipseCellColors; class RimCellEdgeColors; class RimFaultInViewCollection; class RigGridBase; + class RimFaultInViewCollection; class RimFaultInView; class RivFaultGeometryGenerator; diff --git a/ApplicationLibCode/ModelVisualization/RivReservoirFaultsPartMgr.cpp b/ApplicationLibCode/ModelVisualization/RivReservoirFaultsPartMgr.cpp index 821d112f5e..a4b6a95d2c 100644 --- a/ApplicationLibCode/ModelVisualization/RivReservoirFaultsPartMgr.cpp +++ b/ApplicationLibCode/ModelVisualization/RivReservoirFaultsPartMgr.cpp @@ -118,8 +118,6 @@ void RivReservoirFaultsPartMgr::appendPartsToModel( cvf::ModelBasicList* model ) forceDisplayOfFault = true; } - // qDebug() << forceDisplayOfFault; - cvf::ModelBasicList parts; for ( size_t i = 0; i < faultCollection->faults.size(); i++ ) diff --git a/ApplicationLibCode/ProjectDataModel/Faults/RimFaultInViewCollection.cpp b/ApplicationLibCode/ProjectDataModel/Faults/RimFaultInViewCollection.cpp index ea0d1cf13c..ce8acbd451 100644 --- a/ApplicationLibCode/ProjectDataModel/Faults/RimFaultInViewCollection.cpp +++ b/ApplicationLibCode/ProjectDataModel/Faults/RimFaultInViewCollection.cpp @@ -39,6 +39,7 @@ #include "cafAppEnum.h" #include "cafPdmFieldCvfColor.h" #include "cafPdmFieldCvfMat4d.h" +#include "cafPdmUiCheckBoxEditor.h" #include "cafPdmUiTreeOrdering.h" namespace caf @@ -65,31 +66,38 @@ RimFaultInViewCollection::RimFaultInViewCollection() CAF_PDM_InitField( &showFaultCollection, "Active", true, "Active", "", "", "" ); showFaultCollection.uiCapability()->setUiHidden( true ); - CAF_PDM_InitField( &showFaultFaces, "ShowFaultFaces", true, "Show Defined faces", "", "", "" ); - CAF_PDM_InitField( &showOppositeFaultFaces, "ShowOppositeFaultFaces", true, "Show Opposite Faces", "", "", "" ); - CAF_PDM_InitField( &m_showFaultsOutsideFilters, "ShowFaultsOutsideFilters", true, "Show Faults Outside Filters", "", "", "" ); + CAF_PDM_InitField( &showFaultFaces, "ShowFaultFaces", true, "Show Defined faces" ); + caf::PdmUiNativeCheckBoxEditor::configureFieldForEditor( &showFaultFaces ); + + CAF_PDM_InitField( &showOppositeFaultFaces, "ShowOppositeFaultFaces", true, "Show Opposite Faces" ); + caf::PdmUiNativeCheckBoxEditor::configureFieldForEditor( &showOppositeFaultFaces ); + + CAF_PDM_InitField( &m_showFaultsOutsideFilters, "ShowFaultsOutsideFilters", true, "Show Faults Outside Filters" ); + caf::PdmUiNativeCheckBoxEditor::configureFieldForEditor( &m_showFaultsOutsideFilters ); + + CAF_PDM_InitField( &m_onlyShowWithNeighbor, "OnlyShowWithDefNeighbor", false, "Only Show Faces With Defined Cell Neighbor" ); + caf::PdmUiNativeCheckBoxEditor::configureFieldForEditor( &m_onlyShowWithNeighbor ); CAF_PDM_InitField( &faultResult, "FaultFaceCulling", caf::AppEnum( RimFaultInViewCollection::FAULT_BACK_FACE_CULLING ), - "Dynamic Face Selection", - "", - "", - "" ); + "Dynamic Face Selection" ); + + CAF_PDM_InitField( &showFaultLabel, "ShowFaultLabel", false, "Show Labels" ); + caf::PdmUiNativeCheckBoxEditor::configureFieldForEditor( &showFaultLabel ); - CAF_PDM_InitField( &showFaultLabel, "ShowFaultLabel", false, "Show Labels", "", "", "" ); cvf::Color3f defWellLabelColor = RiaPreferences::current()->defaultWellLabelColor(); CAF_PDM_InitField( &faultLabelColor, "FaultLabelColor", defWellLabelColor, "Label Color", "", "", "" ); - CAF_PDM_InitField( &showNNCs, "ShowNNCs", true, "Show NNCs", "", "", "" ); + CAF_PDM_InitField( &showNNCs, "ShowNNCs", true, "Show NNCs" ); + caf::PdmUiNativeCheckBoxEditor::configureFieldForEditor( &showNNCs ); + CAF_PDM_InitField( &hideNncsWhenNoResultIsAvailable, "HideNncsWhenNoResultIsAvailable", true, - "Hide NNC Geometry if No NNC Result is Available", - "", - "", - "" ); + "Hide NNC Geometry if No NNC Result is Available" ); + caf::PdmUiNativeCheckBoxEditor::configureFieldForEditor( &hideNncsWhenNoResultIsAvailable ); CAF_PDM_InitFieldNoDefault( &faults, "Faults", "Faults", "", "", "" ); faults.uiCapability()->setUiTreeHidden( true ); @@ -127,10 +135,16 @@ void RimFaultInViewCollection::fieldChangedByUi( const caf::PdmFieldHandle* chan parentView()->intersectionCollection()->scheduleCreateDisplayModelAndRedraw2dIntersectionViews(); } + if ( changedField == &m_onlyShowWithNeighbor ) + { + parentView()->scheduleReservoirGridGeometryRegen(); + } + if ( &showFaultFaces == changedField || &showOppositeFaultFaces == changedField || &showFaultCollection == changedField || &showFaultLabel == changedField || &m_showFaultsOutsideFilters == changedField || &faultLabelColor == changedField || - &faultResult == changedField || &showNNCs == changedField || &hideNncsWhenNoResultIsAvailable == changedField ) + &m_onlyShowWithNeighbor == changedField || &faultResult == changedField || &showNNCs == changedField || + &hideNncsWhenNoResultIsAvailable == changedField ) { parentView()->scheduleCreateDisplayModelAndRedraw(); parentView()->intersectionCollection()->scheduleCreateDisplayModelAndRedraw2dIntersectionViews(); @@ -286,6 +300,7 @@ void RimFaultInViewCollection::uiOrderingFaults( QString uiConfigName, caf::PdmU ffviz->add( &showFaultFaces ); ffviz->add( &showOppositeFaultFaces ); ffviz->add( &faultResult ); + ffviz->add( &m_onlyShowWithNeighbor ); caf::PdmUiGroup* nncViz = uiOrdering.addNewGroup( "NNC Visibility" ); nncViz->setCollapsedByDefault( true ); @@ -368,6 +383,14 @@ void RimFaultInViewCollection::setShowFaultsOutsideFilter( bool show ) //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- +bool RimFaultInViewCollection::onlyShowFacesWithDefinedNeighbor() const +{ + return m_onlyShowWithNeighbor; +} + +//------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- RimFaultRASettings* RimFaultInViewCollection::faultRASettings() const { return m_faultRASettings(); diff --git a/ApplicationLibCode/ProjectDataModel/Faults/RimFaultInViewCollection.h b/ApplicationLibCode/ProjectDataModel/Faults/RimFaultInViewCollection.h index 15c3aa0e31..89ce976140 100644 --- a/ApplicationLibCode/ProjectDataModel/Faults/RimFaultInViewCollection.h +++ b/ApplicationLibCode/ProjectDataModel/Faults/RimFaultInViewCollection.h @@ -62,6 +62,8 @@ public: bool isShowingFaultsAndFaultsOutsideFilters() const; void setShowFaultsOutsideFilter( bool show ); + bool onlyShowFacesWithDefinedNeighbor() const; + RimFaultRASettings* faultRASettings() const; bool faultRAEnabled() const; bool faultRAAdvancedEnabled() const; @@ -95,6 +97,7 @@ private: private: caf::PdmField m_showFaultsOutsideFilters; + caf::PdmField m_onlyShowWithNeighbor; caf::PdmChildField m_faultRASettings; caf::PdmField m_enableFaultRA; diff --git a/ApplicationLibCode/UserInterface/RiuViewerCommands.cpp b/ApplicationLibCode/UserInterface/RiuViewerCommands.cpp index b6634ca133..71956a5b94 100644 --- a/ApplicationLibCode/UserInterface/RiuViewerCommands.cpp +++ b/ApplicationLibCode/UserInterface/RiuViewerCommands.cpp @@ -447,6 +447,12 @@ void RiuViewerCommands::displayContextMenu( QMouseEvent* event ) QString( "Hide " ) + faultName, hideFaultList ); + menuBuilder.addCmdFeatureWithUserData( "RicEclipseShowOnlyFaultFeature", + QString( "Show " ) + faultName + QString( " - Others Off" ), + QVariant( fault->name() ) ); + + menuBuilder.addSeparator(); + if ( eclipseView->faultCollection() && eclipseView->faultCollection()->faultRAEnabled() ) { menuBuilder.subMenuStart( "Reactivation Assessment" );