Branch data Line data Source code
1 : : /*************************************************************************** 2 : : qgsalgorithmfiltervertices.cpp 3 : : ------------------------------ 4 : : begin : July 2018 5 : : copyright : (C) 2018 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 "qgsalgorithmfiltervertices.h" 19 : : #include "qgsvectorlayer.h" 20 : : 21 : : ///@cond PRIVATE 22 : : 23 : : 24 : 0 : QString QgsFilterVerticesAlgorithmBase::group() const 25 : : { 26 : 0 : return QObject::tr( "Vector geometry" ); 27 : : } 28 : : 29 : 0 : QString QgsFilterVerticesAlgorithmBase::groupId() const 30 : : { 31 : 0 : return QStringLiteral( "vectorgeometry" ); 32 : : } 33 : : 34 : 0 : QString QgsFilterVerticesAlgorithmBase::outputName() const 35 : : { 36 : 0 : return QObject::tr( "Filtered" ); 37 : : } 38 : : 39 : 0 : QString QgsFilterVerticesAlgorithmBase::shortHelpString() const 40 : : { 41 : 0 : return QObject::tr( "Filters away vertices based on their %1, returning geometries with only " 42 : : "vertex points that have a %1 ≥ the specified minimum value and ≤ " 43 : : "the maximum value.\n\n" 44 : : "If the minimum value is not specified than only the maximum value is tested, " 45 : : "and similarly if the maximum value is not specified than only the minimum value is tested.\n\n" 46 : : "Depending on the input geometry attributes and the filters used, " 47 : 0 : "the resultant geometries created by this algorithm may no longer be valid." ).arg( componentString() ); 48 : 0 : } 49 : : 50 : 0 : QList<int> QgsFilterVerticesAlgorithmBase::inputLayerTypes() const 51 : : { 52 : 0 : return QList<int>() << QgsProcessing::TypeVectorLine << QgsProcessing::TypeVectorPolygon; 53 : 0 : } 54 : : 55 : 0 : void QgsFilterVerticesAlgorithmBase::initParameters( const QVariantMap & ) 56 : : { 57 : 0 : auto min = std::make_unique< QgsProcessingParameterNumber >( QStringLiteral( "MIN" ), 58 : 0 : QObject::tr( "Minimum" ), QgsProcessingParameterNumber::Double, QVariant(), true ); 59 : 0 : min->setIsDynamic( true ); 60 : 0 : min->setDynamicPropertyDefinition( QgsPropertyDefinition( QStringLiteral( "Minimum" ), QObject::tr( "Minimum value" ), QgsPropertyDefinition::Double ) ); 61 : 0 : min->setDynamicLayerParameterName( QStringLiteral( "INPUT" ) ); 62 : 0 : addParameter( min.release() ); 63 : : 64 : 0 : auto max = std::make_unique< QgsProcessingParameterNumber >( QStringLiteral( "MAX" ), 65 : 0 : QObject::tr( "Maximum" ), QgsProcessingParameterNumber::Double, QVariant(), true ); 66 : 0 : max->setIsDynamic( true ); 67 : 0 : max->setDynamicPropertyDefinition( QgsPropertyDefinition( QStringLiteral( "Maximum" ), QObject::tr( "Maximum value" ), QgsPropertyDefinition::Double ) ); 68 : 0 : max->setDynamicLayerParameterName( QStringLiteral( "INPUT" ) ); 69 : 0 : addParameter( max.release() ); 70 : 0 : } 71 : : 72 : 0 : bool QgsFilterVerticesAlgorithmBase::prepareAlgorithm( const QVariantMap ¶meters, QgsProcessingContext &context, QgsProcessingFeedback * ) 73 : : { 74 : 0 : if ( parameters.contains( QStringLiteral( "MIN" ) ) && parameters.value( QStringLiteral( "MIN" ) ).isValid() ) 75 : 0 : mMin = parameterAsDouble( parameters, QStringLiteral( "MIN" ), context ); 76 : : else 77 : 0 : mMin = std::numeric_limits<double>::quiet_NaN(); 78 : : 79 : 0 : mDynamicMin = QgsProcessingParameters::isDynamic( parameters, QStringLiteral( "MIN" ) ); 80 : 0 : if ( mDynamicMin ) 81 : 0 : mMinProperty = parameters.value( QStringLiteral( "MIN" ) ).value< QgsProperty >(); 82 : : 83 : 0 : if ( parameters.contains( QStringLiteral( "MAX" ) ) && parameters.value( QStringLiteral( "MAX" ) ).isValid() ) 84 : 0 : mMax = parameterAsDouble( parameters, QStringLiteral( "MAX" ), context ); 85 : : else 86 : 0 : mMax = std::numeric_limits<double>::quiet_NaN(); 87 : : 88 : 0 : mDynamicMax = QgsProcessingParameters::isDynamic( parameters, QStringLiteral( "MAX" ) ); 89 : 0 : if ( mDynamicMax ) 90 : 0 : mMaxProperty = parameters.value( QStringLiteral( "MAX" ) ).value< QgsProperty >(); 91 : : 92 : 0 : return true; 93 : 0 : } 94 : : 95 : 0 : QgsFeatureList QgsFilterVerticesAlgorithmBase::processFeature( const QgsFeature &feature, QgsProcessingContext &context, QgsProcessingFeedback * ) 96 : : { 97 : 0 : QgsFeature f = feature; 98 : 0 : if ( f.hasGeometry() ) 99 : : { 100 : 0 : QgsGeometry geometry = f.geometry(); 101 : 0 : double min = mMin; 102 : 0 : if ( mDynamicMin ) 103 : 0 : min = mMinProperty.valueAsDouble( context.expressionContext(), std::numeric_limits<double>::quiet_NaN() ); 104 : : 105 : 0 : double max = mMax; 106 : 0 : if ( mDynamicMax ) 107 : 0 : max = mMaxProperty.valueAsDouble( context.expressionContext(), std::numeric_limits<double>::quiet_NaN() ); 108 : : 109 : 0 : filter( geometry, min, max ); 110 : 0 : f.setGeometry( geometry ); 111 : 0 : } 112 : 0 : return QgsFeatureList() << f; 113 : 0 : } 114 : : 115 : : // 116 : : // QgsFilterPointsByM 117 : : // 118 : : 119 : 0 : QString QgsFilterVerticesByM::name() const 120 : : { 121 : 0 : return QStringLiteral( "filterverticesbym" ); 122 : : } 123 : : 124 : 0 : QString QgsFilterVerticesByM::displayName() const 125 : : { 126 : 0 : return QObject::tr( "Filter vertices by M value" ); 127 : : } 128 : : 129 : 0 : QStringList QgsFilterVerticesByM::tags() const 130 : : { 131 : 0 : return QObject::tr( "filter,points,vertex,m" ).split( ',' ); 132 : 0 : } 133 : : 134 : 0 : QgsFilterVerticesByM *QgsFilterVerticesByM::createInstance() const 135 : : { 136 : 0 : return new QgsFilterVerticesByM(); 137 : 0 : } 138 : : 139 : 0 : bool QgsFilterVerticesByM::supportInPlaceEdit( const QgsMapLayer *l ) const 140 : : { 141 : 0 : const QgsVectorLayer *layer = qobject_cast< const QgsVectorLayer * >( l ); 142 : 0 : if ( !layer ) 143 : 0 : return false; 144 : : 145 : 0 : if ( ! QgsFilterVerticesAlgorithmBase::supportInPlaceEdit( layer ) ) 146 : 0 : return false; 147 : 0 : return QgsWkbTypes::hasM( layer->wkbType() ); 148 : 0 : } 149 : : 150 : 0 : QString QgsFilterVerticesByM::componentString() const 151 : : { 152 : 0 : return QObject::tr( "m-value" ); 153 : : } 154 : : 155 : 0 : void QgsFilterVerticesByM::filter( QgsGeometry &geometry, double min, double max ) const 156 : : { 157 : 0 : geometry.filterVertices( [min, max]( const QgsPoint & point )->bool 158 : : { 159 : 0 : return ( std::isnan( min ) || point.m() >= min ) 160 : 0 : && ( std::isnan( max ) || point.m() <= max ); 161 : : } ); 162 : 0 : } 163 : : 164 : : 165 : : // 166 : : // QgsFilterPointsByZ 167 : : // 168 : : 169 : 0 : QString QgsFilterVerticesByZ::name() const 170 : : { 171 : 0 : return QStringLiteral( "filterverticesbyz" ); 172 : : } 173 : : 174 : 0 : QString QgsFilterVerticesByZ::displayName() const 175 : : { 176 : 0 : return QObject::tr( "Filter vertices by Z value" ); 177 : : } 178 : : 179 : 0 : QStringList QgsFilterVerticesByZ::tags() const 180 : : { 181 : 0 : return QObject::tr( "filter,points,vertex,z" ).split( ',' ); 182 : 0 : } 183 : : 184 : 0 : QgsFilterVerticesByZ *QgsFilterVerticesByZ::createInstance() const 185 : : { 186 : 0 : return new QgsFilterVerticesByZ(); 187 : 0 : } 188 : : 189 : 0 : bool QgsFilterVerticesByZ::supportInPlaceEdit( const QgsMapLayer *l ) const 190 : : { 191 : 0 : const QgsVectorLayer *layer = qobject_cast< const QgsVectorLayer * >( l ); 192 : 0 : if ( !layer ) 193 : 0 : return false; 194 : : 195 : 0 : if ( ! QgsFilterVerticesAlgorithmBase::supportInPlaceEdit( layer ) ) 196 : 0 : return false; 197 : 0 : return QgsWkbTypes::hasZ( layer->wkbType() ); 198 : 0 : } 199 : : 200 : 0 : QString QgsFilterVerticesByZ::componentString() const 201 : : { 202 : 0 : return QObject::tr( "z-value" ); 203 : : } 204 : : 205 : 0 : void QgsFilterVerticesByZ::filter( QgsGeometry &geometry, double min, double max ) const 206 : : { 207 : 0 : geometry.filterVertices( [min, max]( const QgsPoint & point )->bool 208 : : { 209 : 0 : return ( std::isnan( min ) || point.z() >= min ) 210 : 0 : && ( std::isnan( max ) || point.z() <= max ); 211 : : } ); 212 : 0 : } 213 : : 214 : : ///@endcond 215 : : 216 : :