Skip to content

Commit

Permalink
Save extra datasets of mesh layers in project files
Browse files Browse the repository at this point in the history
Some formats like .2dm only contain definition of mesh structure,
in order to show some data users need to add extra files with data
on that mesh. Until now the extra datasets were not persisted.
  • Loading branch information
wonder-sk committed Aug 14, 2018
1 parent 9273090 commit d093455
Show file tree
Hide file tree
Showing 8 changed files with 58 additions and 0 deletions.
5 changes: 5 additions & 0 deletions python/core/auto_generated/mesh/qgsmeshdataprovider.sip.in
Expand Up @@ -317,6 +317,11 @@ Datasets are grouped in the dataset groups. A dataset group represents a measure
Associate dataset with the mesh

emits dataChanged when successful
%End

virtual QStringList extraDatasets() const = 0;
%Docstring
Get list of additional dataset file URIs added using addDataset() calls.
%End

virtual int datasetGroupCount( ) const = 0;
Expand Down
5 changes: 5 additions & 0 deletions src/core/mesh/qgsmeshdataprovider.h
Expand Up @@ -296,6 +296,11 @@ class CORE_EXPORT QgsMeshDatasetSourceInterface SIP_ABSTRACT
*/
virtual bool addDataset( const QString &uri ) = 0;

/**
* Get list of additional dataset file URIs added using addDataset() calls.
*/
virtual QStringList extraDatasets() const = 0;

/**
* \brief Returns number of datasets groups loaded
*/
Expand Down
26 changes: 26 additions & 0 deletions src/core/mesh/qgsmeshlayer.cpp
Expand Up @@ -317,6 +317,21 @@ bool QgsMeshLayer::readXml( const QDomNode &layer_node, QgsReadWriteContext &con
return false;
}

QDomElement elemExtraDatasets = layer_node.firstChildElement( QStringLiteral( "extra-datasets" ) );
if ( !elemExtraDatasets.isNull() )
{
QDomElement elemUri = elemExtraDatasets.firstChildElement( QStringLiteral( "uri" ) );
while ( !elemUri.isNull() )
{
QString uri = context.pathResolver().readPath( elemUri.text() );

bool res = mDataProvider->addDataset( uri );
QgsDebugMsg( QStringLiteral( "extra dataset (res %1): %2" ).arg( res ).arg( uri ) );

elemUri = elemUri.nextSiblingElement( QStringLiteral( "uri" ) );
}
}

return mValid; // should be true if read successfully
}

Expand All @@ -340,6 +355,17 @@ bool QgsMeshLayer::writeXml( QDomNode &layer_node, QDomDocument &document, const
QDomText providerText = document.createTextNode( providerType() );
provider.appendChild( providerText );
layer_node.appendChild( provider );

const QStringList extraDatasetUris = mDataProvider->extraDatasets();
QDomElement elemExtraDatasets = document.createElement( QStringLiteral( "extra-datasets" ) );
for ( const QString &uri : extraDatasetUris )
{
QString path = context.pathResolver().writePath( uri );
QDomElement elemUri = document.createElement( QStringLiteral( "uri" ) );
elemUri.appendChild( document.createTextNode( path ) );
elemExtraDatasets.appendChild( elemUri );
}
layer_node.appendChild( elemExtraDatasets );
}

// renderer specific settings
Expand Down
8 changes: 8 additions & 0 deletions src/core/mesh/qgsmeshmemorydataprovider.cpp
Expand Up @@ -329,11 +329,19 @@ bool QgsMeshMemoryDataProvider::addDataset( const QString &uri )
mDatasetGroups.push_back( group );

if ( valid )
{
mExtraDatasetUris << uri;
emit dataChanged();
}

return valid;
}

QStringList QgsMeshMemoryDataProvider::extraDatasets() const
{
return mExtraDatasetUris;
}

int QgsMeshMemoryDataProvider::datasetGroupCount() const
{
return mDatasetGroups.count();
Expand Down
2 changes: 2 additions & 0 deletions src/core/mesh/qgsmeshmemorydataprovider.h
Expand Up @@ -121,6 +121,7 @@ class QgsMeshMemoryDataProvider: public QgsMeshDataProvider
* \endcode
*/
bool addDataset( const QString &uri ) override;
QStringList extraDatasets() const override;
int datasetGroupCount() const override;
int datasetCount( int groupIndex ) const override;

Expand Down Expand Up @@ -150,6 +151,7 @@ class QgsMeshMemoryDataProvider: public QgsMeshDataProvider
QVector<QgsMeshMemoryDatasetGroup> mDatasetGroups;

bool mIsValid = false;
QStringList mExtraDatasetUris;
};

///@endcond
Expand Down
6 changes: 6 additions & 0 deletions src/providers/mdal/qgsmdalprovider.cpp
Expand Up @@ -113,11 +113,17 @@ bool QgsMdalProvider::addDataset( const QString &uri )
}
else
{
mExtraDatasetUris << uri;
emit dataChanged();
return true; // Ok
}
}

QStringList QgsMdalProvider::extraDatasets() const
{
return mExtraDatasetUris;
}

int QgsMdalProvider::datasetGroupCount() const
{
return MDAL_M_datasetGroupCount( mMeshH );
Expand Down
2 changes: 2 additions & 0 deletions src/providers/mdal/qgsmdalprovider.h
Expand Up @@ -56,6 +56,7 @@ class QgsMdalProvider : public QgsMeshDataProvider
QgsMeshFace face( int index ) const override;

bool addDataset( const QString &uri ) override;
QStringList extraDatasets() const override;

int datasetGroupCount() const override;
int datasetCount( int groupIndex ) const override;
Expand All @@ -66,6 +67,7 @@ class QgsMdalProvider : public QgsMeshDataProvider

private:
MeshH mMeshH;
QStringList mExtraDatasetUris;
};

#endif //QGSMDALPROVIDER_H
4 changes: 4 additions & 0 deletions tests/src/core/testqgsmeshlayer.cpp
Expand Up @@ -80,19 +80,23 @@ void TestQgsMeshLayer::initTestCase()
// Memory layer
mMemoryLayer = new QgsMeshLayer( readFile( "/quad_and_triangle.txt" ), "Triangle and Quad Memory", "mesh_memory" );
QVERIFY( mMemoryLayer->isValid() );
QCOMPARE( mMemoryLayer->dataProvider()->extraDatasets().count(), 0 );
mMemoryLayer->dataProvider()->addDataset( readFile( "/quad_and_triangle_vertex_scalar.txt" ) );
mMemoryLayer->dataProvider()->addDataset( readFile( "/quad_and_triangle_vertex_vector.txt" ) );
mMemoryLayer->dataProvider()->addDataset( readFile( "/quad_and_triangle_face_scalar.txt" ) );
mMemoryLayer->dataProvider()->addDataset( readFile( "/quad_and_triangle_face_vector.txt" ) );
QCOMPARE( mMemoryLayer->dataProvider()->extraDatasets().count(), 4 );

QgsProject::instance()->addMapLayers(
QList<QgsMapLayer *>() << mMemoryLayer );

// MDAL Layer
QString uri( mDataDir + "/quad_and_triangle.2dm" );
mMdalLayer = new QgsMeshLayer( uri, "Triangle and Quad MDAL", "mdal" );
QCOMPARE( mMdalLayer->dataProvider()->extraDatasets().count(), 0 );
mMdalLayer->dataProvider()->addDataset( mDataDir + "/quad_and_triangle_vertex_scalar.dat" );
mMdalLayer->dataProvider()->addDataset( mDataDir + "/quad_and_triangle_vertex_vector.dat" );
QCOMPARE( mMdalLayer->dataProvider()->extraDatasets().count(), 2 );

//The face dataset is recognized by "_els_" in the filename for this format
mMdalLayer->dataProvider()->addDataset( mDataDir + "/quad_and_triangle_els_face_scalar.dat" );
Expand Down

0 comments on commit d093455

Please sign in to comment.