QGIS API Documentation 3.99.0-Master (a26b91b364d)
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
164 QgsMeshLayer( const QgsMeshLayer &rhs ) = delete;
165 QgsMeshLayer &operator=( QgsMeshLayer const &rhs ) = delete;
166
167#ifdef SIP_RUN
168 SIP_PYOBJECT __repr__();
169 % MethodCode
170 QString str = QStringLiteral( "<QgsMeshLayer: '%1' (%2)>" ).arg( sipCpp->name(), sipCpp->dataProvider() ? sipCpp->dataProvider()->name() : QStringLiteral( "Invalid" ) );
171 sipRes = PyUnicode_FromString( str.toUtf8().constData() );
172 % End
173#endif
174
176 const QgsMeshDataProvider *dataProvider() const override SIP_SKIP;
177 QgsMeshLayer *clone() const override SIP_FACTORY;
178 QgsRectangle extent() const override;
179 QgsMapLayerRenderer *createMapRenderer( QgsRenderContext &rendererContext ) override SIP_FACTORY;
180 QgsAbstractProfileSource *profileSource() override {return this;}
182 bool readSymbology( const QDomNode &node, QString &errorMessage,
184 bool writeSymbology( QDomNode &node, QDomDocument &doc, QString &errorMessage,
185 const QgsReadWriteContext &context, QgsMapLayer::StyleCategories categories = QgsMapLayer::AllStyleCategories ) const override;
186 bool writeStyle( QDomNode &node, QDomDocument &doc, QString &errorMessage, const QgsReadWriteContext &context, StyleCategories categories = AllStyleCategories ) const override;
187 bool readStyle( const QDomNode &node, QString &errorMessage, QgsReadWriteContext &context, StyleCategories categories = AllStyleCategories ) override;
188 QString encodedSource( const QString &source, const QgsReadWriteContext &context ) const override;
189 QString decodedSource( const QString &source, const QString &provider, const QgsReadWriteContext &context ) const override;
190 bool readXml( const QDomNode &layer_node, QgsReadWriteContext &context ) override;
191 bool writeXml( QDomNode &layer_node, QDomDocument &doc, const QgsReadWriteContext &context ) const override;
194 void reload() override;
195 QStringList subLayers() const override;
196 QString htmlMetadata() const override;
197 bool isEditable() const override;
198 bool supportsEditing() const override;
199 QString loadDefaultStyle( bool &resultFlag SIP_OUT ) FINAL;
200
210 bool addDatasets( const QString &path, const QDateTime &defaultReferenceTime = QDateTime() );
211
220 bool removeDatasets( const QString &name );
221
230 bool addDatasets( QgsMeshDatasetGroup *datasetGroup SIP_TRANSFER );
231
242 bool saveDataset( const QString &path, int datasetGroupIndex, QString driver );
243
249 QgsMesh *nativeMesh() SIP_SKIP;
250
256 const QgsMesh *nativeMesh() const SIP_SKIP;
257
270 QgsTriangularMesh *triangularMesh( double minimumTriangleSize = 0 ) const SIP_SKIP;
271
278 int triangularMeshLevelOfDetailCount() const SIP_SKIP;
279
290 QgsTriangularMesh *triangularMeshByLodIndex( int lodIndex ) const SIP_SKIP;
291
299 void updateTriangularMesh( const QgsCoordinateTransform &transform = QgsCoordinateTransform() );
300
306 QgsMeshLayerRendererCache *rendererCache() SIP_SKIP;
307
309 QgsMeshRendererSettings rendererSettings() const;
310
317 void setRendererSettings( const QgsMeshRendererSettings &settings, const bool repaint = true );
318
324 QgsMeshTimeSettings timeSettings() const;
325
331 void setTimeSettings( const QgsMeshTimeSettings &settings );
332
338 QgsMeshSimplificationSettings meshSimplificationSettings() const SIP_SKIP;
339
345 void setMeshSimplificationSettings( const QgsMeshSimplificationSettings &meshSimplificationSettings ) SIP_SKIP;
346
353 QString formatTime( double hours );
354
360 int datasetGroupCount() const;
361
367 int extraDatasetGroupCount() const;
368
377 QList<int> datasetGroupsIndexes() const;
378
387 QList<int> enabledDatasetGroupsIndexes() const;
388
397 QgsMeshDatasetGroupMetadata datasetGroupMetadata( const QgsMeshDatasetIndex &index ) const;
398
409 int datasetCount( const QgsMeshDatasetIndex &index ) const;
410
421 QgsMeshDatasetMetadata datasetMetadata( const QgsMeshDatasetIndex &index ) const;
422
440 QgsMeshDatasetValue datasetValue( const QgsMeshDatasetIndex &index, int valueIndex ) const;
441
460 QgsMeshDataBlock datasetValues( const QgsMeshDatasetIndex &index, int valueIndex, int count ) const;
461
478 QgsMesh3DDataBlock dataset3dValues( const QgsMeshDatasetIndex &index, int faceIndex, int count ) const;
479
487 bool isFaceActive( const QgsMeshDatasetIndex &index, int faceIndex ) const;
488
501 QgsMeshDataBlock areFacesActive( const QgsMeshDatasetIndex &index, int faceIndex, int count ) const;
502
525 QgsMeshDatasetValue datasetValue( const QgsMeshDatasetIndex &index, const QgsPointXY &point, double searchRadius = 0 ) const;
526
546 QgsMesh3DDataBlock dataset3dValue( const QgsMeshDatasetIndex &index, const QgsPointXY &point ) const;
547
567 QgsMeshDatasetValue dataset1dValue( const QgsMeshDatasetIndex &index, const QgsPointXY &point, double searchRadius ) const;
568
584 QgsMeshDatasetIndex datasetIndexAtTime( const QgsDateTimeRange &timeRange, int datasetGroupIndex ) const;
585
601 QgsMeshDatasetIndex datasetIndexAtRelativeTime( const QgsInterval &relativeTime, int datasetGroupIndex ) const;
602
617 QList<QgsMeshDatasetIndex> datasetIndexInRelativeTimeInterval( const QgsInterval &startRelativeTime, const QgsInterval &endRelativeTime, int datasetGroupIndex ) const;
618
630 QgsMeshDatasetIndex activeScalarDatasetAtTime( const QgsDateTimeRange &timeRange, int group = -1 ) const;
631
643 QgsMeshDatasetIndex activeVectorDatasetAtTime( const QgsDateTimeRange &timeRange, int group = -1 ) const;
644
652 void setStaticScalarDatasetIndex( const QgsMeshDatasetIndex &staticScalarDatasetIndex ) SIP_SKIP;
653
661 void setStaticVectorDatasetIndex( const QgsMeshDatasetIndex &staticVectorDatasetIndex ) SIP_SKIP;
662
671 QgsMeshDatasetIndex staticScalarDatasetIndex( int group = -1 ) const;
672
681 QgsMeshDatasetIndex staticVectorDatasetIndex( int group = -1 ) const;
682
690 void setReferenceTime( const QDateTime &referenceTime );
691
699 void setTemporalMatchingMethod( const QgsMeshDataProviderTemporalCapabilities::MatchingTemporalDatasetMethod &matchingMethod );
700
722 QgsPointXY snapOnElement( QgsMesh::ElementType elementType, const QgsPointXY &point, double searchRadius );
723
750 int closestElement( QgsMesh::ElementType elementType, const QgsPointXY &point, double searchRadius, QgsPointXY &projectedPoint SIP_OUT ) const;
751
760 QList<int> selectVerticesByExpression( QgsExpression expression );
761
770 QList<int> selectFacesByExpression( QgsExpression expression );
771
779 QgsMeshDatasetGroupTreeItem *datasetGroupTreeRootItem() const;
780
794 void setDatasetGroupTreeRootItem( QgsMeshDatasetGroupTreeItem *rootItem );
795
801 void resetDatasetGroupTreeItem();
802
808 QgsInterval firstValidTimeStep() const;
809
815 QgsInterval datasetRelativeTime( const QgsMeshDatasetIndex &index );
816
822 qint64 datasetRelativeTimeInMilliseconds( const QgsMeshDatasetIndex &index );
823
831 Q_DECL_DEPRECATED bool startFrameEditing( const QgsCoordinateTransform &transform );
832
843 bool startFrameEditing( const QgsCoordinateTransform &transform, QgsMeshEditingError &error SIP_OUT, bool fixErrors );
844
845
854 bool commitFrameEditing( const QgsCoordinateTransform &transform, bool continueEditing = true );
855
864 bool rollBackFrameEditing( const QgsCoordinateTransform &transform, bool continueEditing = true );
865
873 void stopFrameEditing( const QgsCoordinateTransform &transform );
874
884 bool reindex( const QgsCoordinateTransform &transform, bool renumber );
885
891 QgsMeshEditor *meshEditor();
892
898 bool isModified() const override;
899
904 bool contains( const QgsMesh::ElementType &type ) const;
905
913 int meshVertexCount() const;
914
922 int meshFaceCount() const;
923
929 int meshEdgeCount() const;
930
939 bool labelsEnabled() const;
940
951 void setLabelsEnabled( bool enabled );
952
961 const QgsAbstractMeshLayerLabeling *labeling() const SIP_SKIP { return mLabeling; }
962
969 QgsAbstractMeshLayerLabeling *labeling() { return mLabeling; }
970
975 void setLabeling( QgsAbstractMeshLayerLabeling *labeling SIP_TRANSFER );
976
986 bool minimumMaximumActiveScalarDataset( const QgsRectangle &extent, const QgsMeshDatasetIndex &datasetIndex, double &min SIP_OUT, double &max SIP_OUT );
987
993 QgsMeshDatasetIndex activeScalarDatasetIndex( QgsRenderContext &rendererContext );
994
1004 bool datasetsPathUnique( const QString &path );
1005
1006 public slots:
1007
1013 void setTransformContext( const QgsCoordinateTransformContext &transformContext ) override;
1014
1015 signals:
1016
1023
1030
1037
1043 void reloaded();
1044
1045 private: // Private methods
1046
1050 bool isReadOnly() const override {return true;}
1051
1058 bool setDataProvider( QString const &provider, const QgsDataProvider::ProviderOptions &options, Qgis::DataProviderReadFlags flags = Qgis::DataProviderReadFlags() );
1059#ifdef SIP_RUN
1060 QgsMeshLayer( const QgsMeshLayer &rhs );
1061#endif
1062
1063 void fillNativeMesh();
1064 void assignDefaultStyleToDatasetGroup( int groupIndex );
1065 void createSimplifiedMeshes();
1066 int levelsOfDetailsIndex( double partOfMeshInView ) const;
1067
1068 bool hasSimplifiedMeshes() const;
1069
1071 void applyClassificationOnScalarSettings( const QgsMeshDatasetGroupMetadata &meta, QgsMeshRendererScalarSettings &scalarSettings ) const;
1072
1073 private slots:
1074 void onDatasetGroupsAdded( const QList<int> &datasetGroupIndexes );
1075 void onMeshEdited();
1076
1077 private:
1079 QgsMeshDataProvider *mDataProvider = nullptr;
1080
1082 QStringList mExtraDatasetUri;
1083
1084 std::unique_ptr<QgsMeshDatasetGroupStore> mDatasetGroupStore;
1085
1087 std::unique_ptr<QgsMesh> mNativeMesh;
1088
1090 std::vector<std::unique_ptr<QgsTriangularMesh>> mTriangularMeshes;
1091
1093 std::unique_ptr<QgsMeshLayerRendererCache> mRendererCache;
1094
1096 QgsMeshRendererSettings mRendererSettings;
1097
1099 QgsMeshTimeSettings mTimeSettings;
1100
1102 QgsMeshSimplificationSettings mSimplificationSettings;
1103
1104 QgsMeshLayerTemporalProperties *mTemporalProperties = nullptr;
1105 QgsMeshLayerElevationProperties *mElevationProperties = nullptr;
1106
1109
1110 int mStaticScalarDatasetIndex = 0;
1111 int mStaticVectorDatasetIndex = 0;
1112
1113 QgsMeshEditor *mMeshEditor = nullptr;
1114
1116 bool mLabelsEnabled = false;
1117
1119 QgsAbstractMeshLayerLabeling *mLabeling = nullptr;
1120
1122 int closestEdge( const QgsPointXY &point, double searchRadius, QgsPointXY &projectedPoint ) const;
1123
1125 int closestVertex( const QgsPointXY &point, double searchRadius, QgsPointXY &projectedPoint ) const;
1126
1128 int closestFace( const QgsPointXY &point, double searchRadius, QgsPointXY &projectedPoint ) const;
1129
1130 void updateActiveDatasetGroups();
1131
1132 QgsMeshRendererSettings accordSymbologyWithGroupName( const QgsMeshRendererSettings &settings, const QMap<QString, int> &nameToIndex );
1133 void checkSymbologyConsistency();
1134
1135 void setDataSourcePrivate( const QString &dataSource, const QString &baseName, const QString &provider,
1137};
1138
1139#endif //QGSMESHLAYER_H
TemporalUnit
Temporal units.
Definition qgis.h:5040
QFlags< DataProviderReadFlag > DataProviderReadFlags
Flags which control data provider construction.
Definition qgis.h:450
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.
virtual QgsAbstractProfileGenerator * createProfileGenerator(const QgsProfileRequest &request)=0
Given a profile request, returns a new profile generator ready for generating elevation profiles.
Contains information about the context in which a coordinate transform is executed.
Handles coordinate transforms between two coordinate systems.
Handles 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:78
virtual bool writeSymbology(QDomNode &node, QDomDocument &doc, QString &errorMessage, const QgsReadWriteContext &context, StyleCategories categories=AllStyleCategories) const =0
Write the style for the layer into the document provided.
virtual QString encodedSource(const QString &source, const QgsReadWriteContext &context) const
Called by writeLayerXML(), used by derived classes to encode provider's specific data source to proje...
virtual bool readXml(const QDomNode &layer_node, QgsReadWriteContext &context)
Called by readLayerXML(), used by children to read state specific to them from project files.
virtual QString loadDefaultStyle(bool &resultFlag)
Retrieve the default style for this layer if one exists (either as a .qml file on disk or as a record...
virtual bool writeXml(QDomNode &layer_node, QDomDocument &document, const QgsReadWriteContext &context) const
Called by writeLayerXML(), used by children to write state specific to them to project files.
virtual bool readStyle(const QDomNode &node, QString &errorMessage, QgsReadWriteContext &context, StyleCategories categories=AllStyleCategories)
Read the style for the current layer from the DOM node supplied.
virtual bool supportsEditing() const
Returns whether the layer supports editing or not.
QFlags< StyleCategory > StyleCategories
virtual bool isEditable() const
Returns true if the layer can be edited.
virtual QgsMapLayerTemporalProperties * temporalProperties()
Returns the layer's temporal properties.
virtual QStringList subLayers() const
Returns the sublayers of this layer.
virtual QString htmlMetadata() const
Obtain a formatted HTML string containing assorted metadata for this layer.
virtual bool readSymbology(const QDomNode &node, QString &errorMessage, QgsReadWriteContext &context, StyleCategories categories=AllStyleCategories)=0
Read the symbology for the current layer from the DOM node supplied.
virtual QgsMapLayerElevationProperties * elevationProperties()
Returns the layer's elevation properties.
virtual void setTransformContext(const QgsCoordinateTransformContext &transformContext)=0
Sets the coordinate transform context to transformContext.
virtual QString decodedSource(const QString &source, const QString &dataProvider, const QgsReadWriteContext &context) const
Called by readLayerXML(), used by derived classes to decode provider's specific data source from proj...
virtual bool writeStyle(QDomNode &node, QDomDocument &doc, QString &errorMessage, const QgsReadWriteContext &context, StyleCategories categories=AllStyleCategories) const
Write just the symbology information for the layer into the document.
virtual Q_INVOKABLE QgsDataProvider * dataProvider()
Returns the layer's data provider, it may be nullptr.
virtual Q_INVOKABLE void reload()
Synchronises with changes in the datasource.
Abstract class for interpolating 3d stacked mesh data to 2d data.
A block of 3d stacked mesh data related N faces defined on base mesh frame.
A block of integers/doubles from a mesh dataset.
Handles properties relating to a mesh data provider's temporal capabilities.
Base class for providing data for QgsMeshLayer.
A collection of dataset group metadata such as whether the data is vector or scalar,...
Registers and accesses 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.
An index that identifies the dataset group (e.g.
Represents mesh dataset metadata, such as whether the data is valid or the associated time.
Represents a single mesh dataset value.
Represents an error which occurred during mesh editing.
Handles edit operations on a mesh layer.
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.
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(const QgsMeshLayer &rhs)=delete
QgsAbstractMeshLayerLabeling * labeling()
Access to labeling configuration.
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.
Represents a 2D point.
Definition qgspointxy.h:60
Encapsulates properties and constraints relating to fetching elevation profiles from different source...
A container for the context for various read/write operations on objects.
A rectangle specified with double values.
Contains information about the context of a rendering operation.
Abstract base class for all rendered symbols.
Definition qgssymbol.h:231
A triangular/derived mesh with vertices in map coordinates.
#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.
QgsCoordinateTransformContext transformContext
Coordinate transform context.
LayerOptions(const QgsCoordinateTransformContext &transformContext=QgsCoordinateTransformContext())
Constructor for LayerOptions with optional transformContext.
Mesh - vertices, edges and faces.