diff --git a/python/core/auto_generated/mesh/qgsmeshdataprovider.sip.in b/python/core/auto_generated/mesh/qgsmeshdataprovider.sip.in index 9839eb564f3..fdd2d76b2ee 100644 --- a/python/core/auto_generated/mesh/qgsmeshdataprovider.sip.in +++ b/python/core/auto_generated/mesh/qgsmeshdataprovider.sip.in @@ -14,14 +14,13 @@ typedef QgsPoint QgsMeshVertex; typedef QVector QgsMeshFace; -typedef QMap QgsMeshDatasetMetadata; - class QgsMeshDatasetValue { %Docstring -QgsMeshDatasetValue is a vector or a scalar value on vertex or face of the mesh with -support of nodata values +QgsMeshDatasetValue represents single mesh dataset value + +could be scalar or vector. Nodata values are represented by NaNs. .. note:: @@ -37,38 +36,21 @@ support of nodata values QgsMeshDatasetValue( double x, double y ); %Docstring -Ctor +Constructor for vector value %End QgsMeshDatasetValue( double scalar ); %Docstring -Ctor +Constructor for scalar value %End - QgsMeshDatasetValue( ); + QgsMeshDatasetValue(); %Docstring -Ctor +Default Ctor, initialize to NaN %End ~QgsMeshDatasetValue(); - void setNodata( bool nodata = true ); -%Docstring -Sets nodata value for this dataset value -%End - bool isNodata() const; -%Docstring -Returns whether it is nodata value -%End - bool isScalar() const; -%Docstring -Returns whether it is scalar value -%End - double scalar() const; -%Docstring -Returns scalar value. Length for vectors, value for scalars -%End - void set( double scalar ); %Docstring Sets scalar value @@ -82,6 +64,11 @@ Sets X value void setY( double y ); %Docstring Sets Y value +%End + + double scalar() const; +%Docstring +Returns magnitude of vector for vector data or scalar value for scalar data %End double x() const; @@ -98,6 +85,60 @@ Returns y value }; + + +class QgsMeshDatasetMetadata +{ +%Docstring + +QgsMeshDatasetMetadata is a collection of mesh dataset metadata such +as if the data is vector or scalar, etc. + +.. note:: + + The API is considered EXPERIMENTAL and can be changed without a notice + +.. versionadded:: 3.2 +%End + +%TypeHeaderCode +#include "qgsmeshdataprovider.h" +%End + public: + QgsMeshDatasetMetadata(); + QgsMeshDatasetMetadata( bool isScalar, + bool isValid, + bool isOnVertices, + const QMap &extraOptions ); + + QMap extraOptions() const; +%Docstring +Returns extra metadata options +Usually including name, description or time variable +%End + + bool isVector() const; +%Docstring + Returns whether dataset has vector data +%End + + bool isScalar() const; +%Docstring + Returns whether dataset has scalar data +%End + + bool isOnVertices() const; +%Docstring + Returns whether dataset data is defined on vertices +%End + + bool isValid() const; +%Docstring + Returns whether dataset is valid +%End + +}; + class QgsMeshSource /Abstract/ { %Docstring @@ -155,7 +196,7 @@ class QgsMeshDatasetSource /Abstract/ %Docstring Dataset is a collection of vector or scalar values on vertices or faces of the mesh -Base on the underlying data provider/format, whole dataset is either stored in memory or +Based on the underlying data provider/format, whole dataset is either stored in memory or read on demand .. note:: @@ -181,29 +222,16 @@ read on demand Returns number of datasets loaded %End - virtual bool datasetHasScalarData( int index ) const = 0; -%Docstring - Returns whether dataset has scalar data associated -%End - - virtual bool datasetIsOnVertices( int index ) const = 0; -%Docstring - Returns whether dataset is on vertices -%End - - virtual QgsMeshDatasetMetadata datasetMetadata( int index ) const = 0; + virtual QgsMeshDatasetMetadata datasetMetadata( int datasetIndex ) const = 0; %Docstring Returns dataset metadata %End virtual QgsMeshDatasetValue datasetValue( int datasetIndex, int valueIndex ) const = 0; %Docstring - Returns value associated with the index from the dataset -%End + Returns vector/scalar value associated with the index from the dataset - virtual bool datasetIsValid( int index ) const = 0; -%Docstring - Returns whether dataset is valid +See QgsMeshDatasetMetadata.isVector() to check if the returned value is vector or scalar %End }; diff --git a/python/core/auto_generated/mesh/qgsmeshlayer.sip.in b/python/core/auto_generated/mesh/qgsmeshlayer.sip.in index 46083a31764..0d1b3fff381 100644 --- a/python/core/auto_generated/mesh/qgsmeshlayer.sip.in +++ b/python/core/auto_generated/mesh/qgsmeshlayer.sip.in @@ -10,6 +10,8 @@ +const int NO_ACTIVE_MESH_DATASET; + class QgsMeshLayer : QgsMapLayer { @@ -121,7 +123,7 @@ Returns the provider type for this layer - QgsMeshRendererMeshSettings rendererNativeMeshSettings() const /Factory/; + QgsMeshRendererMeshSettings rendererNativeMeshSettings() const; %Docstring Returns rendrer settings %End @@ -131,7 +133,7 @@ Returns rendrer settings Sets new rendering settings, triggers repaint %End - QgsMeshRendererMeshSettings rendererTriangularMeshSettings() const /Factory/; + QgsMeshRendererMeshSettings rendererTriangularMeshSettings() const; %Docstring Returns rendrer settings %End @@ -141,7 +143,7 @@ Returns rendrer settings Sets new rendering settings, triggers repaint %End - QgsMeshRendererScalarSettings rendererScalarSettings() const /Factory/; + QgsMeshRendererScalarSettings rendererScalarSettings() const; %Docstring Returns rendrer settings %End @@ -151,7 +153,7 @@ Returns rendrer settings Sets new rendering settings, triggers repaint %End - QgsMeshRendererVectorSettings rendererVectorSettings() const /Factory/; + QgsMeshRendererVectorSettings rendererVectorSettings() const; %Docstring Returns rendrer settings %End @@ -161,18 +163,22 @@ Returns rendrer settings Sets new rendering settings, triggers repaint %End - void setActiveScalarDataset( int index = -1 ); + void setActiveScalarDataset( int index = NO_ACTIVE_MESH_DATASET ); %Docstring Sets active scalar dataset for rendering + +Triggers repaint %End int activeScalarDataset() const; %Docstring Returns active scalar dataset %End - void setActiveVectorDataset( int index = -1 ); + void setActiveVectorDataset( int index = NO_ACTIVE_MESH_DATASET ); %Docstring -Sets active vector dataset for rendering. If dataset is not vector based, do nothing +Sets active vector dataset for rendering. + +If dataset is not vector based, do nothing. Triggers repaint %End int activeVectorDataset() const; %Docstring diff --git a/python/core/auto_generated/mesh/qgsmeshrenderersettings.sip.in b/python/core/auto_generated/mesh/qgsmeshrenderersettings.sip.in index ae646adc7ab..6b3eec34b5f 100644 --- a/python/core/auto_generated/mesh/qgsmeshrenderersettings.sip.in +++ b/python/core/auto_generated/mesh/qgsmeshrenderersettings.sip.in @@ -140,7 +140,7 @@ Represents a mesh renderer settings for vector datasets #include "qgsmeshrenderersettings.h" %End public: - enum VectorRenderingType + enum ArrowScalingMethod { MinMax, @@ -198,11 +198,11 @@ Sets filter value for vector magnitudes. .. seealso:: :py:func:`QgsMeshRendererVectorSettings.vectorFilterMax` %End - QgsMeshRendererVectorSettings::VectorRenderingType shaftLengthMethod() const; + QgsMeshRendererVectorSettings::ArrowScalingMethod shaftLengthMethod() const; %Docstring Returns method used for drawing arrows %End - void setShaftLengthMethod( const QgsMeshRendererVectorSettings::VectorRenderingType &shaftLengthMethod ); + void setShaftLengthMethod( const QgsMeshRendererVectorSettings::ArrowScalingMethod &shaftLengthMethod ); %Docstring Sets method used for drawing arrows %End @@ -211,46 +211,56 @@ Sets method used for drawing arrows %Docstring Returns mininimum shaft length (in millimeters) -Only for QgsMeshRendererVectorSettings.ArrowType.MinMax +Only for QgsMeshRendererVectorSettings.ArrowScalingMethod.MinMax %End void setMinShaftLength( double minShaftLength ); %Docstring Sets mininimum shaft length (in millimeters) -Only for QgsMeshRendererVectorSettings.ArrowType.MinMax +Only for QgsMeshRendererVectorSettings.ArrowScalingMethod.MinMax %End double maxShaftLength() const; %Docstring Returns maximum shaft length (in millimeters) -Only for QgsMeshRendererVectorSettings.ArrowType.MinMax +Only for QgsMeshRendererVectorSettings.ArrowScalingMethod.MinMax %End void setMaxShaftLength( double maxShaftLength ); %Docstring Sets maximum shaft length (in millimeters) -Only for QgsMeshRendererVectorSettings.ArrowType.MinMax +Only for QgsMeshRendererVectorSettings.ArrowScalingMethod.MinMax %End double scaleFactor() const; %Docstring -Returns scale factor. Only for QgsMeshRendererVectorSettings.ArrowType.Scaled +Returns scale factor + +Only for QgsMeshRendererVectorSettings.ArrowScalingMethod.Scaled %End + void setScaleFactor( double scaleFactor ); %Docstring -Sets scale factor. Only for QgsMeshRendererVectorSettings.ArrowType.Scaled +Sets scale factor + +Only for QgsMeshRendererVectorSettings.ArrowScalingMethod.Scaled %End double fixedShaftLength() const; %Docstring -Returns fixed arrow length (in millimeters). Only for QgsMeshRendererVectorSettings.ArrowType.Fixed +Returns fixed arrow length (in millimeters) + +Only for QgsMeshRendererVectorSettings.ArrowScalingMethod.Fixed %End + void setFixedShaftLength( double fixedShaftLength ); %Docstring -Sets fixed length (in millimeters). Only for QgsMeshRendererVectorSettings.ArrowType.Fixed +Sets fixed length (in millimeters) + +Only for QgsMeshRendererVectorSettings.ArrowScalingMethod.Fixed %End double arrowHeadWidthRatio() const; diff --git a/python/core/core_auto.sip b/python/core/core_auto.sip index f47eaa9003f..714240680a6 100644 --- a/python/core/core_auto.sip +++ b/python/core/core_auto.sip @@ -1,3 +1,4 @@ +// Include auto-generated SIP files %Include auto_generated/expression/qgsexpression.sip %Include auto_generated/expression/qgsexpressionnode.sip %Include auto_generated/expression/qgsexpressionnodeimpl.sip diff --git a/src/core/mesh/qgsmeshdataprovider.cpp b/src/core/mesh/qgsmeshdataprovider.cpp index 6f2a57e0c1d..163d14bd8bc 100644 --- a/src/core/mesh/qgsmeshdataprovider.cpp +++ b/src/core/mesh/qgsmeshdataprovider.cpp @@ -40,41 +40,22 @@ QgsRectangle QgsMeshDataProvider::extent() const } -QgsMeshDatasetValue::QgsMeshDatasetValue( double x, double y ) -{ - setX( x ); - setY( y ); -} +QgsMeshDatasetValue::QgsMeshDatasetValue( double x, double y ): mX( x ), mY( y ) +{} -QgsMeshDatasetValue::QgsMeshDatasetValue( double scalar ) -{ - set( scalar ); -} - -void QgsMeshDatasetValue::setNodata( bool nodata ) -{ - mIsNodata = nodata; -} - -bool QgsMeshDatasetValue::isNodata() const -{return mIsNodata;} - -bool QgsMeshDatasetValue::isScalar() const -{ - return mIsScalar; -} +QgsMeshDatasetValue::QgsMeshDatasetValue( double scalar ): mX( scalar ) +{} double QgsMeshDatasetValue::scalar() const { - if ( isNodata() ) - { - return std::numeric_limits::quiet_NaN(); - } - - if ( isScalar() ) + if ( std::isnan( mY ) ) { return mX; } + else if ( std::isnan( mX ) ) + { + return std::numeric_limits::quiet_NaN(); + } else { return std::sqrt( ( mX ) * ( mX ) + ( mY ) * ( mY ) ); @@ -84,29 +65,16 @@ double QgsMeshDatasetValue::scalar() const void QgsMeshDatasetValue::set( double scalar ) { setX( scalar ); - mIsScalar = true; } void QgsMeshDatasetValue::setX( double x ) { mX = x; - if ( std::isnan( x ) ) - { - mIsNodata = true; - } - else - { - mIsNodata = false; - } } void QgsMeshDatasetValue::setY( double y ) { mY = y; - if ( std::isnan( y ) ) - { - mIsScalar = true; - } } double QgsMeshDatasetValue::x() const @@ -121,22 +89,58 @@ double QgsMeshDatasetValue::y() const bool QgsMeshDatasetValue::operator==( const QgsMeshDatasetValue &other ) const { - bool equal = true; - if ( isNodata() ) - equal = other.isNodata(); - else + bool equal = std::isnan( mX ) == std::isnan( other.x() ); + equal &= std::isnan( mY ) == std::isnan( other.y() ); + + if ( equal ) { - if ( isScalar() ) + if ( std::isnan( mY ) ) { - equal &= other.isScalar(); equal &= qgsDoubleNear( other.x(), mX, 1E-8 ); } else { - equal &= !other.isScalar(); equal &= qgsDoubleNear( other.x(), mX, 1E-8 ); equal &= qgsDoubleNear( other.y(), mY, 1E-8 ); } } return equal; } + +QgsMeshDatasetMetadata::QgsMeshDatasetMetadata( + bool isScalar, + bool isValid, + bool isOnVertices, + const QMap &extraOptions ) + : mIsScalar( isScalar ) + , mIsValid( isValid ) + , mIsOnVertices( isOnVertices ) + , mExtraOptions( extraOptions ) +{ +} + +QMap QgsMeshDatasetMetadata::extraOptions() const +{ + return mExtraOptions; +} + +bool QgsMeshDatasetMetadata::isVector() const +{ + return !mIsScalar; +} + +bool QgsMeshDatasetMetadata::isScalar() const +{ + return mIsScalar; +} + +bool QgsMeshDatasetMetadata::isValid() const +{ + return mIsValid; +} + + +bool QgsMeshDatasetMetadata::isOnVertices() const +{ + return mIsOnVertices; +} diff --git a/src/core/mesh/qgsmeshdataprovider.h b/src/core/mesh/qgsmeshdataprovider.h index 6b944c5f109..2437c84d94b 100644 --- a/src/core/mesh/qgsmeshdataprovider.h +++ b/src/core/mesh/qgsmeshdataprovider.h @@ -34,14 +34,12 @@ typedef QgsPoint QgsMeshVertex; //! List of vertex indexes typedef QVector QgsMeshFace; -//! Dataset's metadata key:value map -typedef QMap QgsMeshDatasetMetadata; - /** * \ingroup core * - * QgsMeshDatasetValue is a vector or a scalar value on vertex or face of the mesh with - * support of nodata values + * QgsMeshDatasetValue represents single mesh dataset value + * + * could be scalar or vector. Nodata values are represented by NaNs. * * \note The API is considered EXPERIMENTAL and can be changed without a notice * @@ -49,31 +47,20 @@ typedef QMap QgsMeshDatasetMetadata; */ class CORE_EXPORT QgsMeshDatasetValue { - Q_GADGET - public: - //! Ctor + //! Constructor for vector value QgsMeshDatasetValue( double x, double y ); - //! Ctor + //! Constructor for scalar value QgsMeshDatasetValue( double scalar ); - //! Ctor - QgsMeshDatasetValue( ) = default; + //! Default Ctor, initialize to NaN + QgsMeshDatasetValue() = default; //! Dtor ~QgsMeshDatasetValue() = default; - //! Sets nodata value for this dataset value - void setNodata( bool nodata = true ); - //! Returns whether it is nodata value - bool isNodata() const; - //! Returns whether it is scalar value - bool isScalar() const; - //! Returns scalar value. Length for vectors, value for scalars - double scalar() const; - //! Sets scalar value void set( double scalar ); @@ -83,6 +70,9 @@ class CORE_EXPORT QgsMeshDatasetValue //! Sets Y value void setY( double y ) ; + //! Returns magnitude of vector for vector data or scalar value for scalar data + double scalar() const; + //! Returns x value double x() const; @@ -95,8 +85,60 @@ class CORE_EXPORT QgsMeshDatasetValue private: double mX = std::numeric_limits::quiet_NaN(); double mY = std::numeric_limits::quiet_NaN(); - bool mIsNodata = true; - bool mIsScalar = true; +}; + + + +/** + * \ingroup core + * + * QgsMeshDatasetMetadata is a collection of mesh dataset metadata such + * as if the data is vector or scalar, etc. + * + * \note The API is considered EXPERIMENTAL and can be changed without a notice + * + * \since QGIS 3.2 + */ +class CORE_EXPORT QgsMeshDatasetMetadata +{ + public: + QgsMeshDatasetMetadata() = default; + QgsMeshDatasetMetadata( bool isScalar, + bool isValid, + bool isOnVertices, + const QMap &extraOptions ); + + /** + * Returns extra metadata options + * Usually including name, description or time variable + */ + QMap extraOptions() const; + + /** + * \brief Returns whether dataset has vector data + */ + bool isVector() const; + + /** + * \brief Returns whether dataset has scalar data + */ + bool isScalar() const; + + /** + * \brief Returns whether dataset data is defined on vertices + */ + bool isOnVertices() const; + + /** + * \brief Returns whether dataset is valid + */ + bool isValid() const; + + private: + bool mIsScalar = false; + bool mIsValid = false; + bool mIsOnVertices = false; + QMap mExtraOptions; }; /** @@ -147,7 +189,7 @@ class CORE_EXPORT QgsMeshSource SIP_ABSTRACT * \ingroup core * Dataset is a collection of vector or scalar values on vertices or faces of the mesh * - * Base on the underlying data provider/format, whole dataset is either stored in memory or + * Based on the underlying data provider/format, whole dataset is either stored in memory or * read on demand * * \note The API is considered EXPERIMENTAL and can be changed without a notice @@ -170,30 +212,17 @@ class CORE_EXPORT QgsMeshDatasetSource SIP_ABSTRACT */ virtual int datasetCount() const = 0; - /** - * \brief Returns whether dataset has scalar data associated - */ - virtual bool datasetHasScalarData( int index ) const = 0; - - /** - * \brief Returns whether dataset is on vertices - */ - virtual bool datasetIsOnVertices( int index ) const = 0; - /** * \brief Returns dataset metadata */ - virtual QgsMeshDatasetMetadata datasetMetadata( int index ) const = 0; + virtual QgsMeshDatasetMetadata datasetMetadata( int datasetIndex ) const = 0; /** - * \brief Returns value associated with the index from the dataset + * \brief Returns vector/scalar value associated with the index from the dataset + * + * See QgsMeshDatasetMetadata::isVector() to check if the returned value is vector or scalar */ virtual QgsMeshDatasetValue datasetValue( int datasetIndex, int valueIndex ) const = 0; - - /** - * \brief Returns whether dataset is valid - */ - virtual bool datasetIsValid( int index ) const = 0; }; diff --git a/src/core/mesh/qgsmeshlayer.cpp b/src/core/mesh/qgsmeshlayer.cpp index 55b0bde20b3..87e7ba671a0 100644 --- a/src/core/mesh/qgsmeshlayer.cpp +++ b/src/core/mesh/qgsmeshlayer.cpp @@ -144,28 +144,36 @@ void QgsMeshLayer::setRendererVectorSettings( const QgsMeshRendererVectorSetting void QgsMeshLayer::setActiveScalarDataset( int index ) { - if ( index < 0 ) - { - mActiveScalarDataset = -1; + if ( index == mActiveScalarDataset ) return; - } - Q_ASSERT( dataProvider()->datasetCount() > index ); - // for vector datasets, we render magnitude - mActiveScalarDataset = index; + if ( ( index >= 0 ) && ( index < dataProvider()->datasetCount() ) ) + mActiveScalarDataset = index; + else + mActiveScalarDataset = NO_ACTIVE_MESH_DATASET; + + triggerRepaint(); } void QgsMeshLayer::setActiveVectorDataset( int index ) { - if ( index < 0 ) - { - mActiveVectorDataset = -1; + if ( index == mActiveVectorDataset ) return; + + if ( ( index < 0 ) || ( index >= dataProvider()->datasetCount() ) ) + { + mActiveVectorDataset = NO_ACTIVE_MESH_DATASET; + } + else + { + const QgsMeshDatasetMetadata metadata = dataProvider()->datasetMetadata( index ); + if ( metadata.isVector() ) + mActiveVectorDataset = index; + else + mActiveVectorDataset = NO_ACTIVE_MESH_DATASET; } - Q_ASSERT( dataProvider()->datasetCount() > index ); - if ( !dataProvider()->datasetHasScalarData( index ) ) - mActiveVectorDataset = index; + triggerRepaint(); } void QgsMeshLayer::fillNativeMesh() diff --git a/src/core/mesh/qgsmeshlayer.h b/src/core/mesh/qgsmeshlayer.h index 5127121e016..482fc29bd9f 100644 --- a/src/core/mesh/qgsmeshlayer.h +++ b/src/core/mesh/qgsmeshlayer.h @@ -26,6 +26,8 @@ #include "qgsmeshdataprovider.h" #include "qgsmeshrenderersettings.h" +const int NO_ACTIVE_MESH_DATASET = -1; + class QgsMapLayerRenderer; class QgsSymbol; class QgsTriangularMesh; @@ -132,36 +134,44 @@ class CORE_EXPORT QgsMeshLayer : public QgsMapLayer QgsTriangularMesh *triangularMesh() SIP_SKIP; //! Returns rendrer settings - QgsMeshRendererMeshSettings rendererNativeMeshSettings() const SIP_FACTORY; + QgsMeshRendererMeshSettings rendererNativeMeshSettings() const; //! Sets new rendering settings, triggers repaint void setRendererNativeMeshSettings( const QgsMeshRendererMeshSettings &settings ); //! Returns rendrer settings - QgsMeshRendererMeshSettings rendererTriangularMeshSettings() const SIP_FACTORY; + QgsMeshRendererMeshSettings rendererTriangularMeshSettings() const; //! Sets new rendering settings, triggers repaint void setRendererTriangularMeshSettings( const QgsMeshRendererMeshSettings &settings ); //! Returns rendrer settings - QgsMeshRendererScalarSettings rendererScalarSettings() const SIP_FACTORY; + QgsMeshRendererScalarSettings rendererScalarSettings() const; //! Sets new rendering settings, triggers repaint void setRendererScalarSettings( const QgsMeshRendererScalarSettings &settings ); //! Returns rendrer settings - QgsMeshRendererVectorSettings rendererVectorSettings() const SIP_FACTORY; + QgsMeshRendererVectorSettings rendererVectorSettings() const; //! Sets new rendering settings, triggers repaint void setRendererVectorSettings( const QgsMeshRendererVectorSettings &settings ); - //! Sets active scalar dataset for rendering - void setActiveScalarDataset( int index = -1 ); + /** + * Sets active scalar dataset for rendering + * + * Triggers repaint + */ + void setActiveScalarDataset( int index = NO_ACTIVE_MESH_DATASET ); //! Returns active scalar dataset int activeScalarDataset() const { return mActiveScalarDataset; } - //! Sets active vector dataset for rendering. If dataset is not vector based, do nothing - void setActiveVectorDataset( int index = -1 ); + /** + * Sets active vector dataset for rendering. + * + * If dataset is not vector based, do nothing. Triggers repaint + */ + void setActiveVectorDataset( int index = NO_ACTIVE_MESH_DATASET ); //! Returns active vector dataset int activeVectorDataset() const { return mActiveVectorDataset; } @@ -204,10 +214,10 @@ class CORE_EXPORT QgsMeshLayer : public QgsMapLayer QgsMeshRendererVectorSettings mRendererVectorSettings; //! index of active scalar dataset; -1 if none - int mActiveScalarDataset = -1; + int mActiveScalarDataset = NO_ACTIVE_MESH_DATASET; //! index of active vector dataset; -1 if none - int mActiveVectorDataset = -1; + int mActiveVectorDataset = NO_ACTIVE_MESH_DATASET; }; #endif //QGSMESHLAYER_H diff --git a/src/core/mesh/qgsmeshlayerrenderer.cpp b/src/core/mesh/qgsmeshlayerrenderer.cpp index eb8c0d11867..83f93e2a006 100644 --- a/src/core/mesh/qgsmeshlayerrenderer.cpp +++ b/src/core/mesh/qgsmeshlayerrenderer.cpp @@ -92,9 +92,10 @@ void QgsMeshLayerRenderer::createMeshSymbol( std::unique_ptr &symbol, void QgsMeshLayerRenderer::copyScalarDatasetValues( QgsMeshLayer *layer ) { int datasetIndex = layer->activeScalarDataset(); - if ( datasetIndex != -1 ) + if ( datasetIndex != NO_ACTIVE_MESH_DATASET ) { - mScalarDataOnVertices = layer->dataProvider()->datasetIsOnVertices( datasetIndex ); + const QgsMeshDatasetMetadata metadata = layer->dataProvider()->datasetMetadata( datasetIndex ); + mScalarDataOnVertices = metadata.isOnVertices(); int count; if ( mScalarDataOnVertices ) count = mNativeMesh.vertices.count(); @@ -113,16 +114,18 @@ void QgsMeshLayerRenderer::copyScalarDatasetValues( QgsMeshLayer *layer ) void QgsMeshLayerRenderer::copyVectorDatasetValues( QgsMeshLayer *layer ) { int datasetIndex = layer->activeVectorDataset(); - if ( datasetIndex != -1 ) + if ( datasetIndex != NO_ACTIVE_MESH_DATASET ) { - bool isScalar = layer->dataProvider()->datasetHasScalarData( datasetIndex ); + const QgsMeshDatasetMetadata metadata = layer->dataProvider()->datasetMetadata( datasetIndex ); + + bool isScalar = metadata.isScalar(); if ( isScalar ) { QgsDebugMsg( "Dataset has no vector values" ); } else { - mVectorDataOnVertices = layer->dataProvider()->datasetIsOnVertices( datasetIndex ); + mVectorDataOnVertices = metadata.isOnVertices(); int count; if ( mVectorDataOnVertices ) count = mNativeMesh.vertices.count(); diff --git a/src/core/mesh/qgsmeshmemorydataprovider.cpp b/src/core/mesh/qgsmeshmemorydataprovider.cpp index 5c66c3b696c..628f57df70f 100644 --- a/src/core/mesh/qgsmeshmemorydataprovider.cpp +++ b/src/core/mesh/qgsmeshmemorydataprovider.cpp @@ -236,11 +236,6 @@ bool QgsMeshMemoryDataProvider::addDatasetValues( const QString &def, QgsMeshMem { point.setX( values[0].toDouble() ); point.setY( values[1].toDouble() ); - if ( values.size() > 2 ) - { - Q_ASSERT( false ); - //TODO Not implemented - } } } @@ -322,35 +317,38 @@ int QgsMeshMemoryDataProvider::datasetCount() const return mDatasets.count(); } -bool QgsMeshMemoryDataProvider::datasetHasScalarData( int index ) const -{ - Q_ASSERT( datasetCount() > index ); - return mDatasets[index].isScalar; -} - -bool QgsMeshMemoryDataProvider::datasetIsOnVertices( int index ) const -{ - Q_ASSERT( datasetCount() > index ); - return mDatasets[index].isOnVertices; -} - QgsMeshDatasetMetadata QgsMeshMemoryDataProvider::datasetMetadata( int index ) const { - Q_ASSERT( datasetCount() > index ); - return mDatasets[index].metadata; + if ( ( index >= 0 ) && ( index < datasetCount() ) ) + { + QgsMeshDatasetMetadata metadata( + mDatasets[index].isScalar, + mDatasets[index].valid, + mDatasets[index].isOnVertices, + mDatasets[index].metadata + ); + return metadata; + } + else + { + return QgsMeshDatasetMetadata(); + } } QgsMeshDatasetValue QgsMeshMemoryDataProvider::datasetValue( int datasetIndex, int valueIndex ) const { - Q_ASSERT( datasetCount() > datasetIndex ); - Q_ASSERT( mDatasets[datasetIndex].values.count() > valueIndex ); - return mDatasets[datasetIndex].values[valueIndex]; + if ( ( datasetIndex >= 0 ) && + ( datasetIndex < datasetCount() ) && + ( valueIndex >= 0 ) && + ( valueIndex < mDatasets[datasetIndex].values.count() ) ) + { + return mDatasets[datasetIndex].values[valueIndex]; + } + else + { + return QgsMeshDatasetValue(); + } } -bool QgsMeshMemoryDataProvider::datasetIsValid( int index ) const -{ - Q_ASSERT( datasetCount() > index ); - return mDatasets[index].valid; -} ///@endcond diff --git a/src/core/mesh/qgsmeshmemorydataprovider.h b/src/core/mesh/qgsmeshmemorydataprovider.h index a170c1dff63..f3c26d0a4c3 100644 --- a/src/core/mesh/qgsmeshmemorydataprovider.h +++ b/src/core/mesh/qgsmeshmemorydataprovider.h @@ -31,9 +31,8 @@ struct QgsMeshMemoryDataset { - QgsMeshDatasetMetadata metadata; + QMap metadata; QVector values; - bool isScalar = true; bool isOnVertices = true; bool valid = false; @@ -111,11 +110,9 @@ class QgsMeshMemoryDataProvider: public QgsMeshDataProvider */ bool addDataset( const QString &uri ) override; int datasetCount() const override; - bool datasetHasScalarData( int index ) const override; - bool datasetIsOnVertices( int index ) const override; - QgsMeshDatasetMetadata datasetMetadata( int index ) const override; + + QgsMeshDatasetMetadata datasetMetadata( int datasetIndex ) const override; QgsMeshDatasetValue datasetValue( int datasetIndex, int valueIndex ) const override; - bool datasetIsValid( int index ) const override; //! Returns the memory provider key static QString providerKey(); diff --git a/src/core/mesh/qgsmeshrenderersettings.cpp b/src/core/mesh/qgsmeshrenderersettings.cpp index 635ab1aa8a9..8e18b18ab58 100644 --- a/src/core/mesh/qgsmeshrenderersettings.cpp +++ b/src/core/mesh/qgsmeshrenderersettings.cpp @@ -127,12 +127,12 @@ void QgsMeshRendererVectorSettings::setFilterMax( double vectorFilterMax ) mFilterMax = vectorFilterMax; } -QgsMeshRendererVectorSettings::VectorRenderingType QgsMeshRendererVectorSettings::shaftLengthMethod() const +QgsMeshRendererVectorSettings::ArrowScalingMethod QgsMeshRendererVectorSettings::shaftLengthMethod() const { return mShaftLengthMethod; } -void QgsMeshRendererVectorSettings::setShaftLengthMethod( const QgsMeshRendererVectorSettings::VectorRenderingType &shaftLengthMethod ) +void QgsMeshRendererVectorSettings::setShaftLengthMethod( const QgsMeshRendererVectorSettings::ArrowScalingMethod &shaftLengthMethod ) { mShaftLengthMethod = shaftLengthMethod; } diff --git a/src/core/mesh/qgsmeshrenderersettings.h b/src/core/mesh/qgsmeshrenderersettings.h index 6210b628fcf..5ac07ae8d28 100644 --- a/src/core/mesh/qgsmeshrenderersettings.h +++ b/src/core/mesh/qgsmeshrenderersettings.h @@ -127,7 +127,7 @@ class CORE_EXPORT QgsMeshRendererVectorSettings { public: //! Algorithm how to transform vector magnitude to length of arrow on the device in pixels - enum VectorRenderingType + enum ArrowScalingMethod { /** @@ -185,46 +185,64 @@ class CORE_EXPORT QgsMeshRendererVectorSettings void setFilterMax( double filterMax ); //! Returns method used for drawing arrows - QgsMeshRendererVectorSettings::VectorRenderingType shaftLengthMethod() const; + QgsMeshRendererVectorSettings::ArrowScalingMethod shaftLengthMethod() const; //! Sets method used for drawing arrows - void setShaftLengthMethod( const QgsMeshRendererVectorSettings::VectorRenderingType &shaftLengthMethod ); + void setShaftLengthMethod( const QgsMeshRendererVectorSettings::ArrowScalingMethod &shaftLengthMethod ); /** * Returns mininimum shaft length (in millimeters) * - * Only for QgsMeshRendererVectorSettings::ArrowType::MinMax + * Only for QgsMeshRendererVectorSettings::ArrowScalingMethod::MinMax */ double minShaftLength() const; /** * Sets mininimum shaft length (in millimeters) * - * Only for QgsMeshRendererVectorSettings::ArrowType::MinMax + * Only for QgsMeshRendererVectorSettings::ArrowScalingMethod::MinMax */ void setMinShaftLength( double minShaftLength ); /** * Returns maximum shaft length (in millimeters) * - * Only for QgsMeshRendererVectorSettings::ArrowType::MinMax + * Only for QgsMeshRendererVectorSettings::ArrowScalingMethod::MinMax */ double maxShaftLength() const; /** * Sets maximum shaft length (in millimeters) * - * Only for QgsMeshRendererVectorSettings::ArrowType::MinMax + * Only for QgsMeshRendererVectorSettings::ArrowScalingMethod::MinMax */ void setMaxShaftLength( double maxShaftLength ); - //! Returns scale factor. Only for QgsMeshRendererVectorSettings::ArrowType::Scaled + /** + * Returns scale factor + * + * Only for QgsMeshRendererVectorSettings::ArrowScalingMethod::Scaled + */ double scaleFactor() const; - //! Sets scale factor. Only for QgsMeshRendererVectorSettings::ArrowType::Scaled + + /** + * Sets scale factor + * + * Only for QgsMeshRendererVectorSettings::ArrowScalingMethod::Scaled + */ void setScaleFactor( double scaleFactor ); - //! Returns fixed arrow length (in millimeters). Only for QgsMeshRendererVectorSettings::ArrowType::Fixed + /** + * Returns fixed arrow length (in millimeters) + * + * Only for QgsMeshRendererVectorSettings::ArrowScalingMethod::Fixed + */ double fixedShaftLength() const; - //! Sets fixed length (in millimeters). Only for QgsMeshRendererVectorSettings::ArrowType::Fixed + + /** + * Sets fixed length (in millimeters) + * + * Only for QgsMeshRendererVectorSettings::ArrowScalingMethod::Fixed + */ void setFixedShaftLength( double fixedShaftLength ); //! Returns ratio of the head width of the arrow (range 0-1) @@ -242,7 +260,7 @@ class CORE_EXPORT QgsMeshRendererVectorSettings QColor mColor = Qt::black; double mFilterMin = -1; //disabled double mFilterMax = -1; //disabled - QgsMeshRendererVectorSettings::VectorRenderingType mShaftLengthMethod = QgsMeshRendererVectorSettings::VectorRenderingType::MinMax; + QgsMeshRendererVectorSettings::ArrowScalingMethod mShaftLengthMethod = QgsMeshRendererVectorSettings::ArrowScalingMethod::MinMax; double mMinShaftLength = 0.8; //in milimeters double mMaxShaftLength = 10; //in milimeters double mScaleFactor = 10; diff --git a/src/core/mesh/qgsmeshvectorrenderer.cpp b/src/core/mesh/qgsmeshvectorrenderer.cpp index ffb6bd08391..805f4900416 100644 --- a/src/core/mesh/qgsmeshvectorrenderer.cpp +++ b/src/core/mesh/qgsmeshvectorrenderer.cpp @@ -118,7 +118,7 @@ bool QgsMeshVectorRenderer::calcVectorLineEnd( double yDist = 0.0; switch ( mCfg.shaftLengthMethod() ) { - case QgsMeshRendererVectorSettings::VectorRenderingType::MinMax: + case QgsMeshRendererVectorSettings::ArrowScalingMethod::MinMax: { double minShaftLength = mContext.convertToPainterUnits( mCfg.minShaftLength(), QgsUnitTypes::RenderUnit::RenderMillimeters ); @@ -132,14 +132,14 @@ bool QgsMeshVectorRenderer::calcVectorLineEnd( yDist = sinAlpha * L; break; } - case QgsMeshRendererVectorSettings::VectorRenderingType::Scaled: + case QgsMeshRendererVectorSettings::ArrowScalingMethod::Scaled: { double scaleFactor = mCfg.scaleFactor(); xDist = scaleFactor * xVal; yDist = scaleFactor * yVal; break; } - case QgsMeshRendererVectorSettings::VectorRenderingType::Fixed: + case QgsMeshRendererVectorSettings::ArrowScalingMethod::Fixed: { // We must be using a fixed length double fixedShaftLength = mContext.convertToPainterUnits( mCfg.fixedShaftLength(), diff --git a/src/providers/mdal/qgsmdalprovider.cpp b/src/providers/mdal/qgsmdalprovider.cpp index 8ccb2c21980..7db467fd573 100644 --- a/src/providers/mdal/qgsmdalprovider.cpp +++ b/src/providers/mdal/qgsmdalprovider.cpp @@ -109,65 +109,63 @@ int QgsMdalProvider::datasetCount() const return MDAL_M_datasetCount( mMeshH ); } -bool QgsMdalProvider::datasetHasScalarData( int index ) const +QgsMeshDatasetMetadata QgsMdalProvider::datasetMetadata( int datasetIndex ) const { - Q_ASSERT( index < mDatasets.length() ); - DatasetH dataset = mDatasets[index]; - return MDAL_D_hasScalarData( dataset ); -} + if ( datasetIndex >= mDatasets.length() ) + return QgsMeshDatasetMetadata(); -bool QgsMdalProvider::datasetIsOnVertices( int index ) const -{ - Q_ASSERT( index < mDatasets.length() ); - DatasetH dataset = mDatasets[index]; - return MDAL_D_isOnVertices( dataset ); -} + if ( datasetIndex < 0 ) + return QgsMeshDatasetMetadata(); -QgsMeshDatasetMetadata QgsMdalProvider::datasetMetadata( int index ) const -{ - Q_ASSERT( index < mDatasets.length() ); - DatasetH dataset = mDatasets[index]; - QgsMeshDatasetMetadata meta; + DatasetH dataset = mDatasets[datasetIndex]; + bool isScalar = MDAL_D_hasScalarData( dataset ); + bool isValid = MDAL_D_isValid( dataset ); + bool isOnVertices = MDAL_D_isOnVertices( dataset ); + + QMap metadata; int n = MDAL_D_metadataCount( dataset ); for ( int i = 0; i < n; ++i ) { QString key = MDAL_D_metadataKey( dataset, i ); QString value = MDAL_D_metadataValue( dataset, i ); - meta[key] = value; + metadata[key] = value; } + QgsMeshDatasetMetadata meta( + isScalar, + isValid, + isOnVertices, + metadata + ); + return meta; } QgsMeshDatasetValue QgsMdalProvider::datasetValue( int datasetIndex, int valueIndex ) const { - Q_ASSERT( datasetIndex < mDatasets.length() ); - DatasetH dataset = mDatasets[datasetIndex]; + if ( datasetIndex >= mDatasets.length() ) + return QgsMeshDatasetValue(); + if ( datasetIndex < 0 ) + return QgsMeshDatasetValue(); + + DatasetH dataset = mDatasets[datasetIndex]; QgsMeshDatasetValue val; - if ( datasetHasScalarData( datasetIndex ) ) + if ( MDAL_D_hasScalarData( dataset ) ) { val.setX( MDAL_D_value( dataset, valueIndex ) ); } else { val.setX( MDAL_D_valueX( dataset, valueIndex ) ); - val.setY( MDAL_D_valueX( dataset, valueIndex ) ); + val.setY( MDAL_D_valueY( dataset, valueIndex ) ); } return val; } -bool QgsMdalProvider::datasetIsValid( int index ) const -{ - Q_ASSERT( index < mDatasets.length() ); - DatasetH dataset = mDatasets[index]; - return MDAL_D_isValid( dataset ); -} - - void QgsMdalProvider::refreshDatasets() { mDatasets.clear(); diff --git a/src/providers/mdal/qgsmdalprovider.h b/src/providers/mdal/qgsmdalprovider.h index 9c7bbeb4c25..9af2fc8ef57 100644 --- a/src/providers/mdal/qgsmdalprovider.h +++ b/src/providers/mdal/qgsmdalprovider.h @@ -59,11 +59,8 @@ class QgsMdalProvider : public QgsMeshDataProvider bool addDataset( const QString &uri ) override; int datasetCount() const override; - bool datasetHasScalarData( int index ) const override; - bool datasetIsOnVertices( int index ) const override; - QgsMeshDatasetMetadata datasetMetadata( int index ) const override; + QgsMeshDatasetMetadata datasetMetadata( int datasetIndex ) const override; QgsMeshDatasetValue datasetValue( int datasetIndex, int valueIndex ) const override; - bool datasetIsValid( int index ) const override; private: void refreshDatasets(); diff --git a/tests/src/core/testqgsmeshlayer.cpp b/tests/src/core/testqgsmeshlayer.cpp index 997f190132f..83001f75398 100644 --- a/tests/src/core/testqgsmeshlayer.cpp +++ b/tests/src/core/testqgsmeshlayer.cpp @@ -151,14 +151,14 @@ void TestQgsMeshLayer::test_read_vertex_scalar_dataset() QCOMPARE( 4, dp->datasetCount() ); - QgsMeshDatasetMetadata meta = dp->datasetMetadata( ds ); - QCOMPARE( meta.count(), 2 ); - QCOMPARE( meta["name"], QString( "VertexScalarDataset" ) ); - QVERIFY( qgsDoubleNear( meta["time"].toDouble(), 0.0 ) ); + const QgsMeshDatasetMetadata meta = dp->datasetMetadata( ds ); + QCOMPARE( meta.extraOptions().count(), 2 ); + QCOMPARE( meta.extraOptions()["name"], QString( "VertexScalarDataset" ) ); + QVERIFY( qgsDoubleNear( meta.extraOptions()["time"].toDouble(), 0.0 ) ); - QVERIFY( dp->datasetIsValid( ds ) ); - QVERIFY( dp->datasetHasScalarData( ds ) ); - QVERIFY( dp->datasetIsOnVertices( ds ) ); + QVERIFY( meta.isValid() ); + QVERIFY( meta.isScalar() ); + QVERIFY( meta.isOnVertices() ); // We have 5 values, since dp->vertexCount() = 5 QCOMPARE( QgsMeshDatasetValue( 1.0 ), dp->datasetValue( ds, 0 ) ); @@ -183,14 +183,14 @@ void TestQgsMeshLayer::test_read_vertex_vector_dataset() QCOMPARE( 4, dp->datasetCount() ); - QgsMeshDatasetMetadata meta = dp->datasetMetadata( ds ); - QCOMPARE( meta.count(), 2 ); - QCOMPARE( meta["name"], QString( "VertexVectorDataset" ) ); - QVERIFY( qgsDoubleNear( meta["time"].toDouble(), 0.0 ) ); + const QgsMeshDatasetMetadata meta = dp->datasetMetadata( ds ); + QCOMPARE( meta.extraOptions().count(), 2 ); + QCOMPARE( meta.extraOptions()["name"], QString( "VertexVectorDataset" ) ); + QVERIFY( qgsDoubleNear( meta.extraOptions()["time"].toDouble(), 0.0 ) ); - QVERIFY( dp->datasetIsValid( ds ) ); - QVERIFY( !dp->datasetHasScalarData( ds ) ); - QVERIFY( dp->datasetIsOnVertices( ds ) ); + QVERIFY( meta.isValid() ); + QVERIFY( !meta.isScalar() ); + QVERIFY( meta.isOnVertices() ); // We have 5 values, since dp->vertexCount() = 5 QCOMPARE( QgsMeshDatasetValue( 1, 1 ), dp->datasetValue( ds, 0 ) ); @@ -215,14 +215,14 @@ void TestQgsMeshLayer::test_read_face_scalar_dataset() QCOMPARE( 4, dp->datasetCount() ); - QgsMeshDatasetMetadata meta = dp->datasetMetadata( ds ); - QCOMPARE( meta.count(), 2 ); - QCOMPARE( meta["name"], QString( "FaceScalarDataset" ) ); - QVERIFY( qgsDoubleNear( meta["time"].toDouble(), 0.0 ) ); + const QgsMeshDatasetMetadata meta = dp->datasetMetadata( ds ); + QCOMPARE( meta.extraOptions().count(), 2 ); + QCOMPARE( meta.extraOptions()["name"], QString( "FaceScalarDataset" ) ); + QVERIFY( qgsDoubleNear( meta.extraOptions()["time"].toDouble(), 0.0 ) ); - QVERIFY( dp->datasetIsValid( ds ) ); - QVERIFY( dp->datasetHasScalarData( ds ) ); - QVERIFY( !dp->datasetIsOnVertices( ds ) ); + QVERIFY( meta.isValid() ); + QVERIFY( meta.isScalar() ); + QVERIFY( !meta.isOnVertices() ); // We have 2 values, since dp->faceCount() = 2 QCOMPARE( QgsMeshDatasetValue( 1 ), dp->datasetValue( ds, 0 ) ); @@ -245,14 +245,14 @@ void TestQgsMeshLayer::test_read_face_vector_dataset() QCOMPARE( 4, dp->datasetCount() ); - QgsMeshDatasetMetadata meta = dp->datasetMetadata( ds ); - QCOMPARE( meta.count(), 2 ); - QCOMPARE( meta["name"], QString( "FaceVectorDataset" ) ); - QVERIFY( qgsDoubleNear( meta["time"].toDouble(), 0.0 ) ); + const QgsMeshDatasetMetadata meta = dp->datasetMetadata( ds ); + QCOMPARE( meta.extraOptions().count(), 2 ); + QCOMPARE( meta.extraOptions()["name"], QString( "FaceVectorDataset" ) ); + QVERIFY( qgsDoubleNear( meta.extraOptions()["time"].toDouble(), 0.0 ) ); - QVERIFY( dp->datasetIsValid( ds ) ); - QVERIFY( !dp->datasetHasScalarData( ds ) ); - QVERIFY( !dp->datasetIsOnVertices( ds ) ); + QVERIFY( meta.isValid() ); + QVERIFY( !meta.isScalar() ); + QVERIFY( !meta.isOnVertices() ); // We have 2 values, since dp->faceCount() = 2 QCOMPARE( QgsMeshDatasetValue( 1, 1 ), dp->datasetValue( ds, 0 ) ); diff --git a/tests/src/core/testqgsmeshlayerrenderer.cpp b/tests/src/core/testqgsmeshlayerrenderer.cpp index 9686dcc8d1a..0cbe0f4ca1f 100644 --- a/tests/src/core/testqgsmeshlayerrenderer.cpp +++ b/tests/src/core/testqgsmeshlayerrenderer.cpp @@ -157,8 +157,8 @@ void TestQgsMeshRenderer::test_vertex_scalar_dataset_rendering() { int ds = 0; mMemoryLayer->setActiveScalarDataset( ds ); - QgsMeshDatasetMetadata metadata = mMemoryLayer->dataProvider()->datasetMetadata( ds ); - QVERIFY( metadata["name"] == "VertexScalarDataset" ); + const QgsMeshDatasetMetadata metadata = mMemoryLayer->dataProvider()->datasetMetadata( ds ); + QVERIFY( metadata.extraOptions()["name"] == "VertexScalarDataset" ); QVERIFY( imageCheck( "quad_and_triangle_vertex_scalar_dataset" ) ); } @@ -166,8 +166,8 @@ void TestQgsMeshRenderer::test_vertex_vector_dataset_rendering() { int ds = 1; mMemoryLayer->setActiveVectorDataset( ds ); - QgsMeshDatasetMetadata metadata = mMemoryLayer->dataProvider()->datasetMetadata( ds ); - QVERIFY( metadata["name"] == "VertexVectorDataset" ); + const QgsMeshDatasetMetadata metadata = mMemoryLayer->dataProvider()->datasetMetadata( ds ); + QVERIFY( metadata.extraOptions()["name"] == "VertexVectorDataset" ); QgsMeshRendererVectorSettings settings = mMemoryLayer->rendererVectorSettings(); settings.setMinShaftLength( 15 ); @@ -180,8 +180,8 @@ void TestQgsMeshRenderer::test_face_scalar_dataset_rendering() { int ds = 2; mMemoryLayer->setActiveScalarDataset( ds ); - QgsMeshDatasetMetadata metadata = mMemoryLayer->dataProvider()->datasetMetadata( ds ); - QVERIFY( metadata["name"] == "FaceScalarDataset" ); + const QgsMeshDatasetMetadata metadata = mMemoryLayer->dataProvider()->datasetMetadata( ds ); + QVERIFY( metadata.extraOptions()["name"] == "FaceScalarDataset" ); QVERIFY( imageCheck( "quad_and_triangle_face_scalar_dataset" ) ); } @@ -189,8 +189,8 @@ void TestQgsMeshRenderer::test_face_vector_dataset_rendering() { int ds = 3; mMemoryLayer->setActiveVectorDataset( ds ); - QgsMeshDatasetMetadata metadata = mMemoryLayer->dataProvider()->datasetMetadata( ds ); - QVERIFY( metadata["name"] == "FaceVectorDataset" ); + const QgsMeshDatasetMetadata metadata = mMemoryLayer->dataProvider()->datasetMetadata( ds ); + QVERIFY( metadata.extraOptions()["name"] == "FaceVectorDataset" ); QVERIFY( imageCheck( "quad_and_triangle_face_vector_dataset" ) ); } diff --git a/tests/testdata/control_images/mesh/expected_quad_and_triangle_vertex_vector_dataset/expected_quad_and_triangle_vertex_vector_dataset.png b/tests/testdata/control_images/mesh/expected_quad_and_triangle_vertex_vector_dataset/expected_quad_and_triangle_vertex_vector_dataset.png index 9306b4c2e60..a98ac89e354 100644 Binary files a/tests/testdata/control_images/mesh/expected_quad_and_triangle_vertex_vector_dataset/expected_quad_and_triangle_vertex_vector_dataset.png and b/tests/testdata/control_images/mesh/expected_quad_and_triangle_vertex_vector_dataset/expected_quad_and_triangle_vertex_vector_dataset.png differ