QGIS API Documentation  3.8.0-Zanzibar (11aff65)
qgsmeshlayer.cpp
Go to the documentation of this file.
1 /***************************************************************************
2  qgsmeshlayer.cpp
3  ----------------
4  begin : April 2018
5  copyright : (C) 2018 by Peter Petrik
6  email : zilolv at gmail dot com
7  ***************************************************************************/
8 
9 /***************************************************************************
10  * *
11  * This program is free software; you can redistribute it and/or modify *
12  * it under the terms of the GNU General Public License as published by *
13  * the Free Software Foundation; either version 2 of the License, or *
14  * (at your option) any later version. *
15  * *
16  ***************************************************************************/
17 
18 #include <cstddef>
19 #include <limits>
20 
21 #include <QUuid>
22 
23 #include "qgscolorramp.h"
24 #include "qgslogger.h"
25 #include "qgsmaplayerlegend.h"
26 #include "qgsmeshdataprovider.h"
27 #include "qgsmeshlayer.h"
28 #include "qgsmeshlayerrenderer.h"
29 #include "qgsmeshlayerutils.h"
30 #include "qgsmeshtimesettings.h"
31 #include "qgspainting.h"
32 #include "qgsproviderregistry.h"
33 #include "qgsreadwritecontext.h"
34 #include "qgsstyle.h"
35 #include "qgstriangularmesh.h"
36 
37 
38 
39 QgsMeshLayer::QgsMeshLayer( const QString &meshLayerPath,
40  const QString &baseName,
41  const QString &providerKey,
42  const QgsMeshLayer::LayerOptions &options )
43  : QgsMapLayer( QgsMapLayerType::MeshLayer, baseName, meshLayerPath )
44 {
45  setProviderType( providerKey );
46  // if we’re given a provider type, try to create and bind one to this layer
47  if ( !meshLayerPath.isEmpty() && !providerKey.isEmpty() )
48  {
49  QgsDataProvider::ProviderOptions providerOptions { options.transformContext };
50  setDataProvider( providerKey, providerOptions );
51  }
52 
54  setDefaultRendererSettings();
55 } // QgsMeshLayer ctor
56 
57 
58 void QgsMeshLayer::setDefaultRendererSettings()
59 {
60  if ( mDataProvider && mDataProvider->datasetGroupCount() > 0 )
61  {
62  // show data from the first dataset group
63  mRendererSettings.setActiveScalarDataset( QgsMeshDatasetIndex( 0, 0 ) );
64  }
65  else
66  {
67  // show at least the mesh by default
68  QgsMeshRendererMeshSettings meshSettings;
69  meshSettings.setEnabled( true );
70  mRendererSettings.setNativeMeshSettings( meshSettings );
71  }
72 }
73 
75 {
76  delete mDataProvider;
77 }
78 
80 {
81  return mDataProvider;
82 }
83 
85 {
86  return mDataProvider;
87 }
88 
90 {
92  if ( mDataProvider )
93  {
94  options.transformContext = mDataProvider->transformContext();
95  }
96  QgsMeshLayer *layer = new QgsMeshLayer( source(), name(), mProviderKey, options );
97  QgsMapLayer::clone( layer );
98  return layer;
99 }
100 
102 {
103  if ( mDataProvider )
104  return mDataProvider->extent();
105  else
106  {
107  QgsRectangle rec;
108  rec.setMinimal();
109  return rec;
110  }
111 }
112 
114 {
115  return mProviderKey;
116 }
117 
119 {
120  return mNativeMesh.get();
121 }
122 
124 {
125  return mNativeMesh.get();
126 }
127 
129 {
130  return mTriangularMesh.get();
131 }
132 
134 {
135  return mTriangularMesh.get();
136 }
137 
138 QgsMeshLayerRendererCache *QgsMeshLayer::rendererCache()
139 {
140  return mRendererCache.get();
141 }
142 
144 {
145  return mRendererSettings;
146 }
147 
149 {
150  mRendererSettings = settings;
151  emit rendererChanged();
152  triggerRepaint();
153 }
154 
156 {
157  return mTimeSettings;
158 }
159 
161 {
162  mTimeSettings = settings;
163  emit timeSettingsChanged();
164 }
165 
166 QString QgsMeshLayer::formatTime( double hours )
167 {
168  return QgsMeshLayerUtils::formatTime( hours, mTimeSettings );
169 }
170 
172 {
173  QgsMeshDatasetValue value;
174 
175  if ( mTriangularMesh && dataProvider() && dataProvider()->isValid() && index.isValid() )
176  {
177  int faceIndex = mTriangularMesh->faceIndexForPoint( point ) ;
178  if ( faceIndex >= 0 )
179  {
180  int nativeFaceIndex = mTriangularMesh->trianglesToNativeFaces().at( faceIndex );
181  if ( dataProvider()->isFaceActive( index, nativeFaceIndex ) )
182  {
183 
184  if ( dataProvider()->datasetGroupMetadata( index ).dataType() == QgsMeshDatasetGroupMetadata::DataOnFaces )
185  {
186  int nativeFaceIndex = mTriangularMesh->trianglesToNativeFaces().at( faceIndex );
187  value = dataProvider()->datasetValue( index, nativeFaceIndex );
188  }
189  else
190  {
191  const QgsMeshFace &face = mTriangularMesh->triangles()[faceIndex];
192  const int v1 = face[0], v2 = face[1], v3 = face[2];
193  const QgsPoint p1 = mTriangularMesh->vertices()[v1], p2 = mTriangularMesh->vertices()[v2], p3 = mTriangularMesh->vertices()[v3];
194  const QgsMeshDatasetValue val1 = dataProvider()->datasetValue( index, v1 );
195  const QgsMeshDatasetValue val2 = dataProvider()->datasetValue( index, v2 );
196  const QgsMeshDatasetValue val3 = dataProvider()->datasetValue( index, v3 );
197  const double x = QgsMeshLayerUtils::interpolateFromVerticesData( p1, p2, p3, val1.x(), val2.x(), val3.x(), point );
198  double y = std::numeric_limits<double>::quiet_NaN();
199  bool isVector = dataProvider()->datasetGroupMetadata( index ).isVector();
200  if ( isVector )
201  y = QgsMeshLayerUtils::interpolateFromVerticesData( p1, p2, p3, val1.y(), val2.y(), val3.y(), point );
202 
203  value = QgsMeshDatasetValue( x, y );
204  }
205 
206  }
207  }
208  }
209 
210  return value;
211 }
212 
214 {
215  if ( mDataProvider )
216  mDataProvider->setTransformContext( transformContext );
217 }
218 
219 void QgsMeshLayer::fillNativeMesh()
220 {
221  Q_ASSERT( !mNativeMesh );
222 
223  mNativeMesh.reset( new QgsMesh() );
224 
225  if ( !( dataProvider() && dataProvider()->isValid() ) )
226  return;
227 
228  dataProvider()->populateMesh( mNativeMesh.get() );
229 }
230 
231 void QgsMeshLayer::onDatasetGroupsAdded( int count )
232 {
233  // assign default style to new dataset groups
234  int newDatasetGroupCount = mDataProvider->datasetGroupCount();
235  for ( int i = newDatasetGroupCount - count; i < newDatasetGroupCount; ++i )
236  assignDefaultStyleToDatasetGroup( i );
237 }
238 
239 static QgsColorRamp *_createDefaultColorRamp()
240 {
241  QgsColorRamp *ramp = QgsStyle::defaultStyle()->colorRamp( QStringLiteral( "Plasma" ) );
242  if ( ramp )
243  return ramp;
244 
245  // definition of "Plasma" color ramp (in case it is not available in the style for some reason)
246  QgsStringMap props;
247  props["color1"] = "13,8,135,255";
248  props["color2"] = "240,249,33,255";
249  props["stops"] =
250  "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:"
251  "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:"
252  "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:"
253  "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:"
254  "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:"
255  "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:"
256  "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:"
257  "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:"
258  "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:"
259  "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";
260  return QgsGradientColorRamp::create( props );
261 }
262 
263 void QgsMeshLayer::assignDefaultStyleToDatasetGroup( int groupIndex )
264 {
265  const QgsMeshDatasetGroupMetadata metadata = mDataProvider->datasetGroupMetadata( groupIndex );
266  double groupMin = metadata.minimum();
267  double groupMax = metadata.maximum();
268 
269  QgsColorRampShader fcn( groupMin, groupMax, _createDefaultColorRamp() );
270  fcn.classifyColorRamp( 5, -1, QgsRectangle(), nullptr );
271 
272  QgsMeshRendererScalarSettings scalarSettings;
273  scalarSettings.setClassificationMinimumMaximum( groupMin, groupMax );
274  scalarSettings.setColorRampShader( fcn );
275  mRendererSettings.setScalarSettings( groupIndex, scalarSettings );
276 }
277 
279 {
280  // Native mesh
281  if ( !mNativeMesh )
282  {
283  // lazy loading of mesh data
284  fillNativeMesh();
285  }
286 
287  // Triangular mesh
288  if ( !mTriangularMesh )
289  mTriangularMesh.reset( new QgsTriangularMesh() );
290 
291  mTriangularMesh->update( mNativeMesh.get(), &rendererContext );
292 
293  // Cache
294  if ( !mRendererCache )
295  mRendererCache.reset( new QgsMeshLayerRendererCache() );
296 
297  return new QgsMeshLayerRenderer( this, rendererContext );
298 }
299 
300 bool QgsMeshLayer::readSymbology( const QDomNode &node, QString &errorMessage,
301  QgsReadWriteContext &context, QgsMapLayer::StyleCategories categories )
302 {
303  Q_UNUSED( errorMessage )
304  // TODO: implement categories for raster layer
305 
306  QDomElement elem = node.toElement();
307 
308  readCommonStyle( elem, context, categories );
309 
310  QDomElement elemRendererSettings = elem.firstChildElement( "mesh-renderer-settings" );
311  if ( !elemRendererSettings.isNull() )
312  mRendererSettings.readXml( elemRendererSettings );
313 
314  QDomElement elemTimeSettings = elem.firstChildElement( "mesh-time-settings" );
315  if ( !elemTimeSettings.isNull() )
316  mTimeSettings.readXml( elemTimeSettings, context );
317 
318  // get and set the blend mode if it exists
319  QDomNode blendModeNode = node.namedItem( QStringLiteral( "blendMode" ) );
320  if ( !blendModeNode.isNull() )
321  {
322  QDomElement e = blendModeNode.toElement();
323  setBlendMode( QgsPainting::getCompositionMode( static_cast< QgsPainting::BlendMode >( e.text().toInt() ) ) );
324  }
325 
326  return true;
327 }
328 
329 bool QgsMeshLayer::writeSymbology( QDomNode &node, QDomDocument &doc, QString &errorMessage,
330  const QgsReadWriteContext &context, QgsMapLayer::StyleCategories categories ) const
331 {
332  Q_UNUSED( errorMessage )
333  // TODO: implement categories for raster layer
334 
335  QDomElement elem = node.toElement();
336 
337  writeCommonStyle( elem, doc, context, categories );
338 
339  QDomElement elemRendererSettings = mRendererSettings.writeXml( doc );
340  elem.appendChild( elemRendererSettings );
341 
342  QDomElement elemTimeSettings = mTimeSettings.writeXml( doc, context );
343  elem.appendChild( elemTimeSettings );
344 
345  // add blend mode node
346  QDomElement blendModeElement = doc.createElement( QStringLiteral( "blendMode" ) );
347  QDomText blendModeText = doc.createTextNode( QString::number( QgsPainting::getBlendModeEnum( blendMode() ) ) );
348  blendModeElement.appendChild( blendModeText );
349  node.appendChild( blendModeElement );
350 
351  return true;
352 }
353 
354 QString QgsMeshLayer::decodedSource( const QString &source, const QString &provider, const QgsReadWriteContext &context ) const
355 {
356  QString src( source );
357  if ( provider == QLatin1String( "mdal" ) )
358  {
359  src = context.pathResolver().readPath( src );
360  }
361  return src;
362 }
363 
364 QString QgsMeshLayer::encodedSource( const QString &source, const QgsReadWriteContext &context ) const
365 {
366  QString src( source );
367  if ( providerType() == QLatin1String( "mdal" ) )
368  {
369  src = context.pathResolver().writePath( src );
370  }
371  return src;
372 }
373 
374 bool QgsMeshLayer::readXml( const QDomNode &layer_node, QgsReadWriteContext &context )
375 {
376  QgsDebugMsgLevel( QStringLiteral( "Datasource in QgsMeshLayer::readXml: %1" ).arg( mDataSource.toLocal8Bit().data() ), 3 );
377 
378  //process provider key
379  QDomNode pkeyNode = layer_node.namedItem( QStringLiteral( "provider" ) );
380 
381  if ( pkeyNode.isNull() )
382  {
383  mProviderKey.clear();
384  }
385  else
386  {
387  QDomElement pkeyElt = pkeyNode.toElement();
388  mProviderKey = pkeyElt.text();
389  }
390 
391  QgsDataProvider::ProviderOptions providerOptions;
392  if ( !setDataProvider( mProviderKey, providerOptions ) )
393  {
394  return false;
395  }
396 
397  QDomElement elemExtraDatasets = layer_node.firstChildElement( QStringLiteral( "extra-datasets" ) );
398  if ( !elemExtraDatasets.isNull() )
399  {
400  QDomElement elemUri = elemExtraDatasets.firstChildElement( QStringLiteral( "uri" ) );
401  while ( !elemUri.isNull() )
402  {
403  QString uri = context.pathResolver().readPath( elemUri.text() );
404 
405  bool res = mDataProvider->addDataset( uri );
406 #ifdef QGISDEBUG
407  QgsDebugMsg( QStringLiteral( "extra dataset (res %1): %2" ).arg( res ).arg( uri ) );
408 #else
409  ( void )res; // avoid unused warning in release builds
410 #endif
411 
412  elemUri = elemUri.nextSiblingElement( QStringLiteral( "uri" ) );
413  }
414  }
415 
416  QString errorMsg;
417  readSymbology( layer_node, errorMsg, context );
418 
419  return mValid; // should be true if read successfully
420 }
421 
422 bool QgsMeshLayer::writeXml( QDomNode &layer_node, QDomDocument &document, const QgsReadWriteContext &context ) const
423 {
424  // first get the layer element so that we can append the type attribute
425  QDomElement mapLayerNode = layer_node.toElement();
426 
427  if ( mapLayerNode.isNull() || ( QLatin1String( "maplayer" ) != mapLayerNode.nodeName() ) )
428  {
429  QgsDebugMsgLevel( QStringLiteral( "can't find <maplayer>" ), 2 );
430  return false;
431  }
432 
433  mapLayerNode.setAttribute( QStringLiteral( "type" ), QStringLiteral( "mesh" ) );
434 
435  // add provider node
436  if ( mDataProvider )
437  {
438  QDomElement provider = document.createElement( QStringLiteral( "provider" ) );
439  QDomText providerText = document.createTextNode( providerType() );
440  provider.appendChild( providerText );
441  layer_node.appendChild( provider );
442 
443  const QStringList extraDatasetUris = mDataProvider->extraDatasets();
444  QDomElement elemExtraDatasets = document.createElement( QStringLiteral( "extra-datasets" ) );
445  for ( const QString &uri : extraDatasetUris )
446  {
447  QString path = context.pathResolver().writePath( uri );
448  QDomElement elemUri = document.createElement( QStringLiteral( "uri" ) );
449  elemUri.appendChild( document.createTextNode( path ) );
450  elemExtraDatasets.appendChild( elemUri );
451  }
452  layer_node.appendChild( elemExtraDatasets );
453  }
454 
455  // renderer specific settings
456  QString errorMsg;
457  return writeSymbology( layer_node, document, errorMsg, context );
458 }
459 
461 {
462  if ( mDataProvider && mDataProvider->isValid() )
463  {
464 
465  mDataProvider->reloadData();
466 
467  //reload the mesh structure
468  if ( !mNativeMesh )
469  mNativeMesh.reset( new QgsMesh );
470 
471  dataProvider()->populateMesh( mNativeMesh.get() );
472 
473  //clear the TriangularMesh
474  mTriangularMesh.reset( new QgsTriangularMesh() );
475 
476  //clear the rendererCache
477  mRendererCache.reset( new QgsMeshLayerRendererCache() );
478  }
479 }
480 
481 bool QgsMeshLayer::setDataProvider( QString const &provider, const QgsDataProvider::ProviderOptions &options )
482 {
483  delete mDataProvider;
484 
485  mProviderKey = provider;
486  QString dataSource = mDataSource;
487 
488  mDataProvider = qobject_cast<QgsMeshDataProvider *>( QgsProviderRegistry::instance()->createProvider( provider, dataSource, options ) );
489  if ( !mDataProvider )
490  {
491  QgsDebugMsgLevel( QStringLiteral( "Unable to get mesh data provider" ), 2 );
492  return false;
493  }
494 
495  mDataProvider->setParent( this );
496  QgsDebugMsgLevel( QStringLiteral( "Instantiated the mesh data provider plugin" ), 2 );
497 
498  mValid = mDataProvider->isValid();
499  if ( !mValid )
500  {
501  QgsDebugMsgLevel( QStringLiteral( "Invalid mesh provider plugin %1" ).arg( QString( mDataSource.toUtf8() ) ), 2 );
502  return false;
503  }
504 
505  setCrs( mDataProvider->crs() );
506 
507  if ( provider == QStringLiteral( "mesh_memory" ) )
508  {
509  // required so that source differs between memory layers
510  mDataSource = mDataSource + QStringLiteral( "&uid=%1" ).arg( QUuid::createUuid().toString() );
511  }
512 
513  for ( int i = 0; i < mDataProvider->datasetGroupCount(); ++i )
514  assignDefaultStyleToDatasetGroup( i );
515 
516  connect( mDataProvider, &QgsMeshDataProvider::dataChanged, this, &QgsMeshLayer::dataChanged );
517  connect( mDataProvider, &QgsMeshDataProvider::datasetGroupsAdded, this, &QgsMeshLayer::onDatasetGroupsAdded );
518 
519  return true;
520 }
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.
Definition: qgsrectangle.h:41
Base class for all map layer types.
Definition: qgsmaplayer.h:78
Triangular/Derived Mesh is mesh with vertices in map coordinates.
QgsCoordinateTransformContext transformContext
Definition: qgsmeshlayer.h:109
void setMinimal()
Set a rectangle so that min corner is at max and max corner is at min.
Definition: qgsrectangle.h:151
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.
#define QgsDebugMsg(str)
Definition: qgslogger.h:38
QString mProviderKey
Data provider key (name of the data provider)
Definition: qgsmaplayer.h:1487
Represents a mesh renderer settings for mesh object.
A class to represent a 2D point.
Definition: qgspointxy.h:43
Abstract base class for color ramps.
Definition: qgscolorramp.h:31
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.
Definition: qgspainting.cpp:80
QString encodedSource(const QString &source, const QgsReadWriteContext &context) const override
Called by writeLayerXML(), used by derived classes to encode provider&#39;s specific data source to proje...
double maximum() const
Returns maximum scalar value/vector magnitude present for whole dataset group.
virtual const QgsLayerMetadata & metadata() const
Returns a reference to the layer&#39;s metadata store.
static QPainter::CompositionMode getCompositionMode(QgsPainting::BlendMode blendMode)
Returns a QPainter::CompositionMode corresponding to a BlendMode.
Definition: qgspainting.cpp:20
void readXml(const QDomElement &elem, const QgsReadWriteContext &context)
Reads configuration from the given DOM element.
Setting options for loading mesh layers.
Definition: qgsmeshlayer.h:98
bool isValid() const
Returns the status of the layer.
QgsColorRamp * colorRamp(const QString &name) const
Returns a new copy of the specified color ramp.
Definition: qgsstyle.cpp:272
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
Definition: qgis.h:587
QgsMesh * nativeMesh()
Returns native mesh (nullptr before rendering)
static QgsStyle * defaultStyle()
Returns default application-wide style.
Definition: qgsstyle.cpp:46
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&#39;...
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)
Definition: qgslogger.h:39
void setCrs(const QgsCoordinateReferenceSystem &srs, bool emitSignal=true)
Sets layer&#39;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.
~QgsMeshLayer() override
QgsMeshRendererSettings rendererSettings() const
Returns renderer settings.
void datasetGroupsAdded(int count)
Emitted when some new dataset groups have been added.
QString decodedSource(const QString &source, const QString &provider, const QgsReadWriteContext &context) const override
Called by readLayerXML(), used by derived classes to decode provider&#39;s specific data source from proj...
void setTimeSettings(const QgsMeshTimeSettings &settings)
Sets time format settings.
QgsMeshDataProvider * dataProvider() override
Returns the layer&#39;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.
Definition: qgsmaplayer.h:1442
Point geometry type, with support for z-dimension and m-values.
Definition: qgspoint.h:37
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.
Definition: qgsmaplayer.h:1445
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.
QgsMeshDatasetGroupMetadata is a collection of dataset group metadata such as whether the data is vec...
void setNativeMeshSettings(const QgsMeshRendererMeshSettings &settings)
Sets new renderer settings, triggers repaint.
virtual void reloadData()
Reloads the data from the source.
bool isVector() const
Returns whether dataset group has vector data.
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.
Definition: qgsmeshlayer.h:90
QgsMapLayerType
Types of layers that can be added to a map.
Definition: qgsmaplayer.h:65
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...
double minimum() const
Returns minimum scalar value/vector magnitude present for whole dataset group.
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.
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.