QGIS API Documentation  3.6.0-Noosa (5873452)
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 "qgspainting.h"
31 #include "qgsproviderregistry.h"
32 #include "qgsreadwritecontext.h"
33 #include "qgsstyle.h"
34 #include "qgstriangularmesh.h"
35 
36 
37 QgsMeshLayer::QgsMeshLayer( const QString &meshLayerPath,
38  const QString &baseName,
39  const QString &providerKey,
40  const LayerOptions & )
41  : QgsMapLayer( MeshLayer, baseName, meshLayerPath )
42 {
43  setProviderType( providerKey );
44  // if we’re given a provider type, try to create and bind one to this layer
45  if ( !meshLayerPath.isEmpty() && !providerKey.isEmpty() )
46  {
47  QgsDataProvider::ProviderOptions providerOptions;
48  setDataProvider( providerKey, providerOptions );
49  }
50 
52  setDefaultRendererSettings();
53 } // QgsMeshLayer ctor
54 
55 void QgsMeshLayer::setDefaultRendererSettings()
56 {
57  if ( mDataProvider && mDataProvider->datasetGroupCount() > 0 )
58  {
59  // show data from the first dataset group
60  mRendererSettings.setActiveScalarDataset( QgsMeshDatasetIndex( 0, 0 ) );
61  }
62  else
63  {
64  // show at least the mesh by default
65  QgsMeshRendererMeshSettings meshSettings;
66  meshSettings.setEnabled( true );
67  mRendererSettings.setNativeMeshSettings( meshSettings );
68  }
69 }
70 
72 {
73  delete mDataProvider;
74 }
75 
77 {
78  return mDataProvider;
79 }
80 
82 {
83  return mDataProvider;
84 }
85 
87 {
88  QgsMeshLayer *layer = new QgsMeshLayer( source(), name(), mProviderKey );
89  QgsMapLayer::clone( layer );
90  return layer;
91 }
92 
94 {
95  if ( mDataProvider )
96  return mDataProvider->extent();
97  else
98  {
99  QgsRectangle rec;
100  rec.setMinimal();
101  return rec;
102  }
103 }
104 
106 {
107  return mProviderKey;
108 }
109 
111 {
112  return mNativeMesh.get();
113 }
114 
116 {
117  return mNativeMesh.get();
118 }
119 
121 {
122  return mTriangularMesh.get();
123 }
124 
126 {
127  return mTriangularMesh.get();
128 }
129 
130 QgsMeshLayerRendererCache *QgsMeshLayer::rendererCache()
131 {
132  return mRendererCache.get();
133 }
134 
136 {
137  return mRendererSettings;
138 }
139 
141 {
142  mRendererSettings = settings;
143  emit rendererChanged();
144  triggerRepaint();
145 }
146 
148 {
149  QgsMeshDatasetValue value;
150 
151  if ( mTriangularMesh && dataProvider() && dataProvider()->isValid() && index.isValid() )
152  {
153  int faceIndex = mTriangularMesh->faceIndexForPoint( point ) ;
154  if ( faceIndex >= 0 )
155  {
156  int nativeFaceIndex = mTriangularMesh->trianglesToNativeFaces().at( faceIndex );
157  if ( dataProvider()->isFaceActive( index, nativeFaceIndex ) )
158  {
159 
160  if ( dataProvider()->datasetGroupMetadata( index ).dataType() == QgsMeshDatasetGroupMetadata::DataOnFaces )
161  {
162  int nativeFaceIndex = mTriangularMesh->trianglesToNativeFaces().at( faceIndex );
163  value = dataProvider()->datasetValue( index, nativeFaceIndex );
164  }
165  else
166  {
167  const QgsMeshFace &face = mTriangularMesh->triangles()[faceIndex];
168  const int v1 = face[0], v2 = face[1], v3 = face[2];
169  const QgsPoint p1 = mTriangularMesh->vertices()[v1], p2 = mTriangularMesh->vertices()[v2], p3 = mTriangularMesh->vertices()[v3];
170  const QgsMeshDatasetValue val1 = dataProvider()->datasetValue( index, v1 );
171  const QgsMeshDatasetValue val2 = dataProvider()->datasetValue( index, v2 );
172  const QgsMeshDatasetValue val3 = dataProvider()->datasetValue( index, v3 );
173  const double x = QgsMeshLayerUtils::interpolateFromVerticesData( p1, p2, p3, val1.x(), val2.x(), val3.x(), point );
174  double y = std::numeric_limits<double>::quiet_NaN();
175  bool isVector = dataProvider()->datasetGroupMetadata( index ).isVector();
176  if ( isVector )
177  y = QgsMeshLayerUtils::interpolateFromVerticesData( p1, p2, p3, val1.y(), val2.y(), val3.y(), point );
178 
179  value = QgsMeshDatasetValue( x, y );
180  }
181 
182  }
183  }
184  }
185 
186  return value;
187 }
188 
189 void QgsMeshLayer::fillNativeMesh()
190 {
191  Q_ASSERT( !mNativeMesh );
192 
193  mNativeMesh.reset( new QgsMesh() );
194 
195  if ( !( dataProvider() && dataProvider()->isValid() ) )
196  return;
197 
198  dataProvider()->populateMesh( mNativeMesh.get() );
199 }
200 
201 void QgsMeshLayer::onDatasetGroupsAdded( int count )
202 {
203  // assign default style to new dataset groups
204  int newDatasetGroupCount = mDataProvider->datasetGroupCount();
205  for ( int i = newDatasetGroupCount - count; i < newDatasetGroupCount; ++i )
206  assignDefaultStyleToDatasetGroup( i );
207 }
208 
209 static QgsColorRamp *_createDefaultColorRamp()
210 {
211  QgsColorRamp *ramp = QgsStyle::defaultStyle()->colorRamp( QStringLiteral( "Plasma" ) );
212  if ( ramp )
213  return ramp;
214 
215  // definition of "Plasma" color ramp (in case it is not available in the style for some reason)
216  QgsStringMap props;
217  props["color1"] = "13,8,135,255";
218  props["color2"] = "240,249,33,255";
219  props["stops"] =
220  "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:"
221  "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:"
222  "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:"
223  "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:"
224  "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:"
225  "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:"
226  "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:"
227  "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:"
228  "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:"
229  "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";
230  return QgsGradientColorRamp::create( props );
231 }
232 
233 void QgsMeshLayer::assignDefaultStyleToDatasetGroup( int groupIndex )
234 {
235  const QgsMeshDatasetGroupMetadata metadata = mDataProvider->datasetGroupMetadata( groupIndex );
236  double groupMin = metadata.minimum();
237  double groupMax = metadata.maximum();
238 
239  QgsColorRampShader fcn( groupMin, groupMax, _createDefaultColorRamp() );
240  fcn.classifyColorRamp( 5, -1, QgsRectangle(), nullptr );
241 
242  QgsMeshRendererScalarSettings scalarSettings;
243  scalarSettings.setClassificationMinimumMaximum( groupMin, groupMax );
244  scalarSettings.setColorRampShader( fcn );
245  mRendererSettings.setScalarSettings( groupIndex, scalarSettings );
246 }
247 
249 {
250  // Native mesh
251  if ( !mNativeMesh )
252  {
253  // lazy loading of mesh data
254  fillNativeMesh();
255  }
256 
257  // Triangular mesh
258  if ( !mTriangularMesh )
259  mTriangularMesh.reset( new QgsTriangularMesh() );
260 
261  mTriangularMesh->update( mNativeMesh.get(), &rendererContext );
262 
263  // Cache
264  if ( !mRendererCache )
265  mRendererCache.reset( new QgsMeshLayerRendererCache() );
266 
267  return new QgsMeshLayerRenderer( this, rendererContext );
268 }
269 
270 bool QgsMeshLayer::readSymbology( const QDomNode &node, QString &errorMessage,
271  QgsReadWriteContext &context, QgsMapLayer::StyleCategories categories )
272 {
273  Q_UNUSED( errorMessage );
274  // TODO: implement categories for raster layer
275 
276  QDomElement elem = node.toElement();
277 
278  readCommonStyle( elem, context, categories );
279 
280  QDomElement elemRendererSettings = elem.firstChildElement( "mesh-renderer-settings" );
281  if ( !elemRendererSettings.isNull() )
282  mRendererSettings.readXml( elemRendererSettings );
283 
284  // get and set the blend mode if it exists
285  QDomNode blendModeNode = node.namedItem( QStringLiteral( "blendMode" ) );
286  if ( !blendModeNode.isNull() )
287  {
288  QDomElement e = blendModeNode.toElement();
289  setBlendMode( QgsPainting::getCompositionMode( static_cast< QgsPainting::BlendMode >( e.text().toInt() ) ) );
290  }
291 
292  return true;
293 }
294 
295 bool QgsMeshLayer::writeSymbology( QDomNode &node, QDomDocument &doc, QString &errorMessage,
296  const QgsReadWriteContext &context, QgsMapLayer::StyleCategories categories ) const
297 {
298  Q_UNUSED( errorMessage );
299  // TODO: implement categories for raster layer
300 
301  QDomElement elem = node.toElement();
302 
303  writeCommonStyle( elem, doc, context, categories );
304 
305  QDomElement elemRendererSettings = mRendererSettings.writeXml( doc );
306  elem.appendChild( elemRendererSettings );
307 
308  // add blend mode node
309  QDomElement blendModeElement = doc.createElement( QStringLiteral( "blendMode" ) );
310  QDomText blendModeText = doc.createTextNode( QString::number( QgsPainting::getBlendModeEnum( blendMode() ) ) );
311  blendModeElement.appendChild( blendModeText );
312  node.appendChild( blendModeElement );
313 
314  return true;
315 }
316 
317 QString QgsMeshLayer::decodedSource( const QString &source, const QString &provider, const QgsReadWriteContext &context ) const
318 {
319  QString src( source );
320  if ( provider == QLatin1String( "mdal" ) )
321  {
322  src = context.pathResolver().readPath( src );
323  }
324  return src;
325 }
326 
327 QString QgsMeshLayer::encodedSource( const QString &source, const QgsReadWriteContext &context ) const
328 {
329  QString src( source );
330  if ( providerType() == QLatin1String( "mdal" ) )
331  {
332  src = context.pathResolver().writePath( src );
333  }
334  return src;
335 }
336 
337 bool QgsMeshLayer::readXml( const QDomNode &layer_node, QgsReadWriteContext &context )
338 {
339  QgsDebugMsgLevel( QStringLiteral( "Datasource in QgsMeshLayer::readXml: %1" ).arg( mDataSource.toLocal8Bit().data() ), 3 );
340 
341  //process provider key
342  QDomNode pkeyNode = layer_node.namedItem( QStringLiteral( "provider" ) );
343 
344  if ( pkeyNode.isNull() )
345  {
346  mProviderKey.clear();
347  }
348  else
349  {
350  QDomElement pkeyElt = pkeyNode.toElement();
351  mProviderKey = pkeyElt.text();
352  }
353 
354  QgsDataProvider::ProviderOptions providerOptions;
355  if ( !setDataProvider( mProviderKey, providerOptions ) )
356  {
357  return false;
358  }
359 
360  QDomElement elemExtraDatasets = layer_node.firstChildElement( QStringLiteral( "extra-datasets" ) );
361  if ( !elemExtraDatasets.isNull() )
362  {
363  QDomElement elemUri = elemExtraDatasets.firstChildElement( QStringLiteral( "uri" ) );
364  while ( !elemUri.isNull() )
365  {
366  QString uri = context.pathResolver().readPath( elemUri.text() );
367 
368  bool res = mDataProvider->addDataset( uri );
369 #ifdef QGISDEBUG
370  QgsDebugMsg( QStringLiteral( "extra dataset (res %1): %2" ).arg( res ).arg( uri ) );
371 #else
372  ( void )res; // avoid unused warning in release builds
373 #endif
374 
375  elemUri = elemUri.nextSiblingElement( QStringLiteral( "uri" ) );
376  }
377  }
378 
379  QString errorMsg;
380  readSymbology( layer_node, errorMsg, context );
381 
382  return mValid; // should be true if read successfully
383 }
384 
385 bool QgsMeshLayer::writeXml( QDomNode &layer_node, QDomDocument &document, const QgsReadWriteContext &context ) const
386 {
387  // first get the layer element so that we can append the type attribute
388  QDomElement mapLayerNode = layer_node.toElement();
389 
390  if ( mapLayerNode.isNull() || ( QLatin1String( "maplayer" ) != mapLayerNode.nodeName() ) )
391  {
392  QgsDebugMsgLevel( QStringLiteral( "can't find <maplayer>" ), 2 );
393  return false;
394  }
395 
396  mapLayerNode.setAttribute( QStringLiteral( "type" ), QStringLiteral( "mesh" ) );
397 
398  // add provider node
399  if ( mDataProvider )
400  {
401  QDomElement provider = document.createElement( QStringLiteral( "provider" ) );
402  QDomText providerText = document.createTextNode( providerType() );
403  provider.appendChild( providerText );
404  layer_node.appendChild( provider );
405 
406  const QStringList extraDatasetUris = mDataProvider->extraDatasets();
407  QDomElement elemExtraDatasets = document.createElement( QStringLiteral( "extra-datasets" ) );
408  for ( const QString &uri : extraDatasetUris )
409  {
410  QString path = context.pathResolver().writePath( uri );
411  QDomElement elemUri = document.createElement( QStringLiteral( "uri" ) );
412  elemUri.appendChild( document.createTextNode( path ) );
413  elemExtraDatasets.appendChild( elemUri );
414  }
415  layer_node.appendChild( elemExtraDatasets );
416  }
417 
418  // renderer specific settings
419  QString errorMsg;
420  return writeSymbology( layer_node, document, errorMsg, context );
421 }
422 
423 bool QgsMeshLayer::setDataProvider( QString const &provider, const QgsDataProvider::ProviderOptions &options )
424 {
425  delete mDataProvider;
426 
427  mProviderKey = provider;
428  QString dataSource = mDataSource;
429 
430  mDataProvider = qobject_cast<QgsMeshDataProvider *>( QgsProviderRegistry::instance()->createProvider( provider, dataSource, options ) );
431  if ( !mDataProvider )
432  {
433  QgsDebugMsgLevel( QStringLiteral( "Unable to get mesh data provider" ), 2 );
434  return false;
435  }
436 
437  mDataProvider->setParent( this );
438  QgsDebugMsgLevel( QStringLiteral( "Instantiated the mesh data provider plugin" ), 2 );
439 
440  mValid = mDataProvider->isValid();
441  if ( !mValid )
442  {
443  QgsDebugMsgLevel( QStringLiteral( "Invalid mesh provider plugin %1" ).arg( QString( mDataSource.toUtf8() ) ), 2 );
444  return false;
445  }
446 
447  setCrs( mDataProvider->crs() );
448 
449  if ( provider == QStringLiteral( "mesh_memory" ) )
450  {
451  // required so that source differs between memory layers
452  mDataSource = mDataSource + QStringLiteral( "&uid=%1" ).arg( QUuid::createUuid().toString() );
453  }
454 
455  for ( int i = 0; i < mDataProvider->datasetGroupCount(); ++i )
456  assignDefaultStyleToDatasetGroup( i );
457 
458  connect( mDataProvider, &QgsMeshDataProvider::dataChanged, this, &QgsMeshLayer::dataChanged );
459  connect( mDataProvider, &QgsMeshDataProvider::datasetGroupsAdded, this, &QgsMeshLayer::onDatasetGroupsAdded );
460 
461  return true;
462 }
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:64
Triangular/Derived Mesh is mesh with vertices in map coordinates.
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:1459
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
Setting options for loading mesh layers.
Definition: qgsmeshlayer.h:97
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...
QgsMeshDataProvider * dataProvider() override
Returns the layer&#39;s data provider, it may be null.
void rendererChanged()
Signal emitted when renderer is changed.
bool mValid
Indicates if the layer is valid and can be drawn.
Definition: qgsmaplayer.h:1414
Point geometry type, with support for z-dimension and m-values.
Definition: qgspoint.h:37
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 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.
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.
QString mDataSource
Data source description string, varies by layer type.
Definition: qgsmaplayer.h:1417
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.
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:89
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.
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="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.