40 const QString &baseName,
41 const QString &providerKey,
49 if ( !meshLayerPath.isEmpty() && !providerKey.isEmpty() )
52 setDataProvider( providerKey, providerOptions );
56 setDefaultRendererSettings();
60 void QgsMeshLayer::setDefaultRendererSettings()
106 return mDataProvider->
extent();
122 return mNativeMesh.get();
127 return mNativeMesh.get();
132 return mTriangularMesh.get();
137 return mTriangularMesh.get();
142 return mRendererCache.get();
147 return mRendererSettings;
152 mRendererSettings = settings;
159 return mTimeSettings;
164 mTimeSettings = settings;
170 return QgsMeshLayerUtils::formatTime( hours, mTimeSettings );
179 int faceIndex = mTriangularMesh->faceIndexForPoint( point ) ;
180 if ( faceIndex >= 0 )
182 int nativeFaceIndex = mTriangularMesh->trianglesToNativeFaces().at( faceIndex );
183 if (
dataProvider()->isFaceActive( index, nativeFaceIndex ) )
188 int nativeFaceIndex = mTriangularMesh->trianglesToNativeFaces().at( faceIndex );
193 const QgsMeshFace &face = mTriangularMesh->triangles()[faceIndex];
194 const int v1 = face[0], v2 = face[1], v3 = face[2];
195 const QgsPoint p1 = mTriangularMesh->vertices()[v1], p2 = mTriangularMesh->vertices()[v2], p3 = mTriangularMesh->vertices()[v3];
199 const double x = QgsMeshLayerUtils::interpolateFromVerticesData( p1, p2, p3, val1.
x(), val2.
x(), val3.
x(), point );
200 double y = std::numeric_limits<double>::quiet_NaN();
203 y = QgsMeshLayerUtils::interpolateFromVerticesData( p1, p2, p3, val1.
y(), val2.
y(), val3.
y(), point );
221 void QgsMeshLayer::fillNativeMesh()
223 Q_ASSERT( !mNativeMesh );
225 mNativeMesh.reset(
new QgsMesh() );
233 void QgsMeshLayer::onDatasetGroupsAdded(
int count )
237 for (
int i = newDatasetGroupCount - count; i < newDatasetGroupCount; ++i )
238 assignDefaultStyleToDatasetGroup( i );
249 props[
"color1"] =
"13,8,135,255";
250 props[
"color2"] =
"240,249,33,255";
252 "0.0196078;27,6,141,255:0.0392157;38,5,145,255:0.0588235;47,5,150,255:0.0784314;56,4,154,255:0.0980392;65,4,157,255:" 253 "0.117647;73,3,160,255:0.137255;81,2,163,255:0.156863;89,1,165,255:0.176471;97,0,167,255:0.196078;105,0,168,255:" 254 "0.215686;113,0,168,255:0.235294;120,1,168,255:0.254902;128,4,168,255:0.27451;135,7,166,255:0.294118;142,12,164,255:" 255 "0.313725;149,17,161,255:0.333333;156,23,158,255:0.352941;162,29,154,255:0.372549;168,34,150,255:0.392157;174,40,146,255:" 256 "0.411765;180,46,141,255:0.431373;186,51,136,255:0.45098;191,57,132,255:0.470588;196,62,127,255:0.490196;201,68,122,255:" 257 "0.509804;205,74,118,255:0.529412;210,79,113,255:0.54902;214,85,109,255:0.568627;218,91,105,255:0.588235;222,97,100,255:" 258 "0.607843;226,102,96,255:0.627451;230,108,92,255:0.647059;233,114,87,255:0.666667;237,121,83,255:0.686275;240,127,79,255:" 259 "0.705882;243,133,75,255:0.72549;245,140,70,255:0.745098;247,147,66,255:0.764706;249,154,62,255:0.784314;251,161,57,255:" 260 "0.803922;252,168,53,255:0.823529;253,175,49,255:0.843137;254,183,45,255:0.862745;254,190,42,255:0.882353;253,198,39,255:" 261 "0.901961;252,206,37,255:0.921569;251,215,36,255:0.941176;248,223,37,255:0.960784;246,232,38,255:0.980392;243,240,39,255";
265 void QgsMeshLayer::assignDefaultStyleToDatasetGroup(
int groupIndex )
268 double groupMin = metadata.
minimum();
269 double groupMax = metadata.
maximum();
290 if ( !mTriangularMesh )
293 mTriangularMesh->update( mNativeMesh.get(), &rendererContext );
296 if ( !mRendererCache )
297 mRendererCache.reset(
new QgsMeshLayerRendererCache() );
305 Q_UNUSED( errorMessage )
308 QDomElement elem = node.toElement();
312 QDomElement elemRendererSettings = elem.firstChildElement(
"mesh-renderer-settings" );
313 if ( !elemRendererSettings.isNull() )
314 mRendererSettings.
readXml( elemRendererSettings );
316 QDomElement elemTimeSettings = elem.firstChildElement(
"mesh-time-settings" );
317 if ( !elemTimeSettings.isNull() )
318 mTimeSettings.
readXml( elemTimeSettings, context );
321 QDomNode blendModeNode = node.namedItem( QStringLiteral(
"blendMode" ) );
322 if ( !blendModeNode.isNull() )
324 QDomElement e = blendModeNode.toElement();
334 Q_UNUSED( errorMessage )
337 QDomElement elem = node.toElement();
341 QDomElement elemRendererSettings = mRendererSettings.
writeXml( doc );
342 elem.appendChild( elemRendererSettings );
344 QDomElement elemTimeSettings = mTimeSettings.
writeXml( doc, context );
345 elem.appendChild( elemTimeSettings );
348 QDomElement blendModeElement = doc.createElement( QStringLiteral(
"blendMode" ) );
350 blendModeElement.appendChild( blendModeText );
351 node.appendChild( blendModeElement );
358 QString src( source );
359 if ( provider == QLatin1String(
"mdal" ) )
368 QString src( source );
381 QDomNode pkeyNode = layer_node.namedItem( QStringLiteral(
"provider" ) );
383 if ( pkeyNode.isNull() )
389 QDomElement pkeyElt = pkeyNode.toElement();
399 if ( !setDataProvider(
mProviderKey, providerOptions ) )
404 QDomElement elemExtraDatasets = layer_node.firstChildElement( QStringLiteral(
"extra-datasets" ) );
405 if ( !elemExtraDatasets.isNull() )
407 QDomElement elemUri = elemExtraDatasets.firstChildElement( QStringLiteral(
"uri" ) );
408 while ( !elemUri.isNull() )
414 QgsDebugMsg( QStringLiteral(
"extra dataset (res %1): %2" ).arg( res ).arg( uri ) );
419 elemUri = elemUri.nextSiblingElement( QStringLiteral(
"uri" ) );
432 QDomElement mapLayerNode = layer_node.toElement();
434 if ( mapLayerNode.isNull() || ( QLatin1String(
"maplayer" ) != mapLayerNode.nodeName() ) )
440 mapLayerNode.setAttribute( QStringLiteral(
"type" ), QStringLiteral(
"mesh" ) );
445 QDomElement provider = document.createElement( QStringLiteral(
"provider" ) );
446 QDomText providerText = document.createTextNode(
providerType() );
447 provider.appendChild( providerText );
448 layer_node.appendChild( provider );
450 const QStringList extraDatasetUris = mDataProvider->
extraDatasets();
451 QDomElement elemExtraDatasets = document.createElement( QStringLiteral(
"extra-datasets" ) );
452 for (
const QString &uri : extraDatasetUris )
455 QDomElement elemUri = document.createElement( QStringLiteral(
"uri" ) );
456 elemUri.appendChild( document.createTextNode( path ) );
457 elemExtraDatasets.appendChild( elemUri );
459 layer_node.appendChild( elemExtraDatasets );
469 if ( mDataProvider && mDataProvider->
isValid() )
476 mNativeMesh.reset(
new QgsMesh );
484 mRendererCache.reset(
new QgsMeshLayerRendererCache() );
490 delete mDataProvider;
496 if ( !mDataProvider )
498 QgsDebugMsgLevel( QStringLiteral(
"Unable to get mesh data provider" ), 2 );
502 mDataProvider->setParent(
this );
503 QgsDebugMsgLevel( QStringLiteral(
"Instantiated the mesh data provider plugin" ), 2 );
514 if ( provider == QStringLiteral(
"mesh_memory" ) )
521 assignDefaultStyleToDatasetGroup( i );
void setClassificationMinimumMaximum(double minimum, double maximum)
Sets min/max values used for creation of the color ramp shader.
The class is used as a container of context for various read/write operations on other objects...
A rectangle specified with double values.
Base class for all map layer types.
Triangular/Derived Mesh is mesh with vertices in map coordinates.
QgsCoordinateTransformContext transformContext
void setMinimal()
Set a rectangle so that min corner is at max and max corner is at min.
void setProviderType(const QString &providerType)
Sets the providerType (provider key)
virtual QgsMapLayer * clone() const =0
Returns a new instance equivalent to this one except for the id which is still unique.
void setRendererSettings(const QgsMeshRendererSettings &settings)
Sets new renderer settings.
QString readPath(const QString &filename) const
Turn filename read from the project file to an absolute path.
A ramp shader will color a raster pixel based on a list of values ranges in a ramp.
bool mShouldValidateCrs
true if the layer's CRS should be validated and invalid CRSes are not permitted.
QString mProviderKey
Data provider key (name of the data provider)
Represents a mesh renderer settings for mesh object.
A class to represent a 2D point.
Abstract base class for color ramps.
virtual bool addDataset(const QString &uri)=0
Associate dataset with the mesh.
Represents a mesh renderer settings for scalar datasets.
static QgsPainting::BlendMode getBlendModeEnum(QPainter::CompositionMode blendMode)
Returns a BlendMode corresponding to a QPainter::CompositionMode.
QString encodedSource(const QString &source, const QgsReadWriteContext &context) const override
Called by writeLayerXML(), used by derived classes to encode provider's specific data source to proje...
virtual const QgsLayerMetadata & metadata() const
Returns a reference to the layer's metadata store.
static QPainter::CompositionMode getCompositionMode(QgsPainting::BlendMode blendMode)
Returns a QPainter::CompositionMode corresponding to a BlendMode.
void readXml(const QDomElement &elem, const QgsReadWriteContext &context)
Reads configuration from the given DOM element.
Setting options for loading mesh layers.
bool isValid() const
Returns the status of the layer.
QgsColorRamp * colorRamp(const QString &name) const
Returns a new copy of the specified color ramp.
void setBlendMode(QPainter::CompositionMode blendMode)
Set the blending mode used for rendering a layer.
void setScalarSettings(int groupIndex, const QgsMeshRendererScalarSettings &settings)
Sets new renderer settings.
static QgsMapLayerLegend * defaultMeshLegend(QgsMeshLayer *ml)
Create new legend implementation for mesh layer.
QMap< QString, QString > QgsStringMap
QgsMesh * nativeMesh()
Returns native mesh (nullptr before rendering)
static QgsStyle * defaultStyle()
Returns default application-wide style.
Implementation of threaded rendering for mesh layers.
bool writeSymbology(QDomNode &node, QDomDocument &doc, QString &errorMessage, const QgsReadWriteContext &context, QgsMapLayer::StyleCategories categories=QgsMapLayer::AllStyleCategories) const override
double y() const
Returns y value.
QgsDataProvider * createProvider(const QString &providerKey, const QString &dataSource, const QgsDataProvider::ProviderOptions &options=QgsDataProvider::ProviderOptions())
Creates a new instance of a provider.
void dataChanged()
Emitted whenever a change is made to the data provider which may have caused changes in the provider'...
static QgsProviderRegistry * instance(const QString &pluginPath=QString())
Means of accessing canonical single instance.
Represents all mesh renderer settings.
QgsRectangle extent() const override
Returns the extent of the layer.
QString providerType() const
Returns the provider type for this layer.
void writeCommonStyle(QDomElement &layerElement, QDomDocument &document, const QgsReadWriteContext &context, StyleCategories categories=AllStyleCategories) const
Write style data common to all layer types.
void triggerRepaint(bool deferredUpdate=false)
Will advise the map canvas (and any other interested party) that this layer requires to be repainted...
#define QgsDebugMsgLevel(str, level)
void setCrs(const QgsCoordinateReferenceSystem &srs, bool emitSignal=true)
Sets layer's spatial reference system.
virtual bool isValid() const =0
Returns true if this is a valid layer.
virtual QgsCoordinateReferenceSystem crs() const =0
Returns the coordinate system for the data source.
void setColorRampShader(const QgsColorRampShader &shader)
Sets color ramp shader function.
QgsMeshRendererSettings rendererSettings() const
Returns renderer settings.
void datasetGroupsAdded(int count)
Emitted when some new dataset groups have been added.
bool skipCrsValidation
Controls whether the layer is allowed to have an invalid/unknown CRS.
Don't resolve layer paths or create data providers for layers.
QString decodedSource(const QString &source, const QString &provider, const QgsReadWriteContext &context) const override
Called by readLayerXML(), used by derived classes to decode provider's specific data source from proj...
void setTimeSettings(const QgsMeshTimeSettings &settings)
Sets time format settings.
QgsMeshDataProvider * dataProvider() override
Returns the layer's data provider, it may be nullptr.
QgsCoordinateTransformContext transformContext() const
Returns the layer data provider coordinate transform context or a default transform context if the la...
void rendererChanged()
Signal emitted when renderer is changed.
Contains information about the context in which a coordinate transform is executed.
bool mValid
Indicates if the layer is valid and can be drawn.
Point geometry type, with support for z-dimension and m-values.
Represents a mesh time settings for mesh datasets.
QgsMeshDatasetValue datasetValue(const QgsMeshDatasetIndex &index, const QgsPointXY &point) const
Interpolates the value on the given point from given dataset.
virtual void populateMesh(QgsMesh *mesh) const =0
Populates the mesh vertices and faces.
void setEnabled(bool enabled)
Sets whether mesh structure rendering is enabled.
void reload() override
Synchronises with changes in the datasource.
void classifyColorRamp(int classes=0, int band=-1, const QgsRectangle &extent=QgsRectangle(), QgsRasterInterface *input=nullptr)
Classify color ramp shader.
QgsMapLayerRenderer * createMapRenderer(QgsRenderContext &rendererContext) override
Returns new instance of QgsMapLayerRenderer that will be used for rendering of given context...
Base class for providing data for QgsMeshLayer.
QgsCoordinateTransformContext transformContext() const
Returns data provider coordinate transform context.
void setTransformContext(const QgsCoordinateTransformContext &transformContext) override
Sets the coordinate transform context to transformContext.
static QgsColorRamp * create(const QgsStringMap &properties=QgsStringMap())
Creates a new QgsColorRamp from a map of properties.
const QgsPathResolver & pathResolver() const
Returns path resolver for conversion between relative and absolute paths.
bool writeXml(QDomNode &layer_node, QDomDocument &doc, const QgsReadWriteContext &context) const override
Called by writeLayerXML(), used by children to write state specific to them to project files...
Contains information about the context of a rendering operation.
Setting options for creating vector data providers.
QString name() const
Returns the display name of the layer.
Mesh - vertices and faces.
QDomElement writeXml(QDomDocument &doc, const QgsReadWriteContext &context) const
Writes configuration to a new DOM element.
QString mDataSource
Data source description string, varies by layer type.
virtual void setTransformContext(const QgsCoordinateTransformContext &transformContext)
Sets data coordinate transform context to transformContext.
QString source() const
Returns the source for the layer.
QgsMeshLayer * clone() const override
Returns a new instance equivalent to this one except for the id which is still unique.
QDomElement writeXml(QDomDocument &doc) const
Writes configuration to a new DOM element.
void setNativeMeshSettings(const QgsMeshRendererMeshSettings &settings)
Sets new renderer settings, triggers repaint.
virtual void reloadData()
Reloads the data from the source.
QVector< int > QgsMeshFace
List of vertex indexes.
void setActiveScalarDataset(QgsMeshDatasetIndex index=QgsMeshDatasetIndex())
Sets active scalar dataset for rendering.
QgsMeshDatasetIndex is index that identifies the dataset group (e.g.
virtual QStringList extraDatasets() const =0
Returns list of additional dataset file URIs added using addDataset() calls.
QgsMeshLayerRendererCache * rendererCache()
Returns native mesh (nullptr before rendering)
QString writePath(const QString &filename) const
Prepare a filename to save it to the project file.
bool isValid() const
Returns whether index is valid, ie at least groups is set.
void dataChanged()
Data of layer changed.
Base class for utility classes that encapsulate information necessary for rendering of map layers...
Represents a mesh layer supporting display of data on structured or unstructured meshes.
QgsMapLayerType
Types of layers that can be added to a map.
QgsMeshTimeSettings timeSettings() const
Returns time format settings.
virtual QgsRectangle extent() const =0
Returns the extent of the layer.
virtual int datasetGroupCount() const =0
Returns number of datasets groups loaded.
QgsMeshDatasetValue represents single dataset value.
virtual QgsMeshDatasetValue datasetValue(QgsMeshDatasetIndex index, int valueIndex) const =0
Returns vector/scalar value associated with the index from the dataset To read multiple continuous va...
void readXml(const QDomElement &elem)
Reads configuration from the given DOM element.
void setLegend(QgsMapLayerLegend *legend)
Assign a legend controller to the map layer.
void timeSettingsChanged()
Emitted when time format is changed.
bool readXml(const QDomNode &layer_node, QgsReadWriteContext &context) override
Called by readLayerXML(), used by children to read state specific to them from project files...
bool readSymbology(const QDomNode &node, QString &errorMessage, QgsReadWriteContext &context, QgsMapLayer::StyleCategories categories=QgsMapLayer::AllStyleCategories) override
QgsTriangularMesh * triangularMesh()
Returns triangular mesh (nullptr before rendering)
double x() const
Returns x value.
QgsMeshLayer(const QString &path=QString(), const QString &baseName=QString(), const QString &providerLib=QStringLiteral("mesh_memory"), const QgsMeshLayer::LayerOptions &options=QgsMeshLayer::LayerOptions())
Constructor - creates a mesh layer.
void readCommonStyle(const QDomElement &layerElement, const QgsReadWriteContext &context, StyleCategories categories=AllStyleCategories)
Read style data common to all layer types.
QPainter::CompositionMode blendMode() const
Returns the current blending mode for a layer.
QgsMapLayer::ReadFlags mReadFlags
Read flags. It's up to the subclass to respect these when restoring state from XML.
virtual QgsMeshDatasetGroupMetadata datasetGroupMetadata(int groupIndex) const =0
Returns dataset group metadata.
QString formatTime(double hours)
Returns (date) time in hours formatted to human readable form.