25#include "qgsmeshmemorydataprovider.h"
31const double D_TRUE = 1.0;
32const double D_FALSE = 0.0;
33const double D_NODATA = std::numeric_limits<double>::quiet_NaN();
35std::shared_ptr<QgsMeshMemoryDatasetGroup> QgsMeshCalcUtils::createMemoryDatasetGroup(
const QString &datasetGroupName,
const QgsInterval &relativeTime,
const QgsInterval &startTime,
const QgsInterval &endTime )
const
37 std::shared_ptr<QgsMeshMemoryDatasetGroup> grp;
38 const QList<int> &indexes = mMeshLayer->datasetGroupsIndexes();
39 for (
const int groupIndex : indexes )
42 const QString name = meta.
name();
43 if ( name == datasetGroupName )
50 grp = std::make_shared<QgsMeshMemoryDatasetGroup>();
52 grp->setDataType( mOutputType );
54 grp->setName( meta.
name() );
58 for (
int index = 0; index < mMeshLayer->datasetCount( groupIndex ); ++index )
61 else if ( relativeTime.
isValid() )
63 const QgsMeshDatasetIndex datasetIndex = mMeshLayer->datasetIndexAtRelativeTime( relativeTime, groupIndex );
65 grp->addDataset( createMemoryDataset( datasetIndex ) );
69 QList<QgsMeshDatasetIndex> datasetIndexes = mMeshLayer->datasetIndexInRelativeTimeInterval( startTime, endTime, groupIndex );
71 if ( datasetIndexes.isEmpty() )
72 datasetIndexes.append( mMeshLayer->datasetIndexAtRelativeTime( startTime, groupIndex ) );
75 grp->addDataset( createMemoryDataset( index ) );
87 return createMemoryDataset( grp.
dataType() );
90std::shared_ptr<QgsMeshMemoryDataset> QgsMeshCalcUtils::createMemoryDataset(
const QgsMeshDatasetIndex &datasetIndex )
const
93 const int groupIndex = datasetIndex.
group();
94 const auto meta = mMeshLayer->datasetGroupMetadata( groupIndex );
100 std::shared_ptr<QgsMeshMemoryDataset> ds = createMemoryDataset( mOutputType );
101 ds->maximum = dsMeta.
maximum();
102 ds->minimum = dsMeta.
minimum();
103 ds->time = dsMeta.
time();
107 const QgsMeshDataBlock block = QgsMeshLayerUtils::datasetValues( mMeshLayer, datasetIndex, 0, nativeCount );
110 Q_ASSERT( block.
count() == nativeCount );
117 QVector<double> data =
118 QgsMeshLayerUtils::interpolateFromFacesData(
125 Q_ASSERT( data.size() == resultCount );
126 for (
int valueIndex = 0; valueIndex < resultCount; ++valueIndex )
131 QVector<double> buf = block.
values();
132 QVector<double> x( nativeCount );
133 QVector<double> y( nativeCount );
134 for (
int value_i = 0; value_i < nativeCount; ++value_i )
136 x[value_i] = buf[2 * value_i];
137 y[value_i] = buf[2 * value_i + 1];
140 QVector<double> dataX =
141 QgsMeshLayerUtils::interpolateFromFacesData(
143 mMeshLayer->nativeMesh(),
144 mMeshLayer->triangularMesh(),
146 mMeshLayer->rendererSettings().scalarSettings( groupIndex ).dataResamplingMethod()
148 Q_ASSERT( dataX.size() == resultCount );
149 QVector<double> dataY =
150 QgsMeshLayerUtils::interpolateFromFacesData(
152 mMeshLayer->nativeMesh(),
153 mMeshLayer->triangularMesh(),
155 mMeshLayer->rendererSettings().scalarSettings( groupIndex ).dataResamplingMethod()
158 Q_ASSERT( dataY.size() == resultCount );
160 for (
int value_i = 0; value_i < resultCount; ++value_i )
168 for (
int value_i = 0; value_i < resultCount; ++value_i )
169 ds->values[value_i] = block.
value( value_i );
176 for (
int value_i = 0; value_i < dp->
faceCount(); ++value_i )
177 ds->active[value_i] = active.
active( value_i );
187 auto ds = std::make_shared<QgsMeshMemoryDataset>();
190 ds->values.resize( mMeshLayer->dataProvider()->vertexCount() );
191 ds->active.resize( mMeshLayer->dataProvider()->faceCount() );
192 memset( ds->active.data(), 1,
static_cast<size_t>( ds->active.size() ) *
sizeof(
int ) );
196 ds->values.resize( mMeshLayer->dataProvider()->faceCount() );
202QgsMeshCalcUtils:: QgsMeshCalcUtils(
QgsMeshLayer *layer,
203 const QStringList &usedGroupNames,
206 : mMeshLayer( layer )
210 if ( !mMeshLayer || !mMeshLayer->dataProvider() )
214 mOutputType = determineResultDataType( layer, usedGroupNames );
226 for (
const QString &groupName : usedGroupNames )
228 const std::shared_ptr<QgsMeshMemoryDatasetGroup> ds = createMemoryDatasetGroup( groupName );
232 mDatasetGroupMap.insert( groupName, ds );
236 mDatasetGroupMapForAggregate = mDatasetGroupMap;
240 bool timesPopulated =
false;
241 const QList<std::shared_ptr<QgsMeshMemoryDatasetGroup>> vals = mDatasetGroupMap.values();
242 for (
const std::shared_ptr<QgsMeshMemoryDatasetGroup> &ds : vals )
244 if ( ds->datasetCount() == 0 )
250 if ( ds->datasetCount() > 1 )
252 if ( timesPopulated )
254 if ( ds->datasetCount() != mTimes.size() )
261 for (
int datasetIndex = 0; datasetIndex < ds->datasetCount(); ++datasetIndex )
263 const std::shared_ptr<const QgsMeshMemoryDataset> o = ds->constDataset( datasetIndex );
264 if ( timesPopulated )
274 mTimes.append( o->time );
278 timesPopulated =
true;
283 if ( mTimes.isEmpty() )
285 mTimes.push_back( 0.0 );
290 for ( QVector<double>::iterator it = mTimes.begin(); it != mTimes.end(); )
292 if ( qgsDoubleNear( *it, startTime ) ||
293 qgsDoubleNear( *it, endTime ) ||
294 ( ( *it >= startTime ) && ( *it <= endTime ) ) )
297 it = mTimes.erase( it );
302 for (
const std::shared_ptr<QgsMeshMemoryDatasetGroup> &ds : vals )
304 if ( ds->dataType() != mOutputType )
312QgsMeshCalcUtils::QgsMeshCalcUtils(
QgsMeshLayer *layer,
const QStringList &usedGroupNames,
const QgsInterval &relativeTime )
313 : mMeshLayer( layer )
317 if ( !mMeshLayer || !mMeshLayer->dataProvider() )
321 mOutputType = determineResultDataType( layer, usedGroupNames );
332 if ( !usedInterval.isValid() )
335 for (
const QString &groupName : usedGroupNames )
337 const std::shared_ptr<QgsMeshMemoryDatasetGroup> ds = createMemoryDatasetGroup( groupName, relativeTime );
338 if ( !ds || ds->memoryDatasets.isEmpty() )
341 mDatasetGroupMap.insert( groupName, ds );
344 mTimes.push_back( usedInterval.hours() );
350 const QStringList &usedGroupNames,
351 const QStringList &usedGroupNamesForAggregate,
355 : mMeshLayer( layer )
359 if ( !mMeshLayer || !mMeshLayer->dataProvider() )
364 mOutputType = determineResultDataType( layer, usedGroupNames + usedGroupNamesForAggregate );
374 for (
const QString &groupName : usedGroupNamesForAggregate )
376 const std::shared_ptr<QgsMeshMemoryDatasetGroup> dsg = createMemoryDatasetGroup( groupName,
QgsInterval(), startTime, endTime );
380 mDatasetGroupMapForAggregate.insert( groupName, dsg );
383 for (
const QString &groupName : usedGroupNames )
385 const std::shared_ptr<QgsMeshMemoryDatasetGroup> ds = createMemoryDatasetGroup( groupName, relativeTime );
386 if ( ( !ds || ds->memoryDatasets.isEmpty() ) )
388 if ( mDatasetGroupMapForAggregate.contains( groupName ) )
393 mDatasetGroupMap.insert( groupName, ds );
399 mTimes.append( usedInterval.
hours() );
405bool QgsMeshCalcUtils::isValid()
const
415std::shared_ptr<const QgsMeshMemoryDatasetGroup> QgsMeshCalcUtils::group(
const QString &datasetName,
bool isAggregate )
const
418 return mDatasetGroupMapForAggregate.value( datasetName );
420 return mDatasetGroupMap.value( datasetName );
423std::shared_ptr<const QgsMeshMemoryDatasetGroup> QgsMeshCalcUtils::group(
const QString &datasetName )
const
425 return mDatasetGroupMap[datasetName];
434 const std::shared_ptr<QgsMeshMemoryDataset> output = createMemoryDataset( filter );
435 output->time = mTimes[0];
437 const QList<int> faceIndexesForRectangle = triangularMesh()->faceIndexesForRectangle( extent );
438 const QVector<int> trianglesToNativeFaces = triangularMesh()->trianglesToNativeFaces();
442 for (
const int faceIndex : faceIndexesForRectangle )
444 const int nativeIndex = trianglesToNativeFaces[faceIndex];
445 const QgsMeshFace face = nativeMesh()->face( nativeIndex );
446 for (
const int vertexIndex : face )
448 output->values[vertexIndex].set( D_TRUE );
454 for (
const int faceIndex : faceIndexesForRectangle )
456 const int nativeIndex = trianglesToNativeFaces[faceIndex];
457 output->values[nativeIndex].set( D_TRUE );
469 const std::shared_ptr<QgsMeshMemoryDataset> output = createMemoryDataset( filter );
470 output->time = mTimes[0];
472 const QVector<QgsMeshVertex> &vertices = triangularMesh()->vertices();
476 const int nativeVertexCount = mMeshLayer->dataProvider()->vertexCount();
478 for (
int i = 0; i < nativeVertexCount; ++i )
483 output->values[i].set( D_TRUE );
487 output->values[i].set( D_FALSE );
493 const QVector<QgsMeshFace> &triangles = triangularMesh()->triangles();
494 for (
int i = 0; i < triangles.size(); ++i )
501 output->values[i].set( D_TRUE );
505 output->values[i].set( D_FALSE );
512std::shared_ptr<QgsMeshMemoryDataset> QgsMeshCalcUtils::number(
double val,
double time )
const
514 Q_ASSERT( isValid() );
516 std::shared_ptr<QgsMeshMemoryDataset> output = createMemoryDataset( mOutputType );
520 if ( std::isnan( val ) )
523 memset( output->active.data(), 0,
static_cast<size_t>( output->active.size() ) *
sizeof(
int ) );
527 for (
int i = 0; i < output->values.size(); ++i )
529 output->values[i].set( val );
538 Q_ASSERT( isValid() );
541 const std::shared_ptr<QgsMeshMemoryDataset> output = number( val, mTimes[0] );
548 Q_ASSERT( isValid() );
549 number( group1, 1.0 );
554 Q_ASSERT( isValid() );
555 number( group1, D_NODATA );
559std::shared_ptr<QgsMeshMemoryDataset> QgsMeshCalcUtils::copy(
560 std::shared_ptr<const QgsMeshMemoryDataset> dataset0
563 Q_ASSERT( isValid() );
564 Q_ASSERT( dataset0 );
566 auto output = std::make_shared<QgsMeshMemoryDataset>();
567 output->values = dataset0->values;
568 output->active = dataset0->active;
569 output->time = dataset0->time;
570 output->valid = dataset0->valid;
576 Q_ASSERT( isValid() );
578 const std::shared_ptr<const QgsMeshMemoryDatasetGroup> group2 = group( groupName, isAggregate );
581 if ( group2->datasetCount() == 1 )
584 const std::shared_ptr<const QgsMeshMemoryDataset> o0 = group2->constDataset( 0 );
585 const std::shared_ptr<QgsMeshMemoryDataset> output = copy( o0 );
590 for (
int output_index = 0; output_index < group2->datasetCount(); ++output_index )
592 const std::shared_ptr<const QgsMeshMemoryDataset> o0 = group2->constDataset( output_index );
596 ( ( o0->time >= mTimes.first() ) && ( o0->time <= mTimes.last() ) )
599 const std::shared_ptr<QgsMeshMemoryDataset> output = copy( o0 );
608 Q_ASSERT( isValid() );
613 const std::shared_ptr<QgsMeshMemoryDataset> o = group2.
memoryDatasets[i];
622 Q_ASSERT( isValid() );
628 const std::shared_ptr<QgsMeshMemoryDataset> o0 = group1.
memoryDatasets[0];
632 const std::shared_ptr<QgsMeshMemoryDataset> o = copy( o0 );
646std::shared_ptr<QgsMeshMemoryDataset> QgsMeshCalcUtils::canditateDataset(
648 int datasetIndex )
const
650 Q_ASSERT( isValid() );
664std::shared_ptr<const QgsMeshMemoryDataset> QgsMeshCalcUtils::constCandidateDataset(
666 int datasetIndex )
const
668 Q_ASSERT( isValid() );
682int QgsMeshCalcUtils::datasetCount(
686 Q_ASSERT( isValid() );
693 return mTimes.size();
702 std::function<
double(
double )> func )
const
704 Q_ASSERT( isValid() );
706 for (
int time_index = 0; time_index < group.
datasetCount(); ++time_index )
708 const std::shared_ptr<QgsMeshMemoryDataset> output = canditateDataset( group, time_index );
710 for (
int n = 0; n < output->values.size(); ++n )
712 const double val1 = output->values[n].scalar();
713 double res_val = D_NODATA;
714 if ( !std::isnan( val1 ) )
715 res_val = func( val1 );
716 output->values[n] = res_val;
727 std::function<
double(
double,
double )> func )
const
729 Q_ASSERT( isValid() );
732 expand( group1, group2 );
734 for (
int time_index = 0; time_index < datasetCount( group1, group2 ); ++time_index )
736 const std::shared_ptr<QgsMeshMemoryDataset> o1 = canditateDataset( group1, time_index );
737 const std::shared_ptr<const QgsMeshMemoryDataset> o2 = constCandidateDataset( group2, time_index );
739 for (
int n = 0; n < o2->values.size(); ++n )
741 const double val1 = o1->values[n].scalar();
742 const double val2 = o2->values[n].scalar();
743 double res_val = D_NODATA;
744 if ( !std::isnan( val1 ) && !std::isnan( val2 ) )
745 res_val = func( val1, val2 );
746 o1->values[n] = res_val;
757void QgsMeshCalcUtils::funcAggr(
759 std::function<
double( QVector<double>& )> func
762 Q_ASSERT( isValid() );
767 output->time = mTimes[0];
768 for (
int n = 0; n < mMeshLayer->dataProvider()->vertexCount(); ++n )
770 QVector < double > vals;
771 for (
int datasetIndex = 0; datasetIndex < group1.
datasetCount(); ++datasetIndex )
773 const std::shared_ptr<QgsMeshMemoryDataset> o1 = canditateDataset( group1, datasetIndex );
775 const double val1 = o1->values[n].scalar();
779 if ( !std::isnan( val1 ) )
781 vals.push_back( val1 );
785 double res_val = D_NODATA;
786 if ( !vals.isEmpty() )
788 res_val = func( vals );
791 output->values[n] = res_val;
804 output->time = mTimes[0];
806 const int facesCount = mMeshLayer->dataProvider()->faceCount();
807 output->values.resize( facesCount );
809 for (
int n = 0; n < mMeshLayer->dataProvider()->faceCount(); ++n )
811 QVector < double > vals;
812 for (
int datasetIndex = 0; datasetIndex < group1.
datasetCount(); ++datasetIndex )
814 const std::shared_ptr<QgsMeshMemoryDataset> o1 = canditateDataset( group1, datasetIndex );
815 const double val1 = o1->values[n].scalar();
816 if ( !std::isnan( val1 ) )
818 vals.push_back( val1 );
822 double res_val = D_NODATA;
823 if ( !vals.isEmpty() )
825 res_val = func( vals );
828 output->values[n] = res_val;
839 Q_ASSERT( mMeshLayer->triangularMesh() );
840 return mMeshLayer->triangularMesh();
843const QgsMesh *QgsMeshCalcUtils::nativeMesh()
const
846 const QgsMesh *res = mMeshLayer->nativeMesh();
851void QgsMeshCalcUtils::updateMesh()
const
853 if ( ! mMeshLayer->nativeMesh() )
856 mMeshLayer->updateTriangularMesh();
869 Q_ASSERT( isValid() );
872 expand( trueGroup, condition );
873 expand( trueGroup, falseGroup );
878 for (
int time_index = 0; time_index < trueGroup.
datasetCount(); ++time_index )
880 const std::shared_ptr<QgsMeshMemoryDataset> true_o = canditateDataset( trueGroup, time_index );
881 const std::shared_ptr<const QgsMeshMemoryDataset> false_o = constCandidateDataset( falseGroup, time_index );
882 const std::shared_ptr<const QgsMeshMemoryDataset> condition_o = constCandidateDataset( condition, time_index );
883 for (
int n = 0; n < true_o->values.size(); ++n )
885 const double conditionValue = condition_o->values[n].scalar();
886 double resultValue = D_NODATA;
887 if ( !std::isnan( conditionValue ) )
890 resultValue = true_o->values[n].scalar();
892 resultValue = false_o->values[n].scalar();
894 true_o->values[n] = resultValue;
901 activate( true_o, condition_o );
909 Q_ASSERT( isValid() );
913 for (
int datasetIndex = 0; datasetIndex < group.
datasetCount(); ++datasetIndex )
915 const std::shared_ptr<QgsMeshMemoryDataset> o1 = canditateDataset( group, datasetIndex );
923void QgsMeshCalcUtils::activate(
924 std::shared_ptr<QgsMeshMemoryDataset> dataset,
925 std::shared_ptr<const QgsMeshMemoryDataset> refDataset
929 Q_ASSERT( isValid() );
933 for (
int idx = 0; idx < mMeshLayer->dataProvider()->faceCount(); ++idx )
935 if ( refDataset && !refDataset->active.isEmpty() && ( !refDataset->active[idx] ) )
937 dataset->active[idx] =
false;
941 if ( !dataset->active[idx] )
948 bool isActive =
true;
949 for (
int j = 0; j < face.size(); ++j )
951 if ( std::isnan( dataset->values[face[j]].scalar() ) )
957 dataset->active[idx] = isActive;
961double QgsMeshCalcUtils::ffilter(
double val1,
double filter )
const
963 Q_ASSERT( !std::isnan( val1 ) );
971double QgsMeshCalcUtils::fadd(
double val1,
double val2 )
const
973 Q_ASSERT( !std::isnan( val1 ) );
974 Q_ASSERT( !std::isnan( val2 ) );
979double QgsMeshCalcUtils::fsubtract(
double val1,
double val2 )
const
981 Q_ASSERT( !std::isnan( val1 ) );
982 Q_ASSERT( !std::isnan( val2 ) );
987double QgsMeshCalcUtils::fmultiply(
double val1,
double val2 )
const
989 Q_ASSERT( !std::isnan( val1 ) );
990 Q_ASSERT( !std::isnan( val2 ) );
995double QgsMeshCalcUtils::fdivide(
double val1,
double val2 )
const
997 Q_ASSERT( !std::isnan( val1 ) );
998 Q_ASSERT( !std::isnan( val2 ) );
1006double QgsMeshCalcUtils::fpower(
double val1,
double val2 )
const
1008 Q_ASSERT( !std::isnan( val1 ) );
1009 Q_ASSERT( !std::isnan( val2 ) );
1010 return pow( val1, val2 );
1014double QgsMeshCalcUtils::fequal(
double val1,
double val2 )
const
1016 Q_ASSERT( !std::isnan( val1 ) );
1017 Q_ASSERT( !std::isnan( val2 ) );
1029double QgsMeshCalcUtils::fnotEqual(
double val1,
double val2 )
const
1031 Q_ASSERT( !std::isnan( val1 ) );
1032 Q_ASSERT( !std::isnan( val2 ) );
1044double QgsMeshCalcUtils::fgreaterThan(
double val1,
double val2 )
const
1046 Q_ASSERT( !std::isnan( val1 ) );
1047 Q_ASSERT( !std::isnan( val2 ) );
1059double QgsMeshCalcUtils::flesserThan(
double val1,
double val2 )
const
1061 Q_ASSERT( !std::isnan( val1 ) );
1062 Q_ASSERT( !std::isnan( val2 ) );
1074double QgsMeshCalcUtils::flesserEqual(
double val1,
double val2 )
const
1076 Q_ASSERT( !std::isnan( val1 ) );
1077 Q_ASSERT( !std::isnan( val2 ) );
1089double QgsMeshCalcUtils::fgreaterEqual(
double val1,
double val2 )
const
1091 Q_ASSERT( !std::isnan( val1 ) );
1092 Q_ASSERT( !std::isnan( val2 ) );
1105double QgsMeshCalcUtils::flogicalAnd(
double val1,
double val2 )
const
1107 Q_ASSERT( !std::isnan( val1 ) );
1108 Q_ASSERT( !std::isnan( val2 ) );
1111 if ( bval1 && bval2 )
1118double QgsMeshCalcUtils::flogicalOr(
double val1,
double val2 )
const
1120 Q_ASSERT( !std::isnan( val1 ) );
1121 Q_ASSERT( !std::isnan( val2 ) );
1124 if ( bval1 || bval2 )
1131double QgsMeshCalcUtils::flogicalNot(
double val1 )
const
1133 Q_ASSERT( !std::isnan( val1 ) );
1142double QgsMeshCalcUtils::fchangeSign(
double val1 )
const
1144 Q_ASSERT( !std::isnan( val1 ) );
1148double QgsMeshCalcUtils::fmin(
double val1,
double val2 )
const
1150 Q_ASSERT( !std::isnan( val1 ) );
1162double QgsMeshCalcUtils::fmax(
double val1,
double val2 )
const
1164 Q_ASSERT( !std::isnan( val1 ) );
1165 Q_ASSERT( !std::isnan( val2 ) );
1177double QgsMeshCalcUtils::fabs(
double val1 )
const
1179 Q_ASSERT( !std::isnan( val1 ) );
1191double QgsMeshCalcUtils::fsumAggregated( QVector<double> &vals )
const
1193 Q_ASSERT( !vals.contains( D_NODATA ) );
1194 Q_ASSERT( !vals.isEmpty() );
1195 return std::accumulate( vals.begin(), vals.end(), 0.0 );
1198double QgsMeshCalcUtils::fminimumAggregated( QVector<double> &vals )
const
1200 Q_ASSERT( !vals.contains( D_NODATA ) );
1201 Q_ASSERT( !vals.isEmpty() );
1202 return *std::min_element( vals.begin(), vals.end() );
1205double QgsMeshCalcUtils::fmaximumAggregated( QVector<double> &vals )
const
1207 Q_ASSERT( !vals.contains( D_NODATA ) );
1208 Q_ASSERT( !vals.isEmpty() );
1209 return *std::max_element( vals.begin(), vals.end() );
1212double QgsMeshCalcUtils::faverageAggregated( QVector<double> &vals )
const
1214 Q_ASSERT( !vals.contains( D_NODATA ) );
1215 Q_ASSERT( !vals.isEmpty() );
1216 return fsumAggregated( vals ) / vals.size();
1221 return func1( group1, std::bind( & QgsMeshCalcUtils::flogicalNot,
this, std::placeholders::_1 ) );
1226 return func1( group1, std::bind( & QgsMeshCalcUtils::fchangeSign,
this, std::placeholders::_1 ) );
1231 return func1( group1, std::bind( & QgsMeshCalcUtils::fabs,
this, std::placeholders::_1 ) );
1236 return func2( group1, group2, std::bind( & QgsMeshCalcUtils::fadd,
this, std::placeholders::_1, std::placeholders::_2 ) );
1241 return func2( group1, group2, std::bind( & QgsMeshCalcUtils::fsubtract,
this, std::placeholders::_1, std::placeholders::_2 ) );
1246 return func2( group1, group2, std::bind( & QgsMeshCalcUtils::fmultiply,
this, std::placeholders::_1, std::placeholders::_2 ) );
1251 return func2( group1, group2, std::bind( & QgsMeshCalcUtils::fdivide,
this, std::placeholders::_1, std::placeholders::_2 ) );
1256 return func2( group1, group2, std::bind( & QgsMeshCalcUtils::fpower,
this, std::placeholders::_1, std::placeholders::_2 ) );
1261 return func2( group1, group2, std::bind( & QgsMeshCalcUtils::fequal,
this, std::placeholders::_1, std::placeholders::_2 ) );
1266 return func2( group1, group2, std::bind( & QgsMeshCalcUtils::fnotEqual,
this, std::placeholders::_1, std::placeholders::_2 ) );
1271 return func2( group1, group2, std::bind( & QgsMeshCalcUtils::fgreaterThan,
this, std::placeholders::_1, std::placeholders::_2 ) );
1276 return func2( group1, group2, std::bind( & QgsMeshCalcUtils::flesserThan,
this, std::placeholders::_1, std::placeholders::_2 ) );
1281 return func2( group1, group2, std::bind( & QgsMeshCalcUtils::flesserEqual,
this, std::placeholders::_1, std::placeholders::_2 ) );
1286 return func2( group1, group2, std::bind( & QgsMeshCalcUtils::fgreaterEqual,
this, std::placeholders::_1, std::placeholders::_2 ) );
1291 return func2( group1, group2, std::bind( & QgsMeshCalcUtils::flogicalAnd,
this, std::placeholders::_1, std::placeholders::_2 ) );
1296 return func2( group1, group2, std::bind( & QgsMeshCalcUtils::flogicalOr,
this, std::placeholders::_1, std::placeholders::_2 ) );
1301 return func2( group1, group2, std::bind( & QgsMeshCalcUtils::fmin,
this, std::placeholders::_1, std::placeholders::_2 ) );
1306 return func2( group1, group2, std::bind( & QgsMeshCalcUtils::fmax,
this, std::placeholders::_1, std::placeholders::_2 ) );
1311 QHash<QString, int> names;
1313 for (
const int groupId : groupIndexes )
1316 const QString name = meta.
name();
1317 names[ name ] = groupId;
1319 for (
const QString &datasetGroupName : usedGroupNames )
1321 if ( names.contains( datasetGroupName ) )
1323 const int groupId = names.value( datasetGroupName );
1341 populateSpatialFilter( filter, extent );
1342 return func2( group1, filter, std::bind( & QgsMeshCalcUtils::ffilter,
this, std::placeholders::_1, std::placeholders::_2 ) );
1348 populateMaskFilter( filter, mask );
1349 return func2( group1, filter, std::bind( & QgsMeshCalcUtils::ffilter,
this, std::placeholders::_1, std::placeholders::_2 ) );
1354 return funcAggr( group1, std::bind( & QgsMeshCalcUtils::fsumAggregated,
this, std::placeholders::_1 ) );
1359 return funcAggr( group1, std::bind( & QgsMeshCalcUtils::fminimumAggregated,
this, std::placeholders::_1 ) );
1364 return funcAggr( group1, std::bind( & QgsMeshCalcUtils::fmaximumAggregated,
this, std::placeholders::_1 ) );
1369 return funcAggr( group1, std::bind( & QgsMeshCalcUtils::faverageAggregated,
this, std::placeholders::_1 ) );
A geometry is the spatial representation of a feature.
bool contains(const QgsPointXY *p) const
Returns true if the geometry contains the point p.
QgsRectangle boundingBox() const
Returns the bounding box of the geometry.
bool intersects(const QgsRectangle &rectangle) const
Returns true if this geometry exactly intersects with a rectangle.
A representation of the interval between two datetime values.
bool isValid() const
Returns true if the interval is valid.
double hours() const
Returns the interval duration in hours.
A block of integers/doubles from a mesh dataset.
QgsMeshDatasetValue value(int index) const
Returns a value represented by the index For active flag the behavior is undefined.
QVector< double > values() const
Returns buffer to the array with values For vector it is pairs (x1, y1, x2, y2, .....
bool isValid() const
Whether the block is valid.
bool active(int index) const
Returns a value for active flag by the index For scalar and vector 2d the behavior is undefined.
int count() const
Number of items stored in the block.
Base class for providing data for QgsMeshLayer.
virtual int vertexCount() const =0
Returns number of vertices in the native mesh.
virtual int faceCount() const =0
Returns number of faces in the native mesh.
QgsMeshDatasetGroupMetadata::DataType dataType() const
Returns the data type of the dataset group.
An 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.
Represents a single mesh dataset value.
Represents a mesh layer supporting display of data on structured or unstructured meshes.
QList< int > datasetGroupsIndexes() const
Returns the list of indexes of dataset groups handled by the layer.
QgsMeshDatasetGroupMetadata datasetGroupMetadata(const QgsMeshDatasetIndex &index) const
Returns the dataset groups metadata.
Represents a mesh dataset group stored in memory.
void addDataset(std::shared_ptr< QgsMeshMemoryDataset > dataset)
Adds a memory dataset to the group.
void clearDatasets()
Removes all the datasets from the group.
std::shared_ptr< const QgsMeshMemoryDataset > constDataset(int index) const
Returns the dataset with index.
QVector< std::shared_ptr< QgsMeshMemoryDataset > > memoryDatasets
Contains all the memory datasets.
int datasetCount() const override
Returns the count of datasets in the group.
@ NeighbourAverage
Does a simple average of values defined for all surrounding faces/vertices.
static QgsGeometry toGeometry(const QgsMeshFace &face, const QVector< QgsMeshVertex > &vertices)
Returns face as polygon geometry.
A rectangle specified with double values.
A triangular/derived mesh with vertices in map coordinates.
bool qgsDoubleNear(double a, double b, double epsilon=4 *std::numeric_limits< double >::epsilon())
Compare two doubles (but allow some difference).
QVector< int > QgsMeshFace
List of vertex indexes.
Mesh - vertices, edges and faces.