Branch data Line data Source code
1 : : /*************************************************************************** 2 : : qgsalgorithmdensifygeometries.cpp 3 : : --------------------- 4 : : begin : October 2019 5 : : copyright : (C) 2019 by Clemens Raffler 6 : : email : clemens dot raffler 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 : : 19 : : #include "qgsalgorithmdensifygeometriesbycount.h" 20 : : 21 : : ///@cond PRIVATE 22 : : 23 : 0 : QString QgsDensifyGeometriesByCountAlgorithm::name() const 24 : : { 25 : 0 : return QStringLiteral( "densifygeometries" ); 26 : : } 27 : : 28 : 0 : QString QgsDensifyGeometriesByCountAlgorithm::displayName() const 29 : : { 30 : 0 : return QObject::tr( "Densify by count" ); 31 : : } 32 : : 33 : 0 : QStringList QgsDensifyGeometriesByCountAlgorithm::tags() const 34 : : { 35 : 0 : return QObject::tr( "add,vertex,vertices,points,nodes" ).split( ',' ); 36 : 0 : } 37 : : 38 : 0 : QString QgsDensifyGeometriesByCountAlgorithm::group() const 39 : : { 40 : 0 : return QObject::tr( "Vector geometry" ); 41 : : } 42 : : 43 : 0 : QString QgsDensifyGeometriesByCountAlgorithm::groupId() const 44 : : { 45 : 0 : return QStringLiteral( "vectorgeometry" ); 46 : : } 47 : : 48 : 0 : QString QgsDensifyGeometriesByCountAlgorithm::shortHelpString() const 49 : : { 50 : 0 : return QObject::tr( "This algorithm takes a polygon or line layer " 51 : : "and generates a new one in which the geometries " 52 : : "have a larger number of vertices than the " 53 : : "original one.\n\n If the geometries have z or m values " 54 : : "present then these will be linearly interpolated " 55 : : "at the added nodes.\n\n The number of new vertices to " 56 : : "add to each feature geometry is specified " 57 : : "as an input parameter." ); 58 : : } 59 : : 60 : 0 : QString QgsDensifyGeometriesByCountAlgorithm::shortDescription() const 61 : : { 62 : 0 : return QObject::tr( "Creates a densified version of geometries." ); 63 : : } 64 : : 65 : 0 : QgsDensifyGeometriesByCountAlgorithm *QgsDensifyGeometriesByCountAlgorithm::createInstance() const 66 : : { 67 : 0 : return new QgsDensifyGeometriesByCountAlgorithm; 68 : : 69 : 0 : } 70 : : 71 : 0 : QList<int> QgsDensifyGeometriesByCountAlgorithm::inputLayerTypes() const 72 : : { 73 : 0 : return QList<int>() << QgsProcessing::TypeVectorLine << QgsProcessing::TypeVectorPolygon; 74 : 0 : } 75 : : 76 : 0 : void QgsDensifyGeometriesByCountAlgorithm::initParameters( const QVariantMap &configuration ) 77 : : { 78 : 0 : Q_UNUSED( configuration ) 79 : 0 : std::unique_ptr<QgsProcessingParameterNumber> verticesCnt = std::make_unique<QgsProcessingParameterNumber>( QStringLiteral( "VERTICES" ), 80 : 0 : QObject::tr( "Number of vertices to add" ), 81 : 0 : QgsProcessingParameterNumber::Integer, 82 : 0 : 1, false, 1, 10000000 ); 83 : 0 : verticesCnt->setIsDynamic( true ); 84 : 0 : verticesCnt->setDynamicPropertyDefinition( QgsPropertyDefinition( QStringLiteral( "VerticesCount" ), QObject::tr( "Vertices count" ), QgsPropertyDefinition::IntegerPositive ) ); 85 : 0 : verticesCnt->setDynamicLayerParameterName( QStringLiteral( "INPUT" ) ); 86 : 0 : addParameter( verticesCnt.release() ); 87 : 0 : } 88 : : 89 : 0 : QString QgsDensifyGeometriesByCountAlgorithm::outputName() const 90 : : { 91 : 0 : return QObject::tr( "Densified" ); 92 : : } 93 : : 94 : 0 : bool QgsDensifyGeometriesByCountAlgorithm::prepareAlgorithm( const QVariantMap ¶meters, QgsProcessingContext &context, QgsProcessingFeedback *feedback ) 95 : : { 96 : : Q_UNUSED( feedback ) 97 : 0 : mVerticesCnt = parameterAsInt( parameters, QStringLiteral( "VERTICES" ), context ); 98 : : 99 : 0 : mDynamicVerticesCnt = QgsProcessingParameters::isDynamic( parameters, QStringLiteral( "VERTICES" ) ); 100 : 0 : if ( mDynamicVerticesCnt ) 101 : 0 : mVerticesCntProperty = parameters.value( QStringLiteral( "VERTICES" ) ).value< QgsProperty >(); 102 : : 103 : 0 : return true; 104 : 0 : } 105 : : 106 : 0 : QgsFeatureList QgsDensifyGeometriesByCountAlgorithm::processFeature( const QgsFeature &feature, QgsProcessingContext &context, QgsProcessingFeedback *feedback ) 107 : : { 108 : 0 : Q_UNUSED( context ) 109 : : Q_UNUSED( feedback ) 110 : : 111 : 0 : QgsFeature densifiedFeature = feature; 112 : : 113 : 0 : if ( feature.hasGeometry() ) 114 : : { 115 : 0 : int verticesCnt = mVerticesCnt; 116 : 0 : if ( mDynamicVerticesCnt ) 117 : 0 : verticesCnt = mVerticesCntProperty.valueAsInt( context.expressionContext(), verticesCnt ); 118 : : 119 : 0 : if ( verticesCnt > 0 ) 120 : 0 : densifiedFeature.setGeometry( feature.geometry().densifyByCount( verticesCnt ) ); 121 : 0 : } 122 : : 123 : 0 : return QgsFeatureList() << densifiedFeature; 124 : 0 : } 125 : : 126 : : 127 : : 128 : : ///@endcond PRIVATE