Branch data Line data Source code
1 : : /*************************************************************************** 2 : : qgsmeshdataprovider.cpp 3 : : ----------------------- 4 : : begin : April 2018 5 : : copyright : (C) 2018 by Peter Petrik 6 : : email : zilolv 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 "qgis.h" 19 : : #include "qgsmeshdataprovider.h" 20 : : #include "qgsmeshdataprovidertemporalcapabilities.h" 21 : : #include "qgsrectangle.h" 22 : : 23 : 0 : QgsMeshDataProvider::QgsMeshDataProvider( const QString &uri, const QgsDataProvider::ProviderOptions &options, 24 : : QgsDataProvider::ReadFlags flags ) 25 : 0 : : QgsDataProvider( uri, options, flags ) 26 : 0 : { 27 : 0 : } 28 : : 29 : 0 : QgsMeshDataProviderTemporalCapabilities *QgsMeshDataProvider::temporalCapabilities() 30 : : { 31 : 0 : return mTemporalCapabilities.get(); 32 : : } 33 : : 34 : 0 : const QgsMeshDataProviderTemporalCapabilities *QgsMeshDataProvider::temporalCapabilities() const 35 : : { 36 : 0 : return mTemporalCapabilities.get(); 37 : : } 38 : : 39 : 0 : void QgsMeshDataProvider::setTemporalUnit( QgsUnitTypes::TemporalUnit unit ) 40 : : { 41 : 0 : QgsUnitTypes::TemporalUnit oldUnit = mTemporalCapabilities->temporalUnit(); 42 : 0 : mTemporalCapabilities->setTemporalUnit( unit ); 43 : 0 : if ( oldUnit != unit ) 44 : 0 : reloadData(); 45 : 0 : } 46 : : 47 : 0 : QgsMeshDatasetIndex QgsMeshDatasetSourceInterface::datasetIndexAtTime( 48 : : const QDateTime &referenceTime, 49 : : int groupIndex, quint64 time, 50 : : QgsMeshDataProviderTemporalCapabilities::MatchingTemporalDatasetMethod method ) const 51 : : { 52 : 0 : QDateTime requestDateTime = referenceTime.addMSecs( time ); 53 : : quint64 providerTime; 54 : 0 : QDateTime providerReferenceTime = mTemporalCapabilities->referenceTime(); 55 : 0 : if ( mTemporalCapabilities->referenceTime().isValid() ) 56 : 0 : providerTime = referenceTime.msecsTo( requestDateTime ); 57 : : else 58 : 0 : providerTime = time; 59 : : 60 : 0 : switch ( method ) 61 : : { 62 : : case QgsMeshDataProviderTemporalCapabilities::FindClosestDatasetBeforeStartRangeTime: 63 : 0 : return mTemporalCapabilities->datasetIndexClosestBeforeRelativeTime( groupIndex, providerTime ); 64 : : break; 65 : : case QgsMeshDataProviderTemporalCapabilities::FindClosestDatasetFromStartRangeTime: 66 : 0 : return mTemporalCapabilities->datasetIndexClosestFromRelativeTime( groupIndex, providerTime ); 67 : : break; 68 : : } 69 : : 70 : 0 : return QgsMeshDatasetIndex(); 71 : 0 : } 72 : : 73 : 0 : QgsMeshDatasetSourceInterface::QgsMeshDatasetSourceInterface(): 74 : 0 : mTemporalCapabilities( std::make_unique<QgsMeshDataProviderTemporalCapabilities>() ) {} 75 : : 76 : 0 : int QgsMeshDatasetSourceInterface::datasetCount( QgsMeshDatasetIndex index ) const 77 : : { 78 : 0 : return datasetCount( index.group() ); 79 : : } 80 : : 81 : 0 : QgsMeshDatasetGroupMetadata QgsMeshDatasetSourceInterface::datasetGroupMetadata( QgsMeshDatasetIndex index ) const 82 : : { 83 : 0 : return datasetGroupMetadata( index.group() ); 84 : : } 85 : : 86 : 0 : bool QgsMeshDatasetSourceInterface::persistDatasetGroup( 87 : : const QString &path, 88 : : const QgsMeshDatasetGroupMetadata &meta, 89 : : const QVector<QgsMeshDataBlock> &datasetValues, 90 : : const QVector<QgsMeshDataBlock> &datasetActive, 91 : : const QVector<double> × ) 92 : : { 93 : : // Form DRIVER:filename 94 : 0 : QString filename = path; 95 : : // ASCII dat supports face, edge and vertex datasets 96 : 0 : QString driverName = QStringLiteral( "DAT" ); 97 : 0 : QStringList parts = path.split( ':' ); 98 : 0 : if ( parts.size() > 1 ) 99 : : { 100 : 0 : driverName = parts[0]; 101 : 0 : parts.removeFirst(); 102 : 0 : filename = parts.join( QString() ); 103 : 0 : } 104 : 0 : return persistDatasetGroup( filename, driverName, meta, datasetValues, datasetActive, times ); 105 : 0 : } 106 : : 107 : 0 : QgsMeshVertex QgsMesh::vertex( int index ) const 108 : : { 109 : 0 : if ( index < vertices.size() && index >= 0 ) 110 : 0 : return vertices[index]; 111 : 0 : return QgsMeshVertex(); 112 : 0 : } 113 : : 114 : 0 : QgsMeshFace QgsMesh::face( int index ) const 115 : : { 116 : 0 : if ( index < faces.size() && index >= 0 ) 117 : 0 : return faces[index]; 118 : 0 : return QgsMeshFace(); 119 : 0 : } 120 : : 121 : 0 : QgsMeshEdge QgsMesh::edge( int index ) const 122 : : { 123 : 0 : if ( index < edges.size() && index >= 0 ) 124 : 0 : return edges[index]; 125 : 0 : return QgsMeshEdge(); 126 : 0 : } 127 : : 128 : 0 : void QgsMesh::clear() 129 : : { 130 : 0 : vertices.clear(); 131 : 0 : edges.clear(); 132 : 0 : faces.clear(); 133 : 0 : } 134 : : 135 : 0 : bool QgsMesh::compareFaces( const QgsMeshFace &face1, const QgsMeshFace &face2 ) 136 : : { 137 : 0 : if ( face1.count() != face2.count() ) 138 : 0 : return false; 139 : : 140 : 0 : int startFace2 = 0; 141 : 0 : for ( int i = 0; i < face2.count(); ++i ) 142 : 0 : if ( face2.at( i ) == face1.at( 0 ) ) 143 : : { 144 : 0 : startFace2 = i; 145 : 0 : break; 146 : : } 147 : : 148 : 0 : for ( int i = 0; i < face1.count(); ++i ) 149 : 0 : if ( face1.at( i ) != face2.at( ( i + startFace2 ) % ( face2.count() ) ) ) 150 : 0 : return false; 151 : : 152 : 0 : return true; 153 : 0 : } 154 : : 155 : 0 : bool QgsMesh::contains( const QgsMesh::ElementType &type ) const 156 : : { 157 : 0 : switch ( type ) 158 : : { 159 : : case ElementType::Vertex: 160 : 0 : return !vertices.isEmpty(); 161 : : case ElementType::Edge: 162 : 0 : return !edges.isEmpty(); 163 : : case ElementType::Face: 164 : 0 : return !faces.isEmpty(); 165 : : } 166 : 0 : return false; 167 : 0 : } 168 : : 169 : 0 : int QgsMesh::vertexCount() const 170 : : { 171 : 0 : return vertices.size(); 172 : : } 173 : : 174 : 0 : int QgsMesh::faceCount() const 175 : : { 176 : 0 : return faces.size(); 177 : : } 178 : : 179 : 0 : int QgsMesh::edgeCount() const 180 : : { 181 : 0 : return edges.size(); 182 : : } 183 : : 184 : 0 : bool QgsMeshDataSourceInterface::contains( const QgsMesh::ElementType &type ) const 185 : : { 186 : 0 : switch ( type ) 187 : : { 188 : : case QgsMesh::ElementType::Vertex: 189 : 0 : return vertexCount() != 0; 190 : : case QgsMesh::ElementType::Edge: 191 : 0 : return edgeCount() != 0; 192 : : case QgsMesh::ElementType::Face: 193 : 0 : return faceCount() != 0; 194 : : } 195 : 0 : return false; 196 : 0 : }