Branch data Line data Source code
1 : : /*************************************************************************** 2 : : qgsmeshdataprovidertemporalcapabilities.cpp 3 : : ----------------------- 4 : : begin : March 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 : : #include "qgsmeshdataprovidertemporalcapabilities.h" 19 : : 20 : : 21 : 0 : QgsMeshDataProviderTemporalCapabilities::QgsMeshDataProviderTemporalCapabilities(): QgsDataProviderTemporalCapabilities() 22 : 0 : {} 23 : : 24 : 0 : QgsMeshDatasetIndex QgsMeshDataProviderTemporalCapabilities::datasetIndexClosestFromRelativeTime( int group, qint64 timeSinceGlobalReference ) const 25 : : { 26 : : // No time --> non temporal dataset, so return the dataset that has to be the only one 27 : 0 : const QList<qint64> &datasetTimes = mDatasetTimeSinceGroupReference[group]; 28 : 0 : if ( datasetTimes.isEmpty() ) 29 : 0 : return QgsMeshDatasetIndex( group, 0 ); 30 : 0 : const QDateTime groupReference = mGroupsReferenceDateTime[group]; 31 : 0 : const qint64 timeSinceGroupReference = 32 : 0 : timeSinceGlobalReference - mGlobalReferenceDateTime.msecsTo( groupReference ); 33 : : 34 : 0 : if ( timeSinceGroupReference > datasetTimes.last() // after last time 35 : 0 : || timeSinceGroupReference < datasetTimes.first() ) // before first time 36 : 0 : return QgsMeshDatasetIndex(); 37 : : 38 : 0 : for ( int i = 1 ; i < datasetTimes.count(); ++i ) 39 : : { 40 : 0 : qint64 time1 = datasetTimes.at( i - 1 ); 41 : 0 : qint64 time2 = datasetTimes.at( i ); 42 : 0 : if ( time1 <= timeSinceGroupReference && timeSinceGroupReference <= time2 ) 43 : : { 44 : 0 : if ( abs( timeSinceGroupReference - time2 ) < abs( timeSinceGroupReference - time1 ) ) 45 : 0 : return QgsMeshDatasetIndex( group, i ); 46 : : else 47 : 0 : return QgsMeshDatasetIndex( group, i - 1 ); 48 : : } 49 : 0 : } 50 : : 51 : 0 : return QgsMeshDatasetIndex( QgsMeshDatasetIndex( group, datasetTimes.count() - 1 ) ); 52 : 0 : } 53 : : 54 : 0 : QgsMeshDatasetIndex QgsMeshDataProviderTemporalCapabilities::datasetIndexClosestBeforeRelativeTime( int group, qint64 timeSinceGlobalReference ) const 55 : : { 56 : : // No time --> non temporal dataset, so return the dataset that has to be the only one 57 : 0 : const QList<qint64> &datasetTimes = mDatasetTimeSinceGroupReference[group]; 58 : 0 : if ( datasetTimes.isEmpty() ) 59 : 0 : return QgsMeshDatasetIndex( group, 0 ); 60 : 0 : const QDateTime groupReference = mGroupsReferenceDateTime[group]; 61 : 0 : const qint64 timeSinceGroupReference = 62 : 0 : timeSinceGlobalReference - mGlobalReferenceDateTime.msecsTo( groupReference ); 63 : : 64 : 0 : if ( timeSinceGroupReference > datasetTimes.last() // after last time 65 : 0 : || timeSinceGroupReference < datasetTimes.first() ) // before first time 66 : 0 : return QgsMeshDatasetIndex(); 67 : : 68 : 0 : for ( int i = 1; i < datasetTimes.count(); ++i ) 69 : : { 70 : 0 : qint64 time = datasetTimes.at( i ); 71 : 0 : if ( timeSinceGroupReference < time ) 72 : 0 : return QgsMeshDatasetIndex( group, i - 1 ); 73 : 0 : } 74 : : 75 : 0 : return QgsMeshDatasetIndex( QgsMeshDatasetIndex( group, datasetTimes.count() - 1 ) ); 76 : 0 : } 77 : : 78 : 0 : void QgsMeshDataProviderTemporalCapabilities::addGroupReferenceDateTime( int group, const QDateTime &reference ) 79 : : { 80 : 0 : if ( ( !mGlobalReferenceDateTime.isValid() && reference.isValid() ) || 81 : 0 : ( reference.isValid() && mGlobalReferenceDateTime.isValid() && reference < mGlobalReferenceDateTime ) ) 82 : 0 : mGlobalReferenceDateTime = reference; 83 : : 84 : 0 : mGroupsReferenceDateTime[group] = reference; 85 : 0 : } 86 : : 87 : 0 : void QgsMeshDataProviderTemporalCapabilities::addDatasetTimeInMilliseconds( int group, qint64 time ) 88 : : { 89 : 0 : QList<qint64> &datasetTimes = mDatasetTimeSinceGroupReference[group]; 90 : 0 : datasetTimes.append( time ); 91 : 0 : } 92 : : 93 : 0 : void QgsMeshDataProviderTemporalCapabilities::addDatasetTime( int group, double time ) 94 : : { 95 : 0 : qint64 unitTimeFactor = QgsUnitTypes::fromUnitToUnitFactor( mTemporalUnit, QgsUnitTypes::TemporalMilliseconds ); 96 : 0 : addDatasetTimeInMilliseconds( group, time * unitTimeFactor ); 97 : 0 : } 98 : : 99 : 0 : bool QgsMeshDataProviderTemporalCapabilities::hasReferenceTime() const 100 : : { 101 : 0 : return mGlobalReferenceDateTime.isValid(); 102 : : } 103 : : 104 : 0 : QDateTime QgsMeshDataProviderTemporalCapabilities::referenceTime() const 105 : : { 106 : 0 : return mGlobalReferenceDateTime; 107 : : } 108 : : 109 : 0 : QgsDateTimeRange QgsMeshDataProviderTemporalCapabilities::timeExtent() const 110 : : { 111 : : 112 : 0 : return timeExtent( mGlobalReferenceDateTime ); 113 : : } 114 : : 115 : 0 : QgsDateTimeRange QgsMeshDataProviderTemporalCapabilities::timeExtent( const QDateTime &reference ) const 116 : : { 117 : 0 : QDateTime end; 118 : 0 : QDateTime begin; 119 : 0 : for ( QHash<int, QDateTime>::const_iterator it = mGroupsReferenceDateTime.constBegin() ; 120 : 0 : it != mGroupsReferenceDateTime.constEnd(); ++it ) 121 : : { 122 : 0 : QDateTime groupReference = it.value(); 123 : 0 : if ( !groupReference.isValid() ) //the dataset group has not a valid reference time -->take global reference 124 : 0 : groupReference = mGlobalReferenceDateTime; 125 : : 126 : 0 : if ( !groupReference.isValid() ) 127 : 0 : groupReference = reference; 128 : : 129 : 0 : const QList<qint64> times = mDatasetTimeSinceGroupReference[it.key()]; 130 : 0 : qint64 durationSinceFirst = groupReference.msecsTo( reference ); 131 : 0 : qint64 durationSinceLast = groupReference.msecsTo( reference ); 132 : 0 : if ( !times.isEmpty() ) 133 : : { 134 : 0 : durationSinceFirst += times.first(); 135 : 0 : durationSinceLast += times.last(); 136 : 0 : } 137 : : 138 : 0 : if ( !end.isValid() || groupReference.addMSecs( durationSinceLast ) > end ) 139 : 0 : end = groupReference.addMSecs( durationSinceLast ); 140 : : 141 : 0 : if ( !begin.isValid() || groupReference.addMSecs( durationSinceFirst ) > begin ) 142 : 0 : begin = groupReference.addMSecs( durationSinceFirst ); 143 : 0 : } 144 : : 145 : 0 : return QgsDateTimeRange( begin, end ); 146 : 0 : } 147 : : 148 : 0 : void QgsMeshDataProviderTemporalCapabilities::setTemporalUnit( QgsUnitTypes::TemporalUnit timeUnit ) 149 : : { 150 : 0 : mTemporalUnit = timeUnit; 151 : 0 : } 152 : : 153 : 0 : QgsUnitTypes::TemporalUnit QgsMeshDataProviderTemporalCapabilities::temporalUnit() const 154 : : { 155 : 0 : return mTemporalUnit; 156 : : } 157 : : 158 : 0 : qint64 QgsMeshDataProviderTemporalCapabilities::datasetTime( const QgsMeshDatasetIndex &index ) const 159 : : { 160 : 0 : if ( !index.isValid() ) 161 : 0 : return INVALID_MESHLAYER_TIME; 162 : : 163 : 0 : const QList<qint64> ×List = mDatasetTimeSinceGroupReference[index.group()]; 164 : 0 : if ( index.dataset() < timesList.count() ) 165 : 0 : return timesList.at( index.dataset() ); 166 : : else 167 : 0 : return INVALID_MESHLAYER_TIME; 168 : 0 : } 169 : : 170 : 0 : void QgsMeshDataProviderTemporalCapabilities::clear() 171 : : { 172 : 0 : mGlobalReferenceDateTime = QDateTime(); 173 : 0 : mGroupsReferenceDateTime.clear(); 174 : 0 : mDatasetTimeSinceGroupReference.clear(); 175 : 0 : } 176 : : 177 : 0 : qint64 QgsMeshDataProviderTemporalCapabilities::firstTimeStepDuration( int group ) const 178 : : { 179 : 0 : qint64 ret = -1; 180 : 0 : if ( mDatasetTimeSinceGroupReference.contains( group ) ) 181 : : { 182 : 0 : const QList<qint64> times = mDatasetTimeSinceGroupReference[group]; 183 : 0 : if ( times.count() > 1 ) 184 : 0 : ret = times.at( 1 ) - times.at( 0 ); 185 : 0 : } 186 : 0 : return ret; 187 : 0 : }