25QString QgsFieldCalculatorAlgorithm::name()
const
27 return QStringLiteral(
"fieldcalculator" );
30QString QgsFieldCalculatorAlgorithm::displayName()
const
32 return QObject::tr(
"Field calculator" );
35QStringList QgsFieldCalculatorAlgorithm::tags()
const
37 return QObject::tr(
"field,calculator,vector" ).split(
',' );
40QString QgsFieldCalculatorAlgorithm::group()
const
42 return QObject::tr(
"Vector table" );
45QString QgsFieldCalculatorAlgorithm::groupId()
const
47 return QStringLiteral(
"vectortable" );
50QString QgsFieldCalculatorAlgorithm::outputName()
const
52 return QObject::tr(
"Calculated" );
55QList<int> QgsFieldCalculatorAlgorithm::inputLayerTypes()
const
65void QgsFieldCalculatorAlgorithm::initParameters(
const QVariantMap &configuration )
67 Q_UNUSED( configuration )
69 QStringList fieldTypes;
71 fieldTypes.reserve( 11 );
73 for (
const auto &type :
74 std::vector<std::pair<QMetaType::Type, QMetaType::Type>> {
75 { QMetaType::Type::Double, QMetaType::Type::UnknownType },
76 { QMetaType::Type::Int, QMetaType::Type::UnknownType },
77 { QMetaType::Type::QString, QMetaType::Type::UnknownType },
78 { QMetaType::Type::QDate, QMetaType::Type::UnknownType },
79 { QMetaType::Type::QTime, QMetaType::Type::UnknownType },
80 { QMetaType::Type::QDateTime, QMetaType::Type::UnknownType },
81 { QMetaType::Type::Bool, QMetaType::Type::UnknownType },
82 { QMetaType::Type::QByteArray, QMetaType::Type::UnknownType },
83 { QMetaType::Type::QStringList, QMetaType::Type::UnknownType },
84 { QMetaType::Type::QVariantList, QMetaType::Type::Int },
85 { QMetaType::Type::QVariantList, QMetaType::Type::Double }
92 auto fieldName = std::make_unique<QgsProcessingParameterString>( QStringLiteral(
"FIELD_NAME" ), QObject::tr(
"Field name" ), QVariant(),
false );
93 auto fieldType = std::make_unique<QgsProcessingParameterEnum>( QStringLiteral(
"FIELD_TYPE" ), QObject::tr(
"Result field type" ), fieldTypes,
false, 0 );
94 fieldType->setMetadata(
95 { QVariantMap( { { QStringLiteral(
"widget_wrapper" ), QVariantMap( { { QStringLiteral(
"icons" ), icons } } ) } } )
100 auto fieldPrecision = std::make_unique<QgsProcessingParameterNumber>( QStringLiteral(
"FIELD_PRECISION" ), QObject::tr(
"Result field precision" ),
Qgis::ProcessingNumberParameterType::Integer, QVariant( 0 ),
false, 0 );
101 auto expression = std::make_unique<QgsProcessingParameterExpression>( QStringLiteral(
"FORMULA" ), QObject::tr(
"Formula" ), QVariant(), QStringLiteral(
"INPUT" ),
false );
103 expression->setMetadata( QVariantMap( { {
"inlineEditor",
true } } ) );
105 addParameter( fieldName.release() );
106 addParameter( fieldType.release() );
107 addParameter( fieldLength.release() );
108 addParameter( fieldPrecision.release() );
109 addParameter( expression.release() );
117QString QgsFieldCalculatorAlgorithm::shortHelpString()
const
119 return QObject::tr(
"This algorithm computes a new vector layer with the same features of the input layer, "
120 "but either overwriting an existing attribute or adding an additional attribute. The values of this field "
121 "are computed from each feature using an expression, based on the properties and attributes of the feature. "
122 "Note that if \"Field name\" is an existing field in the layer then all the rest of the field settings are ignored." );
125QString QgsFieldCalculatorAlgorithm::shortDescription()
const
127 return QObject::tr(
"Computes a new vector layer with the same features of the input layer, "
128 "but either overwriting an existing attribute or adding an additional attribute." );
131QgsFieldCalculatorAlgorithm *QgsFieldCalculatorAlgorithm::createInstance()
const
133 return new QgsFieldCalculatorAlgorithm();
139 std::unique_ptr<QgsProcessingFeatureSource> source( parameterAsSource( parameters, QStringLiteral(
"INPUT" ), context ) );
145 const int fieldTypeIdx = parameterAsInt( parameters, QStringLiteral(
"FIELD_TYPE" ), context );
146 const int fieldLength = parameterAsInt( parameters, QStringLiteral(
"FIELD_LENGTH" ), context );
147 const int fieldPrecision = parameterAsInt( parameters, QStringLiteral(
"FIELD_PRECISION" ), context );
148 const QString fieldName = parameterAsString( parameters, QStringLiteral(
"FIELD_NAME" ), context );
150 QMetaType::Type fieldType = QMetaType::Type::QString;
151 QMetaType::Type fieldSubType = QMetaType::Type::UnknownType;
152 switch ( fieldTypeIdx )
155 fieldType = QMetaType::Type::Double;
158 fieldType = QMetaType::Type::Int;
161 fieldType = QMetaType::Type::QString;
164 fieldType = QMetaType::Type::QDate;
167 fieldType = QMetaType::Type::QTime;
170 fieldType = QMetaType::Type::QDateTime;
173 fieldType = QMetaType::Type::Bool;
176 fieldType = QMetaType::Type::QByteArray;
179 fieldType = QMetaType::Type::QStringList;
180 fieldSubType = QMetaType::Type::QString;
183 fieldType = QMetaType::Type::QVariantList;
184 fieldSubType = QMetaType::Type::Int;
187 fieldType = QMetaType::Type::QVariantList;
188 fieldSubType = QMetaType::Type::Double;
192 if ( fieldName.isEmpty() )
205 mFields = source->fields();
207 const int fieldIdx = mFields.indexFromName( field.name() );
211 mFields.append( field );
215 feedback->
pushWarning( QObject::tr(
"Field name %1 already exists and will be replaced" ).arg( field.name() ) );
218 mFieldIdx = mFields.lookupField( field.name() );
221 const QString expressionString = parameterAsString( parameters, QStringLiteral(
"FORMULA" ), context );
222 mExpressionContext = createExpressionContext( parameters, context, source.get() );
227 mExpression.setGeomCalculator( &mDa );
229 mExpression.setAreaUnits( context.
areaUnit() );
231 if ( mExpression.hasParserError() )
233 .arg( expressionString, mExpression.parserErrorString() ) );
235 mExpression.prepare( &mExpressionContext );
243 const QStringList fieldNames = mFields.names();
244 for (
const QString &fieldName : fieldNames )
248 if ( attributeIndex >= 0 )
249 attributes[attributeIndex] = feature.
attribute( fieldName );
252 if ( mExpression.isValid() )
254 mExpressionContext.setFeature( feature );
255 mExpressionContext.lastScope()->setVariable( QStringLiteral(
"row_number" ), mRowNumber );
257 const QVariant value = mExpression.evaluate( &mExpressionContext );
259 if ( mExpression.hasEvalError() )
262 .arg( mExpression.expression(), mExpression.evalErrorString() ) );
265 attributes[mFieldIdx] = value;
269 attributes[mFieldIdx] = QVariant();
278bool QgsFieldCalculatorAlgorithm::supportInPlaceEdit(
const QgsMapLayer *layer )
const
@ Vector
Tables (i.e. vector layers with or without geometry). When used for a sink this indicates the sink ha...
@ SkipGeometryValidityChecks
Invalid geometry checks should always be skipped. This flag can be useful for algorithms which always...
QFlags< ProcessingFeatureSourceFlag > ProcessingFeatureSourceFlags
Flags which control how QgsProcessingFeatureSource fetches features.
Handles 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.
Q_INVOKABLE 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.
static QIcon iconForFieldType(QMetaType::Type type, QMetaType::Type subType=QMetaType::Type::UnknownType, const QString &typeString=QString())
Returns an icon corresponding to a field type.
Base class for all map layer types.
Contains information about the context in which a processing algorithm is executed.
QgsCoordinateTransformContext transformContext() const
Returns the coordinate transform context.
Qgis::AreaUnit areaUnit() const
Returns the area unit to use for area calculations.
Qgis::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.
Base class for providing feedback from a processing algorithm.
virtual void pushWarning(const QString &warning)
Pushes a warning informational message from the algorithm.
static QString typeToDisplayString(QMetaType::Type type, QMetaType::Type subType=QMetaType::Type::UnknownType)
Returns a user-friendly translated string representing a QVariant type.
QList< QgsFeature > QgsFeatureList