@@ -59,6 +59,7 @@ int QgsSnapper::snapPoint( const QPoint& startPoint, QList<QgsSnappingResult>& s
5959 if ( !snapLayerIt->mLayer ->hasGeometryType () )
6060 continue ;
6161
62+ currentResultList.clear ();
6263 // transform point from map coordinates to layer coordinates
6364 layerCoordPoint = mMapSettings .mapToLayerCoordinates ( snapLayerIt->mLayer , mapCoordPoint );
6465
@@ -93,31 +94,44 @@ int QgsSnapper::snapPoint( const QPoint& startPoint, QList<QgsSnappingResult>& s
9394 return 0 ;
9495 }
9596
97+
98+ // Gives a priority to vertex snapping over segment snapping
99+ QgsSnappingResult returnResult = evalIt.value ();
100+ for ( evalIt = snappingResultList.begin (); evalIt != snappingResultList.end (); ++evalIt )
101+ {
102+ if ( evalIt.value ().snappedVertexNr != -1 )
103+ {
104+ returnResult = evalIt.value ();
105+ snappingResultList.erase ( evalIt );
106+ break ;
107+ }
108+ }
109+
110+ // We return the preferred result
111+ snappingResult.push_back ( returnResult );
112+
96113 if ( mSnapMode == QgsSnapper::SnapWithOneResult )
97114 {
98- // return only closest result
99- snappingResult.push_back ( evalIt.value () );
115+ // return only a single result, nothing more to do
100116 }
101117 else if ( mSnapMode == QgsSnapper::SnapWithResultsForSamePosition )
102118 {
103- // take all snapping Results within a certain tolerance because rounding differences may occur
119+ // take all snapping results within a certain tolerance because rounding differences may occur
104120 double tolerance = 0.000001 ;
105- double minDistance = evalIt.key ();
106121
107122 for ( evalIt = snappingResultList.begin (); evalIt != snappingResultList.end (); ++evalIt )
108123 {
109- if ( evalIt.key () > ( minDistance + tolerance ) )
124+ if ( returnResult. snappedVertex . sqrDist ( evalIt.value (). snappedVertex ) < tolerance*tolerance )
110125 {
111- break ;
126+ snappingResult. push_back ( evalIt. value () ) ;
112127 }
113- snappingResult.push_back ( evalIt.value () );
114128 }
115129
116130 }
117131
118132 else // take all results
119133 {
120- for ( ; evalIt != snappingResultList.end (); ++evalIt )
134+ for ( evalIt = snappingResultList. begin () ; evalIt != snappingResultList.end (); ++evalIt )
121135 {
122136 snappingResult.push_back ( evalIt.value () );
123137 }
0 commit comments