Skip to content

Commit 3791bac

Browse files
committed
[processing][modeler] Fix some child algorithm vector results
are not shown as input choices for other child algorithms
1 parent 55a256f commit 3791bac

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
@@ -688,9 +688,9 @@ QgsProcessingModelChildParameterSources QgsProcessingModelAlgorithm::availableSo
688688
{
689689
const QgsProcessingOutputVectorLayer *vectorOut = static_cast< const QgsProcessingOutputVectorLayer *>( out );
690690

691-
if ( !( dataTypes.contains( vectorOut->dataType() ) || vectorOut->dataType() == QgsProcessing::TypeMapLayer || vectorOut->dataType() == QgsProcessing::TypeVector
692-
|| vectorOut->dataType() == QgsProcessing::TypeVectorAnyGeometry ) )
691+
if ( !vectorOutputIsCompatibleType( dataTypes, vectorOut->dataType() ) )
693692
{
693+
//unacceptable output
694694
continue;
695695
}
696696
}
@@ -888,6 +888,23 @@ bool QgsProcessingModelAlgorithm::loadVariant( const QVariant &model )
888888
return true;
889889
}
890890

891+
bool QgsProcessingModelAlgorithm::vectorOutputIsCompatibleType( const QList<int> &acceptableDataTypes, QgsProcessing::SourceType outputType )
892+
{
893+
// This method is intended to be "permissive" rather than "restrictive".
894+
// I.e. we only reject outputs which we know can NEVER be acceptable, but
895+
// if there's doubt then we default to returning true.
896+
return ( acceptableDataTypes.empty()
897+
|| acceptableDataTypes.contains( outputType )
898+
|| outputType == QgsProcessing::TypeMapLayer
899+
|| outputType == QgsProcessing::TypeVector
900+
|| outputType == QgsProcessing::TypeVectorAnyGeometry
901+
|| acceptableDataTypes.contains( QgsProcessing::TypeVector )
902+
|| acceptableDataTypes.contains( QgsProcessing::TypeMapLayer )
903+
|| ( acceptableDataTypes.contains( QgsProcessing::TypeVectorAnyGeometry ) && ( outputType == QgsProcessing::TypeVectorPoint ||
904+
outputType == QgsProcessing::TypeVectorLine ||
905+
outputType == QgsProcessing::TypeVectorPolygon ) ) );
906+
}
907+
891908
bool QgsProcessingModelAlgorithm::toFile( const QString &path ) const
892909
{
893910
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
@@ -495,6 +495,7 @@ class TestQgsProcessing: public QObject
495495
void asPythonCommand();
496496
void modelerAlgorithm();
497497
void modelExecution();
498+
void modelVectorOutputIsCompatibleType();
498499
void modelAcceptableValues();
499500
void tempUtils();
500501
void convertCompatible();
@@ -5908,6 +5909,81 @@ void TestQgsProcessing::modelExecution()
59085909
QCOMPARE( actualParts, expectedParts );
59095910
}
59105911

5912+
void TestQgsProcessing::modelVectorOutputIsCompatibleType()
5913+
{
5914+
// IMPORTANT: This method is intended to be "permissive" rather than "restrictive".
5915+
// I.e. we only reject outputs which we know can NEVER be acceptable, but
5916+
// if there's doubt then we default to returning true.
5917+
5918+
// empty acceptable type list = all are compatible
5919+
QVERIFY( QgsProcessingModelAlgorithm::vectorOutputIsCompatibleType( QList<int>(), QgsProcessing::TypeVector ) );
5920+
QVERIFY( QgsProcessingModelAlgorithm::vectorOutputIsCompatibleType( QList<int>(), QgsProcessing::TypeVectorAnyGeometry ) );
5921+
QVERIFY( QgsProcessingModelAlgorithm::vectorOutputIsCompatibleType( QList<int>(), QgsProcessing::TypeVectorPoint ) );
5922+
QVERIFY( QgsProcessingModelAlgorithm::vectorOutputIsCompatibleType( QList<int>(), QgsProcessing::TypeVectorLine ) );
5923+
QVERIFY( QgsProcessingModelAlgorithm::vectorOutputIsCompatibleType( QList<int>(), QgsProcessing::TypeVectorPolygon ) );
5924+
QVERIFY( QgsProcessingModelAlgorithm::vectorOutputIsCompatibleType( QList<int>(), QgsProcessing::TypeMapLayer ) );
5925+
5926+
// accept any vector
5927+
QList< int > dataTypes;
5928+
dataTypes << QgsProcessing::TypeVector;
5929+
QVERIFY( QgsProcessingModelAlgorithm::vectorOutputIsCompatibleType( dataTypes, QgsProcessing::TypeVector ) );
5930+
QVERIFY( QgsProcessingModelAlgorithm::vectorOutputIsCompatibleType( dataTypes, QgsProcessing::TypeVectorAnyGeometry ) );
5931+
QVERIFY( QgsProcessingModelAlgorithm::vectorOutputIsCompatibleType( dataTypes, QgsProcessing::TypeVectorPoint ) );
5932+
QVERIFY( QgsProcessingModelAlgorithm::vectorOutputIsCompatibleType( dataTypes, QgsProcessing::TypeVectorLine ) );
5933+
QVERIFY( QgsProcessingModelAlgorithm::vectorOutputIsCompatibleType( dataTypes, QgsProcessing::TypeVectorPolygon ) );
5934+
QVERIFY( QgsProcessingModelAlgorithm::vectorOutputIsCompatibleType( dataTypes, QgsProcessing::TypeMapLayer ) );
5935+
5936+
// accept any vector with geometry
5937+
dataTypes.clear();
5938+
dataTypes << QgsProcessing::TypeVectorAnyGeometry;
5939+
QVERIFY( QgsProcessingModelAlgorithm::vectorOutputIsCompatibleType( dataTypes, QgsProcessing::TypeVector ) );
5940+
QVERIFY( QgsProcessingModelAlgorithm::vectorOutputIsCompatibleType( dataTypes, QgsProcessing::TypeVectorAnyGeometry ) );
5941+
QVERIFY( QgsProcessingModelAlgorithm::vectorOutputIsCompatibleType( dataTypes, QgsProcessing::TypeVectorPoint ) );
5942+
QVERIFY( QgsProcessingModelAlgorithm::vectorOutputIsCompatibleType( dataTypes, QgsProcessing::TypeVectorLine ) );
5943+
QVERIFY( QgsProcessingModelAlgorithm::vectorOutputIsCompatibleType( dataTypes, QgsProcessing::TypeVectorPolygon ) );
5944+
QVERIFY( QgsProcessingModelAlgorithm::vectorOutputIsCompatibleType( dataTypes, QgsProcessing::TypeMapLayer ) );
5945+
5946+
// accept any point vector
5947+
dataTypes.clear();
5948+
dataTypes << QgsProcessing::TypeVectorPoint;
5949+
QVERIFY( QgsProcessingModelAlgorithm::vectorOutputIsCompatibleType( dataTypes, QgsProcessing::TypeVector ) );
5950+
QVERIFY( QgsProcessingModelAlgorithm::vectorOutputIsCompatibleType( dataTypes, QgsProcessing::TypeVectorAnyGeometry ) );
5951+
QVERIFY( QgsProcessingModelAlgorithm::vectorOutputIsCompatibleType( dataTypes, QgsProcessing::TypeVectorPoint ) );
5952+
QVERIFY( !QgsProcessingModelAlgorithm::vectorOutputIsCompatibleType( dataTypes, QgsProcessing::TypeVectorLine ) );
5953+
QVERIFY( !QgsProcessingModelAlgorithm::vectorOutputIsCompatibleType( dataTypes, QgsProcessing::TypeVectorPolygon ) );
5954+
QVERIFY( QgsProcessingModelAlgorithm::vectorOutputIsCompatibleType( dataTypes, QgsProcessing::TypeMapLayer ) );
5955+
5956+
// accept any line vector
5957+
dataTypes.clear();
5958+
dataTypes << QgsProcessing::TypeVectorLine;
5959+
QVERIFY( QgsProcessingModelAlgorithm::vectorOutputIsCompatibleType( dataTypes, QgsProcessing::TypeVector ) );
5960+
QVERIFY( QgsProcessingModelAlgorithm::vectorOutputIsCompatibleType( dataTypes, QgsProcessing::TypeVectorAnyGeometry ) );
5961+
QVERIFY( !QgsProcessingModelAlgorithm::vectorOutputIsCompatibleType( dataTypes, QgsProcessing::TypeVectorPoint ) );
5962+
QVERIFY( QgsProcessingModelAlgorithm::vectorOutputIsCompatibleType( dataTypes, QgsProcessing::TypeVectorLine ) );
5963+
QVERIFY( !QgsProcessingModelAlgorithm::vectorOutputIsCompatibleType( dataTypes, QgsProcessing::TypeVectorPolygon ) );
5964+
QVERIFY( QgsProcessingModelAlgorithm::vectorOutputIsCompatibleType( dataTypes, QgsProcessing::TypeMapLayer ) );
5965+
5966+
// accept any polygon vector
5967+
dataTypes.clear();
5968+
dataTypes << QgsProcessing::TypeVectorPolygon;
5969+
QVERIFY( QgsProcessingModelAlgorithm::vectorOutputIsCompatibleType( dataTypes, QgsProcessing::TypeVector ) );
5970+
QVERIFY( QgsProcessingModelAlgorithm::vectorOutputIsCompatibleType( dataTypes, QgsProcessing::TypeVectorAnyGeometry ) );
5971+
QVERIFY( !QgsProcessingModelAlgorithm::vectorOutputIsCompatibleType( dataTypes, QgsProcessing::TypeVectorPoint ) );
5972+
QVERIFY( !QgsProcessingModelAlgorithm::vectorOutputIsCompatibleType( dataTypes, QgsProcessing::TypeVectorLine ) );
5973+
QVERIFY( QgsProcessingModelAlgorithm::vectorOutputIsCompatibleType( dataTypes, QgsProcessing::TypeVectorPolygon ) );
5974+
QVERIFY( QgsProcessingModelAlgorithm::vectorOutputIsCompatibleType( dataTypes, QgsProcessing::TypeMapLayer ) );
5975+
5976+
// accept any map layer
5977+
dataTypes.clear();
5978+
dataTypes << QgsProcessing::TypeMapLayer;
5979+
QVERIFY( QgsProcessingModelAlgorithm::vectorOutputIsCompatibleType( dataTypes, QgsProcessing::TypeVector ) );
5980+
QVERIFY( QgsProcessingModelAlgorithm::vectorOutputIsCompatibleType( dataTypes, QgsProcessing::TypeVectorAnyGeometry ) );
5981+
QVERIFY( QgsProcessingModelAlgorithm::vectorOutputIsCompatibleType( dataTypes, QgsProcessing::TypeVectorPoint ) );
5982+
QVERIFY( QgsProcessingModelAlgorithm::vectorOutputIsCompatibleType( dataTypes, QgsProcessing::TypeVectorLine ) );
5983+
QVERIFY( QgsProcessingModelAlgorithm::vectorOutputIsCompatibleType( dataTypes, QgsProcessing::TypeVectorPolygon ) );
5984+
QVERIFY( QgsProcessingModelAlgorithm::vectorOutputIsCompatibleType( dataTypes, QgsProcessing::TypeMapLayer ) );
5985+
}
5986+
59115987
void TestQgsProcessing::modelAcceptableValues()
59125988
{
59135989
QgsProcessingModelAlgorithm m;

0 commit comments

Comments
 (0)