code cleanup

This commit is contained in:
Peter Petrik 2018-05-16 17:02:35 +02:00
parent aea3dccea7
commit 3fc99c04c1
19 changed files with 402 additions and 295 deletions

View File

@ -14,14 +14,13 @@ typedef QgsPoint QgsMeshVertex;
typedef QVector<int> QgsMeshFace;
typedef QMap<QString, QString> 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<QString, QString> &extraOptions );
QMap<QString, QString> 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
};

View File

@ -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

View File

@ -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;

View File

@ -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

View File

@ -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<double>::quiet_NaN();
}
if ( isScalar() )
if ( std::isnan( mY ) )
{
return mX;
}
else if ( std::isnan( mX ) )
{
return std::numeric_limits<double>::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<QString, QString> &extraOptions )
: mIsScalar( isScalar )
, mIsValid( isValid )
, mIsOnVertices( isOnVertices )
, mExtraOptions( extraOptions )
{
}
QMap<QString, QString> 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;
}

View File

@ -34,14 +34,12 @@ typedef QgsPoint QgsMeshVertex;
//! List of vertex indexes
typedef QVector<int> QgsMeshFace;
//! Dataset's metadata key:value map
typedef QMap<QString, QString> 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<QString, QString> 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<double>::quiet_NaN();
double mY = std::numeric_limits<double>::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<QString, QString> &extraOptions );
/**
* Returns extra metadata options
* Usually including name, description or time variable
*/
QMap<QString, QString> 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<QString, QString> 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;
};

View File

@ -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()

View File

@ -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

View File

@ -92,9 +92,10 @@ void QgsMeshLayerRenderer::createMeshSymbol( std::unique_ptr<QgsSymbol> &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();

View File

@ -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

View File

@ -31,9 +31,8 @@
struct QgsMeshMemoryDataset
{
QgsMeshDatasetMetadata metadata;
QMap<QString, QString> metadata;
QVector<QgsMeshDatasetValue> 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();

View File

@ -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;
}

View File

@ -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;

View File

@ -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(),

View File

@ -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<QString, QString> 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();

View File

@ -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();

View File

@ -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 ) );

View File

@ -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" ) );
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 78 KiB

After

Width:  |  Height:  |  Size: 78 KiB