diff --git a/src/app/qgsmeasuretool.cpp b/src/app/qgsmeasuretool.cpp index 06fecba2442..156051e9602 100644 --- a/src/app/qgsmeasuretool.cpp +++ b/src/app/qgsmeasuretool.cpp @@ -44,6 +44,7 @@ QgsMeasureTool::QgsMeasureTool( QgsMapCanvas* canvas, bool measureArea ) mRightMouseClicked = false; mDialog = new QgsMeasureDialog( this ); + mSnapper.setMapCanvas( canvas ); } QgsMeasureTool::~QgsMeasureTool() @@ -130,7 +131,7 @@ void QgsMeasureTool::canvasPressEvent( QMouseEvent * e ) if ( mRightMouseClicked ) mDialog->restart(); - QgsPoint idPoint = mCanvas->getCoordinateTransform()->toMapCoordinates( e->x(), e->y() ); + QgsPoint idPoint = snapPoint( e->pos() ); mDialog->mousePress( idPoint ); } } @@ -140,12 +141,7 @@ void QgsMeasureTool::canvasMoveEvent( QMouseEvent * e ) if ( !mRightMouseClicked ) { QgsVectorLayer *vl = dynamic_cast( mCanvas->currentLayer() ); - QgsPoint point = mCanvas->getCoordinateTransform()->toMapCoordinates( e->pos().x(), e->pos().y() ); - - if ( vl ) - { - vl->snapPoint( point, QgsTolerance::defaultTolerance( vl, mCanvas->mapRenderer() ) ); - } + QgsPoint point = snapPoint( e->pos() ); mRubberBand->movePoint( point ); mDialog->mouseMove( point ); @@ -156,12 +152,7 @@ void QgsMeasureTool::canvasMoveEvent( QMouseEvent * e ) void QgsMeasureTool::canvasReleaseEvent( QMouseEvent * e ) { QgsVectorLayer *vl = dynamic_cast( mCanvas->currentLayer() ); - QgsPoint point = mCanvas->getCoordinateTransform()->toMapCoordinates( e->pos().x(), e->pos().y() ); - - if ( vl ) - { - vl->snapPoint( point, QgsTolerance::defaultTolerance( vl, mCanvas->mapRenderer() ) ); - } + QgsPoint point = snapPoint( e->pos() ); if ( e->button() == Qt::RightButton && ( e->buttons() & Qt::LeftButton ) == 0 ) // restart { @@ -194,3 +185,16 @@ void QgsMeasureTool::addPoint( QgsPoint &point ) mRubberBand->addPoint( point ); mDialog->addPoint( point ); } + +QgsPoint QgsMeasureTool::snapPoint( const QPoint& p ) +{ + QList snappingResults; + if ( mSnapper.snapToBackgroundLayers( p, snappingResults ) != 0 || snappingResults.size() < 1 ) + { + return mCanvas->getCoordinateTransform()->toMapCoordinates( p ); + } + else + { + return snappingResults.constBegin()->snappedVertex; + } +} diff --git a/src/app/qgsmeasuretool.h b/src/app/qgsmeasuretool.h index c2ddc55fc09..4918ac05fd3 100644 --- a/src/app/qgsmeasuretool.h +++ b/src/app/qgsmeasuretool.h @@ -19,6 +19,7 @@ #define QGSMEASURETOOL_H #include "qgsmaptool.h" +#include "qgsmapcanvassnapper.h" class QgsDistanceArea; class QgsMapCanvas; @@ -89,6 +90,12 @@ class QgsMeasureTool : public QgsMapTool // project projection bool mWrongProjectProjection; + QgsMapCanvasSnapper mSnapper; + + //! Returns the snapped (map) coordinate + //@param p (pixel) coordinate + QgsPoint snapPoint( const QPoint& p ); + }; #endif