QGIS API Documentation 3.37.0-Master (fdefdf9c27f)
qgsmeshdataprovider.cpp
Go to the documentation of this file.
1/***************************************************************************
2 qgsmeshdataprovider.cpp
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#include "qgis.h"
19#include "qgsmeshdataprovider.h"
21#include "qgsthreadingutils.h"
22
25 : QgsDataProvider( uri, options, flags )
26{
27}
28
30{
32
33 return mTemporalCapabilities.get();
34}
35
37{
39
40 return mTemporalCapabilities.get();
41}
42
44{
46
47 const Qgis::TemporalUnit oldUnit = mTemporalCapabilities->temporalUnit();
48 mTemporalCapabilities->setTemporalUnit( unit );
49 if ( oldUnit != unit )
50 reloadData();
51}
52
54{
56
57 return QgsMeshDriverMetadata();
58}
59
61 const QDateTime &referenceTime,
62 int groupIndex, qint64 time,
64{
65 const QDateTime requestDateTime = referenceTime.addMSecs( time );
66 qint64 providerTime;
67 const QDateTime providerReferenceTime = mTemporalCapabilities->referenceTime();
68 if ( providerReferenceTime.isValid() )
69 providerTime = providerReferenceTime.msecsTo( requestDateTime );
70 else
71 providerTime = time;
72
73 switch ( method )
74 {
76 return mTemporalCapabilities->datasetIndexClosestBeforeRelativeTime( groupIndex, providerTime );
77 break;
79 return mTemporalCapabilities->datasetIndexClosestFromRelativeTime( groupIndex, providerTime );
80 break;
81 }
82
83 return QgsMeshDatasetIndex();
84}
85
86QList<QgsMeshDatasetIndex> QgsMeshDatasetSourceInterface::datasetIndexInTimeInterval( const QDateTime &referenceTime, int groupIndex, qint64 time1, qint64 time2 ) const
87{
88 const QDateTime requestDateTime = referenceTime.addMSecs( time1 );
89 qint64 providerTime1;
90 qint64 providerTime2;
91 const QDateTime providerReferenceTime = mTemporalCapabilities->referenceTime();
92 if ( mTemporalCapabilities->referenceTime().isValid() )
93 {
94 providerTime1 = providerReferenceTime.msecsTo( requestDateTime );
95 providerTime2 = providerTime1 - time1 + time2;
96 }
97 else
98 {
99 providerTime1 = time1;
100 providerTime2 = time2;
101 }
102
103 QList<QgsMeshDatasetIndex> ret;
104 for ( int i = 0; i < datasetCount( groupIndex ); ++i )
105 {
106 QgsMeshDatasetIndex datasetIndex( groupIndex, i );
107 qint64 time = mTemporalCapabilities->datasetTime( datasetIndex );
108 if ( time >= providerTime1 && time <= providerTime2 )
109 ret.append( datasetIndex );
110 }
111
112 return ret;
113}
114
116 mTemporalCapabilities( std::make_unique<QgsMeshDataProviderTemporalCapabilities>() ) {}
117
119{
120 return datasetCount( index.group() );
121}
122
124{
125 return datasetGroupMetadata( index.group() );
126}
127
129 const QString &path,
130 const QgsMeshDatasetGroupMetadata &meta,
131 const QVector<QgsMeshDataBlock> &datasetValues,
132 const QVector<QgsMeshDataBlock> &datasetActive,
133 const QVector<double> &times )
134{
135 // Form DRIVER:filename
136 QString filename = path;
137 // ASCII dat supports face, edge and vertex datasets
138 QString driverName = QStringLiteral( "DAT" );
139 QStringList parts = path.split( ':' );
140 if ( parts.size() > 1 )
141 {
142 driverName = parts[0];
143 parts.removeFirst();
144 filename = parts.join( QString() );
145 }
146 return persistDatasetGroup( filename, driverName, meta, datasetValues, datasetActive, times );
147}
148
150{
151 if ( index < vertices.size() && index >= 0 )
152 return vertices[index];
153 return QgsMeshVertex();
154}
155
156QgsMeshFace QgsMesh::face( int index ) const
157{
158 if ( index < faces.size() && index >= 0 )
159 return faces[index];
160 return QgsMeshFace();
161}
162
163QgsMeshEdge QgsMesh::edge( int index ) const
164{
165 if ( index < edges.size() && index >= 0 )
166 return edges[index];
167 return QgsMeshEdge();
168}
169
171{
172 vertices.clear();
173 edges.clear();
174 faces.clear();
175}
176
177bool QgsMesh::compareFaces( const QgsMeshFace &face1, const QgsMeshFace &face2 )
178{
179 if ( face1.count() != face2.count() )
180 return false;
181
182 int startFace2 = 0;
183 for ( int i = 0; i < face2.count(); ++i )
184 if ( face2.at( i ) == face1.at( 0 ) )
185 {
186 startFace2 = i;
187 break;
188 }
189
190 for ( int i = 0; i < face1.count(); ++i )
191 if ( face1.at( i ) != face2.at( ( i + startFace2 ) % ( face2.count() ) ) )
192 return false;
193
194 return true;
195}
196
198{
199 switch ( type )
200 {
201 case ElementType::Vertex:
202 return !vertices.isEmpty();
203 case ElementType::Edge:
204 return !edges.isEmpty();
205 case ElementType::Face:
206 return !faces.isEmpty();
207 }
208 return false;
209}
210
212{
213 return vertices.size();
214}
215
217{
218 return faces.size();
219}
220
222{
223 return edges.size();
224}
225
227{
228 switch ( type )
229 {
230 case QgsMesh::ElementType::Vertex:
231 return vertexCount() != 0;
232 case QgsMesh::ElementType::Edge:
233 return edgeCount() != 0;
234 case QgsMesh::ElementType::Face:
235 return faceCount() != 0;
236 }
237 return false;
238}
TemporalUnit
Temporal units.
Definition: qgis.h:4231
Abstract base class for spatial data provider implementations.
QFlags< ReadFlag > ReadFlags
virtual void reloadData()
Reloads the data from the source for providers with data caches to synchronize, changes in the data s...
Class for handling properties relating to a mesh data provider's temporal capabilities.
MatchingTemporalDatasetMethod
Method for selection of temporal mesh dataset from a range time.
@ FindClosestDatasetFromStartRangeTime
Finds the closest dataset which have its time before the requested start range time.
virtual QgsMeshDriverMetadata driverMetadata() const
Returns the mesh driver metadata of the provider.
void setTemporalUnit(Qgis::TemporalUnit unit)
Sets the temporal unit of the provider and reload data if it changes.
QgsMeshDataProviderTemporalCapabilities * temporalCapabilities() override
Returns the provider's temporal capabilities.
QgsMeshDataProvider(const QString &uri, const QgsDataProvider::ProviderOptions &providerOptions, QgsDataProvider::ReadFlags flags=QgsDataProvider::ReadFlags())
Ctor.
virtual int vertexCount() const =0
Returns number of vertices in the native mesh.
bool contains(const QgsMesh::ElementType &type) const
Returns whether the mesh contains at mesh elements of given type.
virtual int edgeCount() const =0
Returns number of edges in the native mesh.
virtual int faceCount() const =0
Returns number of faces in the native mesh.
QgsMeshDatasetGroupMetadata is a collection of dataset group metadata such as whether the data is vec...
QgsMeshDatasetIndex is index that identifies the dataset group (e.g.
int group() const
Returns a group index.
virtual QgsMeshDataBlock datasetValues(QgsMeshDatasetIndex index, int valueIndex, int count) const =0
Returns N vector/scalar values from the index from the dataset.
virtual int datasetCount(int groupIndex) const =0
Returns number of datasets loaded in the group.
virtual Q_DECL_DEPRECATED bool persistDatasetGroup(const QString &path, const QgsMeshDatasetGroupMetadata &meta, const QVector< QgsMeshDataBlock > &datasetValues, const QVector< QgsMeshDataBlock > &datasetActive, const QVector< double > &times)
Creates a new dataset group from a data and persists it into a destination path.
virtual QgsMeshDatasetGroupMetadata datasetGroupMetadata(int groupIndex) const =0
Returns dataset group metadata.
std::unique_ptr< QgsMeshDataProviderTemporalCapabilities > mTemporalCapabilities
QgsMeshDatasetIndex datasetIndexAtTime(const QDateTime &referenceTime, int groupIndex, qint64 time, QgsMeshDataProviderTemporalCapabilities::MatchingTemporalDatasetMethod method) const
Returns the dataset index of the dataset in a specific dataset group at time from the reference time.
QList< QgsMeshDatasetIndex > datasetIndexInTimeInterval(const QDateTime &referenceTime, int groupIndex, qint64 time1, qint64 time2) const
Returns a list of dataset indexes of the dataset in a specific dataset group that are between time1 a...
Holds metadata about mesh driver.
Point geometry type, with support for z-dimension and m-values.
Definition: qgspoint.h:49
QVector< int > QgsMeshFace
List of vertex indexes.
QPair< int, int > QgsMeshEdge
Edge is a straight line seqment between 2 points.
QgsPoint QgsMeshVertex
xyz coords of vertex
#define QGIS_PROTECT_QOBJECT_THREAD_ACCESS
Setting options for creating vector data providers.
int vertexCount() const
Returns number of vertices.
QVector< QgsMeshVertex > vertices
QgsMeshFace face(int index) const
Returns a face at the index.
bool contains(const ElementType &type) const
Returns whether the mesh contains at mesh elements of given type.
QVector< QgsMeshFace > faces
static bool compareFaces(const QgsMeshFace &face1, const QgsMeshFace &face2)
Compare two faces, return true if they are equivalent : same indexes and same clock wise.
void clear()
Remove all vertices, edges and faces.
int faceCount() const
Returns number of faces.
ElementType
Defines type of mesh elements.
QgsMeshEdge edge(int index) const
Returns an edge at the index.
QgsMeshVertex vertex(int index) const
Returns a vertex at the index.
int edgeCount() const
Returns number of edge.
QVector< QgsMeshEdge > edges