@@ -41,14 +41,17 @@ void QgsMapToolOffsetCurve::canvasPressEvent( QMouseEvent * e )
41
41
42
42
// get selected features or snap to nearest feature if no selection
43
43
QgsVectorLayer* layer = currentVectorLayer ();
44
- if ( !layer )
44
+ if ( !mCanvas || ! layer )
45
45
{
46
46
return ;
47
47
}
48
48
49
+
50
+ QgsMapRenderer* renderer = mCanvas ->mapRenderer ();
51
+ QgsSnapper snapper ( renderer );
52
+ configureSnapper ( snapper );
49
53
QList<QgsSnappingResult> snapResults;
50
- QgsMapCanvasSnapper snapper ( mCanvas );
51
- snapper.snapToBackgroundLayers ( e->pos (), snapResults );
54
+ snapper.snapPoint ( e->pos (), snapResults );
52
55
if ( snapResults.size () > 0 )
53
56
{
54
57
QgsFeature fet;
@@ -358,3 +361,30 @@ QgsGeometry* QgsMapToolOffsetCurve::linestringFromPolygon( QgsGeometry* featureG
358
361
359
362
return 0 ;
360
363
}
364
+
365
+ void QgsMapToolOffsetCurve::configureSnapper ( QgsSnapper& s )
366
+ {
367
+ // use default vertex snap tolerance to all visible layers, but always to vertex and segment
368
+ QList<QgsSnapper::SnapLayer> snapLayers;
369
+ if ( mCanvas )
370
+ {
371
+ QList<QgsMapLayer*> layerList = mCanvas ->layers ();
372
+ QList<QgsMapLayer*>::const_iterator layerIt = layerList.constBegin ();
373
+ for ( ; layerIt != layerList.constEnd (); ++layerIt )
374
+ {
375
+ QgsVectorLayer* vl = qobject_cast<QgsVectorLayer*>( *layerIt );
376
+ if ( vl )
377
+ {
378
+ QgsSnapper::SnapLayer sl;
379
+ sl.mLayer = vl;
380
+ QSettings settings;
381
+ sl.mTolerance = settings.value ( " /qgis/digitizing/search_radius_vertex_edit" , 10 ).toDouble ();
382
+ sl.mUnitType = ( QgsTolerance::UnitType ) settings.value ( " /qgis/digitizing/default_snapping_tolerance_unit" , 0 ).toInt ();
383
+ sl.mSnapTo = QgsSnapper::SnapToVertexAndSegment;
384
+ snapLayers.push_back ( sl );
385
+ }
386
+ }
387
+ }
388
+ s.setSnapLayers ( snapLayers );
389
+ s.setSnapMode ( QgsSnapper::SnapWithOneResult );
390
+ }
0 commit comments