Skip to content

Commit 43bf222

Browse files
author
wonder
committed
- QgsSnapper: use one list of QgsSnapper::SnapLayer structs rather than three separate lists
- PyQGIS: finished QgsSnapper binding, added QgsMapCanvasSnapper git-svn-id: http://svn.osgeo.org/qgis/trunk@9657 c8812cc2-4d05-0410-92ff-de0c093fc19c
1 parent de7f366 commit 43bf222

File tree

6 files changed

+104
-69
lines changed

6 files changed

+104
-69
lines changed

python/core/qgssnapper.sip

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,16 @@ public:
5757
SnapWithResultsWithinTolerances
5858
};
5959

60+
struct SnapLayer
61+
{
62+
/**The layer to which snapping is applied*/
63+
QgsVectorLayer* mLayer;
64+
/**The snapping tolerances for the layers, always in source coordinate systems of the layer*/
65+
double mTolerance;
66+
/**What snapping type to use (snap to segment or to vertex)*/
67+
QgsSnapper::SnappingType mSnapTo;
68+
};
69+
6070
QgsSnapper(QgsMapRenderer* mapRender);
6171
~QgsSnapper();
6272
/**Does the snapping operation
@@ -66,9 +76,7 @@ public:
6676
int snapPoint(const QPoint& startPoint, QList<QgsSnappingResult>& snappingResult, const QList<QgsPoint>& excludeList);
6777

6878
//setters
69-
void setLayersToSnap(const QList<QgsVectorLayer*>& layerList);
70-
void setTolerances(const QList<double>& toleranceList);
71-
// TODO wrap void setSnapToList(const QList<QgsSnapper::SnappingType>& snapToList);
79+
void setSnapLayers( const QList<QgsSnapper::SnapLayer>& snapLayers );
7280
void setSnapMode(QgsSnapper::SnappingMode snapMode);
7381

7482
};

python/gui/gui.sip

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
%Include qgsmapcanvas.sip
1515
%Include qgsmapcanvasitem.sip
1616
%Include qgsmapcanvasmap.sip
17+
%Include qgsmapcanvassnapper.sip
1718
%Include qgsmaptool.sip
1819
%Include qgsmaptoolemitpoint.sip
1920
%Include qgsmaptoolpan.sip

python/gui/qgsmapcanvassnapper.sip

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
2+
/** \ingroup gui
3+
* This class reads the snapping properties from the current project and
4+
* configures a QgsSnapper to perform the snapping.
5+
* Snapping can be done to the active layer (usefull for selecting a vertex to
6+
* manipulate) or to background layers
7+
*/
8+
class QgsMapCanvasSnapper
9+
{
10+
%TypeHeaderCode
11+
#include <qgsmapcanvassnapper.h>
12+
%End
13+
public:
14+
/**Constructor
15+
@param canvas the map canvas to snap to*/
16+
QgsMapCanvasSnapper( QgsMapCanvas* canvas );
17+
18+
QgsMapCanvasSnapper();
19+
20+
~QgsMapCanvasSnapper();
21+
22+
/**Does a snap to the current layer. Uses snap mode
23+
QgsSnapper::SnapWithResultsForSamePosition if topological editing is enabled
24+
and QgsSnapper::SnapWithOneResult_BY_SEGMENT if not. As this method is usually used to
25+
find vertices/segments for editing operations, it uses the search radius for vertex
26+
editing from the qgis options.
27+
@param p start point of the snap (in pixel coordinates)
28+
@param results list to which the results are appended
29+
@param snap_to snap to vertex or to segment
30+
@param snappingTol snapping tolerance. -1 means that the search radius for vertex edits is taken
31+
@param excludePoints a list with (map coordinate) points that should be excluded in the snapping result. Useful e.g. for vertex moves where a vertex should not be snapped to its original position*/
32+
int snapToCurrentLayer( const QPoint& p, QList<QgsSnappingResult>& results, QgsSnapper::SnappingType snap_to, double snappingTol = -1, const QList<QgsPoint>& excludePoints = QList<QgsPoint>() );
33+
/**Snaps to the background layers. This method is usefull to align the features of the
34+
edited layers to those of other layers (as described in the project properties).
35+
Uses snap mode QgsSnapper::SnapWithOneResult. Therefore, only the
36+
closest result is returned.
37+
@param p start point of the snap (in pixel coordinates)
38+
@param result snapped point
39+
@param excludePoints a list with (map coordinate) points that should be excluded in the snapping result. Useful e.g. for vertex moves where a vertex should not be snapped to its original position
40+
@return 0 in case of success*/
41+
int snapToBackgroundLayers( const QPoint& p, QList<QgsSnappingResult>& results, const QList<QgsPoint>& excludePoints = QList<QgsPoint>() );
42+
43+
void setMapCanvas( QgsMapCanvas* canvas );
44+
45+
};

src/core/qgssnapper.cpp

Lines changed: 10 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -43,16 +43,6 @@ int QgsSnapper::snapPoint( const QPoint& startPoint, QList<QgsSnappingResult>& s
4343
{
4444
snappingResult.clear();
4545

46-
//list must have the same length
47-
if ( !( mLayersToSnap.size() == mSnappingTolerances.size() && mLayersToSnap.size() == mSnapToList.size() ) )
48-
{
49-
return 1;
50-
}
51-
52-
QList<QgsVectorLayer*>::iterator layerIt = mLayersToSnap.begin();
53-
QList<double>::const_iterator toleranceIt = mSnappingTolerances.constBegin();
54-
QList<QgsSnapper::SnappingType>::const_iterator snapToIt = mSnapToList.constBegin();
55-
5646
QMultiMap<double, QgsSnappingResult> snappingResultList;//all snapping results
5747
QMultiMap<double, QgsSnappingResult> currentResultList; //snapping results of examined layer
5848

@@ -61,12 +51,13 @@ int QgsSnapper::snapPoint( const QPoint& startPoint, QList<QgsSnappingResult>& s
6151
QgsPoint layerCoordPoint; //start point in layer coordinates
6252
QgsSnappingResult newResult;
6353

64-
65-
for ( ; layerIt != mLayersToSnap.end(); ++layerIt, ++toleranceIt, ++snapToIt )
54+
QList<QgsSnapper::SnapLayer>::iterator snapLayerIt;
55+
for (snapLayerIt = mSnapLayers.begin(); snapLayerIt != mSnapLayers.end(); ++snapLayerIt )
6656
{
6757
//transform point from map coordinates to layer coordinates
68-
layerCoordPoint = mMapRenderer->mapToLayerCoordinates( *layerIt, mapCoordPoint );
69-
if (( *layerIt )->snapWithContext( layerCoordPoint, *toleranceIt, currentResultList, *snapToIt ) != 0 )
58+
layerCoordPoint = mMapRenderer->mapToLayerCoordinates( snapLayerIt->mLayer, mapCoordPoint );
59+
if ( snapLayerIt->mLayer->snapWithContext( layerCoordPoint, snapLayerIt->mTolerance,
60+
currentResultList, snapLayerIt->mSnapTo ) != 0 )
7061
{
7162
//error
7263
}
@@ -78,9 +69,9 @@ int QgsSnapper::snapPoint( const QPoint& startPoint, QList<QgsSnappingResult>& s
7869
//for each snapping result: transform start point, snap point and other points into map coordinates to find out distance
7970
//store results in snapping result list
8071
newResult = currentResultIt.value();
81-
newResult.snappedVertex = mMapRenderer->layerToMapCoordinates( *layerIt, currentResultIt.value().snappedVertex );
82-
newResult.beforeVertex = mMapRenderer->layerToMapCoordinates( *layerIt, currentResultIt.value().beforeVertex );
83-
newResult.afterVertex = mMapRenderer->layerToMapCoordinates( *layerIt, currentResultIt.value().afterVertex );
72+
newResult.snappedVertex = mMapRenderer->layerToMapCoordinates( snapLayerIt->mLayer, currentResultIt.value().snappedVertex );
73+
newResult.beforeVertex = mMapRenderer->layerToMapCoordinates( snapLayerIt->mLayer, currentResultIt.value().beforeVertex );
74+
newResult.afterVertex = mMapRenderer->layerToMapCoordinates( snapLayerIt->mLayer, currentResultIt.value().afterVertex );
8475
snappingResultList.insert( sqrt( newResult.snappedVertex.sqrDist( mapCoordPoint ) ), newResult );
8576
}
8677
}
@@ -128,20 +119,11 @@ int QgsSnapper::snapPoint( const QPoint& startPoint, QList<QgsSnappingResult>& s
128119
return 0;
129120
}
130121

131-
void QgsSnapper::setLayersToSnap( const QList<QgsVectorLayer*>& layerList )
122+
void QgsSnapper::setSnapLayers( const QList<QgsSnapper::SnapLayer>& snapLayers )
132123
{
133-
mLayersToSnap = layerList;
124+
mSnapLayers = snapLayers;
134125
}
135126

136-
void QgsSnapper::setTolerances( const QList<double>& toleranceList )
137-
{
138-
mSnappingTolerances = toleranceList;
139-
}
140-
141-
void QgsSnapper::setSnapToList( const QList<QgsSnapper::SnappingType>& snapToList )
142-
{
143-
mSnapToList = snapToList;
144-
}
145127

146128
void QgsSnapper::setSnapMode( QgsSnapper::SnappingMode snapMode )
147129
{

src/core/qgssnapper.h

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,16 @@ class CORE_EXPORT QgsSnapper
7878
SnapWithResultsWithinTolerances
7979
};
8080

81+
struct SnapLayer
82+
{
83+
/**The layer to which snapping is applied*/
84+
QgsVectorLayer* mLayer;
85+
/**The snapping tolerances for the layers, always in source coordinate systems of the layer*/
86+
double mTolerance;
87+
/**What snapping type to use (snap to segment or to vertex)*/
88+
QgsSnapper::SnappingType mSnapTo;
89+
};
90+
8191
QgsSnapper( QgsMapRenderer* mapRender );
8292
~QgsSnapper();
8393
/**Does the snapping operation
@@ -88,9 +98,7 @@ class CORE_EXPORT QgsSnapper
8898
int snapPoint( const QPoint& startPoint, QList<QgsSnappingResult>& snappingResult, const QList<QgsPoint>& excludePoints = QList<QgsPoint>() );
8999

90100
//setters
91-
void setLayersToSnap( const QList<QgsVectorLayer*>& layerList );
92-
void setTolerances( const QList<double>& toleranceList );
93-
void setSnapToList( const QList<QgsSnapper::SnappingType>& snapToList );
101+
void setSnapLayers( const QList<QgsSnapper::SnapLayer>& snapLayers );
94102
void setSnapMode( QgsSnapper::SnappingMode snapMode );
95103

96104
private:
@@ -105,13 +113,8 @@ class CORE_EXPORT QgsSnapper
105113
QgsMapRenderer* mMapRenderer;
106114
/**Snap mode to apply*/
107115
QgsSnapper::SnappingMode mSnapMode;
108-
/**The layers to which snapping is applied*/
109-
QList<QgsVectorLayer*> mLayersToSnap;
110-
/**The snapping tolerances for the layers. The order must correspond to the layer list.
111-
Note that the tolerances are always in source coordinate systems of the layers*/
112-
QList<double> mSnappingTolerances;
113-
/**List if snap to segment of to vertex. The order must correspond to the layer list*/
114-
QList<QgsSnapper::SnappingType> mSnapToList;
116+
/**List of layers to which snapping is applied*/
117+
QList<QgsSnapper::SnapLayer> mSnapLayers;
115118
};
116119

117120
#endif

src/gui/qgsmapcanvassnapper.cpp

Lines changed: 24 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -89,29 +89,25 @@ int QgsMapCanvasSnapper::snapToCurrentLayer( const QPoint& p, QList<QgsSnappingR
8989
return 3;
9090
}
9191

92-
QList<QgsVectorLayer*> layerList;
93-
QList<double> toleranceList;
94-
QList<QgsSnapper::SnappingType> snapToList;
95-
96-
layerList.push_back( vlayer );
97-
snapToList.push_back( snap_to );
92+
QgsSnapper::SnapLayer snapLayer;
93+
snapLayer.mLayer = vlayer;
94+
snapLayer.mSnapTo = snap_to;
9895

9996
QSettings settings;
10097

10198
if ( snappingTol < 0 )
10299
{
103100
//use search tolerance for vertex editing
104-
toleranceList.push_back( settings.value( "/qgis/digitizing/search_radius_vertex_edit", 50 ).toDouble() );
101+
snapLayer.mTolerance = settings.value( "/qgis/digitizing/search_radius_vertex_edit", 50 ).toDouble();
105102
}
106103
else
107104
{
108-
toleranceList.push_back( snappingTol );
105+
snapLayer.mTolerance = snappingTol;
109106
}
110107

111-
112-
mSnapper->setLayersToSnap( layerList );
113-
mSnapper->setTolerances( toleranceList );
114-
mSnapper->setSnapToList( snapToList );
108+
QList<QgsSnapper::SnapLayer> snapLayers;
109+
snapLayers.append( snapLayer );
110+
mSnapper->setSnapLayers( snapLayers );
115111

116112
if ( mSnapper->snapPoint( p, results, excludePoints ) != 0 )
117113
{
@@ -160,9 +156,8 @@ int QgsMapCanvasSnapper::snapToBackgroundLayers( const QPoint& p, QList<QgsSnapp
160156
return 1; //lists must have the same size, otherwise something is wrong
161157
}
162158

163-
QList<QgsVectorLayer*> vectorLayerList;
164-
QList<double> toleranceDoubleList;
165-
QList<QgsSnapper::SnappingType> snapTo;
159+
QList<QgsSnapper::SnapLayer> snapLayers;
160+
QgsSnapper::SnapLayer snapLayer;
166161

167162
//Use snapping information from the project
168163
if ( snappingDefinedInProject )
@@ -190,27 +185,28 @@ int QgsMapCanvasSnapper::snapToBackgroundLayers( const QPoint& p, QList<QgsSnapp
190185
vlayer = dynamic_cast<QgsVectorLayer*>( layer );
191186
if ( vlayer )
192187
{
193-
vectorLayerList.push_back( vlayer );
188+
snapLayer.mLayer = vlayer;
194189
}
195190
}
196191

197192
//tolerance
198-
toleranceDoubleList.push_back( tolIt->toDouble() );
193+
snapLayer.mTolerance = tolIt->toDouble();
199194

200195
//segment or vertex
201196
if (( *snapIt ) == "to_vertex" )
202197
{
203-
snapTo.push_back( QgsSnapper::SnapToVertex );
198+
snapLayer.mSnapTo = QgsSnapper::SnapToVertex;
204199
}
205200
else if (( *snapIt ) == "to_segment" )
206201
{
207-
snapTo.push_back( QgsSnapper::SnapToSegment );
202+
snapLayer.mSnapTo = QgsSnapper::SnapToSegment;
208203
}
209204
else //to vertex and segment
210205
{
211-
snapTo.push_back( QgsSnapper::SnapToVertexAndSegment );
206+
snapLayer.mSnapTo = QgsSnapper::SnapToVertexAndSegment;
212207
}
213208

209+
snapLayers.append(snapLayer);
214210
}
215211
}
216212
else //nothing in project. Use default snapping tolerance to vertex of current layer
@@ -227,31 +223,31 @@ int QgsMapCanvasSnapper::snapToBackgroundLayers( const QPoint& p, QList<QgsSnapp
227223
return 3;
228224
}
229225

230-
vectorLayerList.push_back( currentVectorLayer );
226+
snapLayer.mLayer = currentVectorLayer;
231227
QSettings settings;
232228

233229
//default snap mode
234230
QString defaultSnapString = settings.value( "/qgis/digitizing/default_snap_mode", "to vertex" ).toString();
235231
if ( defaultSnapString == "to segment" )
236232
{
237-
snapTo.push_back( QgsSnapper::SnapToSegment );
233+
snapLayer.mSnapTo = QgsSnapper::SnapToSegment;
238234
}
239235
else if ( defaultSnapString == "to vertex and segment" )
240236
{
241-
snapTo.push_back( QgsSnapper::SnapToVertexAndSegment );
237+
snapLayer.mSnapTo = QgsSnapper::SnapToVertexAndSegment;
242238
}
243239
else
244240
{
245-
snapTo.push_back( QgsSnapper::SnapToVertex );
241+
snapLayer.mSnapTo = QgsSnapper::SnapToVertex;
246242
}
247243

248244
//default snapping tolerance
249-
toleranceDoubleList.push_back( settings.value( "/qgis/digitizing/default_snapping_tolerance", 0 ).toDouble() );
245+
snapLayer.mTolerance = settings.value( "/qgis/digitizing/default_snapping_tolerance", 0 ).toDouble();
246+
247+
snapLayers.append(snapLayer);
250248
}
251249

252-
mSnapper->setLayersToSnap( vectorLayerList );
253-
mSnapper->setTolerances( toleranceDoubleList );
254-
mSnapper->setSnapToList( snapTo );
250+
mSnapper->setSnapLayers( snapLayers );
255251

256252
if ( mSnapper->snapPoint( p, results, excludePoints ) != 0 )
257253
{

0 commit comments

Comments
 (0)