48                             const QString &baseName,
 
   49                             const QString &providerKey,
 
   58   QgsDataProvider::ReadFlags 
flags = QgsDataProvider::ReadFlags();
 
   67   setDataSourcePrivate( meshLayerPath, baseName, providerKey, providerOptions, 
flags );
 
   72     setDefaultRendererSettings( mDatasetGroupStore->datasetGroupIndexes() );
 
   78 void QgsMeshLayer::setDefaultRendererSettings( 
const QList<int> &groupIndexes )
 
   81   if ( groupIndexes.count() > 0 )
 
   87     if ( meta.
maximum() == std::numeric_limits<double>::quiet_NaN() &&
 
   88          meta.
minimum() == std::numeric_limits<double>::quiet_NaN() )
 
  100   for ( 
const int i : groupIndexes )
 
  118     applyClassificationOnScalarSettings( meta, scalarSettings );
 
  125 void QgsMeshLayer::createSimplifiedMeshes()
 
  127   if ( mSimplificationSettings.
isEnabled() && !hasSimplifiedMeshes() )
 
  129     const double reductionFactor = mSimplificationSettings.
reductionFactor();
 
  131     QVector<QgsTriangularMesh *> simplifyMeshes =
 
  132       mTriangularMeshes[0]->simplifyMesh( reductionFactor );
 
  134     for ( 
int i = 0; i < simplifyMeshes.count() ; ++i )
 
  136       mTriangularMeshes.emplace_back( simplifyMeshes[i] );
 
  141 bool QgsMeshLayer::hasSimplifiedMeshes()
 const 
  144   return ( mTriangularMeshes.size() > 1 );
 
  149   delete mDataProvider;
 
  154   return mDataProvider;
 
  159   return mDataProvider;
 
  177     return mMeshEditor->
extent();
 
  180     return mDataProvider->
extent();
 
  196   if ( !mDataProvider )
 
  211   for ( 
const int index : groupsList )
 
  212     assignDefaultStyleToDatasetGroup( index );
 
  214   if ( !groupsList.isEmpty() )
 
  226   if ( mDatasetGroupStore->addPersistentDatasets( path ) )
 
  228     mExtraDatasetUri.append( path );
 
  230     if ( !isTemporalBefore && 
dataProvider()->temporalCapabilities()->hasTemporalCapabilities() )
 
  237         QDateTime referenceTime = defaultReferenceTime;
 
  238         if ( !defaultReferenceTime.isValid() ) 
 
  239           referenceTime = QDateTime( QDate::currentDate(), QTime( 0, 0, 0 ), Qt::UTC );
 
  254   if ( mDatasetGroupStore->addDatasetGroup( datasetGroup ) )
 
  264   return mDatasetGroupStore->saveDatasetGroup( path, datasetGroupIndex, driver );
 
  269   return mNativeMesh.get();
 
  274   return mNativeMesh.get();
 
  279   for ( 
const std::unique_ptr<QgsTriangularMesh> &lod : mTriangularMeshes )
 
  281     if ( lod && lod->averageTriangleSize() > minimumTriangleSize )
 
  285   if ( !mTriangularMeshes.empty() )
 
  286     return mTriangularMeshes.back().get();
 
  293   return mTriangularMeshes.size();
 
  298   if ( mTriangularMeshes.empty() )
 
  301     return mTriangularMeshes.front().get();
 
  303   if ( lodIndex >= 
int( mTriangularMeshes.size() ) )
 
  304     return mTriangularMeshes.back().get();
 
  306   return mTriangularMeshes.at( lodIndex ).get();
 
  319   if ( mTriangularMeshes.empty() )
 
  322     mTriangularMeshes.emplace_back( baseMesh );
 
  325   if ( mTriangularMeshes[0].get()->update( mNativeMesh.get(), transform ) )
 
  326     mTriangularMeshes.resize( 1 ); 
 
  328   createSimplifiedMeshes();
 
  333   return mRendererCache.get();
 
  338   return mRendererSettings;
 
  345   mRendererSettings = settings;
 
  359   return mTimeSettings;
 
  364   mTimeSettings = settings;
 
  371     return QgsMeshLayerUtils::formatTime( hours, mTemporalProperties->
referenceTime(), mTimeSettings );
 
  373     return QgsMeshLayerUtils::formatTime( hours, QDateTime(), mTimeSettings );
 
  378   return mDatasetGroupStore->datasetGroupCount();
 
  383   return mDatasetGroupStore->extraDatasetGroupCount();
 
  388   return mDatasetGroupStore->datasetGroupIndexes();
 
  393   return mDatasetGroupStore->enabledDatasetGroupIndexes();
 
  398   return mDatasetGroupStore->datasetGroupMetadata( index );
 
  403   return mDatasetGroupStore->datasetCount( index.
group() );
 
  408   return mDatasetGroupStore->datasetMetadata( index );
 
  413   return mDatasetGroupStore->datasetValue( index, valueIndex );
 
  418   return mDatasetGroupStore->datasetValues( index, valueIndex, count );
 
  423   return mDatasetGroupStore->dataset3dValues( index, faceIndex, count );
 
  428   return mDatasetGroupStore->areFacesActive( index, faceIndex, count );
 
  433   return mDatasetGroupStore->isFaceActive( index, faceIndex );
 
  443     if ( 
contains( QgsMesh::ElementType::Edge ) )
 
  445       const QgsRectangle searchRectangle( point.
x() - searchRadius, point.
y() - searchRadius, point.
x() + searchRadius, point.
y() + searchRadius );
 
  449     if ( faceIndex >= 0 )
 
  466             const int v1 = face[0], v2 = face[1], v3 = face[2];
 
  471             const double x = QgsMeshLayerUtils::interpolateFromVerticesData( p1, p2, p3, val1.
x(), val2.
x(), val3.
x(), point );
 
  472             double y = std::numeric_limits<double>::quiet_NaN();
 
  475               y = QgsMeshLayerUtils::interpolateFromVerticesData( p1, p2, p3, val1.
y(), val2.
y(), val3.
y(), point );
 
  490                 value = block2d.
value( 0 );
 
  518       if ( faceIndex >= 0 )
 
  532   const int selectedIndex = closestEdge( point, searchRadius, projectedPoint );
 
  534   if ( selectedIndex >= 0 )
 
  548         const int v1 = edge.first, v2 = edge.second;
 
  552         const double edgeLength = p1.
distance( p2 );
 
  553         const double dist1 = p1.
distance( projectedPoint.
x(), projectedPoint.
y() );
 
  554         value = QgsMeshLayerUtils::interpolateFromVerticesData( dist1 / edgeLength, val1, val2 );
 
  574   if ( ! mTemporalProperties->
isActive() )
 
  577   const QDateTime layerReferenceTime = mTemporalProperties->
referenceTime();
 
  578   QDateTime utcTime = timeRange.begin();
 
  579   if ( utcTime.timeSpec() != Qt::UTC )
 
  580     utcTime.setTimeSpec( Qt::UTC );
 
  581   const qint64 startTime = layerReferenceTime.msecsTo( utcTime );
 
  583   return  mDatasetGroupStore->datasetIndexAtTime( startTime, datasetGroupIndex, mTemporalProperties->
matchingMethod() );
 
  588   return  mDatasetGroupStore->datasetIndexAtTime( relativeTime.
seconds() * 1000, datasetGroupIndex, mTemporalProperties->
matchingMethod() );
 
  593   qint64 usedRelativeTime1 = startRelativeTime.
seconds() * 1000;
 
  594   qint64 usedRelativeTime2 = endRelativeTime.
seconds() * 1000;
 
  606   return  mDatasetGroupStore->datasetIndexInTimeInterval( usedRelativeTime1, usedRelativeTime2, datasetGroupIndex );
 
  611   if ( meta.
extraOptions().contains( QStringLiteral( 
"classification" ) ) )
 
  615     const QStringList classes = meta.
extraOptions()[QStringLiteral( 
"classification" )].split( QStringLiteral( 
";;" ) );
 
  618     if ( meta.
extraOptions().contains( QStringLiteral( 
"units" ) ) )
 
  619       units = meta.
extraOptions()[ QStringLiteral( 
"units" )];
 
  621     QVector<QVector<double>> bounds;
 
  622     for ( 
const QString &classe : classes )
 
  624       const QStringList boundsStr = classe.split( 
',' );
 
  625       QVector<double> bound;
 
  626       for ( 
const QString &boundStr : boundsStr )
 
  627         bound.append( boundStr.toDouble() );
 
  628       bounds.append( bound );
 
  631     if ( ( bounds.count() == 1  && bounds.first().count() > 2 ) || 
 
  632          ( bounds.count() > 1 ) ) 
 
  634       const QVector<double> firstClass = bounds.first();
 
  635       const QVector<double> lastClass = bounds.last();
 
  636       const double minValue = firstClass.count() > 1 ? ( firstClass.first() + firstClass.last() ) / 2 : firstClass.first();
 
  637       const double maxValue = lastClass.count() > 1 ? ( lastClass.first() + lastClass.last() ) / 2 : lastClass.first();
 
  638       const double diff = maxValue - minValue;
 
  639       QList<QgsColorRampShader::ColorRampItem> colorRampItemlist;
 
  640       for ( 
int i = 0; i < bounds.count(); ++i )
 
  642         const QVector<double> &boundClass = bounds.at( i );
 
  645         if ( !boundClass.isEmpty() )
 
  647           const double scalarValue = ( boundClass.first() + boundClass.last() ) / 2;
 
  648           item.
color = colorRamp->
color( ( scalarValue - minValue ) / diff );
 
  649           if ( i != 0 && i < bounds.count() - 1 ) 
 
  651             item.
label = QString( ( 
"%1 - %2 %3" ) ).
 
  652                          arg( QString::number( boundClass.first() ) ).
 
  653                          arg( QString::number( boundClass.last() ) ).
 
  657         colorRampItemlist.append( item );
 
  660       if ( firstClass.count() == 1 )
 
  661         colorRampItemlist.first().label = QObject::tr( 
"below %1 %2" ).
 
  662                                           arg( QString::number( firstClass.first() ) ).
 
  666         colorRampItemlist.first().label = QString( ( 
"%1 - %2 %3" ) ).
 
  667                                           arg( QString::number( firstClass.first() ) ).
 
  668                                           arg( QString::number( firstClass.last() ) ).
 
  672       if ( lastClass.count() == 1 )
 
  673         colorRampItemlist.last().label = QObject::tr( 
"above %1 %2" ).
 
  674                                          arg( QString::number( lastClass.first() ) ).
 
  678         colorRampItemlist.last().label = QString( ( 
"%1 - %2 %3" ) ).
 
  679                                          arg( QString::number( lastClass.first() ) ).
 
  680                                          arg( QString::number( lastClass.last() ) ).
 
  699   if ( mTemporalProperties->
isActive() )
 
  707   if ( mTemporalProperties->
isActive() )
 
  713 void QgsMeshLayer::fillNativeMesh()
 
  715   Q_ASSERT( !mNativeMesh );
 
  717   mNativeMesh.reset( 
new QgsMesh() );
 
  725 void QgsMeshLayer::onDatasetGroupsAdded( 
const QList<int> &datasetGroupIndexes )
 
  728   for ( 
int i = 0; i < datasetGroupIndexes.count(); ++i )
 
  729     assignDefaultStyleToDatasetGroup( datasetGroupIndexes.at( i ) );
 
  735 void QgsMeshLayer::onMeshEdited()
 
  737   mRendererCache.reset( 
new QgsMeshLayerRendererCache() );
 
  745   return mDatasetGroupStore->datasetGroupTreeItem();
 
  750   mDatasetGroupStore->setDatasetGroupTreeItem( rootItem );
 
  751   updateActiveDatasetGroups();
 
  754 int QgsMeshLayer::closestEdge( 
const QgsPointXY &point, 
double searchRadius, 
QgsPointXY &projectedPoint )
 const 
  756   const QgsRectangle searchRectangle( point.
x() - searchRadius, point.
y() - searchRadius, point.
x() + searchRadius, point.
y() + searchRadius );
 
  760   int selectedIndex = -1;
 
  764     double sqrMaxDistFromPoint = pow( searchRadius, 2 );
 
  765     for ( 
const int edgeIndex : edgeIndexes )
 
  771       const double sqrDist = point.
sqrDistToSegment( vertex1.
x(), vertex1.
y(), vertex2.
x(), vertex2.
y(), projPoint );
 
  772       if ( sqrDist < sqrMaxDistFromPoint )
 
  774         selectedIndex = edgeIndex;
 
  775         projectedPoint = projPoint;
 
  776         sqrMaxDistFromPoint = sqrDist;
 
  781   return selectedIndex;
 
  792     mTemporalProperties->
setReferenceTime( referenceTime, lDataProvider->temporalCapabilities() );
 
  807     return exactPosition;
 
  808   const QgsRectangle rectangle( point.
x() - searchRadius, point.
y() - searchRadius, point.
x() + searchRadius, point.
y() + searchRadius );
 
  809   double maxDistance = searchRadius;
 
  812   for ( 
const int edgeIndex : edgeIndexes )
 
  817     const double dist1 = point.
distance( vertex1 );
 
  818     const double dist2 = point.
distance( vertex2 );
 
  819     if ( dist1 < maxDistance )
 
  822       exactPosition = vertex1;
 
  824     if ( dist2 < maxDistance )
 
  827       exactPosition = vertex2;
 
  833   for ( 
const int faceIndex : faceIndexes )
 
  836     for ( 
int i = 0; i < 3; ++i )
 
  839       const double dist = point.
distance( vertex );
 
  840       if ( dist < maxDistance )
 
  843         exactPosition = vertex;
 
  848   return exactPosition;
 
  854   closestEdge( point, searchRadius, projectedPoint );
 
  856   return projectedPoint;
 
  864     return centroidPosition;
 
  865   const QgsRectangle rectangle( point.
x() - searchRadius, point.
y() - searchRadius, point.
x() + searchRadius, point.
y() + searchRadius );
 
  866   double maxDistance = std::numeric_limits<double>::max();
 
  869   for ( 
const int faceIndex : faceIndexes )
 
  872     if ( nativefaceIndex < 0 && nativefaceIndex >= mesh->
faceCentroids().count() )
 
  876     if ( dist < maxDistance )
 
  883   return centroidPosition;
 
  888   mDatasetGroupStore->resetDatasetGroupTreeItem();
 
  889   updateActiveDatasetGroups();
 
  894   if ( !mDataProvider )
 
  897   for ( 
int i = 0; i < groupCount; ++i )
 
  909   const qint64 time = mDatasetGroupStore->datasetRelativeTime( index );
 
  919   return mDatasetGroupStore->datasetRelativeTime( index );
 
  931       message = QObject::tr( 
"Face %1 invalid" ).arg( error.
elementIndex );
 
  934       message =  QObject::tr( 
"Too many vertices for face %1" ).arg( error.
elementIndex );
 
  937       message =  QObject::tr( 
"Face %1 is flat" ).arg( error.
elementIndex );
 
  940       message =  QObject::tr( 
"Vertex %1 is a unique shared vertex" ).arg( error.
elementIndex );
 
  943       message =  QObject::tr( 
"Vertex %1 is invalid" ).arg( error.
elementIndex );
 
  946       message =  QObject::tr( 
"Face %1 is manifold" ).arg( error.
elementIndex );
 
  977     mMeshEditor->deleteLater();
 
  978     mMeshEditor = 
nullptr;
 
  981                                arg( 
name(), detailsErrorMessage( 
error ) ), QString(), Qgis::MessageLevel::Critical );
 
  986   mDataProvider->
close();
 
  989   mExtraDatasetUri.clear();
 
 1005   QString detailsError;
 
 1009       detailsError = tr( 
"Unknown inconsistent mesh error" );
 
 1014     detailsError = detailsErrorMessage( 
error );
 
 1017   if ( !detailsError.isEmpty() )
 
 1020                                arg( 
name(), detailsError ), QString(), Qgis::MessageLevel::Critical );
 
 1026   if ( !mDataProvider )
 
 1029   const bool res = mDataProvider->
saveMeshFrame( *mNativeMesh.get() );
 
 1031   if ( continueEditing )
 
 1038   mMeshEditor->deleteLater();
 
 1039   mMeshEditor = 
nullptr;
 
 1045   mDatasetGroupStore->setPersistentProvider( mDataProvider, QStringList() );
 
 1054   if ( !mDataProvider )
 
 1057   mTriangularMeshes.clear();
 
 1061   mRendererCache.reset( 
new QgsMeshLayerRendererCache() );
 
 1064   if ( continueEditing )
 
 1071     mMeshEditor->deleteLater();
 
 1072     mMeshEditor = 
nullptr;
 
 1076     mDatasetGroupStore->setPersistentProvider( mDataProvider, QStringList() );
 
 1089   mTriangularMeshes.at( 0 )->update( mNativeMesh.get(), transform );
 
 1090   mRendererCache.reset( 
new QgsMeshLayerRendererCache() );
 
 1098   if ( !mMeshEditor->
reindex( renumber ) )
 
 1101   mTriangularMeshes.clear();
 
 1103   mTriangularMeshes.at( 0 )->update( mNativeMesh.get(), transform );
 
 1104   mRendererCache.reset( 
new QgsMeshLayerRendererCache() );
 
 1127     case QgsMesh::ElementType::Vertex:
 
 1129     case QgsMesh::ElementType::Edge:
 
 1131     case QgsMesh::ElementType::Face:
 
 1141   else if ( mDataProvider )
 
 1150   else if ( mDataProvider )
 
 1158     return mNativeMesh->edgeCount();
 
 1159   else if ( mDataProvider )
 
 1164 void QgsMeshLayer::updateActiveDatasetGroups()
 
 1168   if ( !mDatasetGroupStore->datasetGroupTreeItem() )
 
 1178   if ( !activeScalarItem && treeItem->
childCount() > 0 )
 
 1179     activeScalarItem = treeItem->
child( 0 );
 
 1181   if ( activeScalarItem && !activeScalarItem->
isEnabled() )
 
 1183     for ( 
int i = 0; i < treeItem->
childCount(); ++i )
 
 1185       activeScalarItem = treeItem->
child( i );
 
 1189         activeScalarItem = 
nullptr;
 
 1193   if ( activeScalarItem )
 
 1201   if ( !( activeVectorItem && activeVectorItem->
isEnabled() ) )
 
 1212 void QgsMeshLayer::setDataSourcePrivate( 
const QString &dataSource, 
const QString &baseName, 
const QString &provider, 
const QgsDataProvider::ProviderOptions &options, QgsDataProvider::ReadFlags flags )
 
 1218   if ( !
mDataSource.isEmpty() && !provider.isEmpty() )
 
 1219     setDataProvider( provider, options, 
flags );
 
 1224   switch ( elementType )
 
 1227       return snapOnVertex( point, searchRadius );
 
 1229       return snapOnEdge( point, searchRadius );
 
 1231       return snapOnFace( point, searchRadius );
 
 1252   context.
lastScope()->
setVariable( QStringLiteral( 
"_mesh_layer" ), QVariant::fromValue( 
this ) );
 
 1254   expression.
prepare( &context );
 
 1256   for ( 
int i = 0; i < mNativeMesh->vertexCount(); ++i )
 
 1260     if ( expression.
evaluate( &context ).toBool() )
 
 1283   context.
lastScope()->
setVariable( QStringLiteral( 
"_mesh_layer" ), QVariant::fromValue( 
this ) );
 
 1285   expression.
prepare( &context );
 
 1287   for ( 
int i = 0; i < mNativeMesh->faceCount(); ++i )
 
 1291     if ( expression.
evaluate( &context ).toBool() )
 
 1327   return mSimplificationSettings;
 
 1332   mSimplificationSettings = simplifySettings;
 
 1343   props[
"color1"] = 
"13,8,135,255";
 
 1344   props[
"color2"] = 
"240,249,33,255";
 
 1346     "0.0196078;27,6,141,255:0.0392157;38,5,145,255:0.0588235;47,5,150,255:0.0784314;56,4,154,255:0.0980392;65,4,157,255:" 
 1347     "0.117647;73,3,160,255:0.137255;81,2,163,255:0.156863;89,1,165,255:0.176471;97,0,167,255:0.196078;105,0,168,255:" 
 1348     "0.215686;113,0,168,255:0.235294;120,1,168,255:0.254902;128,4,168,255:0.27451;135,7,166,255:0.294118;142,12,164,255:" 
 1349     "0.313725;149,17,161,255:0.333333;156,23,158,255:0.352941;162,29,154,255:0.372549;168,34,150,255:0.392157;174,40,146,255:" 
 1350     "0.411765;180,46,141,255:0.431373;186,51,136,255:0.45098;191,57,132,255:0.470588;196,62,127,255:0.490196;201,68,122,255:" 
 1351     "0.509804;205,74,118,255:0.529412;210,79,113,255:0.54902;214,85,109,255:0.568627;218,91,105,255:0.588235;222,97,100,255:" 
 1352     "0.607843;226,102,96,255:0.627451;230,108,92,255:0.647059;233,114,87,255:0.666667;237,121,83,255:0.686275;240,127,79,255:" 
 1353     "0.705882;243,133,75,255:0.72549;245,140,70,255:0.745098;247,147,66,255:0.764706;249,154,62,255:0.784314;251,161,57,255:" 
 1354     "0.803922;252,168,53,255:0.823529;253,175,49,255:0.843137;254,183,45,255:0.862745;254,190,42,255:0.882353;253,198,39,255:" 
 1355     "0.901961;252,206,37,255:0.921569;251,215,36,255:0.941176;248,223,37,255:0.960784;246,232,38,255:0.980392;243,240,39,255";
 
 1359 void QgsMeshLayer::assignDefaultStyleToDatasetGroup( 
int groupIndex )
 
 1362   const double groupMin = 
metadata.minimum();
 
 1363   const double groupMax = 
metadata.maximum();
 
 1366   fcn.classifyColorRamp( 5, -1, 
QgsRectangle(), 
nullptr );
 
 1393   createSimplifiedMeshes();
 
 1396   if ( !mRendererCache )
 
 1397     mRendererCache.reset( 
new QgsMeshLayerRendererCache() );
 
 1405   Q_UNUSED( errorMessage )
 
 1408   const QDomElement elem = node.toElement();
 
 1412   const QDomElement elemRendererSettings = elem.firstChildElement( 
"mesh-renderer-settings" );
 
 1413   if ( !elemRendererSettings.isNull() )
 
 1414     mRendererSettings.
readXml( elemRendererSettings, context );
 
 1416   const QDomElement elemSimplifySettings = elem.firstChildElement( 
"mesh-simplify-settings" );
 
 1417   if ( !elemSimplifySettings.isNull() )
 
 1418     mSimplificationSettings.
readXml( elemSimplifySettings, context );
 
 1421   const QDomNode blendModeNode = node.namedItem( QStringLiteral( 
"blendMode" ) );
 
 1422   if ( !blendModeNode.isNull() )
 
 1424     const QDomElement e = blendModeNode.toElement();
 
 1431     const QDomNode layerOpacityNode = node.namedItem( QStringLiteral( 
"layerOpacity" ) );
 
 1432     if ( !layerOpacityNode.isNull() )
 
 1434       const QDomElement e = layerOpacityNode.toElement();
 
 1445   Q_UNUSED( errorMessage )
 
 1448   QDomElement elem = node.toElement();
 
 1452   const QDomElement elemRendererSettings = mRendererSettings.
writeXml( doc, context );
 
 1453   elem.appendChild( elemRendererSettings );
 
 1455   const QDomElement elemSimplifySettings = mSimplificationSettings.
writeXml( doc, context );
 
 1456   elem.appendChild( elemSimplifySettings );
 
 1459   QDomElement blendModeElement  = doc.createElement( QStringLiteral( 
"blendMode" ) );
 
 1461   blendModeElement.appendChild( blendModeText );
 
 1462   node.appendChild( blendModeElement );
 
 1467     QDomElement layerOpacityElem  = doc.createElement( QStringLiteral( 
"layerOpacity" ) );
 
 1468     const QDomText layerOpacityText = doc.createTextNode( QString::number( 
opacity() ) );
 
 1469     layerOpacityElem.appendChild( layerOpacityText );
 
 1470     node.appendChild( layerOpacityElem );
 
 1478   return writeSymbology( node, doc, errorMessage, context, categories );
 
 1483   return readSymbology( node, errorMessage, context, categories );
 
 1489   if ( provider == QLatin1String( 
"mdal" ) )
 
 1511   const QDomNode pkeyNode = layer_node.namedItem( QStringLiteral( 
"provider" ) );
 
 1513   if ( pkeyNode.isNull() )
 
 1519     const QDomElement pkeyElt = pkeyNode.toElement();
 
 1529   QgsDataProvider::ReadFlags 
flags = QgsDataProvider::ReadFlags();
 
 1535   const QDomElement elemExtraDatasets = layer_node.firstChildElement( QStringLiteral( 
"extra-datasets" ) );
 
 1536   if ( !elemExtraDatasets.isNull() )
 
 1538     QDomElement elemUri = elemExtraDatasets.firstChildElement( QStringLiteral( 
"uri" ) );
 
 1539     while ( !elemUri.isNull() )
 
 1542       mExtraDatasetUri.append( uri );
 
 1543       elemUri = elemUri.nextSiblingElement( QStringLiteral( 
"uri" ) );
 
 1547   if ( pkeyNode.toElement().hasAttribute( QStringLiteral( 
"time-unit" ) ) )
 
 1548     mTemporalUnit = 
static_cast<QgsUnitTypes::TemporalUnit>( pkeyNode.toElement().attribute( QStringLiteral( 
"time-unit" ) ).toInt() );
 
 1551   const QDomElement elemDatasetGroupsStore = layer_node.firstChildElement( QStringLiteral( 
"mesh-dataset-groups-store" ) );
 
 1552   if ( elemDatasetGroupsStore.isNull() )
 
 1555     mDatasetGroupStore->readXml( elemDatasetGroupsStore, context );
 
 1562   if ( !mTemporalProperties->
timeExtent().begin().isValid() )
 
 1566   const QDomElement elemStaticDataset = layer_node.firstChildElement( QStringLiteral( 
"static-active-dataset" ) );
 
 1567   if ( elemStaticDataset.hasAttribute( QStringLiteral( 
"scalar" ) ) )
 
 1569     mStaticScalarDatasetIndex = elemStaticDataset.attribute( QStringLiteral( 
"scalar" ) ).toInt();
 
 1571   if ( elemStaticDataset.hasAttribute( QStringLiteral( 
"vector" ) ) )
 
 1573     mStaticVectorDatasetIndex = elemStaticDataset.attribute( QStringLiteral( 
"vector" ) ).toInt();
 
 1582   QDomElement mapLayerNode = layer_node.toElement();
 
 1584   if ( mapLayerNode.isNull() || ( QLatin1String( 
"maplayer" ) != mapLayerNode.nodeName() ) )
 
 1593   if ( mDataProvider )
 
 1595     QDomElement provider  = document.createElement( QStringLiteral( 
"provider" ) );
 
 1596     const QDomText providerText = document.createTextNode( 
providerType() );
 
 1597     provider.appendChild( providerText );
 
 1598     layer_node.appendChild( provider );
 
 1601     const QStringList extraDatasetUris = mDataProvider->
extraDatasets();
 
 1602     QDomElement elemExtraDatasets = document.createElement( QStringLiteral( 
"extra-datasets" ) );
 
 1603     for ( 
const QString &uri : extraDatasetUris )
 
 1606       QDomElement elemUri = document.createElement( QStringLiteral( 
"uri" ) );
 
 1607       elemUri.appendChild( document.createTextNode( path ) );
 
 1608       elemExtraDatasets.appendChild( elemUri );
 
 1610     layer_node.appendChild( elemExtraDatasets );
 
 1613   QDomElement elemStaticDataset = document.createElement( QStringLiteral( 
"static-active-dataset" ) );
 
 1614   elemStaticDataset.setAttribute( QStringLiteral( 
"scalar" ), mStaticScalarDatasetIndex );
 
 1615   elemStaticDataset.setAttribute( QStringLiteral( 
"vector" ), mStaticVectorDatasetIndex );
 
 1616   layer_node.appendChild( elemStaticDataset );
 
 1620     layer_node.appendChild( mDatasetGroupStore->writeXml( document, context ) );
 
 1624   return writeSymbology( layer_node, document, errorMsg, context );
 
 1629   if ( !mMeshEditor && mDataProvider && mDataProvider->
isValid() )
 
 1635       mNativeMesh.reset( 
new QgsMesh );
 
 1640     mTriangularMeshes.clear();
 
 1643     mRendererCache.reset( 
new QgsMeshLayerRendererCache() );
 
 1649   if ( mDataProvider )
 
 1652     return QStringList();
 
 1658   QString myMetadata = QStringLiteral( 
"<html>\n<body>\n" );
 
 1663   myMetadata += QStringLiteral( 
"<h1>" ) + tr( 
"Information from provider" ) + QStringLiteral( 
"</h1>\n<hr>\n" );
 
 1664   myMetadata += QLatin1String( 
"<table class=\"list-view\">\n" );
 
 1667   myMetadata += QStringLiteral( 
"<tr><td class=\"highlight\">" ) + tr( 
"Extent" ) + QStringLiteral( 
"</td><td>" ) + 
extent().
toString() + QStringLiteral( 
"</td></tr>\n" );
 
 1670   QLocale locale = QLocale();
 
 1671   locale.setNumberOptions( locale.numberOptions() &= ~QLocale::NumberOption::OmitGroupSeparator );
 
 1675     myMetadata += QStringLiteral( 
"<tr><td class=\"highlight\">" )
 
 1676                   + tr( 
"Vertex count" ) + QStringLiteral( 
"</td><td>" )
 
 1678                   + QStringLiteral( 
"</td></tr>\n" );
 
 1679     myMetadata += QStringLiteral( 
"<tr><td class=\"highlight\">" )
 
 1680                   + tr( 
"Face count" ) + QStringLiteral( 
"</td><td>" )
 
 1681                   + ( locale.toString( 
static_cast<qlonglong
>( 
meshFaceCount() ) ) )
 
 1682                   + QStringLiteral( 
"</td></tr>\n" );
 
 1683     myMetadata += QStringLiteral( 
"<tr><td class=\"highlight\">" )
 
 1684                   + tr( 
"Edge count" ) + QStringLiteral( 
"</td><td>" )
 
 1685                   + ( locale.toString( 
static_cast<qlonglong
>( 
meshEdgeCount() ) ) )
 
 1686                   + QStringLiteral( 
"</td></tr>\n" );
 
 1687     myMetadata += QStringLiteral( 
"<tr><td class=\"highlight\">" )
 
 1688                   + tr( 
"Dataset groups count" ) + QStringLiteral( 
"</td><td>" )
 
 1690                   + QStringLiteral( 
"</td></tr>\n" );
 
 1694   myMetadata += QLatin1String( 
"</table>\n<br><br>" );
 
 1700   myMetadata += QStringLiteral( 
"<h1>" ) + tr( 
"Identification" ) + QStringLiteral( 
"</h1>\n<hr>\n" );
 
 1702   myMetadata += QLatin1String( 
"<br><br>\n" );
 
 1705   myMetadata += QStringLiteral( 
"<h1>" ) + tr( 
"Extent" ) + QStringLiteral( 
"</h1>\n<hr>\n" );
 
 1707   myMetadata += QLatin1String( 
"<br><br>\n" );
 
 1710   myMetadata += QStringLiteral( 
"<h1>" ) + tr( 
"Access" ) + QStringLiteral( 
"</h1>\n<hr>\n" );
 
 1712   myMetadata += QLatin1String( 
"<br><br>\n" );
 
 1715   myMetadata += QStringLiteral( 
"<h1>" ) + tr( 
"Contacts" ) + QStringLiteral( 
"</h1>\n<hr>\n" );
 
 1717   myMetadata += QLatin1String( 
"<br><br>\n" );
 
 1720   myMetadata += QStringLiteral( 
"<h1>" ) + tr( 
"Links" ) + QStringLiteral( 
"</h1>\n<hr>\n" );
 
 1722   myMetadata += QLatin1String( 
"<br><br>\n" );
 
 1725   myMetadata += QStringLiteral( 
"<h1>" ) + tr( 
"History" ) + QStringLiteral( 
"</h1>\n<hr>\n" );
 
 1727   myMetadata += QLatin1String( 
"<br><br>\n" );
 
 1729   myMetadata += QLatin1String( 
"\n</body>\n</html>\n" );
 
 1735   return mMeshEditor != 
nullptr;
 
 1740   mDatasetGroupStore->setPersistentProvider( 
nullptr, QStringList() );
 
 1742   delete mDataProvider;
 
 1748   if ( !mDataProvider )
 
 1750     QgsDebugMsgLevel( QStringLiteral( 
"Unable to get mesh data provider" ), 2 );
 
 1754   mDataProvider->setParent( 
this );
 
 1755   QgsDebugMsgLevel( QStringLiteral( 
"Instantiated the mesh data provider plugin" ), 2 );
 
 1764   if ( !mTemporalProperties->
isValid() )
 
 1771   mDatasetGroupStore->setPersistentProvider( mDataProvider, mExtraDatasetUri );
 
 1775   if ( provider == QLatin1String( 
"mesh_memory" ) )
 
 1784     int globalIndex = mDatasetGroupStore->globalDatasetGroupIndexInSource( mDataProvider, i );
 
 1785     if ( globalIndex != -1 &&
 
 1787       assignDefaultStyleToDatasetGroup( globalIndex );
 
 1800   return mTemporalProperties;
 
@ TooManyVerticesInFace
A face has more vertices than the maximum number supported per face.
@ InvalidFace
An error occurs due to an invalid face (for example, vertex indexes are unordered)
@ UniqueSharedVertex
A least two faces share only one vertices.
@ ManifoldFace
ManifoldFace.
@ InvalidVertex
An error occurs due to an invalid vertex (for example, vertex index is out of range the available ver...
@ FlatFace
A flat face is present.
A ramp shader will color a raster pixel based on a list of values ranges in a ramp.
@ EqualInterval
Uses equal interval.
QgsColorRamp * sourceColorRamp() const
Returns the source color ramp.
@ Exact
Assigns the color of the exact matching value in the color ramp item list.
void setClassificationMode(ClassificationMode classificationMode)
Sets classification mode.
void setColorRampItemList(const QList< QgsColorRampShader::ColorRampItem > &list)
Sets a custom colormap.
void setColorRampType(QgsColorRampShader::Type colorRampType)
Sets the color ramp type.
Abstract base class for color ramps.
virtual QColor color(double value) const =0
Returns the color corresponding to a specified value.
Contains information about the context in which a coordinate transform is executed.
bool hasTemporalCapabilities() const
Returns true if the provider has temporal capabilities available.
@ FlagLoadDefaultStyle
Reset the layer's style to the default for the datasource.
@ FlagTrustDataSource
Trust datasource config (primary key unicity, geometry type and srid, etc). Improves provider load ti...
QgsCoordinateTransformContext transformContext() const
Returns data provider coordinate transform context.
virtual QgsCoordinateReferenceSystem crs() const =0
Returns the coordinate system for the data source.
void dataChanged()
Emitted whenever a change is made to the data provider which may have caused changes in the provider'...
virtual bool isValid() const =0
Returns true if this is a valid layer.
virtual QStringList subLayers() const
Sub-layers handled by this provider, in order from bottom to top.
virtual void reloadData()
Reloads the data from the source for providers with data caches to synchronize, changes in the data s...
virtual QgsRectangle extent() const =0
Returns the extent of the layer.
virtual void setTransformContext(const QgsCoordinateTransformContext &transformContext)
Sets data coordinate transform context to transformContext.
void setVariable(const QString &name, const QVariant &value, bool isStatic=false)
Convenience method for setting a variable in the context scope by name name and value.
static QgsExpressionContextScope * meshExpressionScope(QgsMesh::ElementType elementType)
Creates a new scope which contains functions relating to mesh layer element elementType.
Expression contexts are used to encapsulate the parameters around which a QgsExpression should be eva...
QgsExpressionContextScope * lastScope()
Returns the last scope added to the context.
void appendScope(QgsExpressionContextScope *scope)
Appends a scope to the end of the context.
Class for parsing and evaluation of expressions (formerly called "search strings").
bool prepare(const QgsExpressionContext *context)
Gets the expression ready for evaluation - find out column indexes.
QVariant evaluate()
Evaluate the feature and return the result.
static QgsColorRamp * create(const QVariantMap &properties=QVariantMap())
Creates a new QgsColorRamp from a map of properties.
Class defining color to render mesh datasets.
Represents a simple line renderer with width and color varying depending on values.
Represents a width than can vary depending on values.
void setMaximumValue(double maximumValue)
Sets the maximum value used to defined the variable width.
void setMinimumValue(double minimumValue)
Sets the minimum value used to defined the variable width.
A representation of the interval between two datetime values.
double seconds() const
Returns the interval duration in seconds.
static QString typeToString(QgsMapLayerType type)
Converts a map layer type to a string value.
static QgsMapLayerLegend * defaultMeshLegend(QgsMeshLayer *ml)
Create new legend implementation for mesh layer.
Base class for utility classes that encapsulate information necessary for rendering of map layers.
Base class for storage of map layer temporal properties.
virtual void setDefaultsFromDataProviderTemporalCapabilities(const QgsDataProviderTemporalCapabilities *capabilities)=0
Sets the layers temporal settings to appropriate defaults based on a provider's temporal capabilities...
Base class for all map layer types.
virtual bool isSpatial() const
Returns true if the layer is considered a spatial layer, ie it has some form of geometry associated w...
void editingStopped()
Emitted when edited changes have been successfully written to the data provider.
QString source() const
Returns the source for the layer.
void setBlendMode(QPainter::CompositionMode blendMode)
Set the blending mode used for rendering a layer.
void trigger3DUpdate()
Will advise any 3D maps that this layer requires to be updated in the scene.
QgsMapLayer::LayerFlags flags() const
Returns the flags for this layer.
void editingStarted()
Emitted when editing on this layer has started.
virtual QString loadDefaultStyle(bool &resultFlag)
Retrieve the default style for this layer if one exists (either as a .qml file on disk or as a record...
QString mLayerName
Name of the layer - used for display.
void triggerRepaint(bool deferredUpdate=false)
Will advise the map canvas (and any other interested party) that this layer requires to be repainted.
QString crsHtmlMetadata() const
Returns a HTML fragment containing the layer's CRS metadata, for use in the htmlMetadata() method.
QgsLayerMetadata metadata
QPainter::CompositionMode blendMode() const
Returns the current blending mode for a layer.
virtual void setOpacity(double opacity)
Sets the opacity for the layer, where opacity is a value between 0 (totally transparent) and 1....
QString mProviderKey
Data provider key (name of the data provider)
QgsCoordinateTransformContext transformContext() const
Returns the layer data provider coordinate transform context or a default transform context if the la...
void rendererChanged()
Signal emitted when renderer is changed.
virtual QgsError error() const
Gets current status error.
void dataSourceChanged()
Emitted whenever the layer's data source has been changed.
virtual QgsMapLayer * clone() const =0
Returns a new instance equivalent to this one except for the id which is still unique.
void emitStyleChanged()
Triggers an emission of the styleChanged() signal.
void dataChanged()
Data of layer changed.
QString mDataSource
Data source description string, varies by layer type.
@ FlagTrustLayerMetadata
Trust layer metadata. Improves layer load time by skipping expensive checks like primary key unicity,...
@ FlagDontResolveLayers
Don't resolve layer paths or create data providers for layers.
void setValid(bool valid)
Sets whether layer is valid or not.
void readCommonStyle(const QDomElement &layerElement, const QgsReadWriteContext &context, StyleCategories categories=AllStyleCategories)
Read style data common to all layer types.
QgsMapLayer::ReadFlags mReadFlags
Read flags. It's up to the subclass to respect these when restoring state from XML.
void setLegend(QgsMapLayerLegend *legend)
Assign a legend controller to the map layer.
@ Rendering
Rendering: scale visibility, simplify method, opacity.
void layerModified()
Emitted when modifications has been done on layer.
void setProviderType(const QString &providerType)
Sets the providerType (provider key)
QString generalHtmlMetadata() const
Returns an HTML fragment containing general metadata information, for use in the htmlMetadata() metho...
void writeCommonStyle(QDomElement &layerElement, QDomDocument &document, const QgsReadWriteContext &context, StyleCategories categories=AllStyleCategories) const
Write style data common to all layer types.
void invalidateWgs84Extent()
Invalidates the WGS84 extent.
bool mShouldValidateCrs
true if the layer's CRS should be validated and invalid CRSes are not permitted.
void setCrs(const QgsCoordinateReferenceSystem &srs, bool emitSignal=true)
Sets layer's spatial reference system.
Abstract class to interpolate 3d stacked mesh data to 2d data.
QgsMeshDataBlock calculate(const QgsMesh3dDataBlock &block3d, QgsFeedback *feedback=nullptr) const
Calculated 2d block values from 3d stacked mesh values.
QgsMesh3dDataBlock is a block of 3d stacked mesh data related N faces defined on base mesh frame.
QgsMeshDataBlock is a block of integers/doubles that can be used to retrieve: active flags (e....
QgsMeshDatasetValue value(int index) const
Returns a value represented by the index For active flag the behavior is undefined.
bool isValid() const
Whether the block is valid.
QgsUnitTypes::TemporalUnit temporalUnit() const
Returns the temporal unit used to read data by the data provider.
QDateTime referenceTime() const
Returns the reference time.
MatchingTemporalDatasetMethod
Method for selection of temporal mesh dataset from a range time.
qint64 firstTimeStepDuration(int group) const
Returns the duration of the first time step of the dataset group with index group.
Base class for providing data for QgsMeshLayer.
virtual QgsMeshDriverMetadata driverMetadata() const
Returns the mesh driver metadata of the provider.
QgsMeshDataProviderTemporalCapabilities * temporalCapabilities() override
Returns the provider's temporal capabilities.
void setTemporalUnit(QgsUnitTypes::TemporalUnit unit)
Sets the temporal unit of the provider and reload data if it changes.
virtual void close()=0
Closes the data provider and free every resources used.
virtual int vertexCount() const =0
Returns number of vertices in the native mesh.
virtual void populateMesh(QgsMesh *mesh) const =0
Populates the mesh vertices, edges and faces.
virtual bool saveMeshFrame(const QgsMesh &mesh)=0
Saves the mesh frame to the source.
virtual int edgeCount() const =0
Returns number of edges in the native mesh.
virtual int faceCount() const =0
Returns number of faces in the native mesh.
Class used to register and access all the dataset groups related to a mesh layer.
void datasetGroupsAdded(QList< int > indexes)
Emitted after dataset groups are added.
Tree item for display of the mesh dataset groups.
int childCount() const
Returns the count of children.
int datasetGroupIndex() const
QgsMeshDatasetGroupTreeItem * childFromDatasetGroupIndex(int index)
Returns the child with dataset group index Searches as depper as needed on the child hierarchy.
QgsMeshDatasetGroupTreeItem * child(int row) const
Returns a child.
Abstract class that represents a dataset group.
QgsMeshDatasetIndex is index that identifies the dataset group (e.g.
bool isValid() const
Returns whether index is valid, ie at least groups is set.
int group() const
Returns a group index.
int dataset() const
Returns a dataset index within group()
virtual int datasetGroupCount() const =0
Returns number of datasets groups loaded.
virtual QStringList extraDatasets() const =0
Returns list of additional dataset file URIs added using addDataset() calls.
QgsMeshDatasetValue represents single dataset value.
double y() const
Returns y value.
double x() const
Returns x value.
Class that represents an error during mesh editing.
Qgis::MeshEditingErrorType errorType
Class that makes edit operation on a mesh.
QgsMeshEditingError initialize()
Initialize the mesh editor and return errors if the internal native mesh have topologic errors.
int validFacesCount() const
Returns the count of valid faces, that is non void faces in the mesh.
bool checkConsistency(QgsMeshEditingError &error) const
Return true if the edited mesh is consistent.
QgsRectangle extent() const
Returns the extent of the edited mesh.
int maximumVerticesPerFace() const
Returns the maximum count of vertices per face that the mesh can support.
void stopEditing()
Stops editing.
void meshEdited()
Emitted when the mesh is edited.
void resetTriangularMesh(QgsTriangularMesh *triangularMesh)
Resets the triangular mesh.
bool isModified() const
Returns whether the mesh has been modified.
int validVerticesCount() const
Returns the count of valid vertices, that is non void vertices in the mesh.
bool reindex(bool renumbering)
Reindexes the mesh, that is remove unusued index of face and vertices, this operation void the undo/r...
QgsMeshDatasetGroup * createZValueDatasetGroup()
Creates and returns a scalar dataset group with value on vertex that is can be used to access the Z v...
Implementation of threaded rendering for mesh layers.
Implementation of map layer temporal properties for mesh layers.
QDateTime referenceTime() const
Returns the reference time.
bool isValid() const
Returns whether the instance is valid.
void setMatchingMethod(const QgsMeshDataProviderTemporalCapabilities::MatchingTemporalDatasetMethod &matchingMethod)
Sets the method used to match dataset from temporal capabilities.
QgsMeshDataProviderTemporalCapabilities::MatchingTemporalDatasetMethod matchingMethod() const
Returns the method used to match dataset from temporal capabilities.
void setReferenceTime(const QDateTime &referenceTime, const QgsDataProviderTemporalCapabilities *capabilities)
Sets the reference time and update the time extent from the temporal capabilities,...
void setDefaultsFromDataProviderTemporalCapabilities(const QgsDataProviderTemporalCapabilities *capabilities) override
Sets the layers temporal settings to appropriate defaults based on a provider's temporal capabilities...
QgsDateTimeRange timeExtent() const
Returns the time extent.
Represents a mesh layer supporting display of data on structured or unstructured meshes.
QList< int > selectVerticesByExpression(QgsExpression expression)
Returns a list of vertex indexes that meet the condition defined by expression with the context expre...
void setMeshSimplificationSettings(const QgsMeshSimplificationSettings &meshSimplificationSettings)
Sets mesh simplification settings.
int datasetCount(const QgsMeshDatasetIndex &index) const
Returns the dataset count in the dataset groups.
QList< int > datasetGroupsIndexes() const
Returns the list of indexes of dataset groups handled by the layer.
void stopFrameEditing(const QgsCoordinateTransform &transform)
Stops edition of the mesh, re-indexes the faces and vertices, rebuilds the triangular mesh and its sp...
QgsRectangle extent() const override
Returns the extent of the layer.
void setStaticVectorDatasetIndex(const QgsMeshDatasetIndex &staticVectorDatasetIndex)
Sets the static vector dataset index that is rendered if the temporal properties is not active.
void setStaticScalarDatasetIndex(const QgsMeshDatasetIndex &staticScalarDatasetIndex)
Sets the static scalar dataset index that is rendered if the temporal properties is not active.
bool contains(const QgsMesh::ElementType &type) const
Returns whether the mesh contains at mesh elements of given type.
QgsMeshRendererSettings rendererSettings() const
Returns renderer settings.
QgsMesh3dDataBlock dataset3dValues(const QgsMeshDatasetIndex &index, int faceIndex, int count) const
Returns N vector/scalar values from the face index from the dataset for 3d stacked meshes.
QList< QgsMeshDatasetIndex > datasetIndexInRelativeTimeInterval(const QgsInterval &startRelativeTime, const QgsInterval &endRelativeTime, int datasetGroupIndex) const
Returns a list of dataset indexes from datasets group that are in a interval time from the layer refe...
void activeScalarDatasetGroupChanged(int index)
Emitted when active scalar group dataset is changed.
int datasetGroupCount() const
Returns the dataset groups count handle by the layer.
void updateTriangularMesh(const QgsCoordinateTransform &transform=QgsCoordinateTransform())
Gets native mesh and updates (creates if it doesn't exist) the base triangular mesh.
bool addDatasets(const QString &path, const QDateTime &defaultReferenceTime=QDateTime())
Adds datasets to the mesh from file with path.
bool isModified() const override
Returns whether the mesh frame has been modified since the last save.
void activeVectorDatasetGroupChanged(int index)
Emitted when active vector group dataset is changed.
void reload() override
Synchronises with changes in the datasource.
QgsMeshDatasetIndex activeScalarDatasetAtTime(const QgsDateTimeRange &timeRange) const
Returns dataset index from active scalar group depending on the time range.
QgsPointXY snapOnElement(QgsMesh::ElementType elementType, const QgsPointXY &point, double searchRadius)
Returns the position of the snapped point on the mesh element closest to point intersecting with the ...
bool readXml(const QDomNode &layer_node, QgsReadWriteContext &context) override
Called by readLayerXML(), used by children to read state specific to them from project files.
QStringList subLayers() const override
Returns the sublayers of this layer.
QgsMeshEditor * meshEditor()
Returns a pointer to the mesh editor own by the mesh layer.
void setDatasetGroupTreeRootItem(QgsMeshDatasetGroupTreeItem *rootItem)
Sets the root items of the dataset group tree item.
QgsMeshDatasetValue dataset1dValue(const QgsMeshDatasetIndex &index, const QgsPointXY &point, double searchRadius) const
Returns the value of 1D mesh dataset defined on edge that are in the search area defined by point ans...
QgsMesh * nativeMesh()
Returns native mesh (nullptr before rendering or calling to updateMesh)
QString loadDefaultStyle(bool &resultFlag) FINAL
Retrieve the default style for this layer if one exists (either as a .qml file on disk or as a record...
QgsTriangularMesh * triangularMeshByLodIndex(int lodIndex) const
Returns triangular corresponding to the index of level of details.
QString htmlMetadata() const override
Obtain a formatted HTML string containing assorted metadata for this layer.
int meshFaceCount() const
Returns the faces count of the mesh frame.
QList< int > selectFacesByExpression(QgsExpression expression)
Returns a list of faces indexes that meet the condition defined by expression with the context expres...
QgsMesh3dDataBlock dataset3dValue(const QgsMeshDatasetIndex &index, const QgsPointXY &point) const
Returns the 3d values of stacked 3d mesh defined by the given point.
QgsMeshLayer * clone() const override
Returns a new instance equivalent to this one except for the id which is still unique.
void timeSettingsChanged()
Emitted when time format is changed.
QList< int > enabledDatasetGroupsIndexes() const
Returns the list of indexes of enables dataset groups handled by the layer.
void resetDatasetGroupTreeItem()
Reset the dataset group tree item to default from provider.
int triangularMeshLevelOfDetailCount() const
Returns the count of levels of detail of the mesh simplification.
bool rollBackFrameEditing(const QgsCoordinateTransform &transform, bool continueEditing=true)
Rolls Back edition of the mesh frame.
QString encodedSource(const QString &source, const QgsReadWriteContext &context) const override
Called by writeLayerXML(), used by derived classes to encode provider's specific data source to proje...
QgsMeshDatasetIndex staticVectorDatasetIndex() const
Returns the static vector dataset index that is rendered if the temporal properties is not active.
QgsMeshDatasetIndex datasetIndexAtRelativeTime(const QgsInterval &relativeTime, int datasetGroupIndex) const
Returns dataset index from datasets group depending on the relative time from the layer reference tim...
bool writeXml(QDomNode &layer_node, QDomDocument &doc, const QgsReadWriteContext &context) const override
Called by writeLayerXML(), used by children to write state specific to them to project files.
bool commitFrameEditing(const QgsCoordinateTransform &transform, bool continueEditing=true)
Commits edition of the mesh frame, Rebuilds the triangular mesh and its spatial index with transform,...
QgsMeshDataBlock datasetValues(const QgsMeshDatasetIndex &index, int valueIndex, int count) const
Returns N vector/scalar values from the index from the dataset.
bool writeStyle(QDomNode &node, QDomDocument &doc, QString &errorMessage, const QgsReadWriteContext &context, StyleCategories categories=AllStyleCategories) const override
Write just the symbology information for the layer into the document.
void setTransformContext(const QgsCoordinateTransformContext &transformContext) override
Sets the coordinate transform context to transformContext.
int meshEdgeCount() const
Returns the edges count of the mesh frame.
QgsMeshSimplificationSettings meshSimplificationSettings() const
Returns mesh simplification settings.
QgsMapLayerRenderer * createMapRenderer(QgsRenderContext &rendererContext) override
Returns new instance of QgsMapLayerRenderer that will be used for rendering of given context.
QgsMeshDatasetIndex activeVectorDatasetAtTime(const QgsDateTimeRange &timeRange) const
Returns dataset index from active vector group depending on the time range If the temporal properties...
bool isEditable() const override
Returns true if the layer can be edited.
QgsMeshDataBlock areFacesActive(const QgsMeshDatasetIndex &index, int faceIndex, int count) const
Returns whether the faces are active for particular dataset.
QgsMeshDatasetIndex staticScalarDatasetIndex() const
Returns the static scalar dataset index that is rendered if the temporal properties is not active.
bool isFaceActive(const QgsMeshDatasetIndex &index, int faceIndex) const
Returns N vector/scalar values from the face index from the dataset for 3d stacked meshes.
QgsMeshDatasetMetadata datasetMetadata(const QgsMeshDatasetIndex &index) const
Returns the dataset metadata.
bool saveDataset(const QString &path, int datasetGroupIndex, QString driver)
Saves datasets group on file with the specified driver.
bool supportsEditing() const override
Returns whether the layer supports editing or not.
QgsMeshDataProvider * dataProvider() override
Returns the layer's data provider, it may be nullptr.
QgsInterval firstValidTimeStep() const
Returns the first valid time step of the dataset groups, invalid QgInterval if no time step is presen...
QgsInterval datasetRelativeTime(const QgsMeshDatasetIndex &index)
Returns the relative time of the dataset from the reference time of its group.
QgsMeshDatasetIndex datasetIndexAtTime(const QgsDateTimeRange &timeRange, int datasetGroupIndex) const
Returns dataset index from datasets group depending on the time range.
bool startFrameEditing(const QgsCoordinateTransform &transform)
Starts edition of the mesh frame.
bool reindex(const QgsCoordinateTransform &transform, bool renumber)
Re-indexes the faces and vertices, and renumber the indexes if renumber is true.
QgsMeshDatasetValue datasetValue(const QgsMeshDatasetIndex &index, int valueIndex) const
Returns vector/scalar value associated with the index from the dataset To read multiple continuous va...
QgsMeshTimeSettings timeSettings() const
Returns time format settings.
QgsMapLayerTemporalProperties * temporalProperties() override
Returns the layer's temporal properties.
bool writeSymbology(QDomNode &node, QDomDocument &doc, QString &errorMessage, const QgsReadWriteContext &context, QgsMapLayer::StyleCategories categories=QgsMapLayer::AllStyleCategories) const override
int meshVertexCount() const
Returns the vertices count of the mesh frame.
void setReferenceTime(const QDateTime &referenceTime)
Sets the reference time of the layer.
bool readStyle(const QDomNode &node, QString &errorMessage, QgsReadWriteContext &context, StyleCategories categories=AllStyleCategories) override
Read the style for the current layer from the DOM node supplied.
int extraDatasetGroupCount() const
Returns the extra dataset groups count handle by the layer.
void setRendererSettings(const QgsMeshRendererSettings &settings)
Sets new renderer settings.
qint64 datasetRelativeTimeInMilliseconds(const QgsMeshDatasetIndex &index)
Returns the relative time (in milliseconds) of the dataset from the reference time of its group.
QgsTriangularMesh * triangularMesh(double minimumTriangleSize=0) const
Returns triangular mesh (nullptr before rendering or calling to updateMesh).
void setTemporalMatchingMethod(const QgsMeshDataProviderTemporalCapabilities::MatchingTemporalDatasetMethod &matchingMethod)
Sets the method used to match the temporal dataset from a requested time, see activeVectorDatasetAtTi...
QgsMeshDatasetGroupTreeItem * datasetGroupTreeRootItem() const
Returns the root items of the dataset group tree item.
bool readSymbology(const QDomNode &node, QString &errorMessage, QgsReadWriteContext &context, QgsMapLayer::StyleCategories categories=QgsMapLayer::AllStyleCategories) override
QString providerType() const
Returns the provider type for this layer.
QString decodedSource(const QString &source, const QString &provider, const QgsReadWriteContext &context) const override
Called by readLayerXML(), used by derived classes to decode provider's specific data source from proj...
QString formatTime(double hours)
Returns (date) time in hours formatted to human readable form.
QgsMeshDatasetGroupMetadata datasetGroupMetadata(const QgsMeshDatasetIndex &index) const
Returns the dataset groups metadata.
QgsMeshLayerRendererCache * rendererCache()
Returns native mesh (nullptr before rendering)
void setTimeSettings(const QgsMeshTimeSettings &settings)
Sets time format settings.
QgsMeshLayer(const QString &path=QString(), const QString &baseName=QString(), const QString &providerLib=QStringLiteral("mesh_memory"), const QgsMeshLayer::LayerOptions &options=QgsMeshLayer::LayerOptions())
Constructor - creates a mesh layer.
Represents a mesh renderer settings for mesh object.
void setEnabled(bool enabled)
Sets whether mesh structure rendering is enabled.
Represents a mesh renderer settings for scalar datasets.
void setClassificationMinimumMaximum(double minimum, double maximum)
Sets min/max values used for creation of the color ramp shader.
void setColorRampShader(const QgsColorRampShader &shader)
Sets color ramp shader function.
QgsColorRampShader colorRampShader() const
Returns color ramp shader function.
@ None
Does not use resampling.
@ NeighbourAverage
Does a simple average of values defined for all surrounding faces/vertices.
void setEdgeStrokeWidth(const QgsInterpolatedLineWidth &strokeWidth)
Sets the stroke width used to render edges scalar dataset.
void setDataResamplingMethod(const DataResamplingMethod &dataResamplingMethod)
Sets data interpolation method.
Represents all mesh renderer settings.
void setActiveVectorDatasetGroup(int activeVectorDatasetGroup)
Sets the active vector dataset group.
QgsMeshRendererScalarSettings scalarSettings(int groupIndex) const
Returns renderer settings.
int activeVectorDatasetGroup() const
Returns the active vector dataset group.
bool hasSettings(int datasetGroupIndex) const
Returns whether the group with index has render settings (scalar or vector)
int activeScalarDatasetGroup() const
Returns the active scalar dataset group.
QgsMesh3dAveragingMethod * averagingMethod() const
Returns averaging method for conversion of 3d stacked mesh data to 2d data.
void setActiveScalarDatasetGroup(int activeScalarDatasetGroup)
Sets the active scalar dataset group.
void readXml(const QDomElement &elem, const QgsReadWriteContext &context=QgsReadWriteContext())
Reads configuration from the given DOM element.
void setVectorSettings(int groupIndex, const QgsMeshRendererVectorSettings &settings)
Sets new renderer settings.
QDomElement writeXml(QDomDocument &doc, const QgsReadWriteContext &context=QgsReadWriteContext()) const
Writes configuration to a new DOM element.
void setScalarSettings(int groupIndex, const QgsMeshRendererScalarSettings &settings)
Sets new renderer settings.
void setNativeMeshSettings(const QgsMeshRendererMeshSettings &settings)
Sets new native mesh renderer settings, triggers repaint.
Represents a renderer settings for vector datasets.
void setColorRampShader(const QgsColorRampShader &colorRampShader)
Returns the color ramp shader used to render vector datasets.
Represents an overview renderer settings.
QDomElement writeXml(QDomDocument &doc, const QgsReadWriteContext &context) const
Writes configuration to a new DOM element.
void setEnabled(bool isEnabled)
Sets if the overview is active.
double reductionFactor() const
Returns the reduction factor used to build simplified mesh.
bool isEnabled() const
Returns if the overview is active.
void readXml(const QDomElement &elem, const QgsReadWriteContext &context)
Reads configuration from the given DOM element.
Represents a mesh time settings for mesh datasets.
static void logMessage(const QString &message, const QString &tag=QString(), Qgis::MessageLevel level=Qgis::MessageLevel::Warning, bool notifyUser=true)
Adds a message to the log instance (and creates it if necessary).
static QgsPainting::BlendMode getBlendModeEnum(QPainter::CompositionMode blendMode)
Returns a BlendMode corresponding to a QPainter::CompositionMode.
static QPainter::CompositionMode getCompositionMode(QgsPainting::BlendMode blendMode)
Returns a QPainter::CompositionMode corresponding to a BlendMode.
BlendMode
Blending modes enum defining the available composition modes that can be used when rendering a layer.
QString writePath(const QString &filename) const
Prepare a filename to save it to the project file.
QString readPath(const QString &filename) const
Turn filename read from the project file to an absolute path.
A class to represent a 2D point.
double distance(double x, double y) const SIP_HOLDGIL
Returns the distance between this point and a specified x, y coordinate.
double sqrDistToSegment(double x1, double y1, double x2, double y2, QgsPointXY &minDistPoint, double epsilon=DEFAULT_SEGMENT_EPSILON) const SIP_HOLDGIL
Returns the minimum distance between this point and a segment.
Point geometry type, with support for z-dimension and m-values.
double distance(double x, double y) const SIP_HOLDGIL
Returns the Cartesian 2D distance between this point and a specified x, y coordinate.
static QgsProviderRegistry * instance(const QString &pluginPath=QString())
Means of accessing canonical single instance.
virtual void setMaximumValue(double value)
Sets the maximum value for the raster shader.
virtual void setMinimumValue(double value)
Sets the minimum value for the raster shader.
The class is used as a container of context for various read/write operations on other objects.
const QgsPathResolver & pathResolver() const
Returns path resolver for conversion between relative and absolute paths.
A rectangle specified with double values.
QString toString(int precision=16) const
Returns a string representation of form xmin,ymin : xmax,ymax Coordinates will be truncated to the sp...
void setMinimal() SIP_HOLDGIL
Set a rectangle so that min corner is at max and max corner is at min.
Contains information about the context of a rendering operation.
QgsCoordinateTransform coordinateTransform() const
Returns the current coordinate transform for the context.
static QgsStyle * defaultStyle()
Returns default application-wide style.
QgsColorRamp * colorRamp(const QString &name) const
Returns a new copy of the specified color ramp.
bool isActive() const
Returns true if the temporal property is active.
void setIsActive(bool active)
Sets whether the temporal property is active.
static QgsMeshEditingError checkTopology(const QgsMesh &mesh, int maxVerticesPerFace)
Checks the topology of the mesh mesh, if error occurs, this mesh can't be edited.
Triangular/Derived Mesh is mesh with vertices in map coordinates.
const QVector< QgsMeshFace > & triangles() const
Returns triangles.
QList< int > edgeIndexesForRectangle(const QgsRectangle &rectangle) const
Finds indexes of edges intersecting given bounding box It uses spatial indexing.
const QVector< QgsMeshVertex > & vertices() const
Returns vertices in map coordinate system.
const QVector< QgsMeshEdge > & edges() const
Returns edges.
bool contains(const QgsMesh::ElementType &type) const
Returns whether the mesh contains mesh elements of given type.
const QVector< QgsMeshVertex > & faceCentroids() const
Returns centroids of the native faces in map CRS.
const QVector< int > & trianglesToNativeFaces() const
Returns mapping between triangles and original faces.
QList< int > faceIndexesForRectangle(const QgsRectangle &rectangle) const
Finds indexes of triangles intersecting given bounding box It uses spatial indexing.
int faceIndexForPoint_v2(const QgsPointXY &point) const
Finds index of triangle at given point It uses spatial indexing and don't use geos to be faster.
TemporalUnit
Temporal units.
@ TemporalMilliseconds
Milliseconds.
QgsMapLayerType
Types of layers that can be added to a map.
CORE_EXPORT QgsMeshVertex centroid(const QgsMeshFace &face, const QVector< QgsMeshVertex > &vertices)
Returns the centroid of the face.
#define QgsDebugMsgLevel(str, level)
QVector< int > QgsMeshFace
List of vertex indexes.
QPair< int, int > QgsMeshEdge
Edge is a straight line seqment between 2 points.
#define INVALID_MESHLAYER_TIME
Setting options for creating vector data providers.
Setting options for loading mesh layers.
QgsCoordinateTransformContext transformContext
Coordinate transform context.
bool loadDefaultStyle
Set to true if the default layer style should be loaded.
bool skipCrsValidation
Controls whether the layer is allowed to have an invalid/unknown CRS.
Mesh - vertices, edges and faces.
ElementType
Defines type of mesh elements.