31#include "moc_qgsmeshlayer.cpp"
54 const QString &baseName,
55 const QString &providerKey,
70 QgsMeshLayer::setDataSourcePrivate( meshLayerPath, baseName, providerKey, providerOptions,
flags );
83void QgsMeshLayer::createSimplifiedMeshes()
87 if ( mSimplificationSettings.
isEnabled() && !hasSimplifiedMeshes() )
89 const double reductionFactor = mSimplificationSettings.
reductionFactor();
91 QVector<QgsTriangularMesh *> simplifyMeshes =
92 mTriangularMeshes[0]->simplifyMesh( reductionFactor );
94 for (
int i = 0; i < simplifyMeshes.count() ; ++i )
96 mTriangularMeshes.emplace_back( simplifyMeshes[i] );
101bool QgsMeshLayer::hasSimplifiedMeshes()
const
106 return ( mTriangularMeshes.size() > 1 );
112 delete mDataProvider;
119 return mDataProvider;
126 return mDataProvider;
141 layer->mElevationProperties = mElevationProperties->
clone();
142 layer->mElevationProperties->setParent( layer );
158 return mMeshEditor->
extent();
161 return mDataProvider->
extent();
174 if ( !mDataProvider )
191 for (
const int index : groupsList )
192 assignDefaultStyleToDatasetGroup( index );
196 if ( !groupsList.isEmpty() )
202 if ( meta.
maximum() == std::numeric_limits<double>::quiet_NaN() &&
203 meta.
minimum() == std::numeric_limits<double>::quiet_NaN() )
214 for (
const int i : groupsList )
216 assignDefaultStyleToDatasetGroup( i );
235 applyClassificationOnScalarSettings( meta, scalarSettings );
240 if ( !groupsList.isEmpty() )
251 const int index = mDatasetGroupStore->indexFromGroupName(
name );
260 mDatasetGroupStore->removeDatasetGroup( index );
262 if ( mExtraDatasetUri.contains( groupMetadata.
uri() ) )
264 mExtraDatasetUri.removeOne( groupMetadata.
uri() );
279 if ( mDatasetGroupStore->addPersistentDatasets( path ) )
281 mExtraDatasetUri.append( path );
283 if ( !isTemporalBefore && temporalCapabilities->hasTemporalCapabilities() )
286 temporalCapabilities );
290 QDateTime referenceTime = defaultReferenceTime;
291 if ( !defaultReferenceTime.isValid() )
292 referenceTime = QDateTime( QDate::currentDate(), QTime( 0, 0, 0 ), Qt::UTC );
309 if ( mDatasetGroupStore->addDatasetGroup( datasetGroup ) )
321 return mDatasetGroupStore->saveDatasetGroup( path, datasetGroupIndex, driver );
328 return mNativeMesh.get();
335 return mNativeMesh.get();
342 for (
const std::unique_ptr<QgsTriangularMesh> &lod : mTriangularMeshes )
344 if ( lod && lod->averageTriangleSize() > minimumTriangleSize )
348 if ( !mTriangularMeshes.empty() )
349 return mTriangularMeshes.back().get();
358 return mTriangularMeshes.size();
365 if ( mTriangularMeshes.empty() )
368 return mTriangularMeshes.front().get();
370 if ( lodIndex >=
int( mTriangularMeshes.size() ) )
371 return mTriangularMeshes.back().get();
373 return mTriangularMeshes.at( lodIndex ).get();
388 if ( mTriangularMeshes.empty() )
391 mTriangularMeshes.emplace_back( baseMesh );
394 if ( mTriangularMeshes[0].get()->update( mNativeMesh.get(), transform ) )
395 mTriangularMeshes.resize( 1 );
397 createSimplifiedMeshes();
404 return mRendererCache.get();
411 return mRendererSettings;
420 mRendererSettings = settings;
440 return mTimeSettings;
447 mTimeSettings = settings;
456 return QgsMeshLayerUtils::formatTime( hours, mTemporalProperties->
referenceTime(), mTimeSettings );
458 return QgsMeshLayerUtils::formatTime( hours, QDateTime(), mTimeSettings );
465 return mDatasetGroupStore->datasetGroupCount();
472 return mDatasetGroupStore->extraDatasetGroupCount();
479 return mDatasetGroupStore->datasetGroupIndexes();
486 return mDatasetGroupStore->enabledDatasetGroupIndexes();
493 return mDatasetGroupStore->datasetGroupMetadata( index );
500 return mDatasetGroupStore->datasetCount( index.
group() );
507 return mDatasetGroupStore->datasetMetadata( index );
514 return mDatasetGroupStore->datasetValue( index, valueIndex );
521 return mDatasetGroupStore->datasetValues( index, valueIndex, count );
528 return mDatasetGroupStore->dataset3dValues( index, faceIndex, count );
535 return mDatasetGroupStore->areFacesActive( index, faceIndex, count );
542 return mDatasetGroupStore->isFaceActive( index, faceIndex );
556 const QgsRectangle searchRectangle( point.
x() - searchRadius, point.
y() - searchRadius, point.
x() + searchRadius, point.
y() + searchRadius );
560 if ( faceIndex >= 0 )
577 const int v1 = face[0], v2 = face[1], v3 = face[2];
582 const double x = QgsMeshLayerUtils::interpolateFromVerticesData( p1, p2, p3, val1.
x(), val2.
x(), val3.
x(), point );
583 double y = std::numeric_limits<double>::quiet_NaN();
586 y = QgsMeshLayerUtils::interpolateFromVerticesData( p1, p2, p3, val1.
y(), val2.
y(), val3.
y(), point );
601 value = block2d.
value( 0 );
631 if ( faceIndex >= 0 )
647 const int selectedIndex = closestEdge( point, searchRadius, projectedPoint );
649 if ( selectedIndex >= 0 )
663 const int v1 = edge.first, v2 = edge.second;
667 const double edgeLength = p1.
distance( p2 );
668 const double dist1 = p1.
distance( projectedPoint.
x(), projectedPoint.
y() );
669 value = QgsMeshLayerUtils::interpolateFromVerticesData( dist1 / edgeLength, val1, val2 );
693 if ( ! mTemporalProperties->
isActive() )
696 const QDateTime layerReferenceTime = mTemporalProperties->
referenceTime();
697 QDateTime utcTime = timeRange.
begin();
698 if ( utcTime.timeSpec() != Qt::UTC )
699 utcTime.setTimeSpec( Qt::UTC );
700 const qint64 startTime = layerReferenceTime.msecsTo( utcTime );
702 return mDatasetGroupStore->datasetIndexAtTime( startTime, datasetGroupIndex, mTemporalProperties->
matchingMethod() );
709 return mDatasetGroupStore->datasetIndexAtTime( relativeTime.
seconds() * 1000, datasetGroupIndex, mTemporalProperties->
matchingMethod() );
716 qint64 usedRelativeTime1 = startRelativeTime.
seconds() * 1000;
717 qint64 usedRelativeTime2 = endRelativeTime.
seconds() * 1000;
729 return mDatasetGroupStore->datasetIndexInTimeInterval( usedRelativeTime1, usedRelativeTime2, datasetGroupIndex );
736 if ( meta.
extraOptions().contains( QStringLiteral(
"classification" ) ) )
740 const QStringList classes = meta.
extraOptions()[QStringLiteral(
"classification" )].split( QStringLiteral(
";;" ) );
743 if ( meta.
extraOptions().contains( QStringLiteral(
"units" ) ) )
744 units = meta.
extraOptions()[ QStringLiteral(
"units" )];
746 QVector<QVector<double>> bounds;
747 for (
const QString &classe : classes )
749 const QStringList boundsStr = classe.split(
',' );
750 QVector<double> bound;
751 for (
const QString &boundStr : boundsStr )
752 bound.append( boundStr.toDouble() );
753 bounds.append( bound );
756 if ( ( bounds.count() == 1 && bounds.first().count() > 2 ) ||
757 ( bounds.count() > 1 ) )
759 const QVector<double> firstClass = bounds.first();
760 const QVector<double> lastClass = bounds.last();
761 const double minValue = firstClass.count() > 1 ? ( firstClass.first() + firstClass.last() ) / 2 : firstClass.first();
762 const double maxValue = lastClass.count() > 1 ? ( lastClass.first() + lastClass.last() ) / 2 : lastClass.first();
763 const double diff = maxValue - minValue;
764 QList<QgsColorRampShader::ColorRampItem> colorRampItemlist;
765 for (
int i = 0; i < bounds.count(); ++i )
767 const QVector<double> &boundClass = bounds.at( i );
770 if ( !boundClass.isEmpty() )
772 const double scalarValue = ( boundClass.first() + boundClass.last() ) / 2;
773 item.
color = colorRamp->
color( ( scalarValue - minValue ) / diff );
774 if ( i != 0 && i < bounds.count() - 1 )
776 item.
label = QString( (
"%1 - %2 %3" ) ).
777 arg( QString::number( boundClass.first() ) ).
778 arg( QString::number( boundClass.last() ) ).
782 colorRampItemlist.append( item );
785 if ( firstClass.count() == 1 )
786 colorRampItemlist.first().label = QObject::tr(
"below %1 %2" ).
787 arg( QString::number( firstClass.first() ) ).
791 colorRampItemlist.first().label = QString( (
"%1 - %2 %3" ) ).
792 arg( QString::number( firstClass.first() ) ).
793 arg( QString::number( firstClass.last() ) ).
797 if ( lastClass.count() == 1 )
798 colorRampItemlist.last().label = QObject::tr(
"above %1 %2" ).
799 arg( QString::number( lastClass.first() ) ).
803 colorRampItemlist.last().label = QString( (
"%1 - %2 %3" ) ).
804 arg( QString::number( lastClass.first() ) ).
805 arg( QString::number( lastClass.last() ) ).
826 if ( mTemporalProperties->
isActive() )
836 if ( mTemporalProperties->
isActive() )
842void QgsMeshLayer::fillNativeMesh()
846 Q_ASSERT( !mNativeMesh );
848 mNativeMesh.reset(
new QgsMesh() );
856void QgsMeshLayer::onDatasetGroupsAdded(
const QList<int> &datasetGroupIndexes )
861 for (
int datasetGroupIndex : datasetGroupIndexes )
863 if ( !mRendererSettings.
hasSettings( datasetGroupIndex ) )
864 assignDefaultStyleToDatasetGroup( datasetGroupIndex );
871void QgsMeshLayer::onMeshEdited()
875 mRendererCache.reset(
new QgsMeshLayerRendererCache() );
885 return mDatasetGroupStore->datasetGroupTreeItem();
892 mDatasetGroupStore->setDatasetGroupTreeItem( rootItem );
893 updateActiveDatasetGroups();
896int QgsMeshLayer::closestEdge(
const QgsPointXY &point,
double searchRadius,
QgsPointXY &projectedPoint )
const
900 const QgsRectangle searchRectangle( point.
x() - searchRadius, point.
y() - searchRadius, point.
x() + searchRadius, point.
y() + searchRadius );
904 int selectedIndex = -1;
908 double sqrMaxDistFromPoint = pow( searchRadius, 2 );
909 for (
const int edgeIndex : edgeIndexes )
915 const double sqrDist = point.
sqrDistToSegment( vertex1.
x(), vertex1.
y(), vertex2.
x(), vertex2.
y(), projPoint, 0 );
916 if ( sqrDist < sqrMaxDistFromPoint )
918 selectedIndex = edgeIndex;
919 projectedPoint = projPoint;
920 sqrMaxDistFromPoint = sqrDist;
925 return selectedIndex;
940 mTemporalProperties->
setReferenceTime( referenceTime, lDataProvider->temporalCapabilities() );
959 return exactPosition;
960 const QgsRectangle rectangle( point.
x() - searchRadius, point.
y() - searchRadius, point.
x() + searchRadius, point.
y() + searchRadius );
961 double maxDistance = searchRadius;
963 const QList<int> edgeIndexes = mesh->edgeIndexesForRectangle( rectangle );
964 for (
const int edgeIndex : edgeIndexes )
966 const QgsMeshEdge &edge = mesh->edges().at( edgeIndex );
969 const double dist1 = point.
distance( vertex1 );
970 const double dist2 = point.
distance( vertex2 );
971 if ( dist1 < maxDistance )
974 exactPosition = vertex1;
976 if ( dist2 < maxDistance )
979 exactPosition = vertex2;
984 const QList<int> faceIndexes = mesh->faceIndexesForRectangle( rectangle );
985 for (
const int faceIndex : faceIndexes )
987 const QgsMeshFace &face = mesh->triangles().at( faceIndex );
988 for (
int i = 0; i < 3; ++i )
991 const double dist = point.
distance( vertex );
992 if ( dist < maxDistance )
995 exactPosition = vertex;
1000 return exactPosition;
1008 closestEdge( point, searchRadius, projectedPoint );
1010 return projectedPoint;
1020 return centroidPosition;
1021 const QgsRectangle rectangle( point.
x() - searchRadius, point.
y() - searchRadius, point.
x() + searchRadius, point.
y() + searchRadius );
1022 double maxDistance = std::numeric_limits<double>::max();
1024 const QList<int> faceIndexes = mesh->faceIndexesForRectangle( rectangle );
1025 for (
const int faceIndex : faceIndexes )
1027 const int nativefaceIndex = mesh->trianglesToNativeFaces().at( faceIndex );
1028 if ( nativefaceIndex < 0 && nativefaceIndex >= mesh->faceCentroids().count() )
1030 const QgsPointXY centroid = mesh->faceCentroids()[nativefaceIndex];
1031 const double dist = point.
distance( centroid );
1032 if ( dist < maxDistance )
1035 centroidPosition = centroid;
1039 return centroidPosition;
1046 mDatasetGroupStore->resetDatasetGroupTreeItem();
1047 updateActiveDatasetGroups();
1054 if ( !mDataProvider )
1057 for (
int i = 0; i < groupCount; ++i )
1071 const qint64 time = mDatasetGroupStore->datasetRelativeTime( index );
1083 return mDatasetGroupStore->datasetRelativeTime( index );
1095 message = QObject::tr(
"Face %1 invalid" ).arg( error.
elementIndex );
1098 message = QObject::tr(
"Too many vertices for face %1" ).arg( error.
elementIndex );
1101 message = QObject::tr(
"Face %1 is flat" ).arg( error.
elementIndex );
1104 message = QObject::tr(
"Vertex %1 is a unique shared vertex" ).arg( error.
elementIndex );
1107 message = QObject::tr(
"Vertex %1 is invalid" ).arg( error.
elementIndex );
1110 message = QObject::tr(
"Face %1 is manifold" ).arg( error.
elementIndex );
1149 mRendererCache.reset();
1157 mMeshEditor->deleteLater();
1158 mMeshEditor =
nullptr;
1166 mDataProvider->
close();
1169 mExtraDatasetUri.clear();
1173 if ( mDatasetGroupStore->addDatasetGroup( zValueDatasetGroup.get() ) )
1174 zValueDatasetGroup.release();
1191 QString detailsError;
1195 detailsError = tr(
"Unknown inconsistent mesh error" );
1200 detailsError = detailsErrorMessage(
error );
1203 if ( !detailsError.isEmpty() )
1212 if ( !mDataProvider )
1215 const bool res = mDataProvider->
saveMeshFrame( *mNativeMesh.get() );
1217 if ( continueEditing )
1224 mMeshEditor->deleteLater();
1225 mMeshEditor =
nullptr;
1231 mDatasetGroupStore->setPersistentProvider( mDataProvider, QStringList() );
1242 if ( !mDataProvider )
1245 mTriangularMeshes.clear();
1249 mRendererCache.reset(
new QgsMeshLayerRendererCache() );
1252 if ( continueEditing )
1259 mMeshEditor->deleteLater();
1260 mMeshEditor =
nullptr;
1264 mDatasetGroupStore->setPersistentProvider( mDataProvider, QStringList() );
1279 mTriangularMeshes.at( 0 )->update( mNativeMesh.get(), transform );
1280 mRendererCache.reset(
new QgsMeshLayerRendererCache() );
1290 if ( !mMeshEditor->
reindex( renumber ) )
1293 mTriangularMeshes.clear();
1295 mTriangularMeshes.at( 0 )->update( mNativeMesh.get(), transform );
1296 mRendererCache.reset(
new QgsMeshLayerRendererCache() );
1341 else if ( mDataProvider )
1352 else if ( mDataProvider )
1362 return mNativeMesh->edgeCount();
1363 else if ( mDataProvider )
1368void QgsMeshLayer::updateActiveDatasetGroups()
1374 if ( !mDatasetGroupStore->datasetGroupTreeItem() )
1384 if ( !activeScalarItem && treeItem->childCount() > 0 && oldActiveScalar != -1 )
1385 activeScalarItem = treeItem->
child( 0 );
1387 if ( activeScalarItem && !activeScalarItem->
isEnabled() )
1389 for (
int i = 0; i < treeItem->childCount(); ++i )
1391 activeScalarItem = treeItem->
child( i );
1395 activeScalarItem =
nullptr;
1399 if ( activeScalarItem )
1407 if ( !( activeVectorItem && activeVectorItem->
isEnabled() ) )
1420 QString activeScalarName;
1421 QString activeVectorName;
1426 for (
auto it = nameToIndex.constBegin(); it != nameToIndex.constEnd(); ++it )
1428 int index = it.value();
1429 const QString
name = it.key() ;
1430 int globalIndex = mDatasetGroupStore->indexFromGroupName(
name );
1431 if ( globalIndex >= 0 )
1435 if ( settings.
hasVectorSettings( it.value() ) && mDatasetGroupStore->datasetGroupMetadata( globalIndex ).isVector() )
1448 if ( index == activeScalar )
1449 activeScalarName =
name;
1450 if ( index == activeVector )
1451 activeVectorName =
name;
1455 for (
int globalIndex : globalIndexes )
1457 const QString
name = mDatasetGroupStore->groupName( globalIndex );
1458 if ( !nameToIndex.contains(
name ) )
1461 if ( mDatasetGroupStore->datasetGroupMetadata( globalIndex ).isVector() )
1468 if ( !activeScalarName.isEmpty() )
1470 if ( !activeVectorName.isEmpty() )
1473 return consistentSettings;
1484 if ( !
mDataSource.isEmpty() && !provider.isEmpty() )
1485 setDataProvider( provider, options,
flags );
1492 switch ( elementType )
1495 return snapOnVertex( point, searchRadius );
1497 return snapOnEdge( point, searchRadius );
1499 return snapOnFace( point, searchRadius );
1522 context.
lastScope()->
setVariable( QStringLiteral(
"_native_mesh" ), QVariant::fromValue( *mNativeMesh ) );
1524 expression.
prepare( &context );
1526 for (
int i = 0; i < mNativeMesh->vertexCount(); ++i )
1530 if ( expression.
evaluate( &context ).toBool() )
1555 context.
lastScope()->
setVariable( QStringLiteral(
"_native_mesh" ), QVariant::fromValue( *mNativeMesh ) );
1557 expression.
prepare( &context );
1559 for (
int i = 0; i < mNativeMesh->faceCount(); ++i )
1563 if ( expression.
evaluate( &context ).toBool() )
1607 return mSimplificationSettings;
1614 mSimplificationSettings = simplifySettings;
1625 props[
"color1"] =
"13,8,135,255";
1626 props[
"color2"] =
"240,249,33,255";
1628 "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:"
1629 "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:"
1630 "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:"
1631 "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:"
1632 "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:"
1633 "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:"
1634 "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:"
1635 "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:"
1636 "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:"
1637 "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";
1641void QgsMeshLayer::assignDefaultStyleToDatasetGroup(
int groupIndex )
1646 const double groupMin =
metadata.minimum();
1647 const double groupMax =
metadata.maximum();
1650 fcn.classifyColorRamp( 5, -1,
QgsRectangle(),
nullptr );
1679 createSimplifiedMeshes();
1682 if ( !mRendererCache )
1683 mRendererCache.reset(
new QgsMeshLayerRendererCache() );
1709 QVector<double> scalarDatasetValues;
1719 if ( !datasetIndex.
isValid() )
1725 const int count = QgsMeshLayerUtils::datasetValuesCount( mNativeMesh.get(), scalarDataType );
1735 scalarDatasetValues = QgsMeshLayerUtils::calculateMagnitudes( vals );
1739 scalarDatasetValues = QVector<double>( count, std::numeric_limits<double>::quiet_NaN() );
1744 if ( intersectedFacesIndices.isEmpty() )
1749 min = std::numeric_limits<double>::max();
1750 max = -std::numeric_limits<double>::max();
1754 for (
int intersectedFaceIndex : intersectedFacesIndices )
1761 min = std::min( min, value );
1762 max = std::max( max, value );
1768 for (
int vertexIndex : face )
1770 value = scalarDatasetValues.at( vertexIndex );
1771 min = std::min( min, value );
1772 max = std::max( max, value );
1787void QgsMeshLayer::checkSymbologyConsistency()
1791 const QList<int> groupIndexes = mDatasetGroupStore->datasetGroupIndexes();
1795 if ( !groupIndexes.empty() )
1813 Q_UNUSED( errorMessage )
1816 const QDomElement elem = node.toElement();
1821 const QDomElement elemRendererSettings = elem.firstChildElement(
"mesh-renderer-settings" );
1822 if ( !elemRendererSettings.isNull() )
1825 QMap<QString, int> groupNameToGlobalIndex;
1826 QDomElement nameToIndexElem = elem.firstChildElement(
"name-to-global-index" );
1827 while ( !nameToIndexElem.isNull() )
1829 const QString
name = nameToIndexElem.attribute( QStringLiteral(
"name" ) );
1830 int globalIndex = nameToIndexElem.attribute( QStringLiteral(
"global-index" ) ).toInt();
1831 groupNameToGlobalIndex.insert(
name, globalIndex );
1832 nameToIndexElem = nameToIndexElem.nextSiblingElement( QStringLiteral(
"name-to-global-index" ) );
1835 mRendererSettings = accordSymbologyWithGroupName(
rendererSettings, groupNameToGlobalIndex );
1837 checkSymbologyConsistency();
1839 const QDomElement elemSimplifySettings = elem.firstChildElement(
"mesh-simplify-settings" );
1840 if ( !elemSimplifySettings.isNull() )
1841 mSimplificationSettings.
readXml( elemSimplifySettings, context );
1844 const QDomNode blendModeNode = node.namedItem( QStringLiteral(
"blendMode" ) );
1845 if ( !blendModeNode.isNull() )
1847 const QDomElement e = blendModeNode.toElement();
1852 if ( categories.testFlag(
Labeling ) )
1856 QDomElement labelingElement = node.firstChildElement( QStringLiteral(
"labeling" ) );
1857 if ( !labelingElement.isNull() )
1860 mLabelsEnabled = node.toElement().attribute( QStringLiteral(
"labelsEnabled" ), QStringLiteral(
"0" ) ).toInt();
1868 const QDomNode layerOpacityNode = node.namedItem( QStringLiteral(
"layerOpacity" ) );
1869 if ( !layerOpacityNode.isNull() )
1871 const QDomElement e = layerOpacityNode.toElement();
1884 Q_UNUSED( errorMessage )
1887 QDomElement elem = node.toElement();
1891 const QDomElement elemRendererSettings = mRendererSettings.
writeXml( doc, context );
1892 elem.appendChild( elemRendererSettings );
1896 for (
int index : groupIndexes )
1898 QDomElement elemNameToIndex = doc.createElement( QStringLiteral(
"name-to-global-index" ) );
1899 elemNameToIndex.setAttribute( QStringLiteral(
"name" ), mDatasetGroupStore->groupName( index ) );
1900 elemNameToIndex.setAttribute( QStringLiteral(
"global-index" ), index );
1901 elem.appendChild( elemNameToIndex );
1904 const QDomElement elemSimplifySettings = mSimplificationSettings.
writeXml( doc, context );
1905 elem.appendChild( elemSimplifySettings );
1908 QDomElement blendModeElement = doc.createElement( QStringLiteral(
"blendMode" ) );
1910 blendModeElement.appendChild( blendModeText );
1911 node.appendChild( blendModeElement );
1913 if ( categories.testFlag(
Labeling ) )
1917 QDomElement labelingElement = mLabeling->
save( doc, context );
1918 elem.appendChild( labelingElement );
1920 elem.setAttribute( QStringLiteral(
"labelsEnabled" ), mLabelsEnabled ? QStringLiteral(
"1" ) : QStringLiteral(
"0" ) );
1926 QDomElement layerOpacityElem = doc.createElement( QStringLiteral(
"layerOpacity" ) );
1927 const QDomText layerOpacityText = doc.createTextNode( QString::number(
opacity() ) );
1928 layerOpacityElem.appendChild( layerOpacityText );
1929 node.appendChild( layerOpacityElem );
1939 return writeSymbology( node, doc, errorMessage, context, categories );
1946 return readSymbology( node, errorMessage, context, categories );
1970 const QDomNode pkeyNode = layer_node.namedItem( QStringLiteral(
"provider" ) );
1972 if ( pkeyNode.isNull() )
1978 const QDomElement pkeyElt = pkeyNode.toElement();
1990 const QDomElement elemExtraDatasets = layer_node.firstChildElement( QStringLiteral(
"extra-datasets" ) );
1991 if ( !elemExtraDatasets.isNull() )
1993 QDomElement elemUri = elemExtraDatasets.firstChildElement( QStringLiteral(
"uri" ) );
1994 while ( !elemUri.isNull() )
1997 mExtraDatasetUri.append( uri );
1998 elemUri = elemUri.nextSiblingElement( QStringLiteral(
"uri" ) );
2002 if ( pkeyNode.toElement().hasAttribute( QStringLiteral(
"time-unit" ) ) )
2003 mTemporalUnit =
static_cast<Qgis::TemporalUnit>( pkeyNode.toElement().attribute( QStringLiteral(
"time-unit" ) ).toInt() );
2006 const QDomElement elemDatasetGroupsStore = layer_node.firstChildElement( QStringLiteral(
"mesh-dataset-groups-store" ) );
2007 if ( elemDatasetGroupsStore.isNull() )
2010 mDatasetGroupStore->readXml( elemDatasetGroupsStore, context );
2021 const QDomElement elemStaticDataset = layer_node.firstChildElement( QStringLiteral(
"static-active-dataset" ) );
2022 if ( elemStaticDataset.hasAttribute( QStringLiteral(
"scalar" ) ) )
2024 mStaticScalarDatasetIndex = elemStaticDataset.attribute( QStringLiteral(
"scalar" ) ).toInt();
2026 if ( elemStaticDataset.hasAttribute( QStringLiteral(
"vector" ) ) )
2028 mStaticVectorDatasetIndex = elemStaticDataset.attribute( QStringLiteral(
"vector" ) ).toInt();
2039 QDomElement mapLayerNode = layer_node.toElement();
2041 if ( mapLayerNode.isNull() || ( QLatin1String(
"maplayer" ) != mapLayerNode.nodeName() ) )
2050 if ( mDataProvider )
2052 QDomElement provider = document.createElement( QStringLiteral(
"provider" ) );
2053 const QDomText providerText = document.createTextNode(
providerType() );
2054 provider.appendChild( providerText );
2055 layer_node.appendChild( provider );
2058 const QStringList extraDatasetUris = mDataProvider->
extraDatasets();
2059 QDomElement elemExtraDatasets = document.createElement( QStringLiteral(
"extra-datasets" ) );
2060 for (
const QString &uri : extraDatasetUris )
2063 QDomElement elemUri = document.createElement( QStringLiteral(
"uri" ) );
2064 elemUri.appendChild( document.createTextNode( path ) );
2065 elemExtraDatasets.appendChild( elemUri );
2067 layer_node.appendChild( elemExtraDatasets );
2070 QDomElement elemStaticDataset = document.createElement( QStringLiteral(
"static-active-dataset" ) );
2071 elemStaticDataset.setAttribute( QStringLiteral(
"scalar" ), mStaticScalarDatasetIndex );
2072 elemStaticDataset.setAttribute( QStringLiteral(
"vector" ), mStaticVectorDatasetIndex );
2073 layer_node.appendChild( elemStaticDataset );
2077 layer_node.appendChild( mDatasetGroupStore->writeXml( document, context ) );
2081 return writeSymbology( layer_node, document, errorMsg, context );
2088 if ( !mMeshEditor && mDataProvider && mDataProvider->
isValid() )
2091 mDatasetGroupStore->setPersistentProvider( mDataProvider, QStringList() );
2095 mNativeMesh.reset(
new QgsMesh );
2103 mTriangularMeshes.clear();
2106 mRendererCache.reset(
new QgsMeshLayerRendererCache() );
2108 checkSymbologyConsistency();
2118 if ( mDataProvider )
2121 return QStringList();
2129 QString myMetadata = QStringLiteral(
"<html>\n<body>\n" );
2134 myMetadata += QStringLiteral(
"<h1>" ) + tr(
"Information from provider" ) + QStringLiteral(
"</h1>\n<hr>\n" );
2135 myMetadata += QLatin1String(
"<table class=\"list-view\">\n" );
2138 myMetadata += QStringLiteral(
"<tr><td class=\"highlight\">" ) + tr(
"Extent" ) + QStringLiteral(
"</td><td>" ) +
extent().
toString() + QStringLiteral(
"</td></tr>\n" );
2141 QLocale locale = QLocale();
2142 locale.setNumberOptions( locale.numberOptions() &= ~QLocale::NumberOption::OmitGroupSeparator );
2146 myMetadata += QStringLiteral(
"<tr><td class=\"highlight\">" )
2147 + tr(
"Vertex count" ) + QStringLiteral(
"</td><td>" )
2149 + QStringLiteral(
"</td></tr>\n" );
2150 myMetadata += QStringLiteral(
"<tr><td class=\"highlight\">" )
2151 + tr(
"Face count" ) + QStringLiteral(
"</td><td>" )
2152 + ( locale.toString(
static_cast<qlonglong
>(
meshFaceCount() ) ) )
2153 + QStringLiteral(
"</td></tr>\n" );
2154 myMetadata += QStringLiteral(
"<tr><td class=\"highlight\">" )
2155 + tr(
"Edge count" ) + QStringLiteral(
"</td><td>" )
2156 + ( locale.toString(
static_cast<qlonglong
>(
meshEdgeCount() ) ) )
2157 + QStringLiteral(
"</td></tr>\n" );
2158 myMetadata += QStringLiteral(
"<tr><td class=\"highlight\">" )
2159 + tr(
"Dataset groups count" ) + QStringLiteral(
"</td><td>" )
2161 + QStringLiteral(
"</td></tr>\n" );
2162 myMetadata += provider->htmlMetadata();
2166 myMetadata += QLatin1String(
"</table>\n<br><br>" );
2172 myMetadata += QStringLiteral(
"<h1>" ) + tr(
"Identification" ) + QStringLiteral(
"</h1>\n<hr>\n" );
2173 myMetadata += htmlFormatter.identificationSectionHtml( );
2174 myMetadata += QLatin1String(
"<br><br>\n" );
2177 myMetadata += QStringLiteral(
"<h1>" ) + tr(
"Extent" ) + QStringLiteral(
"</h1>\n<hr>\n" );
2178 myMetadata += htmlFormatter.extentSectionHtml(
isSpatial() );
2179 myMetadata += QLatin1String(
"<br><br>\n" );
2182 myMetadata += QStringLiteral(
"<h1>" ) + tr(
"Access" ) + QStringLiteral(
"</h1>\n<hr>\n" );
2183 myMetadata += htmlFormatter.accessSectionHtml( );
2184 myMetadata += QLatin1String(
"<br><br>\n" );
2187 myMetadata += QStringLiteral(
"<h1>" ) + tr(
"Contacts" ) + QStringLiteral(
"</h1>\n<hr>\n" );
2188 myMetadata += htmlFormatter.contactsSectionHtml( );
2189 myMetadata += QLatin1String(
"<br><br>\n" );
2192 myMetadata += QStringLiteral(
"<h1>" ) + tr(
"Links" ) + QStringLiteral(
"</h1>\n<hr>\n" );
2193 myMetadata += htmlFormatter.linksSectionHtml( );
2194 myMetadata += QLatin1String(
"<br><br>\n" );
2197 myMetadata += QStringLiteral(
"<h1>" ) + tr(
"History" ) + QStringLiteral(
"</h1>\n<hr>\n" );
2198 myMetadata += htmlFormatter.historySectionHtml( );
2199 myMetadata += QLatin1String(
"<br><br>\n" );
2203 myMetadata += QLatin1String(
"\n</body>\n</html>\n" );
2218 mDatasetGroupStore->setPersistentProvider(
nullptr, QStringList() );
2220 delete mDataProvider;
2226 mDataProvider = qobject_cast< QgsMeshDataProvider * >(
mPreloadedProvider.release() );
2230 std::unique_ptr< QgsScopedRuntimeProfile > profile;
2232 profile = std::make_unique< QgsScopedRuntimeProfile >( tr(
"Create %1 provider" ).arg( provider ), QStringLiteral(
"projectload" ) );
2237 if ( !mDataProvider )
2239 QgsDebugMsgLevel( QStringLiteral(
"Unable to get mesh data provider" ), 2 );
2243 mDataProvider->setParent(
this );
2244 QgsDebugMsgLevel( QStringLiteral(
"Instantiated the mesh data provider plugin" ), 2 );
2253 if ( !mTemporalProperties->
isValid() )
2260 mDatasetGroupStore->setPersistentProvider( mDataProvider, mExtraDatasetUri );
2264 if ( provider == QLatin1String(
"mesh_memory" ) )
2273 int globalIndex = mDatasetGroupStore->globalDatasetGroupIndexInSource( mDataProvider, i );
2274 if ( globalIndex != -1 &&
2276 assignDefaultStyleToDatasetGroup( globalIndex );
2291 return mTemporalProperties;
2298 return mElevationProperties;
2305 return mLabelsEnabled &&
static_cast< bool >( mLabeling );
2312 mLabelsEnabled = enabled;
2329 if ( ! mDataProvider )
2331 QgsDebugMsgLevel( QStringLiteral(
"Unable to get mesh data provider" ), 2 );
2338 return !mExtraDatasetUri.contains( path );
The Qgis class provides global constants for use throughout the application.
@ Exact
Assigns the color of the exact matching value in the color ramp item list.
@ Critical
Critical/error message.
@ 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.
BlendMode
Blending modes defining the available composition modes that can be used when painting.
TemporalUnit
Temporal units.
@ Milliseconds
Milliseconds.
QFlags< DataProviderReadFlag > DataProviderReadFlags
Flags which control data provider construction.
@ EqualInterval
Uses equal interval.
@ Mesh
Mesh layer. Added in QGIS 3.2.
@ LoadDefaultStyle
Reset the layer's style to the default for the datasource.
QgsVertexIterator vertices() const
Returns a read-only, Java-style iterator for traversal of vertices of all the geometry,...
Abstract base class - its implementations define different approaches to the labeling of a mesh layer...
static QgsAbstractMeshLayerLabeling * create(const QDomElement &element, const QgsReadWriteContext &context)
Try to create instance of an implementation based on the XML data.
virtual QDomElement save(QDomDocument &doc, const QgsReadWriteContext &context) const =0
Returns labeling configuration as XML element.
Abstract base class for objects which generate elevation profiles.
static QgsRuntimeProfiler * profiler()
Returns the application runtime profiler.
A ramp shader will color a raster pixel based on a list of values ranges in a ramp.
void setClassificationMode(Qgis::ShaderClassificationMethod classificationMode)
Sets the classification mode.
QgsColorRamp * sourceColorRamp() const
Returns the source color ramp.
void setColorRampType(Qgis::ShaderInterpolationMethod colorRampType)
Sets the color ramp interpolation method.
void setColorRampItemList(const QList< QgsColorRampShader::ColorRampItem > &list)
Sets a custom color map.
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.
Base class for handling properties relating to a data provider's temporal capabilities.
bool hasTemporalCapabilities() const
Returns true if the provider has temporal capabilities available.
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 QString dataSourceUri(bool expandAuthConfig=false) const
Gets the data source specification.
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.
Base class for storage of map layer elevation properties.
static QString typeToString(Qgis::LayerType 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.
QString providerType() const
Returns the provider type (provider key) for this 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.
static Qgis::DataProviderReadFlags providerReadFlags(const QDomNode &layerNode, QgsMapLayer::ReadFlags layerReadFlags)
Returns provider read flag deduced from layer read flags layerReadFlags and a dom node layerNode that...
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....
QFlags< StyleCategory > StyleCategories
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...
std::unique_ptr< QgsDataProvider > mPreloadedProvider
Optionally used when loading a project, it is released when the layer is effectively created.
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.
void emitStyleChanged()
Triggers an emission of the styleChanged() signal.
void dataChanged()
Data of layer changed.
virtual QgsMapLayer * clone() const =0
Returns a new instance equivalent to this one except for the id which is still unique.
QString mDataSource
Data source description string, varies by layer type.
@ 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 customPropertyHtmlMetadata() const
Returns an HTML fragment containing custom property information, for use in the htmlMetadata() method...
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.
QDateTime referenceTime() const
Returns the reference time.
Qgis::TemporalUnit temporalUnit() const
Returns the temporal unit used to read data by the data provider.
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.
void setTemporalUnit(Qgis::TemporalUnit unit)
Sets the temporal unit of the provider and reload data if it changes.
QgsMeshDataProviderTemporalCapabilities * temporalCapabilities() override
Returns the provider's temporal capabilities.
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 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()
Initializes the mesh editor and returns first error if the internal native mesh has topological error...
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.
QgsMeshEditingError initializeWithErrorsFix()
Initializes the mesh editor.
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...
Mesh layer specific subclass of QgsMapLayerElevationProperties.
QgsMeshLayerElevationProperties * clone() const override
Creates a clone of the properties.
Implementation of QgsAbstractProfileGenerator for mesh layers.
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...
bool alwaysLoadReferenceTimeFromSource() const
Returns whether the time proporties are automatically reloaded from provider when project is opened o...
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 editing 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.
QgsMeshDatasetIndex activeScalarDatasetIndex(QgsRenderContext &rendererContext)
Returns current active scalar dataset index for current renderer context.
QgsMeshDatasetIndex activeVectorDatasetAtTime(const QgsDateTimeRange &timeRange, int group=-1) const
Returns dataset index from active vector group depending on the time range If the temporal properties...
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.
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.
const QgsAbstractMeshLayerLabeling * labeling() const
Access to const labeling configuration.
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...
QgsMeshDatasetIndex staticVectorDatasetIndex(int group=-1) const
Returns the static vector dataset index that is rendered if the temporal properties is not active.
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...
bool minimumMaximumActiveScalarDataset(const QgsRectangle &extent, const QgsMeshDatasetIndex &datasetIndex, double &min, double &max)
Extracts minimum and maximum value for active scalar dataset on mesh faces.
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...
void setRendererSettings(const QgsMeshRendererSettings &settings, const bool repaint=true)
Sets new renderer settings.
QgsMapLayerElevationProperties * elevationProperties() override
Returns the layer's elevation properties.
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 editing 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 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 editing of the mesh frame, Rebuilds the triangular mesh and its spatial index with transform,...
QgsAbstractProfileGenerator * createProfileGenerator(const QgsProfileRequest &request) override
Given a profile request, returns a new profile generator ready for generating elevation profiles.
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 setLabeling(QgsAbstractMeshLayerLabeling *labeling)
Sets labeling configuration.
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.
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.
void setLabelsEnabled(bool enabled)
Sets whether labels should be enabled for the layer.
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.
Q_DECL_DEPRECATED bool startFrameEditing(const QgsCoordinateTransform &transform)
Starts editing 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
Write the style for the layer into the document provided.
int meshVertexCount() const
Returns the vertices count of the mesh frame.
bool labelsEnabled() const
Returns whether the layer contains labels which are enabled and should be drawn.
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.
bool datasetsPathUnique(const QString &path)
Checks whether that datasets path is already added to this mesh layer.
qint64 datasetRelativeTimeInMilliseconds(const QgsMeshDatasetIndex &index)
Returns the relative time (in milliseconds) of the dataset from the reference time of its group.
QgsMeshDatasetIndex activeScalarDatasetAtTime(const QgsDateTimeRange &timeRange, int group=-1) const
Returns dataset index from active scalar group depending on the time range.
QgsTriangularMesh * triangularMesh(double minimumTriangleSize=0) const
Returns triangular mesh (nullptr before rendering or calling to updateMesh).
QgsMeshDatasetIndex staticScalarDatasetIndex(int group=-1) const
Returns the static scalar dataset index that is rendered if the temporal properties is not active.
void setTemporalMatchingMethod(const QgsMeshDataProviderTemporalCapabilities::MatchingTemporalDatasetMethod &matchingMethod)
Sets the method used to match the temporal dataset from a requested time, see activeVectorDatasetAtTi...
bool removeDatasets(const QString &name)
Removes datasets from the mesh with given name.
QgsMeshDatasetGroupTreeItem * datasetGroupTreeRootItem() const
Returns the root items of the dataset group tree item.
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.
QgsMesh3DDataBlock dataset3dValue(const QgsMeshDatasetIndex &index, const QgsPointXY &point) const
Returns the 3d values of stacked 3d mesh defined by the given point.
bool readSymbology(const QDomNode &node, QString &errorMessage, QgsReadWriteContext &context, QgsMapLayer::StyleCategories categories=QgsMapLayer::AllStyleCategories) override
Read the symbology for the current layer from the DOM node supplied.
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...
void reloaded()
Emitted when the mesh layer is reloaded, see reload()
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.
@ NoResampling
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 hasVectorSettings(int groupIndex) const
Returns whether groupIndex has existing vector settings.
QgsMesh3DAveragingMethod * averagingMethod() const
Returns averaging method for conversion of 3d stacked mesh data to 2d data.
bool removeVectorSettings(int groupIndex)
Removes vector settings for groupIndex.
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.
QgsMeshRendererVectorSettings vectorSettings(int groupIndex) const
Returns renderer settings.
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.
bool removeScalarSettings(int groupIndex)
Removes scalar settings with groupIndex.
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, const char *file=__builtin_FILE(), const char *function=__builtin_FUNCTION(), int line=__builtin_LINE())
Adds a message to the log instance (and creates it if necessary).
static Qgis::BlendMode getBlendModeEnum(QPainter::CompositionMode blendMode)
Returns a Qgis::BlendMode corresponding to a QPainter::CompositionMode.
static QPainter::CompositionMode getCompositionMode(Qgis::BlendMode blendMode)
Returns a QPainter::CompositionMode corresponding to a Qgis::BlendMode.
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
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
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
Returns the Cartesian 2D distance between this point and a specified x, y coordinate.
Encapsulates properties and constraints relating to fetching elevation profiles from different source...
QString absoluteToRelativeUri(const QString &providerKey, const QString &uri, const QgsReadWriteContext &context) const
Converts absolute path(s) to relative path(s) in the given provider-specific URI.
static QgsProviderRegistry * instance(const QString &pluginPath=QString())
Means of accessing canonical single instance.
QString relativeToAbsoluteUri(const QString &providerKey, const QString &uri, const QgsReadWriteContext &context) const
Converts relative path(s) to absolute path(s) in the given provider-specific URI.
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.
Allows entering a context category and takes care of leaving this category on deletion of the class.
The class is used as a container of context for various read/write operations on other objects.
MAYBE_UNUSED NODISCARD QgsReadWriteContextCategoryPopper enterCategory(const QString &category, const QString &details=QString()) const
Push a category to the stack.
const QgsPathResolver & pathResolver() const
Returns path resolver for conversion between relative and absolute paths.
A rectangle specified with double values.
Q_INVOKABLE QString toString(int precision=16) const
Returns a string representation of form xmin,ymin : xmax,ymax Coordinates will be truncated to the sp...
void setNull()
Mark a rectangle as being null (holding no spatial information).
Contains information about the context of a rendering operation.
QgsCoordinateTransform coordinateTransform() const
Returns the current coordinate transform for the context.
QgsColorRamp * colorRamp(const QString &name) const
Returns a new copy of the specified color ramp.
static QgsStyle * defaultStyle(bool initialize=true)
Returns the default application-wide style.
bool isActive() const
Returns true if the temporal property is active.
void setIsActive(bool active)
Sets whether the temporal property is active.
const QgsDateTimeRange & temporalRange() const
Returns the datetime range for the object.
bool isTemporal() const
Returns true if the object's temporal range is enabled, and the object will be filtered when renderin...
T begin() const
Returns the beginning of the range.
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< 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.
#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
#define QGIS_PROTECT_QOBJECT_THREAD_ACCESS
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.