QGIS API Documentation  3.12.1-BucureČ™ti (121cc00ff0)
qgsmeshdataprovider.h
Go to the documentation of this file.
1 /***************************************************************************
2  qgsmeshdataprovider.h
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 #ifndef QGSMESHDATAPROVIDER_H
19 #define QGSMESHDATAPROVIDER_H
20 
21 #include <QVector>
22 #include <QString>
23 #include <QMap>
24 #include <limits>
25 
26 #include "qgis_core.h"
27 #include "qgspoint.h"
28 #include "qgsdataprovider.h"
29 
30 class QgsRectangle;
31 
42 class CORE_EXPORT QgsMeshDatasetIndex
43 {
44  public:
46  QgsMeshDatasetIndex( int group = -1, int dataset = -1 );
48  int group() const;
50  int dataset() const;
52  bool isValid() const;
54  bool operator == ( QgsMeshDatasetIndex other ) const;
56  bool operator != ( QgsMeshDatasetIndex other ) const;
57  private:
58  int mGroupIndex = -1;
59  int mDatasetIndex = -1;
60 };
61 
64 
66 typedef QVector<int> QgsMeshFace;
67 
75 struct CORE_EXPORT QgsMesh
76 {
78  int vertexCount() const;
80  int faceCount() const;
81 
83  QgsMeshVertex vertex( int index ) const;
85  QgsMeshFace face( int index ) const;
86 
88  QVector<QgsMeshVertex> vertices SIP_SKIP;
90  QVector<QgsMeshFace> faces SIP_SKIP;
91 };
92 
104 class CORE_EXPORT QgsMeshDatasetValue
105 {
106  public:
108  QgsMeshDatasetValue( double x,
109  double y );
110 
112  QgsMeshDatasetValue( double scalar );
113 
115  QgsMeshDatasetValue() = default;
116 
118  ~QgsMeshDatasetValue() = default;
119 
121  void set( double scalar );
122 
124  void setX( double x );
125 
127  void setY( double y ) ;
128 
130  double scalar() const;
131 
133  double x() const;
134 
136  double y() const;
137 
138  bool operator==( QgsMeshDatasetValue other ) const;
139 
140  private:
141  double mX = std::numeric_limits<double>::quiet_NaN();
142  double mY = std::numeric_limits<double>::quiet_NaN();
143 };
144 
162 class CORE_EXPORT QgsMeshDataBlock
163 {
164  public:
166  enum DataType
167  {
171  };
172 
175 
177  QgsMeshDataBlock( DataType type, int count );
178 
180  DataType type() const;
181 
183  int count() const;
184 
186  bool isValid() const;
187 
192  QgsMeshDatasetValue value( int index ) const;
193 
198  bool active( int index ) const;
199 
213  void setActive( const QVector<int> &vals );
214 
226  QVector<int> active() const;
227 
234  QVector<double> values() const;
235 
245  void setValues( const QVector<double> &vals );
246 
248  void setValid( bool valid );
249 
250  private:
251  QVector<double> mDoubleBuffer;
252  QVector<int> mIntegerBuffer;
253  DataType mType;
254  int mSize = 0;
255  bool mIsValid = false;
256 };
257 
271 class CORE_EXPORT QgsMesh3dDataBlock
272 {
273  public:
276 
279 
281  QgsMesh3dDataBlock( int count, bool isVector );
282 
284  void setValid( bool valid );
285 
287  bool isValid() const;
288 
290  bool isVector() const;
291 
293  int count() const;
294 
296  int firstVolumeIndex() const;
297 
299  int lastVolumeIndex() const;
300 
302  int volumesCount() const;
303 
307  QVector<int> verticalLevelsCount() const;
308 
312  void setVerticalLevelsCount( const QVector<int> &verticalLevelsCount );
313 
317  QVector<double> verticalLevels() const;
318 
322  void setVerticalLevels( const QVector<double> &verticalLevels );
323 
327  QVector<int> faceToVolumeIndex() const;
328 
332  void setFaceToVolumeIndex( const QVector<int> &faceToVolumeIndex );
333 
339  QVector<double> values() const;
340 
347  QgsMeshDatasetValue value( int volumeIndex ) const;
348 
354  void setValues( const QVector<double> &doubleBuffer );
355 
356  private:
357  int mSize = 0;
358  bool mIsValid = false;
359  bool mIsVector = false;
360  QVector<int> mVerticalLevelsCount;
361  QVector<double> mVerticalLevels;
362  QVector<int> mFaceToVolumeIndex;
363  QVector<double> mDoubleBuffer; // for scalar/vector values
364 };
365 
377 {
378  public:
379 
381  enum DataType
382  {
383  DataOnFaces = 0,
385  DataOnVolumes
386  };
387 
389  QgsMeshDatasetGroupMetadata() = default;
390 
403  QgsMeshDatasetGroupMetadata( const QString &name,
404  bool isScalar,
405  DataType dataType,
406  double minimum,
407  double maximum,
408  int maximumVerticalLevels,
409  const QDateTime &referenceTime,
410  const QMap<QString, QString> &extraOptions );
411 
415  QString name() const;
416 
420  QMap<QString, QString> extraOptions() const;
421 
425  bool isVector() const;
426 
430  bool isScalar() const;
431 
437  DataType dataType() const;
438 
442  double minimum() const;
443 
447  double maximum() const;
448 
454  int maximumVerticalLevelsCount() const;
455 
461  QDateTime referenceTime() const;
462 
463  private:
464  QString mName;
465  bool mIsScalar = false;
466  DataType mDataType = DataType::DataOnFaces;
467  double mMinimumValue = std::numeric_limits<double>::quiet_NaN();
468  double mMaximumValue = std::numeric_limits<double>::quiet_NaN();
469  QMap<QString, QString> mExtraOptions;
470  int mMaximumVerticalLevelsCount = 0; // for 3d stacked meshes
471  QDateTime mReferenceTime;
472 };
473 
484 class CORE_EXPORT QgsMeshDatasetMetadata
485 {
486  public:
488  QgsMeshDatasetMetadata() = default;
489 
499  QgsMeshDatasetMetadata( double time,
500  bool isValid,
501  double minimum,
502  double maximum,
503  int maximumVerticalLevels
504  );
505 
509  double time() const;
510 
514  bool isValid() const;
515 
519  double minimum() const;
520 
524  double maximum() const;
525 
531  int maximumVerticalLevelsCount() const;
532 
533  private:
534  double mTime = std::numeric_limits<double>::quiet_NaN();
535  bool mIsValid = false;
536  double mMinimumValue = std::numeric_limits<double>::quiet_NaN();
537  double mMaximumValue = std::numeric_limits<double>::quiet_NaN();
538  int mMaximumVerticalLevelsCount = 0; // for 3d stacked meshes
539 };
540 
558 {
559  public:
561  virtual ~QgsMeshDataSourceInterface() = default;
562 
567  virtual int vertexCount() const = 0;
568 
573  virtual int faceCount() const = 0;
574 
579  virtual void populateMesh( QgsMesh *mesh ) const = 0;
580 };
581 
598 {
599  public:
601  virtual ~QgsMeshDatasetSourceInterface() = default;
602 
608  virtual bool addDataset( const QString &uri ) = 0;
609 
613  virtual QStringList extraDatasets() const = 0;
614 
618  virtual int datasetGroupCount( ) const = 0;
619 
623  virtual int datasetCount( int groupIndex ) const = 0;
624 
628  int datasetCount( QgsMeshDatasetIndex index ) const;
629 
633  virtual QgsMeshDatasetGroupMetadata datasetGroupMetadata( int groupIndex ) const = 0;
634 
638  QgsMeshDatasetGroupMetadata datasetGroupMetadata( QgsMeshDatasetIndex index ) const;
639 
643  virtual QgsMeshDatasetMetadata datasetMetadata( QgsMeshDatasetIndex index ) const = 0;
644 
656  virtual QgsMeshDatasetValue datasetValue( QgsMeshDatasetIndex index, int valueIndex ) const = 0;
657 
669  virtual QgsMeshDataBlock datasetValues( QgsMeshDatasetIndex index, int valueIndex, int count ) const = 0;
670 
682  virtual QgsMesh3dDataBlock dataset3dValues( QgsMeshDatasetIndex index, int faceIndex, int count ) const = 0;
683 
694  virtual bool isFaceActive( QgsMeshDatasetIndex index, int faceIndex ) const = 0;
695 
701  virtual QgsMeshDataBlock areFacesActive( QgsMeshDatasetIndex index, int faceIndex, int count ) const = 0;
702 
719  virtual bool persistDatasetGroup( const QString &path,
720  const QgsMeshDatasetGroupMetadata &meta,
721  const QVector<QgsMeshDataBlock> &datasetValues,
722  const QVector<QgsMeshDataBlock> &datasetActive,
723  const QVector<double> &times
724  ) = 0;
725 };
726 
727 
739 {
740  Q_OBJECT
741 
742  public:
744  QgsMeshDataProvider( const QString &uri, const QgsDataProvider::ProviderOptions &providerOptions );
745 
746  signals:
748  void datasetGroupsAdded( int count );
749 };
750 
751 #endif // QGSMESHDATAPROVIDER_H
A rectangle specified with double values.
Definition: qgsrectangle.h:41
Vector double pairs (x1, y1, x2, y2, ... )
bool operator==(const QgsFeatureIterator &fi1, const QgsFeatureIterator &fi2)
bool operator!=(const QgsFeatureIterator &fi1, const QgsFeatureIterator &fi2)
QgsMeshDataBlock is a block of integers/doubles that can be used to retrieve: active flags (e...
QgsMesh3dDataBlock is a block of 3d stacked mesh data related N faces defined on base mesh frame...
Abstract base class for spatial data provider implementations.
#define SIP_ABSTRACT
Definition: qgis_sip.h:194
DataType
Location of where data is specified for datasets in the dataset group.
#define SIP_SKIP
Definition: qgis_sip.h:126
Integer boolean flag whether face is active.
Point geometry type, with support for z-dimension and m-values.
Definition: qgspoint.h:37
DataType
Type of data stored in the block.
Base class for providing data for QgsMeshLayer.
Setting options for creating vector data providers.
Mesh - vertices and faces.
Interface for mesh datasets and dataset groups.
QgsMeshDatasetGroupMetadata is a collection of dataset group metadata such as whether the data is vec...
QVector< int > QgsMeshFace
List of vertex indexes.
QgsMeshDatasetIndex is index that identifies the dataset group (e.g.
QgsMeshDatasetValue represents single dataset value.
QgsMeshDatasetMetadata is a collection of mesh dataset metadata such as whether the data is valid or ...
Interface for mesh data sources.
QgsPoint QgsMeshVertex
xyz coords of vertex