22 #include "qgsmeshmemorydataprovider.h"
24 QgsMeshCalcNode::QgsMeshCalcNode()
29 QgsMeshCalcNode::QgsMeshCalcNode(
double number )
36 QgsMeshCalcNode::QgsMeshCalcNode( Operator op, QgsMeshCalcNode *left, QgsMeshCalcNode *right )
44 QgsMeshCalcNode::QgsMeshCalcNode( QgsMeshCalcNode *condition ,
45 QgsMeshCalcNode *left ,
46 QgsMeshCalcNode *right )
50 , mCondition( condition )
55 QgsMeshCalcNode::QgsMeshCalcNode(
const QString &datasetGroupName )
56 : mType( tDatasetGroupRef )
57 , mDatasetGroupName( datasetGroupName )
59 if ( mDatasetGroupName.startsWith(
'"' ) && mDatasetGroupName.endsWith(
'"' ) )
60 mDatasetGroupName = mDatasetGroupName.mid( 1, mDatasetGroupName.size() - 2 );
63 QgsMeshCalcNode::~QgsMeshCalcNode() =
default;
65 QgsMeshCalcNode::Type QgsMeshCalcNode::type()
const
70 void QgsMeshCalcNode::setLeft( QgsMeshCalcNode *left )
75 void QgsMeshCalcNode::setRight( QgsMeshCalcNode *right )
77 mRight.reset( right );
80 QStringList QgsMeshCalcNode::usedDatasetGroupNames()
const
84 if ( mType == tDatasetGroupRef )
86 res.append( mDatasetGroupName );
91 res += mLeft->usedDatasetGroupNames();
96 res += mRight->usedDatasetGroupNames();
101 res += mCondition->usedDatasetGroupNames();
107 bool QgsMeshCalcNode::calculate(
const QgsMeshCalcUtils &dsu, QgsMeshMemoryDatasetGroup &result )
const
109 if ( mType == tDatasetGroupRef )
111 dsu.copy( result, mDatasetGroupName );
114 else if ( mType == tOperator )
116 QgsMeshMemoryDatasetGroup leftDatasetGroup(
"left", dsu.outputType() );
117 QgsMeshMemoryDatasetGroup rightDatasetGroup(
"right", dsu.outputType() );
119 if ( !mLeft || !mLeft->calculate( dsu, leftDatasetGroup ) )
123 if ( mRight && !mRight->calculate( dsu, rightDatasetGroup ) )
128 QgsMeshMemoryDatasetGroup condition(
"condition", dsu.outputType() );
133 if ( !mCondition->calculate( dsu, condition ) )
138 dsu.addIf( leftDatasetGroup, rightDatasetGroup, condition );
142 dsu.add( leftDatasetGroup, rightDatasetGroup );
145 dsu.subtract( leftDatasetGroup, rightDatasetGroup );
148 dsu.multiply( leftDatasetGroup, rightDatasetGroup );
151 dsu.divide( leftDatasetGroup, rightDatasetGroup );
154 dsu.power( leftDatasetGroup, rightDatasetGroup );
157 dsu.equal( leftDatasetGroup, rightDatasetGroup );
160 dsu.notEqual( leftDatasetGroup, rightDatasetGroup );
163 dsu.greaterThan( leftDatasetGroup, rightDatasetGroup );
166 dsu.lesserThan( leftDatasetGroup, rightDatasetGroup );
169 dsu.greaterEqual( leftDatasetGroup, rightDatasetGroup );
172 dsu.lesserEqual( leftDatasetGroup, rightDatasetGroup );
175 dsu.logicalAnd( leftDatasetGroup, rightDatasetGroup );
178 dsu.logicalOr( leftDatasetGroup, rightDatasetGroup );
181 dsu.logicalNot( leftDatasetGroup );
184 dsu.minimum( leftDatasetGroup, rightDatasetGroup );
187 dsu.maximum( leftDatasetGroup, rightDatasetGroup );
190 dsu.abs( leftDatasetGroup );
193 dsu.sumAggregated( leftDatasetGroup );
196 dsu.minimumAggregated( leftDatasetGroup );
199 dsu.maximumAggregated( leftDatasetGroup );
202 dsu.averageAggregated( leftDatasetGroup );
205 dsu.changeSign( leftDatasetGroup );
210 dsu.transferDatasets( result, leftDatasetGroup );
213 else if ( mType == tNumber )
215 dsu.number( result, mNumber );
218 else if ( mType == tNoData )
220 dsu.nodata( result );
228 QgsMeshCalcNode *QgsMeshCalcNode::parseMeshCalcString(
const QString &str, QString &parserErrorMsg )
230 extern QgsMeshCalcNode *localParseMeshCalcString(
const QString & str, QString & parserErrorMsg );
231 return localParseMeshCalcString( str, parserErrorMsg );