QGIS API Documentation  3.20.0-Odense (decaadbb31)
qgsalgorithmsetmvalue.cpp
Go to the documentation of this file.
1 /***************************************************************************
2  qgsalgorithmsetmvalue.cpp
3  ---------------------
4  begin : November 2019
5  copyright : (C) 2019 by Alexander Bruy
6  email : alexander dot bruy 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 "qgsalgorithmsetmvalue.h"
19 #include "qgsvectorlayer.h"
20 
22 
23 QString QgsSetMValueAlgorithm::name() const
24 {
25  return QStringLiteral( "setmvalue" );
26 }
27 
28 QString QgsSetMValueAlgorithm::displayName() const
29 {
30  return QObject::tr( "Set M value" );
31 }
32 
33 QStringList QgsSetMValueAlgorithm::tags() const
34 {
35  return QObject::tr( "set,add,m,measure,values" ).split( ',' );
36 }
37 
38 QString QgsSetMValueAlgorithm::group() const
39 {
40  return QObject::tr( "Vector geometry" );
41 }
42 
43 QString QgsSetMValueAlgorithm::groupId() const
44 {
45  return QStringLiteral( "vectorgeometry" );
46 }
47 
48 QString QgsSetMValueAlgorithm::shortHelpString() const
49 {
50  return QObject::tr( "This algorithm sets the M value for geometries in a layer.\n\n"
51  "If M values already exist in the layer, they will be overwritten "
52  "with the new value. If no M values exist, the geometry will be "
53  "upgraded to include M values and the specified value used as "
54  "the initial M value for all geometries." );
55 }
56 
57 QString QgsSetMValueAlgorithm::outputName() const
58 {
59  return QObject::tr( "M Added" );
60 }
61 
62 QgsSetMValueAlgorithm *QgsSetMValueAlgorithm::createInstance() const
63 {
64  return new QgsSetMValueAlgorithm();
65 }
66 
67 bool QgsSetMValueAlgorithm::supportInPlaceEdit( const QgsMapLayer *l ) const
68 {
69  const QgsVectorLayer *layer = qobject_cast< const QgsVectorLayer * >( l );
70  if ( !layer )
71  return false;
72 
74 }
75 
76 QgsProcessingFeatureSource::Flag QgsSetMValueAlgorithm::sourceFlags() const
77 {
79 }
80 
81 QgsWkbTypes::Type QgsSetMValueAlgorithm::outputWkbType( QgsWkbTypes::Type type ) const
82 {
83  return QgsWkbTypes::addM( type );
84 }
85 
86 void QgsSetMValueAlgorithm::initParameters( const QVariantMap & )
87 {
88  auto mValueParam = std::make_unique < QgsProcessingParameterNumber >( QStringLiteral( "M_VALUE" ), QObject::tr( "M Value" ), QgsProcessingParameterNumber::Double, 0.0 );
89  mValueParam->setIsDynamic( true );
90  mValueParam->setDynamicPropertyDefinition( QgsPropertyDefinition( QStringLiteral( "M_VALUE" ), QObject::tr( "M Value" ), QgsPropertyDefinition::Double ) );
91  mValueParam->setDynamicLayerParameterName( QStringLiteral( "INPUT" ) );
92  addParameter( mValueParam.release() );
93 }
94 
95 bool QgsSetMValueAlgorithm::prepareAlgorithm( const QVariantMap &parameters, QgsProcessingContext &context, QgsProcessingFeedback * )
96 {
97  mMValue = parameterAsDouble( parameters, QStringLiteral( "M_VALUE" ), context );
98  mDynamicMValue = QgsProcessingParameters::isDynamic( parameters, QStringLiteral( "M_VALUE" ) );
99  if ( mDynamicMValue )
100  mMValueProperty = parameters.value( QStringLiteral( "M_VALUE" ) ).value< QgsProperty >();
101 
102  return true;
103 }
104 
105 QgsFeatureList QgsSetMValueAlgorithm::processFeature( const QgsFeature &feature, QgsProcessingContext &context, QgsProcessingFeedback * )
106 {
107  QgsFeature f = feature;
108 
109  if ( f.hasGeometry() )
110  {
111  std::unique_ptr< QgsAbstractGeometry > newGeometry( f.geometry().constGet()->clone() );
112  // addMValue won't alter existing M values, so drop them first
113  if ( QgsWkbTypes::hasM( newGeometry->wkbType() ) )
114  newGeometry->dropMValue();
115 
116  double m = mMValue;
117  if ( mDynamicMValue )
118  m = mMValueProperty.valueAsDouble( context.expressionContext(), m );
119 
120  newGeometry->addMValue( m );
121 
122  f.setGeometry( QgsGeometry( std::move( newGeometry ) ) );
123  }
124 
125  return QgsFeatureList() << f;
126 }
127 
virtual QgsAbstractGeometry * clone() const =0
Clones the geometry by performing a deep copy.
The feature class encapsulates a single feature including its unique ID, geometry and a list of field...
Definition: qgsfeature.h:56
QgsGeometry geometry
Definition: qgsfeature.h:67
bool hasGeometry() const
Returns true if the feature has an associated geometry.
Definition: qgsfeature.cpp:205
void setGeometry(const QgsGeometry &geometry)
Set the feature's geometry.
Definition: qgsfeature.cpp:145
A geometry is the spatial representation of a feature.
Definition: qgsgeometry.h:124
const QgsAbstractGeometry * constGet() const SIP_HOLDGIL
Returns a non-modifiable (const) reference to the underlying abstract geometry primitive.
Base class for all map layer types.
Definition: qgsmaplayer.h:70
Contains information about the context in which a processing algorithm is executed.
QgsExpressionContext & expressionContext()
Returns the expression context.
bool supportInPlaceEdit(const QgsMapLayer *layer) const override
Checks whether this algorithm supports in-place editing on the given layer Default implementation for...
Flag
Flags controlling how QgsProcessingFeatureSource fetches features.
@ FlagSkipGeometryValidityChecks
Invalid geometry checks should always be skipped. This flag can be useful for algorithms which always...
Base class for providing feedback from a processing algorithm.
static bool isDynamic(const QVariantMap &parameters, const QString &name)
Returns true if the parameter with matching name is a dynamic parameter, and must be evaluated once f...
Definition for a property.
Definition: qgsproperty.h:48
@ Double
Double value (including negative values)
Definition: qgsproperty.h:58
A store for object properties.
Definition: qgsproperty.h:232
Represents a vector layer which manages a vector based data sets.
Q_INVOKABLE QgsWkbTypes::Type wkbType() const FINAL
Returns the WKBType or WKBUnknown in case of error.
static bool hasM(Type type) SIP_HOLDGIL
Tests whether a WKB type contains m values.
Definition: qgswkbtypes.h:1100
Type
The WKB type describes the number of dimensions a geometry has.
Definition: qgswkbtypes.h:70
static Type addM(Type type) SIP_HOLDGIL
Adds the m dimension to a WKB type and returns the new type.
Definition: qgswkbtypes.h:1171
QList< QgsFeature > QgsFeatureList
Definition: qgsfeature.h:736