2018-12-14 14:59:53 +01:00
|
|
|
/*
|
|
|
|
MDAL - Mesh Data Abstraction Library (MIT License)
|
|
|
|
Copyright (C) 2018 Lutra Consulting Ltd.
|
|
|
|
*/
|
|
|
|
|
2019-01-04 18:18:34 +01:00
|
|
|
#include <string.h>
|
2018-12-14 14:59:53 +01:00
|
|
|
#include "mdal_driver.hpp"
|
|
|
|
#include "mdal_utils.hpp"
|
2019-01-04 18:18:34 +01:00
|
|
|
#include "mdal_memory_data_model.hpp"
|
2018-12-14 14:59:53 +01:00
|
|
|
|
|
|
|
MDAL::Driver::Driver( const std::string &name,
|
|
|
|
const std::string &longName,
|
|
|
|
const std::string &filters,
|
2019-01-04 18:18:34 +01:00
|
|
|
int capabilityFlags )
|
2018-12-14 14:59:53 +01:00
|
|
|
: mName( name )
|
|
|
|
, mLongName( longName )
|
|
|
|
, mFilters( filters )
|
2019-01-04 18:18:34 +01:00
|
|
|
, mCapabilityFlags( capabilityFlags )
|
2018-12-14 14:59:53 +01:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
MDAL::Driver::~Driver() = default;
|
|
|
|
|
|
|
|
std::string MDAL::Driver::name() const
|
|
|
|
{
|
|
|
|
return mName;
|
|
|
|
}
|
|
|
|
|
|
|
|
std::string MDAL::Driver::longName() const
|
|
|
|
{
|
|
|
|
return mLongName;
|
|
|
|
}
|
|
|
|
|
|
|
|
std::string MDAL::Driver::filters() const
|
|
|
|
{
|
|
|
|
return mFilters;
|
|
|
|
}
|
|
|
|
|
2020-07-01 04:18:27 -04:00
|
|
|
std::string MDAL::Driver::writeDatasetOnFileSuffix() const
|
|
|
|
{
|
2021-06-30 13:45:22 +02:00
|
|
|
return std::string();
|
|
|
|
}
|
2020-07-01 04:18:27 -04:00
|
|
|
|
2021-06-30 13:45:22 +02:00
|
|
|
std::string MDAL::Driver::saveMeshOnFileSuffix() const
|
|
|
|
{
|
2020-07-01 04:18:27 -04:00
|
|
|
return std::string();
|
|
|
|
}
|
|
|
|
|
2019-01-04 18:18:34 +01:00
|
|
|
bool MDAL::Driver::hasCapability( MDAL::Capability capability ) const
|
2018-12-14 14:59:53 +01:00
|
|
|
{
|
2019-01-04 18:18:34 +01:00
|
|
|
return capability == ( mCapabilityFlags & capability );
|
2018-12-14 14:59:53 +01:00
|
|
|
}
|
|
|
|
|
2019-11-29 15:15:01 +01:00
|
|
|
bool MDAL::Driver::canReadMesh( const std::string & ) { return false; }
|
2019-10-14 09:19:14 +02:00
|
|
|
|
2019-11-29 15:15:01 +01:00
|
|
|
bool MDAL::Driver::canReadDatasets( const std::string & ) { return false; }
|
2018-12-14 14:59:53 +01:00
|
|
|
|
2019-11-29 15:15:01 +01:00
|
|
|
bool MDAL::Driver::hasWriteDatasetCapability( MDAL_DataLocation location ) const
|
2018-12-14 14:59:53 +01:00
|
|
|
{
|
2019-11-29 15:15:01 +01:00
|
|
|
switch ( location )
|
|
|
|
{
|
2020-03-09 05:59:51 +01:00
|
|
|
case MDAL_DataLocation::DataOnVertices:
|
|
|
|
return hasCapability( MDAL::Capability::WriteDatasetsOnVertices );
|
|
|
|
case MDAL_DataLocation::DataOnFaces:
|
|
|
|
return hasCapability( MDAL::Capability::WriteDatasetsOnFaces );
|
|
|
|
case MDAL_DataLocation::DataOnVolumes:
|
|
|
|
return hasCapability( MDAL::Capability::WriteDatasetsOnVolumes );
|
|
|
|
case MDAL_DataLocation::DataOnEdges:
|
|
|
|
return hasCapability( MDAL::Capability::WriteDatasetsOnEdges );
|
2019-11-29 15:15:01 +01:00
|
|
|
default:
|
|
|
|
return false;
|
|
|
|
}
|
2018-12-14 14:59:53 +01:00
|
|
|
}
|
2019-01-04 18:18:34 +01:00
|
|
|
|
2019-11-29 15:15:01 +01:00
|
|
|
int MDAL::Driver::faceVerticesMaximumCount() const { return -1; }
|
2019-10-14 09:19:14 +02:00
|
|
|
|
2020-04-14 02:17:15 -04:00
|
|
|
std::string MDAL::Driver::buildUri( const std::string &meshFile )
|
|
|
|
{
|
|
|
|
return MDAL::buildMeshUri( meshFile, "", this->name() );
|
|
|
|
}
|
|
|
|
|
|
|
|
std::unique_ptr< MDAL::Mesh > MDAL::Driver::load( const std::string &, const std::string & ) { return std::unique_ptr< MDAL::Mesh >(); }
|
2019-11-29 15:15:01 +01:00
|
|
|
|
2020-03-09 05:59:51 +01:00
|
|
|
void MDAL::Driver::load( const std::string &, Mesh * ) {}
|
2019-11-29 15:15:01 +01:00
|
|
|
|
2021-08-18 10:49:05 +02:00
|
|
|
void MDAL::Driver::save( const std::string &, const std::string &, MDAL::Mesh * )
|
|
|
|
{}
|
2019-11-29 15:15:01 +01:00
|
|
|
|
|
|
|
void MDAL::Driver::createDatasetGroup( MDAL::Mesh *mesh, const std::string &groupName, MDAL_DataLocation dataLocation, bool hasScalarData, const std::string &datasetGroupFile )
|
2019-01-04 18:18:34 +01:00
|
|
|
{
|
|
|
|
std::shared_ptr<MDAL::DatasetGroup> grp(
|
|
|
|
new MDAL::DatasetGroup( name(),
|
|
|
|
mesh,
|
|
|
|
datasetGroupFile )
|
|
|
|
);
|
|
|
|
grp->setName( groupName );
|
2019-11-29 15:15:01 +01:00
|
|
|
grp->setDataLocation( dataLocation );
|
2019-01-04 18:18:34 +01:00
|
|
|
grp->setIsScalar( hasScalarData );
|
|
|
|
grp->startEditing();
|
|
|
|
mesh->datasetGroups.push_back( grp );
|
|
|
|
}
|
|
|
|
|
2019-12-13 09:33:23 +01:00
|
|
|
void MDAL::Driver::createDataset( MDAL::DatasetGroup *group, MDAL::RelativeTimestamp time, const double *values, const int *active )
|
2019-01-04 18:18:34 +01:00
|
|
|
{
|
2019-12-11 14:04:34 +01:00
|
|
|
bool supportsActiveFlag = ( active != nullptr );
|
|
|
|
std::shared_ptr<MDAL::MemoryDataset2D> dataset = std::make_shared< MemoryDataset2D >( group, supportsActiveFlag );
|
2019-01-04 18:18:34 +01:00
|
|
|
dataset->setTime( time );
|
2019-11-29 15:15:01 +01:00
|
|
|
size_t count = dataset->valuesCount();
|
|
|
|
|
|
|
|
if ( !group->isScalar() )
|
|
|
|
count *= 2;
|
|
|
|
|
|
|
|
memcpy( dataset->values(), values, sizeof( double ) * count );
|
2019-12-11 14:04:34 +01:00
|
|
|
if ( dataset->supportsActiveFlag() )
|
|
|
|
dataset->setActive( active );
|
2019-01-04 18:18:34 +01:00
|
|
|
dataset->setStatistics( MDAL::calculateStatistics( dataset ) );
|
|
|
|
group->datasets.push_back( dataset );
|
|
|
|
}
|
|
|
|
|
2021-08-18 10:49:05 +02:00
|
|
|
void MDAL::Driver::createDataset( MDAL::DatasetGroup *group, MDAL::RelativeTimestamp time, const double *values, const int *verticalLevelCounts, const double *verticalExtrusions )
|
|
|
|
{
|
|
|
|
size_t count = 0;
|
|
|
|
size_t facesCount = group->mesh()->facesCount();
|
|
|
|
int maxVerticalLevel = 0;
|
|
|
|
for ( size_t i = 0; i < facesCount; i++ )
|
|
|
|
{
|
|
|
|
count += verticalLevelCounts[i];
|
|
|
|
if ( verticalLevelCounts[i] > maxVerticalLevel ) maxVerticalLevel = verticalLevelCounts[i];
|
|
|
|
};
|
|
|
|
|
|
|
|
std::shared_ptr<MDAL::MemoryDataset3D> dataset = std::make_shared< MemoryDataset3D >( group, count, maxVerticalLevel, verticalLevelCounts, verticalExtrusions );
|
|
|
|
dataset->setTime( time );
|
|
|
|
|
|
|
|
if ( !group->isScalar() )
|
|
|
|
count *= 2;
|
|
|
|
|
|
|
|
memcpy( dataset->values(), values, sizeof( double ) * count );
|
|
|
|
|
|
|
|
dataset->setStatistics( MDAL::calculateStatistics( dataset ) );
|
|
|
|
group->datasets.push_back( dataset );
|
|
|
|
}
|
|
|
|
|
2019-11-29 15:15:01 +01:00
|
|
|
bool MDAL::Driver::persist( MDAL::DatasetGroup * ) { return true; } // failure
|