mirror of
https://github.com/OPM/ResInsight.git
synced 2025-02-25 18:55:39 -06:00
parent
90a835545f
commit
3aa4ffb0da
@ -50,6 +50,7 @@ ${CMAKE_CURRENT_LIST_DIR}/RifDerivedEnsembleReader.h
|
||||
${CMAKE_CURRENT_LIST_DIR}/RifActiveCellsReader.h
|
||||
${CMAKE_CURRENT_LIST_DIR}/RifCsvDataTableFormatter.h
|
||||
${CMAKE_CURRENT_LIST_DIR}/RifEclipseInputPropertyLoader.h
|
||||
${CMAKE_CURRENT_LIST_DIR}/RifSurfaceReader.h
|
||||
|
||||
# HDF5 file reader is directly included in ResInsight main CmakeList.txt
|
||||
#${CMAKE_CURRENT_LIST_DIR}/RifHdf5Reader.h
|
||||
@ -104,6 +105,8 @@ ${CMAKE_CURRENT_LIST_DIR}/RifActiveCellsReader.cpp
|
||||
${CMAKE_CURRENT_LIST_DIR}/RifCsvDataTableFormatter.cpp
|
||||
${CMAKE_CURRENT_LIST_DIR}/RifReaderEnsembleStatisticsRft.cpp
|
||||
${CMAKE_CURRENT_LIST_DIR}/RifEclipseInputPropertyLoader.cpp
|
||||
${CMAKE_CURRENT_LIST_DIR}/RifSurfaceReader.cpp
|
||||
|
||||
|
||||
# HDF5 file reader is directly included in ResInsight main CmakeList.txt
|
||||
#${CMAKE_CURRENT_LIST_DIR}/RifHdf5Reader.cpp
|
||||
|
283
ApplicationCode/FileInterface/RifSurfaceReader.cpp
Normal file
283
ApplicationCode/FileInterface/RifSurfaceReader.cpp
Normal file
@ -0,0 +1,283 @@
|
||||
/////////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Copyright (C) 2020 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 "RifSurfaceReader.h"
|
||||
|
||||
#include "cvfVector3.h"
|
||||
|
||||
#include <fstream>
|
||||
#include <limits>
|
||||
#include <map>
|
||||
#include <sstream>
|
||||
#include <vector>
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
/// Import vertices and triangle IDs from the first TFACE section in the file
|
||||
/// Returns vertices with z-value as depth, z is increasing downwards
|
||||
///
|
||||
///
|
||||
///
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
std::pair<std::vector<cvf::Vec3d>, std::vector<unsigned>> RifSurfaceReader::readGocadFile( const QString& filename )
|
||||
{
|
||||
enum class GocadZPositive
|
||||
{
|
||||
Elevation,
|
||||
Depth,
|
||||
Unknown
|
||||
};
|
||||
|
||||
std::vector<cvf::Vec3d> vertices;
|
||||
std::map<int, unsigned> vertexIdToIndex;
|
||||
std::vector<unsigned> trianglesByIds;
|
||||
|
||||
{
|
||||
std::ifstream stream( filename.toLatin1().data() );
|
||||
|
||||
bool isInTfaceSection = false;
|
||||
while ( stream.good() )
|
||||
{
|
||||
std::string line;
|
||||
std::getline( stream, line );
|
||||
|
||||
std::transform( line.begin(), line.end(), line.begin(), ::toupper );
|
||||
|
||||
std::istringstream lineStream( line );
|
||||
|
||||
GocadZPositive zDir = GocadZPositive::Unknown;
|
||||
|
||||
std::string firstToken;
|
||||
lineStream >> firstToken;
|
||||
|
||||
if ( lineStream.good() ) // If we can, assume this line is a surface point
|
||||
{
|
||||
if ( isInTfaceSection )
|
||||
{
|
||||
if ( firstToken.compare( "VRTX" ) == 0 )
|
||||
{
|
||||
int vertexId = -1;
|
||||
double x{std::numeric_limits<double>::infinity()};
|
||||
double y{std::numeric_limits<double>::infinity()};
|
||||
double z{std::numeric_limits<double>::infinity()};
|
||||
std::string endVertex;
|
||||
|
||||
lineStream >> vertexId >> x >> y >> z >> endVertex;
|
||||
|
||||
if ( vertexId > -1 )
|
||||
{
|
||||
if ( zDir == GocadZPositive::Elevation ) z = -z;
|
||||
|
||||
vertices.emplace_back( cvf::Vec3d( x, y, z ) );
|
||||
vertexIdToIndex[vertexId] = static_cast<unsigned>( vertices.size() - 1 );
|
||||
}
|
||||
}
|
||||
else if ( firstToken.compare( "TRGL" ) == 0 )
|
||||
{
|
||||
int id1{-1};
|
||||
int id2{-1};
|
||||
int id3{-1};
|
||||
|
||||
lineStream >> id1 >> id2 >> id3;
|
||||
|
||||
if ( id1 >= 0 && id2 >= 0 && id3 >= 0 )
|
||||
{
|
||||
trianglesByIds.emplace_back( static_cast<unsigned int>( id1 ) );
|
||||
trianglesByIds.emplace_back( static_cast<unsigned int>( id2 ) );
|
||||
trianglesByIds.emplace_back( static_cast<unsigned int>( id3 ) );
|
||||
}
|
||||
}
|
||||
else if ( firstToken.compare( "END" ) == 0 )
|
||||
{
|
||||
isInTfaceSection = false;
|
||||
}
|
||||
}
|
||||
else if ( firstToken.compare( "TFACE" ) == 0 )
|
||||
{
|
||||
isInTfaceSection = true;
|
||||
}
|
||||
else if ( firstToken.compare( "ZPOSITIVE" ) == 0 )
|
||||
{
|
||||
std::string secondToken;
|
||||
lineStream >> secondToken;
|
||||
|
||||
if ( secondToken == "DEPTH" )
|
||||
{
|
||||
zDir = GocadZPositive::Depth;
|
||||
}
|
||||
else if ( secondToken == "ELEVATION" )
|
||||
{
|
||||
zDir = GocadZPositive::Elevation;
|
||||
}
|
||||
}
|
||||
}
|
||||
else // Probably a comment line, skip
|
||||
{
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
std::vector<unsigned> triangleIndices;
|
||||
if ( !trianglesByIds.empty() )
|
||||
{
|
||||
triangleIndices.reserve( trianglesByIds.size() );
|
||||
|
||||
for ( auto triangle : trianglesByIds )
|
||||
{
|
||||
auto vertexIndex = vertexIdToIndex[triangle];
|
||||
triangleIndices.push_back( vertexIndex );
|
||||
}
|
||||
}
|
||||
|
||||
return std::make_pair( vertices, triangleIndices );
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
std::pair<std::vector<cvf::Vec3d>, std::vector<unsigned>> RifSurfaceReader::readPetrelFile( const QString& filename )
|
||||
{
|
||||
std::ifstream stream( filename.toLatin1().data() );
|
||||
|
||||
struct SurfacePointData
|
||||
{
|
||||
int i;
|
||||
int j;
|
||||
cvf::Vec3d point;
|
||||
std::vector<double> values;
|
||||
};
|
||||
|
||||
std::vector<SurfacePointData> surfaceDataPoints;
|
||||
int minI = std::numeric_limits<int>::max();
|
||||
int minJ = std::numeric_limits<int>::max();
|
||||
int maxI = std::numeric_limits<int>::min();
|
||||
int maxJ = std::numeric_limits<int>::min();
|
||||
|
||||
while ( stream.good() )
|
||||
{
|
||||
std::string line;
|
||||
std::getline( stream, line );
|
||||
std::istringstream lineStream( line );
|
||||
|
||||
double x( HUGE_VAL ), y( HUGE_VAL ), z( HUGE_VAL );
|
||||
int i( -1 ), j( -1 );
|
||||
std::vector<double> values;
|
||||
|
||||
// First check if we can read a number
|
||||
|
||||
lineStream >> x;
|
||||
if ( lineStream.good() ) // If we can, assume this line is a surface point
|
||||
{
|
||||
lineStream >> y >> z >> i >> j;
|
||||
|
||||
if ( x != HUGE_VAL && y != HUGE_VAL && z != HUGE_VAL && i != -1 && j != -1 )
|
||||
{
|
||||
// Check for extra data
|
||||
while ( lineStream.good() )
|
||||
{
|
||||
double d;
|
||||
lineStream >> d;
|
||||
if ( lineStream.good() ) values.push_back( d );
|
||||
}
|
||||
|
||||
// Add point
|
||||
|
||||
surfaceDataPoints.push_back( {i, j, {x, y, z}, values} );
|
||||
|
||||
minI = std::min( minI, i );
|
||||
minJ = std::min( minJ, j );
|
||||
maxI = std::max( maxI, i );
|
||||
maxJ = std::max( maxJ, j );
|
||||
}
|
||||
}
|
||||
else // Probably a comment line, skip
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
// clang-format off
|
||||
if ( surfaceDataPoints.empty()
|
||||
|| minI == std::numeric_limits<int>::max()
|
||||
|| minJ == std::numeric_limits<int>::max()
|
||||
|| maxI == std::numeric_limits<int>::min()
|
||||
|| maxJ == std::numeric_limits<int>::min() )
|
||||
{
|
||||
return {};
|
||||
}
|
||||
// clang-format on
|
||||
|
||||
// Create full size grid matrix
|
||||
|
||||
size_t iCount = maxI - minI + 1;
|
||||
size_t jCount = maxJ - minJ + 1;
|
||||
|
||||
if ( iCount < 2 || jCount < 2 )
|
||||
{
|
||||
return {};
|
||||
}
|
||||
|
||||
std::vector<std::vector<unsigned>> indexToPointData;
|
||||
indexToPointData.resize( iCount, std::vector<unsigned>( jCount, -1 ) );
|
||||
std::vector<cvf::Vec3d> vertices;
|
||||
|
||||
for ( unsigned pIdx = 0; pIdx < surfaceDataPoints.size(); ++pIdx )
|
||||
{
|
||||
const auto& pointData = surfaceDataPoints[pIdx];
|
||||
|
||||
indexToPointData[pointData.i - minI][pointData.j - minJ] = pIdx;
|
||||
|
||||
vertices.push_back( pointData.point );
|
||||
// Todo: Move result values for each point into the
|
||||
}
|
||||
|
||||
std::vector<unsigned> triangleIndices;
|
||||
if ( indexToPointData.size() < 2 )
|
||||
{
|
||||
return {};
|
||||
}
|
||||
|
||||
for ( size_t iIdx = 0; iIdx < indexToPointData.size() - 1; ++iIdx )
|
||||
{
|
||||
for ( size_t jIdx = 0; jIdx < indexToPointData[iIdx].size() - 1; ++jIdx )
|
||||
{
|
||||
{
|
||||
unsigned q1 = indexToPointData[iIdx + 0][jIdx + 0];
|
||||
unsigned q2 = indexToPointData[iIdx + 0][jIdx + 1];
|
||||
unsigned q3 = indexToPointData[iIdx + 1][jIdx + 0];
|
||||
unsigned q4 = indexToPointData[iIdx + 1][jIdx + 1];
|
||||
|
||||
if ( q1 != ( (unsigned)-1 ) && q2 != ( (unsigned)-1 ) && q4 != ( (unsigned)-1 ) )
|
||||
{
|
||||
triangleIndices.push_back( q1 );
|
||||
triangleIndices.push_back( q2 );
|
||||
triangleIndices.push_back( q4 );
|
||||
}
|
||||
|
||||
if ( q1 != ( (unsigned)-1 ) && q2 != ( (unsigned)-1 ) && q3 != ( (unsigned)-1 ) )
|
||||
{
|
||||
triangleIndices.push_back( q1 );
|
||||
triangleIndices.push_back( q4 );
|
||||
triangleIndices.push_back( q3 );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return std::make_pair( vertices, triangleIndices );
|
||||
}
|
34
ApplicationCode/FileInterface/RifSurfaceReader.h
Normal file
34
ApplicationCode/FileInterface/RifSurfaceReader.h
Normal file
@ -0,0 +1,34 @@
|
||||
/////////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Copyright (C) 2020 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.
|
||||
//
|
||||
/////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "cvfVector3.h"
|
||||
|
||||
#include <utility>
|
||||
#include <vector>
|
||||
|
||||
#include <QString>
|
||||
|
||||
class RifSurfaceReader
|
||||
{
|
||||
public:
|
||||
static std::pair<std::vector<cvf::Vec3d>, std::vector<unsigned>> readGocadFile( const QString& filename );
|
||||
|
||||
static std::pair<std::vector<cvf::Vec3d>, std::vector<unsigned>> readPetrelFile( const QString& filename );
|
||||
};
|
@ -15,19 +15,17 @@
|
||||
// for more details.
|
||||
//
|
||||
/////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "RimSurface.h"
|
||||
|
||||
#include "RimSurfaceCollection.h"
|
||||
|
||||
#include "RigSurface.h"
|
||||
|
||||
#include "RifSurfaceReader.h"
|
||||
|
||||
#include <QFileInfo>
|
||||
|
||||
#include <cmath>
|
||||
|
||||
#include <fstream>
|
||||
#include <sstream>
|
||||
|
||||
CAF_PDM_SOURCE_INIT( RimSurface, "Surface" );
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
@ -130,139 +128,38 @@ void RimSurface::fieldChangedByUi( const caf::PdmFieldHandle* changedField, cons
|
||||
}
|
||||
}
|
||||
|
||||
struct SurfacePointData
|
||||
{
|
||||
int i;
|
||||
int j;
|
||||
cvf::Vec3d point;
|
||||
std::vector<double> values;
|
||||
};
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
/// Returns false for fatal failure
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
bool RimSurface::updateSurfaceDataFromFile()
|
||||
{
|
||||
std::ifstream stream( this->surfaceFilePath().toLatin1().data() );
|
||||
QString filePath = this->surfaceFilePath();
|
||||
|
||||
std::vector<SurfacePointData> surfaceDataPoints;
|
||||
int minI = std::numeric_limits<int>::max();
|
||||
int minJ = std::numeric_limits<int>::max();
|
||||
int maxI = std::numeric_limits<int>::min();
|
||||
int maxJ = std::numeric_limits<int>::min();
|
||||
|
||||
while ( stream.good() )
|
||||
{
|
||||
std::string line;
|
||||
std::getline( stream, line );
|
||||
std::istringstream lineStream( line );
|
||||
|
||||
double x( HUGE_VAL ), y( HUGE_VAL ), z( HUGE_VAL );
|
||||
int i( -1 ), j( -1 );
|
||||
std::vector<double> values;
|
||||
|
||||
// First check if we can read a number
|
||||
|
||||
lineStream >> x;
|
||||
if ( lineStream.good() ) // If we can, assume this line is a surface point
|
||||
{
|
||||
lineStream >> y >> z >> i >> j;
|
||||
|
||||
if ( x != HUGE_VAL && y != HUGE_VAL && z != HUGE_VAL && i != -1 && j != -1 )
|
||||
{
|
||||
// Check for extra data
|
||||
while ( lineStream.good() )
|
||||
{
|
||||
double d;
|
||||
lineStream >> d;
|
||||
if ( lineStream.good() ) values.push_back( d );
|
||||
}
|
||||
|
||||
// Add point
|
||||
|
||||
surfaceDataPoints.push_back( {i, j, {x, y, z}, values} );
|
||||
|
||||
minI = std::min( minI, i );
|
||||
minJ = std::min( minJ, j );
|
||||
maxI = std::max( maxI, i );
|
||||
maxJ = std::max( maxJ, j );
|
||||
}
|
||||
}
|
||||
else // Probably a comment line, skip
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
// clang-format off
|
||||
if ( surfaceDataPoints.empty()
|
||||
|| minI == std::numeric_limits<int>::max()
|
||||
|| minJ == std::numeric_limits<int>::max()
|
||||
|| maxI == std::numeric_limits<int>::min()
|
||||
|| maxJ == std::numeric_limits<int>::min() )
|
||||
{
|
||||
return false;
|
||||
}
|
||||
// clang-format on
|
||||
|
||||
// Create full size grid matrix
|
||||
|
||||
size_t iCount = maxI - minI + 1;
|
||||
size_t jCount = maxJ - minJ + 1;
|
||||
|
||||
if ( iCount < 2 || jCount < 2 )
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
std::vector<std::vector<unsigned>> indexToPointData;
|
||||
indexToPointData.resize( iCount, std::vector<unsigned>( jCount, -1 ) );
|
||||
std::vector<unsigned> tringleIndices;
|
||||
std::vector<cvf::Vec3d> vertices;
|
||||
|
||||
for ( unsigned pIdx = 0; pIdx < surfaceDataPoints.size(); ++pIdx )
|
||||
if ( filePath.endsWith( "ptl", Qt::CaseInsensitive ) )
|
||||
{
|
||||
const auto& pointData = surfaceDataPoints[pIdx];
|
||||
auto surface = RifSurfaceReader::readPetrelFile( filePath );
|
||||
|
||||
indexToPointData[pointData.i - minI][pointData.j - minJ] = pIdx;
|
||||
vertices = surface.first;
|
||||
tringleIndices = surface.second;
|
||||
}
|
||||
else if ( filePath.endsWith( "ts", Qt::CaseInsensitive ) )
|
||||
{
|
||||
auto surface = RifSurfaceReader::readGocadFile( filePath );
|
||||
|
||||
vertices.push_back( pointData.point );
|
||||
// Todo: Move result values for each point into the
|
||||
vertices = surface.first;
|
||||
tringleIndices = surface.second;
|
||||
}
|
||||
|
||||
std::vector<unsigned> triangleIndices;
|
||||
if ( indexToPointData.size() < 2 )
|
||||
if ( !vertices.empty() && !tringleIndices.empty() )
|
||||
{
|
||||
return false;
|
||||
m_surfaceData = new RigSurface();
|
||||
m_surfaceData->setTriangleData( tringleIndices, vertices );
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
for ( size_t iIdx = 0; iIdx < indexToPointData.size() - 1; ++iIdx )
|
||||
{
|
||||
for ( size_t jIdx = 0; jIdx < indexToPointData[iIdx].size() - 1; ++jIdx )
|
||||
{
|
||||
{
|
||||
unsigned q1 = indexToPointData[iIdx + 0][jIdx + 0];
|
||||
unsigned q2 = indexToPointData[iIdx + 0][jIdx + 1];
|
||||
unsigned q3 = indexToPointData[iIdx + 1][jIdx + 0];
|
||||
unsigned q4 = indexToPointData[iIdx + 1][jIdx + 1];
|
||||
|
||||
if ( q1 != ( (unsigned)-1 ) && q2 != ( (unsigned)-1 ) && q4 != ( (unsigned)-1 ) )
|
||||
{
|
||||
triangleIndices.push_back( q1 );
|
||||
triangleIndices.push_back( q2 );
|
||||
triangleIndices.push_back( q4 );
|
||||
}
|
||||
|
||||
if ( q1 != ( (unsigned)-1 ) && q2 != ( (unsigned)-1 ) && q3 != ( (unsigned)-1 ) )
|
||||
{
|
||||
triangleIndices.push_back( q1 );
|
||||
triangleIndices.push_back( q4 );
|
||||
triangleIndices.push_back( q3 );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
m_surfaceData = new RigSurface();
|
||||
m_surfaceData->setTriangleData( triangleIndices, vertices );
|
||||
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
@ -65,6 +65,7 @@ ${CMAKE_CURRENT_LIST_DIR}/RiaStdStringTools-Test.cpp
|
||||
${CMAKE_CURRENT_LIST_DIR}/RifWellMeasurementReader-Test.cpp
|
||||
${CMAKE_CURRENT_LIST_DIR}/RiaDateStringParser-Test.cpp
|
||||
${CMAKE_CURRENT_LIST_DIR}/RigHexGradientTools-Test.cpp
|
||||
${CMAKE_CURRENT_LIST_DIR}/RifSurfaceReader-Test.cpp
|
||||
)
|
||||
|
||||
if (RESINSIGHT_ENABLE_GRPC)
|
||||
|
98
ApplicationCode/UnitTests/RifSurfaceReader-Test.cpp
Normal file
98
ApplicationCode/UnitTests/RifSurfaceReader-Test.cpp
Normal file
@ -0,0 +1,98 @@
|
||||
#include "gtest/gtest.h"
|
||||
|
||||
#include "RifSurfaceReader.h"
|
||||
|
||||
#include "QDir"
|
||||
#include "RiaTestDataDirectory.h"
|
||||
#include <QString>
|
||||
#include <QStringList>
|
||||
|
||||
TEST( RifSurfaceReader, GocadReadValidFile )
|
||||
{
|
||||
QDir baseFolder( TEST_DATA_DIR );
|
||||
|
||||
QString filename( "RifSurfaceReader/tsurf_eks.ts" );
|
||||
QString filePath = baseFolder.absoluteFilePath( filename );
|
||||
EXPECT_TRUE( QFile::exists( filePath ) );
|
||||
|
||||
auto surface = RifSurfaceReader::readGocadFile( filePath );
|
||||
|
||||
auto vertices = surface.first;
|
||||
auto indices = surface.second;
|
||||
|
||||
EXPECT_EQ( (size_t)159, vertices.size() );
|
||||
EXPECT_EQ( (size_t)759, indices.size() );
|
||||
|
||||
EXPECT_EQ( (size_t)4, indices.front() );
|
||||
EXPECT_EQ( (size_t)64, indices.back() );
|
||||
}
|
||||
|
||||
TEST( RifSurfaceReader, GocadReadWrongIndices )
|
||||
{
|
||||
QDir baseFolder( TEST_DATA_DIR );
|
||||
|
||||
QString filename( "RifSurfaceReader/tsurf_invalid.ts" );
|
||||
QString filePath = baseFolder.absoluteFilePath( filename );
|
||||
EXPECT_TRUE( QFile::exists( filePath ) );
|
||||
|
||||
auto surface = RifSurfaceReader::readGocadFile( filePath );
|
||||
|
||||
auto vertices = surface.first;
|
||||
auto indices = surface.second;
|
||||
|
||||
EXPECT_EQ( (size_t)18, vertices.size() );
|
||||
EXPECT_EQ( (size_t)15, indices.size() );
|
||||
}
|
||||
|
||||
TEST( RifSurfaceReader, ReadWrongFileType )
|
||||
{
|
||||
QDir baseFolder( TEST_DATA_DIR );
|
||||
|
||||
{
|
||||
QString filename( "RifSurfaceReader/test.ptl" );
|
||||
QString filePath = baseFolder.absoluteFilePath( filename );
|
||||
EXPECT_TRUE( QFile::exists( filePath ) );
|
||||
|
||||
auto surface = RifSurfaceReader::readGocadFile( filePath );
|
||||
|
||||
auto vertices = surface.first;
|
||||
auto indices = surface.second;
|
||||
|
||||
EXPECT_EQ( (size_t)0, vertices.size() );
|
||||
EXPECT_EQ( (size_t)0, indices.size() );
|
||||
}
|
||||
|
||||
{
|
||||
QString filename( "RifSurfaceReader/tsurf_eks.ts" );
|
||||
QString filePath = baseFolder.absoluteFilePath( filename );
|
||||
EXPECT_TRUE( QFile::exists( filePath ) );
|
||||
|
||||
auto surface = RifSurfaceReader::readPetrelFile( filePath );
|
||||
|
||||
auto vertices = surface.first;
|
||||
auto indices = surface.second;
|
||||
|
||||
EXPECT_EQ( (size_t)0, vertices.size() );
|
||||
EXPECT_EQ( (size_t)0, indices.size() );
|
||||
}
|
||||
}
|
||||
|
||||
TEST( RifSurfaceReader, ReadPetrelData )
|
||||
{
|
||||
QDir baseFolder( TEST_DATA_DIR );
|
||||
|
||||
QString filename( "RifSurfaceReader/test.ptl" );
|
||||
QString filePath = baseFolder.absoluteFilePath( filename );
|
||||
EXPECT_TRUE( QFile::exists( filePath ) );
|
||||
|
||||
auto surface = RifSurfaceReader::readPetrelFile( filePath );
|
||||
|
||||
auto vertices = surface.first;
|
||||
auto indices = surface.second;
|
||||
|
||||
EXPECT_EQ( (size_t)3441, vertices.size() );
|
||||
EXPECT_EQ( (size_t)19872, indices.size() );
|
||||
|
||||
EXPECT_EQ( (size_t)0, indices.front() );
|
||||
EXPECT_EQ( (size_t)3439, indices.back() );
|
||||
}
|
3460
ApplicationCode/UnitTests/TestData/RifSurfaceReader/test.ptl
Normal file
3460
ApplicationCode/UnitTests/TestData/RifSurfaceReader/test.ptl
Normal file
File diff suppressed because it is too large
Load Diff
424
ApplicationCode/UnitTests/TestData/RifSurfaceReader/tsurf_eks.ts
Normal file
424
ApplicationCode/UnitTests/TestData/RifSurfaceReader/tsurf_eks.ts
Normal file
@ -0,0 +1,424 @@
|
||||
GOCAD TSurf 1
|
||||
HEADER {
|
||||
name:MF_027_SU
|
||||
}
|
||||
GOCAD_ORIGINAL_COORDINATE_SYSTEM
|
||||
NAME Default
|
||||
AXIS_NAME "X" "Y" "Z"
|
||||
AXIS_UNIT "m" "m" "m"
|
||||
ZPOSITIVE Depth
|
||||
END_ORIGINAL_COORDINATE_SYSTEM
|
||||
TFACE
|
||||
VRTX 1 458177.767090 7322538.712891 1643.655884 CNXYZ
|
||||
VRTX 2 458260.834961 7322392.890625 1596.685303 CNXYZ
|
||||
VRTX 3 457985.662109 7322783.783203 1542.060059 CNXYZ
|
||||
VRTX 4 459601.453125 7322511.427734 3639.000000 CNXYZ
|
||||
VRTX 5 459422.015625 7322689.230469 3639.000000 CNXYZ
|
||||
VRTX 6 459793.410156 7322338.230469 3639.000000 CNXYZ
|
||||
VRTX 7 459616.880859 7322495.375000 3639.000000 CNXYZ
|
||||
VRTX 8 460030.848633 7322128.310547 3639.000000 CNXYZ
|
||||
VRTX 9 459179.382812 7322989.664062 3639.000000 CNXYZ
|
||||
VRTX 10 459936.319336 7322211.853516 3639.000000 CNXYZ
|
||||
VRTX 11 459145.378906 7323030.423828 3639.000000 CNXYZ
|
||||
VRTX 12 460040.416992 7322100.015625 3605.431396 CNXYZ
|
||||
VRTX 13 459813.896484 7322094.666016 3300.016357 CNXYZ
|
||||
VRTX 14 459537.420898 7322102.763672 2913.130371 CNXYZ
|
||||
VRTX 15 459328.371094 7322095.460938 2621.950439 CNXYZ
|
||||
VRTX 16 459130.446289 7322101.109375 2342.761963 CNXYZ
|
||||
VRTX 17 458796.097656 7322106.908203 1911.423950 CNXYZ
|
||||
VRTX 18 458589.033203 7322162.617188 1708.341797 CNXYZ
|
||||
VRTX 19 458383.650391 7322284.027344 1606.080200 CNXYZ
|
||||
VRTX 20 458459.350586 7322216.578125 1620.383667 CNXYZ
|
||||
VRTX 21 458048.184082 7322674.744141 1561.000488 CNXYZ
|
||||
VRTX 22 458088.230957 7322600.175781 1573.321289 CNXYZ
|
||||
VRTX 23 458147.718262 7322513.207031 1585.333252 CNXYZ
|
||||
VRTX 24 458173.104980 7322480.888672 1587.382812 CNXYZ
|
||||
VRTX 25 457875.032715 7322950.904297 1521.282715 CNXYZ
|
||||
VRTX 26 457859.782715 7322970.824219 1518.259644 CNXYZ
|
||||
VRTX 27 457795.973633 7323149.302734 1605.583252 CNXYZ
|
||||
VRTX 28 457949.114746 7323148.427734 1836.895386 CNXYZ
|
||||
VRTX 29 458097.919434 7323149.015625 2058.100464 CNXYZ
|
||||
VRTX 30 458249.688965 7323150.935547 2287.947021 CNXYZ
|
||||
VRTX 31 458587.447266 7323143.570312 2840.253906 CNXYZ
|
||||
VRTX 32 458895.030273 7323091.224609 3298.434082 CNXYZ
|
||||
VRTX 33 459295.081055 7322840.783203 3639.000000 CNXYZ
|
||||
VRTX 34 459377.336914 7322739.859375 3639.000000 CNXYZ
|
||||
VRTX 35 460059.521484 7322104.042969 3639.000000 CNXYZ
|
||||
VRTX 36 459126.174805 7323053.722656 3639.000000 CNXYZ
|
||||
VRTX 37 458096.370605 7322585.197266 1577.075806 CNXYZ
|
||||
VRTX 38 457854.595215 7323017.906250 1556.505981 CNXYZ
|
||||
VRTX 39 457909.464844 7323026.583984 1653.324707 CNXYZ
|
||||
VRTX 40 458141.132324 7322522.400391 1584.301636 CNXYZ
|
||||
VRTX 41 458019.599121 7322723.421875 1553.142212 CNXYZ
|
||||
VRTX 42 457924.387695 7322928.337891 1572.006470 CNXYZ
|
||||
VRTX 43 458015.055176 7322890.453125 1707.950195 CNXYZ
|
||||
VRTX 44 458122.078613 7322716.990234 1749.458862 CNXYZ
|
||||
VRTX 45 458461.229980 7322582.322266 2069.497192 CNXYZ
|
||||
VRTX 46 458309.607422 7322507.671875 1762.649902 CNXYZ
|
||||
VRTX 47 458435.317871 7322463.486328 1863.328003 CNXYZ
|
||||
VRTX 48 458499.800781 7322616.632812 2156.050171 CNXYZ
|
||||
VRTX 49 458358.990234 7322707.757812 2067.609863 CNXYZ
|
||||
VRTX 50 458575.869629 7322449.525391 2059.716431 CNXYZ
|
||||
VRTX 51 458198.585449 7322666.298828 1823.467407 CNXYZ
|
||||
VRTX 52 458634.837402 7322609.085938 2321.645020 CNXYZ
|
||||
VRTX 53 458866.820312 7322521.746094 2503.908447 CNXYZ
|
||||
VRTX 54 458868.068359 7322929.089844 3041.555664 CNXYZ
|
||||
VRTX 55 458699.440430 7322709.812500 2529.770264 CNXYZ
|
||||
VRTX 56 459014.943359 7322554.476562 2748.096924 CNXYZ
|
||||
VRTX 57 458230.912109 7323031.333984 2152.232300 CNXYZ
|
||||
VRTX 58 459273.477539 7322403.724609 2905.961670 CNXYZ
|
||||
VRTX 59 459419.110352 7322583.626953 3422.541016 CNXYZ
|
||||
VRTX 60 459629.521484 7322220.222656 3202.375977 CNXYZ
|
||||
VRTX 61 458235.627441 7322415.072266 1596.825073 CNXYZ
|
||||
VRTX 62 458176.366211 7322477.550781 1587.787720 CNXYZ
|
||||
VRTX 63 457973.237305 7322823.136719 1550.489868 CNXYZ
|
||||
VRTX 64 458237.453613 7322485.976562 1658.464111 CNXYZ
|
||||
VRTX 65 458412.726074 7322338.537109 1669.145874 CNXYZ
|
||||
VRTX 66 458500.712891 7322258.957031 1689.554199 CNXYZ
|
||||
VRTX 67 458419.841309 7322259.925781 1615.844727 CNXYZ
|
||||
VRTX 68 458052.160156 7322667.785156 1561.946777 CNXYZ
|
||||
VRTX 69 458487.901367 7322347.240234 1763.931274 CNXYZ
|
||||
VRTX 70 458591.630859 7322241.416016 1787.865601 CNXYZ
|
||||
VRTX 71 458069.116699 7322638.171875 1565.946167 CNXYZ
|
||||
VRTX 72 458987.789062 7322884.470703 3180.473877 CNXYZ
|
||||
VRTX 73 458829.945312 7322357.000000 2262.506836 CNXYZ
|
||||
VRTX 74 458981.785156 7322336.935547 2417.984131 CNXYZ
|
||||
VRTX 75 459177.719727 7322353.500000 2709.770264 CNXYZ
|
||||
VRTX 76 459279.476562 7322580.640625 3169.244385 CNXYZ
|
||||
VRTX 77 457952.824219 7322837.699219 1532.863647 CNXYZ
|
||||
VRTX 78 459478.712891 7322372.994141 3167.904297 CNXYZ
|
||||
VRTX 79 459684.708984 7322312.841797 3432.800293 CNXYZ
|
||||
VRTX 80 458090.525391 7322944.980469 1897.692017 CNXYZ
|
||||
VRTX 81 458189.041504 7322762.498047 1903.077026 CNXYZ
|
||||
VRTX 82 458295.914551 7322606.107422 1882.635864 CNXYZ
|
||||
VRTX 83 458344.800781 7322903.246094 2211.540771 CNXYZ
|
||||
VRTX 84 458684.767578 7322845.986328 2671.377930 CNXYZ
|
||||
VRTX 85 458828.768555 7322811.464844 2840.762451 CNXYZ
|
||||
VRTX 86 458420.545898 7322560.634766 1989.528076 CNXYZ
|
||||
VRTX 87 458310.723145 7322457.267578 1698.750488 CNXYZ
|
||||
VRTX 88 458209.796875 7322593.218750 1752.251587 CNXYZ
|
||||
VRTX 89 458812.488281 7322691.701172 2665.967285 CNXYZ
|
||||
VRTX 90 458473.521973 7322741.050781 2245.679443 CNXYZ
|
||||
VRTX 91 458099.540039 7322824.335938 1816.084473 CNXYZ
|
||||
VRTX 92 459054.166992 7322711.535156 3034.757080 CNXYZ
|
||||
VRTX 93 459286.783203 7322798.351562 3551.294189 CNXYZ
|
||||
VRTX 94 457964.674805 7322818.908203 1535.714111 CNXYZ
|
||||
VRTX 95 457976.891602 7322799.078125 1538.975586 CNXYZ
|
||||
VRTX 96 458049.896484 7322729.902344 1606.723633 CNXYZ
|
||||
VRTX 97 458125.274902 7322597.470703 1623.894165 CNXYZ
|
||||
VRTX 98 458322.083008 7322401.595703 1649.571045 CNXYZ
|
||||
VRTX 99 459147.886719 7322810.125000 3334.427734 CNXYZ
|
||||
VRTX 100 458382.282227 7322424.900391 1729.966309 CNXYZ
|
||||
VRTX 101 458218.039551 7322915.519531 2050.547852 CNXYZ
|
||||
VRTX 102 459088.072266 7322336.462891 2557.286133 CNXYZ
|
||||
VRTX 103 458523.149414 7322871.179688 2449.392090 CNXYZ
|
||||
VRTX 104 458577.968262 7322323.900391 1875.113770 CNXYZ
|
||||
VRTX 105 459794.124023 7322247.449219 3485.894531 CNXYZ
|
||||
VRTX 106 458336.148438 7322925.847656 2218.498535 CNXYZ
|
||||
VRTX 107 458335.696289 7322926.857422 2218.840576 CNXYZ
|
||||
VRTX 108 458678.346680 7322290.097656 1990.712769 CNXYZ
|
||||
VRTX 109 458576.956543 7322384.416016 1964.040771 CNXYZ
|
||||
VRTX 110 458365.427734 7322534.988281 1873.007935 CNXYZ
|
||||
VRTX 111 458299.468750 7322580.552734 1851.488770 CNXYZ
|
||||
VRTX 112 459870.901367 7322269.703125 3639.000000 CNXYZ
|
||||
VRTX 113 459800.634766 7322117.062500 3313.645996 CNXYZ
|
||||
VRTX 114 459792.485352 7322109.246094 3288.677979 CNXYZ
|
||||
VRTX 115 458812.302734 7322226.648438 2079.518188 CNXYZ
|
||||
VRTX 116 458199.267578 7322661.847656 1819.130737 CNXYZ
|
||||
VRTX 117 458195.770020 7322668.164062 1820.744385 CNXYZ
|
||||
VRTX 118 458263.174316 7322601.207031 1833.067749 CNXYZ
|
||||
VRTX 119 458472.453125 7322459.796875 1915.216553 CNXYZ
|
||||
VRTX 120 458431.303223 7322489.890625 1897.629272 CNXYZ
|
||||
VRTX 121 458257.671387 7322857.103516 2055.345093 CNXYZ
|
||||
VRTX 122 458901.760742 7322105.074219 2047.739380 CNXYZ
|
||||
VRTX 123 458311.706055 7322906.451172 2169.509644 CNXYZ
|
||||
VRTX 124 458332.239746 7322917.375000 2204.999268 CNXYZ
|
||||
VRTX 125 459799.450195 7322095.089844 3279.802246 CNXYZ
|
||||
VRTX 126 458167.826172 7322777.156250 1882.456299 CNXYZ
|
||||
VRTX 127 458172.807617 7322792.568359 1902.189697 CNXYZ
|
||||
VRTX 128 458201.590332 7322828.722656 1966.898193 CNXYZ
|
||||
VRTX 129 458171.331543 7322750.462891 1862.450195 CNXYZ
|
||||
VRTX 130 458406.225586 7322990.794922 2380.363037 CNXYZ
|
||||
VRTX 131 458451.502441 7323146.535156 2617.953857 CNXYZ
|
||||
VRTX 132 459851.490234 7322257.962891 3589.948486 CNXYZ
|
||||
VRTX 133 458410.617188 7323008.318359 2405.930420 CNXYZ
|
||||
VRTX 134 458835.305664 7322179.267578 2051.578247 CNXYZ
|
||||
VRTX 135 459793.491211 7322105.347656 3284.920410 CNXYZ
|
||||
VRTX 136 458550.594727 7322403.085938 1951.207275 CNXYZ
|
||||
VRTX 137 458488.911133 7322446.917969 1921.399292 CNXYZ
|
||||
VRTX 138 458786.207031 7322267.523438 2097.433594 CNXYZ
|
||||
VRTX 139 458195.669922 7322668.505859 1820.916138 CNXYZ
|
||||
VRTX 140 458416.476074 7322497.082031 1887.608398 CNXYZ
|
||||
VRTX 141 458259.861816 7322861.921875 2062.322388 CNXYZ
|
||||
VRTX 142 458214.324219 7322836.988281 1988.320923 CNXYZ
|
||||
VRTX 143 458335.315918 7322924.982422 2216.508545 CNXYZ
|
||||
VRTX 144 458295.024414 7322583.701172 1850.098633 CNXYZ
|
||||
VRTX 145 458168.791016 7322760.464844 1867.934814 CNXYZ
|
||||
VRTX 146 457779.149414 7323074.775391 1506.328247 CNXYZ
|
||||
VRTX 147 457813.149902 7323031.365234 1510.986084 CNXYZ
|
||||
VRTX 148 458160.222168 7322495.822266 1587.346313 CNXYZ
|
||||
VRTX 149 457860.265137 7322970.205078 1518.343750 CNXYZ
|
||||
VRTX 150 458493.330566 7322180.050781 1625.800171 CNXYZ
|
||||
VRTX 151 458483.084473 7322191.451172 1623.780762 CNXYZ
|
||||
VRTX 152 458393.652344 7322275.582031 1607.443726 CNXYZ
|
||||
VRTX 153 458438.866211 7322235.679688 1615.553467 CNXYZ
|
||||
VRTX 154 458416.014160 7322256.242188 1611.008545 CNXYZ
|
||||
VRTX 155 458348.340820 7322315.923828 1602.818848 CNXYZ
|
||||
VRTX 156 458331.718262 7322330.572266 1601.627808 CNXYZ
|
||||
VRTX 157 458266.294922 7322388.318359 1596.853027 CNXYZ
|
||||
VRTX 158 457884.118652 7322938.193359 1522.275879 CNXYZ
|
||||
VRTX 159 457915.116211 7322893.578125 1526.542969 CNXYZ
|
||||
TRGL 5 4 59
|
||||
TRGL 4 7 79
|
||||
TRGL 7 6 79
|
||||
TRGL 10 8 12
|
||||
TRGL 6 112 132
|
||||
TRGL 11 9 99
|
||||
TRGL 9 33 93
|
||||
TRGL 33 34 93
|
||||
TRGL 34 5 59
|
||||
TRGL 8 35 12
|
||||
TRGL 36 11 99
|
||||
TRGL 31 32 54
|
||||
TRGL 131 31 103
|
||||
TRGL 29 30 57
|
||||
TRGL 28 29 80
|
||||
TRGL 27 28 39
|
||||
TRGL 146 27 38
|
||||
TRGL 34 59 93
|
||||
TRGL 36 99 32
|
||||
TRGL 99 9 93
|
||||
TRGL 4 79 59
|
||||
TRGL 127 91 80
|
||||
TRGL 91 127 126
|
||||
TRGL 80 128 127
|
||||
TRGL 128 80 101
|
||||
TRGL 91 145 129
|
||||
TRGL 145 91 126
|
||||
TRGL 91 129 44
|
||||
TRGL 17 18 70
|
||||
TRGL 122 17 134
|
||||
TRGL 15 16 102
|
||||
TRGL 14 15 58
|
||||
TRGL 125 14 60
|
||||
TRGL 12 13 113
|
||||
TRGL 79 6 105
|
||||
TRGL 10 12 105
|
||||
TRGL 145 81 129
|
||||
TRGL 81 145 126
|
||||
TRGL 57 123 101
|
||||
TRGL 123 57 124
|
||||
TRGL 42 38 39
|
||||
TRGL 38 42 25
|
||||
TRGL 88 1 97
|
||||
TRGL 1 88 64
|
||||
TRGL 148 1 24
|
||||
TRGL 1 148 23
|
||||
TRGL 1 64 62
|
||||
TRGL 49 141 123
|
||||
TRGL 141 49 121
|
||||
TRGL 49 123 83
|
||||
TRGL 141 101 123
|
||||
TRGL 101 141 121
|
||||
TRGL 142 101 121
|
||||
TRGL 101 142 128
|
||||
TRGL 81 142 49
|
||||
TRGL 142 81 128
|
||||
TRGL 49 142 121
|
||||
TRGL 135 60 114
|
||||
TRGL 60 135 125
|
||||
TRGL 86 45 50
|
||||
TRGL 45 86 49
|
||||
TRGL 13 135 114
|
||||
TRGL 135 13 125
|
||||
TRGL 113 60 79
|
||||
TRGL 60 113 114
|
||||
TRGL 40 97 1
|
||||
TRGL 97 40 37
|
||||
TRGL 66 67 65
|
||||
TRGL 67 66 153
|
||||
TRGL 49 48 45
|
||||
TRGL 48 49 90
|
||||
TRGL 45 48 50
|
||||
TRGL 52 48 90
|
||||
TRGL 48 52 50
|
||||
TRGL 70 66 69
|
||||
TRGL 66 70 18
|
||||
TRGL 119 47 120
|
||||
TRGL 47 119 137
|
||||
TRGL 108 17 104
|
||||
TRGL 17 108 115
|
||||
TRGL 73 16 122
|
||||
TRGL 16 73 74
|
||||
TRGL 16 74 102
|
||||
TRGL 116 51 118
|
||||
TRGL 51 116 117
|
||||
TRGL 81 51 129
|
||||
TRGL 51 81 82
|
||||
TRGL 75 15 102
|
||||
TRGL 15 75 58
|
||||
TRGL 76 58 92
|
||||
TRGL 58 76 78
|
||||
TRGL 78 14 58
|
||||
TRGL 14 78 60
|
||||
TRGL 113 13 114
|
||||
TRGL 12 113 105
|
||||
TRGL 38 27 39
|
||||
TRGL 39 28 43
|
||||
TRGL 107 124 57
|
||||
TRGL 124 107 143
|
||||
TRGL 107 57 30
|
||||
TRGL 51 82 118
|
||||
TRGL 39 43 42
|
||||
TRGL 80 43 28
|
||||
TRGL 43 80 91
|
||||
TRGL 43 91 44
|
||||
TRGL 110 47 46
|
||||
TRGL 47 110 140
|
||||
TRGL 17 70 104
|
||||
TRGL 29 57 101
|
||||
TRGL 143 107 106
|
||||
TRGL 152 67 154
|
||||
TRGL 67 152 65
|
||||
TRGL 99 72 32
|
||||
TRGL 72 99 92
|
||||
TRGL 31 54 85
|
||||
TRGL 117 44 139
|
||||
TRGL 44 117 116
|
||||
TRGL 52 90 103
|
||||
TRGL 89 53 55
|
||||
TRGL 53 89 56
|
||||
TRGL 85 56 89
|
||||
TRGL 56 85 92
|
||||
TRGL 92 58 56
|
||||
TRGL 93 59 99
|
||||
TRGL 92 54 72
|
||||
TRGL 54 92 85
|
||||
TRGL 72 54 32
|
||||
TRGL 52 55 53
|
||||
TRGL 55 52 103
|
||||
TRGL 83 143 106
|
||||
TRGL 143 83 124
|
||||
TRGL 131 103 133
|
||||
TRGL 133 103 130
|
||||
TRGL 147 38 26
|
||||
TRGL 38 147 146
|
||||
TRGL 158 42 159
|
||||
TRGL 42 158 25
|
||||
TRGL 30 133 130
|
||||
TRGL 133 30 131
|
||||
TRGL 130 106 107
|
||||
TRGL 106 130 83
|
||||
TRGL 83 130 103
|
||||
TRGL 43 44 96
|
||||
TRGL 97 44 88
|
||||
TRGL 44 97 96
|
||||
TRGL 42 43 63
|
||||
TRGL 88 44 116
|
||||
TRGL 87 46 100
|
||||
TRGL 46 87 64
|
||||
TRGL 46 47 100
|
||||
TRGL 100 47 69
|
||||
TRGL 120 47 140
|
||||
TRGL 64 87 98
|
||||
TRGL 87 100 98
|
||||
TRGL 64 88 46
|
||||
TRGL 108 104 109
|
||||
TRGL 85 89 84
|
||||
TRGL 84 55 103
|
||||
TRGL 55 84 89
|
||||
TRGL 103 90 83
|
||||
TRGL 109 50 108
|
||||
TRGL 50 109 136
|
||||
TRGL 50 52 73
|
||||
TRGL 90 49 83
|
||||
TRGL 50 73 138
|
||||
TRGL 118 88 116
|
||||
TRGL 88 118 46
|
||||
TRGL 82 86 110
|
||||
TRGL 86 82 49
|
||||
TRGL 110 46 111
|
||||
TRGL 79 60 78
|
||||
TRGL 52 53 73
|
||||
TRGL 53 56 102
|
||||
TRGL 102 56 75
|
||||
TRGL 56 58 75
|
||||
TRGL 86 50 119
|
||||
TRGL 99 59 76
|
||||
TRGL 79 78 59
|
||||
TRGL 6 132 105
|
||||
TRGL 63 43 96
|
||||
TRGL 70 69 104
|
||||
TRGL 66 18 150
|
||||
TRGL 66 65 69
|
||||
TRGL 67 153 154
|
||||
TRGL 10 132 112
|
||||
TRGL 132 10 105
|
||||
TRGL 134 17 115
|
||||
TRGL 122 115 73
|
||||
TRGL 115 122 134
|
||||
TRGL 98 100 65
|
||||
TRGL 69 47 104
|
||||
TRGL 53 74 73
|
||||
TRGL 74 53 102
|
||||
TRGL 76 59 78
|
||||
TRGL 151 66 150
|
||||
TRGL 66 151 20
|
||||
TRGL 138 73 115
|
||||
TRGL 50 138 108
|
||||
TRGL 80 29 101
|
||||
TRGL 81 49 82
|
||||
TRGL 115 108 138
|
||||
TRGL 31 84 103
|
||||
TRGL 84 31 85
|
||||
TRGL 51 139 129
|
||||
TRGL 139 51 117
|
||||
TRGL 97 37 22
|
||||
TRGL 156 98 65
|
||||
TRGL 98 156 157
|
||||
TRGL 69 65 100
|
||||
TRGL 96 97 71
|
||||
TRGL 139 44 129
|
||||
TRGL 144 46 118
|
||||
TRGL 46 144 111
|
||||
TRGL 64 98 61
|
||||
TRGL 98 157 2
|
||||
TRGL 144 82 111
|
||||
TRGL 82 144 118
|
||||
TRGL 42 63 77
|
||||
TRGL 63 96 3
|
||||
TRGL 41 96 21
|
||||
TRGL 96 41 3
|
||||
TRGL 111 82 110
|
||||
TRGL 127 81 126
|
||||
TRGL 81 127 128
|
||||
TRGL 79 105 113
|
||||
TRGL 104 47 137
|
||||
TRGL 76 92 99
|
||||
TRGL 136 137 50
|
||||
TRGL 137 136 104
|
||||
TRGL 107 30 130
|
||||
TRGL 109 104 136
|
||||
TRGL 119 50 137
|
||||
TRGL 86 120 140
|
||||
TRGL 120 86 119
|
||||
TRGL 83 123 124
|
||||
TRGL 140 110 86
|
||||
TRGL 38 149 26
|
||||
TRGL 149 38 25
|
||||
TRGL 65 155 156
|
||||
TRGL 155 65 19
|
||||
TRGL 96 71 68
|
||||
TRGL 159 42 77
|
||||
TRGL 63 95 94
|
||||
TRGL 95 63 3
|
||||
TRGL 63 94 77
|
||||
TRGL 71 97 22
|
||||
TRGL 96 68 21
|
||||
TRGL 62 64 61
|
||||
TRGL 24 1 62
|
||||
TRGL 23 40 1
|
||||
TRGL 2 61 98
|
||||
TRGL 20 153 66
|
||||
TRGL 152 19 65
|
||||
END
|
@ -0,0 +1,35 @@
|
||||
GOCAD TSurf 1
|
||||
HEADER {
|
||||
name:MF_027_SU
|
||||
}
|
||||
GOCAD_ORIGINAL_COORDINATE_SYSTEM
|
||||
NAME Default
|
||||
AXIS_NAME "X" "Y" "Z"
|
||||
AXIS_UNIT "m" "m" "m"
|
||||
ZPOSITIVE Depth
|
||||
END_ORIGINAL_COORDINATE_SYSTEM
|
||||
TFACE
|
||||
VRTX 1 458177.767090 7322538.712891 1643.655884 CNXYZ
|
||||
VRTX 2 458260.834961 7322392.890625 1596.685303 CNXYZ
|
||||
VRTX 3 457985.662109 7322783.783203 1542.060059 CNXYZ
|
||||
VRTX 4 459601.453125 7322511.427734 3639.000000 CNXYZ
|
||||
VRTX 5 459422.015625 7322689.230469 3639.000000 CNXYZ
|
||||
VRTX 6 459793.410156 7322338.230469 3639.000000 CNXYZ
|
||||
VRTX 7 459616.880859 7322495.375000 3639.000000 CNXYZ
|
||||
VRTX 8 460030.848633 7322128.310547 3639.000000 CNXYZ
|
||||
VRTX 87 458310.723145 7322457.267578 1698.750488 CNXYZ
|
||||
VRTX 88 458209.796875 7322593.218750 1752.251587 CNXYZ
|
||||
VRTX 89 458812.488281 7322691.701172 2665.967285 CNXYZ
|
||||
VRTX 90 458473.521973 7322741.050781 2245.679443 CNXYZ
|
||||
VRTX 91 458099.540039 7322824.335938 1816.084473 CNXYZ
|
||||
VRTX 92 459054.166992 7322711.535156 3034.757080 CNXYZ
|
||||
VRTX 93 459286.783203 7322798.351562 3551.294189 CNXYZ
|
||||
VRTX 94 457964.674805 7322818.908203 1535.714111 CNXYZ
|
||||
VRTX 95 457976.891602 7322799.078125 1538.975586 CNXYZ
|
||||
VRTX 96 458049.896484 7322729.902344 1606.723633 CNXYZ
|
||||
TRGL 5 4 59
|
||||
TRGL 4 7 79
|
||||
TRGL 7 6 79
|
||||
TRGL 10 8 12
|
||||
TRGL 152 19 65
|
||||
END
|
Loading…
Reference in New Issue
Block a user