24 QString QgsFieldCalculatorAlgorithm::name()
 const 
   26   return QStringLiteral( 
"fieldcalculator" );
 
   29 QString QgsFieldCalculatorAlgorithm::displayName()
 const 
   31   return QObject::tr( 
"Field calculator" );
 
   34 QStringList QgsFieldCalculatorAlgorithm::tags()
 const 
   36   return QObject::tr( 
"field,calculator,vector" ).split( 
',' );
 
   39 QString QgsFieldCalculatorAlgorithm::group()
 const 
   41   return QObject::tr( 
"Vector table" );
 
   44 QString QgsFieldCalculatorAlgorithm::groupId()
 const 
   46   return QStringLiteral( 
"vectortable" );
 
   49 QString QgsFieldCalculatorAlgorithm::outputName()
 const 
   51   return QObject::tr( 
"Calculated" );
 
   54 QList<int> QgsFieldCalculatorAlgorithm::inputLayerTypes()
 const 
   64 void QgsFieldCalculatorAlgorithm::initParameters( 
const QVariantMap &configuration )
 
   66   Q_UNUSED( configuration );
 
   68   QStringList fieldTypes = QStringList( {QObject::tr( 
"Float" ), QObject::tr( 
"Integer" ), QObject::tr( 
"String" ), QObject::tr( 
"Date" ) } );
 
   70   std::unique_ptr< QgsProcessingParameterString > fieldName = std::make_unique< QgsProcessingParameterString > ( QStringLiteral( 
"FIELD_NAME" ), QObject::tr( 
"Field name" ), QVariant(), 
false );
 
   71   std::unique_ptr< QgsProcessingParameterEnum > fieldType = std::make_unique< QgsProcessingParameterEnum > ( QStringLiteral( 
"FIELD_TYPE" ), QObject::tr( 
"Result field type" ), fieldTypes, 
false, 0 );
 
   72   std::unique_ptr< QgsProcessingParameterNumber > fieldLength = std::make_unique< QgsProcessingParameterNumber > ( QStringLiteral( 
"FIELD_LENGTH" ), QObject::tr( 
"Result field length" ), 
QgsProcessingParameterNumber::Integer, QVariant( 0 ), 
false, 0 );
 
   73   std::unique_ptr< QgsProcessingParameterNumber > fieldPrecision = std::make_unique< QgsProcessingParameterNumber > ( QStringLiteral( 
"FIELD_PRECISION" ), QObject::tr( 
"Result field precision" ), 
QgsProcessingParameterNumber::Integer, QVariant( 0 ), 
false, 0 );
 
   74   std::unique_ptr< QgsProcessingParameterExpression > expression = std::make_unique< QgsProcessingParameterExpression> ( QStringLiteral( 
"FORMULA" ), QObject::tr( 
"Formula" ), QVariant(), QStringLiteral( 
"INPUT" ), 
false );
 
   76   expression->setMetadata( QVariantMap( {{
"inlineEditor", 
true}} ) );
 
   78   addParameter( fieldName.release() );
 
   79   addParameter( fieldType.release() );
 
   80   addParameter( fieldLength.release() );
 
   81   addParameter( fieldPrecision.release() );
 
   82   addParameter( expression.release() );
 
   90 QString QgsFieldCalculatorAlgorithm::shortHelpString()
 const 
   92   return QObject::tr( 
"This algorithm computes a new vector layer with the same features of the input layer, " 
   93                       "but either overwriting an existing attribute or adding an additional attribute. The values of this field " 
   94                       "are computed from each feature using an expression, based on the properties and attributes of the feature. " 
   95                       "Note that if \"Field name\" is an existing field in the layer then all the rest of the field settings are ignored." );
 
   98 QgsFieldCalculatorAlgorithm *QgsFieldCalculatorAlgorithm::createInstance()
 const 
  100   return new QgsFieldCalculatorAlgorithm();
 
  106   std::unique_ptr< QgsProcessingFeatureSource > source( parameterAsSource( parameters, QStringLiteral( 
"INPUT" ), context ) );
 
  111   QList<QVariant::Type> fieldTypes( {QVariant::Double, QVariant::Int, QVariant::String, QVariant::Date} );
 
  114   const int fieldTypeIdx = parameterAsInt( parameters, QStringLiteral( 
"FIELD_TYPE" ), context );
 
  115   const int fieldLength = parameterAsInt( parameters, QStringLiteral( 
"FIELD_LENGTH" ), context );
 
  116   const int fieldPrecision = parameterAsInt( parameters, QStringLiteral( 
"FIELD_PRECISION" ), context );
 
  117   const QString fieldName = parameterAsString( parameters, QStringLiteral( 
"FIELD_NAME" ), context );
 
  119   QVariant::Type fieldType = fieldTypes[fieldTypeIdx];
 
  121   if ( fieldName.isEmpty() )
 
  132   mFields = source->fields();
 
  134   int fieldIdx = mFields.indexFromName( 
field.
name() );
 
  138     mFields.append( 
field );
 
  142     feedback->
pushWarning( QObject::tr( 
"Field name %1 already exists and will be replaced" ).arg( 
field.
name() ) );
 
  147   mFieldIdx = mFields.lookupField( 
field.
name() );
 
  150   QString expressionString = parameterAsString( parameters, QStringLiteral( 
"FORMULA" ), context );
 
  151   mExpressionContext = createExpressionContext( parameters, context, source.get() );
 
  156   mExpression.setGeomCalculator( &mDa );
 
  158   mExpression.setAreaUnits( context.
areaUnit() );
 
  160   if ( mExpression.hasParserError() )
 
  162                                   .arg( expressionString, mExpression.parserErrorString() ) );
 
  164   mExpression.prepare( &mExpressionContext );
 
  172   const QStringList fieldNames = mFields.names();
 
  173   for ( 
const QString &fieldName : fieldNames )
 
  177     if ( attributeIndex >= 0 )
 
  178       attributes[attributeIndex] = feature.
attribute( fieldName );
 
  181   if ( mExpression.isValid() )
 
  183     mExpressionContext.setFeature( feature );
 
  184     mExpressionContext.lastScope()->setVariable( QStringLiteral( 
"row_number" ), mRowNumber );
 
  186     const QVariant value = mExpression.evaluate( &mExpressionContext );
 
  188     if ( mExpression.hasEvalError() )
 
  191                                     .arg( mExpression.expression(), mExpression.evalErrorString() ) );
 
  194     attributes[mFieldIdx] = value;
 
  198     attributes[mFieldIdx] = QVariant();
 
  207 bool QgsFieldCalculatorAlgorithm::supportInPlaceEdit( 
const QgsMapLayer *layer )
 const 
Class for parsing and evaluation of expressions (formerly called "search strings").
The feature class encapsulates a single feature including its unique ID, geometry and a list of field...
int fieldNameIndex(const QString &fieldName) const
Utility method to get attribute index from name.
void setAttributes(const QgsAttributes &attrs)
Sets the feature's attributes.
QVariant attribute(const QString &name) const
Lookup attribute value by attribute name.
Encapsulate a field in an attribute table or data source.
Container of fields for a vector layer.
Base class for all map layer types.
Contains information about the context in which a processing algorithm is executed.
QgsUnitTypes::AreaUnit areaUnit() const
Returns the area unit to use for area calculations.
QgsCoordinateTransformContext transformContext() const
Returns the coordinate transform context.
QgsUnitTypes::DistanceUnit distanceUnit() const
Returns the distance unit to use for distance calculations.
QString ellipsoid() const
Returns the ellipsoid to use for distance and area calculations.
Custom exception class for processing related exceptions.
Flag
Flags controlling how QgsProcessingFeatureSource fetches features.
@ FlagSkipGeometryValidityChecks
Invalid geometry checks should always be skipped. This flag can be useful for algorithms which always...
Base class for providing feedback from a processing algorithm.
virtual void pushWarning(const QString &warning)
Pushes a warning informational message from the algorithm.
@ TypeVector
Tables (i.e. vector layers with or without geometry). When used for a sink this indicates the sink ha...
QList< QgsFeature > QgsFeatureList