QGIS API Documentation  3.37.0-Master (a5b4d9743e8)
qgsmeshlayer.h
Go to the documentation of this file.
1 /***************************************************************************
2  qgsmeshlayer.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 QGSMESHLAYER_H
19 #define QGSMESHLAYER_H
20 
21 #include <memory>
22 
23 #include "qgis_core.h"
24 #include "qgsinterval.h"
25 #include "qgsmaplayer.h"
26 #include "qgsmeshdataprovider.h"
28 #include "qgsmeshtimesettings.h"
30 #include "qgscoordinatetransform.h"
32 
34 struct QgsMeshLayerRendererCache;
35 class QgsSymbol;
36 class QgsTriangularMesh;
37 class QgsRenderContext;
38 struct QgsMesh;
42 class QgsMeshEditor;
46 
100 class CORE_EXPORT QgsMeshLayer : public QgsMapLayer, public QgsAbstractProfileSource
101 {
102  Q_OBJECT
103  public:
104 
109  {
110 
116  : transformContext( transformContext )
117  {}
118 
123 
128  bool loadDefaultStyle = true;
129 
143  bool skipCrsValidation = false;
144  };
145 
159  explicit QgsMeshLayer( const QString &path = QString(), const QString &baseName = QString(), const QString &providerLib = QStringLiteral( "mesh_memory" ),
161 
162  ~QgsMeshLayer() override;
163 
165  QgsMeshLayer( const QgsMeshLayer &rhs ) = delete;
167  QgsMeshLayer &operator=( QgsMeshLayer const &rhs ) = delete;
168 
169 #ifdef SIP_RUN
170  SIP_PYOBJECT __repr__();
171  % MethodCode
172  QString str = QStringLiteral( "<QgsMeshLayer: '%1' (%2)>" ).arg( sipCpp->name(), sipCpp->dataProvider() ? sipCpp->dataProvider()->name() : QStringLiteral( "Invalid" ) );
173  sipRes = PyUnicode_FromString( str.toUtf8().constData() );
174  % End
175 #endif
176 
177  QgsMeshDataProvider *dataProvider() override;
178  const QgsMeshDataProvider *dataProvider() const override SIP_SKIP;
179  QgsMeshLayer *clone() const override SIP_FACTORY;
180  QgsRectangle extent() const override;
181  QgsMapLayerRenderer *createMapRenderer( QgsRenderContext &rendererContext ) override SIP_FACTORY;
182  QgsAbstractProfileGenerator *createProfileGenerator( const QgsProfileRequest &request ) override SIP_FACTORY;
183  bool readSymbology( const QDomNode &node, QString &errorMessage,
184  QgsReadWriteContext &context, QgsMapLayer::StyleCategories categories = QgsMapLayer::AllStyleCategories ) override;
185  bool writeSymbology( QDomNode &node, QDomDocument &doc, QString &errorMessage,
186  const QgsReadWriteContext &context, QgsMapLayer::StyleCategories categories = QgsMapLayer::AllStyleCategories ) const override;
187  bool writeStyle( QDomNode &node, QDomDocument &doc, QString &errorMessage, const QgsReadWriteContext &context, StyleCategories categories = AllStyleCategories ) const override;
188  bool readStyle( const QDomNode &node, QString &errorMessage, QgsReadWriteContext &context, StyleCategories categories = AllStyleCategories ) override;
189  QString encodedSource( const QString &source, const QgsReadWriteContext &context ) const override;
190  QString decodedSource( const QString &source, const QString &provider, const QgsReadWriteContext &context ) const override;
191  bool readXml( const QDomNode &layer_node, QgsReadWriteContext &context ) override;
192  bool writeXml( QDomNode &layer_node, QDomDocument &doc, const QgsReadWriteContext &context ) const override;
193  QgsMapLayerTemporalProperties *temporalProperties() override;
194  QgsMapLayerElevationProperties *elevationProperties() override;
195  void reload() override;
196  QStringList subLayers() const override;
197  QString htmlMetadata() const override;
198  bool isEditable() const override;
199  bool supportsEditing() const override;
200  QString loadDefaultStyle( bool &resultFlag SIP_OUT ) FINAL;
201 
203  QString providerType() const;
204 
214  bool addDatasets( const QString &path, const QDateTime &defaultReferenceTime = QDateTime() );
215 
224  bool addDatasets( QgsMeshDatasetGroup *datasetGroup SIP_TRANSFER );
225 
236  bool saveDataset( const QString &path, int datasetGroupIndex, QString driver );
237 
243  QgsMesh *nativeMesh() SIP_SKIP;
244 
250  const QgsMesh *nativeMesh() const SIP_SKIP;
251 
264  QgsTriangularMesh *triangularMesh( double minimumTriangleSize = 0 ) const SIP_SKIP;
265 
272  int triangularMeshLevelOfDetailCount() const SIP_SKIP;
273 
284  QgsTriangularMesh *triangularMeshByLodIndex( int lodIndex ) const SIP_SKIP;
285 
293  void updateTriangularMesh( const QgsCoordinateTransform &transform = QgsCoordinateTransform() );
294 
300  QgsMeshLayerRendererCache *rendererCache() SIP_SKIP;
301 
303  QgsMeshRendererSettings rendererSettings() const;
305  void setRendererSettings( const QgsMeshRendererSettings &settings );
306 
312  QgsMeshTimeSettings timeSettings() const;
313 
319  void setTimeSettings( const QgsMeshTimeSettings &settings );
320 
326  QgsMeshSimplificationSettings meshSimplificationSettings() const SIP_SKIP;
327 
333  void setMeshSimplificationSettings( const QgsMeshSimplificationSettings &meshSimplificationSettings ) SIP_SKIP;
334 
341  QString formatTime( double hours );
342 
348  int datasetGroupCount() const;
349 
355  int extraDatasetGroupCount() const;
356 
365  QList<int> datasetGroupsIndexes() const;
366 
375  QList<int> enabledDatasetGroupsIndexes() const;
376 
385  QgsMeshDatasetGroupMetadata datasetGroupMetadata( const QgsMeshDatasetIndex &index ) const;
386 
397  int datasetCount( const QgsMeshDatasetIndex &index ) const;
398 
409  QgsMeshDatasetMetadata datasetMetadata( const QgsMeshDatasetIndex &index ) const;
410 
428  QgsMeshDatasetValue datasetValue( const QgsMeshDatasetIndex &index, int valueIndex ) const;
429 
448  QgsMeshDataBlock datasetValues( const QgsMeshDatasetIndex &index, int valueIndex, int count ) const;
449 
466  QgsMesh3DDataBlock dataset3dValues( const QgsMeshDatasetIndex &index, int faceIndex, int count ) const;
467 
475  bool isFaceActive( const QgsMeshDatasetIndex &index, int faceIndex ) const;
476 
489  QgsMeshDataBlock areFacesActive( const QgsMeshDatasetIndex &index, int faceIndex, int count ) const;
490 
513  QgsMeshDatasetValue datasetValue( const QgsMeshDatasetIndex &index, const QgsPointXY &point, double searchRadius = 0 ) const;
514 
534  QgsMesh3DDataBlock dataset3dValue( const QgsMeshDatasetIndex &index, const QgsPointXY &point ) const;
535 
555  QgsMeshDatasetValue dataset1dValue( const QgsMeshDatasetIndex &index, const QgsPointXY &point, double searchRadius ) const;
556 
572  QgsMeshDatasetIndex datasetIndexAtTime( const QgsDateTimeRange &timeRange, int datasetGroupIndex ) const;
573 
589  QgsMeshDatasetIndex datasetIndexAtRelativeTime( const QgsInterval &relativeTime, int datasetGroupIndex ) const;
590 
605  QList<QgsMeshDatasetIndex> datasetIndexInRelativeTimeInterval( const QgsInterval &startRelativeTime, const QgsInterval &endRelativeTime, int datasetGroupIndex ) const;
606 
618  QgsMeshDatasetIndex activeScalarDatasetAtTime( const QgsDateTimeRange &timeRange ) const;
619 
631  QgsMeshDatasetIndex activeVectorDatasetAtTime( const QgsDateTimeRange &timeRange ) const;
632 
640  void setStaticScalarDatasetIndex( const QgsMeshDatasetIndex &staticScalarDatasetIndex ) SIP_SKIP;
641 
649  void setStaticVectorDatasetIndex( const QgsMeshDatasetIndex &staticVectorDatasetIndex ) SIP_SKIP;
650 
656  QgsMeshDatasetIndex staticScalarDatasetIndex() const;
657 
663  QgsMeshDatasetIndex staticVectorDatasetIndex() const;
664 
672  void setReferenceTime( const QDateTime &referenceTime );
673 
681  void setTemporalMatchingMethod( const QgsMeshDataProviderTemporalCapabilities::MatchingTemporalDatasetMethod &matchingMethod );
682 
704  QgsPointXY snapOnElement( QgsMesh::ElementType elementType, const QgsPointXY &point, double searchRadius );
705 
714  QList<int> selectVerticesByExpression( QgsExpression expression );
715 
724  QList<int> selectFacesByExpression( QgsExpression expression );
725 
733  QgsMeshDatasetGroupTreeItem *datasetGroupTreeRootItem() const;
734 
748  void setDatasetGroupTreeRootItem( QgsMeshDatasetGroupTreeItem *rootItem );
749 
755  void resetDatasetGroupTreeItem();
756 
762  QgsInterval firstValidTimeStep() const;
763 
769  QgsInterval datasetRelativeTime( const QgsMeshDatasetIndex &index );
770 
776  qint64 datasetRelativeTimeInMilliseconds( const QgsMeshDatasetIndex &index );
777 
785  Q_DECL_DEPRECATED bool startFrameEditing( const QgsCoordinateTransform &transform );
786 
797  bool startFrameEditing( const QgsCoordinateTransform &transform, QgsMeshEditingError &error SIP_OUT, bool fixErrors );
798 
799 
808  bool commitFrameEditing( const QgsCoordinateTransform &transform, bool continueEditing = true );
809 
818  bool rollBackFrameEditing( const QgsCoordinateTransform &transform, bool continueEditing = true );
819 
827  void stopFrameEditing( const QgsCoordinateTransform &transform );
828 
838  bool reindex( const QgsCoordinateTransform &transform, bool renumber );
839 
845  QgsMeshEditor *meshEditor();
846 
852  bool isModified() const override;
853 
858  bool contains( const QgsMesh::ElementType &type ) const;
859 
867  int meshVertexCount() const;
868 
876  int meshFaceCount() const;
877 
883  int meshEdgeCount() const;
884 
893  bool labelsEnabled() const;
894 
905  void setLabelsEnabled( bool enabled );
906 
915  const QgsAbstractMeshLayerLabeling *labeling() const SIP_SKIP { return mLabeling; }
916 
923  QgsAbstractMeshLayerLabeling *labeling() { return mLabeling; }
924 
929  void setLabeling( QgsAbstractMeshLayerLabeling *labeling SIP_TRANSFER );
930 
931 
932  public slots:
933 
939  void setTransformContext( const QgsCoordinateTransformContext &transformContext ) override;
940 
941  signals:
942 
949 
956 
963 
969  void reloaded();
970 
971  private: // Private methods
972 
976  bool isReadOnly() const override {return true;}
977 
984  bool setDataProvider( QString const &provider, const QgsDataProvider::ProviderOptions &options, QgsDataProvider::ReadFlags flags = QgsDataProvider::ReadFlags() );
985 
986 #ifdef SIP_RUN
987  QgsMeshLayer( const QgsMeshLayer &rhs );
988 #endif
989 
990  void fillNativeMesh();
991  void assignDefaultStyleToDatasetGroup( int groupIndex );
992  void createSimplifiedMeshes();
993  int levelsOfDetailsIndex( double partOfMeshInView ) const;
994 
995  bool hasSimplifiedMeshes() const;
996 
998  void applyClassificationOnScalarSettings( const QgsMeshDatasetGroupMetadata &meta, QgsMeshRendererScalarSettings &scalarSettings ) const;
999 
1000  private slots:
1001  void onDatasetGroupsAdded( const QList<int> &datasetGroupIndexes );
1002  void onMeshEdited();
1003 
1004  private:
1006  QgsMeshDataProvider *mDataProvider = nullptr;
1007 
1009  QStringList mExtraDatasetUri;
1010 
1011  std::unique_ptr<QgsMeshDatasetGroupStore> mDatasetGroupStore;
1012 
1014  std::unique_ptr<QgsMesh> mNativeMesh;
1015 
1017  std::vector<std::unique_ptr<QgsTriangularMesh>> mTriangularMeshes;
1018 
1020  std::unique_ptr<QgsMeshLayerRendererCache> mRendererCache;
1021 
1023  QgsMeshRendererSettings mRendererSettings;
1024 
1026  QgsMeshTimeSettings mTimeSettings;
1027 
1029  QgsMeshSimplificationSettings mSimplificationSettings;
1030 
1031  QgsMeshLayerTemporalProperties *mTemporalProperties = nullptr;
1032  QgsMeshLayerElevationProperties *mElevationProperties = nullptr;
1033 
1036 
1037  int mStaticScalarDatasetIndex = 0;
1038  int mStaticVectorDatasetIndex = 0;
1039 
1040  QgsMeshEditor *mMeshEditor = nullptr;
1041 
1043  bool mLabelsEnabled = false;
1044 
1046  QgsAbstractMeshLayerLabeling *mLabeling = nullptr;
1047 
1048  int closestEdge( const QgsPointXY &point, double searchRadius, QgsPointXY &projectedPoint ) const;
1049 
1051  QgsPointXY snapOnVertex( const QgsPointXY &point, double searchRadius );
1052 
1054  QgsPointXY snapOnEdge( const QgsPointXY &point, double searchRadius );
1055 
1057  QgsPointXY snapOnFace( const QgsPointXY &point, double searchRadius );
1058 
1059  void updateActiveDatasetGroups();
1060 
1061  QgsMeshRendererSettings accordSymbologyWithGroupName( const QgsMeshRendererSettings &settings, const QMap<QString, int> &nameToIndex );
1062  void checkSymbologyConsistency();
1063 
1064  void setDataSourcePrivate( const QString &dataSource, const QString &baseName, const QString &provider,
1065  const QgsDataProvider::ProviderOptions &options, QgsDataProvider::ReadFlags flags ) final;
1066 };
1067 
1068 #endif //QGSMESHLAYER_H
TemporalUnit
Temporal units.
Definition: qgis.h:4197
Abstract base class - its implementations define different approaches to the labeling of a mesh layer...
Abstract base class for objects which generate elevation profiles.
Interface for classes which can generate elevation profiles.
Contains information about the context in which a coordinate transform is executed.
Class for doing transforms between two map coordinate systems.
QFlags< ReadFlag > ReadFlags
Class for parsing and evaluation of expressions (formerly called "search strings").
A representation of the interval between two datetime values.
Definition: qgsinterval.h:46
Base class for storage of map layer elevation properties.
Base class for utility classes that encapsulate information necessary for rendering of map layers.
Base class for storage of map layer temporal properties.
Base class for all map layer types.
Definition: qgsmaplayer.h:75
QFlags< StyleCategory > StyleCategories
Definition: qgsmaplayer.h:188
virtual void setTransformContext(const QgsCoordinateTransformContext &transformContext)=0
Sets the coordinate transform context to transformContext.
virtual Q_INVOKABLE QgsDataProvider * dataProvider()
Returns the layer's data provider, it may be nullptr.
Abstract class to interpolate 3d stacked mesh data to 2d data.
QgsMesh3DDataBlock is a block of 3d stacked mesh data related N faces defined on base mesh frame.
QgsMeshDataBlock is a block of integers/doubles that can be used to retrieve: active flags (e....
Class for handling properties relating to a mesh data provider's temporal capabilities.
Base class for providing data for QgsMeshLayer.
QgsMeshDatasetGroupMetadata is a collection of dataset group metadata such as whether the data is vec...
Class used to register and access all the dataset groups related to a mesh layer.
Tree item for display of the mesh dataset groups.
Abstract class that represents a dataset 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 ...
QgsMeshDatasetValue represents single dataset value.
Class that represents an error during mesh editing.
Definition: qgsmesheditor.h:43
Class that makes edit operation on a mesh.
Definition: qgsmesheditor.h:68
Mesh layer specific subclass of QgsMapLayerElevationProperties.
Implementation of map layer temporal properties for mesh layers.
Represents a mesh layer supporting display of data on structured or unstructured meshes.
Definition: qgsmeshlayer.h:101
void activeScalarDatasetGroupChanged(int index)
Emitted when active scalar group dataset is changed.
void activeVectorDatasetGroupChanged(int index)
Emitted when active vector group dataset is changed.
void timeSettingsChanged()
Emitted when time format is changed.
QgsMeshLayer(const QgsMeshLayer &rhs)=delete
QgsMeshLayer cannot be copied.
QgsMeshLayer & operator=(QgsMeshLayer const &rhs)=delete
QgsMeshLayer cannot be copied.
QgsAbstractMeshLayerLabeling * labeling()
Access to labeling configuration.
Definition: qgsmeshlayer.h:923
void reloaded()
Emitted when the mesh layer is reloaded, see reload()
Represents a mesh renderer settings for scalar datasets.
Represents all mesh renderer settings.
Represents an overview renderer settings.
Represents a mesh time settings for mesh datasets.
A class to represent a 2D point.
Definition: qgspointxy.h:60
Encapsulates properties and constraints relating to fetching elevation profiles from different source...
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
Contains information about the context of a rendering operation.
Abstract base class for all rendered symbols.
Definition: qgssymbol.h:94
Triangular/Derived Mesh is mesh with vertices in map coordinates.
#define str(x)
Definition: qgis.cpp:38
#define SIP_SKIP
Definition: qgis_sip.h:126
#define FINAL
Definition: qgis_sip.h:242
#define SIP_TRANSFER
Definition: qgis_sip.h:36
#define SIP_OUT
Definition: qgis_sip.h:58
#define SIP_FACTORY
Definition: qgis_sip.h:76
Setting options for creating vector data providers.
Setting options for loading mesh layers.
Definition: qgsmeshlayer.h:109
QgsCoordinateTransformContext transformContext
Coordinate transform context.
Definition: qgsmeshlayer.h:122
LayerOptions(const QgsCoordinateTransformContext &transformContext=QgsCoordinateTransformContext())
Constructor for LayerOptions with optional transformContext.
Definition: qgsmeshlayer.h:115
Mesh - vertices, edges and faces.