Branch data Line data Source code
1 : : /*************************************************************************** 2 : : qgsalgorithmsaveselectedfeatures.cpp 3 : : --------------------- 4 : : begin : April 2017 5 : : copyright : (C) 2017 by Nyall Dawson 6 : : email : nyall dot dawson at gmail dot com 7 : : ***************************************************************************/ 8 : : 9 : : /*************************************************************************** 10 : : * * 11 : : * This program is free software; you can redistribute it and/or modify * 12 : : * it under the terms of the GNU General Public License as published by * 13 : : * the Free Software Foundation; either version 2 of the License, or * 14 : : * (at your option) any later version. * 15 : : * * 16 : : ***************************************************************************/ 17 : : 18 : : #include "qgsalgorithmsaveselectedfeatures.h" 19 : : #include "qgsvectorlayer.h" 20 : : 21 : : ///@cond PRIVATE 22 : : 23 : 0 : void QgsSaveSelectedFeatures::initAlgorithm( const QVariantMap & ) 24 : : { 25 : 0 : addParameter( new QgsProcessingParameterVectorLayer( QStringLiteral( "INPUT" ), QObject::tr( "Input layer" ), 26 : 0 : QList< int >() << QgsProcessing::TypeVector ) ); 27 : 0 : addParameter( new QgsProcessingParameterFeatureSink( QStringLiteral( "OUTPUT" ), QObject::tr( "Selected features" ) ) ); 28 : 0 : } 29 : : 30 : 0 : QString QgsSaveSelectedFeatures::name() const 31 : : { 32 : 0 : return QStringLiteral( "saveselectedfeatures" ); 33 : : } 34 : : 35 : 0 : QString QgsSaveSelectedFeatures::displayName() const 36 : : { 37 : 0 : return QObject::tr( "Extract selected features" ); 38 : : } 39 : : 40 : 0 : QStringList QgsSaveSelectedFeatures::tags() const 41 : : { 42 : 0 : return QObject::tr( "selection,save,by" ).split( ',' ); 43 : 0 : } 44 : : 45 : 0 : QString QgsSaveSelectedFeatures::group() const 46 : : { 47 : 0 : return QObject::tr( "Vector general" ); 48 : : } 49 : : 50 : 0 : QString QgsSaveSelectedFeatures::groupId() const 51 : : { 52 : 0 : return QStringLiteral( "vectorgeneral" ); 53 : : } 54 : : 55 : 0 : QString QgsSaveSelectedFeatures::shortHelpString() const 56 : : { 57 : 0 : return QObject::tr( "This algorithm creates a new layer with all the selected features in a given vector layer.\n\n" 58 : : "If the selected layer has no selected features, the newly created layer will be empty." ); 59 : : } 60 : : 61 : 0 : QgsSaveSelectedFeatures *QgsSaveSelectedFeatures::createInstance() const 62 : : { 63 : 0 : return new QgsSaveSelectedFeatures(); 64 : : } 65 : : 66 : 0 : bool QgsSaveSelectedFeatures::prepareAlgorithm( const QVariantMap ¶meters, QgsProcessingContext &context, QgsProcessingFeedback * ) 67 : : { 68 : 0 : QgsVectorLayer *selectLayer = parameterAsVectorLayer( parameters, QStringLiteral( "INPUT" ), context ); 69 : 0 : if ( !selectLayer ) 70 : 0 : throw QgsProcessingException( invalidSourceError( parameters, QStringLiteral( "INPUT" ) ) ); 71 : : 72 : 0 : mSelection = selectLayer->selectedFeatureIds(); 73 : 0 : return true; 74 : 0 : } 75 : : 76 : 0 : QVariantMap QgsSaveSelectedFeatures::processAlgorithm( const QVariantMap ¶meters, QgsProcessingContext &context, QgsProcessingFeedback *feedback ) 77 : : { 78 : 0 : QgsVectorLayer *selectLayer = parameterAsVectorLayer( parameters, QStringLiteral( "INPUT" ), context ); 79 : 0 : if ( !selectLayer ) 80 : 0 : throw QgsProcessingException( invalidSourceError( parameters, QStringLiteral( "INPUT" ) ) ); 81 : : 82 : 0 : QString dest; 83 : 0 : std::unique_ptr< QgsFeatureSink > sink( parameterAsSink( parameters, QStringLiteral( "OUTPUT" ), context, dest, selectLayer->fields(), selectLayer->wkbType(), selectLayer->sourceCrs() ) ); 84 : 0 : if ( !sink ) 85 : 0 : throw QgsProcessingException( invalidSinkError( parameters, QStringLiteral( "OUTPUT" ) ) ); 86 : : 87 : : 88 : 0 : int count = mSelection.count(); 89 : 0 : int current = 0; 90 : 0 : double step = count > 0 ? 100.0 / count : 1; 91 : : 92 : 0 : QgsFeatureIterator it = selectLayer->getFeatures( QgsFeatureRequest().setFilterFids( mSelection ) ); 93 : 0 : QgsFeature feat; 94 : 0 : while ( it.nextFeature( feat ) ) 95 : : { 96 : 0 : if ( feedback->isCanceled() ) 97 : : { 98 : 0 : break; 99 : : } 100 : : 101 : 0 : sink->addFeature( feat, QgsFeatureSink::FastInsert ); 102 : : 103 : 0 : feedback->setProgress( current++ * step ); 104 : : } 105 : : 106 : 0 : QVariantMap outputs; 107 : 0 : outputs.insert( QStringLiteral( "OUTPUT" ), dest ); 108 : 0 : return outputs; 109 : 0 : } 110 : : 111 : : ///@endcond 112 : : 113 : : 114 : :