diff --git a/python/core/auto_generated/processing/qgsprocessingalgorithm.sip.in b/python/core/auto_generated/processing/qgsprocessingalgorithm.sip.in index 5a73fc54f4c..dc03f2d7249 100644 --- a/python/core/auto_generated/processing/qgsprocessingalgorithm.sip.in +++ b/python/core/auto_generated/processing/qgsprocessingalgorithm.sip.in @@ -984,6 +984,13 @@ checks based on the geometry type of the layer. :return: true if the algorithm supports in-place editing +.. versionadded:: 3.4 +%End + + void prepareSource( const QVariantMap ¶meters, QgsProcessingContext &context ); +%Docstring +Read the source from ``parameters`` and ``context`` and set it + .. versionadded:: 3.4 %End diff --git a/src/analysis/processing/qgsalgorithmtransform.cpp b/src/analysis/processing/qgsalgorithmtransform.cpp index 942b9c99f95..095376babdb 100644 --- a/src/analysis/processing/qgsalgorithmtransform.cpp +++ b/src/analysis/processing/qgsalgorithmtransform.cpp @@ -79,6 +79,7 @@ QgsTransformAlgorithm *QgsTransformAlgorithm::createInstance() const bool QgsTransformAlgorithm::prepareAlgorithm( const QVariantMap ¶meters, QgsProcessingContext &context, QgsProcessingFeedback * ) { + prepareSource( parameters, context ); mDestCrs = parameterAsCrs( parameters, QStringLiteral( "TARGET_CRS" ), context ); mTransformContext = context.project() ? context.project()->transformContext() : QgsCoordinateTransformContext(); return true; diff --git a/src/core/processing/qgsprocessingalgorithm.cpp b/src/core/processing/qgsprocessingalgorithm.cpp index 455fea6132b..131a2a541cb 100644 --- a/src/core/processing/qgsprocessingalgorithm.cpp +++ b/src/core/processing/qgsprocessingalgorithm.cpp @@ -768,6 +768,7 @@ bool QgsProcessingAlgorithm::supportInPlaceEdit( const QgsVectorLayer *layer ) c return false; } + bool QgsProcessingAlgorithm::createAutoOutputForParameter( QgsProcessingParameterDefinition *parameter ) { if ( !parameter->isDestination() ) @@ -852,10 +853,7 @@ QgsCoordinateReferenceSystem QgsProcessingFeatureBasedAlgorithm::sourceCrs() con QVariantMap QgsProcessingFeatureBasedAlgorithm::processAlgorithm( const QVariantMap ¶meters, QgsProcessingContext &context, QgsProcessingFeedback *feedback ) { - mSource.reset( parameterAsSource( parameters, QStringLiteral( "INPUT" ), context ) ); - if ( !mSource ) - throw QgsProcessingException( invalidSourceError( parameters, QStringLiteral( "INPUT" ) ) ); - + prepareSource( parameters, context ); QString dest; std::unique_ptr< QgsFeatureSink > sink( parameterAsSink( parameters, QStringLiteral( "OUTPUT" ), context, dest, outputFields( mSource->fields() ), @@ -933,3 +931,13 @@ bool QgsProcessingFeatureBasedAlgorithm::supportInPlaceEdit( const QgsVectorLaye return true; } +void QgsProcessingFeatureBasedAlgorithm::prepareSource( const QVariantMap ¶meters, QgsProcessingContext &context ) +{ + if ( ! mSource ) + { + mSource.reset( parameterAsSource( parameters, QStringLiteral( "INPUT" ), context ) ); + if ( !mSource ) + throw QgsProcessingException( invalidSourceError( parameters, QStringLiteral( "INPUT" ) ) ); + } +} + diff --git a/src/core/processing/qgsprocessingalgorithm.h b/src/core/processing/qgsprocessingalgorithm.h index c28e7368efe..04d7456c15a 100644 --- a/src/core/processing/qgsprocessingalgorithm.h +++ b/src/core/processing/qgsprocessingalgorithm.h @@ -826,6 +826,7 @@ class CORE_EXPORT QgsProcessingAlgorithm bool createAutoOutputForParameter( QgsProcessingParameterDefinition *parameter ); + friend class QgsProcessingProvider; friend class TestQgsProcessing; friend class QgsProcessingModelAlgorithm; @@ -990,6 +991,13 @@ class CORE_EXPORT QgsProcessingFeatureBasedAlgorithm : public QgsProcessingAlgor */ virtual bool supportInPlaceEdit( const QgsVectorLayer *layer ) const override; + /** + * Read the source from \a parameters and \a context and set it + * + * \since QGIS 3.4 + */ + void prepareSource( const QVariantMap ¶meters, QgsProcessingContext &context ); + private: std::unique_ptr< QgsProcessingFeatureSource > mSource; diff --git a/tests/src/python/test_qgsprocessinginplace.py b/tests/src/python/test_qgsprocessinginplace.py index fd7ee94ada4..fc75839749a 100644 --- a/tests/src/python/test_qgsprocessinginplace.py +++ b/tests/src/python/test_qgsprocessinginplace.py @@ -88,6 +88,7 @@ class TestQgsProcessingInPlace(unittest.TestCase): context.setProject(QgsProject.instance()) feedback = QgsProcessingFeedback() + input_layer.rollBack() with self.assertRaises(QgsProcessingException) as cm: execute_in_place_run( alg, input_layer, parameters, context=context, feedback=feedback, raise_exceptions=True) @@ -199,6 +200,26 @@ class TestQgsProcessingInPlace(unittest.TestCase): # Check selected self.assertEqual(len(self.vl.selectedFeatureIds()), 3) + def test_reprojectlayer(self): + """Check that this runs correctly""" + + old_count = self.vl.featureCount() + + old_features, new_features = self._alg_tester( + 'native:reprojectlayer', + self.vl, + { + 'TARGET_CRS': 'EPSG:3857', + } + ) + + g = [f.geometry() for f in new_features][0] + self.assertAlmostEqual(g.get().x(), 1001875.4, 1) + self.assertAlmostEqual(g.get().y(), 5621521.5, 1) + + # Check selected + self.assertEqual(self.vl.selectedFeatureIds(), [1]) + def _make_compatible_tester(self, feature_wkt, layer_wkb_name, attrs=[1], old_feature=None): fields = QgsFields() wkb_type = getattr(QgsWkbTypes, layer_wkb_name)