Skip to content

Commit 5177972

Browse files
committed
Improve conversion of processing parameters to Python code
- Use layer paths instead of layer ids where possible, since they are persistent - Don't wrap in QgsProcessingFeatureSourceDefinition/QgsProcessingOutputLayerDefinition if we can avoid it
1 parent b00a60d commit 5177972

File tree

2 files changed

+32
-13
lines changed

2 files changed

+32
-13
lines changed

src/core/processing/qgsprocessingparameters.cpp

Lines changed: 23 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2433,7 +2433,7 @@ bool QgsProcessingParameterFeatureSource::checkValueIsAcceptable( const QVariant
24332433
return false;
24342434
}
24352435

2436-
QString QgsProcessingParameterFeatureSource::valueAsPythonString( const QVariant &value, QgsProcessingContext & ) const
2436+
QString QgsProcessingParameterFeatureSource::valueAsPythonString( const QVariant &value, QgsProcessingContext &context ) const
24372437
{
24382438
if ( value.canConvert<QgsProperty>() )
24392439
return QStringLiteral( "QgsProperty.fromExpression('%1')" ).arg( value.value< QgsProperty >().asExpression() );
@@ -2443,13 +2443,29 @@ QString QgsProcessingParameterFeatureSource::valueAsPythonString( const QVariant
24432443
QgsProcessingFeatureSourceDefinition fromVar = qvariant_cast<QgsProcessingFeatureSourceDefinition>( value );
24442444
if ( fromVar.source.propertyType() == QgsProperty::StaticProperty )
24452445
{
2446-
return QStringLiteral( "QgsProcessingFeatureSourceDefinition('%1', %2)" ).arg( fromVar.source.staticValue().toString(),
2447-
fromVar.selectedFeaturesOnly ? QStringLiteral( "True" ) : QStringLiteral( "False" ) );
2446+
if ( fromVar.selectedFeaturesOnly )
2447+
{
2448+
return QStringLiteral( "QgsProcessingFeatureSourceDefinition('%1', True)" ).arg( fromVar.source.staticValue().toString() );
2449+
}
2450+
else
2451+
{
2452+
QString layerString = fromVar.source.staticValue().toString();
2453+
// prefer to use layer source instead of id if possible (since it's persistent)
2454+
if ( QgsVectorLayer *layer = qobject_cast< QgsVectorLayer * >( QgsProcessingUtils::mapLayerFromString( layerString, context ) ) )
2455+
layerString = layer->source();
2456+
return layerString.prepend( '\'' ).append( '\'' );
2457+
}
24482458
}
24492459
else
24502460
{
2451-
return QStringLiteral( "QgsProcessingFeatureSourceDefinition(QgsProperty.fromExpression('%1'), %2)" ).arg( fromVar.source.asExpression(),
2452-
fromVar.selectedFeaturesOnly ? QStringLiteral( "True" ) : QStringLiteral( "False" ) );
2461+
if ( fromVar.selectedFeaturesOnly )
2462+
{
2463+
return QStringLiteral( "QgsProcessingFeatureSourceDefinition(QgsProperty.fromExpression('%1'), True)" ).arg( fromVar.source.asExpression() );
2464+
}
2465+
else
2466+
{
2467+
return QStringLiteral( "QgsProperty.fromExpression('%1')" ).arg( fromVar.source.asExpression() );
2468+
}
24532469
}
24542470
}
24552471

@@ -2593,11 +2609,11 @@ QString QgsProcessingParameterFeatureSink::valueAsPythonString( const QVariant &
25932609
QgsProcessingOutputLayerDefinition fromVar = qvariant_cast<QgsProcessingOutputLayerDefinition>( value );
25942610
if ( fromVar.sink.propertyType() == QgsProperty::StaticProperty )
25952611
{
2596-
return QStringLiteral( "QgsProcessingOutputLayerDefinition('%1')" ).arg( fromVar.sink.staticValue().toString() );
2612+
return QStringLiteral( "'%1'" ).arg( fromVar.sink.staticValue().toString() );
25972613
}
25982614
else
25992615
{
2600-
return QStringLiteral( "QgsProcessingOutputLayerDefinition(QgsProperty.fromExpression('%1'))" ).arg( fromVar.sink.asExpression() );
2616+
return QStringLiteral( "QgsProperty.fromExpression('%1')" ).arg( fromVar.sink.asExpression() );
26012617
}
26022618
}
26032619

tests/src/core/testqgsprocessing.cpp

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3365,11 +3365,13 @@ void TestQgsProcessing::parameterFeatureSource()
33653365
p.setCrs( QgsCoordinateReferenceSystem::fromEpsgId( 28353 ) );
33663366
QString testDataDir = QStringLiteral( TEST_DATA_DIR ) + '/'; //defined in CmakeLists.txt
33673367
QString vector1 = testDataDir + "multipoint.shp";
3368+
QString vector2 = testDataDir + "lines.shp";
33683369
QString raster = testDataDir + "landsat.tif";
33693370
QFileInfo fi1( raster );
33703371
QgsRasterLayer *r1 = new QgsRasterLayer( fi1.filePath(), "R1" );
33713372
QgsVectorLayer *v1 = new QgsVectorLayer( "Polygon?crs=EPSG:3111", "V4", "memory" );
3372-
p.addMapLayers( QList<QgsMapLayer *>() << v1 << r1 );
3373+
QgsVectorLayer *v2 = new QgsVectorLayer( vector2, "V5", "ogr" );
3374+
p.addMapLayers( QList<QgsMapLayer *>() << v1 << r1 << v2 );
33733375
QgsProcessingContext context;
33743376
context.setProject( &p );
33753377

@@ -3416,9 +3418,10 @@ void TestQgsProcessing::parameterFeatureSource()
34163418
QVERIFY( !QgsProcessingParameters::parameterAsVectorLayer( def.get(), params, context ) );
34173419

34183420
QCOMPARE( def->valueAsPythonString( QStringLiteral( "abc" ), context ), QStringLiteral( "'abc'" ) );
3419-
QCOMPARE( def->valueAsPythonString( QVariant::fromValue( QgsProcessingFeatureSourceDefinition( "abc" ) ), context ), QStringLiteral( "QgsProcessingFeatureSourceDefinition('abc', False)" ) );
3421+
QCOMPARE( def->valueAsPythonString( QVariant::fromValue( QgsProcessingFeatureSourceDefinition( "abc" ) ), context ), QStringLiteral( "'abc'" ) );
3422+
QCOMPARE( def->valueAsPythonString( QVariant::fromValue( QgsProcessingFeatureSourceDefinition( v2->id() ) ), context ), QStringLiteral( "'%1'" ).arg( vector2 ) );
34203423
QCOMPARE( def->valueAsPythonString( QVariant::fromValue( QgsProcessingFeatureSourceDefinition( QgsProperty::fromValue( "abc" ), true ) ), context ), QStringLiteral( "QgsProcessingFeatureSourceDefinition('abc', True)" ) );
3421-
QCOMPARE( def->valueAsPythonString( QVariant::fromValue( QgsProcessingFeatureSourceDefinition( QgsProperty::fromExpression( "\"abc\" || \"def\"" ) ) ), context ), QStringLiteral( "QgsProcessingFeatureSourceDefinition(QgsProperty.fromExpression('\"abc\" || \"def\"'), False)" ) );
3424+
QCOMPARE( def->valueAsPythonString( QVariant::fromValue( QgsProcessingFeatureSourceDefinition( QgsProperty::fromExpression( "\"abc\" || \"def\"" ) ) ), context ), QStringLiteral( "QgsProperty.fromExpression('\"abc\" || \"def\"')" ) );
34223425
QCOMPARE( def->valueAsPythonString( QVariant::fromValue( QgsProperty::fromExpression( "\"a\"=1" ) ), context ), QStringLiteral( "QgsProperty.fromExpression('\"a\"=1')" ) );
34233426

34243427
QVariantMap map = def->toVariantMap();
@@ -3510,9 +3513,9 @@ void TestQgsProcessing::parameterFeatureSink()
35103513
QVERIFY( def->checkValueIsAcceptable( "c:/Users/admin/Desktop/roads_clipped_transformed_v1_reprojected_final_clipped_aAAA.shp", &context ) );
35113514

35123515
QCOMPARE( def->valueAsPythonString( QStringLiteral( "abc" ), context ), QStringLiteral( "'abc'" ) );
3513-
QCOMPARE( def->valueAsPythonString( QVariant::fromValue( QgsProcessingOutputLayerDefinition( "abc" ) ), context ), QStringLiteral( "QgsProcessingOutputLayerDefinition('abc')" ) );
3514-
QCOMPARE( def->valueAsPythonString( QVariant::fromValue( QgsProcessingOutputLayerDefinition( QgsProperty::fromValue( "abc" ) ) ), context ), QStringLiteral( "QgsProcessingOutputLayerDefinition('abc')" ) );
3515-
QCOMPARE( def->valueAsPythonString( QVariant::fromValue( QgsProcessingOutputLayerDefinition( QgsProperty::fromExpression( "\"abc\" || \"def\"" ) ) ), context ), QStringLiteral( "QgsProcessingOutputLayerDefinition(QgsProperty.fromExpression('\"abc\" || \"def\"'))" ) );
3516+
QCOMPARE( def->valueAsPythonString( QVariant::fromValue( QgsProcessingOutputLayerDefinition( "abc" ) ), context ), QStringLiteral( "'abc'" ) );
3517+
QCOMPARE( def->valueAsPythonString( QVariant::fromValue( QgsProcessingOutputLayerDefinition( QgsProperty::fromValue( "abc" ) ) ), context ), QStringLiteral( "'abc'" ) );
3518+
QCOMPARE( def->valueAsPythonString( QVariant::fromValue( QgsProcessingOutputLayerDefinition( QgsProperty::fromExpression( "\"abc\" || \"def\"" ) ) ), context ), QStringLiteral( "QgsProperty.fromExpression('\"abc\" || \"def\"')" ) );
35163519
QCOMPARE( def->valueAsPythonString( QVariant::fromValue( QgsProperty::fromExpression( "\"a\"=1" ) ), context ), QStringLiteral( "QgsProperty.fromExpression('\"a\"=1')" ) );
35173520

35183521
QCOMPARE( def->defaultFileExtension(), QStringLiteral( "shp" ) );

0 commit comments

Comments
 (0)