From 5ef3751143b467e854c62eacfcf395f9e54b5ca4 Mon Sep 17 00:00:00 2001 From: Matthias Kuhn Date: Thu, 23 Aug 2018 06:17:07 +0200 Subject: [PATCH 01/23] Call direct parent method --- src/app/qgsmaptooladdpart.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/qgsmaptooladdpart.cpp b/src/app/qgsmaptooladdpart.cpp index 6660a56e546..fb742dcdcc4 100644 --- a/src/app/qgsmaptooladdpart.cpp +++ b/src/app/qgsmaptooladdpart.cpp @@ -39,7 +39,7 @@ void QgsMapToolAddPart::canvasReleaseEvent( QgsMapMouseEvent *e ) { if ( checkSelection() ) { - QgsMapToolAdvancedDigitizing::canvasReleaseEvent( e ); + QgsMapToolCapture::canvasReleaseEvent( e ); } else { From 8fc08d8c13fceaba3db51b9a8b284619e77e9bf0 Mon Sep 17 00:00:00 2001 From: Matthias Kuhn Date: Thu, 23 Aug 2018 06:20:33 +0200 Subject: [PATCH 02/23] Snap nodes in digitizing map tools to grid --- python/gui/auto_generated/qgsmapmouseevent.sip.in | 7 +++++++ src/gui/qgsmapmouseevent.cpp | 13 +++++++++++++ src/gui/qgsmapmouseevent.h | 7 +++++++ src/gui/qgsmaptooladvanceddigitizing.cpp | 10 ++++++++++ 4 files changed, 37 insertions(+) diff --git a/python/gui/auto_generated/qgsmapmouseevent.sip.in b/python/gui/auto_generated/qgsmapmouseevent.sip.in index 4fed1e4d71f..a24366fd317 100644 --- a/python/gui/auto_generated/qgsmapmouseevent.sip.in +++ b/python/gui/auto_generated/qgsmapmouseevent.sip.in @@ -117,6 +117,13 @@ The unsnapped, real mouse cursor position in pixel coordinates. Alias to pos() :return: Mouse position in pixel coordinates +%End + + void snapToGrid( double precision ); +%Docstring +Snaps the mapPoint to a grid with the given ``precision``. + +.. versionadded:: 3.4 %End }; diff --git a/src/gui/qgsmapmouseevent.cpp b/src/gui/qgsmapmouseevent.cpp index ac60a876629..9cf9cd9c016 100644 --- a/src/gui/qgsmapmouseevent.cpp +++ b/src/gui/qgsmapmouseevent.cpp @@ -71,6 +71,19 @@ void QgsMapMouseEvent::setMapPoint( const QgsPointXY &point ) mPixelPoint = mapToPixelCoordinates( point ); } +void QgsMapMouseEvent::snapToGrid( double precision ) +{ + if ( precision <= 0 ) + return; + + mMapPoint.setX( std::round( mMapPoint.x() / precision ) * precision ); + mMapPoint.setY( std::round( mMapPoint.y() / precision ) * precision ); + + // mSnapMatch = QgsPointLocator::Match( mSnapMatch.type(), mSnapMatch.layer(), mSnapMatch.featureId(), mSnapMatch.distance(), mMapPoint, mSnapMatch.vertexIndex(), mSnapMatch.edgePoints() ); + + setMapPoint( mMapPoint ); +} + QPoint QgsMapMouseEvent::mapToPixelCoordinates( const QgsPointXY &point ) { double x = point.x(), y = point.y(); diff --git a/src/gui/qgsmapmouseevent.h b/src/gui/qgsmapmouseevent.h index dafa108ae51..0b89cec92a1 100644 --- a/src/gui/qgsmapmouseevent.h +++ b/src/gui/qgsmapmouseevent.h @@ -126,6 +126,13 @@ class GUI_EXPORT QgsMapMouseEvent : public QMouseEvent */ QPoint originalPixelPoint() const { return pos(); } + /** + * Snaps the mapPoint to a grid with the given \a precision. + * + * \since QGIS 3.4 + */ + void snapToGrid( double precision ); + private: QPoint mapToPixelCoordinates( const QgsPointXY &point ); diff --git a/src/gui/qgsmaptooladvanceddigitizing.cpp b/src/gui/qgsmaptooladvanceddigitizing.cpp index bbf73e8c02c..75c665acf6d 100644 --- a/src/gui/qgsmaptooladvanceddigitizing.cpp +++ b/src/gui/qgsmaptooladvanceddigitizing.cpp @@ -17,6 +17,7 @@ #include "qgsmaptooladvanceddigitizing.h" #include "qgsmapcanvas.h" #include "qgsadvanceddigitizingdockwidget.h" +#include "qgsvectorlayer.h" QgsMapToolAdvancedDigitizing::QgsMapToolAdvancedDigitizing( QgsMapCanvas *canvas, QgsAdvancedDigitizingDockWidget *cadDockWidget ) : QgsMapToolEdit( canvas ) @@ -38,6 +39,9 @@ void QgsMapToolAdvancedDigitizing::canvasPressEvent( QgsMapMouseEvent *e ) e->snapPoint(); } + if ( currentVectorLayer() ) + e->snapToGrid( currentVectorLayer()->geometryOptions().geometryPrecision ); + cadCanvasPressEvent( e ); } @@ -72,6 +76,9 @@ void QgsMapToolAdvancedDigitizing::canvasReleaseEvent( QgsMapMouseEvent *e ) e->snapPoint(); } + if ( currentVectorLayer() ) + e->snapToGrid( currentVectorLayer()->geometryOptions().geometryPrecision ); + cadCanvasReleaseEvent( e ); } @@ -91,6 +98,9 @@ void QgsMapToolAdvancedDigitizing::canvasMoveEvent( QgsMapMouseEvent *e ) e->snapPoint(); } + if ( currentVectorLayer() ) + e->snapToGrid( currentVectorLayer()->geometryOptions().geometryPrecision ); + cadCanvasMoveEvent( e ); } From 9e387e48fc856a27cfd9a9d89f4a467d81ce34e4 Mon Sep 17 00:00:00 2001 From: Matthias Kuhn Date: Thu, 23 Aug 2018 06:43:21 +0200 Subject: [PATCH 03/23] Make map tool snap to grid crs aware --- .../auto_generated/qgsmapmouseevent.sip.in | 4 +++- src/gui/qgsmapmouseevent.cpp | 14 ++++++++----- src/gui/qgsmapmouseevent.h | 4 +++- src/gui/qgsmaptooladvanceddigitizing.cpp | 21 +++++++++++++------ 4 files changed, 30 insertions(+), 13 deletions(-) diff --git a/python/gui/auto_generated/qgsmapmouseevent.sip.in b/python/gui/auto_generated/qgsmapmouseevent.sip.in index a24366fd317..a2547417550 100644 --- a/python/gui/auto_generated/qgsmapmouseevent.sip.in +++ b/python/gui/auto_generated/qgsmapmouseevent.sip.in @@ -119,9 +119,11 @@ Alias to pos() :return: Mouse position in pixel coordinates %End - void snapToGrid( double precision ); + void snapToGrid( double precision, const QgsCoordinateReferenceSystem &crs ); %Docstring Snaps the mapPoint to a grid with the given ``precision``. +The snapping will be done in the specified ``crs``. If this crs is +different from the mapCanvas crs, it will add some overhead. .. versionadded:: 3.4 %End diff --git a/src/gui/qgsmapmouseevent.cpp b/src/gui/qgsmapmouseevent.cpp index 9cf9cd9c016..baaa5ab6381 100644 --- a/src/gui/qgsmapmouseevent.cpp +++ b/src/gui/qgsmapmouseevent.cpp @@ -71,17 +71,21 @@ void QgsMapMouseEvent::setMapPoint( const QgsPointXY &point ) mPixelPoint = mapToPixelCoordinates( point ); } -void QgsMapMouseEvent::snapToGrid( double precision ) +void QgsMapMouseEvent::snapToGrid( double precision, const QgsCoordinateReferenceSystem &crs ) { if ( precision <= 0 ) return; - mMapPoint.setX( std::round( mMapPoint.x() / precision ) * precision ); - mMapPoint.setY( std::round( mMapPoint.y() / precision ) * precision ); + QgsCoordinateTransform ct( mMapCanvas->mapSettings().destinationCrs(), crs, mMapCanvas->mapSettings().transformContext() ); - // mSnapMatch = QgsPointLocator::Match( mSnapMatch.type(), mSnapMatch.layer(), mSnapMatch.featureId(), mSnapMatch.distance(), mMapPoint, mSnapMatch.vertexIndex(), mSnapMatch.edgePoints() ); + QgsPointXY pt = ct.transform( mMapPoint ); - setMapPoint( mMapPoint ); + pt.setX( std::round( mMapPoint.x() / precision ) * precision ); + pt.setY( std::round( mMapPoint.y() / precision ) * precision ); + + pt = ct.transform( pt, QgsCoordinateTransform::ReverseTransform ); + + setMapPoint( pt ); } QPoint QgsMapMouseEvent::mapToPixelCoordinates( const QgsPointXY &point ) diff --git a/src/gui/qgsmapmouseevent.h b/src/gui/qgsmapmouseevent.h index 0b89cec92a1..01d143d8ff5 100644 --- a/src/gui/qgsmapmouseevent.h +++ b/src/gui/qgsmapmouseevent.h @@ -128,10 +128,12 @@ class GUI_EXPORT QgsMapMouseEvent : public QMouseEvent /** * Snaps the mapPoint to a grid with the given \a precision. + * The snapping will be done in the specified \a crs. If this crs is + * different from the mapCanvas crs, it will add some overhead. * * \since QGIS 3.4 */ - void snapToGrid( double precision ); + void snapToGrid( double precision, const QgsCoordinateReferenceSystem &crs ); private: diff --git a/src/gui/qgsmaptooladvanceddigitizing.cpp b/src/gui/qgsmaptooladvanceddigitizing.cpp index 75c665acf6d..a1fd537f520 100644 --- a/src/gui/qgsmaptooladvanceddigitizing.cpp +++ b/src/gui/qgsmaptooladvanceddigitizing.cpp @@ -39,8 +39,11 @@ void QgsMapToolAdvancedDigitizing::canvasPressEvent( QgsMapMouseEvent *e ) e->snapPoint(); } - if ( currentVectorLayer() ) - e->snapToGrid( currentVectorLayer()->geometryOptions().geometryPrecision ); + QgsVectorLayer *layer = currentVectorLayer(); + if ( layer ) + { + e->snapToGrid( layer->geometryOptions().geometryPrecision, layer->crs() ); + } cadCanvasPressEvent( e ); } @@ -76,8 +79,11 @@ void QgsMapToolAdvancedDigitizing::canvasReleaseEvent( QgsMapMouseEvent *e ) e->snapPoint(); } - if ( currentVectorLayer() ) - e->snapToGrid( currentVectorLayer()->geometryOptions().geometryPrecision ); + QgsVectorLayer *layer = currentVectorLayer(); + if ( layer ) + { + e->snapToGrid( layer->geometryOptions().geometryPrecision, layer->crs() ); + } cadCanvasReleaseEvent( e ); } @@ -98,8 +104,11 @@ void QgsMapToolAdvancedDigitizing::canvasMoveEvent( QgsMapMouseEvent *e ) e->snapPoint(); } - if ( currentVectorLayer() ) - e->snapToGrid( currentVectorLayer()->geometryOptions().geometryPrecision ); + QgsVectorLayer *layer = currentVectorLayer(); + if ( layer ) + { + e->snapToGrid( layer->geometryOptions().geometryPrecision, layer->crs() ); + } cadCanvasMoveEvent( e ); } From 93eef9f000682a6462defaf074012c536a7a46cc Mon Sep 17 00:00:00 2001 From: Matthias Kuhn Date: Thu, 23 Aug 2018 10:42:58 +0200 Subject: [PATCH 04/23] Do not bypass edit buffer --- src/core/qgsvectorlayereditutils.cpp | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/core/qgsvectorlayereditutils.cpp b/src/core/qgsvectorlayereditutils.cpp index d815cb87621..5949ecfd158 100644 --- a/src/core/qgsvectorlayereditutils.cpp +++ b/src/core/qgsvectorlayereditutils.cpp @@ -46,7 +46,7 @@ bool QgsVectorLayerEditUtils::insertVertex( double x, double y, QgsFeatureId atF geometry.insertVertex( x, y, beforeVertex ); - mLayer->editBuffer()->changeGeometry( atFeatureId, geometry ); + mLayer->changeGeometry( atFeatureId, geometry ); return true; } @@ -63,7 +63,7 @@ bool QgsVectorLayerEditUtils::insertVertex( const QgsPoint &point, QgsFeatureId geometry.insertVertex( point, beforeVertex ); - mLayer->editBuffer()->changeGeometry( atFeatureId, geometry ); + mLayer->changeGeometry( atFeatureId, geometry ); return true; } @@ -86,7 +86,7 @@ bool QgsVectorLayerEditUtils::moveVertex( const QgsPoint &p, QgsFeatureId atFeat geometry.moveVertex( p, atVertex ); - mLayer->editBuffer()->changeGeometry( atFeatureId, geometry ); + mLayer->changeGeometry( atFeatureId, geometry ); return true; } @@ -111,7 +111,7 @@ QgsVectorLayer::EditResult QgsVectorLayerEditUtils::deleteVertex( QgsFeatureId f geometry.set( nullptr ); } - mLayer->editBuffer()->changeGeometry( featureId, geometry ); + mLayer->changeGeometry( featureId, geometry ); return !geometry.isNull() ? QgsVectorLayer::Success : QgsVectorLayer::EmptyGeometry; } @@ -158,7 +158,7 @@ QgsGeometry::OperationResult QgsVectorLayerEditUtils::addRing( QgsCurve *ring, c if ( addRingReturnCode == 0 ) if ( addRingReturnCode == QgsGeometry::Success ) { - mLayer->editBuffer()->changeGeometry( f.id(), g ); + mLayer->changeGeometry( f.id(), g ); if ( modifiedFeatureId ) *modifiedFeatureId = f.id(); @@ -211,7 +211,7 @@ QgsGeometry::OperationResult QgsVectorLayerEditUtils::addPart( const QgsPointSeq //convert back to single part if required by layer geometry.convertToSingleType(); } - mLayer->editBuffer()->changeGeometry( featureId, geometry ); + mLayer->changeGeometry( featureId, geometry ); } return errorCode; } @@ -246,7 +246,7 @@ QgsGeometry::OperationResult QgsVectorLayerEditUtils::addPart( QgsCurve *ring, Q //convert back to single part if required by layer geometry.convertToSingleType(); } - mLayer->editBuffer()->changeGeometry( featureId, geometry ); + mLayer->changeGeometry( featureId, geometry ); } return errorCode; } @@ -266,7 +266,7 @@ int QgsVectorLayerEditUtils::translateFeature( QgsFeatureId featureId, double dx int errorCode = geometry.translate( dx, dy ); if ( errorCode == 0 ) { - mLayer->editBuffer()->changeGeometry( featureId, geometry ); + mLayer->changeGeometry( featureId, geometry ); } return errorCode; } @@ -347,13 +347,13 @@ QgsGeometry::OperationResult QgsVectorLayerEditUtils::splitFeatures( const QVect if ( splitFunctionReturn == QgsGeometry::OperationResult::Success ) { //change this geometry - mLayer->editBuffer()->changeGeometry( feat.id(), featureGeom ); + mLayer->changeGeometry( feat.id(), featureGeom ); //insert new features for ( int i = 0; i < newGeometries.size(); ++i ) { QgsFeature f = QgsVectorLayerUtils::createFeature( mLayer, newGeometries.at( i ), feat.attributes().toMap() ); - mLayer->editBuffer()->addFeature( f ); + mLayer->addFeature( f ); } if ( topologicalEditing ) @@ -469,7 +469,7 @@ QgsGeometry::OperationResult QgsVectorLayerEditUtils::splitParts( const QVector< if ( !addPartRet ) { - mLayer->editBuffer()->changeGeometry( feat.id(), featureGeom ); + mLayer->changeGeometry( feat.id(), featureGeom ); } if ( topologicalEditing ) From aae655913082e04475a98ac046bf9b4e664bf764 Mon Sep 17 00:00:00 2001 From: Matthias Kuhn Date: Thu, 23 Aug 2018 10:46:02 +0200 Subject: [PATCH 05/23] Allow disabling snapping on maptools --- .../qgsmaptooladvanceddigitizing.sip.in | 14 ++++++++++++++ src/gui/qgsmaptooladvanceddigitizing.cpp | 16 +++++++++++++--- src/gui/qgsmaptooladvanceddigitizing.h | 16 ++++++++++++++++ 3 files changed, 43 insertions(+), 3 deletions(-) diff --git a/python/gui/auto_generated/qgsmaptooladvanceddigitizing.sip.in b/python/gui/auto_generated/qgsmaptooladvanceddigitizing.sip.in index 3da3915d3ba..8754c4fee99 100644 --- a/python/gui/auto_generated/qgsmaptooladvanceddigitizing.sip.in +++ b/python/gui/auto_generated/qgsmaptooladvanceddigitizing.sip.in @@ -149,6 +149,20 @@ canvasMoveEvent is triggered and it's not hidden by the cad's construction mode. :param e: Mouse events prepared by the cad system +%End + + bool snapToGridEnabled() const; +%Docstring +Enables or disables snap to grid of mouse events. + +.. versionadded:: 3.4 +%End + + void setSnapToGridEnabled( bool snapToGridEnabled ); +%Docstring +Enables or disables snap to grid of mouse events. + +.. versionadded:: 3.4 %End }; diff --git a/src/gui/qgsmaptooladvanceddigitizing.cpp b/src/gui/qgsmaptooladvanceddigitizing.cpp index a1fd537f520..1941fe55d7a 100644 --- a/src/gui/qgsmaptooladvanceddigitizing.cpp +++ b/src/gui/qgsmaptooladvanceddigitizing.cpp @@ -40,7 +40,7 @@ void QgsMapToolAdvancedDigitizing::canvasPressEvent( QgsMapMouseEvent *e ) } QgsVectorLayer *layer = currentVectorLayer(); - if ( layer ) + if ( mSnapToGridEnabled && layer ) { e->snapToGrid( layer->geometryOptions().geometryPrecision, layer->crs() ); } @@ -80,7 +80,7 @@ void QgsMapToolAdvancedDigitizing::canvasReleaseEvent( QgsMapMouseEvent *e ) } QgsVectorLayer *layer = currentVectorLayer(); - if ( layer ) + if ( mSnapToGridEnabled && layer ) { e->snapToGrid( layer->geometryOptions().geometryPrecision, layer->crs() ); } @@ -105,7 +105,7 @@ void QgsMapToolAdvancedDigitizing::canvasMoveEvent( QgsMapMouseEvent *e ) } QgsVectorLayer *layer = currentVectorLayer(); - if ( layer ) + if ( mSnapToGridEnabled && layer ) { e->snapToGrid( layer->geometryOptions().geometryPrecision, layer->crs() ); } @@ -133,3 +133,13 @@ void QgsMapToolAdvancedDigitizing::cadPointChanged( const QgsPointXY &point ) QMouseEvent *ev = new QMouseEvent( QEvent::MouseMove, mCanvas->mouseLastXY(), Qt::NoButton, Qt::NoButton, Qt::NoModifier ); qApp->postEvent( mCanvas->viewport(), ev ); // event queue will delete the event when processed } + +bool QgsMapToolAdvancedDigitizing::snapToGridEnabled() const +{ + return mSnapToGridEnabled; +} + +void QgsMapToolAdvancedDigitizing::setSnapToGridEnabled( bool snapToGridEnabled ) +{ + mSnapToGridEnabled = snapToGridEnabled; +} diff --git a/src/gui/qgsmaptooladvanceddigitizing.h b/src/gui/qgsmaptooladvanceddigitizing.h index a3fba96435a..732ab407f9a 100644 --- a/src/gui/qgsmaptooladvanceddigitizing.h +++ b/src/gui/qgsmaptooladvanceddigitizing.h @@ -140,6 +140,20 @@ class GUI_EXPORT QgsMapToolAdvancedDigitizing : public QgsMapToolEdit */ virtual void cadCanvasMoveEvent( QgsMapMouseEvent *e ) { Q_UNUSED( e ) } + /** + * Enables or disables snap to grid of mouse events. + * + * \since QGIS 3.4 + */ + bool snapToGridEnabled() const; + + /** + * Enables or disables snap to grid of mouse events. + * + * \since QGIS 3.4 + */ + void setSnapToGridEnabled( bool snapToGridEnabled ); + private slots: /** @@ -159,6 +173,8 @@ class GUI_EXPORT QgsMapToolAdvancedDigitizing : public QgsMapToolEdit bool mAdvancedDigitizingAllowed = true; //! Whether to snap mouse cursor to map before passing coordinates to cadCanvas*Event() bool mAutoSnapEnabled = true; + //! Whether to snap to grid before passing coordinates to cadCanvas*Event() + bool mSnapToGridEnabled = true; }; #endif // QGSMAPTOOLADVANCEDDIGITIZE_H From 665466b1020b650c7d5fbf08330aa66150efcc34 Mon Sep 17 00:00:00 2001 From: Matthias Kuhn Date: Thu, 23 Aug 2018 10:46:24 +0200 Subject: [PATCH 06/23] Disable snapping on split map tool --- src/app/qgsmaptoolsplitfeatures.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/app/qgsmaptoolsplitfeatures.cpp b/src/app/qgsmaptoolsplitfeatures.cpp index 7cbfb953573..ec45015bfb8 100644 --- a/src/app/qgsmaptoolsplitfeatures.cpp +++ b/src/app/qgsmaptoolsplitfeatures.cpp @@ -27,6 +27,7 @@ QgsMapToolSplitFeatures::QgsMapToolSplitFeatures( QgsMapCanvas *canvas ) : QgsMapToolCapture( canvas, QgisApp::instance()->cadDockWidget(), QgsMapToolCapture::CaptureLine ) { mToolName = tr( "Split features" ); + setSnapToGridEnabled( false ); } void QgsMapToolSplitFeatures::cadCanvasReleaseEvent( QgsMapMouseEvent *e ) From 391d3f979afa6b92a13afcc2c18bcd6f108a880d Mon Sep 17 00:00:00 2001 From: Matthias Kuhn Date: Thu, 23 Aug 2018 12:51:33 +0200 Subject: [PATCH 07/23] Disable snap to grid for maptool split parts --- src/app/qgsmaptoolsplitparts.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/app/qgsmaptoolsplitparts.cpp b/src/app/qgsmaptoolsplitparts.cpp index 4a66d4a49ca..f73bf15431c 100644 --- a/src/app/qgsmaptoolsplitparts.cpp +++ b/src/app/qgsmaptoolsplitparts.cpp @@ -27,6 +27,7 @@ QgsMapToolSplitParts::QgsMapToolSplitParts( QgsMapCanvas *canvas ) : QgsMapToolCapture( canvas, QgisApp::instance()->cadDockWidget(), QgsMapToolCapture::CaptureLine ) { mToolName = tr( "Split parts" ); + setSnapToGridEnabled( false ); } void QgsMapToolSplitParts::cadCanvasReleaseEvent( QgsMapMouseEvent *e ) From fff743bed84749695a1c52d8521f123b32a1d318 Mon Sep 17 00:00:00 2001 From: Matthias Kuhn Date: Fri, 24 Aug 2018 15:35:14 +0200 Subject: [PATCH 08/23] Migrate geometry fixers to new API style --- src/gui/qgsmaptooladvanceddigitizing.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/gui/qgsmaptooladvanceddigitizing.cpp b/src/gui/qgsmaptooladvanceddigitizing.cpp index 1941fe55d7a..1fb72e649b0 100644 --- a/src/gui/qgsmaptooladvanceddigitizing.cpp +++ b/src/gui/qgsmaptooladvanceddigitizing.cpp @@ -18,6 +18,7 @@ #include "qgsmapcanvas.h" #include "qgsadvanceddigitizingdockwidget.h" #include "qgsvectorlayer.h" +#include "qgsgeometryfixes.h" QgsMapToolAdvancedDigitizing::QgsMapToolAdvancedDigitizing( QgsMapCanvas *canvas, QgsAdvancedDigitizingDockWidget *cadDockWidget ) : QgsMapToolEdit( canvas ) @@ -42,7 +43,7 @@ void QgsMapToolAdvancedDigitizing::canvasPressEvent( QgsMapMouseEvent *e ) QgsVectorLayer *layer = currentVectorLayer(); if ( mSnapToGridEnabled && layer ) { - e->snapToGrid( layer->geometryOptions().geometryPrecision, layer->crs() ); + e->snapToGrid( layer->geometryFixes()->geometryPrecision(), layer->crs() ); } cadCanvasPressEvent( e ); @@ -82,7 +83,7 @@ void QgsMapToolAdvancedDigitizing::canvasReleaseEvent( QgsMapMouseEvent *e ) QgsVectorLayer *layer = currentVectorLayer(); if ( mSnapToGridEnabled && layer ) { - e->snapToGrid( layer->geometryOptions().geometryPrecision, layer->crs() ); + e->snapToGrid( layer->geometryFixes()->geometryPrecision(), layer->crs() ); } cadCanvasReleaseEvent( e ); @@ -107,7 +108,7 @@ void QgsMapToolAdvancedDigitizing::canvasMoveEvent( QgsMapMouseEvent *e ) QgsVectorLayer *layer = currentVectorLayer(); if ( mSnapToGridEnabled && layer ) { - e->snapToGrid( layer->geometryOptions().geometryPrecision, layer->crs() ); + e->snapToGrid( layer->geometryFixes()->geometryPrecision(), layer->crs() ); } cadCanvasMoveEvent( e ); From 1e81e03a182fc330b5aad4c0b67a12115392d954 Mon Sep 17 00:00:00 2001 From: Matthias Kuhn Date: Sat, 25 Aug 2018 15:49:00 +0200 Subject: [PATCH 09/23] Add QgsSnapToGridCanvasItem --- .../qgssnaptogridcanvasitem.sip.in | 91 +++++++++++ python/gui/gui_auto.sip | 1 + src/gui/CMakeLists.txt | 2 + src/gui/qgssnaptogridcanvasitem.cpp | 142 ++++++++++++++++++ src/gui/qgssnaptogridcanvasitem.h | 98 ++++++++++++ 5 files changed, 334 insertions(+) create mode 100644 python/gui/auto_generated/qgssnaptogridcanvasitem.sip.in create mode 100644 src/gui/qgssnaptogridcanvasitem.cpp create mode 100644 src/gui/qgssnaptogridcanvasitem.h diff --git a/python/gui/auto_generated/qgssnaptogridcanvasitem.sip.in b/python/gui/auto_generated/qgssnaptogridcanvasitem.sip.in new file mode 100644 index 00000000000..98f4390c765 --- /dev/null +++ b/python/gui/auto_generated/qgssnaptogridcanvasitem.sip.in @@ -0,0 +1,91 @@ +/************************************************************************ + * This file has been generated automatically from * + * * + * src/gui/qgssnaptogridcanvasitem.h * + * * + * Do not edit manually ! Edit header and run scripts/sipify.pl again * + ************************************************************************/ + + + +class QgsSnapToGridCanvasItem : QObject, QgsMapCanvasItem +{ +%Docstring + +Shows a grid on the map canvas given a spatial resolution. + +.. versionadded:: 3.4 +%End + +%TypeHeaderCode +#include "qgssnaptogridcanvasitem.h" +%End + public: + + QgsSnapToGridCanvasItem( QgsMapCanvas *mapCanvas ); +%Docstring +Will automatically be added to the ``mapCanvas``. +%End + + virtual void paint( QPainter *painter ); + + + QgsPointXY point() const; +%Docstring +A point that will be highlighted on the map canvas. +The point needs to be in map coordinates. The closest point on the +grid will be highlighted. +%End + + void setPoint( const QgsPointXY &point ); +%Docstring +A point that will be highlighted on the map canvas. +The point needs to be in map coordinates. The closest point on the +grid will be highlighted. +%End + + double precision() const; +%Docstring +The resolution of the grid in map units. +If a crs has been specified it will be in CRS units. +%End + + void setPrecision( double precision ); +%Docstring +The resolution of the grid in map units. +If a crs has been specified it will be in CRS units. +%End + + QgsCoordinateReferenceSystem crs() const; +%Docstring +The CRS in which the grid should be calculated. +By default will be an invalid QgsCoordinateReferenceSystem and +as such equal to the CRS of the map canvas. +%End + + void setCrs( const QgsCoordinateReferenceSystem &crs ); +%Docstring +The CRS in which the grid should be calculated. +By default will be an invalid QgsCoordinateReferenceSystem and +as such equal to the CRS of the map canvas. +%End + + bool enabled() const; +%Docstring +Enable this item. It will be hidden if disabled. +%End + + void setEnabled( bool enabled ); +%Docstring +Enable this item. It will be hidden if disabled. +%End + +}; + +/************************************************************************ + * This file has been generated automatically from * + * * + * src/gui/qgssnaptogridcanvasitem.h * + * * + * Do not edit manually ! Edit header and run scripts/sipify.pl again * + ************************************************************************/ diff --git a/python/gui/gui_auto.sip b/python/gui/gui_auto.sip index 321bd6351eb..006f54edb43 100644 --- a/python/gui/gui_auto.sip +++ b/python/gui/gui_auto.sip @@ -192,6 +192,7 @@ %Include auto_generated/qgssearchquerybuilder.sip %Include auto_generated/qgsshortcutsmanager.sip %Include auto_generated/qgsslider.sip +%Include auto_generated/qgssnaptogridcanvasitem.sip %Include auto_generated/qgsstatusbar.sip %Include auto_generated/qgssublayersdialog.sip %Include auto_generated/qgssubstitutionlistwidget.sip diff --git a/src/gui/CMakeLists.txt b/src/gui/CMakeLists.txt index 22b5920db3e..97ce4ac2475 100755 --- a/src/gui/CMakeLists.txt +++ b/src/gui/CMakeLists.txt @@ -355,6 +355,7 @@ SET(QGIS_GUI_SRCS qgsshortcutsmanager.cpp qgsslider.cpp qgssnapindicator.cpp + qgssnaptogridcanvasitem.cpp qgssublayersdialog.cpp qgssubstitutionlistwidget.cpp qgssqlcomposerdialog.cpp @@ -524,6 +525,7 @@ SET(QGIS_GUI_MOC_HDRS qgssearchquerybuilder.h qgsshortcutsmanager.h qgsslider.h + qgssnaptogridcanvasitem.h qgssqlcomposerdialog.h qgsstatusbar.h qgssublayersdialog.h diff --git a/src/gui/qgssnaptogridcanvasitem.cpp b/src/gui/qgssnaptogridcanvasitem.cpp new file mode 100644 index 00000000000..51961211aa1 --- /dev/null +++ b/src/gui/qgssnaptogridcanvasitem.cpp @@ -0,0 +1,142 @@ +#include "qgssnaptogridcanvasitem.h" +#include "qgsmapcanvas.h" + +QgsSnapToGridCanvasItem::QgsSnapToGridCanvasItem( QgsMapCanvas *mapCanvas ) + : QgsMapCanvasItem( mapCanvas ) + , mGridPen( QPen( QColor( 127, 127, 127, 150 ), 1 ) ) + , mCurrentPointPen( QPen( QColor( 200, 200, 200, 150 ), 3 ) ) +{ + updateMapCanvasCrs(); + connect( mMapCanvas, &QgsMapCanvas::extentsChanged, this, &QgsSnapToGridCanvasItem::updateZoomFactor ); + connect( mMapCanvas, &QgsMapCanvas::destinationCrsChanged, this, &QgsSnapToGridCanvasItem::updateMapCanvasCrs ); +} + +void QgsSnapToGridCanvasItem::paint( QPainter *painter ) +{ + painter->save(); + QgsRectangle mapRect = mMapCanvas->extent(); + if ( rect() != mapRect ) + setRect( mapRect ); + + painter->setRenderHints( QPainter::Antialiasing ); + painter->setCompositionMode( QPainter::CompositionMode_Difference ); + + if ( mEnabled && mAvailableByZoomFactor ) + { + const QgsRectangle layerExtent = mTransform.transformBoundingBox( mapRect, QgsCoordinateTransform::ReverseTransform ); + const QgsPointXY layerPt = mTransform.transform( mPoint, QgsCoordinateTransform::ReverseTransform ); + + const double gridXMin = std::ceil( layerExtent.xMinimum() / mPrecision ) * mPrecision; + const double gridXMax = std::ceil( layerExtent.xMaximum() / mPrecision ) * mPrecision; + const double gridYMin = std::ceil( layerExtent.yMinimum() / mPrecision ) * mPrecision; + const double gridYMax = std::ceil( layerExtent.yMaximum() / mPrecision ) * mPrecision; + + for ( int x = gridXMin ; x < gridXMax; x += mPrecision ) + { + for ( int y = gridYMin ; y < gridYMax; y += mPrecision ) + { + const QgsPointXY pt = mTransform.transform( x, y ); + const QPointF canvasPt = toCanvasCoordinates( pt ); + + if ( qgsDoubleNear( layerPt.x(), x, mPrecision / 3 ) && qgsDoubleNear( layerPt.y(), y, mPrecision / 3 ) ) + { + painter->setPen( mCurrentPointPen ); + } + else + { + painter->setPen( mGridPen ); + } + painter->drawLine( canvasPt.x() - 3, canvasPt.y(), canvasPt.x() + 3, canvasPt.y() ); + painter->drawLine( canvasPt.x(), canvasPt.y() - 3, canvasPt.x(), canvasPt.y() + 3 ); + } + } + } + + painter->restore(); +} + +QgsPointXY QgsSnapToGridCanvasItem::point() const +{ + return mPoint; +} + +void QgsSnapToGridCanvasItem::setPoint( const QgsPointXY &point ) +{ + mPoint = point; + update(); +} + +double QgsSnapToGridCanvasItem::precision() const +{ + return mPrecision; +} + +void QgsSnapToGridCanvasItem::setPrecision( double precision ) +{ + mPrecision = precision; + updateZoomFactor(); +} + +QgsCoordinateReferenceSystem QgsSnapToGridCanvasItem::crs() const +{ + return mTransform.sourceCrs(); +} + +void QgsSnapToGridCanvasItem::setCrs( const QgsCoordinateReferenceSystem &crs ) +{ + mTransform.setSourceCrs( crs ); + updateZoomFactor(); +} + +bool QgsSnapToGridCanvasItem::enabled() const +{ + return mEnabled; +} + +void QgsSnapToGridCanvasItem::setEnabled( bool enabled ) +{ + mEnabled = enabled; + update(); +} + +void QgsSnapToGridCanvasItem::updateMapCanvasCrs() +{ + mTransform.setContext( mMapCanvas->mapSettings().transformContext() ); + mTransform.setDestinationCrs( mMapCanvas->mapSettings().destinationCrs() ); + update(); +} + + + +void QgsSnapToGridCanvasItem::updateZoomFactor() +{ + if ( !isVisible() ) + return; + + try + { + const int threshold = 5; + + const QgsPointXY centerPoint = mMapCanvas->extent().center(); + const QPointF canvasCenter = toCanvasCoordinates( centerPoint ); + + const QgsPointXY pt1 = mMapCanvas->mapSettings().mapToPixel().toMapCoordinates( canvasCenter.x() - threshold, canvasCenter.y() - threshold ); + const QgsPointXY pt2 = mMapCanvas->mapSettings().mapToPixel().toMapCoordinates( canvasCenter.x() + threshold, canvasCenter.y() + threshold ); + + const QgsPointXY layerPt1 = mTransform.transform( pt1, QgsCoordinateTransform::ReverseTransform ); + const QgsPointXY layerPt2 = mTransform.transform( pt2, QgsCoordinateTransform::ReverseTransform ); + + const double dist = layerPt1.distance( layerPt2 ); + + if ( dist < mPrecision ) + mAvailableByZoomFactor = true; + else + mAvailableByZoomFactor = false; + } + catch ( QgsCsException &e ) + { + // transform errors? + // you've probably got worse problems than the grid with your digitizing operations in the current projection. + mAvailableByZoomFactor = false; + } +} diff --git a/src/gui/qgssnaptogridcanvasitem.h b/src/gui/qgssnaptogridcanvasitem.h new file mode 100644 index 00000000000..2eef0c255d4 --- /dev/null +++ b/src/gui/qgssnaptogridcanvasitem.h @@ -0,0 +1,98 @@ +#ifndef QGSSNAPTOGRIDCANVASITEM_H +#define QGSSNAPTOGRIDCANVASITEM_H + +#include +#include + +#include "qgscoordinatereferencesystem.h" +#include "qgsmapcanvasitem.h" +#include "qgscoordinatetransform.h" + +/** + * \ingroup gui + * + * Shows a grid on the map canvas given a spatial resolution. + * + * \since QGIS 3.4 + */ +class GUI_EXPORT QgsSnapToGridCanvasItem : public QObject, public QgsMapCanvasItem +{ + Q_OBJECT + + public: + + /** + * Will automatically be added to the \a mapCanvas. + */ + QgsSnapToGridCanvasItem( QgsMapCanvas *mapCanvas ); + + void paint( QPainter *painter ) override; + + /** + * A point that will be highlighted on the map canvas. + * The point needs to be in map coordinates. The closest point on the + * grid will be highlighted. + */ + QgsPointXY point() const; + + /** + * A point that will be highlighted on the map canvas. + * The point needs to be in map coordinates. The closest point on the + * grid will be highlighted. + */ + void setPoint( const QgsPointXY &point ); + + /** + * The resolution of the grid in map units. + * If a crs has been specified it will be in CRS units. + */ + double precision() const; + + /** + * The resolution of the grid in map units. + * If a crs has been specified it will be in CRS units. + */ + void setPrecision( double precision ); + + /** + * The CRS in which the grid should be calculated. + * By default will be an invalid QgsCoordinateReferenceSystem and + * as such equal to the CRS of the map canvas. + */ + QgsCoordinateReferenceSystem crs() const; + + /** + * The CRS in which the grid should be calculated. + * By default will be an invalid QgsCoordinateReferenceSystem and + * as such equal to the CRS of the map canvas. + */ + void setCrs( const QgsCoordinateReferenceSystem &crs ); + + /** + * Enable this item. It will be hidden if disabled. + */ + bool enabled() const; + + /** + * Enable this item. It will be hidden if disabled. + */ + void setEnabled( bool enabled ); + + private slots: + void updateMapCanvasCrs(); + + void updateZoomFactor(); + + private: + QPen mGridPen; + QPen mCurrentPointPen; + + bool mEnabled = true; + bool mAvailableByZoomFactor = false; + + double mPrecision = 0.0; + QgsCoordinateTransform mTransform; + QgsPointXY mPoint; +}; + +#endif // QGSSNAPTOGRIDCANVASITEM_H From 6c467fb0327e14f59796758098b7fce31eb046b4 Mon Sep 17 00:00:00 2001 From: Matthias Kuhn Date: Sat, 25 Aug 2018 15:49:42 +0200 Subject: [PATCH 10/23] Fix snap to grid with differing layer CRS --- src/gui/qgsmapmouseevent.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/gui/qgsmapmouseevent.cpp b/src/gui/qgsmapmouseevent.cpp index baaa5ab6381..2fff6609f14 100644 --- a/src/gui/qgsmapmouseevent.cpp +++ b/src/gui/qgsmapmouseevent.cpp @@ -80,8 +80,8 @@ void QgsMapMouseEvent::snapToGrid( double precision, const QgsCoordinateReferenc QgsPointXY pt = ct.transform( mMapPoint ); - pt.setX( std::round( mMapPoint.x() / precision ) * precision ); - pt.setY( std::round( mMapPoint.y() / precision ) * precision ); + pt.setX( std::round( pt.x() / precision ) * precision ); + pt.setY( std::round( pt.y() / precision ) * precision ); pt = ct.transform( pt, QgsCoordinateTransform::ReverseTransform ); From b68ce3780e1693db190e2cccd1a0650c225eaf18 Mon Sep 17 00:00:00 2001 From: Matthias Kuhn Date: Sat, 25 Aug 2018 15:50:16 +0200 Subject: [PATCH 11/23] Highlight grid for map tools that snap to grid --- src/gui/qgsmaptooladvanceddigitizing.cpp | 14 +++++++++++++- src/gui/qgsmaptooladvanceddigitizing.h | 2 ++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src/gui/qgsmaptooladvanceddigitizing.cpp b/src/gui/qgsmaptooladvanceddigitizing.cpp index 1fb72e649b0..735ff98389e 100644 --- a/src/gui/qgsmaptooladvanceddigitizing.cpp +++ b/src/gui/qgsmaptooladvanceddigitizing.cpp @@ -19,6 +19,7 @@ #include "qgsadvanceddigitizingdockwidget.h" #include "qgsvectorlayer.h" #include "qgsgeometryfixes.h" +#include "qgssnaptogridcanvasitem.h" QgsMapToolAdvancedDigitizing::QgsMapToolAdvancedDigitizing( QgsMapCanvas *canvas, QgsAdvancedDigitizingDockWidget *cadDockWidget ) : QgsMapToolEdit( canvas ) @@ -109,6 +110,7 @@ void QgsMapToolAdvancedDigitizing::canvasMoveEvent( QgsMapMouseEvent *e ) if ( mSnapToGridEnabled && layer ) { e->snapToGrid( layer->geometryFixes()->geometryPrecision(), layer->crs() ); + mSnapToGridCanvasItem->setPoint( e->mapPoint() ); } cadCanvasMoveEvent( e ); @@ -119,6 +121,10 @@ void QgsMapToolAdvancedDigitizing::activate() QgsMapToolEdit::activate(); connect( mCadDockWidget, &QgsAdvancedDigitizingDockWidget::pointChanged, this, &QgsMapToolAdvancedDigitizing::cadPointChanged ); mCadDockWidget->enable(); + mSnapToGridCanvasItem = new QgsSnapToGridCanvasItem( mCanvas ); + mSnapToGridCanvasItem->setCrs( currentVectorLayer()->crs() ); + mSnapToGridCanvasItem->setPrecision( currentVectorLayer()->geometryFixes()->geometryPrecision() ); + mSnapToGridCanvasItem->setEnabled( mSnapToGridEnabled ); } void QgsMapToolAdvancedDigitizing::deactivate() @@ -126,6 +132,8 @@ void QgsMapToolAdvancedDigitizing::deactivate() QgsMapToolEdit::deactivate(); disconnect( mCadDockWidget, &QgsAdvancedDigitizingDockWidget::pointChanged, this, &QgsMapToolAdvancedDigitizing::cadPointChanged ); mCadDockWidget->disable(); + delete mSnapToGridCanvasItem; + mSnapToGridCanvasItem = nullptr; } void QgsMapToolAdvancedDigitizing::cadPointChanged( const QgsPointXY &point ) @@ -142,5 +150,9 @@ bool QgsMapToolAdvancedDigitizing::snapToGridEnabled() const void QgsMapToolAdvancedDigitizing::setSnapToGridEnabled( bool snapToGridEnabled ) { - mSnapToGridEnabled = snapToGridEnabled; + if ( mSnapToGridCanvasItem ) + { + mSnapToGridEnabled = snapToGridEnabled; + mSnapToGridCanvasItem->setEnabled( snapToGridEnabled ); + } } diff --git a/src/gui/qgsmaptooladvanceddigitizing.h b/src/gui/qgsmaptooladvanceddigitizing.h index 732ab407f9a..72523f80fb1 100644 --- a/src/gui/qgsmaptooladvanceddigitizing.h +++ b/src/gui/qgsmaptooladvanceddigitizing.h @@ -22,6 +22,7 @@ class QgsMapMouseEvent; class QgsAdvancedDigitizingDockWidget; +class QgsSnapToGridCanvasItem; /** * \ingroup gui @@ -175,6 +176,7 @@ class GUI_EXPORT QgsMapToolAdvancedDigitizing : public QgsMapToolEdit bool mAutoSnapEnabled = true; //! Whether to snap to grid before passing coordinates to cadCanvas*Event() bool mSnapToGridEnabled = true; + QgsSnapToGridCanvasItem *mSnapToGridCanvasItem = nullptr; }; #endif // QGSMAPTOOLADVANCEDDIGITIZE_H From c2f6882a5c2eac542e7d16cb7f08808ebf62e12e Mon Sep 17 00:00:00 2001 From: Matthias Kuhn Date: Sun, 26 Aug 2018 07:05:31 +0200 Subject: [PATCH 12/23] Allow disabling snap to grid --- src/gui/qgsmaptooladvanceddigitizing.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/gui/qgsmaptooladvanceddigitizing.cpp b/src/gui/qgsmaptooladvanceddigitizing.cpp index 735ff98389e..f2f4b35be87 100644 --- a/src/gui/qgsmaptooladvanceddigitizing.cpp +++ b/src/gui/qgsmaptooladvanceddigitizing.cpp @@ -150,9 +150,10 @@ bool QgsMapToolAdvancedDigitizing::snapToGridEnabled() const void QgsMapToolAdvancedDigitizing::setSnapToGridEnabled( bool snapToGridEnabled ) { + mSnapToGridEnabled = snapToGridEnabled; + if ( mSnapToGridCanvasItem ) { - mSnapToGridEnabled = snapToGridEnabled; mSnapToGridCanvasItem->setEnabled( snapToGridEnabled ); } } From 9ad3515a0b08fe2607b8f3858253f860de79046d Mon Sep 17 00:00:00 2001 From: Matthias Kuhn Date: Sun, 26 Aug 2018 07:48:07 +0200 Subject: [PATCH 13/23] Better dox --- python/gui/auto_generated/qgsmapmouseevent.sip.in | 2 +- src/gui/qgsmapmouseevent.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/python/gui/auto_generated/qgsmapmouseevent.sip.in b/python/gui/auto_generated/qgsmapmouseevent.sip.in index a2547417550..a9063372325 100644 --- a/python/gui/auto_generated/qgsmapmouseevent.sip.in +++ b/python/gui/auto_generated/qgsmapmouseevent.sip.in @@ -123,7 +123,7 @@ Alias to pos() %Docstring Snaps the mapPoint to a grid with the given ``precision``. The snapping will be done in the specified ``crs``. If this crs is -different from the mapCanvas crs, it will add some overhead. +different from the mapCanvas crs, it will be reprojected on the fly. .. versionadded:: 3.4 %End diff --git a/src/gui/qgsmapmouseevent.h b/src/gui/qgsmapmouseevent.h index 01d143d8ff5..6b722753edf 100644 --- a/src/gui/qgsmapmouseevent.h +++ b/src/gui/qgsmapmouseevent.h @@ -129,7 +129,7 @@ class GUI_EXPORT QgsMapMouseEvent : public QMouseEvent /** * Snaps the mapPoint to a grid with the given \a precision. * The snapping will be done in the specified \a crs. If this crs is - * different from the mapCanvas crs, it will add some overhead. + * different from the mapCanvas crs, it will be reprojected on the fly. * * \since QGIS 3.4 */ From 6ae03afdfac65de20e21b59dfc4c61be0bac072e Mon Sep 17 00:00:00 2001 From: Matthias Kuhn Date: Sun, 26 Aug 2018 08:15:57 +0200 Subject: [PATCH 14/23] Add license headers --- .../auto_generated/qgssnaptogridcanvasitem.sip.in | 1 + src/gui/qgssnaptogridcanvasitem.cpp | 15 +++++++++++++++ src/gui/qgssnaptogridcanvasitem.h | 15 +++++++++++++++ 3 files changed, 31 insertions(+) diff --git a/python/gui/auto_generated/qgssnaptogridcanvasitem.sip.in b/python/gui/auto_generated/qgssnaptogridcanvasitem.sip.in index 98f4390c765..9b0cd3376d3 100644 --- a/python/gui/auto_generated/qgssnaptogridcanvasitem.sip.in +++ b/python/gui/auto_generated/qgssnaptogridcanvasitem.sip.in @@ -8,6 +8,7 @@ + class QgsSnapToGridCanvasItem : QObject, QgsMapCanvasItem { %Docstring diff --git a/src/gui/qgssnaptogridcanvasitem.cpp b/src/gui/qgssnaptogridcanvasitem.cpp index 51961211aa1..de84fc37c8d 100644 --- a/src/gui/qgssnaptogridcanvasitem.cpp +++ b/src/gui/qgssnaptogridcanvasitem.cpp @@ -1,3 +1,18 @@ +/*************************************************************************** + qgssnaptogridcanvasitem.cpp + ---------------------- + begin : August 2018 + copyright : (C) Matthias Kuhn + email : matthias@opengis.ch + *************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + #include "qgssnaptogridcanvasitem.h" #include "qgsmapcanvas.h" diff --git a/src/gui/qgssnaptogridcanvasitem.h b/src/gui/qgssnaptogridcanvasitem.h index 2eef0c255d4..daa47da2d08 100644 --- a/src/gui/qgssnaptogridcanvasitem.h +++ b/src/gui/qgssnaptogridcanvasitem.h @@ -1,3 +1,18 @@ +/*************************************************************************** + qgssnaptogridcanvasitem.h + ---------------------- + begin : August 2018 + copyright : (C) Matthias Kuhn + email : matthias@opengis.ch + *************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + #ifndef QGSSNAPTOGRIDCANVASITEM_H #define QGSSNAPTOGRIDCANVASITEM_H From 5c814cf9f325e9f641abd37253fc3bdd9a89b7f3 Mon Sep 17 00:00:00 2001 From: Matthias Kuhn Date: Sun, 26 Aug 2018 08:16:59 +0200 Subject: [PATCH 15/23] Adjust snapping options on layer change --- src/gui/qgsmaptooladvanceddigitizing.cpp | 15 +++++++++++++++ src/gui/qgsmaptooladvanceddigitizing.h | 2 ++ 2 files changed, 17 insertions(+) diff --git a/src/gui/qgsmaptooladvanceddigitizing.cpp b/src/gui/qgsmaptooladvanceddigitizing.cpp index f2f4b35be87..ef4faf0557a 100644 --- a/src/gui/qgsmaptooladvanceddigitizing.cpp +++ b/src/gui/qgsmaptooladvanceddigitizing.cpp @@ -25,6 +25,7 @@ QgsMapToolAdvancedDigitizing::QgsMapToolAdvancedDigitizing( QgsMapCanvas *canvas : QgsMapToolEdit( canvas ) , mCadDockWidget( cadDockWidget ) { + connect( canvas, &QgsMapCanvas::currentLayerChanged, this, &QgsMapToolAdvancedDigitizing::onCurrentLayerChanged ); } void QgsMapToolAdvancedDigitizing::canvasPressEvent( QgsMapMouseEvent *e ) @@ -143,6 +144,20 @@ void QgsMapToolAdvancedDigitizing::cadPointChanged( const QgsPointXY &point ) qApp->postEvent( mCanvas->viewport(), ev ); // event queue will delete the event when processed } +void QgsMapToolAdvancedDigitizing::onCurrentLayerChanged() +{ + QgsVectorLayer *layer = currentVectorLayer(); + if ( mSnapToGridCanvasItem && layer && mSnapToGridEnabled ) + { + mSnapToGridCanvasItem->setPrecision( layer->geometryFixes()->geometryPrecision() ); + mSnapToGridCanvasItem->setCrs( layer->crs() ); + mSnapToGridCanvasItem->setEnabled( true ); + } + + if ( !layer ) + mSnapToGridCanvasItem->setEnabled( false ); +} + bool QgsMapToolAdvancedDigitizing::snapToGridEnabled() const { return mSnapToGridEnabled; diff --git a/src/gui/qgsmaptooladvanceddigitizing.h b/src/gui/qgsmaptooladvanceddigitizing.h index 72523f80fb1..a0f6eab4e35 100644 --- a/src/gui/qgsmaptooladvanceddigitizing.h +++ b/src/gui/qgsmaptooladvanceddigitizing.h @@ -167,6 +167,8 @@ class GUI_EXPORT QgsMapToolAdvancedDigitizing : public QgsMapToolEdit */ void cadPointChanged( const QgsPointXY &point ); + void onCurrentLayerChanged(); + private: QgsAdvancedDigitizingDockWidget *mCadDockWidget = nullptr; From f177228f49309e8738051ea062fcd924e54850e6 Mon Sep 17 00:00:00 2001 From: Matthias Kuhn Date: Sun, 26 Aug 2018 08:20:48 +0200 Subject: [PATCH 16/23] Gracefully handle transform errors in snap to grid --- src/gui/qgsmapmouseevent.cpp | 19 +++++++---- src/gui/qgssnaptogridcanvasitem.cpp | 51 +++++++++++++++++------------ 2 files changed, 43 insertions(+), 27 deletions(-) diff --git a/src/gui/qgsmapmouseevent.cpp b/src/gui/qgsmapmouseevent.cpp index 2fff6609f14..a995a0da8b1 100644 --- a/src/gui/qgsmapmouseevent.cpp +++ b/src/gui/qgsmapmouseevent.cpp @@ -76,16 +76,23 @@ void QgsMapMouseEvent::snapToGrid( double precision, const QgsCoordinateReferenc if ( precision <= 0 ) return; - QgsCoordinateTransform ct( mMapCanvas->mapSettings().destinationCrs(), crs, mMapCanvas->mapSettings().transformContext() ); + try + { + QgsCoordinateTransform ct( mMapCanvas->mapSettings().destinationCrs(), crs, mMapCanvas->mapSettings().transformContext() ); - QgsPointXY pt = ct.transform( mMapPoint ); + QgsPointXY pt = ct.transform( mMapPoint ); - pt.setX( std::round( pt.x() / precision ) * precision ); - pt.setY( std::round( pt.y() / precision ) * precision ); + pt.setX( std::round( pt.x() / precision ) * precision ); + pt.setY( std::round( pt.y() / precision ) * precision ); - pt = ct.transform( pt, QgsCoordinateTransform::ReverseTransform ); + pt = ct.transform( pt, QgsCoordinateTransform::ReverseTransform ); - setMapPoint( pt ); + setMapPoint( pt ); + } + catch ( QgsCsException &e ) + { + Q_UNUSED( e ) + } } QPoint QgsMapMouseEvent::mapToPixelCoordinates( const QgsPointXY &point ) diff --git a/src/gui/qgssnaptogridcanvasitem.cpp b/src/gui/qgssnaptogridcanvasitem.cpp index de84fc37c8d..0d37585d1c5 100644 --- a/src/gui/qgssnaptogridcanvasitem.cpp +++ b/src/gui/qgssnaptogridcanvasitem.cpp @@ -38,33 +38,42 @@ void QgsSnapToGridCanvasItem::paint( QPainter *painter ) if ( mEnabled && mAvailableByZoomFactor ) { - const QgsRectangle layerExtent = mTransform.transformBoundingBox( mapRect, QgsCoordinateTransform::ReverseTransform ); - const QgsPointXY layerPt = mTransform.transform( mPoint, QgsCoordinateTransform::ReverseTransform ); - - const double gridXMin = std::ceil( layerExtent.xMinimum() / mPrecision ) * mPrecision; - const double gridXMax = std::ceil( layerExtent.xMaximum() / mPrecision ) * mPrecision; - const double gridYMin = std::ceil( layerExtent.yMinimum() / mPrecision ) * mPrecision; - const double gridYMax = std::ceil( layerExtent.yMaximum() / mPrecision ) * mPrecision; - - for ( int x = gridXMin ; x < gridXMax; x += mPrecision ) + try { - for ( int y = gridYMin ; y < gridYMax; y += mPrecision ) - { - const QgsPointXY pt = mTransform.transform( x, y ); - const QPointF canvasPt = toCanvasCoordinates( pt ); + const QgsRectangle layerExtent = mTransform.transformBoundingBox( mapRect, QgsCoordinateTransform::ReverseTransform ); + const QgsPointXY layerPt = mTransform.transform( mPoint, QgsCoordinateTransform::ReverseTransform ); - if ( qgsDoubleNear( layerPt.x(), x, mPrecision / 3 ) && qgsDoubleNear( layerPt.y(), y, mPrecision / 3 ) ) + const double gridXMin = std::ceil( layerExtent.xMinimum() / mPrecision ) * mPrecision; + const double gridXMax = std::ceil( layerExtent.xMaximum() / mPrecision ) * mPrecision; + const double gridYMin = std::ceil( layerExtent.yMinimum() / mPrecision ) * mPrecision; + const double gridYMax = std::ceil( layerExtent.yMaximum() / mPrecision ) * mPrecision; + + for ( int x = gridXMin ; x < gridXMax; x += mPrecision ) + { + for ( int y = gridYMin ; y < gridYMax; y += mPrecision ) { - painter->setPen( mCurrentPointPen ); + const QgsPointXY pt = mTransform.transform( x, y ); + const QPointF canvasPt = toCanvasCoordinates( pt ); + + if ( qgsDoubleNear( layerPt.x(), x, mPrecision / 3 ) && qgsDoubleNear( layerPt.y(), y, mPrecision / 3 ) ) + { + painter->setPen( mCurrentPointPen ); + } + else + { + painter->setPen( mGridPen ); + } + painter->drawLine( canvasPt.x() - 3, canvasPt.y(), canvasPt.x() + 3, canvasPt.y() ); + painter->drawLine( canvasPt.x(), canvasPt.y() - 3, canvasPt.x(), canvasPt.y() + 3 ); + } - else - { - painter->setPen( mGridPen ); - } - painter->drawLine( canvasPt.x() - 3, canvasPt.y(), canvasPt.x() + 3, canvasPt.y() ); - painter->drawLine( canvasPt.x(), canvasPt.y() - 3, canvasPt.x(), canvasPt.y() + 3 ); } } + catch ( QgsCsException &e ) + { + Q_UNUSED( e ) + mAvailableByZoomFactor = false; + } } painter->restore(); From 212cd20791bfb43236dcad87a40da5fc528146e3 Mon Sep 17 00:00:00 2001 From: Matthias Kuhn Date: Sun, 26 Aug 2018 09:20:58 +0200 Subject: [PATCH 17/23] Transfer ownership of item --- python/gui/auto_generated/qgssnaptogridcanvasitem.sip.in | 2 +- src/gui/qgssnaptogridcanvasitem.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/python/gui/auto_generated/qgssnaptogridcanvasitem.sip.in b/python/gui/auto_generated/qgssnaptogridcanvasitem.sip.in index 9b0cd3376d3..d96a871c242 100644 --- a/python/gui/auto_generated/qgssnaptogridcanvasitem.sip.in +++ b/python/gui/auto_generated/qgssnaptogridcanvasitem.sip.in @@ -23,7 +23,7 @@ Shows a grid on the map canvas given a spatial resolution. %End public: - QgsSnapToGridCanvasItem( QgsMapCanvas *mapCanvas ); + QgsSnapToGridCanvasItem( QgsMapCanvas *mapCanvas /TransferThis/ ); %Docstring Will automatically be added to the ``mapCanvas``. %End diff --git a/src/gui/qgssnaptogridcanvasitem.h b/src/gui/qgssnaptogridcanvasitem.h index daa47da2d08..6af17dce14a 100644 --- a/src/gui/qgssnaptogridcanvasitem.h +++ b/src/gui/qgssnaptogridcanvasitem.h @@ -39,7 +39,7 @@ class GUI_EXPORT QgsSnapToGridCanvasItem : public QObject, public QgsMapCanvasIt /** * Will automatically be added to the \a mapCanvas. */ - QgsSnapToGridCanvasItem( QgsMapCanvas *mapCanvas ); + QgsSnapToGridCanvasItem( QgsMapCanvas *mapCanvas SIP_TRANSFERTHIS ); void paint( QPainter *painter ) override; From 652737dd8108389019cf49eb065c1f5994d44bc8 Mon Sep 17 00:00:00 2001 From: Matthias Kuhn Date: Sun, 26 Aug 2018 10:14:32 +0200 Subject: [PATCH 18/23] Revert "Call direct parent method" This reverts commit e6c65c434c97139a7da1322c9fd23b79fed66969. --- src/app/qgsmaptooladdpart.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/qgsmaptooladdpart.cpp b/src/app/qgsmaptooladdpart.cpp index fb742dcdcc4..6660a56e546 100644 --- a/src/app/qgsmaptooladdpart.cpp +++ b/src/app/qgsmaptooladdpart.cpp @@ -39,7 +39,7 @@ void QgsMapToolAddPart::canvasReleaseEvent( QgsMapMouseEvent *e ) { if ( checkSelection() ) { - QgsMapToolCapture::canvasReleaseEvent( e ); + QgsMapToolAdvancedDigitizing::canvasReleaseEvent( e ); } else { From ac8eab2fbb2b3bfa7e6fa251119e998a56276d46 Mon Sep 17 00:00:00 2001 From: Matthias Kuhn Date: Sun, 26 Aug 2018 10:24:34 +0200 Subject: [PATCH 19/23] Guard against layer nullptr --- src/gui/qgsmaptooladvanceddigitizing.cpp | 28 +++++++++++++++--------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/src/gui/qgsmaptooladvanceddigitizing.cpp b/src/gui/qgsmaptooladvanceddigitizing.cpp index ef4faf0557a..eb43bdb5b13 100644 --- a/src/gui/qgsmaptooladvanceddigitizing.cpp +++ b/src/gui/qgsmaptooladvanceddigitizing.cpp @@ -123,8 +123,12 @@ void QgsMapToolAdvancedDigitizing::activate() connect( mCadDockWidget, &QgsAdvancedDigitizingDockWidget::pointChanged, this, &QgsMapToolAdvancedDigitizing::cadPointChanged ); mCadDockWidget->enable(); mSnapToGridCanvasItem = new QgsSnapToGridCanvasItem( mCanvas ); - mSnapToGridCanvasItem->setCrs( currentVectorLayer()->crs() ); - mSnapToGridCanvasItem->setPrecision( currentVectorLayer()->geometryFixes()->geometryPrecision() ); + QgsVectorLayer *layer = currentVectorLayer(); + if ( layer ) + { + mSnapToGridCanvasItem->setCrs( currentVectorLayer()->crs() ); + mSnapToGridCanvasItem->setPrecision( currentVectorLayer()->geometryFixes()->geometryPrecision() ); + } mSnapToGridCanvasItem->setEnabled( mSnapToGridEnabled ); } @@ -146,16 +150,20 @@ void QgsMapToolAdvancedDigitizing::cadPointChanged( const QgsPointXY &point ) void QgsMapToolAdvancedDigitizing::onCurrentLayerChanged() { - QgsVectorLayer *layer = currentVectorLayer(); - if ( mSnapToGridCanvasItem && layer && mSnapToGridEnabled ) + if ( mSnapToGridCanvasItem ) { - mSnapToGridCanvasItem->setPrecision( layer->geometryFixes()->geometryPrecision() ); - mSnapToGridCanvasItem->setCrs( layer->crs() ); - mSnapToGridCanvasItem->setEnabled( true ); - } + QgsVectorLayer *layer = currentVectorLayer(); + if ( layer && mSnapToGridEnabled ) + { + mSnapToGridCanvasItem->setPrecision( layer->geometryFixes()->geometryPrecision() ); + mSnapToGridCanvasItem->setCrs( layer->crs() ); + } - if ( !layer ) - mSnapToGridCanvasItem->setEnabled( false ); + if ( !layer ) + mSnapToGridCanvasItem->setEnabled( false ); + else + mSnapToGridCanvasItem->setEnabled( mSnapToGridEnabled ); + } } bool QgsMapToolAdvancedDigitizing::snapToGridEnabled() const From 3744043a684d8bb0c5ec9d52b9c77dac8de13aee Mon Sep 17 00:00:00 2001 From: Matthias Kuhn Date: Mon, 27 Aug 2018 09:13:50 +0200 Subject: [PATCH 20/23] Early exit if snap to grid item is disabled --- src/gui/qgssnaptogridcanvasitem.cpp | 62 ++++++++++++++--------------- 1 file changed, 31 insertions(+), 31 deletions(-) diff --git a/src/gui/qgssnaptogridcanvasitem.cpp b/src/gui/qgssnaptogridcanvasitem.cpp index 0d37585d1c5..85cf190df80 100644 --- a/src/gui/qgssnaptogridcanvasitem.cpp +++ b/src/gui/qgssnaptogridcanvasitem.cpp @@ -28,6 +28,9 @@ QgsSnapToGridCanvasItem::QgsSnapToGridCanvasItem( QgsMapCanvas *mapCanvas ) void QgsSnapToGridCanvasItem::paint( QPainter *painter ) { + if ( !mEnabled || !mAvailableByZoomFactor ) + return; + painter->save(); QgsRectangle mapRect = mMapCanvas->extent(); if ( rect() != mapRect ) @@ -36,44 +39,41 @@ void QgsSnapToGridCanvasItem::paint( QPainter *painter ) painter->setRenderHints( QPainter::Antialiasing ); painter->setCompositionMode( QPainter::CompositionMode_Difference ); - if ( mEnabled && mAvailableByZoomFactor ) + try { - try + const QgsRectangle layerExtent = mTransform.transformBoundingBox( mapRect, QgsCoordinateTransform::ReverseTransform ); + const QgsPointXY layerPt = mTransform.transform( mPoint, QgsCoordinateTransform::ReverseTransform ); + + const double gridXMin = std::ceil( layerExtent.xMinimum() / mPrecision ) * mPrecision; + const double gridXMax = std::ceil( layerExtent.xMaximum() / mPrecision ) * mPrecision; + const double gridYMin = std::ceil( layerExtent.yMinimum() / mPrecision ) * mPrecision; + const double gridYMax = std::ceil( layerExtent.yMaximum() / mPrecision ) * mPrecision; + + for ( int x = gridXMin ; x < gridXMax; x += mPrecision ) { - const QgsRectangle layerExtent = mTransform.transformBoundingBox( mapRect, QgsCoordinateTransform::ReverseTransform ); - const QgsPointXY layerPt = mTransform.transform( mPoint, QgsCoordinateTransform::ReverseTransform ); - - const double gridXMin = std::ceil( layerExtent.xMinimum() / mPrecision ) * mPrecision; - const double gridXMax = std::ceil( layerExtent.xMaximum() / mPrecision ) * mPrecision; - const double gridYMin = std::ceil( layerExtent.yMinimum() / mPrecision ) * mPrecision; - const double gridYMax = std::ceil( layerExtent.yMaximum() / mPrecision ) * mPrecision; - - for ( int x = gridXMin ; x < gridXMax; x += mPrecision ) + for ( int y = gridYMin ; y < gridYMax; y += mPrecision ) { - for ( int y = gridYMin ; y < gridYMax; y += mPrecision ) + const QgsPointXY pt = mTransform.transform( x, y ); + const QPointF canvasPt = toCanvasCoordinates( pt ); + + if ( qgsDoubleNear( layerPt.x(), x, mPrecision / 3 ) && qgsDoubleNear( layerPt.y(), y, mPrecision / 3 ) ) { - const QgsPointXY pt = mTransform.transform( x, y ); - const QPointF canvasPt = toCanvasCoordinates( pt ); - - if ( qgsDoubleNear( layerPt.x(), x, mPrecision / 3 ) && qgsDoubleNear( layerPt.y(), y, mPrecision / 3 ) ) - { - painter->setPen( mCurrentPointPen ); - } - else - { - painter->setPen( mGridPen ); - } - painter->drawLine( canvasPt.x() - 3, canvasPt.y(), canvasPt.x() + 3, canvasPt.y() ); - painter->drawLine( canvasPt.x(), canvasPt.y() - 3, canvasPt.x(), canvasPt.y() + 3 ); - + painter->setPen( mCurrentPointPen ); } + else + { + painter->setPen( mGridPen ); + } + painter->drawLine( canvasPt.x() - 3, canvasPt.y(), canvasPt.x() + 3, canvasPt.y() ); + painter->drawLine( canvasPt.x(), canvasPt.y() - 3, canvasPt.x(), canvasPt.y() + 3 ); + } } - catch ( QgsCsException &e ) - { - Q_UNUSED( e ) - mAvailableByZoomFactor = false; - } + } + catch ( QgsCsException &e ) + { + Q_UNUSED( e ) + mAvailableByZoomFactor = false; } painter->restore(); From b5371b282af5ad7d41dc8f16026ea11354ba31e2 Mon Sep 17 00:00:00 2001 From: Matthias Kuhn Date: Mon, 27 Aug 2018 09:44:15 +0200 Subject: [PATCH 21/23] Move initialization to header --- src/gui/qgssnaptogridcanvasitem.cpp | 2 -- src/gui/qgssnaptogridcanvasitem.h | 4 ++-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/gui/qgssnaptogridcanvasitem.cpp b/src/gui/qgssnaptogridcanvasitem.cpp index 85cf190df80..76e98e6b012 100644 --- a/src/gui/qgssnaptogridcanvasitem.cpp +++ b/src/gui/qgssnaptogridcanvasitem.cpp @@ -18,8 +18,6 @@ QgsSnapToGridCanvasItem::QgsSnapToGridCanvasItem( QgsMapCanvas *mapCanvas ) : QgsMapCanvasItem( mapCanvas ) - , mGridPen( QPen( QColor( 127, 127, 127, 150 ), 1 ) ) - , mCurrentPointPen( QPen( QColor( 200, 200, 200, 150 ), 3 ) ) { updateMapCanvasCrs(); connect( mMapCanvas, &QgsMapCanvas::extentsChanged, this, &QgsSnapToGridCanvasItem::updateZoomFactor ); diff --git a/src/gui/qgssnaptogridcanvasitem.h b/src/gui/qgssnaptogridcanvasitem.h index 6af17dce14a..31d35da2440 100644 --- a/src/gui/qgssnaptogridcanvasitem.h +++ b/src/gui/qgssnaptogridcanvasitem.h @@ -99,8 +99,8 @@ class GUI_EXPORT QgsSnapToGridCanvasItem : public QObject, public QgsMapCanvasIt void updateZoomFactor(); private: - QPen mGridPen; - QPen mCurrentPointPen; + QPen mGridPen = QPen( QColor( 127, 127, 127, 150 ) ); + QPen mCurrentPointPen = QPen( QColor( 200, 200, 200, 150 ) ); bool mEnabled = true; bool mAvailableByZoomFactor = false; From 790c36796a1c4ef93342759ce4fd09bfc0942594 Mon Sep 17 00:00:00 2001 From: Matthias Kuhn Date: Mon, 27 Aug 2018 09:44:33 +0200 Subject: [PATCH 22/23] Use fontMetrics to scale grid markers --- src/gui/qgssnaptogridcanvasitem.cpp | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/gui/qgssnaptogridcanvasitem.cpp b/src/gui/qgssnaptogridcanvasitem.cpp index 76e98e6b012..6b677bb83fc 100644 --- a/src/gui/qgssnaptogridcanvasitem.cpp +++ b/src/gui/qgssnaptogridcanvasitem.cpp @@ -37,6 +37,12 @@ void QgsSnapToGridCanvasItem::paint( QPainter *painter ) painter->setRenderHints( QPainter::Antialiasing ); painter->setCompositionMode( QPainter::CompositionMode_Difference ); + double scaleFactor = painter->fontMetrics().xHeight() * .2; + + mGridPen.setWidth( scaleFactor ); + mCurrentPointPen.setWidth( scaleFactor * 3 ); + const int gridMarkerLength = scaleFactor * 3; + try { const QgsRectangle layerExtent = mTransform.transformBoundingBox( mapRect, QgsCoordinateTransform::ReverseTransform ); @@ -54,7 +60,7 @@ void QgsSnapToGridCanvasItem::paint( QPainter *painter ) const QgsPointXY pt = mTransform.transform( x, y ); const QPointF canvasPt = toCanvasCoordinates( pt ); - if ( qgsDoubleNear( layerPt.x(), x, mPrecision / 3 ) && qgsDoubleNear( layerPt.y(), y, mPrecision / 3 ) ) + if ( qgsDoubleNear( layerPt.x(), x, mPrecision / 2 ) && qgsDoubleNear( layerPt.y(), y, mPrecision / 2 ) ) { painter->setPen( mCurrentPointPen ); } @@ -62,8 +68,8 @@ void QgsSnapToGridCanvasItem::paint( QPainter *painter ) { painter->setPen( mGridPen ); } - painter->drawLine( canvasPt.x() - 3, canvasPt.y(), canvasPt.x() + 3, canvasPt.y() ); - painter->drawLine( canvasPt.x(), canvasPt.y() - 3, canvasPt.x(), canvasPt.y() + 3 ); + painter->drawLine( canvasPt.x() - gridMarkerLength, canvasPt.y(), canvasPt.x() + gridMarkerLength, canvasPt.y() ); + painter->drawLine( canvasPt.x(), canvasPt.y() - gridMarkerLength, canvasPt.x(), canvasPt.y() + gridMarkerLength ); } } From d57c1842b728ae71c958977d0f57d377160859d2 Mon Sep 17 00:00:00 2001 From: Matthias Kuhn Date: Fri, 7 Sep 2018 16:21:37 +0200 Subject: [PATCH 23/23] Rename snapToGridEnabled to snapToLayerGridEnabled --- .../qgsmaptooladvanceddigitizing.sip.in | 6 ++++-- src/app/qgsmaptoolsplitfeatures.cpp | 2 +- src/app/qgsmaptoolsplitparts.cpp | 2 +- src/gui/qgsmaptooladvanceddigitizing.cpp | 20 +++++++++---------- src/gui/qgsmaptooladvanceddigitizing.h | 8 +++++--- 5 files changed, 21 insertions(+), 17 deletions(-) diff --git a/python/gui/auto_generated/qgsmaptooladvanceddigitizing.sip.in b/python/gui/auto_generated/qgsmaptooladvanceddigitizing.sip.in index 8754c4fee99..e011743e596 100644 --- a/python/gui/auto_generated/qgsmaptooladvanceddigitizing.sip.in +++ b/python/gui/auto_generated/qgsmaptooladvanceddigitizing.sip.in @@ -151,16 +151,18 @@ construction mode. :param e: Mouse events prepared by the cad system %End - bool snapToGridEnabled() const; + bool snapToLayerGridEnabled() const; %Docstring Enables or disables snap to grid of mouse events. +The snapping will occur in the layer's CRS. .. versionadded:: 3.4 %End - void setSnapToGridEnabled( bool snapToGridEnabled ); + void setSnapToLayerGridEnabled( bool snapToLayerGridEnabled ); %Docstring Enables or disables snap to grid of mouse events. +The snapping will occur in the layer's CRS. .. versionadded:: 3.4 %End diff --git a/src/app/qgsmaptoolsplitfeatures.cpp b/src/app/qgsmaptoolsplitfeatures.cpp index ec45015bfb8..7dc2ff0176e 100644 --- a/src/app/qgsmaptoolsplitfeatures.cpp +++ b/src/app/qgsmaptoolsplitfeatures.cpp @@ -27,7 +27,7 @@ QgsMapToolSplitFeatures::QgsMapToolSplitFeatures( QgsMapCanvas *canvas ) : QgsMapToolCapture( canvas, QgisApp::instance()->cadDockWidget(), QgsMapToolCapture::CaptureLine ) { mToolName = tr( "Split features" ); - setSnapToGridEnabled( false ); + setSnapToLayerGridEnabled( false ); } void QgsMapToolSplitFeatures::cadCanvasReleaseEvent( QgsMapMouseEvent *e ) diff --git a/src/app/qgsmaptoolsplitparts.cpp b/src/app/qgsmaptoolsplitparts.cpp index f73bf15431c..b2adf1edccb 100644 --- a/src/app/qgsmaptoolsplitparts.cpp +++ b/src/app/qgsmaptoolsplitparts.cpp @@ -27,7 +27,7 @@ QgsMapToolSplitParts::QgsMapToolSplitParts( QgsMapCanvas *canvas ) : QgsMapToolCapture( canvas, QgisApp::instance()->cadDockWidget(), QgsMapToolCapture::CaptureLine ) { mToolName = tr( "Split parts" ); - setSnapToGridEnabled( false ); + setSnapToLayerGridEnabled( false ); } void QgsMapToolSplitParts::cadCanvasReleaseEvent( QgsMapMouseEvent *e ) diff --git a/src/gui/qgsmaptooladvanceddigitizing.cpp b/src/gui/qgsmaptooladvanceddigitizing.cpp index eb43bdb5b13..e620fe555f2 100644 --- a/src/gui/qgsmaptooladvanceddigitizing.cpp +++ b/src/gui/qgsmaptooladvanceddigitizing.cpp @@ -43,7 +43,7 @@ void QgsMapToolAdvancedDigitizing::canvasPressEvent( QgsMapMouseEvent *e ) } QgsVectorLayer *layer = currentVectorLayer(); - if ( mSnapToGridEnabled && layer ) + if ( mSnapToLayerGridEnabled && layer ) { e->snapToGrid( layer->geometryFixes()->geometryPrecision(), layer->crs() ); } @@ -83,7 +83,7 @@ void QgsMapToolAdvancedDigitizing::canvasReleaseEvent( QgsMapMouseEvent *e ) } QgsVectorLayer *layer = currentVectorLayer(); - if ( mSnapToGridEnabled && layer ) + if ( mSnapToLayerGridEnabled && layer ) { e->snapToGrid( layer->geometryFixes()->geometryPrecision(), layer->crs() ); } @@ -108,7 +108,7 @@ void QgsMapToolAdvancedDigitizing::canvasMoveEvent( QgsMapMouseEvent *e ) } QgsVectorLayer *layer = currentVectorLayer(); - if ( mSnapToGridEnabled && layer ) + if ( mSnapToLayerGridEnabled && layer ) { e->snapToGrid( layer->geometryFixes()->geometryPrecision(), layer->crs() ); mSnapToGridCanvasItem->setPoint( e->mapPoint() ); @@ -129,7 +129,7 @@ void QgsMapToolAdvancedDigitizing::activate() mSnapToGridCanvasItem->setCrs( currentVectorLayer()->crs() ); mSnapToGridCanvasItem->setPrecision( currentVectorLayer()->geometryFixes()->geometryPrecision() ); } - mSnapToGridCanvasItem->setEnabled( mSnapToGridEnabled ); + mSnapToGridCanvasItem->setEnabled( mSnapToLayerGridEnabled ); } void QgsMapToolAdvancedDigitizing::deactivate() @@ -153,7 +153,7 @@ void QgsMapToolAdvancedDigitizing::onCurrentLayerChanged() if ( mSnapToGridCanvasItem ) { QgsVectorLayer *layer = currentVectorLayer(); - if ( layer && mSnapToGridEnabled ) + if ( layer && mSnapToLayerGridEnabled ) { mSnapToGridCanvasItem->setPrecision( layer->geometryFixes()->geometryPrecision() ); mSnapToGridCanvasItem->setCrs( layer->crs() ); @@ -162,18 +162,18 @@ void QgsMapToolAdvancedDigitizing::onCurrentLayerChanged() if ( !layer ) mSnapToGridCanvasItem->setEnabled( false ); else - mSnapToGridCanvasItem->setEnabled( mSnapToGridEnabled ); + mSnapToGridCanvasItem->setEnabled( mSnapToLayerGridEnabled ); } } -bool QgsMapToolAdvancedDigitizing::snapToGridEnabled() const +bool QgsMapToolAdvancedDigitizing::snapToLayerGridEnabled() const { - return mSnapToGridEnabled; + return mSnapToLayerGridEnabled; } -void QgsMapToolAdvancedDigitizing::setSnapToGridEnabled( bool snapToGridEnabled ) +void QgsMapToolAdvancedDigitizing::setSnapToLayerGridEnabled( bool snapToGridEnabled ) { - mSnapToGridEnabled = snapToGridEnabled; + mSnapToLayerGridEnabled = snapToGridEnabled; if ( mSnapToGridCanvasItem ) { diff --git a/src/gui/qgsmaptooladvanceddigitizing.h b/src/gui/qgsmaptooladvanceddigitizing.h index a0f6eab4e35..a0a659bf770 100644 --- a/src/gui/qgsmaptooladvanceddigitizing.h +++ b/src/gui/qgsmaptooladvanceddigitizing.h @@ -143,17 +143,19 @@ class GUI_EXPORT QgsMapToolAdvancedDigitizing : public QgsMapToolEdit /** * Enables or disables snap to grid of mouse events. + * The snapping will occur in the layer's CRS. * * \since QGIS 3.4 */ - bool snapToGridEnabled() const; + bool snapToLayerGridEnabled() const; /** * Enables or disables snap to grid of mouse events. + * The snapping will occur in the layer's CRS. * * \since QGIS 3.4 */ - void setSnapToGridEnabled( bool snapToGridEnabled ); + void setSnapToLayerGridEnabled( bool snapToLayerGridEnabled ); private slots: @@ -177,7 +179,7 @@ class GUI_EXPORT QgsMapToolAdvancedDigitizing : public QgsMapToolEdit //! Whether to snap mouse cursor to map before passing coordinates to cadCanvas*Event() bool mAutoSnapEnabled = true; //! Whether to snap to grid before passing coordinates to cadCanvas*Event() - bool mSnapToGridEnabled = true; + bool mSnapToLayerGridEnabled = true; QgsSnapToGridCanvasItem *mSnapToGridCanvasItem = nullptr; };