2018-07-18 09:00:34 +02:00
|
|
|
/*
|
|
|
|
MDAL - Mesh Data Abstraction Library (MIT License)
|
|
|
|
Copyright (C) 2018 Peter Petrik (zilolv at gmail dot com)
|
|
|
|
*/
|
|
|
|
|
2018-04-06 16:11:50 +02:00
|
|
|
#include <string>
|
|
|
|
#include <stddef.h>
|
2018-05-16 11:20:25 +02:00
|
|
|
#include <limits>
|
2018-12-04 17:28:05 +01:00
|
|
|
#include <assert.h>
|
2018-04-06 16:11:50 +02:00
|
|
|
|
|
|
|
#include "mdal.h"
|
|
|
|
#include "mdal_loader.hpp"
|
2018-07-18 09:00:34 +02:00
|
|
|
#include "mdal_data_model.hpp"
|
2018-04-06 16:11:50 +02:00
|
|
|
|
2018-05-16 11:20:25 +02:00
|
|
|
#define NODATA std::numeric_limits<double>::quiet_NaN()
|
2018-12-04 17:28:05 +01:00
|
|
|
|
2018-05-16 11:20:25 +02:00
|
|
|
static const char *EMPTY_STR = "";
|
|
|
|
|
2018-04-19 16:42:01 +02:00
|
|
|
static MDAL_Status sLastStatus;
|
2018-04-06 16:11:50 +02:00
|
|
|
|
|
|
|
const char *MDAL_Version()
|
|
|
|
{
|
2018-12-04 17:28:05 +01:00
|
|
|
return "0.1.0";
|
2018-04-06 16:11:50 +02:00
|
|
|
}
|
|
|
|
|
2018-04-19 16:42:01 +02:00
|
|
|
MDAL_Status MDAL_LastStatus()
|
2018-04-06 16:11:50 +02:00
|
|
|
{
|
|
|
|
return sLastStatus;
|
|
|
|
}
|
|
|
|
|
2018-07-18 09:00:34 +02:00
|
|
|
// helper to return string data - without having to deal with memory too much.
|
|
|
|
// returned pointer is valid only next call. also not thread-safe.
|
|
|
|
const char *_return_str( const std::string &str )
|
|
|
|
{
|
|
|
|
static std::string lastStr;
|
|
|
|
lastStr = str;
|
|
|
|
return lastStr.c_str();
|
|
|
|
}
|
|
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
/// MESH
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
2018-04-06 16:11:50 +02:00
|
|
|
MeshH MDAL_LoadMesh( const char *meshFile )
|
|
|
|
{
|
|
|
|
if ( !meshFile )
|
2018-05-16 11:20:25 +02:00
|
|
|
{
|
|
|
|
sLastStatus = MDAL_Status::Err_FileNotFound;
|
2018-04-06 16:11:50 +02:00
|
|
|
return nullptr;
|
2018-05-16 11:20:25 +02:00
|
|
|
}
|
2018-04-06 16:11:50 +02:00
|
|
|
|
|
|
|
std::string filename( meshFile );
|
2018-05-16 11:20:25 +02:00
|
|
|
return static_cast< MeshH >( MDAL::Loader::load( filename, &sLastStatus ).release() );
|
2018-04-06 16:11:50 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void MDAL_CloseMesh( MeshH mesh )
|
|
|
|
{
|
|
|
|
if ( mesh )
|
|
|
|
{
|
2018-05-16 11:20:25 +02:00
|
|
|
MDAL::Mesh *m = static_cast< MDAL::Mesh * >( mesh );
|
2018-04-06 16:11:50 +02:00
|
|
|
delete m;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-09-07 17:00:56 +02:00
|
|
|
const char *MDAL_M_projection( MeshH mesh )
|
|
|
|
{
|
|
|
|
if ( !mesh )
|
|
|
|
{
|
|
|
|
sLastStatus = MDAL_Status::Err_IncompatibleMesh;
|
|
|
|
return EMPTY_STR;
|
|
|
|
}
|
|
|
|
|
|
|
|
MDAL::Mesh *m = static_cast< MDAL::Mesh * >( mesh );
|
2018-12-04 17:28:05 +01:00
|
|
|
return _return_str( m->crs() );
|
2018-09-07 17:00:56 +02:00
|
|
|
}
|
|
|
|
|
2018-12-04 17:28:05 +01:00
|
|
|
void MDAL_M_extent( MeshH mesh, double *minX, double *maxX, double *minY, double *maxY )
|
|
|
|
{
|
|
|
|
if ( !mesh )
|
|
|
|
{
|
|
|
|
sLastStatus = MDAL_Status::Err_IncompatibleMesh;
|
|
|
|
*minX = std::numeric_limits<double>::quiet_NaN();
|
|
|
|
*maxX = std::numeric_limits<double>::quiet_NaN();
|
|
|
|
*minY = std::numeric_limits<double>::quiet_NaN();
|
|
|
|
*maxY = std::numeric_limits<double>::quiet_NaN();
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
MDAL::Mesh *m = static_cast< MDAL::Mesh * >( mesh );
|
|
|
|
const MDAL::BBox extent = m->extent();
|
|
|
|
*minX = extent.minX;
|
|
|
|
*maxX = extent.maxX;
|
|
|
|
*minY = extent.minY;
|
|
|
|
*maxY = extent.maxY;
|
|
|
|
}
|
|
|
|
}
|
2018-04-06 16:11:50 +02:00
|
|
|
|
2018-04-19 16:42:01 +02:00
|
|
|
int MDAL_M_vertexCount( MeshH mesh )
|
2018-04-06 16:11:50 +02:00
|
|
|
{
|
2018-05-16 11:20:25 +02:00
|
|
|
if ( !mesh )
|
|
|
|
{
|
|
|
|
sLastStatus = MDAL_Status::Err_IncompatibleMesh;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
MDAL::Mesh *m = static_cast< MDAL::Mesh * >( mesh );
|
2018-12-04 17:28:05 +01:00
|
|
|
int len = static_cast<int>( m->verticesCount() );
|
2018-04-19 16:42:01 +02:00
|
|
|
return len;
|
2018-04-06 16:11:50 +02:00
|
|
|
}
|
|
|
|
|
2018-12-04 17:28:05 +01:00
|
|
|
int MDAL_M_faceCount( MeshH mesh )
|
2018-04-06 16:11:50 +02:00
|
|
|
{
|
2018-05-16 11:20:25 +02:00
|
|
|
if ( !mesh )
|
|
|
|
{
|
|
|
|
sLastStatus = MDAL_Status::Err_IncompatibleMesh;
|
2018-12-04 17:28:05 +01:00
|
|
|
return 0;
|
2018-05-16 11:20:25 +02:00
|
|
|
}
|
|
|
|
MDAL::Mesh *m = static_cast< MDAL::Mesh * >( mesh );
|
2018-12-04 17:28:05 +01:00
|
|
|
int len = static_cast<int>( m->facesCount() );
|
|
|
|
return len;
|
2018-04-06 16:11:50 +02:00
|
|
|
}
|
|
|
|
|
2018-12-04 17:28:05 +01:00
|
|
|
int MDAL_M_faceVerticesMaximumCount( MeshH mesh )
|
2018-04-06 16:11:50 +02:00
|
|
|
{
|
2018-05-16 11:20:25 +02:00
|
|
|
if ( !mesh )
|
|
|
|
{
|
|
|
|
sLastStatus = MDAL_Status::Err_IncompatibleMesh;
|
2018-12-04 17:28:05 +01:00
|
|
|
return 0;
|
2018-05-16 11:20:25 +02:00
|
|
|
}
|
|
|
|
MDAL::Mesh *m = static_cast< MDAL::Mesh * >( mesh );
|
2018-12-04 17:28:05 +01:00
|
|
|
int len = static_cast<int>( m->faceVerticesMaximumCount() );
|
|
|
|
return len;
|
2018-04-06 16:11:50 +02:00
|
|
|
}
|
|
|
|
|
2018-12-04 17:28:05 +01:00
|
|
|
void MDAL_M_LoadDatasets( MeshH mesh, const char *datasetFile )
|
2018-08-29 12:10:03 +02:00
|
|
|
{
|
2018-12-04 17:28:05 +01:00
|
|
|
if ( !datasetFile )
|
2018-08-29 12:10:03 +02:00
|
|
|
{
|
2018-12-04 17:28:05 +01:00
|
|
|
sLastStatus = MDAL_Status::Err_FileNotFound;
|
|
|
|
return;
|
2018-08-29 12:10:03 +02:00
|
|
|
}
|
2018-12-04 17:28:05 +01:00
|
|
|
|
|
|
|
if ( !mesh )
|
2018-08-29 12:10:03 +02:00
|
|
|
{
|
|
|
|
sLastStatus = MDAL_Status::Err_IncompatibleMesh;
|
2018-12-04 17:28:05 +01:00
|
|
|
return;
|
2018-08-29 12:10:03 +02:00
|
|
|
}
|
2018-12-04 17:28:05 +01:00
|
|
|
|
|
|
|
MDAL::Mesh *m = static_cast< MDAL::Mesh * >( mesh );
|
|
|
|
|
|
|
|
std::string filename( datasetFile );
|
|
|
|
MDAL::Loader::loadDatasets( m, datasetFile, &sLastStatus );
|
2018-08-29 12:10:03 +02:00
|
|
|
}
|
|
|
|
|
2018-12-04 17:28:05 +01:00
|
|
|
int MDAL_M_datasetGroupCount( MeshH mesh )
|
2018-04-06 16:11:50 +02:00
|
|
|
{
|
2018-05-16 11:20:25 +02:00
|
|
|
if ( !mesh )
|
|
|
|
{
|
|
|
|
sLastStatus = MDAL_Status::Err_IncompatibleMesh;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
MDAL::Mesh *m = static_cast< MDAL::Mesh * >( mesh );
|
2018-12-04 17:28:05 +01:00
|
|
|
int len = static_cast<int>( m->datasetGroups.size() );
|
2018-04-19 16:42:01 +02:00
|
|
|
return len;
|
2018-04-06 16:11:50 +02:00
|
|
|
}
|
|
|
|
|
2018-12-04 17:28:05 +01:00
|
|
|
DatasetGroupH MDAL_M_datasetGroup( MeshH mesh, int index )
|
2018-04-06 16:11:50 +02:00
|
|
|
{
|
2018-05-16 11:20:25 +02:00
|
|
|
if ( !mesh )
|
|
|
|
{
|
|
|
|
sLastStatus = MDAL_Status::Err_IncompatibleMesh;
|
2018-12-04 17:28:05 +01:00
|
|
|
return nullptr;
|
2018-05-16 11:20:25 +02:00
|
|
|
}
|
2018-12-04 17:28:05 +01:00
|
|
|
|
2018-05-16 11:20:25 +02:00
|
|
|
if ( index < 0 )
|
|
|
|
{
|
|
|
|
sLastStatus = MDAL_Status::Err_IncompatibleMesh;
|
2018-12-04 17:28:05 +01:00
|
|
|
return nullptr;
|
2018-05-16 11:20:25 +02:00
|
|
|
}
|
2018-12-04 17:28:05 +01:00
|
|
|
|
|
|
|
MDAL::Mesh *m = static_cast< MDAL::Mesh * >( mesh );
|
|
|
|
int len = static_cast<int>( m->datasetGroups.size() );
|
|
|
|
if ( len <= index )
|
2018-05-16 11:20:25 +02:00
|
|
|
{
|
|
|
|
sLastStatus = MDAL_Status::Err_IncompatibleMesh;
|
2018-12-04 17:28:05 +01:00
|
|
|
return nullptr;
|
2018-05-16 11:20:25 +02:00
|
|
|
}
|
2018-12-04 17:28:05 +01:00
|
|
|
size_t i = static_cast<size_t>( index );
|
|
|
|
return static_cast< DatasetH >( m->datasetGroups[i].get() );
|
2018-04-06 16:11:50 +02:00
|
|
|
}
|
|
|
|
|
2018-12-04 17:28:05 +01:00
|
|
|
///////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
/// MESH VERTICES
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
MeshVertexIteratorH MDAL_M_vertexIterator( MeshH mesh )
|
2018-04-06 16:11:50 +02:00
|
|
|
{
|
2018-05-16 11:20:25 +02:00
|
|
|
if ( !mesh )
|
|
|
|
{
|
|
|
|
sLastStatus = MDAL_Status::Err_IncompatibleMesh;
|
2018-12-04 17:28:05 +01:00
|
|
|
return nullptr;
|
2018-05-16 11:20:25 +02:00
|
|
|
}
|
|
|
|
MDAL::Mesh *m = static_cast< MDAL::Mesh * >( mesh );
|
2018-12-04 17:28:05 +01:00
|
|
|
std::unique_ptr<MDAL::MeshVertexIterator> it = m->readVertices();
|
|
|
|
return static_cast< MeshVertexIteratorH >( it.release() );
|
|
|
|
}
|
|
|
|
|
|
|
|
int MDAL_VI_next( MeshVertexIteratorH iterator, int verticesCount, double *coordinates )
|
|
|
|
{
|
|
|
|
if ( !iterator )
|
2018-05-16 11:20:25 +02:00
|
|
|
{
|
|
|
|
sLastStatus = MDAL_Status::Err_IncompatibleMesh;
|
|
|
|
return 0;
|
|
|
|
}
|
2018-12-04 17:28:05 +01:00
|
|
|
MDAL::MeshVertexIterator *it = static_cast< MDAL::MeshVertexIterator * >( iterator );
|
|
|
|
size_t size = static_cast<size_t>( verticesCount );
|
|
|
|
if ( size == 0 )
|
2018-05-16 11:20:25 +02:00
|
|
|
{
|
|
|
|
return 0;
|
|
|
|
}
|
2018-12-04 17:28:05 +01:00
|
|
|
size_t ret = it->next( size, coordinates );
|
|
|
|
return static_cast<int>( ret );
|
2018-04-06 16:11:50 +02:00
|
|
|
}
|
2018-05-16 11:20:25 +02:00
|
|
|
|
2018-12-04 17:28:05 +01:00
|
|
|
void MDAL_VI_close( MeshVertexIteratorH iterator )
|
2018-05-16 11:20:25 +02:00
|
|
|
{
|
2018-12-04 17:28:05 +01:00
|
|
|
if ( iterator )
|
2018-05-16 11:20:25 +02:00
|
|
|
{
|
2018-12-04 17:28:05 +01:00
|
|
|
MDAL::MeshVertexIterator *it = static_cast< MDAL::MeshVertexIterator * >( iterator );
|
|
|
|
delete it;
|
2018-05-16 11:20:25 +02:00
|
|
|
}
|
2018-12-04 17:28:05 +01:00
|
|
|
}
|
2018-05-16 11:20:25 +02:00
|
|
|
|
2018-12-04 17:28:05 +01:00
|
|
|
///////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
/// MESH FACES
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
MeshFaceIteratorH MDAL_M_faceIterator( MeshH mesh )
|
|
|
|
{
|
2018-05-16 11:20:25 +02:00
|
|
|
if ( !mesh )
|
|
|
|
{
|
|
|
|
sLastStatus = MDAL_Status::Err_IncompatibleMesh;
|
2018-12-04 17:28:05 +01:00
|
|
|
return nullptr;
|
2018-05-16 11:20:25 +02:00
|
|
|
}
|
|
|
|
MDAL::Mesh *m = static_cast< MDAL::Mesh * >( mesh );
|
2018-12-04 17:28:05 +01:00
|
|
|
std::unique_ptr<MDAL::MeshFaceIterator > it = m->readFaces();
|
|
|
|
return static_cast< MeshFaceIteratorH >( it.release() );
|
2018-05-16 11:20:25 +02:00
|
|
|
}
|
|
|
|
|
2018-12-04 17:28:05 +01:00
|
|
|
int MDAL_FI_next( MeshFaceIteratorH iterator,
|
|
|
|
int faceOffsetsBufferLen,
|
|
|
|
int *faceOffsetsBuffer,
|
|
|
|
int vertexIndicesBufferLen,
|
|
|
|
int *vertexIndicesBuffer )
|
2018-05-16 11:20:25 +02:00
|
|
|
{
|
2018-12-04 17:28:05 +01:00
|
|
|
if ( !iterator )
|
2018-05-16 11:20:25 +02:00
|
|
|
{
|
|
|
|
sLastStatus = MDAL_Status::Err_IncompatibleMesh;
|
|
|
|
return 0;
|
|
|
|
}
|
2018-12-04 17:28:05 +01:00
|
|
|
MDAL::MeshFaceIterator *it = static_cast< MDAL::MeshFaceIterator * >( iterator );
|
|
|
|
size_t ret = it->next( static_cast<size_t>( faceOffsetsBufferLen ),
|
|
|
|
faceOffsetsBuffer,
|
|
|
|
static_cast<size_t>( vertexIndicesBufferLen ),
|
|
|
|
vertexIndicesBuffer );
|
|
|
|
return static_cast<int>( ret );
|
2018-05-16 11:20:25 +02:00
|
|
|
}
|
|
|
|
|
2018-08-29 12:10:03 +02:00
|
|
|
|
2018-12-04 17:28:05 +01:00
|
|
|
void MDAL_FI_close( MeshFaceIteratorH iterator )
|
|
|
|
{
|
|
|
|
if ( iterator )
|
2018-05-16 11:20:25 +02:00
|
|
|
{
|
2018-12-04 17:28:05 +01:00
|
|
|
MDAL::MeshFaceIterator *it = static_cast< MDAL::MeshFaceIterator * >( iterator );
|
|
|
|
delete it;
|
2018-05-16 11:20:25 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-12-04 17:28:05 +01:00
|
|
|
|
2018-07-18 09:00:34 +02:00
|
|
|
///////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
/// DATASET GROUPS
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
2018-12-04 17:28:05 +01:00
|
|
|
MeshH MDAL_G_mesh( DatasetGroupH group )
|
|
|
|
{
|
|
|
|
if ( !group )
|
|
|
|
{
|
|
|
|
sLastStatus = MDAL_Status::Err_IncompatibleDatasetGroup;
|
|
|
|
return nullptr;
|
|
|
|
}
|
|
|
|
MDAL::DatasetGroup *g = static_cast< MDAL::DatasetGroup * >( group );
|
|
|
|
MDAL::Mesh *m = g->mesh();
|
|
|
|
return static_cast< MeshH >( m );
|
|
|
|
}
|
2018-07-18 09:00:34 +02:00
|
|
|
|
|
|
|
int MDAL_G_datasetCount( DatasetGroupH group )
|
2018-05-16 11:20:25 +02:00
|
|
|
{
|
2018-07-18 09:00:34 +02:00
|
|
|
if ( !group )
|
2018-05-16 11:20:25 +02:00
|
|
|
{
|
2018-07-18 09:00:34 +02:00
|
|
|
sLastStatus = MDAL_Status::Err_IncompatibleDatasetGroup;
|
|
|
|
return 0;
|
2018-05-16 11:20:25 +02:00
|
|
|
}
|
2018-07-18 09:00:34 +02:00
|
|
|
MDAL::DatasetGroup *g = static_cast< MDAL::DatasetGroup * >( group );
|
|
|
|
int len = static_cast<int>( g->datasets.size() );
|
|
|
|
return len;
|
2018-05-16 11:20:25 +02:00
|
|
|
}
|
|
|
|
|
2018-07-18 09:00:34 +02:00
|
|
|
DatasetH MDAL_G_dataset( DatasetGroupH group, int index )
|
2018-05-16 11:20:25 +02:00
|
|
|
{
|
2018-07-18 09:00:34 +02:00
|
|
|
if ( !group )
|
2018-05-16 11:20:25 +02:00
|
|
|
{
|
2018-07-18 09:00:34 +02:00
|
|
|
sLastStatus = MDAL_Status::Err_IncompatibleDatasetGroup;
|
|
|
|
return nullptr;
|
2018-05-16 11:20:25 +02:00
|
|
|
}
|
2018-08-29 12:10:03 +02:00
|
|
|
|
|
|
|
if ( index < 0 )
|
2018-07-18 09:00:34 +02:00
|
|
|
{
|
|
|
|
sLastStatus = MDAL_Status::Err_IncompatibleDatasetGroup;
|
|
|
|
return nullptr;
|
|
|
|
}
|
2018-05-16 11:20:25 +02:00
|
|
|
|
2018-08-29 12:10:03 +02:00
|
|
|
MDAL::DatasetGroup *g = static_cast< MDAL::DatasetGroup * >( group );
|
|
|
|
int len = static_cast<int>( g->datasets.size() );
|
|
|
|
if ( len <= index )
|
2018-07-18 09:00:34 +02:00
|
|
|
{
|
|
|
|
sLastStatus = MDAL_Status::Err_IncompatibleDatasetGroup;
|
|
|
|
return nullptr;
|
|
|
|
}
|
2018-08-29 12:10:03 +02:00
|
|
|
size_t i = static_cast<size_t>( index );
|
|
|
|
return static_cast< DatasetH >( g->datasets[i].get() );
|
2018-07-18 09:00:34 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
int MDAL_G_metadataCount( DatasetGroupH group )
|
|
|
|
{
|
|
|
|
if ( !group )
|
2018-05-16 11:20:25 +02:00
|
|
|
{
|
|
|
|
sLastStatus = MDAL_Status::Err_IncompatibleDataset;
|
|
|
|
return 0;
|
|
|
|
}
|
2018-07-18 09:00:34 +02:00
|
|
|
MDAL::DatasetGroup *g = static_cast< MDAL::DatasetGroup * >( group );
|
|
|
|
int len = static_cast<int>( g->metadata.size() );
|
2018-05-16 11:20:25 +02:00
|
|
|
return len;
|
|
|
|
}
|
|
|
|
|
2018-07-18 09:00:34 +02:00
|
|
|
const char *MDAL_G_metadataKey( DatasetGroupH group, int index )
|
2018-05-16 11:20:25 +02:00
|
|
|
{
|
2018-07-18 09:00:34 +02:00
|
|
|
if ( !group )
|
2018-05-16 11:20:25 +02:00
|
|
|
{
|
|
|
|
sLastStatus = MDAL_Status::Err_IncompatibleDataset;
|
|
|
|
return EMPTY_STR;
|
|
|
|
}
|
2018-07-18 09:00:34 +02:00
|
|
|
MDAL::DatasetGroup *g = static_cast< MDAL::DatasetGroup * >( group );
|
|
|
|
int len = static_cast<int>( g->metadata.size() );
|
2018-05-16 11:20:25 +02:00
|
|
|
if ( len <= index )
|
|
|
|
{
|
|
|
|
sLastStatus = MDAL_Status::Err_IncompatibleDataset;
|
2018-07-18 09:00:34 +02:00
|
|
|
return EMPTY_STR;
|
2018-05-16 11:20:25 +02:00
|
|
|
}
|
|
|
|
size_t i = static_cast<size_t>( index );
|
2018-07-18 09:00:34 +02:00
|
|
|
return _return_str( g->metadata[i].first );
|
2018-05-16 11:20:25 +02:00
|
|
|
}
|
|
|
|
|
2018-07-18 09:00:34 +02:00
|
|
|
const char *MDAL_G_metadataValue( DatasetGroupH group, int index )
|
2018-05-16 11:20:25 +02:00
|
|
|
{
|
2018-07-18 09:00:34 +02:00
|
|
|
if ( !group )
|
2018-05-16 11:20:25 +02:00
|
|
|
{
|
|
|
|
sLastStatus = MDAL_Status::Err_IncompatibleDataset;
|
|
|
|
return EMPTY_STR;
|
|
|
|
}
|
2018-07-18 09:00:34 +02:00
|
|
|
MDAL::DatasetGroup *g = static_cast< MDAL::DatasetGroup * >( group );
|
|
|
|
int len = static_cast<int>( g->metadata.size() );
|
2018-05-16 11:20:25 +02:00
|
|
|
if ( len <= index )
|
|
|
|
{
|
|
|
|
sLastStatus = MDAL_Status::Err_IncompatibleDataset;
|
2018-07-18 09:00:34 +02:00
|
|
|
return EMPTY_STR;
|
2018-05-16 11:20:25 +02:00
|
|
|
}
|
|
|
|
size_t i = static_cast<size_t>( index );
|
2018-07-18 09:00:34 +02:00
|
|
|
return _return_str( g->metadata[i].second );
|
|
|
|
}
|
|
|
|
|
|
|
|
const char *MDAL_G_name( DatasetGroupH group )
|
|
|
|
{
|
|
|
|
if ( !group )
|
|
|
|
{
|
|
|
|
sLastStatus = MDAL_Status::Err_IncompatibleDataset;
|
|
|
|
return EMPTY_STR;
|
|
|
|
}
|
|
|
|
MDAL::DatasetGroup *g = static_cast< MDAL::DatasetGroup * >( group );
|
|
|
|
return _return_str( g->name() );
|
|
|
|
}
|
|
|
|
|
|
|
|
bool MDAL_G_hasScalarData( DatasetGroupH group )
|
|
|
|
{
|
|
|
|
if ( !group )
|
|
|
|
{
|
|
|
|
sLastStatus = MDAL_Status::Err_IncompatibleDataset;
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
MDAL::DatasetGroup *g = static_cast< MDAL::DatasetGroup * >( group );
|
2018-12-04 17:28:05 +01:00
|
|
|
return g->isScalar();
|
2018-07-18 09:00:34 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
bool MDAL_G_isOnVertices( DatasetGroupH group )
|
|
|
|
{
|
|
|
|
if ( !group )
|
|
|
|
{
|
|
|
|
sLastStatus = MDAL_Status::Err_IncompatibleDataset;
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
MDAL::DatasetGroup *g = static_cast< MDAL::DatasetGroup * >( group );
|
2018-12-04 17:28:05 +01:00
|
|
|
return g->isOnVertices();
|
2018-07-18 09:00:34 +02:00
|
|
|
}
|
|
|
|
|
2018-12-04 17:28:05 +01:00
|
|
|
void MDAL_G_minimumMaximum( DatasetGroupH group, double *min, double *max )
|
|
|
|
{
|
|
|
|
if ( !min || !max )
|
|
|
|
{
|
|
|
|
sLastStatus = MDAL_Status::Err_InvalidData;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( !group )
|
|
|
|
{
|
|
|
|
sLastStatus = MDAL_Status::Err_IncompatibleDataset;
|
|
|
|
*min = NODATA;
|
|
|
|
*max = NODATA;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
MDAL::DatasetGroup *g = static_cast< MDAL::DatasetGroup * >( group );
|
|
|
|
MDAL::Statistics stats = g->statistics();
|
|
|
|
*min = stats.minimum;
|
|
|
|
*max = stats.maximum;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2018-07-18 09:00:34 +02:00
|
|
|
///////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
/// DATASETS
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
DatasetGroupH MDAL_D_group( DatasetH dataset )
|
|
|
|
{
|
|
|
|
if ( !dataset )
|
|
|
|
{
|
|
|
|
sLastStatus = MDAL_Status::Err_IncompatibleDataset;
|
|
|
|
return nullptr;
|
|
|
|
}
|
|
|
|
MDAL::Dataset *d = static_cast< MDAL::Dataset * >( dataset );
|
2018-12-04 17:28:05 +01:00
|
|
|
return static_cast< MDAL::DatasetGroup * >( d->group() );
|
2018-07-18 09:00:34 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
double MDAL_D_time( DatasetH dataset )
|
|
|
|
{
|
|
|
|
if ( !dataset )
|
|
|
|
{
|
|
|
|
sLastStatus = MDAL_Status::Err_IncompatibleDataset;
|
|
|
|
return NODATA;
|
|
|
|
}
|
|
|
|
MDAL::Dataset *d = static_cast< MDAL::Dataset * >( dataset );
|
2018-12-04 17:28:05 +01:00
|
|
|
return d->time();
|
2018-07-18 09:00:34 +02:00
|
|
|
|
2018-05-16 11:20:25 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
int MDAL_D_valueCount( DatasetH dataset )
|
|
|
|
{
|
|
|
|
if ( !dataset )
|
|
|
|
{
|
|
|
|
sLastStatus = MDAL_Status::Err_IncompatibleDataset;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
MDAL::Dataset *d = static_cast< MDAL::Dataset * >( dataset );
|
2018-12-04 17:28:05 +01:00
|
|
|
int len = static_cast<int>( d->valuesCount() );
|
2018-05-16 11:20:25 +02:00
|
|
|
return len;
|
|
|
|
}
|
|
|
|
|
2018-12-04 17:28:05 +01:00
|
|
|
bool MDAL_D_isValid( DatasetH dataset )
|
2018-05-16 11:20:25 +02:00
|
|
|
{
|
|
|
|
if ( !dataset )
|
|
|
|
{
|
|
|
|
sLastStatus = MDAL_Status::Err_IncompatibleDataset;
|
2018-12-04 17:28:05 +01:00
|
|
|
return false;
|
2018-05-16 11:20:25 +02:00
|
|
|
}
|
|
|
|
MDAL::Dataset *d = static_cast< MDAL::Dataset * >( dataset );
|
2018-12-04 17:28:05 +01:00
|
|
|
return d->isValid();
|
2018-05-16 11:20:25 +02:00
|
|
|
}
|
|
|
|
|
2018-12-04 17:28:05 +01:00
|
|
|
int MDAL_D_data( DatasetH dataset, int indexStart, int count, MDAL_DataType dataType, void *buffer )
|
2018-05-16 11:20:25 +02:00
|
|
|
{
|
|
|
|
if ( !dataset )
|
|
|
|
{
|
|
|
|
sLastStatus = MDAL_Status::Err_IncompatibleDataset;
|
2018-12-04 17:28:05 +01:00
|
|
|
return 0;
|
2018-05-16 11:20:25 +02:00
|
|
|
}
|
|
|
|
MDAL::Dataset *d = static_cast< MDAL::Dataset * >( dataset );
|
2018-12-04 17:28:05 +01:00
|
|
|
size_t indexStartSizeT = static_cast<size_t>( indexStart );
|
|
|
|
size_t countSizeT = static_cast<size_t>( count );
|
|
|
|
MDAL::DatasetGroup *g = d->group();
|
|
|
|
assert( g );
|
|
|
|
|
|
|
|
MDAL::Mesh *m = d->mesh();
|
|
|
|
assert( m );
|
|
|
|
|
|
|
|
size_t valuesCount;
|
|
|
|
|
|
|
|
// Check that we are requesting correct 1D/2D for given dataset
|
|
|
|
switch ( dataType )
|
|
|
|
{
|
|
|
|
case MDAL_DataType::SCALAR_DOUBLE:
|
|
|
|
if ( !g->isScalar() )
|
|
|
|
{
|
|
|
|
sLastStatus = MDAL_Status::Err_IncompatibleDataset;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
valuesCount = d->valuesCount();
|
|
|
|
break;
|
|
|
|
case MDAL_DataType::VECTOR_2D_DOUBLE:
|
|
|
|
if ( g->isScalar() )
|
|
|
|
{
|
|
|
|
sLastStatus = MDAL_Status::Err_IncompatibleDataset;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
valuesCount = d->valuesCount();
|
|
|
|
break;
|
|
|
|
case MDAL_DataType::ACTIVE_INTEGER:
|
|
|
|
valuesCount = m->facesCount();
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Check that we are not reaching out of values limit
|
|
|
|
if ( valuesCount <= indexStartSizeT )
|
2018-05-16 11:20:25 +02:00
|
|
|
{
|
|
|
|
sLastStatus = MDAL_Status::Err_IncompatibleDataset;
|
2018-12-04 17:28:05 +01:00
|
|
|
return 0;
|
2018-05-16 11:20:25 +02:00
|
|
|
}
|
2018-12-04 17:28:05 +01:00
|
|
|
|
|
|
|
if ( valuesCount < indexStartSizeT + countSizeT )
|
2018-05-16 11:20:25 +02:00
|
|
|
{
|
2018-12-04 17:28:05 +01:00
|
|
|
sLastStatus = MDAL_Status::Err_IncompatibleDataset;
|
|
|
|
return 0;
|
2018-05-16 11:20:25 +02:00
|
|
|
}
|
|
|
|
|
2018-12-04 17:28:05 +01:00
|
|
|
// Request data
|
|
|
|
size_t writtenValuesCount;
|
|
|
|
switch ( dataType )
|
2018-05-16 11:20:25 +02:00
|
|
|
{
|
2018-12-04 17:28:05 +01:00
|
|
|
case MDAL_DataType::SCALAR_DOUBLE:
|
|
|
|
writtenValuesCount = d->scalarData( indexStartSizeT, countSizeT, static_cast<double *>( buffer ) );
|
|
|
|
break;
|
|
|
|
case MDAL_DataType::VECTOR_2D_DOUBLE:
|
|
|
|
writtenValuesCount = d->vectorData( indexStartSizeT, countSizeT, static_cast<double *>( buffer ) );
|
|
|
|
break;
|
|
|
|
case MDAL_DataType::ACTIVE_INTEGER:
|
|
|
|
writtenValuesCount = d->activeData( indexStartSizeT, countSizeT, static_cast<int *>( buffer ) );
|
|
|
|
break;
|
2018-05-16 11:20:25 +02:00
|
|
|
}
|
2018-12-04 17:28:05 +01:00
|
|
|
|
|
|
|
return static_cast<int>( writtenValuesCount );
|
2018-05-16 11:20:25 +02:00
|
|
|
}
|
|
|
|
|
2018-12-04 17:28:05 +01:00
|
|
|
void MDAL_D_minimumMaximum( DatasetH dataset, double *min, double *max )
|
2018-05-16 11:20:25 +02:00
|
|
|
{
|
2018-12-04 17:28:05 +01:00
|
|
|
if ( !min || !max )
|
|
|
|
{
|
|
|
|
sLastStatus = MDAL_Status::Err_InvalidData;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2018-05-16 11:20:25 +02:00
|
|
|
if ( !dataset )
|
|
|
|
{
|
|
|
|
sLastStatus = MDAL_Status::Err_IncompatibleDataset;
|
2018-12-04 17:28:05 +01:00
|
|
|
*min = NODATA;
|
|
|
|
*max = NODATA;
|
|
|
|
return;
|
2018-05-16 11:20:25 +02:00
|
|
|
}
|
2018-12-04 17:28:05 +01:00
|
|
|
|
|
|
|
MDAL::Dataset *ds = static_cast< MDAL::Dataset * >( dataset );
|
|
|
|
MDAL::Statistics stats = ds->statistics();
|
|
|
|
*min = stats.minimum;
|
|
|
|
*max = stats.maximum;
|
2018-05-16 11:20:25 +02:00
|
|
|
}
|