Skip to content

Commit c592d9e

Browse files
committed
Add rubberband again
1 parent afd7e77 commit c592d9e

File tree

2 files changed

+130
-2
lines changed

2 files changed

+130
-2
lines changed

src/app/nodetool/qgsmaptoolnodetool.cpp

Lines changed: 116 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ QgsMapToolNodeTool::~QgsMapToolNodeTool()
4949

5050
void QgsMapToolNodeTool::canvasMapPressEvent( QgsMapMouseEvent* e )
5151
{
52+
removeRubberBands();
5253
QgsVectorLayer *vlayer = qobject_cast<QgsVectorLayer *>( mCanvas->currentLayer() );
5354
if ( !vlayer )
5455
{
@@ -58,7 +59,7 @@ void QgsMapToolNodeTool::canvasMapPressEvent( QgsMapMouseEvent* e )
5859
bool ctrlModifier = e->modifiers() & Qt::ControlModifier;
5960
QList<QgsSnappingResult> snapResults;
6061

61-
QgsFeatureId bkFeatureId;
62+
QgsFeatureId bkFeatureId = 0;
6263
if ( mSelectedFeature )
6364
{
6465
bkFeatureId = mSelectedFeature->featureId();
@@ -117,7 +118,64 @@ void QgsMapToolNodeTool::canvasMapPressEvent( QgsMapMouseEvent* e )
117118

118119
QgsPoint closestLayerVertex = mSelectedFeature->geometry()->closestVertex( e->mapPoint(), atVertex, beforeVertex, afterVertex, dist );
119120
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+
}
121179
}
122180
}
123181
}
@@ -149,6 +207,7 @@ void QgsMapToolNodeTool::deactivate()
149207

150208
void QgsMapToolNodeTool::cleanTool( bool deleteSelectedFeature )
151209
{
210+
removeRubberBands();
152211
if ( mSelectedFeature )
153212
{
154213
QgsVectorLayer *vlayer = mSelectedFeature->vlayer();
@@ -318,3 +377,58 @@ void QgsMapToolNodeTool::changeLastVertex( const QgsPointV2& pt )
318377
{
319378
mClosestMapVertex = toMapCoordinates( currentVectorLayer(), QgsPoint( pt.x(), pt.y() ) );
320379
}
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+
}

src/app/nodetool/qgsmaptoolnodetool.h

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,9 @@ class QgsMapToolNodeTool: public QgsMapToolEdit
3939
//! mouse press event in map coordinates (eventually filtered) to be redefined in subclass
4040
void canvasMapPressEvent( QgsMapMouseEvent* e ) override;
4141

42+
//! mouse move event in map coordinates (eventually filtered) to be redefined in subclass
43+
void canvasMapMoveEvent( QgsMapMouseEvent* e ) override;
44+
4245
void keyPressEvent( QKeyEvent* e );
4346

4447
//! called when map tool is being deactivated
@@ -65,6 +68,11 @@ class QgsMapToolNodeTool: public QgsMapToolEdit
6568
*/
6669
void removeRubberBands();
6770

71+
/**
72+
* Creates rubber bands for ther features when topology editing is enabled
73+
*/
74+
void createTopologyRubberBands();
75+
6876
/**
6977
* Disconnects signals and clears objects
7078
*/
@@ -126,6 +134,12 @@ class QgsMapToolNodeTool: public QgsMapToolEdit
126134

127135
/** Flag to tell if edition points */
128136
bool mIsPoint;
137+
138+
/** Rubber bands during node move */
139+
QMap<QgsFeatureId, QgsGeometryRubberBand*> mMoveRubberBands;
140+
141+
/** Vertices of features to move */
142+
QMap<QgsFeatureId, QList< QPair<QgsVertexId, QgsPointV2> > > mMoveVertices;
129143
};
130144

131145
#endif

0 commit comments

Comments
 (0)