From f8fc8a0a3174956c27d7ce8c0a3c51d4eb6cf050 Mon Sep 17 00:00:00 2001 From: Martin Dobias Date: Sun, 4 Jan 2015 14:47:08 +0700 Subject: [PATCH] Final removals of QgsMapCanvasSnapper --- python/core/qgspointlocator.sip | 6 +- src/app/nodetool/qgsmaptoolnodetool.cpp | 112 +++++++++++------------ src/app/nodetool/qgsmaptoolnodetool.h | 2 + src/app/qgsmapmouseevent.h | 2 +- src/app/qgsmaptooladvanceddigitizing.cpp | 3 - src/app/qgsmaptooladvanceddigitizing.h | 3 - src/app/qgsmaptooledit.h | 2 + src/app/qgsmaptoolvertexedit.h | 5 - src/app/qgsmeasuretool.h | 1 - src/core/qgspointlocator.h | 6 +- 10 files changed, 65 insertions(+), 77 deletions(-) diff --git a/python/core/qgspointlocator.sip b/python/core/qgspointlocator.sip index a5a39527127..e036ca9ccc0 100644 --- a/python/core/qgspointlocator.sip +++ b/python/core/qgspointlocator.sip @@ -43,12 +43,12 @@ class QgsPointLocator : QObject QgsPoint point() const; //! for vertex / edge match (first vertex of the edge) - int vertexIndex(); + int vertexIndex() const; //! reference vector layer - QgsVectorLayer* layer(); + QgsVectorLayer* layer() const; - QgsFeatureId featureId(); + QgsFeatureId featureId() const; void replaceIfBetter( const QgsPointLocator::Match& m, double maxDistance ); diff --git a/src/app/nodetool/qgsmaptoolnodetool.cpp b/src/app/nodetool/qgsmaptoolnodetool.cpp index 9992650a468..d9a7c80c6dc 100644 --- a/src/app/nodetool/qgsmaptoolnodetool.cpp +++ b/src/app/nodetool/qgsmaptoolnodetool.cpp @@ -38,6 +38,13 @@ struct QgsExcludePointFilter : public QgsPointLocator::MatchFilter QgsPoint mExclPoint; }; +//! Match filter that accepts only matches from a particular feature ID +struct QgsFeatureIdFilter : public QgsPointLocator::MatchFilter +{ + QgsFeatureIdFilter( const QgsFeatureId& fid ) : mFid( fid ) {} + bool acceptMatch( const QgsPointLocator::Match& match ) { return match.featureId() == mFid; } + QgsFeatureId mFid; +}; QgsMapToolNodeTool::QgsMapToolNodeTool( QgsMapCanvas* canvas ) : QgsMapToolVertexEdit( canvas ) @@ -357,7 +364,6 @@ void QgsMapToolNodeTool::canvasPressEvent( QMouseEvent * e ) mClicked = true; mPressCoordinates = e->pos(); - QList snapResults; if ( !mSelectedFeature ) { QgsVectorLayer *vlayer = qobject_cast( mCanvas->currentLayer() ); @@ -365,9 +371,8 @@ void QgsMapToolNodeTool::canvasPressEvent( QMouseEvent * e ) return; mSelectAnother = false; - mSnapper.snapToCurrentLayer( e->pos(), snapResults, QgsSnapper::SnapToVertexAndSegment, -1 ); - - if ( snapResults.size() < 1 ) + QgsPointLocator::Match m = mCanvas->snappingUtils()->snapToCurrentLayer( e->pos(), QgsPointLocator::Vertex | QgsPointLocator::Edge ); + if ( !m.isValid() ) { emit messageEmitted( tr( "could not snap to a segment on the current layer." ) ); return; @@ -376,7 +381,7 @@ void QgsMapToolNodeTool::canvasPressEvent( QMouseEvent * e ) // remove previous warning emit messageDiscarded(); - mSelectedFeature = new QgsSelectedFeature( snapResults[0].snappedAtGeometry, vlayer, mCanvas ); + mSelectedFeature = new QgsSelectedFeature( m.featureId(), vlayer, mCanvas ); connect( QgisApp::instance()->layerTreeView(), SIGNAL( currentLayerChanged( QgsMapLayer* ) ), this, SLOT( currentLayerChanged( QgsMapLayer* ) ) ); connect( mSelectedFeature, SIGNAL( destroyed() ), this, SLOT( selectedFeatureDestroyed() ) ); connect( vlayer, SIGNAL( editingStopped() ), this, SLOT( editingToggled() ) ); @@ -401,7 +406,7 @@ void QgsMapToolNodeTool::canvasPressEvent( QMouseEvent * e ) QgsPoint closestLayerVertex = mSelectedFeature->geometry()->closestVertex( layerCoordPoint, atVertex, beforeVertex, afterVertex, dist ); dist = sqrt( dist ); - mSnapper.snapToCurrentLayer( e->pos(), snapResults, QgsSnapper::SnapToVertex, tol ); + QgsPointLocator::Match m = mCanvas->snappingUtils()->snapToCurrentLayer( e->pos(), QgsPointLocator::Vertex ); if ( dist <= tol ) { // some vertex selected @@ -426,7 +431,7 @@ void QgsMapToolNodeTool::canvasPressEvent( QMouseEvent * e ) else { // select another feature - mAnother = snapResults.first().snappedAtGeometry; + mAnother = m.featureId(); mSelectAnother = true; } } @@ -434,57 +439,53 @@ void QgsMapToolNodeTool::canvasPressEvent( QMouseEvent * e ) { // no near vertex to snap // unless point layer, try segment - if ( !mIsPoint ) - mSnapper.snapToCurrentLayer( e->pos(), snapResults, QgsSnapper::SnapToSegment, tol ); + QgsPointLocator::Match m2; + QgsFeatureIdFilter filterFid( mSelectedFeature->featureId() ); + if ( mIsPoint ) + m2 = mCanvas->snappingUtils()->snapToCurrentLayer( e->pos(), QgsPointLocator::Vertex, &filterFid ); + else + m2 = mCanvas->snappingUtils()->snapToCurrentLayer( e->pos(), QgsPointLocator::Edge, &filterFid ); - if ( snapResults.size() > 0 ) + if ( m2.isValid() ) { - // need to check all if there is a point in the feature - mAnother = snapResults.first().snappedAtGeometry; + mAnother = 0; + mSelectAnother = false; + } + else + { + mAnother = m.featureId(); mSelectAnother = true; - QList::iterator it = snapResults.begin(); - QgsSnappingResult snapResult; - for ( ; it != snapResults.end(); ++it ) - { - if ( it->snappedAtGeometry == mSelectedFeature->featureId() ) - { - snapResult = *it; - mAnother = 0; - mSelectAnother = false; - break; - } - } + } - if ( !mSelectAnother ) - { - mMoving = true; - mClosestMapVertex = toMapCoordinates( vlayer, closestLayerVertex ); + if ( !mSelectAnother ) + { + mMoving = true; + mClosestMapVertex = toMapCoordinates( vlayer, closestLayerVertex ); - if ( mIsPoint ) + if ( mIsPoint ) + { + if ( !mCtrl ) { - if ( !mCtrl ) - { - mSelectedFeature->deselectAllVertexes(); - mSelectedFeature->selectVertex( snapResult.snappedVertexNr ); - } - else - { - mSelectedFeature->invertVertexSelection( snapResult.snappedVertexNr ); - } + mSelectedFeature->deselectAllVertexes(); + mSelectedFeature->selectVertex( m2.vertexIndex() ); } else { - if ( !mCtrl ) - { - mSelectedFeature->deselectAllVertexes(); - mSelectedFeature->selectVertex( snapResult.afterVertexNr ); - mSelectedFeature->selectVertex( snapResult.beforeVertexNr ); - } - else - { - mSelectedFeature->invertVertexSelection( snapResult.afterVertexNr ); - mSelectedFeature->invertVertexSelection( snapResult.beforeVertexNr ); - } + mSelectedFeature->invertVertexSelection( m2.vertexIndex() ); + } + } + else + { + if ( !mCtrl ) + { + mSelectedFeature->deselectAllVertexes(); + mSelectedFeature->selectVertex( m2.vertexIndex() + 1 ); + mSelectedFeature->selectVertex( m2.vertexIndex() ); + } + else + { + mSelectedFeature->invertVertexSelection( m2.vertexIndex() + 1 ); + mSelectedFeature->invertVertexSelection( m2.vertexIndex() ); } } } @@ -621,7 +622,6 @@ void QgsMapToolNodeTool::canvasReleaseEvent( QMouseEvent * e ) mDeselectOnRelease = -1; } - mRecentSnappingResults.clear(); mExcludePoint.clear(); } @@ -690,17 +690,13 @@ void QgsMapToolNodeTool::canvasDoubleClickEvent( QMouseEvent * e ) int topologicalEditing = QgsProject::instance()->readNumEntry( "Digitizing", "/TopologicalEditing", 0 ); QMultiMap currentResultList; - QList snapResults; mMoving = false; - double tol = QgsTolerance::vertexSearchRadius( vlayer, mCanvas->mapSettings() ); - mSnapper.snapToCurrentLayer( e->pos(), snapResults, QgsSnapper::SnapToSegment, tol ); - if ( snapResults.size() < 1 || - snapResults.first().snappedAtGeometry != mSelectedFeature->featureId() || - snapResults.first().snappedVertexNr != -1 ) + QgsPointLocator::Match m = mCanvas->snappingUtils()->snapToCurrentLayer( e->pos(), QgsPointLocator::Edge ); + if ( !m.isValid() || m.featureId() != mSelectedFeature->featureId() ) return; // some segment selected - QgsPoint layerCoords = toLayerCoordinates( vlayer, snapResults.first().snappedVertex ); + QgsPoint layerCoords = toLayerCoordinates( vlayer, m.point() ); if ( topologicalEditing ) { // snap from adding position to this vertex when topological editing is enabled @@ -711,7 +707,7 @@ void QgsMapToolNodeTool::canvasDoubleClickEvent( QMouseEvent * e ) vlayer->beginEditCommand( tr( "Inserted vertex" ) ); // add vertex - vlayer->insertVertex( layerCoords.x(), layerCoords.y(), mSelectedFeature->featureId(), snapResults.first().afterVertexNr ); + vlayer->insertVertex( layerCoords.x(), layerCoords.y(), mSelectedFeature->featureId(), m.vertexIndex() + 1 ); if ( topologicalEditing ) { diff --git a/src/app/nodetool/qgsmaptoolnodetool.h b/src/app/nodetool/qgsmaptoolnodetool.h index dd90a323376..5473d6d8bef 100644 --- a/src/app/nodetool/qgsmaptoolnodetool.h +++ b/src/app/nodetool/qgsmaptoolnodetool.h @@ -16,7 +16,9 @@ #ifndef QGSMAPTOOLNODETOOL_H #define QGSMAPTOOLNODETOOL_H +#include "qgsfeature.h" #include "qgsmaptoolvertexedit.h" +#include "qgspoint.h" class QRubberBand; diff --git a/src/app/qgsmapmouseevent.h b/src/app/qgsmapmouseevent.h index 8515f867e7b..08bc26111d1 100644 --- a/src/app/qgsmapmouseevent.h +++ b/src/app/qgsmapmouseevent.h @@ -18,10 +18,10 @@ #include -#include "qgsmapcanvassnapper.h" #include "qgspoint.h" #include "qgspointlocator.h" +class QgsMapCanvas; class QgsMapToolAdvancedDigitizing; class APP_EXPORT QgsMapMouseEvent : public QMouseEvent diff --git a/src/app/qgsmaptooladvanceddigitizing.cpp b/src/app/qgsmaptooladvanceddigitizing.cpp index 262a22c92c1..2034d416b76 100644 --- a/src/app/qgsmaptooladvanceddigitizing.cpp +++ b/src/app/qgsmaptooladvanceddigitizing.cpp @@ -28,9 +28,6 @@ QgsMapToolAdvancedDigitizing::QgsMapToolAdvancedDigitizing( QgsMapCanvas* canvas , mSnapOnDoubleClick( false ) { mCadDockWidget = QgisApp::instance()->cadDockWidget(); - - // CADTODO: remove - mSnapper.setMapCanvas( canvas ); } QgsMapToolAdvancedDigitizing::~QgsMapToolAdvancedDigitizing() diff --git a/src/app/qgsmaptooladvanceddigitizing.h b/src/app/qgsmaptooladvanceddigitizing.h index 3bde2252139..ae395b5c417 100644 --- a/src/app/qgsmaptooladvanceddigitizing.h +++ b/src/app/qgsmaptooladvanceddigitizing.h @@ -19,7 +19,6 @@ #include "qgsadvanceddigitizingdockwidget.h" #include "qgsmaptool.h" -#include "qgsmapcanvassnapper.h" class QgsMapMouseEvent; @@ -80,8 +79,6 @@ class APP_EXPORT QgsMapToolAdvancedDigitizing : public QgsMapTool CaptureMode mode() { return mCaptureMode; } protected: - // CADTODO: remove - QgsMapCanvasSnapper mSnapper; QgsAdvancedDigitizingDockWidget* mCadDockWidget; diff --git a/src/app/qgsmaptooledit.h b/src/app/qgsmaptooledit.h index 8e2baa01a60..9c5ebc998b4 100644 --- a/src/app/qgsmaptooledit.h +++ b/src/app/qgsmaptooledit.h @@ -16,9 +16,11 @@ #ifndef QGSMAPTOOLEDIT_H #define QGSMAPTOOLEDIT_H +#include "qgis.h" #include "qgsmaptooladvanceddigitizing.h" class QgsRubberBand; +class QgsVectorLayer; class QKeyEvent; /**Base class for map tools that edit vector geometry*/ diff --git a/src/app/qgsmaptoolvertexedit.h b/src/app/qgsmaptoolvertexedit.h index 7a5ce409aff..71991093cbc 100644 --- a/src/app/qgsmaptoolvertexedit.h +++ b/src/app/qgsmaptoolvertexedit.h @@ -16,9 +16,7 @@ #ifndef QGSMAPTOOLVERTEXEDIT_H #define QGSMAPTOOLVERTEXEDIT_H -#include "qgsmapcanvassnapper.h" #include "qgsmaptooledit.h" -#include "qgsgeometry.h" /**Base class for vertex manipulation tools. Inherited by QgsMapToolMoveVertex, QgsMapToolAddVertex, @@ -35,9 +33,6 @@ class APP_EXPORT QgsMapToolVertexEdit: public QgsMapToolEdit protected: - /**Snapping results that are collected during the mouse press event - (search for vertices/segments to manipulate)*/ - QList mRecentSnappingResults; }; #endif diff --git a/src/app/qgsmeasuretool.h b/src/app/qgsmeasuretool.h index 075c5c643f2..8fdb0fe6264 100644 --- a/src/app/qgsmeasuretool.h +++ b/src/app/qgsmeasuretool.h @@ -18,7 +18,6 @@ #define QGSMEASURETOOL_H #include "qgsmaptool.h" -#include "qgsmapcanvassnapper.h" class QgsDistanceArea; class QgsMapCanvas; diff --git a/src/core/qgspointlocator.h b/src/core/qgspointlocator.h index bbb6ca37bd4..0a54f7acdb3 100644 --- a/src/core/qgspointlocator.h +++ b/src/core/qgspointlocator.h @@ -90,12 +90,12 @@ class QgsPointLocator : public QObject QgsPoint point() const { return mPoint; } //! for vertex / edge match (first vertex of the edge) - int vertexIndex() { return mVertexIndex; } + int vertexIndex() const { return mVertexIndex; } //! reference vector layer - QgsVectorLayer* layer() { return mLayer; } + QgsVectorLayer* layer() const { return mLayer; } - QgsFeatureId featureId() { return mFid; } + QgsFeatureId featureId() const { return mFid; } void replaceIfBetter( const Match& m, double maxDistance ) {