Skip to content

Commit 47f2cc8

Browse files
committed
Fix generation of outputs for models
1 parent fe0f249 commit 47f2cc8

4 files changed

Lines changed: 93 additions & 14 deletions

File tree

‎src/core/processing/qgsprocessingmodelalgorithm.cpp‎

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -340,7 +340,11 @@ void QgsProcessingModelAlgorithm::updateDestinationParameters()
340340
it.remove();
341341
}
342342
}
343+
// also delete outputs
344+
qDeleteAll( mOutputs );
345+
mOutputs.clear();
343346

347+
// rebuild
344348
QMap< QString, ChildAlgorithm >::const_iterator childIt = mChildAlgorithms.constBegin();
345349
for ( ; childIt != mChildAlgorithms.constEnd(); ++childIt )
346350
{
@@ -360,6 +364,13 @@ void QgsProcessingModelAlgorithm::updateDestinationParameters()
360364
param->setName( outputIt->childId() + ':' + outputIt->outputName() );
361365
param->setDescription( outputIt->description() );
362366
addParameter( param );
367+
368+
if ( const QgsProcessingDestinationParameter *destParam = dynamic_cast< const QgsProcessingDestinationParameter *>( param ) )
369+
{
370+
QgsProcessingOutputDefinition *output = destParam->toOutputDefinition();
371+
if ( output )
372+
addOutput( output );
373+
}
363374
}
364375
}
365376
}

‎src/core/processing/qgsprocessingparameters.cpp‎

Lines changed: 31 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
#include "qgsprocessingcontext.h"
2020
#include "qgsprocessingutils.h"
2121
#include "qgsvectorlayerfeatureiterator.h"
22+
#include "qgsprocessingoutputs.h"
2223

2324
bool QgsProcessingParameters::isDynamic( const QVariantMap &parameters, const QString &name )
2425
{
@@ -1998,7 +1999,7 @@ bool QgsProcessingParameterFeatureSource::fromVariantMap( const QVariantMap &map
19981999

19992000

20002001
QgsProcessingParameterFeatureSink::QgsProcessingParameterFeatureSink( const QString &name, const QString &description, QgsProcessingParameterDefinition::LayerType type, const QVariant &defaultValue, bool optional )
2001-
: QgsProcessingParameterDefinition( name, description, defaultValue, optional )
2002+
: QgsProcessingDestinationParameter( name, description, defaultValue, optional )
20022003
, mDataType( type )
20032004
{
20042005

@@ -2051,6 +2052,11 @@ QString QgsProcessingParameterFeatureSink::valueAsPythonString( const QVariant &
20512052
return value.toString().prepend( '\'' ).append( '\'' );
20522053
}
20532054

2055+
QgsProcessingOutputDefinition *QgsProcessingParameterFeatureSink::toOutputDefinition() const
2056+
{
2057+
return new QgsProcessingOutputVectorLayer( name(), description(), mDataType );
2058+
}
2059+
20542060
QgsProcessingParameterDefinition::LayerType QgsProcessingParameterFeatureSink::dataType() const
20552061
{
20562062
return mDataType;
@@ -2095,7 +2101,7 @@ bool QgsProcessingParameterFeatureSink::fromVariantMap( const QVariantMap &map )
20952101
}
20962102

20972103
QgsProcessingParameterRasterOutput::QgsProcessingParameterRasterOutput( const QString &name, const QString &description, const QVariant &defaultValue, bool optional )
2098-
: QgsProcessingParameterDefinition( name, description, defaultValue, optional )
2104+
: QgsProcessingDestinationParameter( name, description, defaultValue, optional )
20992105
{}
21002106

21012107
bool QgsProcessingParameterRasterOutput::checkValueIsAcceptable( const QVariant &input, QgsProcessingContext * ) const
@@ -2145,9 +2151,14 @@ QString QgsProcessingParameterRasterOutput::valueAsPythonString( const QVariant
21452151
return value.toString().prepend( '\'' ).append( '\'' );
21462152
}
21472153

2154+
QgsProcessingOutputDefinition *QgsProcessingParameterRasterOutput::toOutputDefinition() const
2155+
{
2156+
return new QgsProcessingOutputRasterLayer( name(), description() );
2157+
}
2158+
21482159

21492160
QgsProcessingParameterFileOutput::QgsProcessingParameterFileOutput( const QString &name, const QString &description, const QString &fileFilter, const QVariant &defaultValue, bool optional )
2150-
: QgsProcessingParameterDefinition( name, description, defaultValue, optional )
2161+
: QgsProcessingDestinationParameter( name, description, defaultValue, optional )
21512162
, mFileFilter( fileFilter.isEmpty() ? QObject::tr( "All files (*.*)" ) : fileFilter )
21522163
{
21532164

@@ -2202,6 +2213,11 @@ QString QgsProcessingParameterFileOutput::valueAsPythonString( const QVariant &v
22022213
return value.toString().prepend( '\'' ).append( '\'' );
22032214
}
22042215

2216+
QgsProcessingOutputDefinition *QgsProcessingParameterFileOutput::toOutputDefinition() const
2217+
{
2218+
return nullptr;
2219+
}
2220+
22052221
QString QgsProcessingParameterFileOutput::fileFilter() const
22062222
{
22072223
return mFileFilter;
@@ -2228,7 +2244,7 @@ bool QgsProcessingParameterFileOutput::fromVariantMap( const QVariantMap &map )
22282244
}
22292245

22302246
QgsProcessingParameterFolderOutput::QgsProcessingParameterFolderOutput( const QString &name, const QString &description, const QVariant &defaultValue, bool optional )
2231-
: QgsProcessingParameterDefinition( name, description, defaultValue, optional )
2247+
: QgsProcessingDestinationParameter( name, description, defaultValue, optional )
22322248
{}
22332249

22342250
bool QgsProcessingParameterFolderOutput::checkValueIsAcceptable( const QVariant &input, QgsProcessingContext * ) const
@@ -2251,6 +2267,17 @@ bool QgsProcessingParameterFolderOutput::checkValueIsAcceptable( const QVariant
22512267
return true;
22522268
}
22532269

2270+
QgsProcessingOutputDefinition *QgsProcessingParameterFolderOutput::toOutputDefinition() const
2271+
{
2272+
return nullptr;
2273+
}
2274+
2275+
QgsProcessingDestinationParameter::QgsProcessingDestinationParameter( const QString &name, const QString &description, const QVariant &defaultValue, bool optional )
2276+
: QgsProcessingParameterDefinition( name, description, defaultValue, optional )
2277+
{
2278+
2279+
}
2280+
22542281
QgsProcessingParameterVectorOutput::QgsProcessingParameterVectorOutput( const QString &name, const QString &description, QgsProcessingParameterDefinition::LayerType type, const QVariant &defaultValue, bool optional )
22552282
: QgsProcessingParameterDefinition( name, description, defaultValue, optional )
22562283
, mDataType( type )

‎src/core/processing/qgsprocessingparameters.h‎

Lines changed: 36 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ class QgsRasterLayer;
3030
class QgsVectorLayer;
3131
class QgsFeatureSink;
3232
class QgsFeatureSource;
33-
33+
class QgsProcessingOutputDefinition;
3434

3535
/**
3636
* \class QgsProcessingFeatureSourceDefinition
@@ -1266,6 +1266,33 @@ class CORE_EXPORT QgsProcessingParameterFeatureSource : public QgsProcessingPara
12661266

12671267
};
12681268

1269+
/**
1270+
* \class QgsProcessingDestinationParameter
1271+
* \ingroup core
1272+
* Base class for all parameter definitions which represent file or layer destinations, e.g. parameters
1273+
* which are used for the destination for layers output by an algorithm.
1274+
* \since QGIS 3.0
1275+
*/
1276+
class CORE_EXPORT QgsProcessingDestinationParameter : public QgsProcessingParameterDefinition
1277+
{
1278+
public:
1279+
1280+
/**
1281+
* Constructor for QgsProcessingDestinationParameter.
1282+
*/
1283+
QgsProcessingDestinationParameter( const QString &name, const QString &description = QString(), const QVariant &defaultValue = QVariant(),
1284+
bool optional = false );
1285+
1286+
bool isDestination() const override { return true; }
1287+
1288+
/**
1289+
* Returns a new QgsProcessingOutputDefinition corresponding to the definition of the destination
1290+
* parameter.
1291+
*/
1292+
virtual QgsProcessingOutputDefinition *toOutputDefinition() const = 0 SIP_FACTORY;
1293+
1294+
};
1295+
12691296

12701297
/**
12711298
* \class QgsProcessingParameterFeatureSink
@@ -1275,7 +1302,7 @@ class CORE_EXPORT QgsProcessingParameterFeatureSource : public QgsProcessingPara
12751302
* A parameter which represents the destination feature sink for features created by an algorithm.
12761303
* \since QGIS 3.0
12771304
*/
1278-
class CORE_EXPORT QgsProcessingParameterFeatureSink : public QgsProcessingParameterDefinition
1305+
class CORE_EXPORT QgsProcessingParameterFeatureSink : public QgsProcessingDestinationParameter
12791306
{
12801307
public:
12811308

@@ -1286,9 +1313,9 @@ class CORE_EXPORT QgsProcessingParameterFeatureSink : public QgsProcessingParame
12861313
bool optional = false );
12871314

12881315
QString type() const override { return QStringLiteral( "sink" ); }
1289-
bool isDestination() const override { return true; }
12901316
bool checkValueIsAcceptable( const QVariant &input, QgsProcessingContext *context = nullptr ) const override;
12911317
QString valueAsPythonString( const QVariant &value, QgsProcessingContext &context ) const override;
1318+
QgsProcessingOutputDefinition *toOutputDefinition() const override SIP_FACTORY;
12921319

12931320
/**
12941321
* Returns the layer type for sinks associated with the parameter.
@@ -1371,7 +1398,7 @@ class CORE_EXPORT QgsProcessingParameterVectorOutput : public QgsProcessingParam
13711398
* A raster layer output parameter.
13721399
* \since QGIS 3.0
13731400
*/
1374-
class CORE_EXPORT QgsProcessingParameterRasterOutput : public QgsProcessingParameterDefinition
1401+
class CORE_EXPORT QgsProcessingParameterRasterOutput : public QgsProcessingDestinationParameter
13751402
{
13761403
public:
13771404

@@ -1383,9 +1410,9 @@ class CORE_EXPORT QgsProcessingParameterRasterOutput : public QgsProcessingParam
13831410
bool optional = false );
13841411

13851412
QString type() const override { return QStringLiteral( "rasterOut" ); }
1386-
bool isDestination() const override { return true; }
13871413
bool checkValueIsAcceptable( const QVariant &input, QgsProcessingContext *context = nullptr ) const override;
13881414
QString valueAsPythonString( const QVariant &value, QgsProcessingContext &context ) const override;
1415+
QgsProcessingOutputDefinition *toOutputDefinition() const override SIP_FACTORY;
13891416
};
13901417

13911418
/**
@@ -1394,7 +1421,7 @@ class CORE_EXPORT QgsProcessingParameterRasterOutput : public QgsProcessingParam
13941421
* A generic file based output parameter.
13951422
* \since QGIS 3.0
13961423
*/
1397-
class CORE_EXPORT QgsProcessingParameterFileOutput : public QgsProcessingParameterDefinition
1424+
class CORE_EXPORT QgsProcessingParameterFileOutput : public QgsProcessingDestinationParameter
13981425
{
13991426
public:
14001427

@@ -1407,9 +1434,9 @@ class CORE_EXPORT QgsProcessingParameterFileOutput : public QgsProcessingParamet
14071434
bool optional = false );
14081435

14091436
QString type() const override { return QStringLiteral( "fileOut" ); }
1410-
bool isDestination() const override { return true; }
14111437
bool checkValueIsAcceptable( const QVariant &input, QgsProcessingContext *context = nullptr ) const override;
14121438
QString valueAsPythonString( const QVariant &value, QgsProcessingContext &context ) const override;
1439+
QgsProcessingOutputDefinition *toOutputDefinition() const override SIP_FACTORY;
14131440

14141441
/**
14151442
* Returns the file filter string for files compatible with this output.
@@ -1437,7 +1464,7 @@ class CORE_EXPORT QgsProcessingParameterFileOutput : public QgsProcessingParamet
14371464
* A folder output parameter.
14381465
* \since QGIS 3.0
14391466
*/
1440-
class CORE_EXPORT QgsProcessingParameterFolderOutput : public QgsProcessingParameterDefinition
1467+
class CORE_EXPORT QgsProcessingParameterFolderOutput : public QgsProcessingDestinationParameter
14411468
{
14421469
public:
14431470

@@ -1449,8 +1476,8 @@ class CORE_EXPORT QgsProcessingParameterFolderOutput : public QgsProcessingParam
14491476
bool optional = false );
14501477

14511478
QString type() const override { return QStringLiteral( "folderOut" ); }
1452-
bool isDestination() const override { return true; }
14531479
bool checkValueIsAcceptable( const QVariant &input, QgsProcessingContext *context = nullptr ) const override;
1480+
QgsProcessingOutputDefinition *toOutputDefinition() const override SIP_FACTORY;
14541481

14551482
};
14561483

‎tests/src/core/testqgsprocessing.cpp‎

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3769,6 +3769,10 @@ void TestQgsProcessing::modelerAlgorithm()
37693769
QCOMPARE( alg7.destinationParameterDefinitions().count(), 1 );
37703770
QCOMPARE( alg7.destinationParameterDefinitions().at( 0 )->name(), QStringLiteral( "cx1:OUTPUT_LAYER" ) );
37713771
QCOMPARE( alg7.destinationParameterDefinitions().at( 0 )->description(), QStringLiteral( "my output" ) );
3772+
QCOMPARE( alg7.outputDefinitions().count(), 1 );
3773+
QCOMPARE( alg7.outputDefinitions().at( 0 )->name(), QStringLiteral( "cx1:OUTPUT_LAYER" ) );
3774+
QCOMPARE( alg7.outputDefinitions().at( 0 )->type(), QStringLiteral( "outputVector" ) );
3775+
QCOMPARE( alg7.outputDefinitions().at( 0 )->description(), QStringLiteral( "my output" ) );
37723776

37733777
QgsProcessingModelAlgorithm::ChildAlgorithm alg7c2;
37743778
alg7c2.setChildId( "cx2" );
@@ -3787,12 +3791,22 @@ void TestQgsProcessing::modelerAlgorithm()
37873791
QCOMPARE( alg7.destinationParameterDefinitions().at( 0 )->description(), QStringLiteral( "my output" ) );
37883792
QCOMPARE( alg7.destinationParameterDefinitions().at( 1 )->name(), QStringLiteral( "cx2:OUTPUT_LAYER" ) );
37893793
QCOMPARE( alg7.destinationParameterDefinitions().at( 1 )->description(), QStringLiteral( "my output2" ) );
3794+
QCOMPARE( alg7.outputDefinitions().count(), 2 );
3795+
QCOMPARE( alg7.outputDefinitions().at( 0 )->name(), QStringLiteral( "cx1:OUTPUT_LAYER" ) );
3796+
QCOMPARE( alg7.outputDefinitions().at( 0 )->type(), QStringLiteral( "outputVector" ) );
3797+
QCOMPARE( alg7.outputDefinitions().at( 0 )->description(), QStringLiteral( "my output" ) );
3798+
QCOMPARE( alg7.outputDefinitions().at( 1 )->name(), QStringLiteral( "cx2:OUTPUT_LAYER" ) );
3799+
QCOMPARE( alg7.outputDefinitions().at( 1 )->type(), QStringLiteral( "outputVector" ) );
3800+
QCOMPARE( alg7.outputDefinitions().at( 1 )->description(), QStringLiteral( "my output2" ) );
37903801

37913802
alg7.removeChildAlgorithm( "cx1" );
37923803
QCOMPARE( alg7.destinationParameterDefinitions().count(), 1 );
37933804
QCOMPARE( alg7.destinationParameterDefinitions().at( 0 )->name(), QStringLiteral( "cx2:OUTPUT_LAYER" ) );
37943805
QCOMPARE( alg7.destinationParameterDefinitions().at( 0 )->description(), QStringLiteral( "my output2" ) );
3795-
3806+
QCOMPARE( alg7.outputDefinitions().count(), 1 );
3807+
QCOMPARE( alg7.outputDefinitions().at( 0 )->name(), QStringLiteral( "cx2:OUTPUT_LAYER" ) );
3808+
QCOMPARE( alg7.outputDefinitions().at( 0 )->type(), QStringLiteral( "outputVector" ) );
3809+
QCOMPARE( alg7.outputDefinitions().at( 0 )->description(), QStringLiteral( "my output2" ) );
37963810
}
37973811

37983812
QGSTEST_MAIN( TestQgsProcessing )

0 commit comments

Comments
 (0)