QGIS API Documentation 3.43.0-Master (37eec98dbf6)
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#include <QDateTime>
26#include <QDomElement>
27
28#include <limits>
29#include <memory>
30
31#include "qgis_core.h"
32#include "qgis_sip.h"
33
34class QgsMeshLayer;
36class QgsRectangle;
37class QDomDocument;
39
40struct QgsMesh;
41
52class CORE_EXPORT QgsMeshDatasetIndex
53{
54 public:
56 QgsMeshDatasetIndex( int group = -1, int dataset = -1 );
58 int group() const;
60 int dataset() const;
62 bool isValid() const;
63
64 bool operator == ( QgsMeshDatasetIndex other ) const;
65 bool operator != ( QgsMeshDatasetIndex other ) const;
66 private:
67 int mGroupIndex = -1;
68 int mDatasetIndex = -1;
69};
70
82class CORE_EXPORT QgsMeshDatasetValue
83{
84 public:
86 QgsMeshDatasetValue( double x,
87 double y );
88
90 QgsMeshDatasetValue( double scalar );
91
94
96
98 void set( double scalar );
99
101 void setX( double x );
102
104 void setY( double y ) ;
105
107 double scalar() const;
108
110 double x() const;
111
113 double y() const;
114
115 bool operator==( QgsMeshDatasetValue other ) const;
116
117 private:
118 double mX = std::numeric_limits<double>::quiet_NaN();
119 double mY = std::numeric_limits<double>::quiet_NaN();
120};
121
141class CORE_EXPORT QgsMeshDataBlock
142{
143 public:
151
154
156 QgsMeshDataBlock( DataType type, int count );
157
159 DataType type() const;
160
162 int count() const;
163
165 bool isValid() const;
166
171 QgsMeshDatasetValue value( int index ) const;
172
177 bool active( int index ) const;
178
192 void setActive( const QVector<int> &vals );
193
205 QVector<int> active() const;
206
213 QVector<double> values() const;
214
224 void setValues( const QVector<double> &vals );
225
227 void setValid( bool valid );
228
229 private:
230 QVector<double> mDoubleBuffer;
231 QVector<int> mIntegerBuffer;
232 DataType mType;
233 int mSize = 0;
234 bool mIsValid = false;
235};
236
253class CORE_EXPORT QgsMesh3DDataBlock
254{
255 public:
259
261 QgsMesh3DDataBlock( int count, bool isVector );
262
264 void setValid( bool valid );
265
267 bool isValid() const;
268
270 bool isVector() const;
271
273 int count() const;
274
276 int firstVolumeIndex() const;
277
279 int lastVolumeIndex() const;
280
282 int volumesCount() const;
283
287 QVector<int> verticalLevelsCount() const;
288
292 void setVerticalLevelsCount( const QVector<int> &verticalLevelsCount );
293
297 QVector<double> verticalLevels() const;
298
302 void setVerticalLevels( const QVector<double> &verticalLevels );
303
307 QVector<int> faceToVolumeIndex() const;
308
312 void setFaceToVolumeIndex( const QVector<int> &faceToVolumeIndex );
313
319 QVector<double> values() const;
320
327 QgsMeshDatasetValue value( int volumeIndex ) const;
328
334 void setValues( const QVector<double> &doubleBuffer );
335
336 private:
337 int mSize = 0;
338 bool mIsValid = false;
339 bool mIsVector = false;
340 QVector<int> mVerticalLevelsCount;
341 QVector<double> mVerticalLevels;
342 QVector<int> mFaceToVolumeIndex;
343 QVector<double> mDoubleBuffer; // for scalar/vector values
344};
345
357{
358 public:
359
362 {
363 DataOnFaces = 0,
366 DataOnEdges
367 };
368
371
386 QgsMeshDatasetGroupMetadata( const QString &name,
387 const QString uri,
388 bool isScalar,
389 DataType dataType,
390 double minimum,
391 double maximum,
392 int maximumVerticalLevels,
393 const QDateTime &referenceTime,
394 bool isTemporal,
395 const QMap<QString, QString> &extraOptions );
396
400 QString name() const;
401
410 QString parentQuantityName() const;
411
417 QString uri() const;
418
422 QMap<QString, QString> extraOptions() const;
423
427 bool isVector() const;
428
432 bool isScalar() const;
433
437 bool isTemporal() const;
438
444 DataType dataType() const;
445
449 double minimum() const;
450
454 double maximum() const;
455
461 int maximumVerticalLevelsCount() const;
462
468 QDateTime referenceTime() const;
469
470 private:
471 QString mName;
472 QString mParentQuantityName;
473 QString mUri;
474 bool mIsScalar = false;
475 DataType mDataType = DataType::DataOnFaces;
476 double mMinimumValue = std::numeric_limits<double>::quiet_NaN();
477 double mMaximumValue = std::numeric_limits<double>::quiet_NaN();
478 QMap<QString, QString> mExtraOptions;
479 int mMaximumVerticalLevelsCount = 0; // for 3d stacked meshes
480 QDateTime mReferenceTime;
481 bool mIsTemporal = false;
482};
483
493class CORE_EXPORT QgsMeshDatasetMetadata
494{
495 public:
498
508 QgsMeshDatasetMetadata( double time,
509 bool isValid,
510 double minimum,
511 double maximum,
512 int maximumVerticalLevels
513 );
514
518 double time() const;
519
523 bool isValid() const;
524
528 double minimum() const;
529
533 double maximum() const;
534
540 int maximumVerticalLevelsCount() const;
541
542 private:
543 double mTime = std::numeric_limits<double>::quiet_NaN();
544 bool mIsValid = false;
545 double mMinimumValue = std::numeric_limits<double>::quiet_NaN();
546 double mMaximumValue = std::numeric_limits<double>::quiet_NaN();
547 int mMaximumVerticalLevelsCount = 0; // for 3d stacked meshes
548};
549
550
558class CORE_EXPORT QgsMeshDataset
559{
560 public:
561
562 QgsMeshDataset() = default;
563
564 virtual ~QgsMeshDataset() = default;
565
567 virtual QgsMeshDatasetValue datasetValue( int valueIndex ) const = 0;
568
570 virtual QgsMeshDataBlock datasetValues( bool isScalar, int valueIndex, int count ) const = 0;
571
573 virtual QgsMeshDataBlock areFacesActive( int faceIndex, int count ) const = 0;
574
576 virtual bool isActive( int faceIndex ) const = 0;
577
579 virtual QgsMeshDatasetMetadata metadata() const = 0;
580
582 virtual int valuesCount() const = 0;
583};
584
592class CORE_EXPORT QgsMeshDatasetGroup
593{
594 public:
595
608
611
613 QgsMeshDatasetGroup( const QString &name );
614
616 QgsMeshDatasetGroup( const QString &name, QgsMeshDatasetGroupMetadata::DataType dataType );
617
619 virtual void initialize() = 0;
620
622 QgsMeshDatasetGroupMetadata groupMetadata() const;
623
625 virtual QgsMeshDatasetMetadata datasetMetadata( int datasetIndex ) const = 0 ;
626
628 virtual int datasetCount() const = 0;
629
631 virtual QgsMeshDataset *dataset( int index ) const = 0;
632
634 virtual QgsMeshDatasetGroup::Type type() const = 0;
635
637 double minimum() const;
638
640 double maximum() const;
641
643 void setMinimumMaximum( double min, double max ) const;
644
646 QString name() const;
647
649 void setName( const QString &name );
650
653
655 void setDataType( const QgsMeshDatasetGroupMetadata::DataType &dataType );
656
658 void addExtraMetadata( QString key, QString value );
660 QMap<QString, QString> extraMetadata() const;
661
663 bool isScalar() const;
664
666 void setIsScalar( bool isScalar );
667
669 bool checkValueCountPerDataset( int count ) const;
670
672 void calculateStatistic() const;
673
675 void setStatisticObsolete() const;
676
678 virtual QStringList datasetGroupNamesDependentOn() const;
679
681 virtual QDomElement writeXml( QDomDocument &doc, const QgsReadWriteContext &context ) const = 0;
682
684 virtual QString description() const;
685
687 void setReferenceTime( const QDateTime &referenceTime );
688
689 protected:
690 QString mName;
691
693 QMap<QString, QString> mMetadata;
694 bool mIsScalar = true;
695
696 private:
697 mutable double mMinimum = std::numeric_limits<double>::quiet_NaN();
698 mutable double mMaximum = std::numeric_limits<double>::quiet_NaN();
699 mutable bool mIsStatisticObsolete = true;
700
701 void updateStatistic() const;
702
703 QDateTime mReferenceTime;
704};
705
706#ifndef SIP_RUN
707
717class CORE_EXPORT QgsMeshMemoryDataset: public QgsMeshDataset
718{
719 public:
720
722
723 QgsMeshDatasetValue datasetValue( int valueIndex ) const override;
724 QgsMeshDataBlock datasetValues( bool isScalar, int valueIndex, int count ) const override;
725 QgsMeshDataBlock areFacesActive( int faceIndex, int count ) const override;
726 QgsMeshDatasetMetadata metadata() const override;
727 bool isActive( int faceIndex ) const override;
728 int valuesCount() const override;
729
731 void calculateMinMax();
732
733 QVector<QgsMeshDatasetValue> values;
734 QVector<int> active;
735 double time = -1;
736 bool valid = false;
737 double minimum = std::numeric_limits<double>::quiet_NaN();
738 double maximum = std::numeric_limits<double>::quiet_NaN();
739};
740
751{
752 public:
753
756 QgsMeshMemoryDatasetGroup( const QString &name );
759
760 void initialize() override;
761 int datasetCount() const override;
762 QgsMeshDatasetMetadata datasetMetadata( int datasetIndex ) const override;
763 QgsMeshDataset *dataset( int index ) const override;
765
767 QDomElement writeXml( QDomDocument &doc, const QgsReadWriteContext &context ) const override;
768
770 void addDataset( std::shared_ptr<QgsMeshMemoryDataset> dataset );
771
773 void clearDatasets();
774
776 std::shared_ptr<const QgsMeshMemoryDataset> constDataset( int index ) const;
777
779 QVector<std::shared_ptr<QgsMeshMemoryDataset>> memoryDatasets;
780};
781
790{
791 public:
794
795 QgsMeshDatasetValue datasetValue( int valueIndex ) const override;
796 QgsMeshDataBlock datasetValues( bool isScalar, int valueIndex, int count ) const override;;
797 QgsMeshDataBlock areFacesActive( int faceIndex, int count ) const override;;
798 bool isActive( int ) const override {return true;};
799 QgsMeshDatasetMetadata metadata() const override;;
800 int valuesCount() const override;
801 private:
802 QgsMesh *mMesh;
803};
804
815{
816 public:
818 QgsMeshVerticesElevationDatasetGroup( QString name, QgsMesh *mesh );
819
820 void initialize() override;
821 QgsMeshDatasetMetadata datasetMetadata( int datasetIndex ) const override;;
822 int datasetCount() const override;;
823 QgsMeshDataset *dataset( int index ) const override;;
824 QgsMeshDatasetGroup::Type type() const override;
825 QDomElement writeXml( QDomDocument &, const QgsReadWriteContext & ) const override {return QDomElement();};
826
827 private:
828 std::unique_ptr<QgsMeshVerticesElevationDataset> mDataset;
829};
830
831#endif //SIP_RUN
832
861{
862 public:
863
868
877 QgsMeshDatasetGroupTreeItem( const QString &defaultName,
878 const QString &sourceName,
879 bool isVector,
880 int index );
881
888 QgsMeshDatasetGroupTreeItem( const QDomElement &itemElement, const QgsReadWriteContext &context );
889
895
902
908 void appendChild( QgsMeshDatasetGroupTreeItem *item SIP_TRANSFER );
909
916 void removeChild( QgsMeshDatasetGroupTreeItem *item SIP_TRANSFER );
917
923 QgsMeshDatasetGroupTreeItem *child( int row ) const;
924
932 QgsMeshDatasetGroupTreeItem *childFromDatasetGroupIndex( int index );
933
938 int childCount() const;
939
944 int totalChildCount() const;
945
952 QList<int> enabledDatasetGroupIndexes() const;
953
958 QgsMeshDatasetGroupTreeItem *parentItem() const;
959
964 int row() const;
965
971 QString name() const;
972
979 void setName( const QString &name );
980
988 QString providerName() const;
989
993 bool isVector() const;
994
998 int datasetGroupIndex() const;
999
1003 bool isEnabled() const;
1004
1009 void setIsEnabled( bool isEnabled );
1010
1014 QString defaultName() const;
1015
1021 QgsMeshDatasetGroup::Type datasetGroupType() const;
1022
1029 QList<int> groupIndexDependencies() const;
1030
1036 QString description() const;
1037
1045 void setDatasetGroup( QgsMeshDatasetGroup *datasetGroup );
1046
1054 void setPersistentDatasetGroup( const QString &uri );
1055
1062 QDomElement writeXml( QDomDocument &doc, const QgsReadWriteContext &context );
1063
1064 private:
1065 QgsMeshDatasetGroupTreeItem *mParent = nullptr;
1066 QList< QgsMeshDatasetGroupTreeItem * > mChildren;
1067 QMap<int, QgsMeshDatasetGroupTreeItem *> mDatasetGroupIndexToChild;
1068
1069 // Data
1070 QString mUserName;
1071 QString mOriginalName;
1072 QString mSourceName;
1073 QgsMeshDatasetGroup::Type mDatasetGroupType = QgsMeshDatasetGroup::Unknown;
1074 QString mDescription;
1075
1076 bool mIsVector = false;
1077 int mDatasetGroupIndex = -1;
1078 bool mIsEnabled = true;
1079
1080 QList<int> mDatasetGroupDependencies;
1081 QList<int> mDatasetGroupDependentOn;
1082
1083 QgsMeshDatasetGroupTreeItem *searchItemBySourceName( const QString &sourceName ) const;
1084 QgsMeshDatasetGroupTreeItem *rootItem() const;
1085 void freeAsDependency(); // cppcheck-suppress functionConst
1086 void freeFromDependencies(); // cppcheck-suppress functionConst
1087};
1088
1089#endif // QGSMESHDATASET_H
A block of 3d stacked mesh data related N faces defined on base mesh frame.
QgsMesh3DDataBlock()
Constructs an invalid block.
A block of integers/doubles from a mesh dataset.
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.
A collection of dataset group metadata such as whether the data is vector or scalar,...
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
virtual ~QgsMeshDatasetGroup()
QMap< QString, QString > mMetadata
Type
Type of the dataset group.
@ Unknown
Generic type used for non typed dataset group.
@ Virtual
Virtual Dataset group defined by a formula.
@ Memory
Temporary dataset group in memory.
@ Persistent
Dataset group store in a file.
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.
virtual QgsMeshDataset * dataset(int index) const =0
Returns the dataset with index.
An index that identifies the dataset group (e.g.
Represents mesh dataset metadata, such as whether the data is valid or the associated time.
QgsMeshDatasetMetadata()=default
Constructs an empty metadata object.
Represents a single mesh dataset value.
QgsMeshDatasetValue()=default
Default Ctor, initialize to NaN.
~QgsMeshDatasetValue()=default
Abstract class that represents a mesh dataset.
QgsMeshDataset()=default
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
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.
Represents a mesh dataset group stored in memory.
QgsMeshMemoryDatasetGroup()=default
virtual QgsMeshDatasetGroup::Type type() const override
Returns the type of dataset group.
QVector< std::shared_ptr< QgsMeshMemoryDataset > > memoryDatasets
Contains all the memory datasets.
Stores mesh memory datasets.
QgsMeshMemoryDataset()=default
QVector< QgsMeshDatasetValue > values
QVector< int > active
Represents a dataset group with elevation value of the vertices of an existing mesh that can be edite...
QDomElement writeXml(QDomDocument &, const QgsReadWriteContext &) const override
Write dataset group information in a DOM element.
Represents a dataset with elevation value of the vertices of an existing mesh that can be edited.
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.
A container for the context for various read/write operations on objects.
A rectangle specified with double values.
#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.