QGIS API Documentation  3.21.0-Master (5b68dc587e)
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 
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:
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;
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 );
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();
660 
662  void setStatisticObsolete();
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:
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:
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;
1058  QgsMeshDatasetGroup::Type mDatasetGroupType = QgsMeshDatasetGroup::None;
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
QgsMesh3dDataBlock is a block of 3d stacked mesh data related N faces defined on base mesh frame.
QgsMesh3dDataBlock()
Constructs an invalid block.
QgsMeshDataBlock is a block of integers/doubles that can be used to retrieve: active flags (e....
DataType
Type of data stored in the block.
@ ScalarDouble
Scalar double values.
@ Vector2DDouble
Vector double pairs (x1, y1, x2, y2, ... )
@ ActiveFlagInteger
Integer boolean flag whether face is active.
QgsMeshDatasetGroupMetadata is a collection of dataset group metadata such as whether the data is vec...
QgsMeshDatasetGroupMetadata()=default
Constructs an empty metadata object.
DataType
Location of where data is specified for datasets in the dataset group.
@ DataOnVertices
Data is defined on vertices.
@ DataOnVolumes
Data is defined on volumes.
Tree item for display of the mesh dataset groups.
QgsMeshDatasetGroupTreeItem()
Constructor for an empty dataset group tree item.
Abstract class that represents a dataset group.
virtual QgsMeshDatasetMetadata datasetMetadata(int datasetIndex) const =0
Returns the metadata of the dataset with index datasetIndex.
QgsMeshDatasetGroup()=default
Default constructor.
QString name() const
Returns the name of the dataset group.
virtual QgsMeshDataset * dataset(int index) const =0
Returns the dataset with index.
virtual ~QgsMeshDatasetGroup()
QMap< QString, QString > mMetadata
Type
Type of the dataset group.
@ Virtual
Temporary dataset group in memory.
@ Memory
Dataset group store in a file.
@ Persistent
Generic type used for non typed dataset group.
virtual void initialize()=0
Initialize the dataset group.
virtual QgsMeshDatasetGroup::Type type() const =0
Returns the type of dataset group.
virtual QDomElement writeXml(QDomDocument &doc, const QgsReadWriteContext &context) const =0
Write dataset group information in a DOM element.
virtual int datasetCount() const =0
Returns the count of datasets in the group.
QgsMeshDatasetIndex is index that identifies the dataset group (e.g.
QgsMeshDatasetMetadata is a collection of mesh dataset metadata such as whether the data is valid or ...
QgsMeshDatasetMetadata()=default
Constructs an empty metadata object.
QgsMeshDatasetValue represents single dataset value.
QgsMeshDatasetValue()=default
Default Ctor, initialize to NaN.
~QgsMeshDatasetValue()=default
Dtor.
Abstract class that represents a dataset.
QgsMeshDataset()=default
Constructor.
virtual QgsMeshDataBlock datasetValues(bool isScalar, int valueIndex, int count) const =0
Returns count values from valueIndex.
virtual int valuesCount() const =0
Returns the values count.
virtual ~QgsMeshDataset()=default
Destructor.
virtual QgsMeshDatasetMetadata metadata() const =0
Returns the metadata of the dataset.
virtual bool isActive(int faceIndex) const =0
Returns whether the face is active.
virtual QgsMeshDataBlock areFacesActive(int faceIndex, int count) const =0
Returns whether faces are active.
virtual QgsMeshDatasetValue datasetValue(int valueIndex) const =0
Returns the value with index valueIndex.
Represents a mesh layer supporting display of data on structured or unstructured meshes.
Definition: qgsmeshlayer.h:97
Class that represents a dataset group stored in memory.
QgsMeshMemoryDatasetGroup()=default
Constructor.
virtual QgsMeshDatasetGroup::Type type() const override
Returns the type of dataset group.
QVector< std::shared_ptr< QgsMeshMemoryDataset > > memoryDatasets
Contains all the memory datasets.
Class to store memory dataset.
QgsMeshMemoryDataset()=default
Constructor.
QVector< QgsMeshDatasetValue > values
QVector< int > active
Class that represents a dataset group with elevation value of the vertices of a existing mesh that ca...
int datasetCount() const override
Returns the count of datasets in the group.
QgsMeshVerticesElevationDatasetGroup(QString name, QgsMesh *mesh)
Constructor with a name and linked to mesh.
void initialize() override
Initialize the dataset group.
QgsMeshDatasetGroup::Type type() const override
Returns the type of dataset group.
QDomElement writeXml(QDomDocument &, const QgsReadWriteContext &) const override
Write dataset group information in a DOM element.
QgsMeshDataset * dataset(int index) const override
Returns the dataset with index.
QgsMeshDatasetMetadata datasetMetadata(int datasetIndex) const override
Returns the metadata of the dataset with index datasetIndex.
Class that represents a dataset with elevation value of the vertices of a existing mesh that can be e...
QgsMeshDatasetValue datasetValue(int valueIndex) const override
Returns the value with index valueIndex.
bool isActive(int) const override
Returns whether the face is active.
int valuesCount() const override
Returns the values count.
QgsMeshDataBlock areFacesActive(int faceIndex, int count) const override
Returns whether faces are active.
QgsMeshDatasetMetadata metadata() const override
Returns the metadata of the dataset.
QgsMeshDataBlock datasetValues(bool isScalar, int valueIndex, int count) const override
Returns count values from valueIndex.
QgsMeshVerticesElevationDataset(QgsMesh *mesh)
Constructor.
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:42
#define SIP_TRANSFER
Definition: qgis_sip.h:36
#define SIP_FACTORY
Definition: qgis_sip.h:76
bool operator==(const QgsFeatureIterator &fi1, const QgsFeatureIterator &fi2)
bool operator!=(const QgsFeatureIterator &fi1, const QgsFeatureIterator &fi2)
Mesh - vertices, edges and faces.