Files
ResInsight/ApplicationLibCode/ProjectDataModel/Rim2dIntersectionViewCollection.cpp
T
Magne Sjaastad 91d3ae8f3a #14439 Create 2D intersection views for views in a grid ensemble
Rim2dIntersectionViewCollection::syncFromExistingIntersections() found the
intersections by walking the PDM child tree of the case. Views located in a
grid ensemble view collection or in the project level view collection are not
children of the case, so no 2D intersection view was created for their
intersections and "Show 2D Intersection View" did nothing.

Collect the intersections from the grid views displaying the case instead.

Display the 2D intersection views as a child of RimReservoirGridEnsemble, next
to the 3D views they are created from, and skip the node on the case to avoid
showing the same object twice in the project tree.
2026-08-06 12:42:54 +02:00

166 lines
6.2 KiB
C++

/////////////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2018- 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 <http://www.gnu.org/licenses/gpl.html>
// for more details.
//
/////////////////////////////////////////////////////////////////////////////////
#include "Rim2dIntersectionViewCollection.h"
#include "Rim2dIntersectionView.h"
#include "RimCase.h"
#include "RimExtrudedCurveIntersection.h"
#include "RimGridView.h"
#include "RimIntersectionCollection.h"
#include "RimReservoirGridEnsemble.h"
#include <algorithm>
CAF_PDM_SOURCE_INIT( Rim2dIntersectionViewCollection, "Intersection2dViewCollection" );
namespace
{
//--------------------------------------------------------------------------------------------------
/// Views displaying a case are not necessarily children of the case. Views can be located in the project level
/// view collection or in the view collection of a grid ensemble. Collect all grid views displaying the case.
//--------------------------------------------------------------------------------------------------
std::vector<RimGridView*> gridViewsForCase( RimCase* rimCase )
{
std::vector<RimGridView*> gridViews = rimCase->gridViews();
// Views in a view collection are not children of the case, and are not reported by gridViews(). These views refer to
// the case using a ptr field, and can be found by inspecting the objects referring to the case.
for ( auto view : rimCase->objectsWithReferringPtrFieldsOfType<RimGridView>() )
{
if ( !view || view->ownerCase() != rimCase ) continue;
if ( std::find( gridViews.begin(), gridViews.end(), view ) != gridViews.end() ) continue;
gridViews.push_back( view );
}
return gridViews;
}
} // namespace
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
Rim2dIntersectionViewCollection::Rim2dIntersectionViewCollection()
{
CAF_PDM_InitObject( "2D Intersection Views", ":/CrossSection16x16.png" );
CAF_PDM_InitFieldNoDefault( &m_intersectionViews, "IntersectionViews", "Intersection Views", ":/CrossSection16x16.png" );
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
Rim2dIntersectionViewCollection::~Rim2dIntersectionViewCollection()
{
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
std::vector<Rim2dIntersectionView*> Rim2dIntersectionViewCollection::views()
{
return m_intersectionViews.childrenByType();
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void Rim2dIntersectionViewCollection::syncFromExistingIntersections( bool doUpdate )
{
auto parentCase = firstAncestorOrThisOfTypeAsserted<RimCase>();
std::vector<RimExtrudedCurveIntersection*> allOrderedIntersectionsInCase;
for ( auto gridView : gridViewsForCase( parentCase ) )
{
if ( !gridView || !gridView->intersectionCollection() ) continue;
for ( auto intersection : gridView->intersectionCollection()->intersections() )
{
if ( intersection ) allOrderedIntersectionsInCase.push_back( intersection );
}
}
// Delete views without a valid intersection
for ( Rim2dIntersectionView* iv : m_intersectionViews )
{
if ( iv && !iv->intersection() )
{
delete iv;
}
}
// Clean up the container by removing nullptr's
m_intersectionViews.removeChild( nullptr );
// Build map from intersection to view
std::map<RimExtrudedCurveIntersection*, Rim2dIntersectionView*> intersectionToViewMap;
for ( Rim2dIntersectionView* iv : m_intersectionViews )
{
CVF_ASSERT( iv && iv->intersection() );
intersectionToViewMap[iv->intersection()] = iv;
}
m_intersectionViews.clearWithoutDelete(); // Not deleting the views. The are managed by the map
// Insert the old views in correct order, and create new views as we go
for ( RimExtrudedCurveIntersection* intersection : allOrderedIntersectionsInCase )
{
auto view = intersection->firstAncestorOrThisOfType<RimGridView>();
auto it = intersectionToViewMap.find( intersection );
if ( it == intersectionToViewMap.end() )
{
Rim2dIntersectionView* newView = new Rim2dIntersectionView();
if ( view )
{
newView->setCurrentTimeStep( view->currentTimeStep() );
view->cellVisibilityChanged.connect( newView, &Rim2dIntersectionView::onCellVisibilityChanged );
}
newView->setIntersection( intersection );
m_intersectionViews.push_back( newView );
}
else
{
if ( view )
{
view->cellVisibilityChanged.disconnect( it->second );
view->cellVisibilityChanged.connect( it->second, &Rim2dIntersectionView::onCellVisibilityChanged );
}
m_intersectionViews.push_back( it->second );
}
}
if ( doUpdate ) updateConnectedEditors();
parentCase->updateConnectedEditors();
// For a case in a grid ensemble, this collection is displayed as a child of the ensemble
if ( auto ensemble = parentCase->firstAncestorOfType<RimReservoirGridEnsemble>() )
{
ensemble->updateConnectedEditors();
}
}