Skip to content

Commit d415ad8

Browse files
committedJan 23, 2018
[processing] Fix extent and CRS parameters do not evaluate in
models when linked to a layer parameter/output value References discussion on dev mailing list
1 parent c87f5aa commit d415ad8

File tree

2 files changed

+53
-8
lines changed

2 files changed

+53
-8
lines changed
 

‎src/core/processing/qgsprocessingparameters.cpp

Lines changed: 31 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -466,6 +466,8 @@ QgsCoordinateReferenceSystem QgsProcessingParameters::parameterAsCrs( const QgsP
466466
if ( !definition )
467467
return QgsCoordinateReferenceSystem();
468468

469+
QVariant val = parameters.value( definition->name() );
470+
469471
QString crsText = parameterAsString( definition, parameters, context );
470472
if ( crsText.isEmpty() )
471473
crsText = definition->defaultValue().toString();
@@ -478,7 +480,9 @@ QgsCoordinateReferenceSystem QgsProcessingParameters::parameterAsCrs( const QgsP
478480
return context.project()->crs();
479481

480482
// maybe a map layer reference
481-
if ( QgsMapLayer *layer = QgsProcessingUtils::mapLayerFromString( crsText, context ) )
483+
if ( QgsMapLayer *layer = qobject_cast< QgsMapLayer * >( qvariant_cast<QObject *>( val ) ) )
484+
return layer->crs();
485+
else if ( QgsMapLayer *layer = QgsProcessingUtils::mapLayerFromString( crsText, context ) )
482486
return layer->crs();
483487

484488
// else CRS from string
@@ -517,13 +521,16 @@ QgsRectangle QgsProcessingParameters::parameterAsExtent( const QgsProcessingPara
517521
return rr;
518522
}
519523

524+
// maybe parameter is a direct layer value?
525+
QgsMapLayer *layer = qobject_cast< QgsMapLayer * >( qvariant_cast<QObject *>( val ) );
526+
520527
QString rectText;
521528
if ( val.canConvert<QgsProperty>() )
522529
rectText = val.value< QgsProperty >().valueAsString( context.expressionContext(), definition->defaultValue().toString() );
523530
else
524531
rectText = val.toString();
525532

526-
if ( rectText.isEmpty() )
533+
if ( rectText.isEmpty() && !layer )
527534
return QgsRectangle();
528535

529536
QRegularExpression rx( "^(.*?)\\s*,\\s*(.*?),\\s*(.*?),\\s*(.*?)\\s*(?:\\[(.*)\\])?\\s*$" );
@@ -559,7 +566,10 @@ QgsRectangle QgsProcessingParameters::parameterAsExtent( const QgsProcessingPara
559566
}
560567

561568
// try as layer extent
562-
if ( QgsMapLayer *layer = QgsProcessingUtils::mapLayerFromString( rectText, context ) )
569+
if ( !layer )
570+
layer = QgsProcessingUtils::mapLayerFromString( rectText, context );
571+
572+
if ( layer )
563573
{
564574
QgsRectangle rect = layer->extent();
565575
if ( crs.isValid() && layer->crs().isValid() && crs != layer->crs() )
@@ -650,7 +660,13 @@ QgsGeometry QgsProcessingParameters::parameterAsExtentGeometry( const QgsProcess
650660
}
651661

652662
// try as layer extent
653-
if ( QgsMapLayer *layer = QgsProcessingUtils::mapLayerFromString( rectText, context ) )
663+
664+
// maybe parameter is a direct layer value?
665+
QgsMapLayer *layer = qobject_cast< QgsMapLayer * >( qvariant_cast<QObject *>( val ) );
666+
if ( !layer )
667+
layer = QgsProcessingUtils::mapLayerFromString( rectText, context );
668+
669+
if ( layer )
654670
{
655671
QgsRectangle rect = layer->extent();
656672
QgsGeometry g = QgsGeometry::fromRect( rect );
@@ -698,10 +714,10 @@ QgsCoordinateReferenceSystem QgsProcessingParameters::parameterAsExtentCrs( cons
698714
}
699715

700716
// try as layer crs
701-
if ( QgsMapLayer *layer = QgsProcessingUtils::mapLayerFromString( valueAsString, context ) )
702-
{
717+
if ( QgsMapLayer *layer = qobject_cast< QgsMapLayer * >( qvariant_cast<QObject *>( val ) ) )
718+
return layer->crs();
719+
else if ( QgsMapLayer *layer = QgsProcessingUtils::mapLayerFromString( valueAsString, context ) )
703720
return layer->crs();
704-
}
705721

706722
if ( context.project() )
707723
return context.project()->crs();
@@ -1308,6 +1324,10 @@ bool QgsProcessingParameterCrs::checkValueIsAcceptable( const QVariant &input, Q
13081324
return true;
13091325
}
13101326

1327+
// direct map layer value
1328+
if ( qobject_cast< QgsMapLayer * >( qvariant_cast<QObject *>( input ) ) )
1329+
return true;
1330+
13111331
if ( input.type() != QVariant::String || input.toString().isEmpty() )
13121332
return mFlags & FlagOptional;
13131333

@@ -1424,6 +1444,10 @@ bool QgsProcessingParameterExtent::checkValueIsAcceptable( const QVariant &input
14241444
return !r.isNull();
14251445
}
14261446

1447+
// direct map layer value
1448+
if ( qobject_cast< QgsMapLayer * >( qvariant_cast<QObject *>( input ) ) )
1449+
return true;
1450+
14271451
if ( input.type() != QVariant::String || input.toString().isEmpty() )
14281452
return mFlags & FlagOptional;
14291453

‎tests/src/analysis/testqgsprocessing.cpp

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1853,6 +1853,7 @@ void TestQgsProcessing::parameterCrs()
18531853
QVERIFY( !def->checkValueIsAcceptable( 5 ) );
18541854
QVERIFY( def->checkValueIsAcceptable( "EPSG:12003" ) );
18551855
QVERIFY( def->checkValueIsAcceptable( "EPSG:3111" ) );
1856+
QVERIFY( def->checkValueIsAcceptable( QVariant::fromValue( r1 ) ) );
18561857
QVERIFY( !def->checkValueIsAcceptable( "" ) );
18571858
QVERIFY( !def->checkValueIsAcceptable( QVariant() ) );
18581859

@@ -1861,6 +1862,8 @@ void TestQgsProcessing::parameterCrs()
18611862
params.insert( "non_optional", v1->id() );
18621863
QCOMPARE( QgsProcessingParameters::parameterAsCrs( def.get(), params, context ).authid(), QString( "EPSG:3111" ) );
18631864
QVERIFY( def->checkValueIsAcceptable( v1->id() ) );
1865+
params.insert( "non_optional", QVariant::fromValue( v1 ) );
1866+
QCOMPARE( QgsProcessingParameters::parameterAsCrs( def.get(), params, context ).authid(), QString( "EPSG:3111" ) );
18641867

18651868
// special ProjectCrs string
18661869
params.insert( "non_optional", QStringLiteral( "ProjectCrs" ) );
@@ -2112,6 +2115,24 @@ void TestQgsProcessing::parameterExtent()
21122115
QGSCOMPARENEAR( ext.yMinimum(), 5083255, 100 );
21132116
QGSCOMPARENEAR( ext.yMaximum(), 5083355, 100 );
21142117

2118+
// layer as parameter
2119+
params.insert( "non_optional", QVariant::fromValue( r1 ) );
2120+
QVERIFY( def->checkValueIsAcceptable( QVariant::fromValue( r1 ) ) );
2121+
QCOMPARE( QgsProcessingParameters::parameterAsExtent( def.get(), params, context ), r1->extent() );
2122+
QCOMPARE( QgsProcessingParameters::parameterAsExtentCrs( def.get(), params, context ).authid(), QStringLiteral( "EPSG:4326" ) );
2123+
ext = QgsProcessingParameters::parameterAsExtent( def.get(), params, context, QgsCoordinateReferenceSystem( "EPSG:4326" ) );
2124+
QGSCOMPARENEAR( ext.xMinimum(), 1535375, 100 );
2125+
QGSCOMPARENEAR( ext.xMaximum(), 1535475, 100 );
2126+
QGSCOMPARENEAR( ext.yMinimum(), 5083255, 100 );
2127+
QGSCOMPARENEAR( ext.yMaximum(), 5083355, 100 );
2128+
QgsGeometry gExt = QgsProcessingParameters::parameterAsExtentGeometry( def.get(), params, context, QgsCoordinateReferenceSystem( "EPSG:4326" ) );
2129+
QCOMPARE( gExt.constGet()->vertexCount(), 5 );
2130+
ext = gExt.boundingBox();
2131+
QGSCOMPARENEAR( ext.xMinimum(), 1535375, 100 );
2132+
QGSCOMPARENEAR( ext.xMaximum(), 1535475, 100 );
2133+
QGSCOMPARENEAR( ext.yMinimum(), 5083255, 100 );
2134+
QGSCOMPARENEAR( ext.yMaximum(), 5083355, 100 );
2135+
21152136
// string representing a non-project layer source
21162137
params.insert( "non_optional", raster2 );
21172138
QVERIFY( def->checkValueIsAcceptable( raster2 ) );
@@ -2126,7 +2147,7 @@ void TestQgsProcessing::parameterExtent()
21262147
QGSCOMPARENEAR( ext.xMaximum(), 18.045658, 0.01 );
21272148
QGSCOMPARENEAR( ext.yMinimum(), 30.151856, 0.01 );
21282149
QGSCOMPARENEAR( ext.yMaximum(), 30.257289, 0.01 );
2129-
QgsGeometry gExt = QgsProcessingParameters::parameterAsExtentGeometry( def.get(), params, context, QgsCoordinateReferenceSystem( "EPSG:4326" ) );
2150+
gExt = QgsProcessingParameters::parameterAsExtentGeometry( def.get(), params, context, QgsCoordinateReferenceSystem( "EPSG:4326" ) );
21302151
QCOMPARE( gExt.constGet()->vertexCount(), 85 );
21312152
ext = gExt.boundingBox();
21322153
QGSCOMPARENEAR( ext.xMinimum(), 17.924273, 0.01 );

0 commit comments

Comments
 (0)
Please sign in to comment.