Skip to content

Commit 24eb6fd

Browse files
committedJun 23, 2017
Fix loss of output names in graphical modeler
1 parent 19dd097 commit 24eb6fd

File tree

6 files changed

+66
-36
lines changed

6 files changed

+66
-36
lines changed
 

‎python/core/processing/qgsprocessingmodelalgorithm.sip

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -287,6 +287,19 @@ Copies are protected to avoid slicing
287287
Constructor for ModelOutput with the specified ``name`` and ``description``.
288288
%End
289289

290+
QString name() const;
291+
%Docstring
292+
Returns the model output name.
293+
.. seealso:: setName()
294+
:rtype: str
295+
%End
296+
297+
void setName( const QString &name );
298+
%Docstring
299+
Sets the model output ``name``.
300+
.. seealso:: name()
301+
%End
302+
290303
QString childId() const;
291304
%Docstring
292305
Returns the child algorithm ID from which this output is generated.
@@ -300,14 +313,14 @@ Copies are protected to avoid slicing
300313
.. seealso:: childId()
301314
%End
302315

303-
QString outputName() const;
316+
QString childOutputName() const;
304317
%Docstring
305318
Returns the child algorithm output name from which this output is generated.
306319
.. seealso:: setOutputName()
307320
:rtype: str
308321
%End
309322

310-
void setOutputName( const QString &name );
323+
void setChildOutputName( const QString &name );
311324
%Docstring
312325
Sets the child algorithm output ``name`` from which this output is generated.
313326
.. seealso:: outputName()
@@ -514,8 +527,7 @@ Copies are protected to avoid slicing
514527
void setModelOutputs( const QMap<QString, QgsProcessingModelAlgorithm::ModelOutput> &outputs );
515528
%Docstring
516529
Sets the map of final model ``outputs`` which are generated by this child algorithm.
517-
The keys are the output names from this child algorithm. Only outputs which are
518-
part of the final outputs from the model should be included in this map.
530+
Only outputs which are part of the final outputs from the model should be included in this map.
519531

520532
If child model outputs are altered by this method, QgsProcessingModelAlgorithm.updateDestinationParameters()
521533
must be called on the parent model.

‎python/plugins/processing/modeler/ModelerGraphicItem.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ def __init__(self, element, model, controls, scene=None):
6666
painter = QPainter(self.picture)
6767
svg.render(painter)
6868
self.pixmap = None
69-
self.text = element.description()
69+
self.text = element.name()
7070
else:
7171
self.text = element.description()
7272
self.pixmap = element.algorithm().icon().pixmap(15, 15)
@@ -374,7 +374,7 @@ def itemChange(self, change, value):
374374
elif isinstance(self.element, QgsProcessingModelAlgorithm.ModelParameter):
375375
self.model.parameterComponent(self.element.parameterName()).setPosition(self.pos())
376376
elif isinstance(self.element, QgsProcessingModelAlgorithm.ModelOutput):
377-
self.model.childAlgorithm(self.element.childId()).modelOutput(self.element.outputName()).setPosition(self.pos())
377+
self.model.childAlgorithm(self.element.childId()).modelOutput(self.element.name()).setPosition(self.pos())
378378

379379
return value
380380

‎python/plugins/processing/modeler/ModelerParametersDialog.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -293,7 +293,8 @@ def setPreviousValues(self):
293293

294294
self.wrappers[param.name()].setValue(value)
295295
for name, out in list(alg.modelOutputs().items()):
296-
self.valueItems[name].setText(out.description())
296+
if out.childOutputName() in self.valueItems:
297+
self.valueItems[out.childOutputName()].setText(out.name())
297298

298299
selected = []
299300
dependencies = self.getAvailableDependencies() # spellok
@@ -336,10 +337,10 @@ def createAlgorithm(self):
336337
if not dest.flags() & QgsProcessingParameterDefinition.FlagHidden:
337338
name = str(self.valueItems[dest.name()].text())
338339
if name.strip() != '' and name != ModelerParametersDialog.ENTER_NAME:
339-
output = QgsProcessingModelAlgorithm.ModelOutput(name)
340+
output = QgsProcessingModelAlgorithm.ModelOutput(name, name)
340341
output.setChildId(alg.childId())
341-
output.setOutputName(dest.name())
342-
outputs[dest.name()] = output
342+
output.setChildOutputName(dest.name())
343+
outputs[name] = output
343344
alg.setModelOutputs(outputs)
344345

345346
selectedOptions = self.dependenciesPanel.selectedoptions

‎src/core/processing/qgsprocessingmodelalgorithm.cpp

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,8 @@ void QgsProcessingModelAlgorithm::ChildAlgorithm::setModelOutputs( const QMap<QS
135135
QMap<QString, QgsProcessingModelAlgorithm::ModelOutput>::iterator outputIt = mModelOutputs.begin();
136136
for ( ; outputIt != mModelOutputs.end(); ++outputIt )
137137
{
138+
// make sure values are consistent
139+
outputIt->setName( outputIt.key() );
138140
outputIt->setChildId( mId );
139141
}
140142
}
@@ -332,7 +334,7 @@ QVariantMap QgsProcessingModelAlgorithm::parametersForChildAlgorithm( const Chil
332334
QMap<QString, QgsProcessingModelAlgorithm::ModelOutput>::const_iterator outputIt = outputs.constBegin();
333335
for ( ; outputIt != outputs.constEnd(); ++outputIt )
334336
{
335-
if ( outputIt->outputName() == destParam->name() )
337+
if ( outputIt->childOutputName() == destParam->name() )
336338
{
337339
QString paramName = child.childId() + ':' + outputIt.key();
338340
if ( modelParameters.contains( paramName ) )
@@ -454,7 +456,7 @@ QVariantMap QgsProcessingModelAlgorithm::processAlgorithm( const QVariantMap &pa
454456
QMap<QString, QgsProcessingModelAlgorithm::ModelOutput>::const_iterator outputIt = outputs.constBegin();
455457
for ( ; outputIt != outputs.constEnd(); ++outputIt )
456458
{
457-
finalResults.insert( childId + ':' + outputIt->outputName(), results.value( outputIt->outputName() ) );
459+
finalResults.insert( childId + ':' + outputIt->name(), results.value( outputIt->childOutputName() ) );
458460
}
459461

460462
executed.insert( childId );
@@ -531,12 +533,12 @@ void QgsProcessingModelAlgorithm::updateDestinationParameters()
531533
continue;
532534

533535
// child algorithm has a destination parameter set, copy it to the model
534-
const QgsProcessingParameterDefinition *source = childIt->algorithm()->parameterDefinition( outputIt->outputName() );
536+
const QgsProcessingParameterDefinition *source = childIt->algorithm()->parameterDefinition( outputIt->childOutputName() );
535537
if ( !source )
536538
continue;
537539

538540
QgsProcessingParameterDefinition *param = QgsProcessingParameters::parameterFromVariantMap( source->toVariantMap() );
539-
param->setName( outputIt->childId() + ':' + outputIt->outputName() );
541+
param->setName( outputIt->childId() + ':' + outputIt->name() );
540542
param->setDescription( outputIt->description() );
541543
addParameter( param );
542544

@@ -971,12 +973,13 @@ bool QgsProcessingModelAlgorithm::ChildParameterSource::loadVariant( const QVari
971973

972974
QgsProcessingModelAlgorithm::ModelOutput::ModelOutput( const QString &name, const QString &description )
973975
: QgsProcessingModelAlgorithm::Component( description )
974-
, mOutputName( name )
976+
, mName( name )
975977
{}
976978

977979
QVariant QgsProcessingModelAlgorithm::ModelOutput::toVariant() const
978980
{
979981
QVariantMap map;
982+
map.insert( QStringLiteral( "name" ), mName );
980983
map.insert( QStringLiteral( "child_id" ), mChildId );
981984
map.insert( QStringLiteral( "output_name" ), mOutputName );
982985
saveCommonProperties( map );
@@ -985,6 +988,7 @@ QVariant QgsProcessingModelAlgorithm::ModelOutput::toVariant() const
985988

986989
bool QgsProcessingModelAlgorithm::ModelOutput::loadVariant( const QVariantMap &map )
987990
{
991+
mName = map.value( QStringLiteral( "name" ) ).toString();
988992
mChildId = map.value( QStringLiteral( "child_id" ) ).toString();
989993
mOutputName = map.value( QStringLiteral( "output_name" ) ).toString();
990994
restoreCommonProperties( map );

‎src/core/processing/qgsprocessingmodelalgorithm.h

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -289,6 +289,18 @@ class CORE_EXPORT QgsProcessingModelAlgorithm : public QgsProcessingAlgorithm
289289
*/
290290
ModelOutput( const QString &name = QString(), const QString &description = QString() );
291291

292+
/**
293+
* Returns the model output name.
294+
* \see setName()
295+
*/
296+
QString name() const { return mName; }
297+
298+
/**
299+
* Sets the model output \a name.
300+
* \see name()
301+
*/
302+
void setName( const QString &name ) { mName = name; }
303+
292304
/**
293305
* Returns the child algorithm ID from which this output is generated.
294306
* \see setChildId()
@@ -305,13 +317,13 @@ class CORE_EXPORT QgsProcessingModelAlgorithm : public QgsProcessingAlgorithm
305317
* Returns the child algorithm output name from which this output is generated.
306318
* \see setOutputName()
307319
*/
308-
QString outputName() const { return mOutputName; }
320+
QString childOutputName() const { return mOutputName; }
309321

310322
/**
311323
* Sets the child algorithm output \a name from which this output is generated.
312324
* \see outputName()
313325
*/
314-
void setOutputName( const QString &name ) { mOutputName = name; }
326+
void setChildOutputName( const QString &name ) { mOutputName = name; }
315327

316328
/**
317329
* Saves this output to a QVariant.
@@ -327,6 +339,7 @@ class CORE_EXPORT QgsProcessingModelAlgorithm : public QgsProcessingAlgorithm
327339

328340
private:
329341

342+
QString mName;
330343
QString mChildId;
331344
QString mOutputName;
332345
};
@@ -502,8 +515,7 @@ class CORE_EXPORT QgsProcessingModelAlgorithm : public QgsProcessingAlgorithm
502515

503516
/**
504517
* Sets the map of final model \a outputs which are generated by this child algorithm.
505-
* The keys are the output names from this child algorithm. Only outputs which are
506-
* part of the final outputs from the model should be included in this map.
518+
* Only outputs which are part of the final outputs from the model should be included in this map.
507519
*
508520
* If child model outputs are altered by this method, QgsProcessingModelAlgorithm::updateDestinationParameters()
509521
* must be called on the parent model.

‎tests/src/core/testqgsprocessing.cpp

Lines changed: 18 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -3471,8 +3471,8 @@ void TestQgsProcessing::modelerAlgorithm()
34713471
QgsProcessingModelAlgorithm::ModelOutput testModelOut;
34723472
testModelOut.setChildId( QStringLiteral( "my_id" ) );
34733473
QCOMPARE( testModelOut.childId(), QStringLiteral( "my_id" ) );
3474-
testModelOut.setOutputName( QStringLiteral( "my_output" ) );
3475-
QCOMPARE( testModelOut.outputName(), QStringLiteral( "my_output" ) );
3474+
testModelOut.setChildOutputName( QStringLiteral( "my_output" ) );
3475+
QCOMPARE( testModelOut.childOutputName(), QStringLiteral( "my_output" ) );
34763476

34773477
QMap<QString, QgsProcessingModelAlgorithm::ModelOutput> outputs;
34783478
QgsProcessingModelAlgorithm::ModelOutput out1;
@@ -3817,53 +3817,53 @@ void TestQgsProcessing::modelerAlgorithm()
38173817
alg7c1.setChildId( "cx1" );
38183818
alg7c1.setAlgorithmId( "native:centroids" );
38193819
QMap<QString, QgsProcessingModelAlgorithm::ModelOutput> alg7c1outputs;
3820-
QgsProcessingModelAlgorithm::ModelOutput alg7c1out1;
3820+
QgsProcessingModelAlgorithm::ModelOutput alg7c1out1( QStringLiteral( "my_output" ) );
38213821
alg7c1out1.setChildId( "cx1" );
3822-
alg7c1out1.setOutputName( "OUTPUT_LAYER" );
3822+
alg7c1out1.setChildOutputName( "OUTPUT_LAYER" );
38233823
alg7c1out1.setDescription( QStringLiteral( "my output" ) );
3824-
alg7c1outputs.insert( QStringLiteral( "OUTPUT_LAYER" ), alg7c1out1 );
3824+
alg7c1outputs.insert( QStringLiteral( "my_output" ), alg7c1out1 );
38253825
alg7c1.setModelOutputs( alg7c1outputs );
38263826
alg7.addChildAlgorithm( alg7c1 );
38273827
// verify that model has destination parameter created
38283828
QCOMPARE( alg7.destinationParameterDefinitions().count(), 1 );
3829-
QCOMPARE( alg7.destinationParameterDefinitions().at( 0 )->name(), QStringLiteral( "cx1:OUTPUT_LAYER" ) );
3829+
QCOMPARE( alg7.destinationParameterDefinitions().at( 0 )->name(), QStringLiteral( "cx1:my_output" ) );
38303830
QCOMPARE( alg7.destinationParameterDefinitions().at( 0 )->description(), QStringLiteral( "my output" ) );
38313831
QCOMPARE( alg7.outputDefinitions().count(), 1 );
3832-
QCOMPARE( alg7.outputDefinitions().at( 0 )->name(), QStringLiteral( "cx1:OUTPUT_LAYER" ) );
3832+
QCOMPARE( alg7.outputDefinitions().at( 0 )->name(), QStringLiteral( "cx1:my_output" ) );
38333833
QCOMPARE( alg7.outputDefinitions().at( 0 )->type(), QStringLiteral( "outputVector" ) );
38343834
QCOMPARE( alg7.outputDefinitions().at( 0 )->description(), QStringLiteral( "my output" ) );
38353835

38363836
QgsProcessingModelAlgorithm::ChildAlgorithm alg7c2;
38373837
alg7c2.setChildId( "cx2" );
38383838
alg7c2.setAlgorithmId( "native:centroids" );
38393839
QMap<QString, QgsProcessingModelAlgorithm::ModelOutput> alg7c2outputs;
3840-
QgsProcessingModelAlgorithm::ModelOutput alg7c2out1;
3840+
QgsProcessingModelAlgorithm::ModelOutput alg7c2out1( QStringLiteral( "my_output2" ) );
38413841
alg7c2out1.setChildId( "cx2" );
3842-
alg7c2out1.setOutputName( "OUTPUT_LAYER" );
3842+
alg7c2out1.setChildOutputName( "OUTPUT_LAYER" );
38433843
alg7c2out1.setDescription( QStringLiteral( "my output2" ) );
3844-
alg7c2outputs.insert( QStringLiteral( "OUTPUT_LAYER" ), alg7c2out1 );
3844+
alg7c2outputs.insert( QStringLiteral( "my_output2" ), alg7c2out1 );
38453845
alg7c2.setModelOutputs( alg7c2outputs );
38463846
alg7.addChildAlgorithm( alg7c2 );
38473847

38483848
QCOMPARE( alg7.destinationParameterDefinitions().count(), 2 );
3849-
QCOMPARE( alg7.destinationParameterDefinitions().at( 0 )->name(), QStringLiteral( "cx1:OUTPUT_LAYER" ) );
3849+
QCOMPARE( alg7.destinationParameterDefinitions().at( 0 )->name(), QStringLiteral( "cx1:my_output" ) );
38503850
QCOMPARE( alg7.destinationParameterDefinitions().at( 0 )->description(), QStringLiteral( "my output" ) );
3851-
QCOMPARE( alg7.destinationParameterDefinitions().at( 1 )->name(), QStringLiteral( "cx2:OUTPUT_LAYER" ) );
3851+
QCOMPARE( alg7.destinationParameterDefinitions().at( 1 )->name(), QStringLiteral( "cx2:my_output2" ) );
38523852
QCOMPARE( alg7.destinationParameterDefinitions().at( 1 )->description(), QStringLiteral( "my output2" ) );
38533853
QCOMPARE( alg7.outputDefinitions().count(), 2 );
3854-
QCOMPARE( alg7.outputDefinitions().at( 0 )->name(), QStringLiteral( "cx1:OUTPUT_LAYER" ) );
3854+
QCOMPARE( alg7.outputDefinitions().at( 0 )->name(), QStringLiteral( "cx1:my_output" ) );
38553855
QCOMPARE( alg7.outputDefinitions().at( 0 )->type(), QStringLiteral( "outputVector" ) );
38563856
QCOMPARE( alg7.outputDefinitions().at( 0 )->description(), QStringLiteral( "my output" ) );
3857-
QCOMPARE( alg7.outputDefinitions().at( 1 )->name(), QStringLiteral( "cx2:OUTPUT_LAYER" ) );
3857+
QCOMPARE( alg7.outputDefinitions().at( 1 )->name(), QStringLiteral( "cx2:my_output2" ) );
38583858
QCOMPARE( alg7.outputDefinitions().at( 1 )->type(), QStringLiteral( "outputVector" ) );
38593859
QCOMPARE( alg7.outputDefinitions().at( 1 )->description(), QStringLiteral( "my output2" ) );
38603860

38613861
alg7.removeChildAlgorithm( "cx1" );
38623862
QCOMPARE( alg7.destinationParameterDefinitions().count(), 1 );
3863-
QCOMPARE( alg7.destinationParameterDefinitions().at( 0 )->name(), QStringLiteral( "cx2:OUTPUT_LAYER" ) );
3863+
QCOMPARE( alg7.destinationParameterDefinitions().at( 0 )->name(), QStringLiteral( "cx2:my_output2" ) );
38643864
QCOMPARE( alg7.destinationParameterDefinitions().at( 0 )->description(), QStringLiteral( "my output2" ) );
38653865
QCOMPARE( alg7.outputDefinitions().count(), 1 );
3866-
QCOMPARE( alg7.outputDefinitions().at( 0 )->name(), QStringLiteral( "cx2:OUTPUT_LAYER" ) );
3866+
QCOMPARE( alg7.outputDefinitions().at( 0 )->name(), QStringLiteral( "cx2:my_output2" ) );
38673867
QCOMPARE( alg7.outputDefinitions().at( 0 )->type(), QStringLiteral( "outputVector" ) );
38683868
QCOMPARE( alg7.outputDefinitions().at( 0 )->description(), QStringLiteral( "my output2" ) );
38693869
}
@@ -3908,7 +3908,8 @@ void TestQgsProcessing::modelExecution()
39083908
alg2c1.addParameterSource( "JOIN_STYLE", QgsProcessingModelAlgorithm::ChildParameterSource::fromStaticValue( 2 ) );
39093909
alg2c1.addParameterSource( "DISSOLVE", QgsProcessingModelAlgorithm::ChildParameterSource::fromStaticValue( false ) );
39103910
QMap<QString, QgsProcessingModelAlgorithm::ModelOutput> outputs1;
3911-
QgsProcessingModelAlgorithm::ModelOutput out1( "OUTPUT_LAYER" );
3911+
QgsProcessingModelAlgorithm::ModelOutput out1( "MODEL_OUT_LAYER" );
3912+
out1.setChildOutputName( "OUTPUT_LAYER" );
39123913
outputs1.insert( QStringLiteral( "MODEL_OUT_LAYER" ), out1 );
39133914
alg2c1.setModelOutputs( outputs1 );
39143915
model2.addChildAlgorithm( alg2c1 );

0 commit comments

Comments
 (0)
Please sign in to comment.