30
30
#include " qgslinestring.h"
31
31
#include " qgsfocuswatcher.h"
32
32
#include " qgssettings.h"
33
+ #include " qgssnappingutils.h"
33
34
#include " qgsproject.h"
34
35
36
+ // / @cond PRIVATE
35
37
struct EdgesOnlyFilter : public QgsPointLocator ::MatchFilter
36
38
{
37
39
bool acceptMatch ( const QgsPointLocator::Match &m ) override { return m.hasEdge (); }
38
40
};
41
+ // / @endcond
42
+
39
43
40
44
bool QgsAdvancedDigitizingDockWidget::lineCircleIntersection ( const QgsPointXY ¢er, const double radius, const QList<QgsPointXY> &segment, QgsPointXY &intersection )
41
45
{
@@ -571,7 +575,7 @@ bool QgsAdvancedDigitizingDockWidget::applyConstraints( QgsMapMouseEvent *e )
571
575
572
576
QgsPointXY point = e->snapPoint ();
573
577
574
- mSnappedSegment = e->snapSegment ( );
578
+ mSnappedSegment = snapSegment ( e->originalMapPoint () );
575
579
576
580
bool previousPointExist, penulPointExist;
577
581
QgsPointXY previousPt = previousPoint ( &previousPointExist );
@@ -864,6 +868,49 @@ bool QgsAdvancedDigitizingDockWidget::applyConstraints( QgsMapMouseEvent *e )
864
868
}
865
869
866
870
871
+
872
+ QList<QgsPointXY> QgsAdvancedDigitizingDockWidget::snapSegment ( const QgsPointXY &originalMapPoint, bool *snapped, bool allLayers ) const
873
+ {
874
+ QList<QgsPointXY> segment;
875
+ QgsPointXY pt1, pt2;
876
+ QgsPointLocator::Match match;
877
+
878
+ if ( !allLayers )
879
+ {
880
+ // run snapToMap with only segments
881
+ EdgesOnlyFilter filter;
882
+ match = mMapCanvas ->snappingUtils ()->snapToMap ( originalMapPoint, &filter );
883
+ }
884
+ else
885
+ {
886
+ // run snapToMap with only edges on all layers
887
+ QgsSnappingUtils *snappingUtils = mMapCanvas ->snappingUtils ();
888
+
889
+ QgsSnappingConfig canvasConfig = snappingUtils->config ();
890
+ QgsSnappingConfig localConfig = snappingUtils->config ();
891
+
892
+ localConfig.setMode ( QgsSnappingConfig::AllLayers );
893
+ localConfig.setType ( QgsSnappingConfig::Segment );
894
+ snappingUtils->setConfig ( localConfig );
895
+
896
+ match = snappingUtils->snapToMap ( originalMapPoint );
897
+
898
+ snappingUtils->setConfig ( canvasConfig );
899
+ }
900
+ if ( match.isValid () && match.hasEdge () )
901
+ {
902
+ match.edgePoints ( pt1, pt2 );
903
+ segment << pt1 << pt2;
904
+ }
905
+
906
+ if ( snapped )
907
+ {
908
+ *snapped = segment.count () == 2 ;
909
+ }
910
+
911
+ return segment;
912
+ }
913
+
867
914
bool QgsAdvancedDigitizingDockWidget::alignToSegment ( QgsMapMouseEvent *e, CadConstraint::LockMode lockMode )
868
915
{
869
916
if ( mAdditionalConstraint == NoConstraint )
@@ -874,7 +921,7 @@ bool QgsAdvancedDigitizingDockWidget::alignToSegment( QgsMapMouseEvent *e, CadCo
874
921
bool previousPointExist, penulPointExist, snappedSegmentExist;
875
922
QgsPointXY previousPt = previousPoint ( &previousPointExist );
876
923
QgsPointXY penultimatePt = penultimatePoint ( &penulPointExist );
877
- mSnappedSegment = e->snapSegment ( &snappedSegmentExist, true );
924
+ mSnappedSegment = snapSegment ( e->originalMapPoint (), &snappedSegmentExist, true );
878
925
879
926
if ( !previousPointExist || !snappedSegmentExist )
880
927
{
0 commit comments