Skip to content

Commit c9226ce

Browse files
committedMay 11, 2018
[processing][modeler] Fix some child algorithm vector results
are not shown as input choices for other child algorithms (cherry-picked from 3791bac)
1 parent 4d02041 commit c9226ce

File tree

3 files changed

+106
-2
lines changed

3 files changed

+106
-2
lines changed
 

‎src/core/processing/models/qgsprocessingmodelalgorithm.cpp

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -677,9 +677,9 @@ QgsProcessingModelChildParameterSources QgsProcessingModelAlgorithm::availableSo
677677
{
678678
const QgsProcessingOutputVectorLayer *vectorOut = static_cast< const QgsProcessingOutputVectorLayer *>( out );
679679

680-
if ( !( dataTypes.contains( vectorOut->dataType() ) || vectorOut->dataType() == QgsProcessing::TypeMapLayer || vectorOut->dataType() == QgsProcessing::TypeVector
681-
|| vectorOut->dataType() == QgsProcessing::TypeVectorAnyGeometry ) )
680+
if ( !vectorOutputIsCompatibleType( dataTypes, vectorOut->dataType() ) )
682681
{
682+
//unacceptable output
683683
continue;
684684
}
685685
}
@@ -866,6 +866,23 @@ bool QgsProcessingModelAlgorithm::loadVariant( const QVariant &model )
866866
return true;
867867
}
868868

869+
bool QgsProcessingModelAlgorithm::vectorOutputIsCompatibleType( const QList<int> &acceptableDataTypes, QgsProcessing::SourceType outputType )
870+
{
871+
// This method is intended to be "permissive" rather than "restrictive".
872+
// I.e. we only reject outputs which we know can NEVER be acceptable, but
873+
// if there's doubt then we default to returning true.
874+
return ( acceptableDataTypes.empty()
875+
|| acceptableDataTypes.contains( outputType )
876+
|| outputType == QgsProcessing::TypeMapLayer
877+
|| outputType == QgsProcessing::TypeVector
878+
|| outputType == QgsProcessing::TypeVectorAnyGeometry
879+
|| acceptableDataTypes.contains( QgsProcessing::TypeVector )
880+
|| acceptableDataTypes.contains( QgsProcessing::TypeMapLayer )
881+
|| ( acceptableDataTypes.contains( QgsProcessing::TypeVectorAnyGeometry ) && ( outputType == QgsProcessing::TypeVectorPoint ||
882+
outputType == QgsProcessing::TypeVectorLine ||
883+
outputType == QgsProcessing::TypeVectorPolygon ) ) );
884+
}
885+
869886
bool QgsProcessingModelAlgorithm::toFile( const QString &path ) const
870887
{
871888
QDomDocument doc = QDomDocument( QStringLiteral( "model" ) );

‎src/core/processing/models/qgsprocessingmodelalgorithm.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -403,6 +403,17 @@ class CORE_EXPORT QgsProcessingModelAlgorithm : public QgsProcessingAlgorithm
403403
*/
404404
bool loadVariant( const QVariant &model );
405405

406+
/**
407+
* Checks whether the output vector type given by \a outputType is compatible
408+
* with the list of acceptable data types specified by \a acceptableDataTypes.
409+
* Returns true if vector output is compatible.
410+
*
411+
* \note This method is intended to be "permissive" rather than "restrictive".
412+
* I.e. we only reject outputs which we know can NEVER be acceptable, but
413+
* if there's doubt then we default to returning true.
414+
*/
415+
static bool vectorOutputIsCompatibleType( const QList<int> &acceptableDataTypes, QgsProcessing::SourceType outputType );
416+
406417
friend class TestQgsProcessing;
407418
};
408419

‎tests/src/analysis/testqgsprocessing.cpp

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -465,6 +465,7 @@ class TestQgsProcessing: public QObject
465465
void asPythonCommand();
466466
void modelerAlgorithm();
467467
void modelExecution();
468+
void modelVectorOutputIsCompatibleType();
468469
void modelAcceptableValues();
469470
void tempUtils();
470471
void convertCompatible();
@@ -5682,6 +5683,81 @@ void TestQgsProcessing::modelExecution()
56825683
QCOMPARE( actualParts, expectedParts );
56835684
}
56845685

5686+
void TestQgsProcessing::modelVectorOutputIsCompatibleType()
5687+
{
5688+
// IMPORTANT: This method is intended to be "permissive" rather than "restrictive".
5689+
// I.e. we only reject outputs which we know can NEVER be acceptable, but
5690+
// if there's doubt then we default to returning true.
5691+
5692+
// empty acceptable type list = all are compatible
5693+
QVERIFY( QgsProcessingModelAlgorithm::vectorOutputIsCompatibleType( QList<int>(), QgsProcessing::TypeVector ) );
5694+
QVERIFY( QgsProcessingModelAlgorithm::vectorOutputIsCompatibleType( QList<int>(), QgsProcessing::TypeVectorAnyGeometry ) );
5695+
QVERIFY( QgsProcessingModelAlgorithm::vectorOutputIsCompatibleType( QList<int>(), QgsProcessing::TypeVectorPoint ) );
5696+
QVERIFY( QgsProcessingModelAlgorithm::vectorOutputIsCompatibleType( QList<int>(), QgsProcessing::TypeVectorLine ) );
5697+
QVERIFY( QgsProcessingModelAlgorithm::vectorOutputIsCompatibleType( QList<int>(), QgsProcessing::TypeVectorPolygon ) );
5698+
QVERIFY( QgsProcessingModelAlgorithm::vectorOutputIsCompatibleType( QList<int>(), QgsProcessing::TypeMapLayer ) );
5699+
5700+
// accept any vector
5701+
QList< int > dataTypes;
5702+
dataTypes << QgsProcessing::TypeVector;
5703+
QVERIFY( QgsProcessingModelAlgorithm::vectorOutputIsCompatibleType( dataTypes, QgsProcessing::TypeVector ) );
5704+
QVERIFY( QgsProcessingModelAlgorithm::vectorOutputIsCompatibleType( dataTypes, QgsProcessing::TypeVectorAnyGeometry ) );
5705+
QVERIFY( QgsProcessingModelAlgorithm::vectorOutputIsCompatibleType( dataTypes, QgsProcessing::TypeVectorPoint ) );
5706+
QVERIFY( QgsProcessingModelAlgorithm::vectorOutputIsCompatibleType( dataTypes, QgsProcessing::TypeVectorLine ) );
5707+
QVERIFY( QgsProcessingModelAlgorithm::vectorOutputIsCompatibleType( dataTypes, QgsProcessing::TypeVectorPolygon ) );
5708+
QVERIFY( QgsProcessingModelAlgorithm::vectorOutputIsCompatibleType( dataTypes, QgsProcessing::TypeMapLayer ) );
5709+
5710+
// accept any vector with geometry
5711+
dataTypes.clear();
5712+
dataTypes << QgsProcessing::TypeVectorAnyGeometry;
5713+
QVERIFY( QgsProcessingModelAlgorithm::vectorOutputIsCompatibleType( dataTypes, QgsProcessing::TypeVector ) );
5714+
QVERIFY( QgsProcessingModelAlgorithm::vectorOutputIsCompatibleType( dataTypes, QgsProcessing::TypeVectorAnyGeometry ) );
5715+
QVERIFY( QgsProcessingModelAlgorithm::vectorOutputIsCompatibleType( dataTypes, QgsProcessing::TypeVectorPoint ) );
5716+
QVERIFY( QgsProcessingModelAlgorithm::vectorOutputIsCompatibleType( dataTypes, QgsProcessing::TypeVectorLine ) );
5717+
QVERIFY( QgsProcessingModelAlgorithm::vectorOutputIsCompatibleType( dataTypes, QgsProcessing::TypeVectorPolygon ) );
5718+
QVERIFY( QgsProcessingModelAlgorithm::vectorOutputIsCompatibleType( dataTypes, QgsProcessing::TypeMapLayer ) );
5719+
5720+
// accept any point vector
5721+
dataTypes.clear();
5722+
dataTypes << QgsProcessing::TypeVectorPoint;
5723+
QVERIFY( QgsProcessingModelAlgorithm::vectorOutputIsCompatibleType( dataTypes, QgsProcessing::TypeVector ) );
5724+
QVERIFY( QgsProcessingModelAlgorithm::vectorOutputIsCompatibleType( dataTypes, QgsProcessing::TypeVectorAnyGeometry ) );
5725+
QVERIFY( QgsProcessingModelAlgorithm::vectorOutputIsCompatibleType( dataTypes, QgsProcessing::TypeVectorPoint ) );
5726+
QVERIFY( !QgsProcessingModelAlgorithm::vectorOutputIsCompatibleType( dataTypes, QgsProcessing::TypeVectorLine ) );
5727+
QVERIFY( !QgsProcessingModelAlgorithm::vectorOutputIsCompatibleType( dataTypes, QgsProcessing::TypeVectorPolygon ) );
5728+
QVERIFY( QgsProcessingModelAlgorithm::vectorOutputIsCompatibleType( dataTypes, QgsProcessing::TypeMapLayer ) );
5729+
5730+
// accept any line vector
5731+
dataTypes.clear();
5732+
dataTypes << QgsProcessing::TypeVectorLine;
5733+
QVERIFY( QgsProcessingModelAlgorithm::vectorOutputIsCompatibleType( dataTypes, QgsProcessing::TypeVector ) );
5734+
QVERIFY( QgsProcessingModelAlgorithm::vectorOutputIsCompatibleType( dataTypes, QgsProcessing::TypeVectorAnyGeometry ) );
5735+
QVERIFY( !QgsProcessingModelAlgorithm::vectorOutputIsCompatibleType( dataTypes, QgsProcessing::TypeVectorPoint ) );
5736+
QVERIFY( QgsProcessingModelAlgorithm::vectorOutputIsCompatibleType( dataTypes, QgsProcessing::TypeVectorLine ) );
5737+
QVERIFY( !QgsProcessingModelAlgorithm::vectorOutputIsCompatibleType( dataTypes, QgsProcessing::TypeVectorPolygon ) );
5738+
QVERIFY( QgsProcessingModelAlgorithm::vectorOutputIsCompatibleType( dataTypes, QgsProcessing::TypeMapLayer ) );
5739+
5740+
// accept any polygon vector
5741+
dataTypes.clear();
5742+
dataTypes << QgsProcessing::TypeVectorPolygon;
5743+
QVERIFY( QgsProcessingModelAlgorithm::vectorOutputIsCompatibleType( dataTypes, QgsProcessing::TypeVector ) );
5744+
QVERIFY( QgsProcessingModelAlgorithm::vectorOutputIsCompatibleType( dataTypes, QgsProcessing::TypeVectorAnyGeometry ) );
5745+
QVERIFY( !QgsProcessingModelAlgorithm::vectorOutputIsCompatibleType( dataTypes, QgsProcessing::TypeVectorPoint ) );
5746+
QVERIFY( !QgsProcessingModelAlgorithm::vectorOutputIsCompatibleType( dataTypes, QgsProcessing::TypeVectorLine ) );
5747+
QVERIFY( QgsProcessingModelAlgorithm::vectorOutputIsCompatibleType( dataTypes, QgsProcessing::TypeVectorPolygon ) );
5748+
QVERIFY( QgsProcessingModelAlgorithm::vectorOutputIsCompatibleType( dataTypes, QgsProcessing::TypeMapLayer ) );
5749+
5750+
// accept any map layer
5751+
dataTypes.clear();
5752+
dataTypes << QgsProcessing::TypeMapLayer;
5753+
QVERIFY( QgsProcessingModelAlgorithm::vectorOutputIsCompatibleType( dataTypes, QgsProcessing::TypeVector ) );
5754+
QVERIFY( QgsProcessingModelAlgorithm::vectorOutputIsCompatibleType( dataTypes, QgsProcessing::TypeVectorAnyGeometry ) );
5755+
QVERIFY( QgsProcessingModelAlgorithm::vectorOutputIsCompatibleType( dataTypes, QgsProcessing::TypeVectorPoint ) );
5756+
QVERIFY( QgsProcessingModelAlgorithm::vectorOutputIsCompatibleType( dataTypes, QgsProcessing::TypeVectorLine ) );
5757+
QVERIFY( QgsProcessingModelAlgorithm::vectorOutputIsCompatibleType( dataTypes, QgsProcessing::TypeVectorPolygon ) );
5758+
QVERIFY( QgsProcessingModelAlgorithm::vectorOutputIsCompatibleType( dataTypes, QgsProcessing::TypeMapLayer ) );
5759+
}
5760+
56855761
void TestQgsProcessing::modelAcceptableValues()
56865762
{
56875763
QgsProcessingModelAlgorithm m;

0 commit comments

Comments
 (0)
Please sign in to comment.