@@ -150,13 +150,61 @@ int QgsMapCanvasSnapper::snapToBackgroundLayers( const QgsPoint& point, QList<Qg
150
150
mSnapper ->setSnapMode ( QgsSnapper::SnapWithResultsWithinTolerances );
151
151
}
152
152
153
+ QgsVectorLayer* currentVectorLayer = dynamic_cast <QgsVectorLayer*>( mMapCanvas ->currentLayer () );
154
+ if ( !currentVectorLayer )
155
+ {
156
+ return 1 ;
157
+ }
158
+
153
159
// read snapping settings from project
154
- bool snappingDefinedInProject, ok;
155
- QStringList layerIdList = QgsProject::instance ()->readListEntry ( " Digitizing" , " /LayerSnappingList" , QStringList (), &snappingDefinedInProject );
156
- QStringList enabledList = QgsProject::instance ()->readListEntry ( " Digitizing" , " /LayerSnappingEnabledList" , QStringList (), &ok );
157
- QStringList toleranceList = QgsProject::instance ()->readListEntry ( " Digitizing" , " /LayerSnappingToleranceList" , QStringList (), &ok );
158
- QStringList toleranceUnitList = QgsProject::instance ()->readListEntry ( " Digitizing" , " /LayerSnappingToleranceUnitList" , QStringList (), &ok );
159
- QStringList snapToList = QgsProject::instance ()->readListEntry ( " Digitizing" , " /LayerSnapToList" , QStringList (), &ok );
160
+ QStringList layerIdList, enabledList, toleranceList, toleranceUnitList, snapToList;
161
+
162
+ bool ok, snappingDefinedInProject;
163
+
164
+ QSettings settings;
165
+ QString snappingMode = QgsProject::instance ()->readEntry ( " Digitizing" , " /SnappingMode" , " current_layer" , &snappingDefinedInProject );
166
+ QString defaultSnapToleranceUnit = snappingDefinedInProject ? QgsProject::instance ()->readEntry ( " Digitizing" , " /DefaultSnapToleranceUnit" ) : settings.value ( " /qgis/digitizing/default_snapping_tolerance_unit" , " 0" ).toString ();
167
+ QString defaultSnapType = snappingDefinedInProject ? QgsProject::instance ()->readEntry ( " Digitizing" , " /DefaultSnapType" ) : settings.value ( " /qgis/digitizing/default_snap_mode" , " off" ).toString ();
168
+ QString defaultSnapTolerance = snappingDefinedInProject ? QString::number ( QgsProject::instance ()->readDoubleEntry ( " Digitizing" , " /DefaultSnapTolerance" ) ) : settings.value ( " /qgis/digitizing/default_snapping_tolerance" , " 0" ).toString ();
169
+
170
+ if ( !snappingDefinedInProject && defaultSnapType == " off" )
171
+ {
172
+ return 0 ;
173
+ }
174
+
175
+ if ( snappingMode == " current_layer" || !snappingDefinedInProject )
176
+ {
177
+ layerIdList.append ( currentVectorLayer->id () );
178
+ enabledList.append ( " enabled" );
179
+ toleranceList.append ( defaultSnapTolerance );
180
+ toleranceUnitList.append ( defaultSnapToleranceUnit );
181
+ snapToList.append ( defaultSnapType );
182
+ }
183
+ else if ( snappingMode == " all_layers" )
184
+ {
185
+ QList<QgsMapLayer*> allLayers = mMapCanvas ->layers ();
186
+ QList<QgsMapLayer*>::const_iterator layerIt = allLayers.constBegin ();
187
+ for ( ; layerIt != allLayers.constEnd (); ++layerIt )
188
+ {
189
+ if ( !( *layerIt ) )
190
+ {
191
+ continue ;
192
+ }
193
+ layerIdList.append (( *layerIt )->id () );
194
+ enabledList.append ( " enabled" );
195
+ toleranceList.append ( defaultSnapTolerance );
196
+ toleranceUnitList.append ( defaultSnapToleranceUnit );
197
+ snapToList.append ( defaultSnapType );
198
+ }
199
+ }
200
+ else // advanced
201
+ {
202
+ layerIdList = QgsProject::instance ()->readListEntry ( " Digitizing" , " /LayerSnappingList" , QStringList (), &ok );
203
+ enabledList = QgsProject::instance ()->readListEntry ( " Digitizing" , " /LayerSnappingEnabledList" , QStringList (), &ok );
204
+ toleranceList = QgsProject::instance ()->readListEntry ( " Digitizing" , " /LayerSnappingToleranceList" , QStringList (), &ok );
205
+ toleranceUnitList = QgsProject::instance ()->readListEntry ( " Digitizing" , " /LayerSnappingToleranceUnitList" , QStringList (), &ok );
206
+ snapToList = QgsProject::instance ()->readListEntry ( " Digitizing" , " /LayerSnapToList" , QStringList (), &ok );
207
+ }
160
208
161
209
if ( !( layerIdList.size () == enabledList.size () &&
162
210
layerIdList.size () == toleranceList.size () &&
@@ -170,89 +218,51 @@ int QgsMapCanvasSnapper::snapToBackgroundLayers( const QgsPoint& point, QList<Qg
170
218
QList<QgsSnapper::SnapLayer> snapLayers;
171
219
QgsSnapper::SnapLayer snapLayer;
172
220
173
- // Use snapping information from the project
174
- if ( snappingDefinedInProject )
221
+
222
+
223
+ // set layers, tolerances, snap to segment/vertex to QgsSnapper
224
+ QStringList::const_iterator layerIt ( layerIdList.constBegin () );
225
+ QStringList::const_iterator tolIt ( toleranceList.constBegin () );
226
+ QStringList::const_iterator tolUnitIt ( toleranceUnitList.constBegin () );
227
+ QStringList::const_iterator snapIt ( snapToList.constBegin () );
228
+ QStringList::const_iterator enabledIt ( enabledList.constBegin () );
229
+ for ( ; layerIt != layerIdList.constEnd (); ++layerIt, ++tolIt, ++tolUnitIt, ++snapIt, ++enabledIt )
175
230
{
176
- // set layers, tolerances, snap to segment/vertex to QgsSnapper
177
- QStringList::const_iterator layerIt ( layerIdList.constBegin () );
178
- QStringList::const_iterator tolIt ( toleranceList.constBegin () );
179
- QStringList::const_iterator tolUnitIt ( toleranceUnitList.constBegin () );
180
- QStringList::const_iterator snapIt ( snapToList.constBegin () );
181
- QStringList::const_iterator enabledIt ( enabledList.constBegin () );
182
- for ( ; layerIt != layerIdList.constEnd (); ++layerIt, ++tolIt, ++tolUnitIt, ++snapIt, ++enabledIt )
231
+ if ( *enabledIt != " enabled" )
183
232
{
184
- if ( *enabledIt != " enabled" )
185
- {
186
- // skip layer if snapping is not enabled
187
- continue ;
188
- }
189
-
190
- // layer
191
- QgsVectorLayer *vlayer = qobject_cast<QgsVectorLayer *>( QgsMapLayerRegistry::instance ()->mapLayer ( *layerIt ) );
192
- if ( !vlayer || !vlayer->hasGeometryType () )
193
- continue ;
233
+ // skip layer if snapping is not enabled
234
+ continue ;
235
+ }
194
236
195
- snapLayer.mLayer = vlayer;
237
+ // layer
238
+ QgsVectorLayer *vlayer = qobject_cast<QgsVectorLayer *>( QgsMapLayerRegistry::instance ()->mapLayer ( *layerIt ) );
239
+ if ( !vlayer || !vlayer->hasGeometryType () )
240
+ continue ;
196
241
197
- // tolerance
198
- snapLayer.mTolerance = tolIt->toDouble ();
199
- snapLayer.mUnitType = ( QgsTolerance::UnitType ) tolUnitIt->toInt ();
242
+ snapLayer.mLayer = vlayer;
200
243
201
- // segment or vertex
202
- if ( *snapIt == " to_vertex" )
203
- {
204
- snapLayer.mSnapTo = QgsSnapper::SnapToVertex;
205
- }
206
- else if ( *snapIt == " to_segment" )
207
- {
208
- snapLayer.mSnapTo = QgsSnapper::SnapToSegment;
209
- }
210
- else
211
- {
212
- // to vertex and segment
213
- snapLayer.mSnapTo = QgsSnapper::SnapToVertexAndSegment;
214
- }
244
+ // tolerance
245
+ snapLayer.mTolerance = tolIt->toDouble ();
246
+ snapLayer.mUnitType = ( QgsTolerance::UnitType ) tolUnitIt->toInt ();
215
247
216
- snapLayers.append ( snapLayer );
248
+ // segment or vertex
249
+ if ( *snapIt == " to vertex" || *snapIt == " to_vertex" )
250
+ {
251
+ snapLayer.mSnapTo = QgsSnapper::SnapToVertex;
217
252
}
218
- }
219
- else
220
- {
221
- // nothing in project. Use default snapping tolerance to vertex of current layer
222
- QgsMapLayer* currentLayer = mMapCanvas ->currentLayer ();
223
- if ( !currentLayer )
224
- return 2 ;
225
-
226
- QgsVectorLayer* currentVectorLayer = qobject_cast<QgsVectorLayer *>( currentLayer );
227
- if ( !currentVectorLayer )
228
- return 3 ;
229
-
230
- snapLayer.mLayer = currentVectorLayer;
231
-
232
- // default snap mode
233
- QSettings settings;
234
- QString defaultSnapString = settings.value ( " /qgis/digitizing/default_snap_mode" , " off" ).toString ();
235
- if ( defaultSnapString == " to segment" )
253
+ else if ( *snapIt == " to segment" || *snapIt == " to_segment" )
236
254
{
237
255
snapLayer.mSnapTo = QgsSnapper::SnapToSegment;
238
256
}
239
- else if ( defaultSnapString == " to vertex and segment" )
257
+ else if ( *snapIt == " to vertex and segment" || *snapIt == " to_vertex_and_segment " )
240
258
{
241
259
snapLayer.mSnapTo = QgsSnapper::SnapToVertexAndSegment;
242
260
}
243
- else if ( defaultSnapString == " to vertex" )
244
- {
245
- snapLayer.mSnapTo = QgsSnapper::SnapToVertex;
246
- }
247
- else
261
+ else // off
248
262
{
249
- return 0 ;
263
+ continue ;
250
264
}
251
265
252
- // default snapping tolerance (returned in map units)
253
- snapLayer.mTolerance = QgsTolerance::defaultTolerance ( currentVectorLayer, mMapCanvas ->mapSettings () );
254
- snapLayer.mUnitType = QgsTolerance::LayerUnits;
255
-
256
266
snapLayers.append ( snapLayer );
257
267
}
258
268
0 commit comments