diff --git a/python/plugins/processing/algs/help/qgis.yaml b/python/plugins/processing/algs/help/qgis.yaml index ea9599f397f..a9443a1af15 100755 --- a/python/plugins/processing/algs/help/qgis.yaml +++ b/python/plugins/processing/algs/help/qgis.yaml @@ -499,11 +499,6 @@ qgis:reprojectlayer: > Attributes are not modified by this algorithm. -qgis:saveselectedfeatures: > - This algorithm creates a new layer with all the selected features in a given vector layer. - - If the selected layer has no selected features, all features will be added to the resulting feature. - qgis:selectbyattribute: > This algorithm creates a selection in a vector layer. The criteria for selected features is defined based on the values of an attribute from the input layer. diff --git a/python/plugins/processing/algs/qgis/QGISAlgorithmProvider.py b/python/plugins/processing/algs/qgis/QGISAlgorithmProvider.py index e056a968fbe..273ce20bbf2 100644 --- a/python/plugins/processing/algs/qgis/QGISAlgorithmProvider.py +++ b/python/plugins/processing/algs/qgis/QGISAlgorithmProvider.py @@ -129,7 +129,6 @@ from .RegularPoints import RegularPoints from .Relief import Relief from .ReverseLineDirection import ReverseLineDirection from .Ruggedness import Ruggedness -from .SaveSelectedFeatures import SaveSelectedFeatures from .SelectByAttribute import SelectByAttribute from .SelectByExpression import SelectByExpression from .ServiceAreaFromLayer import ServiceAreaFromLayer @@ -266,7 +265,6 @@ class QGISAlgorithmProvider(QgsProcessingProvider): Relief(), ReverseLineDirection(), Ruggedness(), - SaveSelectedFeatures(), SelectByAttribute(), SelectByExpression(), ServiceAreaFromLayer(), diff --git a/python/plugins/processing/algs/qgis/SaveSelectedFeatures.py b/python/plugins/processing/algs/qgis/SaveSelectedFeatures.py deleted file mode 100644 index 9104ca16108..00000000000 --- a/python/plugins/processing/algs/qgis/SaveSelectedFeatures.py +++ /dev/null @@ -1,72 +0,0 @@ -# -*- coding: utf-8 -*- - -""" -*************************************************************************** - SaveSelectedFeatures.py - --------------------- - Date : August 2012 - Copyright : (C) 2012 by Victor Olaya - Email : volayaf at gmail dot com -*************************************************************************** -* * -* This program is free software; you can redistribute it and/or modify * -* it under the terms of the GNU General Public License as published by * -* the Free Software Foundation; either version 2 of the License, or * -* (at your option) any later version. * -* * -*************************************************************************** -""" - -__author__ = 'Victor Olaya' -__date__ = 'August 2012' -__copyright__ = '(C) 2012, Victor Olaya' - -# This will get replaced with a git SHA1 when you do a git archive - -__revision__ = '$Format:%H$' - -from qgis.core import (QgsFeatureSink, - QgsProcessingParameterVectorLayer, - QgsProcessingParameterFeatureSink) -from processing.algs.qgis.QgisAlgorithm import QgisAlgorithm - - -class SaveSelectedFeatures(QgisAlgorithm): - - OUTPUT = 'OUTPUT' - INPUT = 'INPUT' - - def group(self): - return self.tr('Vector general') - - def __init__(self): - super().__init__() - - def initAlgorithm(self, config=None): - self.addParameter(QgsProcessingParameterVectorLayer(self.INPUT, self.tr('Input layer'))) - self.addParameter(QgsProcessingParameterFeatureSink(self.OUTPUT, self.tr('Selection'))) - - def name(self): - return 'saveselectedfeatures' - - def displayName(self): - return self.tr('Save selected features') - - def processAlgorithm(self, parameters, context, feedback): - vectorLayer = self.parameterAsVectorLayer(parameters, self.INPUT, context) - - (sink, dest_id) = self.parameterAsSink(parameters, self.OUTPUT, context, - vectorLayer.fields(), vectorLayer.wkbType(), vectorLayer.sourceCrs()) - - features = vectorLayer.getSelectedFeatures() - count = int(vectorLayer.selectedFeatureCount()) - - total = 100.0 / count if count else 1 - for current, feat in enumerate(features): - if feedback.isCanceled(): - break - - sink.addFeature(feat, QgsFeatureSink.FastInsert) - feedback.setProgress(int(current * total)) - - return {self.OUTPUT: dest_id} diff --git a/src/core/processing/qgsnativealgorithms.cpp b/src/core/processing/qgsnativealgorithms.cpp index a7a1062b83b..ce856a6c9e6 100644 --- a/src/core/processing/qgsnativealgorithms.cpp +++ b/src/core/processing/qgsnativealgorithms.cpp @@ -80,10 +80,71 @@ void QgsNativeAlgorithms::loadAlgorithms() addAlgorithm( new QgsExtractByLocationAlgorithm() ); addAlgorithm( new QgsFixGeometriesAlgorithm() ); addAlgorithm( new QgsMergeLinesAlgorithm() ); + addAlgorithm( new QgsSaveSelectedFeatures() ); addAlgorithm( new QgsSmoothAlgorithm() ); addAlgorithm( new QgsSimplifyAlgorithm() ); } +void QgsSaveSelectedFeatures::initAlgorithm( const QVariantMap & ) +{ + addParameter( new QgsProcessingParameterVectorLayer( QStringLiteral( "INPUT" ), QObject::tr( "Input layer" ) ) ); + addParameter( new QgsProcessingParameterFeatureSink( QStringLiteral( "OUTPUT" ), QObject::tr( "Selected features" ), QgsProcessing::TypeVectorPoint ) ); +} + +QString QgsSaveSelectedFeatures::shortHelpString() const +{ + return QObject::tr( "This algorithm creates a new layer with all the selected features in a given vector layer.\n\n" + "If the selected layer has no selected features, all features will be added to the resulting feature." ); +} + +QgsSaveSelectedFeatures *QgsSaveSelectedFeatures::createInstance() const +{ + return new QgsSaveSelectedFeatures(); +} + +QVariantMap QgsSaveSelectedFeatures::processAlgorithm( const QVariantMap ¶meters, QgsProcessingContext &context, QgsProcessingFeedback *feedback ) +{ + QgsVectorLayer *selectLayer = parameterAsVectorLayer( parameters, QStringLiteral( "INPUT" ), context ); + + QString dest; + std::unique_ptr< QgsFeatureSink > sink( parameterAsSink( parameters, QStringLiteral( "OUTPUT" ), context, dest, selectLayer->fields(), selectLayer->wkbType(), selectLayer->sourceCrs() ) ); + if ( !sink ) + return QVariantMap(); + + QgsFeatureIterator it; + QgsFeature feat; + + int count = selectLayer->selectedFeatureCount(); + if ( count > 0 ) + { + it = selectLayer->getSelectedFeatures(); + } + else + { + count = selectLayer->featureCount(); + it = selectLayer->getFeatures(); + } + + int current = 0; + double step = count > 0 ? 100.0 / count : 1; + + while ( it.nextFeature( feat ) ) + { + if ( feedback->isCanceled() ) + { + break; + } + + sink->addFeature( feat, QgsFeatureSink::FastInsert ); + + feedback->setProgress( current++ * step ); + } + + QVariantMap outputs; + outputs.insert( QStringLiteral( "OUTPUT" ), dest ); + return outputs; +} + void QgsCentroidAlgorithm::initAlgorithm( const QVariantMap & ) { addParameter( new QgsProcessingParameterFeatureSource( QStringLiteral( "INPUT" ), QObject::tr( "Input layer" ) ) ); diff --git a/src/core/processing/qgsnativealgorithms.h b/src/core/processing/qgsnativealgorithms.h index b5a6e1737c4..6933dda836e 100644 --- a/src/core/processing/qgsnativealgorithms.h +++ b/src/core/processing/qgsnativealgorithms.h @@ -48,6 +48,29 @@ class QgsNativeAlgorithms: public QgsProcessingProvider }; +/** + * Native save selected features algorithm. + */ +class QgsSaveSelectedFeatures : public QgsProcessingAlgorithm +{ + + public: + + QgsSaveSelectedFeatures() = default; + void initAlgorithm( const QVariantMap &configuration = QVariantMap() ) override; + QString name() const override { return QStringLiteral( "saveselectedfeatures" ); } + QString displayName() const override { return QObject::tr( "Save Selected Features" ); } + QStringList tags() const override { return QObject::tr( "selection,save" ).split( ',' ); } + QString group() const override { return QObject::tr( "Vector general" ); } + QString shortHelpString() const override; + QgsSaveSelectedFeatures *createInstance() const override SIP_FACTORY; + + protected: + + virtual QVariantMap processAlgorithm( const QVariantMap ¶meters, + QgsProcessingContext &context, QgsProcessingFeedback *feedback ) override; +}; + /** * Native centroid algorithm. */