QGIS API Documentation  3.12.1-București (121cc00ff0)
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 #include "qgsmesh3daveraging.h"
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 {
46 
47  setProviderType( providerKey );
48  // if we’re given a provider type, try to create and bind one to this layer
49  if ( !meshLayerPath.isEmpty() && !providerKey.isEmpty() )
50  {
51  QgsDataProvider::ProviderOptions providerOptions { options.transformContext };
52  setDataProvider( providerKey, providerOptions );
53  }
54 
56  setDefaultRendererSettings();
57 }
58 
59 
60 void QgsMeshLayer::setDefaultRendererSettings()
61 {
62  if ( mDataProvider && mDataProvider->datasetGroupCount() > 0 )
63  {
64  // show data from the first dataset group
65  mRendererSettings.setActiveScalarDataset( QgsMeshDatasetIndex( 0, 0 ) );
66  }
67  else
68  {
69  // show at least the mesh by default
70  QgsMeshRendererMeshSettings meshSettings;
71  meshSettings.setEnabled( true );
72  mRendererSettings.setNativeMeshSettings( meshSettings );
73  }
74 }
75 
77 {
78  delete mDataProvider;
79 }
80 
82 {
83  return mDataProvider;
84 }
85 
87 {
88  return mDataProvider;
89 }
90 
92 {
94  if ( mDataProvider )
95  {
96  options.transformContext = mDataProvider->transformContext();
97  }
98  QgsMeshLayer *layer = new QgsMeshLayer( source(), name(), mProviderKey, options );
99  QgsMapLayer::clone( layer );
100  return layer;
101 }
102 
104 {
105  if ( mDataProvider )
106  return mDataProvider->extent();
107  else
108  {
109  QgsRectangle rec;
110  rec.setMinimal();
111  return rec;
112  }
113 }
114 
116 {
117  return mProviderKey;
118 }
119 
121 {
122  return mNativeMesh.get();
123 }
124 
126 {
127  return mNativeMesh.get();
128 }
129 
131 {
132  return mTriangularMesh.get();
133 }
134 
136 {
137  return mTriangularMesh.get();
138 }
139 
140 QgsMeshLayerRendererCache *QgsMeshLayer::rendererCache()
141 {
142  return mRendererCache.get();
143 }
144 
146 {
147  return mRendererSettings;
148 }
149 
151 {
152  mRendererSettings = settings;
153  emit rendererChanged();
154  triggerRepaint();
155 }
156 
158 {
159  return mTimeSettings;
160 }
161 
163 {
164  mTimeSettings = settings;
165  emit timeSettingsChanged();
166 }
167 
168 QString QgsMeshLayer::formatTime( double hours )
169 {
170  return QgsMeshLayerUtils::formatTime( hours, mTimeSettings );
171 }
172 
174 {
175  QgsMeshDatasetValue value;
176 
177  if ( mTriangularMesh && dataProvider() && dataProvider()->isValid() && index.isValid() )
178  {
179  int faceIndex = mTriangularMesh->faceIndexForPoint( point ) ;
180  if ( faceIndex >= 0 )
181  {
182  int nativeFaceIndex = mTriangularMesh->trianglesToNativeFaces().at( faceIndex );
184  if ( dataProvider()->isFaceActive( index, nativeFaceIndex ) )
185  {
186  switch ( dataType )
187  {
189  value = dataProvider()->datasetValue( index, nativeFaceIndex );
190  break;
192  {
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];
196  const QgsMeshDatasetValue val1 = dataProvider()->datasetValue( index, v1 );
197  const QgsMeshDatasetValue val2 = dataProvider()->datasetValue( index, v2 );
198  const QgsMeshDatasetValue val3 = dataProvider()->datasetValue( index, 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();
201  bool isVector = dataProvider()->datasetGroupMetadata( index ).isVector();
202  if ( isVector )
203  y = QgsMeshLayerUtils::interpolateFromVerticesData( p1, p2, p3, val1.y(), val2.y(), val3.y(), point );
204 
205  value = QgsMeshDatasetValue( x, y );
206  }
207  break;
209  const QgsMesh3dAveragingMethod *avgMethod = mRendererSettings.averagingMethod();
210  if ( avgMethod )
211  {
212  const QgsMesh3dDataBlock block3d = dataProvider()->dataset3dValues( index, nativeFaceIndex, 1 );
213  const QgsMeshDataBlock block2d = avgMethod->calculate( block3d );
214  if ( block2d.isValid() )
215  {
216  value = block2d.value( 0 );
217  }
218  }
219  break;
220  }
221  }
222  }
223  }
224 
225  return value;
226 }
227 
229 {
230  QgsMesh3dDataBlock block3d;
231 
232  if ( mTriangularMesh && dataProvider() && dataProvider()->isValid() && index.isValid() )
233  {
236  {
237  int faceIndex = mTriangularMesh->faceIndexForPoint( point ) ;
238  if ( faceIndex >= 0 )
239  {
240  int nativeFaceIndex = mTriangularMesh->trianglesToNativeFaces().at( faceIndex );
241  block3d = dataProvider()->dataset3dValues( index, nativeFaceIndex, 1 );
242  }
243  }
244  }
245  return block3d;
246 }
247 
249 {
250  if ( mDataProvider )
251  mDataProvider->setTransformContext( transformContext );
252 }
253 
254 void QgsMeshLayer::fillNativeMesh()
255 {
256  Q_ASSERT( !mNativeMesh );
257 
258  mNativeMesh.reset( new QgsMesh() );
259 
260  if ( !( dataProvider() && dataProvider()->isValid() ) )
261  return;
262 
263  dataProvider()->populateMesh( mNativeMesh.get() );
264 }
265 
266 void QgsMeshLayer::onDatasetGroupsAdded( int count )
267 {
268  // assign default style to new dataset groups
269  int newDatasetGroupCount = mDataProvider->datasetGroupCount();
270  for ( int i = newDatasetGroupCount - count; i < newDatasetGroupCount; ++i )
271  assignDefaultStyleToDatasetGroup( i );
272 }
273 
274 static QgsColorRamp *_createDefaultColorRamp()
275 {
276  QgsColorRamp *ramp = QgsStyle::defaultStyle()->colorRamp( QStringLiteral( "Plasma" ) );
277  if ( ramp )
278  return ramp;
279 
280  // definition of "Plasma" color ramp (in case it is not available in the style for some reason)
281  QgsStringMap props;
282  props["color1"] = "13,8,135,255";
283  props["color2"] = "240,249,33,255";
284  props["stops"] =
285  "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:"
286  "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:"
287  "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:"
288  "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:"
289  "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:"
290  "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:"
291  "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:"
292  "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:"
293  "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:"
294  "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";
295  return QgsGradientColorRamp::create( props );
296 }
297 
298 void QgsMeshLayer::assignDefaultStyleToDatasetGroup( int groupIndex )
299 {
300  const QgsMeshDatasetGroupMetadata metadata = mDataProvider->datasetGroupMetadata( groupIndex );
301  double groupMin = metadata.minimum();
302  double groupMax = metadata.maximum();
303 
304  QgsColorRampShader fcn( groupMin, groupMax, _createDefaultColorRamp() );
305  fcn.classifyColorRamp( 5, -1, QgsRectangle(), nullptr );
306 
307  QgsMeshRendererScalarSettings scalarSettings;
308  scalarSettings.setClassificationMinimumMaximum( groupMin, groupMax );
309  scalarSettings.setColorRampShader( fcn );
310  mRendererSettings.setScalarSettings( groupIndex, scalarSettings );
311 }
312 
314 {
315  // Native mesh
316  if ( !mNativeMesh )
317  {
318  // lazy loading of mesh data
319  fillNativeMesh();
320  }
321 
322  // Triangular mesh
323  if ( !mTriangularMesh )
324  mTriangularMesh.reset( new QgsTriangularMesh() );
325 
326  mTriangularMesh->update( mNativeMesh.get(), &rendererContext );
327 
328  // Cache
329  if ( !mRendererCache )
330  mRendererCache.reset( new QgsMeshLayerRendererCache() );
331 
332  return new QgsMeshLayerRenderer( this, rendererContext );
333 }
334 
335 bool QgsMeshLayer::readSymbology( const QDomNode &node, QString &errorMessage,
336  QgsReadWriteContext &context, QgsMapLayer::StyleCategories categories )
337 {
338  Q_UNUSED( errorMessage )
339  // TODO: implement categories for raster layer
340 
341  QDomElement elem = node.toElement();
342 
343  readCommonStyle( elem, context, categories );
344 
345  QDomElement elemRendererSettings = elem.firstChildElement( "mesh-renderer-settings" );
346  if ( !elemRendererSettings.isNull() )
347  mRendererSettings.readXml( elemRendererSettings );
348 
349  QDomElement elemTimeSettings = elem.firstChildElement( "mesh-time-settings" );
350  if ( !elemTimeSettings.isNull() )
351  mTimeSettings.readXml( elemTimeSettings, context );
352 
353  // get and set the blend mode if it exists
354  QDomNode blendModeNode = node.namedItem( QStringLiteral( "blendMode" ) );
355  if ( !blendModeNode.isNull() )
356  {
357  QDomElement e = blendModeNode.toElement();
358  setBlendMode( QgsPainting::getCompositionMode( static_cast< QgsPainting::BlendMode >( e.text().toInt() ) ) );
359  }
360 
361  return true;
362 }
363 
364 bool QgsMeshLayer::writeSymbology( QDomNode &node, QDomDocument &doc, QString &errorMessage,
365  const QgsReadWriteContext &context, QgsMapLayer::StyleCategories categories ) const
366 {
367  Q_UNUSED( errorMessage )
368  // TODO: implement categories for raster layer
369 
370  QDomElement elem = node.toElement();
371 
372  writeCommonStyle( elem, doc, context, categories );
373 
374  QDomElement elemRendererSettings = mRendererSettings.writeXml( doc );
375  elem.appendChild( elemRendererSettings );
376 
377  QDomElement elemTimeSettings = mTimeSettings.writeXml( doc, context );
378  elem.appendChild( elemTimeSettings );
379 
380  // add blend mode node
381  QDomElement blendModeElement = doc.createElement( QStringLiteral( "blendMode" ) );
382  QDomText blendModeText = doc.createTextNode( QString::number( QgsPainting::getBlendModeEnum( blendMode() ) ) );
383  blendModeElement.appendChild( blendModeText );
384  node.appendChild( blendModeElement );
385 
386  return true;
387 }
388 
389 QString QgsMeshLayer::decodedSource( const QString &source, const QString &provider, const QgsReadWriteContext &context ) const
390 {
391  QString src( source );
392  if ( provider == QLatin1String( "mdal" ) )
393  {
394  src = context.pathResolver().readPath( src );
395  }
396  return src;
397 }
398 
399 QString QgsMeshLayer::encodedSource( const QString &source, const QgsReadWriteContext &context ) const
400 {
401  QString src( source );
402  if ( providerType() == QLatin1String( "mdal" ) )
403  {
404  src = context.pathResolver().writePath( src );
405  }
406  return src;
407 }
408 
409 bool QgsMeshLayer::readXml( const QDomNode &layer_node, QgsReadWriteContext &context )
410 {
411  QgsDebugMsgLevel( QStringLiteral( "Datasource in QgsMeshLayer::readXml: %1" ).arg( mDataSource.toLocal8Bit().data() ), 3 );
412 
413  //process provider key
414  QDomNode pkeyNode = layer_node.namedItem( QStringLiteral( "provider" ) );
415 
416  if ( pkeyNode.isNull() )
417  {
418  mProviderKey.clear();
419  }
420  else
421  {
422  QDomElement pkeyElt = pkeyNode.toElement();
423  mProviderKey = pkeyElt.text();
424  }
425 
427  {
428  return false;
429  }
430 
431  QgsDataProvider::ProviderOptions providerOptions;
432  if ( !setDataProvider( mProviderKey, providerOptions ) )
433  {
434  return false;
435  }
436 
437  QDomElement elemExtraDatasets = layer_node.firstChildElement( QStringLiteral( "extra-datasets" ) );
438  if ( !elemExtraDatasets.isNull() )
439  {
440  QDomElement elemUri = elemExtraDatasets.firstChildElement( QStringLiteral( "uri" ) );
441  while ( !elemUri.isNull() )
442  {
443  QString uri = context.pathResolver().readPath( elemUri.text() );
444 
445  bool res = mDataProvider->addDataset( uri );
446 #ifdef QGISDEBUG
447  QgsDebugMsg( QStringLiteral( "extra dataset (res %1): %2" ).arg( res ).arg( uri ) );
448 #else
449  ( void )res; // avoid unused warning in release builds
450 #endif
451 
452  elemUri = elemUri.nextSiblingElement( QStringLiteral( "uri" ) );
453  }
454  }
455 
456  QString errorMsg;
457  readSymbology( layer_node, errorMsg, context );
458 
459  return mValid; // should be true if read successfully
460 }
461 
462 bool QgsMeshLayer::writeXml( QDomNode &layer_node, QDomDocument &document, const QgsReadWriteContext &context ) const
463 {
464  // first get the layer element so that we can append the type attribute
465  QDomElement mapLayerNode = layer_node.toElement();
466 
467  if ( mapLayerNode.isNull() || ( QLatin1String( "maplayer" ) != mapLayerNode.nodeName() ) )
468  {
469  QgsDebugMsgLevel( QStringLiteral( "can't find <maplayer>" ), 2 );
470  return false;
471  }
472 
473  mapLayerNode.setAttribute( QStringLiteral( "type" ), QStringLiteral( "mesh" ) );
474 
475  // add provider node
476  if ( mDataProvider )
477  {
478  QDomElement provider = document.createElement( QStringLiteral( "provider" ) );
479  QDomText providerText = document.createTextNode( providerType() );
480  provider.appendChild( providerText );
481  layer_node.appendChild( provider );
482 
483  const QStringList extraDatasetUris = mDataProvider->extraDatasets();
484  QDomElement elemExtraDatasets = document.createElement( QStringLiteral( "extra-datasets" ) );
485  for ( const QString &uri : extraDatasetUris )
486  {
487  QString path = context.pathResolver().writePath( uri );
488  QDomElement elemUri = document.createElement( QStringLiteral( "uri" ) );
489  elemUri.appendChild( document.createTextNode( path ) );
490  elemExtraDatasets.appendChild( elemUri );
491  }
492  layer_node.appendChild( elemExtraDatasets );
493  }
494 
495  // renderer specific settings
496  QString errorMsg;
497  return writeSymbology( layer_node, document, errorMsg, context );
498 }
499 
501 {
502  if ( mDataProvider && mDataProvider->isValid() )
503  {
504 
505  mDataProvider->reloadData();
506 
507  //reload the mesh structure
508  if ( !mNativeMesh )
509  mNativeMesh.reset( new QgsMesh );
510 
511  dataProvider()->populateMesh( mNativeMesh.get() );
512 
513  //clear the TriangularMesh
514  mTriangularMesh.reset( new QgsTriangularMesh() );
515 
516  //clear the rendererCache
517  mRendererCache.reset( new QgsMeshLayerRendererCache() );
518  }
519 }
520 
521 bool QgsMeshLayer::setDataProvider( QString const &provider, const QgsDataProvider::ProviderOptions &options )
522 {
523  delete mDataProvider;
524 
525  mProviderKey = provider;
526  QString dataSource = mDataSource;
527 
528  mDataProvider = qobject_cast<QgsMeshDataProvider *>( QgsProviderRegistry::instance()->createProvider( provider, dataSource, options ) );
529  if ( !mDataProvider )
530  {
531  QgsDebugMsgLevel( QStringLiteral( "Unable to get mesh data provider" ), 2 );
532  return false;
533  }
534 
535  mDataProvider->setParent( this );
536  QgsDebugMsgLevel( QStringLiteral( "Instantiated the mesh data provider plugin" ), 2 );
537 
538  mValid = mDataProvider->isValid();
539  if ( !mValid )
540  {
541  QgsDebugMsgLevel( QStringLiteral( "Invalid mesh provider plugin %1" ).arg( QString( mDataSource.toUtf8() ) ), 2 );
542  return false;
543  }
544 
545  setCrs( mDataProvider->crs() );
546 
547  if ( provider == QStringLiteral( "mesh_memory" ) )
548  {
549  // required so that source differs between memory layers
550  mDataSource = mDataSource + QStringLiteral( "&uid=%1" ).arg( QUuid::createUuid().toString() );
551  }
552 
553  QDateTime referenceTime = QgsMeshLayerUtils::firstReferenceTime( this );
554  if ( referenceTime.isValid() )
555  {
556  mTimeSettings.setAbsoluteTimeReferenceTime( referenceTime );
557  mTimeSettings.setUseAbsoluteTime( true );
558  }
559 
560  for ( int i = 0; i < mDataProvider->datasetGroupCount(); ++i )
561  assignDefaultStyleToDatasetGroup( i );
562 
563  connect( mDataProvider, &QgsMeshDataProvider::dataChanged, this, &QgsMeshLayer::dataChanged );
564  connect( mDataProvider, &QgsMeshDataProvider::datasetGroupsAdded, this, &QgsMeshLayer::onDatasetGroupsAdded );
565 
566  return true;
567 }
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:79
Triangular/Derived Mesh is mesh with vertices in map coordinates.
QgsCoordinateTransformContext transformContext
Definition: qgsmeshlayer.h:110
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.
void setUseAbsoluteTime(bool useAbsoluteTime)
Sets use absolute time flag.
#define QgsDebugMsg(str)
Definition: qgslogger.h:38
bool mShouldValidateCrs
true if the layer&#39;s CRS should be validated and invalid CRSes are not permitted.
Definition: qgsmaplayer.h:1559
QString mProviderKey
Data provider key (name of the data provider)
Definition: qgsmaplayer.h:1547
Represents a mesh renderer settings for mesh object.
A class to represent a 2D point.
Definition: qgspointxy.h:43
QgsMeshDataBlock is a block of integers/doubles that can be used to retrieve: active flags (e...
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.
QgsMesh3dDataBlock is a block of 3d stacked mesh data related N faces defined on base mesh frame...
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...
virtual void reloadData()
Reloads the data from the source by calling reloadProviderData() implemented by providers with data c...
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:99
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:356
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:694
QgsMesh * nativeMesh()
Returns native mesh (nullptr before rendering)
static QgsStyle * defaultStyle()
Returns default application-wide style.
Definition: qgsstyle.cpp:74
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.
DataType dataType() const
Returns whether dataset group data is defined on vertices or faces or volumes.
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...
DataType
Location of where data is specified for datasets in the dataset group.
#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.
QgsMeshDataBlock calculate(const QgsMesh3dDataBlock &block3d, QgsFeedback *feedback=nullptr) const
Calculated 2d block values from 3d stacked mesh values.
bool skipCrsValidation
Controls whether the layer is allowed to have an invalid/unknown CRS.
Definition: qgsmeshlayer.h:125
Don&#39;t resolve layer paths or create data providers for layers.
Definition: qgsmaplayer.h:542
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...
QgsMesh3dDataBlock dataset3dValue(const QgsMeshDatasetIndex &index, const QgsPointXY &point) const
Returns the 3d values of stacked 3d mesh defined by the given point.
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:1498
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...
QgsMesh3dAveragingMethod * averagingMethod() const
Returns averaging method for conversion of 3d stacked mesh data to 2d data.
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.
void setAbsoluteTimeReferenceTime(const QDateTime &absoluteTimeReferenceTime)
Sets reference time used for absolute time format.
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:1501
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.
bool isVector() const
Returns whether dataset group has vector data.
bool isValid() const
Whether the block is valid.
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.
Abstract class to interpolate 3d stacked mesh data to 2d data.
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.
virtual QgsMesh3dDataBlock dataset3dValues(QgsMeshDatasetIndex index, int faceIndex, int count) const =0
Returns N vector/scalar values from the face index from the dataset for 3d stacked meshes...
void dataChanged()
Data of layer changed.
Base class for utility classes that encapsulate information necessary for rendering of map layers...
QgsMeshDatasetValue value(int index) const
Returns a value represented by the index For active flag the behavior is undefined.
Represents a mesh layer supporting display of data on structured or unstructured meshes.
Definition: qgsmeshlayer.h:91
QgsMapLayerType
Types of layers that can be added to a map.
Definition: qgsmaplayer.h:66
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.
QgsMapLayer::ReadFlags mReadFlags
Read flags. It&#39;s up to the subclass to respect these when restoring state from XML.
Definition: qgsmaplayer.h:1552
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.