@@ -59,6 +59,7 @@ int QgsSnapper::snapPoint( const QPoint& startPoint, QList<QgsSnappingResult>& s
59
59
if ( !snapLayerIt->mLayer ->hasGeometryType () )
60
60
continue ;
61
61
62
+ currentResultList.clear ();
62
63
// transform point from map coordinates to layer coordinates
63
64
layerCoordPoint = mMapSettings .mapToLayerCoordinates ( snapLayerIt->mLayer , mapCoordPoint );
64
65
@@ -93,31 +94,44 @@ int QgsSnapper::snapPoint( const QPoint& startPoint, QList<QgsSnappingResult>& s
93
94
return 0 ;
94
95
}
95
96
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
+
96
113
if ( mSnapMode == QgsSnapper::SnapWithOneResult )
97
114
{
98
- // return only closest result
99
- snappingResult.push_back ( evalIt.value () );
115
+ // return only a single result, nothing more to do
100
116
}
101
117
else if ( mSnapMode == QgsSnapper::SnapWithResultsForSamePosition )
102
118
{
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
104
120
double tolerance = 0.000001 ;
105
- double minDistance = evalIt.key ();
106
121
107
122
for ( evalIt = snappingResultList.begin (); evalIt != snappingResultList.end (); ++evalIt )
108
123
{
109
- if ( evalIt.key () > ( minDistance + tolerance ) )
124
+ if ( returnResult. snappedVertex . sqrDist ( evalIt.value (). snappedVertex ) < tolerance*tolerance )
110
125
{
111
- break ;
126
+ snappingResult. push_back ( evalIt. value () ) ;
112
127
}
113
- snappingResult.push_back ( evalIt.value () );
114
128
}
115
129
116
130
}
117
131
118
132
else // take all results
119
133
{
120
- for ( ; evalIt != snappingResultList.end (); ++evalIt )
134
+ for ( evalIt = snappingResultList. begin () ; evalIt != snappingResultList.end (); ++evalIt )
121
135
{
122
136
snappingResult.push_back ( evalIt.value () );
123
137
}
0 commit comments