LCOV - code coverage report
Current view: top level - core/mesh - qgsmeshdataprovider.h (source / functions) Hit Total Coverage
Test: coverage.info.cleaned Lines: 0 5 0.0 %
Date: 2021-04-10 08:29:14 Functions: 0 0 -
Branches: 0 0 -

           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> &times
     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> &times
     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

Generated by: LCOV version 1.14