23QString QgsRefactorFieldsAlgorithm::name()
const
25 return QStringLiteral(
"refactorfields" );
28QString QgsRefactorFieldsAlgorithm::displayName()
const
30 return QObject::tr(
"Refactor fields" );
33QString QgsRefactorFieldsAlgorithm::shortHelpString()
const
35 return QObject::tr(
"This algorithm allows editing the structure of the attributes table of a vector layer. Fields can be modified "
36 "in their type and name, using a fields mapping.\n\n"
37 "The original layer is not modified. A new layer is generated, which contains a modified attribute table, according "
38 "to the provided fields mapping.\n\n"
39 "Rows in orange have constraints in the template layer from which these fields were loaded. Treat this information "
40 "as a hint during configuration. No constraints will be added on an output layer nor will they be checked or "
41 "enforced by the algorithm." );
44QStringList QgsRefactorFieldsAlgorithm::tags()
const
46 return QObject::tr(
"attributes,table" ).split(
',' );
49QString QgsRefactorFieldsAlgorithm::group()
const
51 return QObject::tr(
"Vector table" );
54QString QgsRefactorFieldsAlgorithm::groupId()
const
56 return QStringLiteral(
"vectortable" );
59QString QgsRefactorFieldsAlgorithm::outputName()
const
61 return QObject::tr(
"Refactored" );
64QList<int> QgsRefactorFieldsAlgorithm::inputLayerTypes()
const
74QgsRefactorFieldsAlgorithm *QgsRefactorFieldsAlgorithm::createInstance()
const
76 return new QgsRefactorFieldsAlgorithm();
79void QgsRefactorFieldsAlgorithm::initParameters(
const QVariantMap & )
81 std::unique_ptr< QgsProcessingParameterFieldMapping > param = std::make_unique< QgsProcessingParameterFieldMapping> ( QStringLiteral(
"FIELDS_MAPPING" ), QObject::tr(
"Fields mapping" ), QStringLiteral(
"INPUT" ) );
82 addParameter( param.release() );
92 std::unique_ptr< QgsProcessingFeatureSource > source( parameterAsSource( parameters, QStringLiteral(
"INPUT" ), context ) );
99 mExpressionContext = createExpressionContext( parameters, context, source.get() );
101 const QVariantList mapping = parameters.value( QStringLiteral(
"FIELDS_MAPPING" ) ).toList();
102 for (
const QVariant &map : mapping )
104 const QVariantMap fieldDef = map.toMap();
105 const QString name = fieldDef.value( QStringLiteral(
"name" ) ).toString();
106 if ( name.isEmpty() )
109 const QMetaType::Type type =
static_cast< QMetaType::Type
>( fieldDef.value( QStringLiteral(
"type" ) ).toInt() );
110 const QString
typeName = fieldDef.value( QStringLiteral(
"sub_name" ) ).toString();
111 const QMetaType::Type subType =
static_cast< QMetaType::Type
>( fieldDef.value( QStringLiteral(
"sub_type" ) ).toInt() );
113 const int length = fieldDef.value( QStringLiteral(
"length" ), 0 ).toInt();
114 const int precision = fieldDef.value( QStringLiteral(
"precision" ), 0 ).toInt();
116 const QString alias = fieldDef.value( QStringLiteral(
"alias" ) ).toString();
117 const QString comment = fieldDef.value( QStringLiteral(
"comment" ) ).toString();
120 newField.setAlias( alias );
121 newField.setComment( comment );
122 mFields.append( newField );
124 const QString expressionString = fieldDef.value( QStringLiteral(
"expression" ) ).toString();
125 if ( !expressionString.isEmpty() )
128 expression.setGeomCalculator( &mDa );
130 expression.setAreaUnits( context.
areaUnit() );
131 if ( expression.hasParserError() )
137 expression.parserErrorString() ) );
139 mExpressions.append( expression );
152 if ( !mExpressionsPrepared )
154 for (
auto it = mExpressions.begin(); it != mExpressions.end(); ++it )
157 it->prepare( &mExpressionContext );
162 attributes.reserve( mExpressions.size() );
163 for (
auto it = mExpressions.begin(); it != mExpressions.end(); ++it )
167 mExpressionContext.setFeature( feature );
168 mExpressionContext.lastScope()->setVariable( QStringLiteral(
"row_number" ), mRowNumber );
169 const QVariant value = it->evaluate( &mExpressionContext );
170 if ( it->hasEvalError() )
172 throw QgsProcessingException( QObject::tr(
"Evaluation error in expression \"%1\": %2" ).arg( it->expression(), it->evalErrorString() ) );
174 attributes.append( value );
178 attributes.append( QVariant() );
188bool QgsRefactorFieldsAlgorithm::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.
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...
void setAttributes(const QgsAttributes &attrs)
Sets the feature's attributes.
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.
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.
QList< QgsFeature > QgsFeatureList