QGIS API Documentation 3.37.0-Master (fdefdf9c27f)
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"
32
34struct QgsMeshLayerRendererCache;
35class QgsSymbol;
38struct QgsMesh;
42class QgsMeshEditor;
46
100class 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
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,
1066};
1067
1068#endif //QGSMESHLAYER_H
TemporalUnit
Temporal units.
Definition: qgis.h:4231
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 & operator=(QgsMeshLayer const &rhs)=delete
QgsMeshLayer cannot be copied.
QgsMeshLayer(const QgsMeshLayer &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.