LCOV - code coverage report
Current view: top level - core/providers/meshmemory - qgsmeshmemorydataprovider.cpp (source / functions) Hit Total Coverage
Test: coverage.info.cleaned Lines: 4 328 1.2 %
Date: 2021-03-26 12:19:53 Functions: 0 0 -
Branches: 0 0 -

           Branch data     Line data    Source code
       1                 :            : /***************************************************************************
       2                 :            :                          qgsmeshmemorydataprovider.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                 :            : ///@cond PRIVATE
      18                 :            : 
      19                 :            : #include "qgsmeshmemorydataprovider.h"
      20                 :            : #include "qgsmeshdataprovidertemporalcapabilities.h"
      21                 :            : #include "qgsmeshlayerutils.h"
      22                 :            : #include "qgstriangularmesh.h"
      23                 :            : #include <cstring>
      24                 :            : 
      25                 :            : #define TEXT_PROVIDER_KEY QStringLiteral( "mesh_memory" )
      26                 :            : #define TEXT_PROVIDER_DESCRIPTION QStringLiteral( "Mesh memory provider" )
      27                 :            : 
      28                 :          0 : bool QgsMeshMemoryDataProvider::isValid() const
      29                 :            : {
      30                 :          0 :   return true;
      31                 :            : }
      32                 :            : 
      33                 :          0 : QString QgsMeshMemoryDataProvider::name() const
      34                 :            : {
      35                 :          0 :   return TEXT_PROVIDER_KEY;
      36                 :            : }
      37                 :            : 
      38                 :          0 : QString QgsMeshMemoryDataProvider::description() const
      39                 :            : {
      40                 :          0 :   return TEXT_PROVIDER_DESCRIPTION;
      41                 :            : }
      42                 :            : 
      43                 :          0 : QgsCoordinateReferenceSystem QgsMeshMemoryDataProvider::crs() const
      44                 :            : {
      45                 :          0 :   return QgsCoordinateReferenceSystem();
      46                 :            : }
      47                 :            : 
      48                 :          0 : QgsMeshMemoryDataProvider::QgsMeshMemoryDataProvider( const QString &uri,
      49                 :            :     const ProviderOptions &options,
      50                 :            :     QgsDataProvider::ReadFlags flags )
      51                 :          0 :   : QgsMeshDataProvider( uri, options, flags )
      52                 :          0 : {
      53                 :          0 :   QString data( uri );
      54                 :            :   // see QgsMeshLayer::setDataProvider how mDataSource is created for memory layers
      55                 :          0 :   if ( uri.contains( "&uid=" ) )
      56                 :            :   {
      57                 :          0 :     data = uri.split( "&uid=" )[0];
      58                 :          0 :   }
      59                 :          0 :   mIsValid = splitMeshSections( data );
      60                 :            : 
      61                 :          0 :   temporalCapabilities()->setTemporalUnit( QgsUnitTypes::TemporalHours );
      62                 :          0 : }
      63                 :            : 
      64                 :          6 : QString QgsMeshMemoryDataProvider::providerKey()
      65                 :            : {
      66                 :         12 :   return TEXT_PROVIDER_KEY;
      67                 :            : }
      68                 :            : 
      69                 :          3 : QString QgsMeshMemoryDataProvider::providerDescription()
      70                 :            : {
      71                 :          6 :   return TEXT_PROVIDER_DESCRIPTION;
      72                 :            : }
      73                 :            : 
      74                 :          0 : QgsMeshMemoryDataProvider *QgsMeshMemoryDataProvider::createProvider( const QString &uri,
      75                 :            :     const ProviderOptions &options,
      76                 :            :     QgsDataProvider::ReadFlags flags )
      77                 :            : {
      78                 :          0 :   return new QgsMeshMemoryDataProvider( uri, options, flags );
      79                 :          0 : }
      80                 :            : 
      81                 :          0 : bool QgsMeshMemoryDataProvider::splitMeshSections( const QString &uri )
      82                 :            : {
      83                 :            : #if QT_VERSION < QT_VERSION_CHECK(5, 15, 0)
      84                 :            :   const QStringList sections = uri.split( QStringLiteral( "---" ), QString::SkipEmptyParts );
      85                 :            : #else
      86                 :          0 :   const QStringList sections = uri.split( QStringLiteral( "---" ), Qt::SkipEmptyParts );
      87                 :            : #endif
      88                 :          0 :   if ( sections.size() != 2 )
      89                 :            :   {
      90                 :          0 :     setError( QgsError( tr( "Invalid mesh definition, does not contain 2 sections" ),
      91                 :          0 :                         QStringLiteral( "Mesh Memory Provider" ) ) );
      92                 :          0 :     return false;
      93                 :            :   }
      94                 :            : 
      95                 :          0 :   if ( addMeshVertices( sections[0] ) )
      96                 :          0 :     return addMeshFacesOrEdges( sections[1] );
      97                 :            :   else
      98                 :          0 :     return false;
      99                 :          0 : }
     100                 :            : 
     101                 :          0 : bool QgsMeshMemoryDataProvider::addMeshVertices( const QString &def )
     102                 :            : {
     103                 :          0 :   QVector<QgsMeshVertex> vertices;
     104                 :            : 
     105                 :            : #if QT_VERSION < QT_VERSION_CHECK(5, 15, 0)
     106                 :            :   const QStringList verticesCoords = def.split( '\n', QString::SkipEmptyParts );
     107                 :            : #else
     108                 :          0 :   const QStringList verticesCoords = def.split( '\n', Qt::SkipEmptyParts );
     109                 :            : #endif
     110                 :          0 :   for ( int i = 0; i < verticesCoords.size(); ++i )
     111                 :            :   {
     112                 :            : #if QT_VERSION < QT_VERSION_CHECK(5, 15, 0)
     113                 :            :     const QStringList coords = verticesCoords[i].split( ',', QString::SkipEmptyParts );
     114                 :            : #else
     115                 :          0 :     const QStringList coords = verticesCoords[i].split( ',', Qt::SkipEmptyParts );
     116                 :            : #endif
     117                 :          0 :     if ( coords.size() != 2 )
     118                 :            :     {
     119                 :          0 :       setError( QgsError( tr( "Invalid mesh definition, vertex definition does not contain x, y" ),
     120                 :          0 :                           QStringLiteral( "Mesh Memory Provider" ) ) );
     121                 :          0 :       return false;
     122                 :            :     }
     123                 :          0 :     double x = coords.at( 0 ).toDouble();
     124                 :          0 :     double y = coords.at( 1 ).toDouble();
     125                 :          0 :     QgsMeshVertex vertex( x, y );
     126                 :          0 :     vertices.push_back( vertex );
     127                 :          0 :   }
     128                 :            : 
     129                 :          0 :   mVertices = vertices;
     130                 :          0 :   return true;
     131                 :          0 : }
     132                 :            : 
     133                 :          0 : bool QgsMeshMemoryDataProvider::addMeshFacesOrEdges( const QString &def )
     134                 :            : {
     135                 :          0 :   QVector<QgsMeshFace> faces;
     136                 :          0 :   QVector<QgsMeshEdge> edges;
     137                 :            : 
     138                 :            : #if QT_VERSION < QT_VERSION_CHECK(5, 15, 0)
     139                 :            :   const QStringList elements = def.split( '\n', QString::SkipEmptyParts );
     140                 :            : #else
     141                 :          0 :   const QStringList elements = def.split( '\n', Qt::SkipEmptyParts );
     142                 :            : #endif
     143                 :          0 :   for ( int i = 0; i < elements.size(); ++i )
     144                 :            :   {
     145                 :            : #if QT_VERSION < QT_VERSION_CHECK(5, 15, 0)
     146                 :            :     const QStringList vertices = elements[i].split( ',', QString::SkipEmptyParts );
     147                 :            : #else
     148                 :          0 :     const QStringList vertices = elements[i].split( ',', Qt::SkipEmptyParts );
     149                 :            : #endif
     150                 :          0 :     if ( vertices.size() < 2 )
     151                 :            :     {
     152                 :          0 :       setError( QgsError( tr( "Invalid mesh definition, edge must contain at least 2 vertices" ),
     153                 :          0 :                           QStringLiteral( "Mesh Memory Provider" ) ) );
     154                 :          0 :       return false;
     155                 :            :     }
     156                 :          0 :     else if ( vertices.size() == 2 )
     157                 :            :     {
     158                 :          0 :       QgsMeshEdge edge;
     159                 :          0 :       edge.first = vertices[0].toInt();
     160                 :          0 :       edge.second = vertices[1].toInt();
     161                 :          0 :       if ( !checkVertexId( edge.first ) ) return false;
     162                 :          0 :       if ( !checkVertexId( edge.second ) ) return false;
     163                 :          0 :       edges.push_back( edge );
     164                 :          0 :     }
     165                 :            :     else
     166                 :            :     {
     167                 :          0 :       QgsMeshFace face;
     168                 :          0 :       for ( int j = 0; j < vertices.size(); ++j )
     169                 :            :       {
     170                 :          0 :         int vertex_id = vertices[j].toInt();
     171                 :          0 :         if ( !checkVertexId( vertex_id ) ) return false;
     172                 :          0 :         face.push_back( vertex_id );
     173                 :          0 :       }
     174                 :          0 :       faces.push_back( face );
     175                 :          0 :     }
     176                 :          0 :   }
     177                 :            : 
     178                 :          0 :   mFaces = faces;
     179                 :          0 :   mEdges = edges;
     180                 :            : 
     181                 :          0 :   if ( mFaces.size() > 0 && mEdges.size() > 0 )
     182                 :            :   {
     183                 :          0 :     setError( QgsError( tr( "Invalid mesh definition, unable to read mesh with both edges and faces" ),
     184                 :          0 :                         QStringLiteral( "Mesh Memory Provider" ) ) );
     185                 :          0 :     return false;
     186                 :          0 :   }
     187                 :            : 
     188                 :          0 :   return true;
     189                 :          0 : }
     190                 :            : 
     191                 :            : 
     192                 :          0 : bool QgsMeshMemoryDataProvider::splitDatasetSections( const QString &uri, QgsMeshMemoryDatasetGroup &datasetGroup )
     193                 :            : {
     194                 :            : #if QT_VERSION < QT_VERSION_CHECK(5, 15, 0)
     195                 :            :   const QStringList sections = uri.split( QStringLiteral( "---" ), QString::SkipEmptyParts );
     196                 :            : #else
     197                 :          0 :   const QStringList sections = uri.split( QStringLiteral( "---" ), Qt::SkipEmptyParts );
     198                 :            : #endif
     199                 :          0 :   bool success = sections.size() > 2;
     200                 :          0 :   if ( !success )
     201                 :            :   {
     202                 :          0 :     setError( QgsError( tr( "Invalid dataset definition, does not contain 3+ sections" ),
     203                 :          0 :                         QStringLiteral( "Mesh Memory Provider" ) ) );
     204                 :          0 :   }
     205                 :            : 
     206                 :          0 :   if ( success )
     207                 :          0 :     success = setDatasetGroupType( sections[0], datasetGroup );
     208                 :          0 :   if ( success )
     209                 :          0 :     success = addDatasetGroupMetadata( sections[1], datasetGroup );
     210                 :            : 
     211                 :          0 :   for ( int i = 2; i < sections.size(); ++i )
     212                 :            :   {
     213                 :          0 :     if ( !success )
     214                 :          0 :       break;
     215                 :          0 :     std::shared_ptr<QgsMeshMemoryDataset> dataset = std::make_shared<QgsMeshMemoryDataset>();
     216                 :          0 :     success = addDatasetValues( sections[i], dataset, datasetGroup.isScalar() );
     217                 :          0 :     if ( success )
     218                 :          0 :       success = checkDatasetValidity( dataset, datasetGroup.dataType() );
     219                 :          0 :     if ( success )
     220                 :          0 :       datasetGroup.addDataset( dataset );
     221                 :          0 :   }
     222                 :            : 
     223                 :          0 :   return success;
     224                 :          0 : }
     225                 :            : 
     226                 :          0 : bool QgsMeshMemoryDataProvider::setDatasetGroupType( const QString &def, QgsMeshMemoryDatasetGroup &datasetGroup )
     227                 :            : {
     228                 :            : #if QT_VERSION < QT_VERSION_CHECK(5, 15, 0)
     229                 :            :   const QStringList types = def.split( ' ', QString::SkipEmptyParts );
     230                 :            : #else
     231                 :          0 :   const QStringList types = def.split( ' ', Qt::SkipEmptyParts );
     232                 :            : #endif
     233                 :          0 :   if ( types.size() != 3 )
     234                 :            :   {
     235                 :          0 :     setError( QgsError( tr( "Invalid type definition, must be Vertex/Edge/Face Vector/Scalar Name" ),
     236                 :          0 :                         QStringLiteral( "Mesh Memory Provider" ) ) );
     237                 :          0 :     return false;
     238                 :            :   }
     239                 :            : 
     240                 :            :   QgsMeshDatasetGroupMetadata::DataType type;
     241                 :          0 :   if ( 0 == QString::compare( types[0].trimmed(), QStringLiteral( "vertex" ), Qt::CaseInsensitive ) )
     242                 :          0 :     type = QgsMeshDatasetGroupMetadata::DataOnVertices;
     243                 :          0 :   else if ( 0 == QString::compare( types[0].trimmed(), QStringLiteral( "edge" ), Qt::CaseInsensitive ) )
     244                 :          0 :     type = QgsMeshDatasetGroupMetadata::DataOnEdges;
     245                 :            :   else
     246                 :          0 :     type = QgsMeshDatasetGroupMetadata::DataOnFaces;
     247                 :            : 
     248                 :          0 :   datasetGroup.setDataType( type );
     249                 :          0 :   datasetGroup.setIsScalar( 0 == QString::compare( types[1].trimmed(), QStringLiteral( "scalar" ), Qt::CaseInsensitive ) );
     250                 :          0 :   datasetGroup.setName( types[2].trimmed() );
     251                 :            : 
     252                 :          0 :   return true;
     253                 :          0 : }
     254                 :            : 
     255                 :          0 : bool QgsMeshMemoryDataProvider::addDatasetGroupMetadata( const QString &def, QgsMeshMemoryDatasetGroup &datasetGroup )
     256                 :            : {
     257                 :            : #if QT_VERSION < QT_VERSION_CHECK(5, 15, 0)
     258                 :            :   const QStringList metadataLines = def.split( '\n', QString::SkipEmptyParts );
     259                 :            : #else
     260                 :          0 :   const QStringList metadataLines = def.split( '\n', Qt::SkipEmptyParts );
     261                 :            : #endif
     262                 :          0 :   for ( int i = 0; i < metadataLines.size(); ++i )
     263                 :            :   {
     264                 :            : #if QT_VERSION < QT_VERSION_CHECK(5, 15, 0)
     265                 :            :     const QStringList keyVal = metadataLines[i].split( ':', QString::SkipEmptyParts );
     266                 :            : #else
     267                 :          0 :     const QStringList keyVal = metadataLines[i].split( ':', Qt::SkipEmptyParts );
     268                 :            : #endif
     269                 :          0 :     if ( keyVal.size() != 2 )
     270                 :            :     {
     271                 :          0 :       setError( QgsError( tr( "Invalid dataset definition, dataset metadata does not contain key: value" ),
     272                 :          0 :                           QStringLiteral( "Mesh Memory Provider" ) ) );
     273                 :          0 :       return false;
     274                 :            :     }
     275                 :            : 
     276                 :          0 :     datasetGroup.addExtraMetadata( keyVal.at( 0 ).trimmed(), keyVal.at( 1 ).trimmed() );
     277                 :          0 :   }
     278                 :          0 :   return true;
     279                 :          0 : }
     280                 :            : 
     281                 :          0 : bool QgsMeshMemoryDataProvider::addDatasetValues( const QString &def, std::shared_ptr<QgsMeshMemoryDataset> &dataset, bool isScalar )
     282                 :            : {
     283                 :            : #if QT_VERSION < QT_VERSION_CHECK(5, 15, 0)
     284                 :            :   const QStringList valuesLines = def.split( '\n', QString::SkipEmptyParts );
     285                 :            : #else
     286                 :          0 :   const QStringList valuesLines = def.split( '\n', Qt::SkipEmptyParts );
     287                 :            : #endif
     288                 :            :   // first line is time
     289                 :          0 :   if ( valuesLines.size() < 2 )
     290                 :            :   {
     291                 :          0 :     setError( QgsError( tr( "Invalid dataset definition, must contain at least 1 line (time)" ),
     292                 :          0 :                         QStringLiteral( "Mesh Memory Provider" ) ) );
     293                 :          0 :     return false;
     294                 :            :   }
     295                 :            : 
     296                 :          0 :   dataset->time = valuesLines[0].toDouble();
     297                 :            : 
     298                 :          0 :   for ( int i = 1; i < valuesLines.size(); ++i )
     299                 :            :   {
     300                 :            : #if QT_VERSION < QT_VERSION_CHECK(5, 15, 0)
     301                 :            :     const QStringList values = valuesLines[i].split( ',', QString::SkipEmptyParts );
     302                 :            : #else
     303                 :          0 :     const QStringList values = valuesLines[i].split( ',', Qt::SkipEmptyParts );
     304                 :            : #endif
     305                 :          0 :     QgsMeshDatasetValue point;
     306                 :            : 
     307                 :          0 :     if ( isScalar )
     308                 :            :     {
     309                 :          0 :       if ( values.size() != 1 )
     310                 :            :       {
     311                 :          0 :         setError( QgsError( tr( "Invalid dataset definition, dataset scalar values must be x" ),
     312                 :          0 :                             QStringLiteral( "Mesh Memory Provider" ) ) );
     313                 :          0 :         return false;
     314                 :            :       }
     315                 :            :       else
     316                 :            :       {
     317                 :          0 :         point.setX( values[0].toDouble() );
     318                 :            :       }
     319                 :          0 :     }
     320                 :            :     else
     321                 :            :     {
     322                 :          0 :       if ( values.size() < 2 )
     323                 :            :       {
     324                 :          0 :         setError( QgsError( tr( "Invalid dataset definition, dataset vector values must be x, y" ),
     325                 :          0 :                             QStringLiteral( "Mesh Memory Provider" ) ) );
     326                 :          0 :         return false;
     327                 :            :       }
     328                 :            :       else
     329                 :            :       {
     330                 :          0 :         point.setX( values[0].toDouble() );
     331                 :          0 :         point.setY( values[1].toDouble() );
     332                 :            :       }
     333                 :            :     }
     334                 :            : 
     335                 :          0 :     dataset->values.push_back( point );
     336                 :          0 :   }
     337                 :          0 :   return true;
     338                 :          0 : }
     339                 :            : 
     340                 :          0 : bool QgsMeshMemoryDataProvider::checkDatasetValidity( std::shared_ptr<QgsMeshMemoryDataset> &dataset, QgsMeshDatasetGroupMetadata::DataType dataType )
     341                 :            : {
     342                 :          0 :   bool valid = true;
     343                 :            : 
     344                 :          0 :   if ( dataType == QgsMeshDatasetGroupMetadata::DataOnVertices )
     345                 :            :   {
     346                 :          0 :     if ( dataset->values.count() != vertexCount() )
     347                 :            :     {
     348                 :          0 :       valid = false;
     349                 :          0 :       setError( QgsError( tr( "Dataset defined on vertices has {} values, but mesh {}" ).arg( dataset->values.count(), vertexCount() ),
     350                 :          0 :                           QStringLiteral( "Mesh Memory Provider" ) ) );
     351                 :          0 :     }
     352                 :          0 :   }
     353                 :          0 :   else if ( dataType == QgsMeshDatasetGroupMetadata::DataOnFaces )
     354                 :            :   {
     355                 :            :     // on faces
     356                 :          0 :     if ( dataset->values.count() != faceCount() )
     357                 :            :     {
     358                 :          0 :       valid = false;
     359                 :          0 :       setError( QgsError( tr( "Dataset defined on faces has {} values, but mesh {}" ).arg( dataset->values.count(), faceCount() ),
     360                 :          0 :                           QStringLiteral( "Mesh Memory Provider" ) ) );
     361                 :          0 :     }
     362                 :          0 :   }
     363                 :          0 :   else if ( dataType == QgsMeshDatasetGroupMetadata::DataOnEdges )
     364                 :            :   {
     365                 :            :     // on edges
     366                 :          0 :     if ( dataset->values.count() != edgeCount() )
     367                 :            :     {
     368                 :          0 :       valid = false;
     369                 :          0 :       setError( QgsError( tr( "Dataset defined on edges has {} values, but mesh {}" ).arg( dataset->values.count(), edgeCount() ),
     370                 :          0 :                           QStringLiteral( "Mesh Memory Provider" ) ) );
     371                 :          0 :     }
     372                 :          0 :   }
     373                 :          0 :   dataset->valid = valid;
     374                 :          0 :   return valid;
     375                 :          0 : }
     376                 :            : 
     377                 :          0 : bool QgsMeshMemoryDataProvider::checkVertexId( int vertexIndex )
     378                 :            : {
     379                 :          0 :   if ( vertexIndex < 0 )
     380                 :            :   {
     381                 :          0 :     setError( QgsError( tr( "Invalid mesh definition, vertex index must be positive value" ),
     382                 :          0 :                         QStringLiteral( "Mesh Memory Provider" ) ) );
     383                 :          0 :     return false;
     384                 :            :   }
     385                 :          0 :   if ( mVertices.size() <= vertexIndex )
     386                 :            :   {
     387                 :          0 :     setError( QgsError( tr( "Invalid mesh definition, missing vertex id defined in face" ),
     388                 :          0 :                         QStringLiteral( "Mesh Memory Provider" ) ) );
     389                 :          0 :     return false;
     390                 :            :   }
     391                 :            : 
     392                 :          0 :   return true;
     393                 :          0 : }
     394                 :            : 
     395                 :          0 : void QgsMeshMemoryDataProvider::addGroupToTemporalCapabilities( int groupIndex, const QgsMeshMemoryDatasetGroup &group )
     396                 :            : {
     397                 :          0 :   QgsMeshDataProviderTemporalCapabilities *tempCap = temporalCapabilities();
     398                 :          0 :   if ( !tempCap )
     399                 :          0 :     return;
     400                 :            : 
     401                 :          0 :   if ( group.datasetCount() > 1 ) //non temporal dataset groups (count=1) have no time in the capabilities
     402                 :            :   {
     403                 :          0 :     for ( int i = 0; i < group.memoryDatasets.count(); ++i )
     404                 :          0 :       if ( group.memoryDatasets.at( i ) )
     405                 :          0 :         tempCap->addDatasetTime( groupIndex, group.memoryDatasets.at( i )->time );
     406                 :          0 :   }
     407                 :            : 
     408                 :          0 : }
     409                 :            : 
     410                 :          0 : int QgsMeshMemoryDataProvider::vertexCount() const
     411                 :            : {
     412                 :          0 :   return mVertices.size();
     413                 :            : }
     414                 :            : 
     415                 :          0 : int QgsMeshMemoryDataProvider::faceCount() const
     416                 :            : {
     417                 :          0 :   return mFaces.size();
     418                 :            : }
     419                 :            : 
     420                 :          0 : int QgsMeshMemoryDataProvider::edgeCount() const
     421                 :            : {
     422                 :          0 :   return mEdges.size();
     423                 :            : }
     424                 :            : 
     425                 :          0 : void QgsMeshMemoryDataProvider::populateMesh( QgsMesh *mesh ) const
     426                 :            : {
     427                 :          0 :   if ( mesh )
     428                 :            :   {
     429                 :          0 :     mesh->faces = mFaces;
     430                 :          0 :     mesh->vertices = mVertices;
     431                 :          0 :     mesh->edges = mEdges;
     432                 :          0 :   }
     433                 :          0 : }
     434                 :            : 
     435                 :          0 : QgsRectangle QgsMeshMemoryDataProvider::extent() const
     436                 :            : {
     437                 :          0 :   return calculateExtent( );
     438                 :            : }
     439                 :            : 
     440                 :          0 : bool QgsMeshMemoryDataProvider::addDataset( const QString &uri )
     441                 :            : {
     442                 :          0 :   QgsMeshMemoryDatasetGroup group;
     443                 :            : 
     444                 :          0 :   bool valid = false;
     445                 :          0 :   if ( mIsValid )
     446                 :            :   {
     447                 :          0 :     valid = splitDatasetSections( uri, group );
     448                 :          0 :   }
     449                 :            :   else
     450                 :            :   {
     451                 :          0 :     setError( QgsError( tr( "Unable to add dataset group to invalid mesh" ),
     452                 :          0 :                         QStringLiteral( "Mesh Memory Provider" ) ) );
     453                 :            :   }
     454                 :            : 
     455                 :          0 :   group.calculateStatistic();
     456                 :          0 :   mDatasetGroups.push_back( group );
     457                 :          0 :   addGroupToTemporalCapabilities( mDatasetGroups.count() - 1, group );
     458                 :            : 
     459                 :          0 :   if ( valid )
     460                 :            :   {
     461                 :          0 :     if ( !mExtraDatasetUris.contains( uri ) )
     462                 :          0 :       mExtraDatasetUris << uri;
     463                 :          0 :     temporalCapabilities()->setHasTemporalCapabilities( true );
     464                 :          0 :     emit datasetGroupsAdded( 1 );
     465                 :          0 :     emit dataChanged();
     466                 :          0 :   }
     467                 :            : 
     468                 :          0 :   return valid;
     469                 :          0 : }
     470                 :            : 
     471                 :          0 : QStringList QgsMeshMemoryDataProvider::extraDatasets() const
     472                 :            : {
     473                 :          0 :   return mExtraDatasetUris;
     474                 :            : }
     475                 :            : 
     476                 :          0 : int QgsMeshMemoryDataProvider::datasetGroupCount() const
     477                 :            : {
     478                 :          0 :   return mDatasetGroups.count();
     479                 :            : }
     480                 :            : 
     481                 :          0 : int QgsMeshMemoryDataProvider::datasetCount( int groupIndex ) const
     482                 :            : {
     483                 :          0 :   if ( ( groupIndex >= 0 ) && ( groupIndex < datasetGroupCount() ) )
     484                 :          0 :     return mDatasetGroups[groupIndex].memoryDatasets.count();
     485                 :            :   else
     486                 :          0 :     return 0;
     487                 :          0 : }
     488                 :            : 
     489                 :          0 : QgsMeshDatasetGroupMetadata QgsMeshMemoryDataProvider::datasetGroupMetadata( int groupIndex ) const
     490                 :            : {
     491                 :          0 :   if ( ( groupIndex >= 0 ) && ( groupIndex < datasetGroupCount() ) )
     492                 :            :   {
     493                 :          0 :     return mDatasetGroups[groupIndex].groupMetadata();
     494                 :            :   }
     495                 :            :   else
     496                 :            :   {
     497                 :          0 :     return QgsMeshDatasetGroupMetadata();
     498                 :            :   }
     499                 :          0 : }
     500                 :            : 
     501                 :            : 
     502                 :            : 
     503                 :          0 : QgsMeshDatasetMetadata QgsMeshMemoryDataProvider::datasetMetadata( QgsMeshDatasetIndex index ) const
     504                 :            : {
     505                 :          0 :   if ( ( index.group() >= 0 ) && ( index.group() < datasetGroupCount() ) &&
     506                 :          0 :        ( index.dataset() >= 0 ) && ( index.dataset() < datasetCount( index.group() ) )
     507                 :            :      )
     508                 :            :   {
     509                 :          0 :     const QgsMeshMemoryDatasetGroup &grp = mDatasetGroups.at( index.group() );
     510                 :          0 :     QgsMeshDatasetMetadata metadata(
     511                 :          0 :       grp.memoryDatasets[index.dataset()]->time,
     512                 :          0 :       grp.memoryDatasets[index.dataset()]->valid,
     513                 :          0 :       grp.memoryDatasets[index.dataset()]->minimum,
     514                 :          0 :       grp.memoryDatasets[index.dataset()]->maximum,
     515                 :            :       0
     516                 :            :     );
     517                 :          0 :     return metadata;
     518                 :            :   }
     519                 :            :   else
     520                 :            :   {
     521                 :          0 :     return QgsMeshDatasetMetadata();
     522                 :            :   }
     523                 :          0 : }
     524                 :            : 
     525                 :          0 : QgsMeshDatasetValue QgsMeshMemoryDataProvider::datasetValue( QgsMeshDatasetIndex index, int valueIndex ) const
     526                 :            : {
     527                 :          0 :   if ( ( index.group() >= 0 ) && ( index.group() < datasetGroupCount() ) &&
     528                 :          0 :        ( index.dataset() >= 0 ) && ( index.dataset() < datasetCount( index.group() ) ) &&
     529                 :          0 :        ( valueIndex >= 0 ) && ( valueIndex < mDatasetGroups[index.group()].memoryDatasets[index.dataset()]->values.count() ) )
     530                 :            :   {
     531                 :          0 :     return mDatasetGroups[index.group()].memoryDatasets[index.dataset()]->values[valueIndex];
     532                 :            :   }
     533                 :            :   else
     534                 :            :   {
     535                 :          0 :     return QgsMeshDatasetValue();
     536                 :            :   }
     537                 :          0 : }
     538                 :            : 
     539                 :          0 : QgsMeshDataBlock QgsMeshMemoryDataProvider::datasetValues( QgsMeshDatasetIndex index, int valueIndex, int count ) const
     540                 :            : {
     541                 :          0 :   if ( ( index.group() >= 0 ) && ( index.group() < datasetGroupCount() ) )
     542                 :            :   {
     543                 :          0 :     const QgsMeshMemoryDatasetGroup group = mDatasetGroups[index.group()];
     544                 :          0 :     bool isScalar = group.isScalar();
     545                 :          0 :     if ( ( index.dataset() >= 0 ) && ( index.dataset() < group.memoryDatasets.size() ) )
     546                 :            :     {
     547                 :          0 :       return group.memoryDatasets[index.dataset()]->datasetValues( isScalar, valueIndex, count );
     548                 :            :     }
     549                 :            :     else
     550                 :            :     {
     551                 :          0 :       return QgsMeshDataBlock();
     552                 :            :     }
     553                 :          0 :   }
     554                 :            :   else
     555                 :            :   {
     556                 :          0 :     return QgsMeshDataBlock();
     557                 :            :   }
     558                 :          0 : }
     559                 :            : 
     560                 :          0 : QgsMesh3dDataBlock QgsMeshMemoryDataProvider::dataset3dValues( QgsMeshDatasetIndex, int, int ) const
     561                 :            : {
     562                 :            :   // 3d stacked meshes are not supported by memory provider
     563                 :          0 :   return QgsMesh3dDataBlock();
     564                 :            : }
     565                 :            : 
     566                 :            : 
     567                 :            : 
     568                 :          0 : bool QgsMeshMemoryDataProvider::isFaceActive( QgsMeshDatasetIndex index, int faceIndex ) const
     569                 :            : {
     570                 :          0 :   if ( mDatasetGroups[index.group()].memoryDatasets[index.dataset()]->active.isEmpty() )
     571                 :          0 :     return true;
     572                 :            :   else
     573                 :          0 :     return mDatasetGroups[index.group()].memoryDatasets[index.dataset()]->active[faceIndex];
     574                 :          0 : }
     575                 :            : 
     576                 :          0 : QgsMeshDataBlock QgsMeshMemoryDataProvider::areFacesActive( QgsMeshDatasetIndex index, int faceIndex, int count ) const
     577                 :            : {
     578                 :          0 :   if ( ( index.group() >= 0 ) && ( index.group() < datasetGroupCount() ) )
     579                 :            :   {
     580                 :          0 :     const QgsMeshMemoryDatasetGroup group = mDatasetGroups[index.group()];
     581                 :          0 :     if ( ( index.dataset() >= 0 ) && ( index.dataset() < group.memoryDatasets.size() ) )
     582                 :            :     {
     583                 :          0 :       return group.memoryDatasets[index.dataset()]->areFacesActive( faceIndex, count );
     584                 :            :     }
     585                 :            :     else
     586                 :            :     {
     587                 :          0 :       return QgsMeshDataBlock();
     588                 :            :     }
     589                 :          0 :   }
     590                 :            :   else
     591                 :            :   {
     592                 :          0 :     return QgsMeshDataBlock();
     593                 :            :   }
     594                 :          0 : }
     595                 :            : 
     596                 :            : 
     597                 :            : 
     598                 :          0 : bool QgsMeshMemoryDataProvider::persistDatasetGroup( const QString &outputFilePath,
     599                 :            :     const QString &outputDriver,
     600                 :            :     const QgsMeshDatasetGroupMetadata &meta,
     601                 :            :     const QVector<QgsMeshDataBlock> &datasetValues,
     602                 :            :     const QVector<QgsMeshDataBlock> &datasetActive,
     603                 :            :     const QVector<double> &times )
     604                 :            : {
     605                 :          0 :   Q_UNUSED( outputFilePath )
     606                 :          0 :   Q_UNUSED( outputDriver )
     607                 :          0 :   Q_UNUSED( meta )
     608                 :          0 :   Q_UNUSED( datasetValues )
     609                 :          0 :   Q_UNUSED( datasetActive )
     610                 :          0 :   Q_UNUSED( times )
     611                 :          0 :   return true; // not implemented/supported
     612                 :            : }
     613                 :            : 
     614                 :          0 : bool QgsMeshMemoryDataProvider::persistDatasetGroup( const QString &outputFilePath,
     615                 :            :     const QString &outputDriver,
     616                 :            :     QgsMeshDatasetSourceInterface *source,
     617                 :            :     int datasetGroupIndex )
     618                 :            : {
     619                 :          0 :   Q_UNUSED( outputFilePath )
     620                 :          0 :   Q_UNUSED( outputDriver )
     621                 :            :   Q_UNUSED( source )
     622                 :            :   Q_UNUSED( datasetGroupIndex )
     623                 :          0 :   return true; // not implemented/supported
     624                 :            : }
     625                 :            : 
     626                 :          0 : QgsRectangle QgsMeshMemoryDataProvider::calculateExtent() const
     627                 :            : {
     628                 :          0 :   QgsRectangle rec;
     629                 :          0 :   rec.setMinimal();
     630                 :          0 :   for ( const QgsMeshVertex &v : mVertices )
     631                 :            :   {
     632                 :          0 :     rec.setXMinimum( std::min( rec.xMinimum(), v.x() ) );
     633                 :          0 :     rec.setYMinimum( std::min( rec.yMinimum(), v.y() ) );
     634                 :          0 :     rec.setXMaximum( std::max( rec.xMaximum(), v.x() ) );
     635                 :          0 :     rec.setYMaximum( std::max( rec.yMaximum(), v.y() ) );
     636                 :            :   }
     637                 :          0 :   return rec;
     638                 :            : }
     639                 :            : 
     640                 :            : 
     641                 :            : 
     642                 :            : ///@endcond

Generated by: LCOV version 1.14