@@ -316,22 +316,34 @@ bool QgsExpression::needsGeometry() const
316
316
317
317
void QgsExpression::initGeomCalculator ( const QgsExpressionContext *context )
318
318
{
319
- if ( ! d->mCalc )
320
- d->mCalc = std::shared_ptr<QgsDistanceArea>( new QgsDistanceArea () );
321
- QString ellipsoid = context->variable ( " project_ellipsoid" ).toString ();
322
- QString distanceUnitsStr = context->variable ( " project_distance_units" ).toString ();
323
- QString areaUnitsStr = context->variable ( " project_area_units" ).toString ();
324
- QgsCoordinateReferenceSystem crs = context->variable ( " _layer_crs" ).value <QgsCoordinateReferenceSystem>();
325
- QgsCoordinateTransformContext tContext = context->variable ( " _project_transform_context" ).value <QgsCoordinateTransformContext>();
326
-
327
- d->mCalc ->setEllipsoid ( ellipsoid.isEmpty () ? GEO_NONE : ellipsoid );
328
- if ( ! distanceUnitsStr.isEmpty () )
329
- setDistanceUnits ( QgsUnitTypes::stringToDistanceUnit ( distanceUnitsStr ) );
330
- if ( ! areaUnitsStr.isEmpty () )
331
- setAreaUnits ( QgsUnitTypes::stringToAreaUnit ( areaUnitsStr ) );
332
- if ( crs.isValid () )
319
+ // Set the geometry calculator from the context if it has not been set by setGeomCalculator()
320
+ if ( context && ! d->mCalc )
333
321
{
334
- d->mCalc ->setSourceCrs ( crs, tContext );
322
+ QString ellipsoid = context->variable ( " project_ellipsoid" ).toString ();
323
+ QgsCoordinateReferenceSystem crs = context->variable ( " _layer_crs" ).value <QgsCoordinateReferenceSystem>();
324
+ QgsCoordinateTransformContext tContext = context->variable ( " _project_transform_context" ).value <QgsCoordinateTransformContext>();
325
+ if ( crs.isValid () )
326
+ {
327
+ d->mCalc = std::shared_ptr<QgsDistanceArea>( new QgsDistanceArea () );
328
+ d->mCalc ->setEllipsoid ( ellipsoid.isEmpty () ? GEO_NONE : ellipsoid );
329
+ d->mCalc ->setSourceCrs ( crs, tContext );
330
+ }
331
+ }
332
+
333
+ // Set the distance units from the context if it has not been set by setDistanceUnits()
334
+ if ( context && distanceUnits () == QgsUnitTypes::DistanceUnknownUnit )
335
+ {
336
+ QString distanceUnitsStr = context->variable ( " project_distance_units" ).toString ();
337
+ if ( ! distanceUnitsStr.isEmpty () )
338
+ setDistanceUnits ( QgsUnitTypes::stringToDistanceUnit ( distanceUnitsStr ) );
339
+ }
340
+
341
+ // Set the area units from the context if it has not been set by setAreaUnits()
342
+ if ( context && areaUnits () == QgsUnitTypes::AreaUnknownUnit )
343
+ {
344
+ QString areaUnitsStr = context->variable ( " project_area_units" ).toString ();
345
+ if ( ! areaUnitsStr.isEmpty () )
346
+ setAreaUnits ( QgsUnitTypes::stringToAreaUnit ( areaUnitsStr ) );
335
347
}
336
348
}
337
349
@@ -403,8 +415,7 @@ QVariant QgsExpression::evaluate( const QgsExpressionContext *context )
403
415
if ( ! d->mIsPrepared )
404
416
{
405
417
qWarning ( " QgsExpression::evaluate() called on an expression not yet prepared !" );
406
- if ( ! prepare ( context ) )
407
- return QVariant ();
418
+ prepare ( context );
408
419
}
409
420
return d->mRootNode ->eval ( this , context );
410
421
}
0 commit comments