27 return mRegistry.keys();
32 return mDatasetGroupTreeRootItem->enabledDatasetGroupIndexes();
37 return mRegistry.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 mRegistry.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 = mRegistry.constBegin();
289 while ( it != mRegistry.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 mRegistry[globalIndex] = DatasetGroup{source, sourceIndex};
358 QgsDebugError( 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 = mRegistry.cbegin(); it != mRegistry.cend(); ++it )
388 if ( it.value().first == source && it.value().second == nativeGroupIndex )
397 return mGroupNameToGlobalIndex.value(
groupName, -1 );
407 DatasetGroup group = datasetGroup( groupIndex );
410 if ( group.first && group.second >= 0 )
411 fail = mPersistentProvider->
persistDatasetGroup( filePath, driver, group.first, group.second );
415 eraseDatasetGroup( group );
416 group.first = mPersistentProvider;
418 mRegistry[groupIndex] = group;
420 if ( mDatasetGroupTreeRootItem )
431void QgsMeshDatasetGroupStore::onPersistentDatasetAdded(
int count )
433 Q_ASSERT( mPersistentProvider );
437 QList<int> newGroupIndexes;
438 for (
int i = providerBeginIndex; i < providerTotalCount; ++i )
441 if ( mGroupNameToGlobalIndex.empty() && i < mPersistentExtraDatasetGroupIndexes.count() )
444 mRegistry[mPersistentExtraDatasetGroupIndexes.at( i )] = DatasetGroup( mPersistentProvider, i );
446 else if ( mGroupNameToGlobalIndex.contains(
groupName ) )
449 registerDatasetGroup( DatasetGroup{mPersistentProvider, i} );
453 int newGroupIndex = registerDatasetGroup( DatasetGroup{mPersistentProvider, i} );
454 if ( newGroupIndex != -1 )
455 newGroupIndexes.append( newGroupIndex );
459 if ( !newGroupIndexes.isEmpty() )
461 createDatasetGroupTreeItems( newGroupIndexes );
462 mPersistentExtraDatasetGroupIndexes.append( newGroupIndexes );
464 for (
int groupIndex : std::as_const( newGroupIndexes ) )
465 syncItemToDatasetGroup( groupIndex );
471void QgsMeshDatasetGroupStore::removePersistentProvider()
473 if ( !mPersistentProvider )
478 QMap < int, DatasetGroup>::iterator it = mRegistry.begin();
479 while ( it != mRegistry.end() )
481 if ( it.value().first == mPersistentProvider )
482 it = mRegistry.erase( it );
487 mPersistentProvider =
nullptr;
490int QgsMeshDatasetGroupStore::newIndex()
492 QSet usedIndex = qgis::listToSet( mRegistry.keys() );
493 usedIndex.unite( qgis::listToSet( mGroupNameToGlobalIndex.values() ) );
496 while ( usedIndex.contains( index ) )
502int QgsMeshDatasetGroupStore::registerDatasetGroup(
const QgsMeshDatasetGroupStore::DatasetGroup &group )
504 const QString &name = group.first->datasetGroupMetadata( group.second ).name();
505 auto it = mGroupNameToGlobalIndex.find( name );
508 if ( it != mGroupNameToGlobalIndex.end() )
510 groupIndex = it.value();
512 if ( mRegistry.contains( groupIndex ) )
514 QgsDebugError( QStringLiteral(
"Duplicate group name for %1." ).arg( name ) );
520 groupIndex = newIndex();
521 mGroupNameToGlobalIndex.insert( name, groupIndex );
524 mRegistry[groupIndex] = group;
528void QgsMeshDatasetGroupStore::eraseDatasetGroup(
const QgsMeshDatasetGroupStore::DatasetGroup &group )
530 if ( group.first == mPersistentProvider )
532 else if ( group.first == &mExtraDatasets )
533 eraseExtraDataset( group.second );
536void QgsMeshDatasetGroupStore::eraseExtraDataset(
int indexInExtraStore )
541 QMap < int, DatasetGroup>::iterator it = mRegistry.begin();
542 while ( it != mRegistry.end() )
544 int localIndex = it.value().second;
545 if ( it.value().first == &mExtraDatasets && localIndex > indexInExtraStore )
546 it->second = localIndex - 1;
558 if ( globalIndex == -1 )
559 globalIndex = registerDatasetGroup( DatasetGroup{source, i} );
561 if ( globalIndex != - 1 )
562 indexes.append( globalIndex );
565 if ( !indexes.isEmpty() )
566 createDatasetGroupTreeItems( indexes );
568 const QList<int> globalIndexes = mRegistry.keys();
569 for (
int globalIndex : globalIndexes )
571 if ( mRegistry.value( globalIndex ).first == source )
572 syncItemToDatasetGroup( globalIndex );
576void QgsMeshDatasetGroupStore::removeUnregisteredItemFromTree()
578 QList<QgsMeshDatasetGroupTreeItem *> itemsToCheck;
579 QList<int> indexItemToRemove;
580 for (
int i = 0; i < mDatasetGroupTreeRootItem->childCount(); ++i )
581 itemsToCheck.append( mDatasetGroupTreeRootItem->child( i ) );
583 while ( !itemsToCheck.isEmpty() )
587 if ( !mRegistry.contains( globalIndex ) )
588 indexItemToRemove.append( globalIndex );
589 for (
int i = 0; i < item->
childCount(); ++i )
590 itemsToCheck.append( item->
child( i ) );
593 for (
int i : indexItemToRemove )
601void QgsMeshDatasetGroupStore::unregisterGroupNotPresentInTree()
603 if ( !mDatasetGroupTreeRootItem )
609 QMap < int, DatasetGroup>::iterator it = mRegistry.begin();
610 while ( it != mRegistry.end() )
612 DatasetGroup datasetGroup = it.value();
613 int globalIndex = it.key();
614 if ( ! mDatasetGroupTreeRootItem->childFromDatasetGroupIndex( globalIndex )
615 && datasetGroup.first != mPersistentProvider )
617 it = mRegistry.erase( it );
618 eraseDatasetGroup( datasetGroup );
625void QgsMeshDatasetGroupStore::syncItemToDatasetGroup(
int groupIndex )
627 if ( !mDatasetGroupTreeRootItem )
629 const DatasetGroup group = datasetGroup( groupIndex );
631 if ( group.first == mPersistentProvider && mPersistentProvider )
637 else if ( group.first == &mExtraDatasets )
644void QgsMeshDatasetGroupStore::createDatasetGroupTreeItems(
const QList<int> &indexes )
646 QMap<QString, QgsMeshDatasetGroupTreeItem *> mNameToItem;
648 for (
int i = 0; i < indexes.count(); ++i )
650 int groupIndex = indexes.at( i );
651 if ( mDatasetGroupTreeRootItem->childFromDatasetGroupIndex( groupIndex ) )
654 const QString name = meta.
name();
655 const QStringList subdatasets = name.split(
'/' );
657 QString displayName = name;
660 if ( subdatasets.size() == 2 )
662 auto it = mNameToItem.find( subdatasets[0] );
663 if ( it == mNameToItem.end() )
664 QgsDebugError( QStringLiteral(
"Unable to find parent group for %1." ).arg( name ) );
667 displayName = subdatasets[1];
671 else if ( subdatasets.size() != 1 )
672 QgsDebugError( QStringLiteral(
"Ignoring too deep child group name %1." ).arg( name ) );
676 if ( mNameToItem.contains( name ) )
677 QgsDebugError( QStringLiteral(
"Group %1 is not unique" ).arg( displayName ) );
678 mNameToItem[name] = item;
684 int groupIndex = mGroups.size();
685 mGroups.push_back( std::unique_ptr<QgsMeshDatasetGroup>(
datasetGroup ) );
694 return mGroups.size() - 1;
700 mGroups.erase( mGroups.begin() + index );
718 if ( groupIndex >= 0 && groupIndex <
int( mGroups.size() ) )
719 return mGroups.at( groupIndex )->description();
726 if ( groupIndex >= 0 && groupIndex <
int( mGroups.size() ) )
727 return mGroups[groupIndex].get();
740 return QStringList();
745 return mGroups.size();
751 return mGroups.at( groupIndex )->datasetCount();
759 return mGroups.at( groupIndex )->groupMetadata();
766 int groupIndex = index.
group();
769 int datasetIndex = index.
dataset();
779 int groupIndex = index.
group();
783 int datasetIndex = index.
dataset();
793 int groupIndex = index.
group();
797 int datasetIndex = index.
dataset();
809 Q_UNUSED( faceIndex )
816 int groupIndex = index.
group();
820 int datasetIndex = index.
dataset();
830 int groupIndex = index.
group();
834 int datasetIndex = index.
dataset();
842 const QString &outputDriver,
844 const QVector<QgsMeshDataBlock> &datasetValues,
845 const QVector<QgsMeshDataBlock> &datasetActive,
846 const QVector<double> × )
848 Q_UNUSED( outputFilePath )
849 Q_UNUSED( outputDriver )
852 Q_UNUSED( datasetActive )
858 const QString &outputDriver,
860 int datasetGroupIndex )
862 Q_UNUSED( outputFilePath )
863 Q_UNUSED( outputDriver )
865 Q_UNUSED( datasetGroupIndex )
871 if ( groupIndex >= 0 && groupIndex <
int( mGroups.size() ) && mGroups[groupIndex] )
872 return mGroups[groupIndex]->writeXml( doc, context );
874 return QDomElement();
881 bool hasTemporal =
false;
882 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.
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.
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