Branch data Line data Source code
1 : : /***************************************************************************
2 : : qgsmeshdataprovider.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 QGSMESHDATAPROVIDER_H
19 : : #define QGSMESHDATAPROVIDER_H
20 : :
21 : : #include <QVector>
22 : : #include <QString>
23 : : #include <QMap>
24 : : #include <QPair>
25 : :
26 : : #include <limits>
27 : :
28 : : #include "qgis_core.h"
29 : : #include "qgspoint.h"
30 : : #include "qgsdataprovider.h"
31 : : #include "qgsmeshdataset.h"
32 : : #include "qgsmeshdataprovidertemporalcapabilities.h"
33 : :
34 : :
35 : : class QgsRectangle;
36 : :
37 : : //! xyz coords of vertex
38 : : typedef QgsPoint QgsMeshVertex;
39 : :
40 : : //! List of vertex indexes
41 : : typedef QVector<int> QgsMeshFace;
42 : :
43 : : /**
44 : : * Edge is a straight line seqment between 2 points.
45 : : * Stores the pair of vertex indexes
46 : : * \since QGIS 3.14
47 : : */
48 : : typedef QPair<int, int> QgsMeshEdge;
49 : :
50 : : /**
51 : : * \ingroup core
52 : : *
53 : : * \brief Mesh - vertices, edges and faces
54 : : *
55 : : * \since QGIS 3.6
56 : : */
57 : 0 : struct CORE_EXPORT QgsMesh
58 : : {
59 : :
60 : : /**
61 : : * Defines type of mesh elements
62 : : * \since QGIS 3.14
63 : : */
64 : : enum ElementType
65 : : {
66 : : Vertex = 1,
67 : : Edge = 2,
68 : : Face = 4
69 : : };
70 : :
71 : : /**
72 : : * Returns whether the mesh contains at mesh elements of given type
73 : : * \since QGIS 3.14
74 : : */
75 : : bool contains( const ElementType &type ) const;
76 : :
77 : : //! Returns number of vertices
78 : : int vertexCount() const;
79 : : //! Returns number of faces
80 : : int faceCount() const;
81 : :
82 : : /**
83 : : * Returns number of edge
84 : : * \since QGIS 3.14
85 : : */
86 : : int edgeCount() const;
87 : :
88 : : //! Returns a vertex at the index
89 : : QgsMeshVertex vertex( int index ) const;
90 : : //! Returns a face at the index
91 : : QgsMeshFace face( int index ) const;
92 : :
93 : : /**
94 : : * Returns an edge at the index
95 : : * \since QGIS 3.14
96 : : */
97 : : QgsMeshEdge edge( int index ) const;
98 : :
99 : : /**
100 : : * Remove all vertices, edges and faces
101 : : * \since QGIS 3.14
102 : : */
103 : : void clear();
104 : :
105 : : /**
106 : : * Compare two faces, return TRUE if they are equivalent : same indexes and same clock wise
107 : : * \since QGIS 3.16
108 : : */
109 : : static bool compareFaces( const QgsMeshFace &face1, const QgsMeshFace &face2 );
110 : :
111 : : QVector<QgsMeshVertex> vertices SIP_SKIP;
112 : : QVector<QgsMeshEdge> edges SIP_SKIP;
113 : : QVector<QgsMeshFace> faces SIP_SKIP;
114 : : };
115 : :
116 : : /**
117 : : * \ingroup core
118 : : *
119 : : * \brief Interface for mesh data sources
120 : : *
121 : : * Mesh is a collection of vertices, edges and faces in 2D or 3D space
122 : : *
123 : : * - vertex - XY(Z) point (in the mesh's coordinate reference system)
124 : : * - edge - two XY(Z) points (in the mesh's coordinate reference system) representing straight seqment
125 : : * - faces - sets of vertices forming a closed shape - typically triangles or quadrilaterals
126 : : *
127 : : * Base on the underlying data provider/format, whole mesh is either stored in memory or
128 : : * read on demand
129 : : *
130 : : * \note The API is considered EXPERIMENTAL and can be changed without a notice
131 : : *
132 : : * \since QGIS 3.2
133 : : */
134 : 0 : class CORE_EXPORT QgsMeshDataSourceInterface SIP_ABSTRACT
135 : : {
136 : : public:
137 : : //! Dtor
138 : 0 : virtual ~QgsMeshDataSourceInterface() = default;
139 : :
140 : : /**
141 : : * Returns whether the mesh contains at mesh elements of given type
142 : : * \since QGIS 3.14
143 : : */
144 : : bool contains( const QgsMesh::ElementType &type ) const;
145 : :
146 : : /**
147 : : * \brief Returns number of vertices in the native mesh
148 : : * \returns Number of vertices in the mesh
149 : : */
150 : : virtual int vertexCount() const = 0;
151 : :
152 : : /**
153 : : * \brief Returns number of faces in the native mesh
154 : : * \returns Number of faces in the mesh
155 : : */
156 : : virtual int faceCount() const = 0;
157 : :
158 : : /**
159 : : * \brief Returns number of edges in the native mesh
160 : : * \returns Number of edges in the mesh
161 : : *
162 : : * \since QGIS 3.14
163 : : */
164 : : virtual int edgeCount() const = 0;
165 : :
166 : : /**
167 : : * Populates the mesh vertices, edges and faces
168 : : * \since QGIS 3.6
169 : : */
170 : : virtual void populateMesh( QgsMesh *mesh ) const = 0;
171 : : };
172 : :
173 : : /**
174 : : * \ingroup core
175 : : * \brief Interface for mesh datasets and dataset groups
176 : : *
177 : : * Dataset is a collection of vector or scalar values on vertices or faces of the mesh.
178 : : * Based on the underlying data provider/format, whole dataset is either stored in memory
179 : : * or read on demand
180 : : *
181 : : * Datasets are grouped in the dataset groups. A dataset group represents a measured quantity
182 : : * (e.g. depth or wind speed), dataset represents values of the quantity in a particular time.
183 : : *
184 : : * \note The API is considered EXPERIMENTAL and can be changed without a notice
185 : : *
186 : : * \since QGIS 3.2
187 : : */
188 : : class CORE_EXPORT QgsMeshDatasetSourceInterface SIP_ABSTRACT
189 : : {
190 : : public:
191 : : QgsMeshDatasetSourceInterface();
192 : : //! Dtor
193 : 0 : virtual ~QgsMeshDatasetSourceInterface() = default;
194 : :
195 : : /**
196 : : * \brief Associate dataset with the mesh
197 : : *
198 : : * emits dataChanged when successful
199 : : */
200 : : virtual bool addDataset( const QString &uri ) = 0;
201 : :
202 : : /**
203 : : * Returns list of additional dataset file URIs added using addDataset() calls.
204 : : */
205 : : virtual QStringList extraDatasets() const = 0;
206 : :
207 : : /**
208 : : * \brief Returns number of datasets groups loaded
209 : : */
210 : : virtual int datasetGroupCount( ) const = 0;
211 : :
212 : : /**
213 : : * \brief Returns number of datasets loaded in the group
214 : : */
215 : : virtual int datasetCount( int groupIndex ) const = 0;
216 : :
217 : : /**
218 : : * \brief Returns number of datasets loaded in the group
219 : : */
220 : : int datasetCount( QgsMeshDatasetIndex index ) const;
221 : :
222 : : /**
223 : : * \brief Returns dataset group metadata
224 : : */
225 : : virtual QgsMeshDatasetGroupMetadata datasetGroupMetadata( int groupIndex ) const = 0;
226 : :
227 : : /**
228 : : * \brief Returns dataset group metadata
229 : : */
230 : : QgsMeshDatasetGroupMetadata datasetGroupMetadata( QgsMeshDatasetIndex index ) const;
231 : :
232 : : /**
233 : : * \brief Returns dataset metadata
234 : : */
235 : : virtual QgsMeshDatasetMetadata datasetMetadata( QgsMeshDatasetIndex index ) const = 0;
236 : :
237 : : /**
238 : : * \brief Returns vector/scalar value associated with the index from the dataset
239 : : * To read multiple continuous values, use datasetValues()
240 : : *
241 : : * See QgsMeshDatasetMetadata::isVector() or QgsMeshDataBlock::type()
242 : : * to check if the returned value is vector or scalar
243 : : *
244 : : * Returns invalid value for DataOnVolumes
245 : : *
246 : : * \see datasetValues
247 : : */
248 : : virtual QgsMeshDatasetValue datasetValue( QgsMeshDatasetIndex index, int valueIndex ) const = 0;
249 : :
250 : : /**
251 : : * \brief Returns N vector/scalar values from the index from the dataset
252 : : *
253 : : * See QgsMeshDatasetMetadata::isVector() or QgsMeshDataBlock::type()
254 : : * to check if the returned value is vector or scalar
255 : : *
256 : : * Returns invalid block for DataOnVolumes. Use QgsMeshLayerUtils::datasetValues() if you
257 : : * need block for any type of data type
258 : : *
259 : : * \since QGIS 3.6
260 : : */
261 : : virtual QgsMeshDataBlock datasetValues( QgsMeshDatasetIndex index, int valueIndex, int count ) const = 0;
262 : :
263 : : /**
264 : : * \brief Returns N vector/scalar values from the face index from the dataset for 3d stacked meshes
265 : : *
266 : : * See QgsMeshDatasetMetadata::isVector() to check if the returned value is vector or scalar
267 : : *
268 : : * returns invalid block for DataOnFaces and DataOnVertices.
269 : : *
270 : : * \see datasetValues
271 : : *
272 : : * \since QGIS 3.12
273 : : */
274 : : virtual QgsMesh3dDataBlock dataset3dValues( QgsMeshDatasetIndex index, int faceIndex, int count ) const = 0;
275 : :
276 : : /**
277 : : * \brief Returns whether the face is active for particular dataset
278 : : *
279 : : * For example to represent the situation when F1 and F3 are flooded, but F2 is dry,
280 : : * some solvers store water depth on vertices V1-V8 (all non-zero values) and
281 : : * set active flag for F2 to FALSE.
282 : : * V1 ---- V2 ---- V5-----V7
283 : : * | F1 | F2 | F3 |
284 : : * V3 ---- V4 ---- V6-----V8
285 : : */
286 : : virtual bool isFaceActive( QgsMeshDatasetIndex index, int faceIndex ) const = 0;
287 : :
288 : : /**
289 : : * \brief Returns whether the faces are active for particular dataset
290 : : *
291 : : * \since QGIS 3.6
292 : : */
293 : : virtual QgsMeshDataBlock areFacesActive( QgsMeshDatasetIndex index, int faceIndex, int count ) const = 0;
294 : :
295 : : /**
296 : : * Creates a new dataset group from a data and
297 : : * persists it into a destination path
298 : : *
299 : : * On success, the mesh's dataset group count is changed
300 : : *
301 : : * \param path destination path of the stored file in form DRIVER_NAME:path
302 : : * \param meta new group's metadata
303 : : * \param datasetValues scalar/vector values for all datasets and all faces/vertices in the group
304 : : * \param datasetActive active flag values for all datasets in the group. Empty array represents can be used
305 : : * when all faces are active
306 : : * \param times times in hours for all datasets in the group
307 : : * \returns TRUE on failure, FALSE on success
308 : : *
309 : : * \note Doesn't work if there is ":" in the path (e.g. Windows system)
310 : : *
311 : : * \since QGIS 3.6
312 : : * \deprecated QGIS 3.12.3
313 : : */
314 : : Q_DECL_DEPRECATED virtual bool persistDatasetGroup( const QString &path,
315 : : const QgsMeshDatasetGroupMetadata &meta,
316 : : const QVector<QgsMeshDataBlock> &datasetValues,
317 : : const QVector<QgsMeshDataBlock> &datasetActive,
318 : : const QVector<double> ×
319 : : ) SIP_DEPRECATED;
320 : :
321 : : /**
322 : : * Creates a new dataset group from a data and
323 : : * persists it into a destination path
324 : : *
325 : : * On success, the mesh's dataset group count is changed
326 : : *
327 : : * \param outputFilePath destination path of the stored file
328 : : * \param outputDriver output driver name
329 : : * \param meta new group's metadata
330 : : * \param datasetValues scalar/vector values for all datasets and all faces/vertices in the group
331 : : * \param datasetActive active flag values for all datasets in the group. Empty array represents can be used
332 : : * when all faces are active
333 : : * \param times times in hours for all datasets in the group
334 : : * \returns TRUE on failure, FALSE on success
335 : : *
336 : : * \since QGIS 3.12.3
337 : : */
338 : : virtual bool persistDatasetGroup( const QString &outputFilePath,
339 : : const QString &outputDriver,
340 : : const QgsMeshDatasetGroupMetadata &meta,
341 : : const QVector<QgsMeshDataBlock> &datasetValues,
342 : : const QVector<QgsMeshDataBlock> &datasetActive,
343 : : const QVector<double> ×
344 : : ) = 0;
345 : :
346 : :
347 : : /**
348 : : * Saves a an existing dataset group provided by \a source to a file with a specified driver
349 : : *
350 : : * On success, the mesh's dataset group count is changed
351 : : *
352 : : * \param outputFilePath destination path of the stored file
353 : : * \param outputDriver output driver name
354 : : * \param source source of the dataset group
355 : : * \param datasetGroupIndex index of the dataset group in the \a source
356 : : *
357 : : * \returns TRUE on failure, FALSE on success
358 : : *
359 : : * \since QGIS 3.16
360 : : */
361 : : virtual bool persistDatasetGroup( const QString &outputFilePath,
362 : : const QString &outputDriver,
363 : : QgsMeshDatasetSourceInterface *source,
364 : : int datasetGroupIndex
365 : : ) = 0;
366 : :
367 : : /**
368 : : * Returns the dataset index of the dataset in a specific dataet group at \a time from the \a reference time
369 : : *
370 : : * \param referenceTime the reference time from where to find the dataset
371 : : * \param groupIndex the index of the dataset group
372 : : * \param time the relative time from reference time
373 : : * \param method the method used to check the time
374 : : *
375 : : * \return the dataset index
376 : : */
377 : : QgsMeshDatasetIndex datasetIndexAtTime( const QDateTime &referenceTime,
378 : : int groupIndex,
379 : : quint64 time,
380 : : QgsMeshDataProviderTemporalCapabilities::MatchingTemporalDatasetMethod method ) const;
381 : :
382 : : protected:
383 : : std::unique_ptr<QgsMeshDataProviderTemporalCapabilities> mTemporalCapabilities;
384 : : };
385 : :
386 : :
387 : : /**
388 : : * \ingroup core
389 : : * \brief Base class for providing data for QgsMeshLayer
390 : : *
391 : : * Responsible for reading native mesh data
392 : : *
393 : : * \note The API is considered EXPERIMENTAL and can be changed without a notice
394 : : *
395 : : * \since QGIS 3.2
396 : : */
397 : 0 : class CORE_EXPORT QgsMeshDataProvider: public QgsDataProvider, public QgsMeshDataSourceInterface, public QgsMeshDatasetSourceInterface
398 : : {
399 : : Q_OBJECT
400 : : public:
401 : : //! Ctor
402 : : QgsMeshDataProvider( const QString &uri,
403 : : const QgsDataProvider::ProviderOptions &providerOptions,
404 : : QgsDataProvider::ReadFlags flags = QgsDataProvider::ReadFlags() );
405 : :
406 : : QgsMeshDataProviderTemporalCapabilities *temporalCapabilities() override;
407 : : const QgsMeshDataProviderTemporalCapabilities *temporalCapabilities() const override SIP_SKIP;
408 : :
409 : : /**
410 : : * Sets the temporal unit of the provider and reload data if it changes.
411 : : *
412 : : * \param unit the temporal unit
413 : : *
414 : : * \since QGIS 3.14
415 : : */
416 : : void setTemporalUnit( QgsUnitTypes::TemporalUnit unit );
417 : :
418 : : signals:
419 : : //! Emitted when some new dataset groups have been added
420 : : void datasetGroupsAdded( int count );
421 : :
422 : : };
423 : :
424 : : #endif // QGSMESHDATAPROVIDER_H
|