1818#include < memory>
1919
2020#include " qgs3dmapcanvas.h"
21- #include " qgs3dmapscene .h"
21+ #include " qgs3dmapsettings .h"
2222#include " qgs3dmeasuredialog.h"
23- #include " qgs3dutils.h"
24- #include " qgsabstractterrainsettings.h"
23+ #include " qgs3dsnappingmanager.h"
2524#include " qgsframegraph.h"
2625#include " qgsmaplayer.h"
2726#include " qgspoint.h"
28- #include " qgsraycastcontext.h"
2927#include " qgsrubberband3d.h"
3028#include " qgswindow3dengine.h"
3129
3230#include < QKeyEvent>
3331
3432#include " moc_qgs3dmaptoolmeasureline.cpp"
3533
36- Qgs3DMapToolMeasureLine::Qgs3DMapToolMeasureLine ( Qgs3DMapCanvas *canvas )
34+ Qgs3DMapToolMeasureLine::Qgs3DMapToolMeasureLine ( Qgs3DMapCanvas *canvas, Qgs3DSnappingManager *snapper )
3735 : Qgs3DMapTool( canvas )
36+ , mSnapper( snapper )
3837{
3938 // Dialog
4039 mDialog = std::make_unique<Qgs3DMeasureDialog>( this );
@@ -48,6 +47,8 @@ void Qgs3DMapToolMeasureLine::activate()
4847{
4948 mRubberBand = std::make_unique<QgsRubberBand3D>( *mCanvas ->mapSettings (), mCanvas ->engine (), mCanvas ->engine ()->frameGraph ()->rubberBandsRootEntity () );
5049
50+ mSnapper ->start ( mCanvas );
51+
5152 restart ();
5253 updateSettings ();
5354
@@ -60,6 +61,8 @@ void Qgs3DMapToolMeasureLine::deactivate()
6061{
6162 mRubberBand .reset ();
6263
64+ mSnapper ->finish ();
65+
6366 // Hide dialog
6467 mDialog ->hide ();
6568}
@@ -76,28 +79,14 @@ void Qgs3DMapToolMeasureLine::handleClick( const QPoint &screenPos )
7679 restart ();
7780 }
7881
79- QgsRayCastContext context;
80- context.setSingleResult ( false );
81- context.setMaximumDistance ( mCanvas ->cameraController ()->camera ()->farPlane () );
82- context.setAngleThreshold ( 0 .5f );
83- const QgsRayCastResult results = mCanvas ->castRay ( screenPos, context );
84-
85- if ( results.isEmpty () )
86- return ;
87-
88- QgsVector3D mapCoords;
89- double minDist = -1 ;
90- const QList<QgsRayCastHit> allHits = results.allHits ();
91- for ( const QgsRayCastHit &hit : allHits )
82+ bool snapSuccess;
83+ const QgsPoint snapPoint = mSnapper ->screenToMap ( screenPos, &snapSuccess );
84+ if ( !snapSuccess )
9285 {
93- const double resDist = hit.distance ();
94- if ( minDist < 0 || resDist < minDist )
95- {
96- minDist = resDist;
97- mapCoords = hit.mapCoordinates ();
98- }
86+ return ;
9987 }
100- addPoint ( QgsPoint ( mapCoords.x (), mapCoords.y (), mapCoords.z () ) );
88+
89+ addPoint ( snapPoint );
10190 mDialog ->show ();
10291}
10392
@@ -148,6 +137,8 @@ void Qgs3DMapToolMeasureLine::restart()
148137
149138 mRubberBand ->reset ();
150139 mRubberBand ->setHideLastMarker ( true );
140+
141+ mSnapper ->reset ();
151142}
152143
153144void Qgs3DMapToolMeasureLine::undo ()
@@ -188,11 +179,15 @@ void Qgs3DMapToolMeasureLine::mouseMoveEvent( QMouseEvent *event )
188179 mMouseHasMoved = true ;
189180 }
190181
191- if ( mPoints .isEmpty () || mDone )
182+ bool snapSuccess;
183+ const QgsPoint snapPoint = mSnapper ->screenToMap ( event->pos (), &snapSuccess );
184+
185+ if ( !snapSuccess || mPoints .isEmpty () || mDone )
186+ {
192187 return ;
188+ }
193189
194- const QgsPoint pointMap = Qgs3DUtils::screenPointToMapCoordinates ( event->pos (), mCanvas ->size (), mCanvas ->cameraController (), mCanvas ->mapSettings () );
195- mRubberBand ->moveLastPoint ( pointMap );
190+ mRubberBand ->moveLastPoint ( snapPoint );
196191}
197192
198193void Qgs3DMapToolMeasureLine::mouseReleaseEvent ( QMouseEvent *event )
0 commit comments