#5379 Surface : Fix slicing in IJ direction

This commit is contained in:
Magne Sjaastad 2020-05-02 09:41:08 +02:00
parent 5d31912971
commit 0eb94ef574

View File

@ -158,68 +158,90 @@ void RimGridCaseSurface::fieldChangedByUi( const caf::PdmFieldHandle* changedFie
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
void RimGridCaseSurface::extractDataFromGrid() void RimGridCaseSurface::extractDataFromGrid()
{ {
std::vector<unsigned> tringleIndices; clearNativeGridData();
std::vector<cvf::Vec3d> vertices;
cvf::StructGridInterface::FaceType faceType = cvf::StructGridInterface::NO_FACE; if ( m_sliceDirection() == RiaDefines::GridCaseAxis::UNDEFINED_AXIS ) return;
{
if ( m_sliceDirection() == RiaDefines::GridCaseAxis::AXIS_K )
{
faceType = cvf::StructGridInterface::NEG_K;
}
else if ( m_sliceDirection() == RiaDefines::GridCaseAxis::AXIS_J )
{
faceType = cvf::StructGridInterface::NEG_J;
}
else if ( m_sliceDirection() == RiaDefines::GridCaseAxis::AXIS_I )
{
faceType = cvf::StructGridInterface::NEG_I;
}
}
if ( m_case && faceType != cvf::StructGridInterface::NO_FACE ) if ( m_case )
{ {
RimEclipseCase* eclCase = dynamic_cast<RimEclipseCase*>( m_case() ); RimEclipseCase* eclCase = dynamic_cast<RimEclipseCase*>( m_case() );
if ( eclCase && eclCase->mainGrid() ) if ( eclCase && eclCase->mainGrid() )
{ {
const RigMainGrid* grid = eclCase->mainGrid(); const RigMainGrid* grid = eclCase->mainGrid();
size_t minI = 0;
size_t minJ = 0;
size_t minK = 0;
size_t maxI = grid->cellCountI();
size_t maxJ = grid->cellCountJ();
size_t maxK = grid->cellCountK();
size_t zeroBasedLayerIndex = static_cast<size_t>( m_oneBasedSliceIndex - 1 ); size_t zeroBasedLayerIndex = static_cast<size_t>( m_oneBasedSliceIndex - 1 );
for ( size_t i = 0; i < grid->cellCountI(); i++ )
cvf::StructGridInterface::FaceType faceType = cvf::StructGridInterface::NO_FACE;
{ {
for ( size_t j = 0; j < grid->cellCountJ(); j++ ) if ( m_sliceDirection() == RiaDefines::GridCaseAxis::AXIS_K )
{ {
size_t cellIndex = grid->cellIndexFromIJK( i, j, zeroBasedLayerIndex ); faceType = cvf::StructGridInterface::NEG_K;
if ( grid->cell( cellIndex ).isInvalid() ) continue; minK = zeroBasedLayerIndex;
maxK = zeroBasedLayerIndex + 1;
cvf::Vec3d cornerVerts[8]; }
grid->cellCornerVertices( cellIndex, cornerVerts ); else if ( m_sliceDirection() == RiaDefines::GridCaseAxis::AXIS_J )
{
cvf::ubyte faceConn[4]; faceType = cvf::StructGridInterface::NEG_J;
grid->cellFaceVertexIndices( faceType, faceConn ); minJ = zeroBasedLayerIndex;
maxJ = zeroBasedLayerIndex + 1;
cvf::uint triangleIndex = static_cast<cvf::uint>( vertices.size() ); }
else if ( m_sliceDirection() == RiaDefines::GridCaseAxis::AXIS_I )
for ( int n = 0; n < 4; n++ ) {
{ faceType = cvf::StructGridInterface::NEG_I;
vertices.push_back( cornerVerts[faceConn[n]] ); minI = zeroBasedLayerIndex;
} maxI = zeroBasedLayerIndex + 1;
tringleIndices.push_back( triangleIndex + 0 );
tringleIndices.push_back( triangleIndex + 1 );
tringleIndices.push_back( triangleIndex + 2 );
tringleIndices.push_back( triangleIndex + 0 );
tringleIndices.push_back( triangleIndex + 2 );
tringleIndices.push_back( triangleIndex + 3 );
} }
} }
std::vector<unsigned> tringleIndices;
std::vector<cvf::Vec3d> vertices;
for ( size_t i = minI; i < maxI; i++ )
{
for ( size_t j = minJ; j < maxJ; j++ )
{
for ( size_t k = minK; k < maxK; k++ )
{
size_t cellIndex = grid->cellIndexFromIJK( i, j, k );
if ( grid->cell( cellIndex ).isInvalid() ) continue;
cvf::Vec3d cornerVerts[8];
grid->cellCornerVertices( cellIndex, cornerVerts );
cvf::ubyte faceConn[4];
grid->cellFaceVertexIndices( faceType, faceConn );
cvf::uint triangleIndex = static_cast<cvf::uint>( vertices.size() );
for ( int n = 0; n < 4; n++ )
{
vertices.push_back( cornerVerts[faceConn[n]] );
}
tringleIndices.push_back( triangleIndex + 0 );
tringleIndices.push_back( triangleIndex + 1 );
tringleIndices.push_back( triangleIndex + 2 );
tringleIndices.push_back( triangleIndex + 0 );
tringleIndices.push_back( triangleIndex + 2 );
tringleIndices.push_back( triangleIndex + 3 );
}
}
}
m_vertices = vertices;
m_tringleIndices = tringleIndices;
} }
} }
m_vertices = vertices;
m_tringleIndices = tringleIndices;
} }
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
@ -242,7 +264,7 @@ void RimGridCaseSurface::updateUserDescription()
switch ( dirValue ) switch ( dirValue )
{ {
case RiaDefines::GridCaseAxis::AXIS_I: case RiaDefines::GridCaseAxis::AXIS_I:
name = "Surface I : %1"; name = "Surface I : ";
break; break;
case RiaDefines::GridCaseAxis::AXIS_J: case RiaDefines::GridCaseAxis::AXIS_J:
name = "Surface J : "; name = "Surface J : ";
@ -258,6 +280,12 @@ void RimGridCaseSurface::updateUserDescription()
name += QString::number( m_oneBasedSliceIndex ); name += QString::number( m_oneBasedSliceIndex );
const double epsilon = 1.0e-3;
if ( std::fabs( depthOffset() ) > epsilon )
{
name += ", Offset : " + QString::number( depthOffset() );
}
setUserDescription( name ); setUserDescription( name );
} }
@ -279,8 +307,8 @@ bool RimGridCaseSurface::updateSurfaceDataFromGridCase()
if ( !tringleIndices.empty() ) if ( !tringleIndices.empty() )
{ {
{ {
// Modify the z-value slightly to avoid geometrical numerical issues when the surface intersects exactly at // Modify the z-value slightly to avoid geometrical numerical issues when the surface intersects
// the cell face // exactly at the cell face
double delta = 1.0e-5; double delta = 1.0e-5;