@@ -64,32 +64,43 @@ void QgsMapToolOffsetCurve::canvasPressEvent( QMouseEvent* e )
64
64
return ;
65
65
}
66
66
67
+ QgsSnappingUtils* snapping = mCanvas ->snappingUtils ();
67
68
68
- QgsSnapper snapper ( mCanvas ->mapSettings () );
69
- configureSnapper ( snapper );
70
- QList<QgsSnappingResult> snapResults;
71
- snapper.snapPoint ( e->pos (), snapResults );
72
- if ( snapResults.size () > 0 )
69
+ // store previous settings
70
+ int oldType;
71
+ double oldSearchRadius;
72
+ QgsTolerance::UnitType oldSearchRadiusUnit;
73
+ QgsSnappingUtils::SnapToMapMode oldMode = snapping->snapToMapMode ();
74
+ snapping->defaultSettings ( oldType, oldSearchRadius, oldSearchRadiusUnit );
75
+
76
+ // setup new settings (temporary)
77
+ QSettings settings;
78
+ snapping->setSnapToMapMode ( QgsSnappingUtils::SnapAllLayers );
79
+ snapping->setDefaultSettings ( QgsPointLocator::Edge,
80
+ settings.value ( " /qgis/digitizing/search_radius_vertex_edit" , 10 ).toDouble (),
81
+ ( QgsTolerance::UnitType ) settings.value ( " /qgis/digitizing/search_radius_vertex_edit_unit" , QgsTolerance::Pixels ).toInt () );
82
+
83
+ QgsPointLocator::Match match = snapping->snapToMap ( e->pos () );
84
+
85
+ // restore old settings
86
+ snapping->setSnapToMapMode ( oldMode );
87
+ snapping->setDefaultSettings ( oldType, oldSearchRadius, oldSearchRadiusUnit );
88
+
89
+ if ( match.hasEdge () && match.layer () )
73
90
{
91
+ mSourceLayerId = match.layer ()->id ();
74
92
QgsFeature fet;
75
- const QgsSnappingResult& snapResult = snapResults.at ( 0 );
76
- if ( snapResult.layer )
93
+ if ( match.layer ()->getFeatures ( QgsFeatureRequest ( match.featureId () ) ).nextFeature ( fet ) )
77
94
{
78
- mSourceLayerId = snapResult. layer -> id ();
79
-
80
- QgsVectorLayer* vl = dynamic_cast <QgsVectorLayer*>( QgsMapLayerRegistry::instance ()-> mapLayer ( mSourceLayerId ) );
81
- if ( vl && vl-> getFeatures ( QgsFeatureRequest (). setFilterFid ( snapResult. snappedAtGeometry ) ). nextFeature ( fet ) )
95
+ mForceCopy = ( e-> modifiers () & Qt::ControlModifier ); // no geometry modification if ctrl is pressed
96
+ mOriginalGeometry = createOriginGeometry ( match. layer (), match, fet );
97
+ mRubberBand = createRubberBand ( );
98
+ if ( mRubberBand )
82
99
{
83
- mForceCopy = ( e->modifiers () & Qt::ControlModifier ); // no geometry modification if ctrl is pressed
84
- mOriginalGeometry = createOriginGeometry ( vl, snapResult, fet );
85
- mRubberBand = createRubberBand ();
86
- if ( mRubberBand )
87
- {
88
- mRubberBand ->setToGeometry ( mOriginalGeometry , layer );
89
- }
90
- mModifiedFeature = fet.id ();
91
- createDistanceItem ();
100
+ mRubberBand ->setToGeometry ( mOriginalGeometry , layer );
92
101
}
102
+ mModifiedFeature = fet.id ();
103
+ createDistanceItem ();
93
104
}
94
105
}
95
106
}
@@ -232,7 +243,7 @@ void QgsMapToolOffsetCurve::canvasMoveEvent( QMouseEvent * e )
232
243
}
233
244
}
234
245
235
- QgsGeometry* QgsMapToolOffsetCurve::createOriginGeometry ( QgsVectorLayer* vl, const QgsSnappingResult& sr , QgsFeature& snappedFeature )
246
+ QgsGeometry* QgsMapToolOffsetCurve::createOriginGeometry ( QgsVectorLayer* vl, const QgsPointLocator::Match& match , QgsFeature& snappedFeature )
236
247
{
237
248
if ( !vl )
238
249
{
@@ -241,7 +252,7 @@ QgsGeometry* QgsMapToolOffsetCurve::createOriginGeometry( QgsVectorLayer* vl, co
241
252
242
253
mMultiPartGeometry = false ;
243
254
// assign feature part by vertex number (snap to vertex) or by before vertex number (snap to segment)
244
- int partVertexNr = ( sr. snappedVertexNr == - 1 ? sr. beforeVertexNr : sr. snappedVertexNr );
255
+ int partVertexNr = match. vertexIndex ( );
245
256
246
257
if ( vl == currentVectorLayer () && !mForceCopy )
247
258
{
@@ -259,7 +270,7 @@ QgsGeometry* QgsMapToolOffsetCurve::createOriginGeometry( QgsVectorLayer* vl, co
259
270
260
271
// for background layers, try to merge selected entries together if snapped feature is contained in selection
261
272
const QgsFeatureIds& selection = vl->selectedFeaturesIds ();
262
- if ( selection.size () < 1 || !selection.contains ( sr. snappedAtGeometry ) )
273
+ if ( selection.size () < 1 || !selection.contains ( match. featureId () ) )
263
274
{
264
275
return convertToSingleLine ( snappedFeature.geometryAndOwnership (), partVertexNr, mMultiPartGeometry );
265
276
}
@@ -279,7 +290,7 @@ QgsGeometry* QgsMapToolOffsetCurve::createOriginGeometry( QgsVectorLayer* vl, co
279
290
if ( geom->isMultipart () )
280
291
{
281
292
delete geom;
282
- return convertToSingleLine ( snappedFeature.geometryAndOwnership (), sr. snappedVertexNr , mMultiPartGeometry );
293
+ return convertToSingleLine ( snappedFeature.geometryAndOwnership (), match. vertexIndex () , mMultiPartGeometry );
283
294
}
284
295
285
296
return geom;
@@ -431,32 +442,6 @@ QgsGeometry* QgsMapToolOffsetCurve::linestringFromPolygon( QgsGeometry* featureG
431
442
return 0 ;
432
443
}
433
444
434
- void QgsMapToolOffsetCurve::configureSnapper ( QgsSnapper& s )
435
- {
436
- // use default vertex snap tolerance to all visible layers, but always to segment
437
- QList<QgsSnapper::SnapLayer> snapLayers;
438
- if ( mCanvas )
439
- {
440
- QList<QgsMapLayer*> layerList = mCanvas ->layers ();
441
- QList<QgsMapLayer*>::const_iterator layerIt = layerList.constBegin ();
442
- for ( ; layerIt != layerList.constEnd (); ++layerIt )
443
- {
444
- QgsVectorLayer* vl = qobject_cast<QgsVectorLayer*>( *layerIt );
445
- if ( vl )
446
- {
447
- QgsSnapper::SnapLayer sl;
448
- sl.mLayer = vl;
449
- QSettings settings;
450
- sl.mTolerance = settings.value ( " /qgis/digitizing/search_radius_vertex_edit" , 10 ).toDouble ();
451
- sl.mUnitType = ( QgsTolerance::UnitType ) settings.value ( " /qgis/digitizing/search_radius_vertex_edit_unit" , QgsTolerance::Pixels ).toInt ();
452
- sl.mSnapTo = QgsSnapper::SnapToSegment;
453
- snapLayers.push_back ( sl );
454
- }
455
- }
456
- }
457
- s.setSnapLayers ( snapLayers );
458
- s.setSnapMode ( QgsSnapper::SnapWithOneResult );
459
- }
460
445
461
446
QgsGeometry* QgsMapToolOffsetCurve::convertToSingleLine ( QgsGeometry* geom, int vertex, bool & isMulti )
462
447
{
0 commit comments