Skip to content

Commit b782fab

Browse files
committed
[processing] Make buffer distance a dynamic property
Data defined buffer distance through the processing toolbox!
1 parent 901dae1 commit b782fab

File tree

3 files changed

+20
-7
lines changed

3 files changed

+20
-7
lines changed

src/analysis/processing/qgsalgorithmbuffer.cpp

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,12 @@ QString QgsBufferAlgorithm::group() const
4242
void QgsBufferAlgorithm::initAlgorithm( const QVariantMap & )
4343
{
4444
addParameter( new QgsProcessingParameterFeatureSource( QStringLiteral( "INPUT" ), QObject::tr( "Input layer" ) ) );
45-
addParameter( new QgsProcessingParameterNumber( QStringLiteral( "DISTANCE" ), QObject::tr( "Distance" ), QgsProcessingParameterNumber::Double, 10 ) );
45+
46+
auto bufferParam = qgis::make_unique < QgsProcessingParameterNumber >( QStringLiteral( "DISTANCE" ), QObject::tr( "Distance" ), QgsProcessingParameterNumber::Double, 10 );
47+
bufferParam->setIsDynamic( true );
48+
bufferParam->setDynamicPropertyDefinition( QgsPropertyDefinition( QStringLiteral( "Distance" ), QObject::tr( "Buffer distance" ), QgsPropertyDefinition::Double ) );
49+
bufferParam->setDynamicLayerParameterName( QStringLiteral( "INPUT" ) );
50+
addParameter( bufferParam.release() );
4651
addParameter( new QgsProcessingParameterNumber( QStringLiteral( "SEGMENTS" ), QObject::tr( "Segments" ), QgsProcessingParameterNumber::Integer, 5, false, 1 ) );
4752

4853
addParameter( new QgsProcessingParameterEnum( QStringLiteral( "END_CAP_STYLE" ), QObject::tr( "End cap style" ), QStringList() << QObject::tr( "Round" ) << QObject::tr( "Flat" ) << QObject::tr( "Square" ), false ) );
@@ -86,7 +91,14 @@ QVariantMap QgsBufferAlgorithm::processAlgorithm( const QVariantMap &parameters,
8691
double miterLimit = parameterAsDouble( parameters, QStringLiteral( "MITER_LIMIT" ), context );
8792
double bufferDistance = parameterAsDouble( parameters, QStringLiteral( "DISTANCE" ), context );
8893
bool dynamicBuffer = QgsProcessingParameters::isDynamic( parameters, QStringLiteral( "DISTANCE" ) );
89-
const QgsProcessingParameterDefinition *distanceParamDef = parameterDefinition( QStringLiteral( "DISTANCE" ) );
94+
QgsExpressionContext expressionContext;
95+
QgsProperty bufferProperty;
96+
if ( dynamicBuffer )
97+
{
98+
bufferProperty = parameters.value( QStringLiteral( "DISTANCE" ) ).value< QgsProperty >();
99+
expressionContext = createExpressionContext( parameters, context, dynamic_cast< QgsProcessingFeatureSource * >( source.get() ) );
100+
bufferProperty.prepare( expressionContext );
101+
}
90102

91103
long count = source->featureCount();
92104

@@ -111,13 +123,14 @@ QVariantMap QgsBufferAlgorithm::processAlgorithm( const QVariantMap &parameters,
111123
QgsFeature out = f;
112124
if ( out.hasGeometry() )
113125
{
126+
double distance = bufferDistance;
114127
if ( dynamicBuffer )
115128
{
116-
context.expressionContext().setFeature( f );
117-
bufferDistance = QgsProcessingParameters::parameterAsDouble( distanceParamDef, parameters, context );
129+
expressionContext.setFeature( f );
130+
distance = bufferProperty.valueAsDouble( expressionContext, bufferDistance );
118131
}
119132

120-
QgsGeometry outputGeometry = f.geometry().buffer( bufferDistance, segments, endCapStyle, joinStyle, miterLimit );
133+
QgsGeometry outputGeometry = f.geometry().buffer( distance, segments, endCapStyle, joinStyle, miterLimit );
121134
if ( !outputGeometry )
122135
{
123136
QgsMessageLog::logMessage( QObject::tr( "Error calculating buffer for feature %1" ).arg( f.id() ), QObject::tr( "Processing" ), QgsMessageLog::WARNING );

src/analysis/processing/qgsalgorithmextractbyattribute.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,7 @@ QVariantMap QgsExtractByAttributeAlgorithm::processAlgorithm( const QVariantMap
168168
throw QgsProcessingException( expression.parserErrorString() );
169169
}
170170

171-
QgsExpressionContext expressionContext = createExpressionContext( parameters, context );
171+
QgsExpressionContext expressionContext = createExpressionContext( parameters, context, dynamic_cast< QgsProcessingFeatureSource * >( source.get() ) );
172172

173173
long count = source->featureCount();
174174

src/analysis/processing/qgsalgorithmextractbyexpression.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ QVariantMap QgsExtractByExpressionAlgorithm::processAlgorithm( const QVariantMap
8787
throw QgsProcessingException( expression.parserErrorString() );
8888
}
8989

90-
QgsExpressionContext expressionContext = createExpressionContext( parameters, context );
90+
QgsExpressionContext expressionContext = createExpressionContext( parameters, context, dynamic_cast< QgsProcessingFeatureSource * >( source.get() ) );
9191

9292
long count = source->featureCount();
9393

0 commit comments

Comments
 (0)