Branch data Line data Source code
1 : : /*************************************************************************** 2 : : qgsmeshdatasetgroupstore.h 3 : : --------------------- 4 : : begin : June 2020 5 : : copyright : (C) 2020 by Vincent Cloarec 6 : : email : vcloarec at gmail dot com 7 : : ***************************************************************************/ 8 : : 9 : : /*************************************************************************** 10 : : * * 11 : : * This program is free software; you can redistribute it and/or modify * 12 : : * it under the terms of the GNU General Public License as published by * 13 : : * the Free Software Foundation; either version 2 of the License, or * 14 : : * (at your option) any later version. * 15 : : * * 16 : : ***************************************************************************/ 17 : : 18 : : #ifndef QGSMESHDATASETGROUPSTORE_H 19 : : #define QGSMESHDATASETGROUPSTORE_H 20 : : 21 : : #define SIP_NO_FILE 22 : : 23 : : #include "qgsmeshdataprovider.h" 24 : : #include "qgsmeshdataset.h" 25 : : 26 : : class QgsMeshLayer; 27 : : 28 : : /** 29 : : * \ingroup core 30 : : * 31 : : * \brief Class that can be used to store and access extra dataset group, like memory dataset (temporary) 32 : : * Derived from QgsMeshDatasetSourceInterface, this class has same methods as QgsMeshDataProvider to access to the datasets. 33 : : * 34 : : * \since QGIS 3.16 35 : : */ 36 : 0 : class QgsMeshExtraDatasetStore: public QgsMeshDatasetSourceInterface 37 : : { 38 : : public: 39 : : 40 : : //! Adds a dataset group, returns the index of the added dataset group 41 : : int addDatasetGroup( QgsMeshDatasetGroup *datasetGroup ); 42 : : 43 : : //! Removes the dataset group with the local \a index 44 : : void removeDatasetGroup( int index ); 45 : : 46 : : //! Returns whether if the dataset groups have temporal capabilities (a least one dataset group with more than one dataset) 47 : : bool hasTemporalCapabilities() const; 48 : : 49 : : //! Returns the relative times of the dataset index with \a index, returned value in milliseconds 50 : : quint64 datasetRelativeTime( QgsMeshDatasetIndex index ); 51 : : 52 : : //! Returns information related to the dataset group with \a groupIndex 53 : : QString description( int groupIndex ) const; 54 : : 55 : : //! Returns a pointer to the dataset group 56 : : QgsMeshDatasetGroup *datasetGroup( int groupIndex ) const; 57 : : 58 : : int datasetGroupCount() const override; 59 : : int datasetCount( int groupIndex ) const override; 60 : : QgsMeshDatasetGroupMetadata datasetGroupMetadata( int groupIndex ) const override; 61 : : QgsMeshDatasetMetadata datasetMetadata( QgsMeshDatasetIndex index ) const override; 62 : : QgsMeshDatasetValue datasetValue( QgsMeshDatasetIndex index, int valueIndex ) const override; 63 : : QgsMeshDataBlock datasetValues( QgsMeshDatasetIndex index, int valueIndex, int count ) const override; 64 : : QgsMesh3dDataBlock dataset3dValues( QgsMeshDatasetIndex index, int faceIndex, int count ) const override; 65 : : bool isFaceActive( QgsMeshDatasetIndex index, int faceIndex ) const override; 66 : : QgsMeshDataBlock areFacesActive( QgsMeshDatasetIndex index, int faceIndex, int count ) const override; 67 : : 68 : : //! Not implemented, always returns false 69 : : bool addDataset( const QString &uri ) override; 70 : : 71 : : //! Not implemented, always returns empty list 72 : : QStringList extraDatasets() const override; 73 : : 74 : : //! Not implemented, always returns true 75 : : bool persistDatasetGroup( const QString &outputFilePath, 76 : : const QString &outputDriver, 77 : : const QgsMeshDatasetGroupMetadata &meta, 78 : : const QVector<QgsMeshDataBlock> &datasetValues, 79 : : const QVector<QgsMeshDataBlock> &datasetActive, 80 : : const QVector<double> × ) override; 81 : : 82 : : //! Not implemented, always returns true 83 : : bool persistDatasetGroup( const QString &outputFilePath, 84 : : const QString &outputDriver, 85 : : QgsMeshDatasetSourceInterface *source, 86 : : int datasetGroupIndex ) override; 87 : : 88 : : //! Writes the store's information in a DOM document 89 : : QDomElement writeXml( int groupIndex, QDomDocument &doc, const QgsReadWriteContext &context ); 90 : : 91 : : //! Updates the temporal capabilities 92 : : void updateTemporalCapabilities(); 93 : : 94 : : private: 95 : : std::vector<std::unique_ptr<QgsMeshDatasetGroup>> mGroups; 96 : : }; 97 : : 98 : : /** 99 : : * \ingroup core 100 : : * 101 : : * \brief Class used to register and access all the dataset groups related to a mesh layer 102 : : * 103 : : * The registered dataset group are : 104 : : * 105 : : * - the ones from the data provider of the mesh layer 106 : : * - extra dataset group that can be added, for example by the mesh calculator 107 : : * 108 : : * Every dataset group has a unique global index group that can be different from the native index group of the dataset group. 109 : : * This storing class has the repsonsability to assign this unique grlobal dataset group index and to link this dataset group index with the dataset group 110 : : * 111 : : * All dataset values or information needed can be retrieved from a QgsMeshDatasetIndex with the group index corresponding to the global group index. 112 : : * The native group index is not exposed and global index can be obtained with datasetGroupIndexes() that returns the list of global index available. 113 : : * The dataset index is the same than in the native source (data provider or other dataset source) 114 : : * 115 : : * This class as also the responsibility to handle the dataset group tree item that contain information to display the available dataset (\see QgsMeshDatasetGroupTreeItem) 116 : : * 117 : : * \since QGIS 3.16 118 : : */ 119 : : class QgsMeshDatasetGroupStore: public QObject 120 : : { 121 : : Q_OBJECT 122 : : 123 : : //! Contains a pointer to the dataset source inerface and the index on this dataset groups container 124 : : typedef QPair<QgsMeshDatasetSourceInterface *, int> DatasetGroup; 125 : : 126 : : public: 127 : : //! Constructor 128 : : QgsMeshDatasetGroupStore( QgsMeshLayer *layer ); 129 : : 130 : : //! Sets the persistent mesh data provider 131 : : void setPersistentProvider( QgsMeshDataProvider *provider ); 132 : : 133 : : //! Adds persistent datasets from a file with \a path 134 : : bool addPersistentDatasets( const QString &path ); 135 : : 136 : : /** 137 : : * Adds a extra dataset \a group, take ownership 138 : : * 139 : : * \note as QgsMeshDatasetGroup doesn't support reference time, 140 : : * the dataset group is supposed to have the same reference time than the pesristent provider 141 : : */ 142 : : bool addDatasetGroup( QgsMeshDatasetGroup *group ); 143 : : 144 : : //! Saves on a file with \a filePath the dataset groups index with \a groupIndex with the specified \a driver 145 : : bool saveDatasetGroup( QString filePath, int groupIndex, QString driver ); 146 : : 147 : : //! Resets to default state the dataset groups tree item 148 : : void resetDatasetGroupTreeItem(); 149 : : 150 : : //! Returns a pointer to the root of the dataset groups tree item 151 : : QgsMeshDatasetGroupTreeItem *datasetGroupTreeItem() const; 152 : : 153 : : //! Sets the root of the dataset groups tree item, doesn't take onwnershib but clone the root item 154 : : void setDatasetGroupTreeItem( QgsMeshDatasetGroupTreeItem *rootItem ); 155 : : 156 : : //! Returns a list of all group indexes 157 : : QList<int> datasetGroupIndexes() const; 158 : : 159 : : /** 160 : : * Returns a list of all group indexes that are enabled 161 : : * 162 : : * \since QGIS 3.16.3 163 : : */ 164 : : QList<int> enabledDatasetGroupIndexes() const; 165 : : 166 : : //! Returns the count of dataset groups 167 : : int datasetGroupCount() const; 168 : : 169 : : //! Returns the count of extra dataset groups 170 : : int extraDatasetGroupCount() const; 171 : : 172 : : //! Returns the total count of dataset group in the store 173 : : int datasetCount( int groupIndex ) const; 174 : : 175 : : //! Returns the metadata of the dataset group with global \a index 176 : : QgsMeshDatasetGroupMetadata datasetGroupMetadata( const QgsMeshDatasetIndex &index ) const; 177 : : 178 : : //! Returns the metadata of the dataset with global \a index 179 : : QgsMeshDatasetMetadata datasetMetadata( const QgsMeshDatasetIndex &index ) const; 180 : : 181 : : //! Returns the value of the dataset with global \a index and \a valueIndex 182 : : QgsMeshDatasetValue datasetValue( const QgsMeshDatasetIndex &index, int valueIndex ) const; 183 : : 184 : : //! Returns \a count values of the dataset with global \a index and from \a valueIndex 185 : : QgsMeshDataBlock datasetValues( const QgsMeshDatasetIndex &index, int valueIndex, int count ) const; 186 : : 187 : : //! Returns \a count 3D values of the dataset with global \a index and from \a valueIndex 188 : : QgsMesh3dDataBlock dataset3dValues( const QgsMeshDatasetIndex &index, int faceIndex, int count ) const; 189 : : 190 : : //! Returns whether faces are active for particular dataset 191 : : QgsMeshDataBlock areFacesActive( const QgsMeshDatasetIndex &index, int faceIndex, int count ) const; 192 : : 193 : : //! Returns whether face is active for particular dataset 194 : : bool isFaceActive( const QgsMeshDatasetIndex &index, int faceIndex ) const; 195 : : 196 : : //! Returns the global dataset index of the dataset int the dataset group with \a groupIndex, corresponding to the relative \a time and the check \a method 197 : : QgsMeshDatasetIndex datasetIndexAtTime( qint64 time, 198 : : int groupIndex, 199 : : QgsMeshDataProviderTemporalCapabilities::MatchingTemporalDatasetMethod method ) const; 200 : : 201 : : //! Returns the relative time of the dataset from the persistent provider reference time 202 : : qint64 datasetRelativeTime( const QgsMeshDatasetIndex &index ) const; 203 : : 204 : : //! Returns whether at lea&st one of stored dataset group is temporal 205 : : bool hasTemporalCapabilities() const; 206 : : 207 : : //! Writes the store's information in a DOM document 208 : : QDomElement writeXml( QDomDocument &doc, const QgsReadWriteContext &context ); 209 : : 210 : : //! Reads the store's information from a DOM document 211 : : void readXml( const QDomElement &storeElem, const QgsReadWriteContext &context ); 212 : : 213 : : signals: 214 : : //! Emitted after dataset groups are added 215 : : void datasetGroupsAdded( QList<int> indexes ); 216 : : 217 : : private slots: 218 : : void onPersistentDatasetAdded( int count ); 219 : : 220 : : private: 221 : : QgsMeshLayer *mLayer = nullptr; 222 : : QgsMeshDataProvider *mPersistentProvider = nullptr; 223 : : std::unique_ptr<QgsMeshExtraDatasetStore> mExtraDatasets; 224 : : QMap < int, DatasetGroup> mRegistery; 225 : : std::unique_ptr<QgsMeshDatasetGroupTreeItem> mDatasetGroupTreeRootItem; 226 : : 227 : : void removePersistentProvider(); 228 : : 229 : : DatasetGroup datasetGroup( int index ) const; 230 : : int newIndex(); 231 : : 232 : : int registerDatasetGroup( const DatasetGroup &group ); 233 : : int nativeIndexToGroupIndex( QgsMeshDatasetSourceInterface *source, int providerIndex ); 234 : : void createDatasetGroupTreeItems( const QList<int> &indexes ); 235 : : 236 : : //! Erases from the where this is store, not from the store (registry and tree item), for persistent dataset group, do nothing 237 : : void eraseDatasetGroup( const DatasetGroup &group ); 238 : : 239 : : //! Erases from the extra store but not from the main store (e.g. from egistry and from tree item)) 240 : : void eraseExtraDataset( int indexInExtraStore ); 241 : : 242 : : void checkDatasetConsistency( QgsMeshDatasetSourceInterface *source ); 243 : : void removeUnregisteredItemFromTree(); 244 : : void unregisterGroupNotPresentInTree(); 245 : : 246 : : void syncItemToDatasetGroup( int groupIndex ); 247 : : }; 248 : : 249 : : #endif // QGSMESHDATASETGROUPSTORE_H