@@ -49,6 +49,7 @@ QgsMapToolNodeTool::~QgsMapToolNodeTool()
49
49
50
50
void QgsMapToolNodeTool::canvasMapPressEvent ( QgsMapMouseEvent* e )
51
51
{
52
+ removeRubberBands ();
52
53
QgsVectorLayer *vlayer = qobject_cast<QgsVectorLayer *>( mCanvas ->currentLayer () );
53
54
if ( !vlayer )
54
55
{
@@ -58,7 +59,7 @@ void QgsMapToolNodeTool::canvasMapPressEvent( QgsMapMouseEvent* e )
58
59
bool ctrlModifier = e->modifiers () & Qt::ControlModifier;
59
60
QList<QgsSnappingResult> snapResults;
60
61
61
- QgsFeatureId bkFeatureId;
62
+ QgsFeatureId bkFeatureId = 0 ;
62
63
if ( mSelectedFeature )
63
64
{
64
65
bkFeatureId = mSelectedFeature ->featureId ();
@@ -117,7 +118,64 @@ void QgsMapToolNodeTool::canvasMapPressEvent( QgsMapMouseEvent* e )
117
118
118
119
QgsPoint closestLayerVertex = mSelectedFeature ->geometry ()->closestVertex ( e->mapPoint (), atVertex, beforeVertex, afterVertex, dist );
119
120
mSelectedFeature ->selectVertex ( atVertex );
120
- // mClosestMapVertex = toMapCoordinates( vlayer, closestLayerVertex );
121
+ }
122
+ }
123
+ }
124
+
125
+ void QgsMapToolNodeTool::canvasMapMoveEvent ( QgsMapMouseEvent* e )
126
+ {
127
+ if ( !mSelectedFeature || !mSelectedFeature ->hasSelection () )
128
+ {
129
+ return ;
130
+ }
131
+
132
+ QgsVectorLayer* vlayer = mSelectedFeature ->vlayer ();
133
+ if ( !vlayer )
134
+ {
135
+ return ;
136
+ }
137
+
138
+ if ( mMoveRubberBands .empty () )
139
+ {
140
+ QgsGeometryRubberBand* rb = new QgsGeometryRubberBand ( mCanvas , mSelectedFeature ->geometry ()->type () );
141
+ rb->setOutlineColor ( Qt::blue );
142
+ rb->setBrushStyle ( Qt::NoBrush );
143
+ rb->setOutlineWidth ( 2 );
144
+ QgsAbstractGeometryV2* rbGeom = mSelectedFeature ->geometry ()->geometry ()->clone ();
145
+ if ( mCanvas ->mapSettings ().layerTransform ( vlayer ) )
146
+ rbGeom->transform ( *mCanvas ->mapSettings ().layerTransform ( vlayer ) );
147
+ rb->setGeometry ( rbGeom );
148
+ mMoveRubberBands .insert ( mSelectedFeature ->featureId (), rb );
149
+ foreach ( const QgsVertexEntry* vertexEntry, mSelectedFeature ->vertexMap () )
150
+ {
151
+ if ( vertexEntry->isSelected () )
152
+ mMoveVertices [mSelectedFeature ->featureId ()].append ( qMakePair ( vertexEntry->vertexId (), toMapCoordinates ( vlayer, vertexEntry->point () ) ) );
153
+ }
154
+ if ( QgsProject::instance ()->readNumEntry ( " Digitizing" , " /TopologicalEditing" , 0 ) )
155
+ {
156
+ createTopologyRubberBands ();
157
+ }
158
+ }
159
+ else
160
+ {
161
+ // move rubberband
162
+ QList<QgsSnappingResult> snapResults;
163
+ mSnapper .snapToBackgroundLayers ( e->pos (), snapResults, QList<QgsPoint>() << mClosestMapVertex );
164
+
165
+ QgsPoint curPos = snapPointFromResults ( snapResults, e->pos () );
166
+ double diffX = curPos.x () - mClosestMapVertex .x ();
167
+ double diffY = curPos.y () - mClosestMapVertex .y ();
168
+
169
+ foreach ( const QgsFeatureId& fid, mMoveRubberBands .keys () )
170
+ {
171
+ typedef QPair<QgsVertexId, QgsPointV2> MoveVertex;
172
+ foreach ( const MoveVertex& pair, mMoveVertices [fid] )
173
+ {
174
+ QgsPointV2 pos = pair.second ;
175
+ pos.setX ( pos.x () + diffX );
176
+ pos.setY ( pos.y () + diffY );
177
+ mMoveRubberBands .value ( fid )->moveVertex ( pair.first , pos );
178
+ }
121
179
}
122
180
}
123
181
}
@@ -149,6 +207,7 @@ void QgsMapToolNodeTool::deactivate()
149
207
150
208
void QgsMapToolNodeTool::cleanTool ( bool deleteSelectedFeature )
151
209
{
210
+ removeRubberBands ();
152
211
if ( mSelectedFeature )
153
212
{
154
213
QgsVectorLayer *vlayer = mSelectedFeature ->vlayer ();
@@ -318,3 +377,58 @@ void QgsMapToolNodeTool::changeLastVertex( const QgsPointV2& pt )
318
377
{
319
378
mClosestMapVertex = toMapCoordinates ( currentVectorLayer (), QgsPoint ( pt.x (), pt.y () ) );
320
379
}
380
+
381
+ void QgsMapToolNodeTool::removeRubberBands ()
382
+ {
383
+ qDeleteAll ( mMoveRubberBands );
384
+ mMoveRubberBands .clear ();
385
+ mMoveVertices .clear ();
386
+ }
387
+
388
+ void QgsMapToolNodeTool::createTopologyRubberBands ()
389
+ {
390
+ QgsVectorLayer* vlayer = mSelectedFeature ->vlayer ();
391
+
392
+ foreach ( const QgsVertexEntry* vertexEntry, mSelectedFeature ->vertexMap () )
393
+ {
394
+ if ( !vertexEntry->isSelected () )
395
+ {
396
+ continue ;
397
+ }
398
+
399
+ // Snap vertex
400
+ QMultiMap<double , QgsSnappingResult> snapResults;
401
+ vlayer->snapWithContext ( vertexEntry->pointV1 (), ZERO_TOLERANCE, snapResults, QgsSnapper::SnapToVertex );
402
+ foreach ( const QgsSnappingResult& snapResult, snapResults.values () )
403
+ {
404
+ // Get geometry of snapped feature
405
+ QgsFeatureId snapFeatureId = snapResult.snappedAtGeometry ;
406
+ QgsFeature feature;
407
+ if ( !vlayer->getFeatures ( QgsFeatureRequest ( snapFeatureId ).setSubsetOfAttributes ( QgsAttributeList () ) ).nextFeature ( feature ) )
408
+ {
409
+ continue ;
410
+ }
411
+ // Get VertexId of snapped vertex
412
+ QgsVertexId vid;
413
+ if ( !feature.geometry ()->vertexIdFromVertexNr ( snapResult.snappedVertexNr , vid ) )
414
+ {
415
+ continue ;
416
+ }
417
+ // Add rubberband if not already added
418
+ if ( !mMoveRubberBands .contains ( snapFeatureId ) )
419
+ {
420
+ QgsGeometryRubberBand* rb = new QgsGeometryRubberBand ( mCanvas , feature.geometry ()->type () );
421
+ rb->setOutlineColor ( Qt::blue );
422
+ rb->setBrushStyle ( Qt::NoBrush );
423
+ rb->setOutlineWidth ( 2 );
424
+ QgsAbstractGeometryV2* rbGeom = feature.geometry ()->geometry ()->clone ();
425
+ if ( mCanvas ->mapSettings ().layerTransform ( vlayer ) )
426
+ rbGeom->transform ( *mCanvas ->mapSettings ().layerTransform ( vlayer ) );
427
+ rb->setGeometry ( rbGeom );
428
+ mMoveRubberBands .insert ( snapFeatureId, rb );
429
+ }
430
+ // Add to list of vertices to be moved
431
+ mMoveVertices [snapFeatureId].append ( qMakePair ( vid, toMapCoordinates ( vlayer, feature.geometry ()->geometry ()->vertexAt ( vid ) ) ) );
432
+ }
433
+ }
434
+ }
0 commit comments