27 return mRegistery.keys();
32 return mDatasetGroupTreeRootItem->enabledDatasetGroupIndexes();
37 return mRegistery.count();
52 removePersistentProvider();
53 mPersistentProvider = provider;
54 if ( !mPersistentProvider )
56 for (
const QString &uri : extraDatasetUri )
61 checkDatasetConsistency( mPersistentProvider );
62 removeUnregisteredItemFromTree();
66 for (
int i = 0; i < groupCount; ++i )
75QgsMeshDatasetGroupStore::DatasetGroup QgsMeshDatasetGroupStore::datasetGroup(
int index )
const
77 return mRegistery.value( index, DatasetGroup{
nullptr, -1} );
82 if ( !mPersistentProvider )
84 return mPersistentProvider->
addDataset( path ) ;
112 int groupIndex = registerDatasetGroup( DatasetGroup{&mExtraDatasets, nativeIndex} );
114 if ( groupIndex == -1 )
117 QList<int> groupIndexes;
118 groupIndexes.append( groupIndex );
119 createDatasetGroupTreeItems( groupIndexes );
120 syncItemToDatasetGroup( groupIndex );
132 for (
int groupIndex : groupIndexes )
133 syncItemToDatasetGroup( groupIndex );
138 return mDatasetGroupTreeRootItem.get();
144 mDatasetGroupTreeRootItem.reset( rootItem->
clone() );
146 mDatasetGroupTreeRootItem.reset();
148 unregisterGroupNotPresentInTree();
153 QgsMeshDatasetGroupStore::DatasetGroup group = datasetGroup( index.
group() );
155 return group.first->datasetGroupMetadata( group.second );
162 QgsMeshDatasetGroupStore::DatasetGroup group = datasetGroup( groupIndex );
164 return group.first->datasetCount( group.second );
171 QgsMeshDatasetGroupStore::DatasetGroup group = datasetGroup( index.
group() );
180 QgsMeshDatasetGroupStore::DatasetGroup group = datasetGroup( index.
group() );
189 QgsMeshDatasetGroupStore::DatasetGroup group = datasetGroup( index.
group() );
198 QgsMeshDatasetGroupStore::DatasetGroup group = datasetGroup( index.
group() );
207 QgsMeshDatasetGroupStore::DatasetGroup group = datasetGroup( index.
group() );
216 QgsMeshDatasetGroupStore::DatasetGroup group = datasetGroup( index.
group() );
227 QgsMeshDatasetGroupStore::DatasetGroup group = datasetGroup( groupIndex );
234 group.first->datasetIndexAtTime( referenceTime, group.second, time, method ).dataset() );
240 int groupIndex )
const
242 const QgsMeshDatasetGroupStore::DatasetGroup group = datasetGroup( groupIndex );
244 return QList<QgsMeshDatasetIndex>();
248 const QList<QgsMeshDatasetIndex> datasetIndexes = group.first->datasetIndexInTimeInterval( referenceTime, group.second, time1, time2 );
250 QList<QgsMeshDatasetIndex> ret;
251 ret.reserve( datasetIndexes.count() );
261 QgsMeshDatasetGroupStore::DatasetGroup group = datasetGroup( index.
group() );
262 if ( !group.first || group.second < 0 )
267 if ( group.first == mPersistentProvider )
269 else if ( group.first == &mExtraDatasets )
285 QDomElement storeElement = doc.createElement( QStringLiteral(
"mesh-dataset-groups-store" ) );
286 storeElement.appendChild( mDatasetGroupTreeRootItem->writeXml( doc, context ) );
288 QMap < int, DatasetGroup>::const_iterator it = mRegistery.constBegin();
289 while ( it != mRegistery.constEnd() )
291 QDomElement elemDataset;
292 if ( it.value().first == mPersistentProvider )
294 elemDataset = doc.createElement( QStringLiteral(
"mesh-dataset" ) );
295 elemDataset.setAttribute( QStringLiteral(
"global-index" ), it.key() );
296 elemDataset.setAttribute( QStringLiteral(
"source-type" ), QStringLiteral(
"persitent-provider" ) );
297 elemDataset.setAttribute( QStringLiteral(
"source-index" ), it.value().second );
299 else if ( it.value().first == &mExtraDatasets )
304 elemDataset = mExtraDatasets.
writeXml( it.value().second, doc, context );
305 if ( !elemDataset.isNull() )
306 elemDataset.setAttribute( QStringLiteral(
"global-index" ), it.key() );
310 if ( !elemDataset.isNull() )
311 storeElement.appendChild( elemDataset );
315 for (
auto it = mGroupNameToGlobalIndex.constBegin(); it != mGroupNameToGlobalIndex.constEnd(); ++it )
317 QDomElement elemNameToIndex = doc.createElement( QStringLiteral(
"name-to-global-index" ) );
318 elemNameToIndex.setAttribute( QStringLiteral(
"name" ), it.key() );
319 elemNameToIndex.setAttribute( QStringLiteral(
"global-index" ), it.value() );
321 storeElement.appendChild( elemNameToIndex );
331 QDomElement datasetElem = storeElem.firstChildElement(
"mesh-dataset" );
332 QMap<int, QgsMeshDatasetGroup *> extraDatasetGroups;
333 while ( !datasetElem.isNull() )
335 int globalIndex = datasetElem.attribute( QStringLiteral(
"global-index" ) ).toInt();
337 const QString sourceType = datasetElem.attribute( QStringLiteral(
"source-type" ) );
338 if ( sourceType == QLatin1String(
"persitent-provider" ) )
340 mPersistentExtraDatasetGroupIndexes.append( globalIndex );
342 else if ( sourceType == QLatin1String(
"virtual" ) )
345 QString name = datasetElem.attribute( QStringLiteral(
"name" ) );
346 QString formula = datasetElem.attribute( QStringLiteral(
"formula" ) );
347 qint64 startTime = datasetElem.attribute( QStringLiteral(
"start-time" ) ).toLongLong();
348 qint64 endTime = datasetElem.attribute( QStringLiteral(
"end-time" ) ).toLongLong();
351 extraDatasetGroups[globalIndex] = dsg;
354 mRegistery[globalIndex] = DatasetGroup{source, sourceIndex};
358 QgsDebugMsg( QStringLiteral(
"Unhandled source-type: %1." ).arg( sourceType ) );
361 datasetElem = datasetElem.nextSiblingElement( QStringLiteral(
"mesh-dataset" ) );
364 QDomElement nameToIndexElem = storeElem.firstChildElement(
"name-to-global-index" );
365 mGroupNameToGlobalIndex.clear();
366 while ( !nameToIndexElem.isNull() )
368 QString name = nameToIndexElem.attribute( QStringLiteral(
"name" ) );
369 int globalIndex = nameToIndexElem.attribute( QStringLiteral(
"global-index" ) ).toInt();
371 mGroupNameToGlobalIndex.insert( name, globalIndex );
373 nameToIndexElem = nameToIndexElem.nextSiblingElement( QStringLiteral(
"name-to-global-index" ) );
376 QDomElement rootTreeItemElem = storeElem.firstChildElement( QStringLiteral(
"mesh-dataset-group-tree-item" ) );
377 if ( !rootTreeItemElem.isNull() )
386 for ( QMap<int, DatasetGroup>::const_iterator it = mRegistery.cbegin(); it != mRegistery.cend(); ++it )
388 if ( it.value().first == source && it.value().second == nativeGroupIndex )
397 DatasetGroup group = datasetGroup( groupIndex );
400 if ( group.first && group.second >= 0 )
401 fail = mPersistentProvider->
persistDatasetGroup( filePath, driver, group.first, group.second );
405 eraseDatasetGroup( group );
406 group.first = mPersistentProvider;
408 mRegistery[groupIndex] = group;
410 if ( mDatasetGroupTreeRootItem )
421void QgsMeshDatasetGroupStore::onPersistentDatasetAdded(
int count )
423 Q_ASSERT( mPersistentProvider );
427 QList<int> newGroupIndexes;
428 for (
int i = providerBeginIndex; i < providerTotalCount; ++i )
431 if ( mGroupNameToGlobalIndex.empty() && i < mPersistentExtraDatasetGroupIndexes.count() )
434 mRegistery[mPersistentExtraDatasetGroupIndexes.at( i )] = DatasetGroup( mPersistentProvider, i );
436 else if ( mGroupNameToGlobalIndex.contains( groupName ) )
439 registerDatasetGroup( DatasetGroup{mPersistentProvider, i} );
443 int newGroupIndex = registerDatasetGroup( DatasetGroup{mPersistentProvider, i} );
444 if ( newGroupIndex != -1 )
445 newGroupIndexes.append( newGroupIndex );
449 if ( !newGroupIndexes.isEmpty() )
451 createDatasetGroupTreeItems( newGroupIndexes );
452 mPersistentExtraDatasetGroupIndexes.append( newGroupIndexes );
454 for (
int groupIndex : std::as_const( newGroupIndexes ) )
455 syncItemToDatasetGroup( groupIndex );
461void QgsMeshDatasetGroupStore::removePersistentProvider()
463 if ( !mPersistentProvider )
468 QMap < int, DatasetGroup>::iterator it = mRegistery.begin();
469 while ( it != mRegistery.end() )
471 if ( it.value().first == mPersistentProvider )
472 it = mRegistery.erase( it );
477 mPersistentProvider =
nullptr;
480int QgsMeshDatasetGroupStore::newIndex()
482 QSet usedIndex = qgis::listToSet( mRegistery.keys() );
483 usedIndex.unite( qgis::listToSet( mGroupNameToGlobalIndex.values() ) );
486 while ( usedIndex.contains( index ) )
492int QgsMeshDatasetGroupStore::registerDatasetGroup(
const QgsMeshDatasetGroupStore::DatasetGroup &group )
494 const QString &name = group.first->datasetGroupMetadata( group.second ).name();
495 auto it = mGroupNameToGlobalIndex.find( name );
498 if ( it != mGroupNameToGlobalIndex.end() )
500 groupIndex = it.value();
502 if ( mRegistery.contains( groupIndex ) )
504 QgsDebugMsg( QStringLiteral(
"Dupplicate group name for %1." ).arg( name ) );
510 groupIndex = newIndex();
511 mGroupNameToGlobalIndex.insert( name, groupIndex );
514 mRegistery[groupIndex] = group;
518void QgsMeshDatasetGroupStore::eraseDatasetGroup(
const QgsMeshDatasetGroupStore::DatasetGroup &group )
520 if ( group.first == mPersistentProvider )
522 else if ( group.first == &mExtraDatasets )
523 eraseExtraDataset( group.second );
526void QgsMeshDatasetGroupStore::eraseExtraDataset(
int indexInExtraStore )
531 QMap < int, DatasetGroup>::iterator it = mRegistery.begin();
532 while ( it != mRegistery.end() )
534 int localIndex = it.value().second;
535 if ( it.value().first == &mExtraDatasets && localIndex > indexInExtraStore )
536 it->second = localIndex - 1;
548 if ( globalIndex == -1 )
549 globalIndex = registerDatasetGroup( DatasetGroup{source, i} );
551 if ( globalIndex != - 1 )
552 indexes.append( globalIndex );
555 if ( !indexes.isEmpty() )
556 createDatasetGroupTreeItems( indexes );
558 const QList<int> globalIndexes = mRegistery.keys();
559 for (
int globalIndex : globalIndexes )
561 if ( mRegistery.value( globalIndex ).first == source )
562 syncItemToDatasetGroup( globalIndex );
566void QgsMeshDatasetGroupStore::removeUnregisteredItemFromTree()
568 QList<QgsMeshDatasetGroupTreeItem *> itemsToCheck;
569 QList<int> indexItemToRemove;
570 for (
int i = 0; i < mDatasetGroupTreeRootItem->childCount(); ++i )
571 itemsToCheck.append( mDatasetGroupTreeRootItem->child( i ) );
573 while ( !itemsToCheck.isEmpty() )
577 if ( !mRegistery.contains( globalIndex ) )
578 indexItemToRemove.append( globalIndex );
579 for (
int i = 0; i < item->
childCount(); ++i )
580 itemsToCheck.append( item->
child( i ) );
583 for (
int i : indexItemToRemove )
591void QgsMeshDatasetGroupStore::unregisterGroupNotPresentInTree()
593 if ( !mDatasetGroupTreeRootItem )
599 QMap < int, DatasetGroup>::iterator it = mRegistery.begin();
600 while ( it != mRegistery.end() )
602 DatasetGroup datasetGroup = it.value();
603 int globalIndex = it.key();
604 if ( ! mDatasetGroupTreeRootItem->childFromDatasetGroupIndex( globalIndex )
605 && datasetGroup.first != mPersistentProvider )
607 it = mRegistery.erase( it );
608 eraseDatasetGroup( datasetGroup );
615void QgsMeshDatasetGroupStore::syncItemToDatasetGroup(
int groupIndex )
617 if ( !mDatasetGroupTreeRootItem )
619 const DatasetGroup group = datasetGroup( groupIndex );
621 if ( group.first == mPersistentProvider && mPersistentProvider )
627 else if ( group.first == &mExtraDatasets )
634void QgsMeshDatasetGroupStore::createDatasetGroupTreeItems(
const QList<int> &indexes )
636 QMap<QString, QgsMeshDatasetGroupTreeItem *> mNameToItem;
638 for (
int i = 0; i < indexes.count(); ++i )
640 int groupIndex = indexes.at( i );
641 if ( mDatasetGroupTreeRootItem->childFromDatasetGroupIndex( groupIndex ) )
644 const QString name = meta.
name();
645 const QStringList subdatasets = name.split(
'/' );
647 QString displayName = name;
650 if ( subdatasets.size() == 2 )
652 auto it = mNameToItem.find( subdatasets[0] );
653 if ( it == mNameToItem.end() )
654 QgsDebugMsg( QStringLiteral(
"Unable to find parent group for %1." ).arg( name ) );
657 displayName = subdatasets[1];
661 else if ( subdatasets.size() != 1 )
662 QgsDebugMsg( QStringLiteral(
"Ignoring too deep child group name %1." ).arg( name ) );
666 if ( mNameToItem.contains( name ) )
667 QgsDebugMsg( QStringLiteral(
"Group %1 is not unique" ).arg( displayName ) );
668 mNameToItem[name] = item;
674 int groupIndex = mGroups.size();
675 mGroups.push_back( std::unique_ptr<QgsMeshDatasetGroup>(
datasetGroup ) );
684 return mGroups.size() - 1;
690 mGroups.erase( mGroups.begin() + index );
708 if ( groupIndex >= 0 && groupIndex <
int( mGroups.size() ) )
709 return mGroups.at( groupIndex )->description();
716 if ( groupIndex >= 0 && groupIndex <
int( mGroups.size() ) )
717 return mGroups[groupIndex].get();
730 return QStringList();
735 return mGroups.size();
741 return mGroups.at( groupIndex )->datasetCount();
749 return mGroups.at( groupIndex )->groupMetadata();
756 int groupIndex = index.
group();
759 int datasetIndex = index.
dataset();
769 int groupIndex = index.
group();
773 int datasetIndex = index.
dataset();
783 int groupIndex = index.
group();
787 int datasetIndex = index.
dataset();
799 Q_UNUSED( faceIndex )
806 int groupIndex = index.
group();
810 int datasetIndex = index.
dataset();
820 int groupIndex = index.
group();
824 int datasetIndex = index.
dataset();
832 const QString &outputDriver,
834 const QVector<QgsMeshDataBlock> &datasetValues,
835 const QVector<QgsMeshDataBlock> &datasetActive,
836 const QVector<double> × )
838 Q_UNUSED( outputFilePath )
839 Q_UNUSED( outputDriver )
842 Q_UNUSED( datasetActive )
848 const QString &outputDriver,
850 int datasetGroupIndex )
852 Q_UNUSED( outputFilePath )
853 Q_UNUSED( outputDriver )
855 Q_UNUSED( datasetGroupIndex )
861 if ( groupIndex >= 0 && groupIndex <
int( mGroups.size() ) && mGroups[groupIndex] )
862 return mGroups[groupIndex]->writeXml( doc, context );
864 return QDomElement();
871 bool hasTemporal =
false;
872 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.
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.
QgsMesh3dDataBlock dataset3dValues(const QgsMeshDatasetIndex &index, int faceIndex, int count) const
Returns count 3D 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.
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.
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...
void datasetGroupsAdded(QList< int > indexes)
Emitted after dataset groups are added.
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 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 INVALID_MESHLAYER_TIME