From ae713b4c810163f591c3dcf80df1b5afa36bd408 Mon Sep 17 00:00:00 2001 From: Martin Dobias Date: Wed, 6 Sep 2017 14:42:27 +0200 Subject: [PATCH] Move snapSegment() from map mouse event to private area of CAD dock --- doc/api_break.dox | 3 +- python/gui/qgsmapmouseevent.sip | 10 ---- src/gui/qgsadvanceddigitizingdockwidget.cpp | 51 +++++++++++++++++- src/gui/qgsadvanceddigitizingdockwidget.h | 8 +++ src/gui/qgsmapmouseevent.cpp | 58 --------------------- src/gui/qgsmapmouseevent.h | 9 ---- 6 files changed, 59 insertions(+), 80 deletions(-) diff --git a/doc/api_break.dox b/doc/api_break.dox index e11eba684ae..db0152aa918 100644 --- a/doc/api_break.dox +++ b/doc/api_break.dox @@ -1577,7 +1577,8 @@ QgsMapMouseEvent {#qgis_api_break_3_0_QgsMapMouseEvent} ---------------- - SnappingMode enum was removed. -- snapPoint() and snapSegment() do not take SnappingMode argument anymore. Snapping is done according to project's snapping configuration. +- snapPoint() does not take SnappingMode argument anymore. Snapping is done according to project's snapping configuration. +- snapSegment() was removed. QgsMapOverviewCanvas {#qgis_api_break_3_0_QgsMapOverviewCanvas} diff --git a/python/gui/qgsmapmouseevent.sip b/python/gui/qgsmapmouseevent.sip index 89e3e8cb1cc..d079bbdea7b 100644 --- a/python/gui/qgsmapmouseevent.sip +++ b/python/gui/qgsmapmouseevent.sip @@ -61,16 +61,6 @@ class QgsMapMouseEvent : QMouseEvent :rtype: QgsPointXY %End - QList snapSegment( bool *snapped = 0, bool allLayers = false ) const; -%Docstring - Returns the first snapped segment. If the cached snapped match is a segment, it will simply return it. - Otherwise it will try to snap a segment according to the event's snapping mode. In this case the cache - will not be overwritten. - \param snapped if given, determines if a segment has been snapped - \param allLayers if true, override snapping mode - :rtype: list of QgsPointXY -%End - bool isSnapped() const; %Docstring Returns true if there is a snapped point cached. diff --git a/src/gui/qgsadvanceddigitizingdockwidget.cpp b/src/gui/qgsadvanceddigitizingdockwidget.cpp index 553400414c7..99577f98845 100644 --- a/src/gui/qgsadvanceddigitizingdockwidget.cpp +++ b/src/gui/qgsadvanceddigitizingdockwidget.cpp @@ -30,12 +30,16 @@ #include "qgslinestring.h" #include "qgsfocuswatcher.h" #include "qgssettings.h" +#include "qgssnappingutils.h" #include "qgsproject.h" +/// @cond PRIVATE struct EdgesOnlyFilter : public QgsPointLocator::MatchFilter { bool acceptMatch( const QgsPointLocator::Match &m ) override { return m.hasEdge(); } }; +/// @endcond + bool QgsAdvancedDigitizingDockWidget::lineCircleIntersection( const QgsPointXY ¢er, const double radius, const QList &segment, QgsPointXY &intersection ) { @@ -571,7 +575,7 @@ bool QgsAdvancedDigitizingDockWidget::applyConstraints( QgsMapMouseEvent *e ) QgsPointXY point = e->snapPoint(); - mSnappedSegment = e->snapSegment(); + mSnappedSegment = snapSegment( e->originalMapPoint() ); bool previousPointExist, penulPointExist; QgsPointXY previousPt = previousPoint( &previousPointExist ); @@ -864,6 +868,49 @@ bool QgsAdvancedDigitizingDockWidget::applyConstraints( QgsMapMouseEvent *e ) } + +QList QgsAdvancedDigitizingDockWidget::snapSegment( const QgsPointXY &originalMapPoint, bool *snapped, bool allLayers ) const +{ + QList segment; + QgsPointXY pt1, pt2; + QgsPointLocator::Match match; + + if ( !allLayers ) + { + // run snapToMap with only segments + EdgesOnlyFilter filter; + match = mMapCanvas->snappingUtils()->snapToMap( originalMapPoint, &filter ); + } + else + { + // run snapToMap with only edges on all layers + QgsSnappingUtils *snappingUtils = mMapCanvas->snappingUtils(); + + QgsSnappingConfig canvasConfig = snappingUtils->config(); + QgsSnappingConfig localConfig = snappingUtils->config(); + + localConfig.setMode( QgsSnappingConfig::AllLayers ); + localConfig.setType( QgsSnappingConfig::Segment ); + snappingUtils->setConfig( localConfig ); + + match = snappingUtils->snapToMap( originalMapPoint ); + + snappingUtils->setConfig( canvasConfig ); + } + if ( match.isValid() && match.hasEdge() ) + { + match.edgePoints( pt1, pt2 ); + segment << pt1 << pt2; + } + + if ( snapped ) + { + *snapped = segment.count() == 2; + } + + return segment; +} + bool QgsAdvancedDigitizingDockWidget::alignToSegment( QgsMapMouseEvent *e, CadConstraint::LockMode lockMode ) { if ( mAdditionalConstraint == NoConstraint ) @@ -874,7 +921,7 @@ bool QgsAdvancedDigitizingDockWidget::alignToSegment( QgsMapMouseEvent *e, CadCo bool previousPointExist, penulPointExist, snappedSegmentExist; QgsPointXY previousPt = previousPoint( &previousPointExist ); QgsPointXY penultimatePt = penultimatePoint( &penulPointExist ); - mSnappedSegment = e->snapSegment( &snappedSegmentExist, true ); + mSnappedSegment = snapSegment( e->originalMapPoint(), &snappedSegmentExist, true ); if ( !previousPointExist || !snappedSegmentExist ) { diff --git a/src/gui/qgsadvanceddigitizingdockwidget.h b/src/gui/qgsadvanceddigitizingdockwidget.h index 5f369345cd3..d98638c7157 100644 --- a/src/gui/qgsadvanceddigitizingdockwidget.h +++ b/src/gui/qgsadvanceddigitizingdockwidget.h @@ -408,6 +408,14 @@ class GUI_EXPORT QgsAdvancedDigitizingDockWidget : public QgsDockWidget, private //! If additional constraints are used, this will determine the angle to be locked depending on the snapped segment. bool alignToSegment( QgsMapMouseEvent *e, CadConstraint::LockMode lockMode = CadConstraint::HardLock ); + /** + * Returns the first snapped segment. Will try to snap a segment according to the event's snapping mode. + * \param originalMapPoint point to be snapped (in map coordinates) + * \param snapped if given, determines if a segment has been snapped + * \param allLayers if true, override snapping mode + */ + QList snapSegment( const QgsPointXY &originalMapPoint, bool *snapped = nullptr, bool allLayers = false ) const; + //! add point to the CAD point list void addPoint( const QgsPointXY &point ); //! update the current point in the CAD point list diff --git a/src/gui/qgsmapmouseevent.cpp b/src/gui/qgsmapmouseevent.cpp index 6ba92548623..ac60a876629 100644 --- a/src/gui/qgsmapmouseevent.cpp +++ b/src/gui/qgsmapmouseevent.cpp @@ -20,13 +20,6 @@ #include "qgssnappingutils.h" #include "qgssnappingconfig.h" -/// @cond PRIVATE -struct EdgesOnlyFilter : public QgsPointLocator::MatchFilter -{ - bool acceptMatch( const QgsPointLocator::Match &m ) override { return m.hasEdge(); } -}; -/// @endcond - QgsMapMouseEvent::QgsMapMouseEvent( QgsMapCanvas *mapCanvas, QMouseEvent *event ) : QMouseEvent( event->type(), event->pos(), event->button(), event->buttons(), event->modifiers() ) , mHasCachedSnapResult( false ) @@ -72,57 +65,6 @@ QgsPointXY QgsMapMouseEvent::snapPoint() return mMapPoint; } -QList QgsMapMouseEvent::snapSegment( bool *snapped, bool allLayers ) const -{ - QList segment; - QgsPointXY pt1, pt2; - - // If there's a cached snapping result we use it - if ( mHasCachedSnapResult && mSnapMatch.hasEdge() ) - { - mSnapMatch.edgePoints( pt1, pt2 ); - segment << pt1 << pt2; - } - else - { - QgsPointLocator::Match match; - if ( !allLayers ) - { - // run snapToMap with only segments - EdgesOnlyFilter filter; - match = mMapCanvas->snappingUtils()->snapToMap( mOriginalMapPoint, &filter ); - } - else - { - // run snapToMap with only edges on all layers - QgsSnappingUtils *snappingUtils = mMapCanvas->snappingUtils(); - - QgsSnappingConfig canvasConfig = snappingUtils->config(); - QgsSnappingConfig localConfig = snappingUtils->config(); - - localConfig.setMode( QgsSnappingConfig::AllLayers ); - localConfig.setType( QgsSnappingConfig::Segment ); - snappingUtils->setConfig( localConfig ); - - match = snappingUtils->snapToMap( mOriginalMapPoint ); - - snappingUtils->setConfig( canvasConfig ); - } - if ( match.isValid() && match.hasEdge() ) - { - match.edgePoints( pt1, pt2 ); - segment << pt1 << pt2; - } - } - - if ( snapped ) - { - *snapped = segment.count() == 2; - } - - return segment; -} - void QgsMapMouseEvent::setMapPoint( const QgsPointXY &point ) { mMapPoint = point; diff --git a/src/gui/qgsmapmouseevent.h b/src/gui/qgsmapmouseevent.h index 5782209a0d7..22ed77b1f9a 100644 --- a/src/gui/qgsmapmouseevent.h +++ b/src/gui/qgsmapmouseevent.h @@ -72,15 +72,6 @@ class GUI_EXPORT QgsMapMouseEvent : public QMouseEvent */ QgsPointXY snapPoint(); - /** - * Returns the first snapped segment. If the cached snapped match is a segment, it will simply return it. - * Otherwise it will try to snap a segment according to the event's snapping mode. In this case the cache - * will not be overwritten. - * \param snapped if given, determines if a segment has been snapped - * \param allLayers if true, override snapping mode - */ - QList snapSegment( bool *snapped = nullptr, bool allLayers = false ) const; - /** * Returns true if there is a snapped point cached. * Will only be useful after snapPoint has previously been called.