Branch data Line data Source code
1 : : /***************************************************************************
2 : : qgsalgorithmsnaptogrid.cpp
3 : : --------------------------
4 : : begin : October 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 "qgsalgorithmsnaptogrid.h"
19 : :
20 : : ///@cond PRIVATE
21 : :
22 : 0 : QString QgsSnapToGridAlgorithm::name() const
23 : : {
24 : 0 : return QStringLiteral( "snappointstogrid" );
25 : : }
26 : :
27 : 0 : QString QgsSnapToGridAlgorithm::displayName() const
28 : : {
29 : 0 : return QObject::tr( "Snap points to grid" );
30 : : }
31 : :
32 : 0 : QStringList QgsSnapToGridAlgorithm::tags() const
33 : : {
34 : 0 : return QObject::tr( "snapped,grid,simplify,round,precision" ).split( ',' );
35 : 0 : }
36 : :
37 : 0 : QString QgsSnapToGridAlgorithm::group() const
38 : : {
39 : 0 : return QObject::tr( "Vector geometry" );
40 : : }
41 : :
42 : 0 : QString QgsSnapToGridAlgorithm::groupId() const
43 : : {
44 : 0 : return QStringLiteral( "vectorgeometry" );
45 : : }
46 : :
47 : 0 : QString QgsSnapToGridAlgorithm::outputName() const
48 : : {
49 : 0 : return QObject::tr( "Snapped" );
50 : : }
51 : :
52 : 0 : QString QgsSnapToGridAlgorithm::shortHelpString() const
53 : : {
54 : 0 : return QObject::tr( "This algorithm modifies the coordinates of geometries in a vector layer, so that all points "
55 : : "or vertices are snapped to the closest point of the grid.\n\n"
56 : : "If the snapped geometry cannot be calculated (or is totally collapsed) the feature's "
57 : : "geometry will be cleared.\n\n"
58 : : "Note that snapping to grid may generate an invalid geometry in some corner cases.\n\n"
59 : : "Snapping can be performed on the X, Y, Z or M axis. A grid spacing of 0 for any axis will "
60 : : "disable snapping for that axis." );
61 : : }
62 : :
63 : 0 : QgsSnapToGridAlgorithm *QgsSnapToGridAlgorithm::createInstance() const
64 : : {
65 : 0 : return new QgsSnapToGridAlgorithm();
66 : 0 : }
67 : :
68 : 0 : void QgsSnapToGridAlgorithm::initParameters( const QVariantMap & )
69 : : {
70 : 0 : std::unique_ptr< QgsProcessingParameterDistance> hSpacing = std::make_unique< QgsProcessingParameterDistance >( QStringLiteral( "HSPACING" ),
71 : 0 : QObject::tr( "X Grid Spacing" ), 1, QStringLiteral( "INPUT" ), false, 0 );
72 : 0 : hSpacing->setIsDynamic( true );
73 : 0 : hSpacing->setDynamicPropertyDefinition( QgsPropertyDefinition( QStringLiteral( "HSPACING" ), QObject::tr( "X Grid Spacing" ), QgsPropertyDefinition::DoublePositive ) );
74 : 0 : hSpacing->setDynamicLayerParameterName( QStringLiteral( "INPUT" ) );
75 : 0 : addParameter( hSpacing.release() );
76 : :
77 : 0 : std::unique_ptr< QgsProcessingParameterDistance> vSpacing = std::make_unique< QgsProcessingParameterDistance >( QStringLiteral( "VSPACING" ),
78 : 0 : QObject::tr( "Y Grid Spacing" ), 1, QStringLiteral( "INPUT" ), false, 0 );
79 : 0 : vSpacing->setIsDynamic( true );
80 : 0 : vSpacing->setDynamicPropertyDefinition( QgsPropertyDefinition( QStringLiteral( "VSPACING" ), QObject::tr( "Y Grid Spacing" ), QgsPropertyDefinition::DoublePositive ) );
81 : 0 : vSpacing->setDynamicLayerParameterName( QStringLiteral( "INPUT" ) );
82 : 0 : addParameter( vSpacing.release() );
83 : :
84 : 0 : std::unique_ptr< QgsProcessingParameterNumber > zSpacing = std::make_unique< QgsProcessingParameterNumber >( QStringLiteral( "ZSPACING" ),
85 : 0 : QObject::tr( "Z Grid Spacing" ), QgsProcessingParameterNumber::Double,
86 : 0 : 0, false, 0 );
87 : 0 : zSpacing->setIsDynamic( true );
88 : 0 : zSpacing->setDynamicPropertyDefinition( QgsPropertyDefinition( QStringLiteral( "ZSPACING" ), QObject::tr( "Z Grid Spacing" ), QgsPropertyDefinition::DoublePositive ) );
89 : 0 : zSpacing->setDynamicLayerParameterName( QStringLiteral( "INPUT" ) );
90 : 0 : addParameter( zSpacing.release() );
91 : :
92 : 0 : std::unique_ptr< QgsProcessingParameterNumber > mSpacing = std::make_unique< QgsProcessingParameterNumber >( QStringLiteral( "MSPACING" ),
93 : 0 : QObject::tr( "M Grid Spacing" ), QgsProcessingParameterNumber::Double,
94 : 0 : 0, false, 0 );
95 : 0 : mSpacing->setIsDynamic( true );
96 : 0 : mSpacing->setDynamicPropertyDefinition( QgsPropertyDefinition( QStringLiteral( "MSPACING" ), QObject::tr( "M Grid Spacing" ), QgsPropertyDefinition::DoublePositive ) );
97 : 0 : mSpacing->setDynamicLayerParameterName( QStringLiteral( "INPUT" ) );
98 : 0 : addParameter( mSpacing.release() );
99 : 0 : }
100 : :
101 : 0 : bool QgsSnapToGridAlgorithm::prepareAlgorithm( const QVariantMap ¶meters, QgsProcessingContext &context, QgsProcessingFeedback * )
102 : : {
103 : 0 : mIntervalX = parameterAsDouble( parameters, QStringLiteral( "HSPACING" ), context );
104 : 0 : mDynamicIntervalX = QgsProcessingParameters::isDynamic( parameters, QStringLiteral( "HSPACING" ) );
105 : 0 : if ( mDynamicIntervalX )
106 : 0 : mIntervalXProperty = parameters.value( QStringLiteral( "HSPACING" ) ).value< QgsProperty >();
107 : :
108 : 0 : mIntervalY = parameterAsDouble( parameters, QStringLiteral( "VSPACING" ), context );
109 : 0 : mDynamicIntervalY = QgsProcessingParameters::isDynamic( parameters, QStringLiteral( "VSPACING" ) );
110 : 0 : if ( mDynamicIntervalY )
111 : 0 : mIntervalYProperty = parameters.value( QStringLiteral( "VSPACING" ) ).value< QgsProperty >();
112 : :
113 : 0 : mIntervalZ = parameterAsDouble( parameters, QStringLiteral( "ZSPACING" ), context );
114 : 0 : mDynamicIntervalZ = QgsProcessingParameters::isDynamic( parameters, QStringLiteral( "ZSPACING" ) );
115 : 0 : if ( mDynamicIntervalZ )
116 : 0 : mIntervalZProperty = parameters.value( QStringLiteral( "ZSPACING" ) ).value< QgsProperty >();
117 : :
118 : 0 : mIntervalM = parameterAsDouble( parameters, QStringLiteral( "MSPACING" ), context );
119 : 0 : mDynamicIntervalM = QgsProcessingParameters::isDynamic( parameters, QStringLiteral( "MSPACING" ) );
120 : 0 : if ( mDynamicIntervalM )
121 : 0 : mIntervalMProperty = parameters.value( QStringLiteral( "MSPACING" ) ).value< QgsProperty >();
122 : :
123 : 0 : return true;
124 : 0 : }
125 : :
126 : 0 : QgsFeatureList QgsSnapToGridAlgorithm::processFeature( const QgsFeature &feature, QgsProcessingContext &context, QgsProcessingFeedback *feedback )
127 : : {
128 : 0 : QgsFeature f = feature;
129 : 0 : if ( f.hasGeometry() )
130 : : {
131 : 0 : double intervalX = mIntervalX;
132 : 0 : if ( mDynamicIntervalX )
133 : 0 : intervalX = mIntervalXProperty.valueAsDouble( context.expressionContext(), intervalX );
134 : :
135 : 0 : double intervalY = mIntervalY;
136 : 0 : if ( mDynamicIntervalY )
137 : 0 : intervalY = mIntervalYProperty.valueAsDouble( context.expressionContext(), intervalY );
138 : :
139 : 0 : double intervalZ = mIntervalZ;
140 : 0 : if ( mDynamicIntervalZ )
141 : 0 : intervalZ = mIntervalZProperty.valueAsDouble( context.expressionContext(), intervalZ );
142 : :
143 : 0 : double intervalM = mIntervalM;
144 : 0 : if ( mDynamicIntervalM )
145 : 0 : intervalM = mIntervalMProperty.valueAsDouble( context.expressionContext(), intervalM );
146 : :
147 : 0 : QgsGeometry outputGeometry = f.geometry().snappedToGrid( intervalX, intervalY, intervalZ, intervalM );
148 : 0 : if ( outputGeometry.isNull() )
149 : : {
150 : 0 : feedback->reportError( QObject::tr( "Error snapping geometry %1" ).arg( feature.id() ) );
151 : 0 : }
152 : 0 : f.setGeometry( outputGeometry );
153 : 0 : }
154 : 0 : return QgsFeatureList() << f;
155 : 0 : }
156 : :
157 : 0 : QgsProcessingFeatureSource::Flag QgsSnapToGridAlgorithm::sourceFlags() const
158 : : {
159 : 0 : return QgsProcessingFeatureSource::FlagSkipGeometryValidityChecks;
160 : : }
161 : :
162 : : ///@endcond
163 : :
164 : :
|