#14226 intersection along ijk axis

* #14226 Add intersection along i/j/k axis

Add a new persistent intersection type that follows the grid pillars at a
fixed i, j or k index. Unlike the axis-aligned intersection box, the surface
is built from the grid cell faces and therefore steps along faults and curved
pillars, which is useful for structural restoration analysis.

The user selects the axis, the fixed index, the two perpendicular index
ranges and which cell face (front/back pillar) to use. The geometry generator
emits the chosen cell face of every cell in the index plane directly from the
native pillar corners, so cell result colors map exactly.

The feature is available from the Intersections context menu for Eclipse
views and supports 3D-view picking and cell result readout.
This commit is contained in:
Kristian Bendiksen authored and GitHub committed 2026-07-27 11:21:05 +02:00
1 parent 2ebefe73b6
commit 5dc3374733
26 files changed
+1841 -24

No files matched your search

@@ -29,6 +29,7 @@
#include "RimGeoMechView.h"
#include "RimGridCrossPlotCurve.h"
#include "RimGridCrossPlotDataSet.h"
#include "RimIjkIntersection.h"
#include "RimMimeData.h"
#include "RimModeledWellPath.h"
#include "RimSummaryMultiPlot.h"
@@ -125,6 +126,7 @@ bool RicCopyReferencesToClipboardFeature::isCopyOfObjectSupported( caf::PdmObjec
if ( dynamic_cast<RimEclipseCase*>( pdmObject ) ) return true;
if ( dynamic_cast<RimExtrudedCurveIntersection*>( pdmObject ) ) return true;
if ( dynamic_cast<RimBoxIntersection*>( pdmObject ) ) return true;
if ( dynamic_cast<RimIjkIntersection*>( pdmObject ) ) return true;
if ( dynamic_cast<RimSummaryPlot*>( pdmObject ) ) return true;
if ( dynamic_cast<RimFractureTemplate*>( pdmObject ) ) return true;
if ( dynamic_cast<RimEnsembleCurveSet*>( pdmObject ) ) return true;
@@ -22,6 +22,7 @@
#include "RimBoxIntersection.h"
#include "RimExtrudedCurveIntersection.h"
#include "RimIjkIntersection.h"
#include "RimIntersectionCollection.h"
#include "RiuMainWindow.h"
@@ -47,7 +48,10 @@ bool RicPasteIntersectionsFeature::isCommandEnabled() const
std::vector<caf::PdmPointer<RimBoxIntersection>> intersectionBoxObjects;
objectGroup.objectsByType( &intersectionBoxObjects );
if ( intersectionObjects.empty() && intersectionBoxObjects.empty() )
std::vector<caf::PdmPointer<RimIjkIntersection>> ijkIntersectionObjects;
objectGroup.objectsByType( &ijkIntersectionObjects );
if ( intersectionObjects.empty() && intersectionBoxObjects.empty() && ijkIntersectionObjects.empty() )
{
return false;
}
@@ -110,6 +114,25 @@ void RicPasteIntersectionsFeature::onActionTriggered( bool isChecked )
intersectionCollection->appendIntersectionBoxNoUpdate( intersectionBox );
}
}
std::vector<caf::PdmPointer<RimIjkIntersection>> ijkIntersectionObjects;
objectGroup.objectsByType( &ijkIntersectionObjects );
for ( size_t i = 0; i < ijkIntersectionObjects.size(); i++ )
{
RimIjkIntersection* ijkIntersection = ijkIntersectionObjects[i]->copyObject<RimIjkIntersection>();
QString nameOfCopy = QString( "Copy of " ) + ijkIntersection->name();
ijkIntersection->setName( nameOfCopy );
if ( i == ijkIntersectionObjects.size() - 1 )
{
intersectionCollection->appendIjkIntersectionAndUpdate( ijkIntersection );
}
else
{
intersectionCollection->appendIjkIntersectionNoUpdate( ijkIntersection );
}
}
}
//--------------------------------------------------------------------------------------------------
@@ -145,5 +168,11 @@ RimIntersectionCollection* RicPasteIntersectionsFeature::findIntersectionCollect
return intersectionBox->firstAncestorOrThisOfType<RimIntersectionCollection>();
}
RimIjkIntersection* ijkIntersection = dynamic_cast<RimIjkIntersection*>( objectHandle );
if ( ijkIntersection )
{
return ijkIntersection->firstAncestorOrThisOfType<RimIntersectionCollection>();
}
return nullptr;
}