QGIS API Documentation  3.26.3-Buenos Aires (65e4edfdad)
qgsmeshdataset.h
Go to the documentation of this file.
1 /***************************************************************************
2  qgsmeshdataset.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 QGSMESHDATASET_H
19 #define QGSMESHDATASET_H
20 
21 #include <QVector>
22 #include <QString>
23 #include <QMap>
24 #include <QPair>
25 
26 #include <limits>
27 
28 #include "qgis_core.h"
29 #include "qgis_sip.h"
30 #include "qgspoint.h"
31 #include "qgsdataprovider.h"
32 
33 class QgsMeshLayer;
35 class QgsRectangle;
36 struct QgsMesh;
37 
48 class CORE_EXPORT QgsMeshDatasetIndex
49 {
50  public:
52  QgsMeshDatasetIndex( int group = -1, int dataset = -1 );
54  int group() const;
56  int dataset() const;
58  bool isValid() const;
60  bool operator == ( QgsMeshDatasetIndex other ) const;
62  bool operator != ( QgsMeshDatasetIndex other ) const;
63  private:
64  int mGroupIndex = -1;
65  int mDatasetIndex = -1;
66 };
67 
79 class CORE_EXPORT QgsMeshDatasetValue
80 {
81  public:
83  QgsMeshDatasetValue( double x,
84  double y );
85 
87  QgsMeshDatasetValue( double scalar );
88 
90  QgsMeshDatasetValue() = default;
91 
93  ~QgsMeshDatasetValue() = default;
94 
96  void set( double scalar );
97 
99  void setX( double x );
100 
102  void setY( double y ) ;
103 
105  double scalar() const;
106 
108  double x() const;
109 
111  double y() const;
112 
113  bool operator==( QgsMeshDatasetValue other ) const;
114 
115  private:
116  double mX = std::numeric_limits<double>::quiet_NaN();
117  double mY = std::numeric_limits<double>::quiet_NaN();
118 };
119 
137 class CORE_EXPORT QgsMeshDataBlock
138 {
139  public:
141  enum DataType
142  {
146  };
147 
150 
152  QgsMeshDataBlock( DataType type, int count );
153 
155  DataType type() const;
156 
158  int count() const;
159 
161  bool isValid() const;
162 
167  QgsMeshDatasetValue value( int index ) const;
168 
173  bool active( int index ) const;
174 
188  void setActive( const QVector<int> &vals );
189 
201  QVector<int> active() const;
202 
209  QVector<double> values() const;
210 
220  void setValues( const QVector<double> &vals );
221 
223  void setValid( bool valid );
224 
225  private:
226  QVector<double> mDoubleBuffer;
227  QVector<int> mIntegerBuffer;
228  DataType mType;
229  int mSize = 0;
230  bool mIsValid = false;
231 };
232 
246 class CORE_EXPORT QgsMesh3dDataBlock
247 {
248  public:
251 
254 
256  QgsMesh3dDataBlock( int count, bool isVector );
257 
259  void setValid( bool valid );
260 
262  bool isValid() const;
263 
265  bool isVector() const;
266 
268  int count() const;
269 
271  int firstVolumeIndex() const;
272 
274  int lastVolumeIndex() const;
275 
277  int volumesCount() const;
278 
282  QVector<int> verticalLevelsCount() const;
283 
287  void setVerticalLevelsCount( const QVector<int> &verticalLevelsCount );
288 
292  QVector<double> verticalLevels() const;
293 
297  void setVerticalLevels( const QVector<double> &verticalLevels );
298 
302  QVector<int> faceToVolumeIndex() const;
303 
307  void setFaceToVolumeIndex( const QVector<int> &faceToVolumeIndex );
308 
314  QVector<double> values() const;
315 
322  QgsMeshDatasetValue value( int volumeIndex ) const;
323 
329  void setValues( const QVector<double> &doubleBuffer );
330 
331  private:
332  int mSize = 0;
333  bool mIsValid = false;
334  bool mIsVector = false;
335  QVector<int> mVerticalLevelsCount;
336  QVector<double> mVerticalLevels;
337  QVector<int> mFaceToVolumeIndex;
338  QVector<double> mDoubleBuffer; // for scalar/vector values
339 };
340 
352 {
353  public:
354 
356  enum DataType
357  {
358  DataOnFaces = 0,
361  DataOnEdges
362  };
363 
365  QgsMeshDatasetGroupMetadata() = default;
366 
381  QgsMeshDatasetGroupMetadata( const QString &name,
382  const QString uri,
383  bool isScalar,
384  DataType dataType,
385  double minimum,
386  double maximum,
387  int maximumVerticalLevels,
388  const QDateTime &referenceTime,
389  bool isTemporal,
390  const QMap<QString, QString> &extraOptions );
391 
395  QString name() const;
396 
402  QString uri() const;
403 
407  QMap<QString, QString> extraOptions() const;
408 
412  bool isVector() const;
413 
417  bool isScalar() const;
418 
422  bool isTemporal() const;
423 
429  DataType dataType() const;
430 
434  double minimum() const;
435 
439  double maximum() const;
440 
446  int maximumVerticalLevelsCount() const;
447 
453  QDateTime referenceTime() const;
454 
455  private:
456  QString mName;
457  QString mUri;
458  bool mIsScalar = false;
459  DataType mDataType = DataType::DataOnFaces;
460  double mMinimumValue = std::numeric_limits<double>::quiet_NaN();
461  double mMaximumValue = std::numeric_limits<double>::quiet_NaN();
462  QMap<QString, QString> mExtraOptions;
463  int mMaximumVerticalLevelsCount = 0; // for 3d stacked meshes
464  QDateTime mReferenceTime;
465  bool mIsTemporal = false;
466 };
467 
478 class CORE_EXPORT QgsMeshDatasetMetadata
479 {
480  public:
482  QgsMeshDatasetMetadata() = default;
483 
493  QgsMeshDatasetMetadata( double time,
494  bool isValid,
495  double minimum,
496  double maximum,
497  int maximumVerticalLevels
498  );
499 
503  double time() const;
504 
508  bool isValid() const;
509 
513  double minimum() const;
514 
518  double maximum() const;
519 
525  int maximumVerticalLevelsCount() const;
526 
527  private:
528  double mTime = std::numeric_limits<double>::quiet_NaN();
529  bool mIsValid = false;
530  double mMinimumValue = std::numeric_limits<double>::quiet_NaN();
531  double mMaximumValue = std::numeric_limits<double>::quiet_NaN();
532  int mMaximumVerticalLevelsCount = 0; // for 3d stacked meshes
533 };
534 
535 
543 class CORE_EXPORT QgsMeshDataset
544 {
545  public:
547  QgsMeshDataset() = default;
548 
550  virtual ~QgsMeshDataset() = default;
551 
553  virtual QgsMeshDatasetValue datasetValue( int valueIndex ) const = 0;
554 
556  virtual QgsMeshDataBlock datasetValues( bool isScalar, int valueIndex, int count ) const = 0;
557 
559  virtual QgsMeshDataBlock areFacesActive( int faceIndex, int count ) const = 0;
560 
562  virtual bool isActive( int faceIndex ) const = 0;
563 
565  virtual QgsMeshDatasetMetadata metadata() const = 0;
566 
568  virtual int valuesCount() const = 0;
569 };
570 
578 class CORE_EXPORT QgsMeshDatasetGroup
579 {
580  public:
581 
587  enum Type
588  {
593  };
594 
596  QgsMeshDatasetGroup() = default;
597  virtual ~QgsMeshDatasetGroup();
598 
600  QgsMeshDatasetGroup( const QString &name );
601 
603  QgsMeshDatasetGroup( const QString &name, QgsMeshDatasetGroupMetadata::DataType dataType );
604 
606  virtual void initialize() = 0;
607 
609  QgsMeshDatasetGroupMetadata groupMetadata() const;
610 
612  virtual QgsMeshDatasetMetadata datasetMetadata( int datasetIndex ) const = 0 ;
613 
615  virtual int datasetCount() const = 0;
616 
618  virtual QgsMeshDataset *dataset( int index ) const = 0;
619 
621  virtual QgsMeshDatasetGroup::Type type() const = 0;
622 
624  double minimum() const;
625 
627  double maximum() const;
628 
630  void setMinimumMaximum( double min, double max ) const;
631 
633  QString name() const;
634 
636  void setName( const QString &name );
637 
639  QgsMeshDatasetGroupMetadata::DataType dataType() const;
640 
642  void setDataType( const QgsMeshDatasetGroupMetadata::DataType &dataType );
643 
645  void addExtraMetadata( QString key, QString value );
647  QMap<QString, QString> extraMetadata() const;
648 
650  bool isScalar() const;
651 
653  void setIsScalar( bool isScalar );
654 
656  bool checkValueCountPerDataset( int count ) const;
657 
659  void calculateStatistic() const;
660 
662  void setStatisticObsolete() const;
663 
665  virtual QStringList datasetGroupNamesDependentOn() const;
666 
668  virtual QDomElement writeXml( QDomDocument &doc, const QgsReadWriteContext &context ) const = 0;
669 
671  virtual QString description() const;
672 
674  void setReferenceTime( const QDateTime &referenceTime );
675 
676  protected:
677  QString mName;
678 
680  QMap<QString, QString> mMetadata;
681  bool mIsScalar = true;
682 
683  private:
684  mutable double mMinimum = std::numeric_limits<double>::quiet_NaN();
685  mutable double mMaximum = std::numeric_limits<double>::quiet_NaN();
686  mutable bool mIsStatisticObsolete = true;
687 
688  void updateStatictic() const;
689 
690  QDateTime mReferenceTime;
691 };
692 
693 #ifndef SIP_RUN
694 
704 class CORE_EXPORT QgsMeshMemoryDataset: public QgsMeshDataset
705 {
706  public:
708  QgsMeshMemoryDataset() = default;
709 
710  QgsMeshDatasetValue datasetValue( int valueIndex ) const override;
711  QgsMeshDataBlock datasetValues( bool isScalar, int valueIndex, int count ) const override;
712  QgsMeshDataBlock areFacesActive( int faceIndex, int count ) const override;
713  QgsMeshDatasetMetadata metadata() const override;
714  bool isActive( int faceIndex ) const override;
715  int valuesCount() const override;
716 
718  void calculateMinMax();
719 
720  QVector<QgsMeshDatasetValue> values;
721  QVector<int> active;
722  double time = -1;
723  bool valid = false;
724  double minimum = std::numeric_limits<double>::quiet_NaN();
725  double maximum = std::numeric_limits<double>::quiet_NaN();
726 };
727 
738 {
739  public:
741  QgsMeshMemoryDatasetGroup() = default;
743  QgsMeshMemoryDatasetGroup( const QString &name );
745  QgsMeshMemoryDatasetGroup( const QString &name, QgsMeshDatasetGroupMetadata::DataType dataType );
746 
747  void initialize() override;
748  int datasetCount() const override;
749  QgsMeshDatasetMetadata datasetMetadata( int datasetIndex ) const override;
750  QgsMeshDataset *dataset( int index ) const override;
751  virtual QgsMeshDatasetGroup::Type type() const override {return QgsMeshDatasetGroup::Memory;}
752 
754  QDomElement writeXml( QDomDocument &doc, const QgsReadWriteContext &context ) const override;
755 
757  void addDataset( std::shared_ptr<QgsMeshMemoryDataset> dataset );
758 
760  void clearDatasets();
761 
763  std::shared_ptr<const QgsMeshMemoryDataset> constDataset( int index ) const;
764 
766  QVector<std::shared_ptr<QgsMeshMemoryDataset>> memoryDatasets;
767 };
768 
777 {
778  public:
781 
782  QgsMeshDatasetValue datasetValue( int valueIndex ) const override;
783  QgsMeshDataBlock datasetValues( bool isScalar, int valueIndex, int count ) const override;;
784  QgsMeshDataBlock areFacesActive( int faceIndex, int count ) const override;;
785  bool isActive( int ) const override {return true;};
786  QgsMeshDatasetMetadata metadata() const override;;
787  int valuesCount() const override;
788  private:
789  QgsMesh *mMesh;
790 };
791 
801 {
802  public:
804  QgsMeshVerticesElevationDatasetGroup( QString name, QgsMesh *mesh );
805 
806  void initialize() override;
807  QgsMeshDatasetMetadata datasetMetadata( int datasetIndex ) const override;;
808  int datasetCount() const override;;
809  QgsMeshDataset *dataset( int index ) const override;;
810  QgsMeshDatasetGroup::Type type() const override;
811  QDomElement writeXml( QDomDocument &, const QgsReadWriteContext & ) const override {return QDomElement();};
812 
813  private:
814  std::unique_ptr<QgsMeshVerticesElevationDataset> mDataset;
815 };
816 
817 #endif //SIP_RUN
818 
844 {
845  public:
846 
851 
860  QgsMeshDatasetGroupTreeItem( const QString &defaultName,
861  const QString &sourceName,
862  bool isVector,
863  int index );
864 
871  QgsMeshDatasetGroupTreeItem( const QDomElement &itemElement, const QgsReadWriteContext &context );
872 
878 
885 
891  void appendChild( QgsMeshDatasetGroupTreeItem *item SIP_TRANSFER );
892 
901  void removeChild( QgsMeshDatasetGroupTreeItem *item SIP_TRANSFER );
902 
908  QgsMeshDatasetGroupTreeItem *child( int row ) const;
909 
917  QgsMeshDatasetGroupTreeItem *childFromDatasetGroupIndex( int index );
918 
923  int childCount() const;
924 
929  int totalChildCount() const;
930 
937  QList<int> enabledDatasetGroupIndexes() const;
938 
943  QgsMeshDatasetGroupTreeItem *parentItem() const;
944 
949  int row() const;
950 
956  QString name() const;
957 
964  void setName( const QString &name );
965 
973  QString providerName() const;
974 
978  bool isVector() const;
979 
983  int datasetGroupIndex() const;
984 
988  bool isEnabled() const;
989 
994  void setIsEnabled( bool isEnabled );
995 
999  QString defaultName() const;
1000 
1006  QgsMeshDatasetGroup::Type datasetGroupType() const;
1007 
1014  QList<int> groupIndexDependencies() const;
1015 
1021  QString description() const;
1022 
1030  void setDatasetGroup( QgsMeshDatasetGroup *datasetGroup );
1031 
1039  void setPersistentDatasetGroup( const QString &uri );
1040 
1047  QDomElement writeXml( QDomDocument &doc, const QgsReadWriteContext &context );
1048 
1049  private:
1050  QgsMeshDatasetGroupTreeItem *mParent = nullptr;
1051  QList< QgsMeshDatasetGroupTreeItem * > mChildren;
1052  QMap<int, QgsMeshDatasetGroupTreeItem *> mDatasetGroupIndexToChild;
1053 
1054  // Data
1055  QString mUserName;
1056  QString mOriginalName;
1057  QString mSourceName;
1059  QString mDescription;
1060 
1061  bool mIsVector = false;
1062  int mDatasetGroupIndex = -1;
1063  bool mIsEnabled = true;
1064 
1065  QList<int> mDatasetGroupDependencies;
1066  QList<int> mDatasetGroupDependentOn;
1067 
1068  QgsMeshDatasetGroupTreeItem *searchItemBySourceName( const QString &sourceName ) const;
1069  QgsMeshDatasetGroupTreeItem *rootItem() const;
1070  void freeAsDependency();
1071  void freeFromDependencies();
1072 };
1073 
1074 #endif // QGSMESHDATASET_H
QgsMeshVerticesElevationDataset::isActive
bool isActive(int) const override
Returns whether the face is active.
Definition: qgsmeshdataset.h:785
QgsMeshDatasetGroupMetadata::DataOnVolumes
@ DataOnVolumes
Data is defined on volumes.
Definition: qgsmeshdataset.h:360
QgsMeshDataset::metadata
virtual QgsMeshDatasetMetadata metadata() const =0
Returns the metadata of the dataset.
QgsReadWriteContext
The class is used as a container of context for various read/write operations on other objects.
Definition: qgsreadwritecontext.h:34
QgsMeshDataBlock::ScalarDouble
@ ScalarDouble
Scalar double values.
Definition: qgsmeshdataset.h:144
operator==
bool operator==(const QgsFeatureIterator &fi1, const QgsFeatureIterator &fi2)
Definition: qgsfeatureiterator.h:425
QgsMeshVerticesElevationDataset::areFacesActive
QgsMeshDataBlock areFacesActive(int faceIndex, int count) const override
Returns whether faces are active.
Definition: qgsmeshdataset.cpp:1123
QgsMeshVerticesElevationDatasetGroup
Class that represents a dataset group with elevation value of the vertices of a existing mesh that ca...
Definition: qgsmeshdataset.h:800
QgsMeshDatasetGroup::writeXml
virtual QDomElement writeXml(QDomDocument &doc, const QgsReadWriteContext &context) const =0
Write dataset group information in a DOM element.
QgsMeshMemoryDataset
Class to store memory dataset.
Definition: qgsmeshdataset.h:704
QgsMeshDataset::areFacesActive
virtual QgsMeshDataBlock areFacesActive(int faceIndex, int count) const =0
Returns whether faces are active.
QgsMeshDatasetGroup::datasetCount
virtual int datasetCount() const =0
Returns the count of datasets in the group.
QgsMeshVerticesElevationDataset::valuesCount
int valuesCount() const override
Returns the values count.
Definition: qgsmeshdataset.cpp:1147
QgsMeshDatasetValue
QgsMeshDatasetValue represents single dataset value.
Definition: qgsmeshdataset.h:79
QgsMeshVerticesElevationDataset::metadata
QgsMeshDatasetMetadata metadata() const override
Returns the metadata of the dataset.
Definition: qgsmeshdataset.cpp:1130
QgsMeshDataset
Abstract class that represents a dataset.
Definition: qgsmeshdataset.h:543
QgsMeshVerticesElevationDataset::QgsMeshVerticesElevationDataset
QgsMeshVerticesElevationDataset(QgsMesh *mesh)
Constructor.
Definition: qgsmeshdataset.cpp:1096
QgsMeshDatasetGroup::Persistent
@ Persistent
Generic type used for non typed dataset group.
Definition: qgsmeshdataset.h:590
QgsMeshMemoryDataset::active
QVector< int > active
Definition: qgsmeshdataset.h:721
QgsMeshVerticesElevationDatasetGroup::writeXml
QDomElement writeXml(QDomDocument &, const QgsReadWriteContext &) const override
Write dataset group information in a DOM element.
Definition: qgsmeshdataset.h:811
QgsMeshDatasetGroupTreeItem
Tree item for display of the mesh dataset groups. Dataset group is set of datasets with the same name...
Definition: qgsmeshdataset.h:843
qgspoint.h
QgsMesh
Mesh - vertices, edges and faces.
Definition: qgsmeshdataprovider.h:58
operator!=
bool operator!=(const QgsFeatureIterator &fi1, const QgsFeatureIterator &fi2)
Definition: qgsfeatureiterator.h:430
QgsRectangle
A rectangle specified with double values.
Definition: qgsrectangle.h:41
QgsMeshDatasetMetadata
QgsMeshDatasetMetadata is a collection of mesh dataset metadata such as whether the data is valid or ...
Definition: qgsmeshdataset.h:478
QgsMesh3dDataBlock
QgsMesh3dDataBlock is a block of 3d stacked mesh data related N faces defined on base mesh frame.
Definition: qgsmeshdataset.h:246
SIP_FACTORY
#define SIP_FACTORY
Definition: qgis_sip.h:76
QgsMeshDataset::datasetValue
virtual QgsMeshDatasetValue datasetValue(int valueIndex) const =0
Returns the value with index valueIndex.
QgsMeshDatasetGroupMetadata::DataOnVertices
@ DataOnVertices
Data is defined on vertices.
Definition: qgsmeshdataset.h:359
QgsMeshVerticesElevationDataset
Class that represents a dataset with elevation value of the vertices of a existing mesh that can be e...
Definition: qgsmeshdataset.h:776
QgsMeshMemoryDatasetGroup::type
virtual QgsMeshDatasetGroup::Type type() const override
Returns the type of dataset group.
Definition: qgsmeshdataset.h:751
QgsMeshVerticesElevationDataset::datasetValue
QgsMeshDatasetValue datasetValue(int valueIndex) const override
Returns the value with index valueIndex.
Definition: qgsmeshdataset.cpp:1100
QgsMeshDataBlock::Vector2DDouble
@ Vector2DDouble
Vector double pairs (x1, y1, x2, y2, ... )
Definition: qgsmeshdataset.h:145
QgsMeshDatasetIndex
QgsMeshDatasetIndex is index that identifies the dataset group (e.g. wind speed) and a dataset in thi...
Definition: qgsmeshdataset.h:48
QgsMeshLayer
Represents a mesh layer supporting display of data on structured or unstructured meshes.
Definition: qgsmeshlayer.h:98
QgsMeshDataset::datasetValues
virtual QgsMeshDataBlock datasetValues(bool isScalar, int valueIndex, int count) const =0
Returns count values from valueIndex.
qgis_sip.h
SIP_TRANSFER
#define SIP_TRANSFER
Definition: qgis_sip.h:36
QgsMeshDataBlock::DataType
DataType
Type of data stored in the block.
Definition: qgsmeshdataset.h:141
QgsMeshDatasetGroup::initialize
virtual void initialize()=0
Initialize the dataset group.
QgsMeshDatasetGroup::None
@ None
Definition: qgsmeshdataset.h:589
QgsMeshDatasetGroup::type
virtual QgsMeshDatasetGroup::Type type() const =0
Returns the type of dataset group.
QgsMeshDatasetGroup::dataset
virtual QgsMeshDataset * dataset(int index) const =0
Returns the dataset with index.
QgsMeshDatasetGroup
Abstract class that represents a dataset group.
Definition: qgsmeshdataset.h:578
QgsMeshDatasetGroup::datasetMetadata
virtual QgsMeshDatasetMetadata datasetMetadata(int datasetIndex) const =0
Returns the metadata of the dataset with index datasetIndex.
QgsMeshVerticesElevationDataset::datasetValues
QgsMeshDataBlock datasetValues(bool isScalar, int valueIndex, int count) const override
Returns count values from valueIndex.
Definition: qgsmeshdataset.cpp:1108
QgsMeshDatasetGroup::mMetadata
QMap< QString, QString > mMetadata
Definition: qgsmeshdataset.h:680
QgsMeshDatasetGroup::mName
QString mName
Definition: qgsmeshdataset.h:677
QgsMeshDatasetGroupMetadata
QgsMeshDatasetGroupMetadata is a collection of dataset group metadata such as whether the data is vec...
Definition: qgsmeshdataset.h:351
QgsMeshDatasetGroupMetadata::DataType
DataType
Location of where data is specified for datasets in the dataset group.
Definition: qgsmeshdataset.h:356
QgsMeshDataBlock::ActiveFlagInteger
@ ActiveFlagInteger
Integer boolean flag whether face is active.
Definition: qgsmeshdataset.h:143
QgsMeshDatasetGroup::Type
Type
Type of the dataset group.
Definition: qgsmeshdataset.h:587
QgsMeshMemoryDatasetGroup::memoryDatasets
QVector< std::shared_ptr< QgsMeshMemoryDataset > > memoryDatasets
Contains all the memory datasets.
Definition: qgsmeshdataset.h:766
qgsdataprovider.h
QgsMeshDataBlock
QgsMeshDataBlock is a block of integers/doubles that can be used to retrieve: active flags (e....
Definition: qgsmeshdataset.h:137
QgsMeshDataset::isActive
virtual bool isActive(int faceIndex) const =0
Returns whether the face is active.
QgsMeshDataset::valuesCount
virtual int valuesCount() const =0
Returns the values count.
QgsMeshMemoryDatasetGroup
Class that represents a dataset group stored in memory.
Definition: qgsmeshdataset.h:737
QgsMeshDatasetGroup::Virtual
@ Virtual
Temporary dataset group in memory.
Definition: qgsmeshdataset.h:592
QgsMeshDatasetGroup::Memory
@ Memory
Dataset group store in a file.
Definition: qgsmeshdataset.h:591
QgsMeshMemoryDataset::values
QVector< QgsMeshDatasetValue > values
Definition: qgsmeshdataset.h:720