19#include "moc_qgsmeshdatasetgroupstore.cpp"
28 return mRegistry.keys();
33 return mDatasetGroupTreeRootItem->enabledDatasetGroupIndexes();
38 return mRegistry.count();
53 removePersistentProvider();
54 mPersistentProvider = provider;
55 if ( !mPersistentProvider )
57 for (
const QString &uri : extraDatasetUri )
62 checkDatasetConsistency( mPersistentProvider );
63 removeUnregisteredItemFromTree();
67 for (
int i = 0; i < groupCount; ++i )
76QgsMeshDatasetGroupStore::DatasetGroup QgsMeshDatasetGroupStore::datasetGroup(
int index )
const
78 return mRegistry.value( index, DatasetGroup{
nullptr, -1} );
83 if ( !mPersistentProvider )
85 return mPersistentProvider->
addDataset( path ) ;
113 int groupIndex = registerDatasetGroup( DatasetGroup{&mExtraDatasets, nativeIndex} );
115 if ( groupIndex == -1 )
118 QList<int> groupIndexes;
119 groupIndexes.append( groupIndex );
120 createDatasetGroupTreeItems( groupIndexes );
121 syncItemToDatasetGroup( groupIndex );
130 const QgsMeshDatasetGroupStore::DatasetGroup group = datasetGroup( index );
131 if ( group.first == mPersistentProvider )
133 else if ( group.first == &mExtraDatasets )
134 eraseExtraDataset( group.second );
136 reindexDatasetGroups();
139void QgsMeshDatasetGroupStore::reindexDatasetGroups()
142 mPersistentExtraDatasetGroupIndexes.clear();
143 mGroupNameToGlobalIndex.clear();
150 mRegistry[globalIndex] = DatasetGroup{mPersistentProvider, i};
151 mPersistentExtraDatasetGroupIndexes.append( globalIndex );
152 mGroupNameToGlobalIndex.insert( name, globalIndex );
160 mRegistry[globalIndex] = DatasetGroup{source, i};
161 mGroupNameToGlobalIndex.insert( name, globalIndex );
171 for (
int groupIndex : groupIndexes )
172 syncItemToDatasetGroup( groupIndex );
177 return mDatasetGroupTreeRootItem.get();
183 mDatasetGroupTreeRootItem.reset( rootItem->
clone() );
185 mDatasetGroupTreeRootItem.reset();
187 unregisterGroupNotPresentInTree();
192 QgsMeshDatasetGroupStore::DatasetGroup group = datasetGroup( index.
group() );
194 return group.first->datasetGroupMetadata( group.second );
201 QgsMeshDatasetGroupStore::DatasetGroup group = datasetGroup( groupIndex );
203 return group.first->datasetCount( group.second );
210 QgsMeshDatasetGroupStore::DatasetGroup group = datasetGroup( index.
group() );
219 QgsMeshDatasetGroupStore::DatasetGroup group = datasetGroup( index.
group() );
228 QgsMeshDatasetGroupStore::DatasetGroup group = datasetGroup( index.
group() );
237 QgsMeshDatasetGroupStore::DatasetGroup group = datasetGroup( index.
group() );
246 QgsMeshDatasetGroupStore::DatasetGroup group = datasetGroup( index.
group() );
255 QgsMeshDatasetGroupStore::DatasetGroup group = datasetGroup( index.
group() );
266 QgsMeshDatasetGroupStore::DatasetGroup group = datasetGroup( groupIndex );
273 group.first->datasetIndexAtTime( referenceTime, group.second, time, method ).dataset() );
279 int groupIndex )
const
281 const QgsMeshDatasetGroupStore::DatasetGroup group = datasetGroup( groupIndex );
283 return QList<QgsMeshDatasetIndex>();
287 const QList<QgsMeshDatasetIndex> datasetIndexes = group.first->datasetIndexInTimeInterval( referenceTime, group.second, time1, time2 );
289 QList<QgsMeshDatasetIndex> ret;
290 ret.reserve( datasetIndexes.count() );
300 QgsMeshDatasetGroupStore::DatasetGroup group = datasetGroup( index.
group() );
301 if ( !group.first || group.second < 0 )
306 if ( group.first == mPersistentProvider )
308 else if ( group.first == &mExtraDatasets )
324 QDomElement storeElement = doc.createElement( QStringLiteral(
"mesh-dataset-groups-store" ) );
325 storeElement.appendChild( mDatasetGroupTreeRootItem->writeXml( doc, context ) );
327 QMap < int, DatasetGroup>::const_iterator it = mRegistry.constBegin();
328 while ( it != mRegistry.constEnd() )
330 QDomElement elemDataset;
331 if ( it.value().first == mPersistentProvider )
333 elemDataset = doc.createElement( QStringLiteral(
"mesh-dataset" ) );
334 elemDataset.setAttribute( QStringLiteral(
"global-index" ), it.key() );
335 elemDataset.setAttribute( QStringLiteral(
"source-type" ), QStringLiteral(
"persitent-provider" ) );
336 elemDataset.setAttribute( QStringLiteral(
"source-index" ), it.value().second );
338 else if ( it.value().first == &mExtraDatasets )
343 elemDataset = mExtraDatasets.
writeXml( it.value().second, doc, context );
344 if ( !elemDataset.isNull() )
345 elemDataset.setAttribute( QStringLiteral(
"global-index" ), it.key() );
349 if ( !elemDataset.isNull() )
350 storeElement.appendChild( elemDataset );
354 for (
auto it = mGroupNameToGlobalIndex.constBegin(); it != mGroupNameToGlobalIndex.constEnd(); ++it )
356 QDomElement elemNameToIndex = doc.createElement( QStringLiteral(
"name-to-global-index" ) );
357 elemNameToIndex.setAttribute( QStringLiteral(
"name" ), it.key() );
358 elemNameToIndex.setAttribute( QStringLiteral(
"global-index" ), it.value() );
360 storeElement.appendChild( elemNameToIndex );
370 QDomElement datasetElem = storeElem.firstChildElement(
"mesh-dataset" );
371 QMap<int, QgsMeshDatasetGroup *> extraDatasetGroups;
372 while ( !datasetElem.isNull() )
374 int globalIndex = datasetElem.attribute( QStringLiteral(
"global-index" ) ).toInt();
376 const QString sourceType = datasetElem.attribute( QStringLiteral(
"source-type" ) );
377 if ( sourceType == QLatin1String(
"persitent-provider" ) )
379 mPersistentExtraDatasetGroupIndexes.append( globalIndex );
381 else if ( sourceType == QLatin1String(
"virtual" ) )
384 QString name = datasetElem.attribute( QStringLiteral(
"name" ) );
385 QString formula = datasetElem.attribute( QStringLiteral(
"formula" ) );
386 qint64 startTime = datasetElem.attribute( QStringLiteral(
"start-time" ) ).toLongLong();
387 qint64 endTime = datasetElem.attribute( QStringLiteral(
"end-time" ) ).toLongLong();
390 extraDatasetGroups[globalIndex] = dsg;
393 mRegistry[globalIndex] = DatasetGroup{source, sourceIndex};
397 QgsDebugError( QStringLiteral(
"Unhandled source-type: %1." ).arg( sourceType ) );
400 datasetElem = datasetElem.nextSiblingElement( QStringLiteral(
"mesh-dataset" ) );
403 QDomElement nameToIndexElem = storeElem.firstChildElement(
"name-to-global-index" );
404 mGroupNameToGlobalIndex.clear();
405 while ( !nameToIndexElem.isNull() )
407 QString name = nameToIndexElem.attribute( QStringLiteral(
"name" ) );
408 int globalIndex = nameToIndexElem.attribute( QStringLiteral(
"global-index" ) ).toInt();
410 mGroupNameToGlobalIndex.insert( name, globalIndex );
412 nameToIndexElem = nameToIndexElem.nextSiblingElement( QStringLiteral(
"name-to-global-index" ) );
415 QDomElement rootTreeItemElem = storeElem.firstChildElement( QStringLiteral(
"mesh-dataset-group-tree-item" ) );
416 if ( !rootTreeItemElem.isNull() )
425 for ( QMap<int, DatasetGroup>::const_iterator it = mRegistry.cbegin(); it != mRegistry.cend(); ++it )
427 if ( it.value().first == source && it.value().second == nativeGroupIndex )
436 return mGroupNameToGlobalIndex.value(
groupName, -1 );
446 DatasetGroup group = datasetGroup( groupIndex );
449 if ( group.first && group.second >= 0 )
450 fail = mPersistentProvider->
persistDatasetGroup( filePath, driver, group.first, group.second );
454 eraseDatasetGroup( group );
455 group.first = mPersistentProvider;
457 mRegistry[groupIndex] = group;
459 if ( mDatasetGroupTreeRootItem )
470void QgsMeshDatasetGroupStore::onPersistentDatasetAdded(
int count )
472 Q_ASSERT( mPersistentProvider );
476 QList<int> newGroupIndexes;
477 for (
int i = providerBeginIndex; i < providerTotalCount; ++i )
480 if ( mGroupNameToGlobalIndex.empty() && i < mPersistentExtraDatasetGroupIndexes.count() )
483 mRegistry[mPersistentExtraDatasetGroupIndexes.at( i )] = DatasetGroup( mPersistentProvider, i );
485 else if ( mGroupNameToGlobalIndex.contains(
groupName ) )
488 registerDatasetGroup( DatasetGroup{mPersistentProvider, i} );
492 int newGroupIndex = registerDatasetGroup( DatasetGroup{mPersistentProvider, i} );
493 if ( newGroupIndex != -1 )
494 newGroupIndexes.append( newGroupIndex );
498 if ( !newGroupIndexes.isEmpty() )
500 createDatasetGroupTreeItems( newGroupIndexes );
501 mPersistentExtraDatasetGroupIndexes.append( newGroupIndexes );
503 for (
int groupIndex : std::as_const( newGroupIndexes ) )
504 syncItemToDatasetGroup( groupIndex );
510void QgsMeshDatasetGroupStore::removePersistentProvider()
512 if ( !mPersistentProvider )
517 QMap < int, DatasetGroup>::iterator it = mRegistry.begin();
518 while ( it != mRegistry.end() )
520 if ( it.value().first == mPersistentProvider )
521 it = mRegistry.erase( it );
526 mPersistentProvider =
nullptr;
529int QgsMeshDatasetGroupStore::newIndex()
531 QSet usedIndex = qgis::listToSet( mRegistry.keys() );
532 usedIndex.unite( qgis::listToSet( mGroupNameToGlobalIndex.values() ) );
535 while ( usedIndex.contains( index ) )
541int QgsMeshDatasetGroupStore::registerDatasetGroup(
const QgsMeshDatasetGroupStore::DatasetGroup &group )
543 const QString &name = group.first->datasetGroupMetadata( group.second ).name();
544 auto it = mGroupNameToGlobalIndex.find( name );
547 if ( it != mGroupNameToGlobalIndex.end() )
549 groupIndex = it.value();
551 if ( mRegistry.contains( groupIndex ) )
553 QgsDebugError( QStringLiteral(
"Duplicate group name for %1." ).arg( name ) );
559 groupIndex = newIndex();
560 mGroupNameToGlobalIndex.insert( name, groupIndex );
563 mRegistry[groupIndex] = group;
567void QgsMeshDatasetGroupStore::eraseDatasetGroup(
const QgsMeshDatasetGroupStore::DatasetGroup &group )
569 if ( group.first == mPersistentProvider )
571 else if ( group.first == &mExtraDatasets )
572 eraseExtraDataset( group.second );
575void QgsMeshDatasetGroupStore::eraseExtraDataset(
int indexInExtraStore )
580 QMap < int, DatasetGroup>::iterator it = mRegistry.begin();
581 while ( it != mRegistry.end() )
583 int localIndex = it.value().second;
584 if ( it.value().first == &mExtraDatasets && localIndex > indexInExtraStore )
585 it->second = localIndex - 1;
597 if ( globalIndex == -1 )
598 globalIndex = registerDatasetGroup( DatasetGroup{source, i} );
600 if ( globalIndex != - 1 )
601 indexes.append( globalIndex );
604 if ( !indexes.isEmpty() )
605 createDatasetGroupTreeItems( indexes );
607 const QList<int> globalIndexes = mRegistry.keys();
608 for (
int globalIndex : globalIndexes )
610 if ( mRegistry.value( globalIndex ).first == source )
611 syncItemToDatasetGroup( globalIndex );
615void QgsMeshDatasetGroupStore::removeUnregisteredItemFromTree()
617 QList<QgsMeshDatasetGroupTreeItem *> itemsToCheck;
618 QList<int> indexItemToRemove;
619 for (
int i = 0; i < mDatasetGroupTreeRootItem->childCount(); ++i )
620 itemsToCheck.append( mDatasetGroupTreeRootItem->child( i ) );
622 while ( !itemsToCheck.isEmpty() )
626 if ( !mRegistry.contains( globalIndex ) )
627 indexItemToRemove.append( globalIndex );
628 for (
int i = 0; i < item->
childCount(); ++i )
629 itemsToCheck.append( item->
child( i ) );
632 for (
int i : indexItemToRemove )
640void QgsMeshDatasetGroupStore::unregisterGroupNotPresentInTree()
642 if ( !mDatasetGroupTreeRootItem )
648 QMap < int, DatasetGroup>::iterator it = mRegistry.begin();
649 while ( it != mRegistry.end() )
651 DatasetGroup datasetGroup = it.value();
652 int globalIndex = it.key();
653 if ( ! mDatasetGroupTreeRootItem->childFromDatasetGroupIndex( globalIndex )
654 && datasetGroup.first != mPersistentProvider )
656 it = mRegistry.erase( it );
657 eraseDatasetGroup( datasetGroup );
664void QgsMeshDatasetGroupStore::syncItemToDatasetGroup(
int groupIndex )
666 if ( !mDatasetGroupTreeRootItem )
668 const DatasetGroup group = datasetGroup( groupIndex );
670 if ( group.first == mPersistentProvider && mPersistentProvider )
676 else if ( group.first == &mExtraDatasets )
683void QgsMeshDatasetGroupStore::createDatasetGroupTreeItems(
const QList<int> &indexes )
685 QMap<QString, QgsMeshDatasetGroupTreeItem *> mNameToItem;
687 for (
int i = 0; i < indexes.count(); ++i )
689 int groupIndex = indexes.at( i );
690 if ( mDatasetGroupTreeRootItem->childFromDatasetGroupIndex( groupIndex ) )
693 const QString name = meta.
name();
694 const QStringList subdatasets = name.split(
'/' );
696 QString displayName = name;
699 if ( subdatasets.size() == 2 )
701 auto it = mNameToItem.find( subdatasets[0] );
702 if ( it == mNameToItem.end() )
703 QgsDebugError( QStringLiteral(
"Unable to find parent group for %1." ).arg( name ) );
706 displayName = subdatasets[1];
710 else if ( subdatasets.size() != 1 )
711 QgsDebugError( QStringLiteral(
"Ignoring too deep child group name %1." ).arg( name ) );
715 if ( mNameToItem.contains( name ) )
716 QgsDebugError( QStringLiteral(
"Group %1 is not unique" ).arg( displayName ) );
717 mNameToItem[name] = item;
723 int groupIndex = mGroups.size();
724 mGroups.push_back( std::unique_ptr<QgsMeshDatasetGroup>(
datasetGroup ) );
733 return mGroups.size() - 1;
739 mGroups.erase( mGroups.begin() + groupIndex );
757 if ( groupIndex >= 0 && groupIndex <
int( mGroups.size() ) )
758 return mGroups.at( groupIndex )->description();
765 if ( groupIndex >= 0 && groupIndex <
int( mGroups.size() ) )
766 return mGroups[groupIndex].get();
779 return QStringList();
784 return mGroups.size();
790 return mGroups.at( groupIndex )->datasetCount();
798 return mGroups.at( groupIndex )->groupMetadata();
805 int groupIndex = index.
group();
808 int datasetIndex = index.
dataset();
818 int groupIndex = index.
group();
822 int datasetIndex = index.
dataset();
832 int groupIndex = index.
group();
836 int datasetIndex = index.
dataset();
848 Q_UNUSED( faceIndex )
855 int groupIndex = index.
group();
859 int datasetIndex = index.
dataset();
869 int groupIndex = index.
group();
873 int datasetIndex = index.
dataset();
881 const QString &outputDriver,
883 const QVector<QgsMeshDataBlock> &datasetValues,
884 const QVector<QgsMeshDataBlock> &datasetActive,
885 const QVector<double> × )
887 Q_UNUSED( outputFilePath )
888 Q_UNUSED( outputDriver )
891 Q_UNUSED( datasetActive )
897 const QString &outputDriver,
899 int datasetGroupIndex )
901 Q_UNUSED( outputFilePath )
902 Q_UNUSED( outputDriver )
904 Q_UNUSED( datasetGroupIndex )
910 if ( groupIndex >= 0 && groupIndex <
int( mGroups.size() ) && mGroups[groupIndex] )
911 return mGroups[groupIndex]->writeXml( doc, context );
913 return QDomElement();
920 bool hasTemporal =
false;
921 for (
size_t g = 0; g < mGroups.size(); ++g )
bool hasTemporalCapabilities() const
Returns true if the provider has temporal capabilities available.
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....
QDateTime referenceTime() const
Returns the reference time.
MatchingTemporalDatasetMethod
Method for selection of temporal mesh dataset from a range time.
qint64 datasetTime(const QgsMeshDatasetIndex &index) const
Returns the relative time in milliseconds of the dataset.
Base class for providing data for QgsMeshLayer.
virtual bool removeDatasetGroup(int index)=0
Remove dataset group from the mesh.
void datasetGroupsAdded(int count)
Emitted when some new dataset groups have been added.
QgsMeshDataProviderTemporalCapabilities * temporalCapabilities() override
Returns the provider's temporal capabilities.
QgsMeshDatasetGroupTreeItem * datasetGroupTreeItem() const
Returns a pointer to the root of the dataset groups tree item.
QgsMeshDatasetMetadata datasetMetadata(const QgsMeshDatasetIndex &index) const
Returns the metadata of the dataset with global index.
void setDatasetGroupTreeItem(const QgsMeshDatasetGroupTreeItem *rootItem)
Sets the root of the dataset groups tree item.
QList< int > enabledDatasetGroupIndexes() const
Returns a list of all group indexes that are enabled.
bool addPersistentDatasets(const QString &path)
Adds persistent datasets from a file with path.
QgsMeshDatasetGroupMetadata datasetGroupMetadata(const QgsMeshDatasetIndex &index) const
Returns the metadata of the dataset group with global index.
bool isFaceActive(const QgsMeshDatasetIndex &index, int faceIndex) const
Returns whether face is active for particular dataset.
QList< int > datasetGroupIndexes() const
Returns a list of all group indexes.
bool hasTemporalCapabilities() const
Returns whether at lea&st one of stored dataset group is temporal.
void resetDatasetGroupTreeItem()
Resets to default state the dataset groups tree item.
QgsMeshDataBlock datasetValues(const QgsMeshDatasetIndex &index, int valueIndex, int count) const
Returns count values of the dataset with global index and from valueIndex.
QgsMeshDatasetIndex datasetIndexAtTime(qint64 time, int groupIndex, QgsMeshDataProviderTemporalCapabilities::MatchingTemporalDatasetMethod method) const
Returns the global dataset index of the dataset int the dataset group with groupIndex,...
bool saveDatasetGroup(QString filePath, int groupIndex, QString driver)
Saves on a file with filePath the dataset groups index with groupIndex with the specified driver.
QList< QgsMeshDatasetIndex > datasetIndexInTimeInterval(qint64 time1, qint64 time2, int groupIndex) const
Returns the global dataset index of the dataset int the dataset group with groupIndex,...
bool addDatasetGroup(QgsMeshDatasetGroup *group)
Adds a extra dataset group, take ownership, returns True if the group is effectivly added.
QgsMeshDatasetValue datasetValue(const QgsMeshDatasetIndex &index, int valueIndex) const
Returns the value of the dataset with global index and valueIndex.
void removeDatasetGroup(int groupIndex)
Removes dataset group with global index groupIndex.
QDomElement writeXml(QDomDocument &doc, const QgsReadWriteContext &context)
Writes the store's information in a DOM document.
int extraDatasetGroupCount() const
Returns the count of extra dataset groups.
int datasetGroupCount() const
Returns the count of dataset groups.
QgsMeshDatasetGroupStore(QgsMeshLayer *layer)
Constructor.
QgsMeshDataBlock areFacesActive(const QgsMeshDatasetIndex &index, int faceIndex, int count) const
Returns whether faces are active for particular dataset.
QString groupName(int groupIndex) const
Returns the name of the dataset group with global index groupIndex.
void setPersistentProvider(QgsMeshDataProvider *provider, const QStringList &extraDatasetUri)
Sets the persistent mesh data provider with the path of its extra dataset to be loaded by the provide...
qint64 datasetRelativeTime(const QgsMeshDatasetIndex &index) const
Returns the relative time of the dataset from the persistent provider reference time.
int datasetCount(int groupIndex) const
Returns the total count of dataset group in the store.
void readXml(const QDomElement &storeElem, const QgsReadWriteContext &context)
Reads the store's information from a DOM document.
int globalDatasetGroupIndexInSource(QgsMeshDatasetSourceInterface *source, int nativeGroupIndex) const
Returns the global dataset group index of the dataset group with native index nativeGroupIndex in the...
int indexFromGroupName(const QString &groupName) const
Returns the global dataset group index of the dataset with name groupName.
void datasetGroupsAdded(QList< int > indexes)
Emitted after dataset groups are added.
QgsMesh3DDataBlock dataset3dValues(const QgsMeshDatasetIndex &index, int faceIndex, int count) const
Returns count 3D values of the dataset with global index and from valueIndex.
Tree item for display of the mesh dataset groups.
QgsMeshDatasetGroupTreeItem * clone() const
Clones the item.
void setPersistentDatasetGroup(const QString &uri)
Set parameters of the item in accordance with the persistent dataset group with uri.
int childCount() const
Returns the count of children.
int datasetGroupIndex() const
QgsMeshDatasetGroupTreeItem * parentItem() const
Returns the parent item, nullptr if it is root item.
void removeChild(QgsMeshDatasetGroupTreeItem *item)
Removes and destroy a item child if exists.
void setDatasetGroup(QgsMeshDatasetGroup *datasetGroup)
Set parameters of the item in accordance with the dataset group.
void appendChild(QgsMeshDatasetGroupTreeItem *item)
Appends a child item.
QgsMeshDatasetGroupTreeItem * child(int row) const
Returns a child.
Abstract class that represents a dataset group.
bool isScalar() const
Returns whether the group contain scalar values.
bool checkValueCountPerDataset(int count) const
Returns whether all the datasets contain count values.
virtual QgsMeshDatasetMetadata datasetMetadata(int datasetIndex) const =0
Returns the metadata of the dataset with index datasetIndex.
QgsMeshDatasetGroupMetadata::DataType dataType() const
Returns the data type of the dataset group.
virtual void initialize()=0
Initialize the dataset group.
virtual int datasetCount() const =0
Returns the count of datasets in the group.
virtual QgsMeshDataset * dataset(int index) const =0
Returns the dataset with index.
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()
Interface for mesh datasets and dataset groups.
virtual Q_DECL_DEPRECATED bool persistDatasetGroup(const QString &path, const QgsMeshDatasetGroupMetadata &meta, const QVector< QgsMeshDataBlock > &datasetValues, const QVector< QgsMeshDataBlock > &datasetActive, const QVector< double > ×)
Creates a new dataset group from a data and persists it into a destination path.
virtual QgsMeshDatasetGroupMetadata datasetGroupMetadata(int groupIndex) const =0
Returns dataset group metadata.
virtual int datasetGroupCount() const =0
Returns number of datasets groups loaded.
std::unique_ptr< QgsMeshDataProviderTemporalCapabilities > mTemporalCapabilities
virtual bool addDataset(const QString &uri)=0
Associate dataset with the mesh.
QgsMeshDatasetValue represents single dataset value.
virtual QgsMeshDataBlock datasetValues(bool isScalar, int valueIndex, int count) const =0
Returns count values from valueIndex.
virtual bool isActive(int faceIndex) const =0
Returns whether the face is active.
virtual QgsMeshDataBlock areFacesActive(int faceIndex, int count) const =0
Returns whether faces are active.
virtual QgsMeshDatasetValue datasetValue(int valueIndex) const =0
Returns the value with index valueIndex.
Represents a mesh layer supporting display of data on structured or unstructured meshes.
int meshFaceCount() const
Returns the faces count of the mesh frame.
int meshEdgeCount() const
Returns the edges count of the mesh frame.
int meshVertexCount() const
Returns the vertices count of the mesh frame.
Represents a dataset group calculated from a formula string.
The class is used as a container of context for various read/write operations on other objects.
#define QgsDebugError(str)
#define INVALID_MESHLAYER_TIME