Skip to content

Commit

Permalink
[MESH] fix mesh calculator saving for windows (#35963)
Browse files Browse the repository at this point in the history
fix mesh calculator saving for windows (fix #35549)
  • Loading branch information
vcloarec committed Apr 27, 2020
1 parent e7533d0 commit c2bc0f6
Show file tree
Hide file tree
Showing 9 changed files with 131 additions and 34 deletions.
40 changes: 37 additions & 3 deletions python/core/auto_generated/mesh/qgsmeshdataprovider.sip.in
Expand Up @@ -267,7 +267,40 @@ Returns whether the faces are active for particular dataset
.. versionadded:: 3.6
%End

virtual bool persistDatasetGroup( const QString &path,
virtual bool persistDatasetGroup( const QString &path,
const QgsMeshDatasetGroupMetadata &meta,
const QVector<QgsMeshDataBlock> &datasetValues,
const QVector<QgsMeshDataBlock> &datasetActive,
const QVector<double> &times
) /Deprecated/;
%Docstring
Creates a new dataset group from a data and
persists it into a destination path

On success, the mesh's dataset group count is changed

:param path: destination path of the stored file in form DRIVER_NAME:path
:param meta: new group's metadata
:param datasetValues: scalar/vector values for all datasets and all faces/vertices in the group
:param datasetActive: active flag values for all datasets in the group. Empty array represents can be used
when all faces are active
:param times: times in hours for all datasets in the group

:return: ``True`` on failure, ``False`` on success

.. note::

Doesn't work if there is ":" in the path (e.g. Windows system)


.. versionadded:: 3.6

.. deprecated::
QGIS 3.12.3
%End

virtual bool persistDatasetGroup( const QString &outputFilePath,
const QString &outputDriver,
const QgsMeshDatasetGroupMetadata &meta,
const QVector<QgsMeshDataBlock> &datasetValues,
const QVector<QgsMeshDataBlock> &datasetActive,
Expand All @@ -279,7 +312,8 @@ persists it into a destination path

On success, the mesh's dataset group count is changed

:param path: destination path of the stored file in form DRIVER_NAME:path
:param outputFilePath: destination path of the stored file
:param outputDriver: output driver name
:param meta: new group's metadata
:param datasetValues: scalar/vector values for all datasets and all faces/vertices in the group
:param datasetActive: active flag values for all datasets in the group. Empty array represents can be used
Expand All @@ -288,7 +322,7 @@ On success, the mesh's dataset group count is changed

:return: ``True`` on failure, ``False`` on success

.. versionadded:: 3.6
.. versionadded:: 3.12.3
%End
};

Expand Down
3 changes: 2 additions & 1 deletion src/analysis/mesh/qgsmeshcalculator.cpp
Expand Up @@ -235,7 +235,8 @@ QgsMeshCalculator::Result QgsMeshCalculator::processCalculation( QgsFeedback *fe

const QgsMeshDatasetGroupMetadata meta = outputGroup->groupMetadata();
bool err = mMeshLayer->dataProvider()->persistDatasetGroup(
mOutputDriver + ':' + mOutputFile,
mOutputFile,
mOutputDriver,
meta,
datasetValues,
datasetActive,
Expand Down
21 changes: 21 additions & 0 deletions src/core/mesh/qgsmeshdataprovider.cpp
Expand Up @@ -53,6 +53,27 @@ QgsMeshDatasetGroupMetadata QgsMeshDatasetSourceInterface::datasetGroupMetadata(
return datasetGroupMetadata( index.group() );
}

bool QgsMeshDatasetSourceInterface::persistDatasetGroup(
const QString &path,
const QgsMeshDatasetGroupMetadata &meta,
const QVector<QgsMeshDataBlock> &datasetValues,
const QVector<QgsMeshDataBlock> &datasetActive,
const QVector<double> &times )
{
// Form DRIVER:filename
QString filename = path;
// ASCII dat supports face, edge and vertex datasets
QString driverName = QStringLiteral( "DAT" );
QStringList parts = path.split( ':' );
if ( parts.size() > 1 )
{
driverName = parts[0];
parts.removeFirst();
filename = parts.join( QString() );
}
return persistDatasetGroup( filename, driverName, meta, datasetValues, datasetActive, times );
}

QgsMeshVertex QgsMesh::vertex( int index ) const
{
if ( index < vertices.size() && index >= 0 )
Expand Down
30 changes: 29 additions & 1 deletion src/core/mesh/qgsmeshdataprovider.h
Expand Up @@ -298,9 +298,37 @@ class CORE_EXPORT QgsMeshDatasetSourceInterface SIP_ABSTRACT
* \param times times in hours for all datasets in the group
* \returns TRUE on failure, FALSE on success
*
* \note Doesn't work if there is ":" in the path (e.g. Windows system)
*
* \since QGIS 3.6
* \deprecated QGIS 3.12.3
*/
Q_DECL_DEPRECATED virtual bool persistDatasetGroup( const QString &path,
const QgsMeshDatasetGroupMetadata &meta,
const QVector<QgsMeshDataBlock> &datasetValues,
const QVector<QgsMeshDataBlock> &datasetActive,
const QVector<double> &times
) SIP_DEPRECATED;

/**
* Creates a new dataset group from a data and
* persists it into a destination path
*
* On success, the mesh's dataset group count is changed
*
* \param outputFilePath destination path of the stored file
* \param outputDriver output driver name
* \param meta new group's metadata
* \param datasetValues scalar/vector values for all datasets and all faces/vertices in the group
* \param datasetActive active flag values for all datasets in the group. Empty array represents can be used
* when all faces are active
* \param times times in hours for all datasets in the group
* \returns TRUE on failure, FALSE on success
*
* \since QGIS 3.12.3
*/
virtual bool persistDatasetGroup( const QString &path,
virtual bool persistDatasetGroup( const QString &outputFilePath,
const QString &outputDriver,
const QgsMeshDatasetGroupMetadata &meta,
const QVector<QgsMeshDataBlock> &datasetValues,
const QVector<QgsMeshDataBlock> &datasetActive,
Expand Down
9 changes: 3 additions & 6 deletions src/core/providers/meshmemory/qgsmeshmemorydataprovider.cpp
Expand Up @@ -611,13 +611,10 @@ QgsMeshDataBlock QgsMeshMemoryDataset::areFacesActive( int faceIndex, int count
return ret;
}

bool QgsMeshMemoryDataProvider::persistDatasetGroup( const QString &path,
const QgsMeshDatasetGroupMetadata &meta,
const QVector<QgsMeshDataBlock> &datasetValues,
const QVector<QgsMeshDataBlock> &datasetActive,
const QVector<double> &times )
bool QgsMeshMemoryDataProvider::persistDatasetGroup( const QString &outputFilePath, const QString &outputDriver, const QgsMeshDatasetGroupMetadata &meta, const QVector<QgsMeshDataBlock> &datasetValues, const QVector<QgsMeshDataBlock> &datasetActive, const QVector<double> &times )
{
Q_UNUSED( path )
Q_UNUSED( outputFilePath )
Q_UNUSED( outputDriver )
Q_UNUSED( meta )
Q_UNUSED( datasetValues )
Q_UNUSED( datasetActive )
Expand Down
3 changes: 2 additions & 1 deletion src/core/providers/meshmemory/qgsmeshmemorydataprovider.h
Expand Up @@ -172,7 +172,8 @@ class CORE_EXPORT QgsMeshMemoryDataProvider final: public QgsMeshDataProvider

bool isFaceActive( QgsMeshDatasetIndex index, int faceIndex ) const override;
QgsMeshDataBlock areFacesActive( QgsMeshDatasetIndex index, int faceIndex, int count ) const override;
bool persistDatasetGroup( const QString &path,
bool persistDatasetGroup( const QString &outputFilePath,
const QString &outputDriver,
const QgsMeshDatasetGroupMetadata &meta,
const QVector<QgsMeshDataBlock> &datasetValues,
const QVector<QgsMeshDataBlock> &datasetActive,
Expand Down
32 changes: 11 additions & 21 deletions src/providers/mdal/qgsmdalprovider.cpp
Expand Up @@ -218,12 +218,14 @@ QgsRectangle QgsMdalProvider::extent() const
return ret;
}

bool QgsMdalProvider::persistDatasetGroup( const QString &path,
const QgsMeshDatasetGroupMetadata &meta,
const QVector<QgsMeshDataBlock> &datasetValues,
const QVector<QgsMeshDataBlock> &datasetActive,
const QVector<double> &times
)
bool QgsMdalProvider::persistDatasetGroup(
const QString &outputFilePath,
const QString &outputDriver,
const QgsMeshDatasetGroupMetadata &meta,
const QVector<QgsMeshDataBlock> &datasetValues,
const QVector<QgsMeshDataBlock> &datasetActive,
const QVector<double> &times
)
{
if ( !mMeshH )
return true;
Expand All @@ -246,22 +248,10 @@ bool QgsMdalProvider::persistDatasetGroup( const QString &path,
return true;
}

if ( path.isEmpty() )
if ( outputFilePath.isEmpty() )
return true;

// Form DRIVER:filename
QString filename = path;
// ASCII dat supports face, edge and vertex datasets
QString driverName = QStringLiteral( "DAT" );
QStringList parts = path.split( ':' );
if ( parts.size() > 1 )
{
driverName = parts[0];
parts.removeFirst();
filename = parts.join( QString() );
}

MDAL_DriverH driver = MDAL_driverFromName( driverName.toStdString().c_str() );
MDAL_DriverH driver = MDAL_driverFromName( outputDriver.toStdString().c_str() );
if ( !driver )
return true;

Expand All @@ -288,7 +278,7 @@ bool QgsMdalProvider::persistDatasetGroup( const QString &path,
location,
meta.isScalar(),
driver,
filename.toStdString().c_str()
outputFilePath.toStdString().c_str()
);
if ( !g )
return true;
Expand Down
3 changes: 2 additions & 1 deletion src/providers/mdal/qgsmdalprovider.h
Expand Up @@ -78,7 +78,8 @@ class QgsMdalProvider : public QgsMeshDataProvider
QgsMeshDataBlock areFacesActive( QgsMeshDatasetIndex index, int faceIndex, int count ) const override;
QgsRectangle extent() const override;

bool persistDatasetGroup( const QString &path,
bool persistDatasetGroup( const QString &outputFilePath,
const QString &outputDriver,
const QgsMeshDatasetGroupMetadata &meta,
const QVector<QgsMeshDataBlock> &datasetValues,
const QVector<QgsMeshDataBlock> &datasetActive,
Expand Down
24 changes: 24 additions & 0 deletions tests/src/analysis/testqgsmeshcalculator.cpp
Expand Up @@ -48,6 +48,9 @@ class TestQgsMeshCalculator : public QObject
void calcWithVertexLayers();
void calcWithFaceLayers();
void calcWithMixedLayers();

void calcAndSave();

private:

QgsMeshLayer *mpMeshLayer = nullptr;
Expand Down Expand Up @@ -292,5 +295,26 @@ void TestQgsMeshCalculator::calcWithMixedLayers()
QCOMPARE( val.scalar(), 2.0 );
}

void TestQgsMeshCalculator::calcAndSave()
{
QgsRectangle extent( 1000.000, 1000.000, 3000.000, 3000.000 );

QString tempFilePath = QDir::tempPath() + '/' + "meshCalculatorResult.out";
QgsMeshCalculator rc( QStringLiteral( "\"VertexScalarDataset\" + \"FaceScalarDataset\"" ),
QStringLiteral( "BINARY_DAT" ),
"NewMixScalarDataset",
tempFilePath,
extent,
0,
3600,
mpMeshLayer
);

rc.processCalculation();

QFileInfo fileInfo( tempFilePath );
QVERIFY( fileInfo.exists() );
}

QGSTEST_MAIN( TestQgsMeshCalculator )
#include "testqgsmeshcalculator.moc"

0 comments on commit c2bc0f6

Please sign in to comment.