26QString QgsFieldCalculatorAlgorithm::name()
const
28 return QStringLiteral(
"fieldcalculator" );
31QString QgsFieldCalculatorAlgorithm::displayName()
const
33 return QObject::tr(
"Field calculator" );
36QStringList QgsFieldCalculatorAlgorithm::tags()
const
38 return QObject::tr(
"field,calculator,vector" ).split(
',' );
41QString QgsFieldCalculatorAlgorithm::group()
const
43 return QObject::tr(
"Vector table" );
46QString QgsFieldCalculatorAlgorithm::groupId()
const
48 return QStringLiteral(
"vectortable" );
51QString QgsFieldCalculatorAlgorithm::outputName()
const
53 return QObject::tr(
"Calculated" );
56QList<int> QgsFieldCalculatorAlgorithm::inputLayerTypes()
const
71void QgsFieldCalculatorAlgorithm::initParameters(
const QVariantMap &configuration )
73 Q_UNUSED( configuration )
75 QStringList fieldTypes;
77 fieldTypes.reserve( 11 );
79 for (
const auto &type :
80 std::vector<std::pair<QMetaType::Type, QMetaType::Type>> {
81 { QMetaType::Type::Double, QMetaType::Type::UnknownType },
82 { QMetaType::Type::Int, QMetaType::Type::UnknownType },
83 { QMetaType::Type::QString, QMetaType::Type::UnknownType },
84 { QMetaType::Type::QDate, QMetaType::Type::UnknownType },
85 { QMetaType::Type::QTime, QMetaType::Type::UnknownType },
86 { QMetaType::Type::QDateTime, QMetaType::Type::UnknownType },
87 { QMetaType::Type::Bool, QMetaType::Type::UnknownType },
88 { QMetaType::Type::QByteArray, QMetaType::Type::UnknownType },
89 { QMetaType::Type::QStringList, QMetaType::Type::UnknownType },
90 { QMetaType::Type::QVariantList, QMetaType::Type::Int },
91 { QMetaType::Type::QVariantList, QMetaType::Type::Double }
98 auto fieldName = std::make_unique<QgsProcessingParameterString>( QStringLiteral(
"FIELD_NAME" ), QObject::tr(
"Field name" ), QVariant(),
false );
99 auto fieldType = std::make_unique<QgsProcessingParameterEnum>( QStringLiteral(
"FIELD_TYPE" ), QObject::tr(
"Result field type" ), fieldTypes,
false, 0 );
100 fieldType->setMetadata(
101 { QVariantMap( { { QStringLiteral(
"widget_wrapper" ), QVariantMap( { { QStringLiteral(
"icons" ), icons } } ) } } )
106 auto fieldPrecision = std::make_unique<QgsProcessingParameterNumber>( QStringLiteral(
"FIELD_PRECISION" ), QObject::tr(
"Result field precision" ),
Qgis::ProcessingNumberParameterType::Integer, QVariant( 0 ),
false, 0 );
107 auto expression = std::make_unique<QgsProcessingParameterExpression>( QStringLiteral(
"FORMULA" ), QObject::tr(
"Formula" ), QVariant(), QStringLiteral(
"INPUT" ),
false );
109 expression->setMetadata( QVariantMap( { {
"inlineEditor",
true } } ) );
111 addParameter( fieldName.release() );
112 addParameter( fieldType.release() );
113 addParameter( fieldLength.release() );
114 addParameter( fieldPrecision.release() );
115 addParameter( expression.release() );
123QString QgsFieldCalculatorAlgorithm::shortHelpString()
const
125 return QObject::tr(
"This algorithm computes a new vector layer with the same features of the input layer, "
126 "but either overwriting an existing attribute or adding an additional attribute. The values of this field "
127 "are computed from each feature using an expression, based on the properties and attributes of the feature. "
128 "Note that if \"Field name\" is an existing field in the layer then all the rest of the field settings are ignored." );
131QString QgsFieldCalculatorAlgorithm::shortDescription()
const
133 return QObject::tr(
"Computes a new vector layer with the same features of the input layer, "
134 "but either overwriting an existing attribute or adding an additional attribute." );
137QgsFieldCalculatorAlgorithm *QgsFieldCalculatorAlgorithm::createInstance()
const
139 return new QgsFieldCalculatorAlgorithm();
145 std::unique_ptr<QgsProcessingFeatureSource> source( parameterAsSource( parameters, QStringLiteral(
"INPUT" ), context ) );
151 const int fieldTypeIdx = parameterAsInt( parameters, QStringLiteral(
"FIELD_TYPE" ), context );
152 const int fieldLength = parameterAsInt( parameters, QStringLiteral(
"FIELD_LENGTH" ), context );
153 const int fieldPrecision = parameterAsInt( parameters, QStringLiteral(
"FIELD_PRECISION" ), context );
154 const QString fieldName = parameterAsString( parameters, QStringLiteral(
"FIELD_NAME" ), context );
156 QMetaType::Type fieldType = QMetaType::Type::QString;
157 QMetaType::Type fieldSubType = QMetaType::Type::UnknownType;
158 switch ( fieldTypeIdx )
161 fieldType = QMetaType::Type::Double;
164 fieldType = QMetaType::Type::Int;
167 fieldType = QMetaType::Type::QString;
170 fieldType = QMetaType::Type::QDate;
173 fieldType = QMetaType::Type::QTime;
176 fieldType = QMetaType::Type::QDateTime;
179 fieldType = QMetaType::Type::Bool;
182 fieldType = QMetaType::Type::QByteArray;
185 fieldType = QMetaType::Type::QStringList;
186 fieldSubType = QMetaType::Type::QString;
189 fieldType = QMetaType::Type::QVariantList;
190 fieldSubType = QMetaType::Type::Int;
193 fieldType = QMetaType::Type::QVariantList;
194 fieldSubType = QMetaType::Type::Double;
198 if ( fieldName.isEmpty() )
211 mFields = source->fields();
213 const int fieldIdx = mFields.indexFromName( field.name() );
217 mFields.append( field );
221 feedback->
pushWarning( QObject::tr(
"Field name %1 already exists and will be replaced" ).arg( field.name() ) );
224 mFieldIdx = mFields.lookupField( field.name() );
227 const QString expressionString = parameterAsString( parameters, QStringLiteral(
"FORMULA" ), context );
228 mExpressionContext = createExpressionContext( parameters, context, source.get() );
233 mExpression.setGeomCalculator( &mDa );
235 mExpression.setAreaUnits( context.
areaUnit() );
237 if ( mExpression.hasParserError() )
239 .arg( expressionString, mExpression.parserErrorString() ) );
241 mExpression.prepare( &mExpressionContext );
249 const QStringList fieldNames = mFields.names();
250 for (
const QString &fieldName : fieldNames )
254 if ( attributeIndex >= 0 )
255 attributes[attributeIndex] = feature.
attribute( fieldName );
258 if ( mExpression.isValid() )
260 mExpressionContext.setFeature( feature );
261 mExpressionContext.lastScope()->setVariable( QStringLiteral(
"row_number" ), mRowNumber );
263 const QVariant value = mExpression.evaluate( &mExpressionContext );
265 if ( mExpression.hasEvalError() )
268 .arg( mExpression.expression(), mExpression.evalErrorString() ) );
271 attributes[mFieldIdx] = value;
275 attributes[mFieldIdx] = QVariant();
284bool 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...
@ RespectsEllipsoid
Algorithm respects the context's ellipsoid settings, and uses ellipsoidal based measurements.
QFlags< ProcessingAlgorithmDocumentationFlag > ProcessingAlgorithmDocumentationFlags
Flags describing algorithm behavior for documentation purposes.
@ 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