Skip to content

Commit

Permalink
introduce DataType for mesh dataset data definition and small fixes
Browse files Browse the repository at this point in the history
  • Loading branch information
PeterPetrik committed Aug 10, 2018
1 parent 9ea0bc2 commit 271bab1
Show file tree
Hide file tree
Showing 12 changed files with 70 additions and 49 deletions.
16 changes: 9 additions & 7 deletions python/core/auto_generated/mesh/qgsmeshdataprovider.sip.in
Expand Up @@ -140,6 +140,13 @@ such as whether the data is vector or scalar, name
#include "qgsmeshdataprovider.h"
%End
public:

enum DataType
{
DataOnFaces,
DataOnVertices
};

QgsMeshDatasetGroupMetadata();
%Docstring
Constructs an empty metadata object
Expand Down Expand Up @@ -178,14 +185,9 @@ Returns whether dataset group has vector data
Returns whether dataset group has scalar data
%End

bool isOnVertices() const;
%Docstring
Returns whether dataset group data is defined on vertices
%End

bool isOnFaces() const;
DataType dataType() const;
%Docstring
Returns whether dataset group data is defined on faces
Returns whether dataset group data is defined on vertices or faces
%End

};
Expand Down
19 changes: 15 additions & 4 deletions python/core/auto_generated/mesh/qgsmeshlayer.sip.in
Expand Up @@ -195,22 +195,33 @@ Returns active vector dataset
%Docstring
Interpolates the value on the given point from given dataset.

Returns NaN for NaN values, for values outside range or when
triangular mesh is not yet initialized on given point
.. note::

It uses previously cached and indexed triangular mesh
and so if the layer has not been rendered previously
(e.g. when used in a script) it returns NaN value

:param index: dataset index specifying group and dataset to extract value from
:param point: point to query in map coordinates

:return: interpolated value at the point. Returns NaN values for values
outside the mesh layer, nodata values and in case triangular mesh was not
previously used for rendering


.. versionadded:: 3.4
%End

signals:

void activeScalarDatasetChanged( QgsMeshDatasetIndex index );
void activeScalarDatasetChanged( const QgsMeshDatasetIndex &index );
%Docstring
Emitted when active scalar dataset is changed

.. versionadded:: 3.4
%End

void activeVectorDatasetChanged( QgsMeshDatasetIndex index );
void activeVectorDatasetChanged( const QgsMeshDatasetIndex &index );
%Docstring
Emitted when active vector dataset is changed

Expand Down
4 changes: 2 additions & 2 deletions src/app/mesh/qgsmeshrendereractivedatasetwidget.cpp
Expand Up @@ -126,8 +126,8 @@ void QgsMeshRendererActiveDatasetWidget::updateMetadata( QgsMeshDatasetIndex dat

const QgsMeshDatasetGroupMetadata gmeta = mMeshLayer->dataProvider()->datasetGroupMetadata( datasetIndex );
msg += QStringLiteral( "<tr><td>%1</td><td>%2</td></tr>" )
.arg( tr( "Is on vertices" ) )
.arg( gmeta.isOnVertices() ? tr( "Yes" ) : tr( "No" ) );
.arg( tr( "Data Type" ) )
.arg( gmeta.dataType() == QgsMeshDatasetGroupMetadata::DataOnVertices ? tr( "Defined on vertices" ) : tr( "Defined on faces" ) );

msg += QStringLiteral( "<tr><td>%1</td><td>%2</td></tr>" )
.arg( tr( "Is vector" ) )
Expand Down
2 changes: 1 addition & 1 deletion src/app/mesh/qgsmeshrendererscalarsettingswidget.cpp
Expand Up @@ -112,7 +112,7 @@ void QgsMeshRendererScalarSettingsWidget::calcMinMax( QgsMeshDatasetIndex datase
return;

const QgsMeshDatasetGroupMetadata metadata = mMeshLayer->dataProvider()->datasetGroupMetadata( datasetIndex );
bool scalarDataOnVertices = metadata.isOnVertices();
bool scalarDataOnVertices = metadata.dataType() == QgsMeshDatasetGroupMetadata::DataOnVertices;
int count;
if ( scalarDataOnVertices )
count = mMeshLayer->dataProvider()->vertexCount();
Expand Down
12 changes: 4 additions & 8 deletions src/core/mesh/qgsmeshdataprovider.cpp
Expand Up @@ -161,20 +161,16 @@ bool QgsMeshDatasetGroupMetadata::isScalar() const
return mIsScalar;
}

QString QgsMeshDatasetGroupMetadata::name() const
{
return mName;
}


bool QgsMeshDatasetGroupMetadata::isOnVertices() const
QString QgsMeshDatasetGroupMetadata::name() const
{
return mIsOnVertices;
return mName;
}

bool QgsMeshDatasetGroupMetadata::isOnFaces() const
QgsMeshDatasetGroupMetadata::DataType QgsMeshDatasetGroupMetadata::dataType() const
{
return !mIsOnVertices;
return ( mIsOnVertices ) ? DataType::DataOnVertices : DataType::DataOnFaces;
}

int QgsMeshDatasetSourceInterface::datasetCount( QgsMeshDatasetIndex index ) const
Expand Down
17 changes: 10 additions & 7 deletions src/core/mesh/qgsmeshdataprovider.h
Expand Up @@ -127,6 +127,14 @@ class CORE_EXPORT QgsMeshDatasetValue
class CORE_EXPORT QgsMeshDatasetGroupMetadata
{
public:

//! Location of where data is specified for datasets in the dataset group
enum DataType
{
DataOnFaces, //!< Data is defined on faces
DataOnVertices //!< Data is defined on vertices
};

//! Constructs an empty metadata object
QgsMeshDatasetGroupMetadata() = default;

Expand Down Expand Up @@ -164,14 +172,9 @@ class CORE_EXPORT QgsMeshDatasetGroupMetadata
bool isScalar() const;

/**
* \brief Returns whether dataset group data is defined on vertices
*/
bool isOnVertices() const;

/**
* \brief Returns whether dataset group data is defined on faces
* \brief Returns whether dataset group data is defined on vertices or faces
*/
bool isOnFaces() const;
DataType dataType() const;

private:
QString mName;
Expand Down
11 changes: 5 additions & 6 deletions src/core/mesh/qgsmeshlayer.cpp
Expand Up @@ -189,18 +189,17 @@ QgsMeshDatasetValue QgsMeshLayer::datasetValue( const QgsMeshDatasetIndex &index

if ( mTriangularMesh && dataProvider() && dataProvider()->isValid() && index.isValid() )
{
int face_index = mTriangularMesh->faceIndexForPoint( point ) ;
if ( face_index >= 0 )
int faceIndex = mTriangularMesh->faceIndexForPoint( point ) ;
if ( faceIndex >= 0 )
{
bool isOnFaces = dataProvider()->datasetGroupMetadata( index ).isOnFaces();
if ( isOnFaces )
if ( dataProvider()->datasetGroupMetadata( index ).dataType() == QgsMeshDatasetGroupMetadata::DataOnFaces )
{
int nativeFaceIndex = mTriangularMesh->trianglesToNativeFaces().at( face_index );
int nativeFaceIndex = mTriangularMesh->trianglesToNativeFaces().at( faceIndex );
return dataProvider()->datasetValue( index, nativeFaceIndex );
}
else
{
const QgsMeshFace &face = mTriangularMesh->triangles()[face_index];
const QgsMeshFace &face = mTriangularMesh->triangles()[faceIndex];
const int v1 = face[0], v2 = face[1], v3 = face[2];
const QgsPoint p1 = mTriangularMesh->vertices()[v1], p2 = mTriangularMesh->vertices()[v2], p3 = mTriangularMesh->vertices()[v3];
const QgsMeshDatasetValue val1 = dataProvider()->datasetValue( index, v1 );
Expand Down
15 changes: 11 additions & 4 deletions src/core/mesh/qgsmeshlayer.h
Expand Up @@ -186,8 +186,15 @@ class CORE_EXPORT QgsMeshLayer : public QgsMapLayer
/**
* Interpolates the value on the given point from given dataset.
*
* Returns NaN for NaN values, for values outside range or when
* triangular mesh is not yet initialized on given point
* \note It uses previously cached and indexed triangular mesh
* and so if the layer has not been rendered previously
* (e.g. when used in a script) it returns NaN value
*
* \param index dataset index specifying group and dataset to extract value from
* \param point point to query in map coordinates
* \returns interpolated value at the point. Returns NaN values for values
* outside the mesh layer, nodata values and in case triangular mesh was not
* previously used for rendering
*
* \since QGIS 3.4
*/
Expand All @@ -200,14 +207,14 @@ class CORE_EXPORT QgsMeshLayer : public QgsMapLayer
*
* \since QGIS 3.4
*/
void activeScalarDatasetChanged( QgsMeshDatasetIndex index );
void activeScalarDatasetChanged( const QgsMeshDatasetIndex &index );

/**
* Emitted when active vector dataset is changed
*
* \since QGIS 3.4
*/
void activeVectorDatasetChanged( QgsMeshDatasetIndex index );
void activeVectorDatasetChanged( const QgsMeshDatasetIndex &index );

private: // Private methods

Expand Down
4 changes: 2 additions & 2 deletions src/core/mesh/qgsmeshlayerrenderer.cpp
Expand Up @@ -140,7 +140,7 @@ void QgsMeshLayerRenderer::copyScalarDatasetValues( QgsMeshLayer *layer )
if ( datasetIndex.isValid() )
{
const QgsMeshDatasetGroupMetadata metadata = layer->dataProvider()->datasetGroupMetadata( datasetIndex );
mScalarDataOnVertices = metadata.isOnVertices();
mScalarDataOnVertices = metadata.dataType() == QgsMeshDatasetGroupMetadata::DataOnVertices;
int count;
if ( mScalarDataOnVertices )
count = mNativeMesh.vertices.count();
Expand Down Expand Up @@ -172,7 +172,7 @@ void QgsMeshLayerRenderer::copyVectorDatasetValues( QgsMeshLayer *layer )
}
else
{
mVectorDataOnVertices = metadata.isOnVertices();
mVectorDataOnVertices = metadata.dataType() == QgsMeshDatasetGroupMetadata::DataOnVertices;
int count;
if ( mVectorDataOnVertices )
count = mNativeMesh.vertices.count();
Expand Down
4 changes: 2 additions & 2 deletions src/core/mesh/qgstriangularmesh.cpp
Expand Up @@ -180,8 +180,8 @@ const QVector<int> &QgsTriangularMesh::trianglesToNativeFaces() const

int QgsTriangularMesh::faceIndexForPoint( const QgsPointXY &point ) const
{
const QList<QgsFeatureId> face_indexes = mSpatialIndex.intersects( QgsRectangle( point, point ) );
for ( QgsFeatureId fid : face_indexes )
const QList<QgsFeatureId> faceIndexes = mSpatialIndex.intersects( QgsRectangle( point, point ) );
for ( const QgsFeatureId fid : faceIndexes )
{
int faceIndex = static_cast<int>( fid );
const QgsMeshFace &face = mTriangularMesh.faces.at( faceIndex );
Expand Down
7 changes: 5 additions & 2 deletions src/core/mesh/qgstriangularmesh.h
Expand Up @@ -65,7 +65,7 @@ class CORE_EXPORT QgsTriangularMesh
void update( QgsMesh *nativeMesh, QgsRenderContext *context );

/**
* Returns vertices in map CRS
* Returns vertices in map coordinate system
*
* The list of consist of vertices from native mesh (0-N) and
* extra vertices needed to create triangles (N+1 - len)
Expand All @@ -81,9 +81,12 @@ class CORE_EXPORT QgsTriangularMesh
const QVector<int> &trianglesToNativeFaces() const ;

/**
* Returns triangle index that contains the given point, -1 if no such triangle exists
* Finds index of triangle at given point
* It uses spatial indexing
*
* \param point point in map coordinate system
* \returns triangle index that contains the given point, -1 if no such triangle exists
*
* \since QGIS 3.4
*/
int faceIndexForPoint( const QgsPointXY &point ) const ;
Expand Down
8 changes: 4 additions & 4 deletions tests/src/core/testqgsmeshlayer.cpp
Expand Up @@ -162,7 +162,7 @@ void TestQgsMeshLayer::test_read_vertex_scalar_dataset()
}
QCOMPARE( meta.name(), QString( "VertexScalarDataset" ) );
QVERIFY( meta.isScalar() );
QVERIFY( meta.isOnVertices() );
QVERIFY( meta.dataType() == QgsMeshDatasetGroupMetadata::DataOnVertices );

const QgsMeshDatasetMetadata dmeta = dp->datasetMetadata( ds );
QVERIFY( qgsDoubleNear( dmeta.time(), i ) );
Expand Down Expand Up @@ -200,7 +200,7 @@ void TestQgsMeshLayer::test_read_vertex_vector_dataset()
QCOMPARE( meta.extraOptions()["description"], QString( "Vertex Vector Dataset" ) );
QCOMPARE( meta.name(), QString( "VertexVectorDataset" ) );
QVERIFY( !meta.isScalar() );
QVERIFY( meta.isOnVertices() );
QVERIFY( meta.dataType() == QgsMeshDatasetGroupMetadata::DataOnVertices );

const QgsMeshDatasetMetadata dmeta = dp->datasetMetadata( ds );
QVERIFY( qgsDoubleNear( dmeta.time(), i ) );
Expand Down Expand Up @@ -238,7 +238,7 @@ void TestQgsMeshLayer::test_read_face_scalar_dataset()
QCOMPARE( meta.extraOptions()["description"], QString( "Face Scalar Dataset" ) );
QCOMPARE( meta.name(), QString( "FaceScalarDataset" ) );
QVERIFY( meta.isScalar() );
QVERIFY( !meta.isOnVertices() );
QVERIFY( meta.dataType() == QgsMeshDatasetGroupMetadata::DataOnFaces );

const QgsMeshDatasetMetadata dmeta = dp->datasetMetadata( ds );
QVERIFY( qgsDoubleNear( dmeta.time(), i ) );
Expand Down Expand Up @@ -274,7 +274,7 @@ void TestQgsMeshLayer::test_read_face_vector_dataset()
QCOMPARE( meta.extraOptions()["description"], QString( "Face Vector Dataset" ) );
QCOMPARE( meta.name(), QString( "FaceVectorDataset" ) );
QVERIFY( !meta.isScalar() );
QVERIFY( !meta.isOnVertices() );
QVERIFY( meta.dataType() == QgsMeshDatasetGroupMetadata::DataOnFaces );

const QgsMeshDatasetMetadata dmeta = dp->datasetMetadata( ds );
QVERIFY( qgsDoubleNear( dmeta.time(), i ) );
Expand Down

0 comments on commit 271bab1

Please sign in to comment.