Branch data Line data Source code
1 : : /***************************************************************************
2 : : qgsmeshmemorydataprovider.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 QGSMESHMEMORYDATAPROVIDER_H
19 : : #define QGSMESHMEMORYDATAPROVIDER_H
20 : :
21 : : #define SIP_NO_FILE
22 : :
23 : : ///@cond PRIVATE
24 : :
25 : : #include <QString>
26 : : #include <memory>
27 : :
28 : : #include "qgis_core.h"
29 : : #include "qgis.h"
30 : : #include "qgsmeshdataprovider.h"
31 : : #include "qgsrectangle.h"
32 : :
33 : : /**
34 : : * \ingroup core
35 : : * \brief Provides data stored in-memory for QgsMeshLayer. Useful for plugins or tests.
36 : : * \since QGIS 3.2
37 : : */
38 : : class CORE_EXPORT QgsMeshMemoryDataProvider final: public QgsMeshDataProvider
39 : : {
40 : 0 : Q_OBJECT
41 : :
42 : : public:
43 : :
44 : : /**
45 : : * Construct a mesh in-memory data provider from data string
46 : : *
47 : : * Data string contains simple definition of vertices and faces or edges
48 : : *
49 : : * Each entry is separated by "\n" sign and section deliminer "---"
50 : : * First section defines vertices (x and y coordinate separated by comma)
51 : : * Second section defines face list (vertex indexes, numbered from 0. A face has 3 or move vertices)
52 : : * or defines edge list (vertex indexes, numbered from 0. An edge has 2 vertices)
53 : : *
54 : : * It is not possible to define mesh with both faces and edges
55 : : *
56 : : * For example (mesh with faces and vertices):
57 : : *
58 : : * \code
59 : : * QString uri(
60 : : * "1.0, 2.0 \n" \
61 : : * "2.0, 2.0 \n" \
62 : : * "3.0, 2.0 \n" \
63 : : * "2.0, 3.0 \n" \
64 : : * "1.0, 3.0 \n" \
65 : : * "--- \n"
66 : : * "0, 1, 3, 4 \n" \
67 : : * "1, 2, 3 \n"
68 : : * );
69 : : * \endcode
70 : : *
71 : : * For example (mesh with edges and vertices):
72 : : *
73 : : * \code
74 : : * QString uri(
75 : : * "1.0, 2.0 \n" \
76 : : * "2.0, 2.0 \n" \
77 : : * "3.0, 2.0 \n" \
78 : : * "2.0, 3.0 \n" \
79 : : * "1.0, 3.0 \n" \
80 : : * "---\n"
81 : : * "0, 1 \n" \
82 : : * "1, 2 \n"
83 : : * );
84 : : * \endcode
85 : : */
86 : : QgsMeshMemoryDataProvider( const QString &uri, const QgsDataProvider::ProviderOptions &providerOptions,
87 : : QgsDataProvider::ReadFlags flags = QgsDataProvider::ReadFlags() );
88 : :
89 : : bool isValid() const override;
90 : : QString name() const override;
91 : : QString description() const override;
92 : : QgsCoordinateReferenceSystem crs() const override;
93 : :
94 : : int vertexCount() const override;
95 : : int faceCount() const override;
96 : : int edgeCount() const override;
97 : : void populateMesh( QgsMesh *mesh ) const override;
98 : : QgsRectangle extent() const override;
99 : :
100 : : /**
101 : : * Adds dataset to a mesh in-memory data provider from data string
102 : : *
103 : : * Data string contains simple definition of datasets
104 : : * Each entry is separated by "\n" sign and section deliminer "---"
105 : : * First section defines the dataset group: Vertex/Edge/Face Vector/Scalar Name
106 : : * Second section defines the group metadata: key: value pairs
107 : : * Third section defines the datasets (timesteps). First line is time,
108 : : * other lines are values (one value on line). For vectors separated by comma
109 : : *
110 : : * For example:
111 : : *
112 : : * \code
113 : : * QString uri(
114 : : * "Vertex Vector MyVertexVectorDataset\n" \
115 : : * "---"
116 : : * "description: My great dataset \n" \
117 : : * "reference_time: Midnight \n" \
118 : : * "---"
119 : : * "0 \n"
120 : : * "3, 2 \n" \
121 : : * "1, -2 \n"
122 : : * "---"
123 : : * "1 \n"
124 : : * "2, 2 \n" \
125 : : * "2, -2 \n"
126 : : * );
127 : : * \endcode
128 : : */
129 : : bool addDataset( const QString &uri ) override;
130 : : QStringList extraDatasets() const override;
131 : : int datasetGroupCount() const override;
132 : : int datasetCount( int groupIndex ) const override;
133 : :
134 : : QgsMeshDatasetGroupMetadata datasetGroupMetadata( int groupIndex ) const override;
135 : : QgsMeshDatasetMetadata datasetMetadata( QgsMeshDatasetIndex index ) const override;
136 : : QgsMeshDatasetValue datasetValue( QgsMeshDatasetIndex index, int valueIndex ) const override;
137 : : QgsMeshDataBlock datasetValues( QgsMeshDatasetIndex index, int valueIndex, int count ) const override;
138 : : QgsMesh3dDataBlock dataset3dValues( QgsMeshDatasetIndex index, int faceIndex, int count ) const override;
139 : :
140 : : bool isFaceActive( QgsMeshDatasetIndex index, int faceIndex ) const override;
141 : : QgsMeshDataBlock areFacesActive( QgsMeshDatasetIndex index, int faceIndex, int count ) const override;
142 : : bool persistDatasetGroup( const QString &outputFilePath,
143 : : const QString &outputDriver,
144 : : const QgsMeshDatasetGroupMetadata &meta,
145 : : const QVector<QgsMeshDataBlock> &datasetValues,
146 : : const QVector<QgsMeshDataBlock> &datasetActive,
147 : : const QVector<double> ×
148 : : ) override;
149 : :
150 : : virtual bool persistDatasetGroup( const QString &outputFilePath,
151 : : const QString &outputDriver,
152 : : QgsMeshDatasetSourceInterface *source,
153 : : int datasetGroupIndex
154 : : ) override;
155 : :
156 : : //! Returns the memory provider key
157 : : static QString providerKey();
158 : : //! Returns the memory provider description
159 : : static QString providerDescription();
160 : : //! Provider factory
161 : : static QgsMeshMemoryDataProvider *createProvider( const QString &uri,
162 : : const QgsDataProvider::ProviderOptions &providerOptions,
163 : : QgsDataProvider::ReadFlags flags = QgsDataProvider::ReadFlags() );
164 : :
165 : : private:
166 : : QgsRectangle calculateExtent( ) const;
167 : :
168 : : bool splitMeshSections( const QString &uri );
169 : : bool addMeshVertices( const QString &def );
170 : : bool addMeshFacesOrEdges( const QString &def );
171 : :
172 : : bool splitDatasetSections( const QString &uri, QgsMeshMemoryDatasetGroup &datasetGroup );
173 : : bool setDatasetGroupType( const QString &uri, QgsMeshMemoryDatasetGroup &datasetGroup );
174 : : bool addDatasetGroupMetadata( const QString &def, QgsMeshMemoryDatasetGroup &datasetGroup );
175 : : bool addDatasetValues( const QString &def, std::shared_ptr<QgsMeshMemoryDataset> &dataset, bool isScalar );
176 : : bool checkDatasetValidity( std::shared_ptr<QgsMeshMemoryDataset> &dataset, QgsMeshDatasetGroupMetadata::DataType dataType );
177 : : bool checkVertexId( int vertex_id );
178 : :
179 : : void addGroupToTemporalCapabilities( int groupIndex, const QgsMeshMemoryDatasetGroup &group );
180 : :
181 : : QVector<QgsMeshVertex> mVertices;
182 : : QVector<QgsMeshFace> mFaces;
183 : : QVector<QgsMeshEdge> mEdges;
184 : : QVector<QgsMeshMemoryDatasetGroup> mDatasetGroups;
185 : :
186 : : bool mIsValid = false;
187 : : QStringList mExtraDatasetUris;
188 : : };
189 : :
190 : : ///@endcond
191 : :
192 : : #endif // QGSMESHMEMORYDATAPROVIDER_H
|