22using namespace Qt::StringLiterals;
26 const QString &formulaString,
28 qint64 relativeStartTime,
29 qint64 relativeEndTime ):
31 , mFormula( formulaString )
33 , mStartTime( relativeStartTime )
34 , mEndTime( relativeEndTime )
41 mCalcNode.reset( QgsMeshCalcNode::parseMeshCalcString( mFormula, errMessage ) );
43 if ( !mCalcNode || !mLayer )
46 mDatasetGroupNameUsed = mCalcNode->notAggregatedUsedDatasetGroupNames();
47 mDatasetGroupNameUsedForAggregate = mCalcNode->aggregatedUsedDatasetGroupNames();
48 setDataType( QgsMeshCalcUtils::determineResultDataType( mLayer,
49 mDatasetGroupNameUsed + mDatasetGroupNameUsedForAggregate ) );
52 QMap<QString, int> usedDatasetGroupindexes;
53 const QList<int> &indexes = mLayer->datasetGroupsIndexes();
54 for (
const int i : indexes )
56 const QString usedName = mLayer->datasetGroupMetadata( i ).name();
57 if ( mDatasetGroupNameUsed.contains( usedName ) )
58 usedDatasetGroupindexes[usedName] = i;
62 if ( !mCalcNode->isNonTemporal() )
65 const QList<int> &usedIndexes = usedDatasetGroupindexes.values();
66 for (
const int groupIndex : usedIndexes )
68 const int dsCount = mLayer->datasetCount( groupIndex );
74 for (
int i = 0; i < dsCount; i++ )
76 const qint64 time = mLayer->datasetRelativeTimeInMilliseconds(
QgsMeshDatasetIndex( groupIndex, i ) );
83 if ( times.isEmpty() )
86 mDatasetTimes = QList<qint64>( times.constBegin(), times.constEnd() );
87 std::sort( mDatasetTimes.begin(), mDatasetTimes.end() );
89 mDatasetMetaData = QVector<QgsMeshDatasetMetadata>( mDatasetTimes.count() );
93 while ( i < mDatasetTimes.count() )
95 mCurrentDatasetIndex = i;
96 if ( calculateDataset() )
99 mDatasetTimes.removeAt( i );
107 return mDatasetTimes.count();
112 if ( index < 0 || index >= mDatasetTimes.count() )
115 if ( index != mCurrentDatasetIndex )
117 mCurrentDatasetIndex = index;
121 return mCacheDataset.get();
126 if ( datasetIndex < 0 && datasetIndex >= mDatasetMetaData.count() )
129 return mDatasetMetaData.at( datasetIndex );
134 return mDatasetGroupNameUsed;
140 QDomElement elemDataset = doc.createElement( u
"mesh-dataset"_s );
141 elemDataset.setAttribute( u
"source-type"_s, u
"virtual"_s );
142 elemDataset.setAttribute( u
"name"_s,
name() );
143 elemDataset.setAttribute( u
"formula"_s, mFormula );
144 elemDataset.setAttribute( u
"start-time"_s, mStartTime );
145 elemDataset.setAttribute( u
"end-time"_s, mEndTime );
155bool QgsMeshVirtualDatasetGroup::calculateDataset()
const
160 const QgsMeshCalcUtils dsu( mLayer,
161 mDatasetGroupNameUsed,
162 mDatasetGroupNameUsedForAggregate,
163 QgsInterval( mDatasetTimes[mCurrentDatasetIndex] / 1000.0 ),
167 if ( !dsu.isValid() )
171 auto outputGroup = std::make_unique<QgsMeshMemoryDatasetGroup> ( QString(), dsu.outputType() );
172 mCalcNode->calculate( dsu, *outputGroup );
174 if ( outputGroup->memoryDatasets.isEmpty() )
177 mCacheDataset = outputGroup->memoryDatasets[0];
178 if ( !mDatasetMetaData[mCurrentDatasetIndex].isValid() )
180 mCacheDataset->calculateMinMax();
181 mCacheDataset->time = mDatasetTimes[mCurrentDatasetIndex] / 3600.0 / 1000.0;
182 mDatasetMetaData[mCurrentDatasetIndex] = mCacheDataset->metadata();
A representation of the interval between two datetime values.
QgsMeshDatasetGroup()=default
void setDataType(const QgsMeshDatasetGroupMetadata::DataType &dataType)
Sets the data type of the dataset group.
QString name() const
Returns the name of the dataset group.
void calculateStatistic() const
Calculates the statistics (minimum and maximum).
An index that identifies the dataset group (e.g.
Abstract class that represents a mesh dataset.
Represents a mesh layer supporting display of data on structured or unstructured meshes.
QgsMeshVirtualDatasetGroup(const QString &name, const QString &formulaString, QgsMeshLayer *layer, qint64 relativeStartTime, qint64 relativeEndTime)
Constructor.
QgsMeshDatasetMetadata datasetMetadata(int datasetIndex) const override
Returns the metadata of the dataset with index datasetIndex.
QStringList datasetGroupNamesDependentOn() const override
Returns the dataset group variable name which this dataset group depends on.
void initialize() override
Initialize the dataset group.
QDomElement writeXml(QDomDocument &doc, const QgsReadWriteContext &context) const override
Write dataset group information in a DOM element.
int datasetCount() const override
Returns the count of datasets in the group.
QgsMeshDataset * dataset(int index) const override
Returns the dataset with index.
QString description() const override
Returns some information about the dataset group.
A container for the context for various read/write operations on objects.
#define INVALID_MESHLAYER_TIME