QGIS API Documentation  3.19.0-Master (c9e5875a2b)
qgsmapmouseevent.cpp
Go to the documentation of this file.
1 /***************************************************************************
2  qgsmapmouseevent.cpp - mouse event in map coordinates and ability to snap
3  ----------------------
4  begin : October 2014
5  copyright : (C) Denis Rouzaud
6  email : [email protected]
7  ***************************************************************************
8  * *
9  * This program is free software; you can redistribute it and/or modify *
10  * it under the terms of the GNU General Public License as published by *
11  * the Free Software Foundation; either version 2 of the License, or *
12  * (at your option) any later version. *
13  * *
14  ***************************************************************************/
15 
16 
17 #include "qgsmapmouseevent.h"
18 #include "qgsmapcanvas.h"
19 
20 #include "qgssnappingutils.h"
21 #include "qgssnappingconfig.h"
22 
23 QgsMapMouseEvent::QgsMapMouseEvent( QgsMapCanvas *mapCanvas, QMouseEvent *event )
24  : QMouseEvent( event->type(), event->pos(), event->button(), event->buttons(), event->modifiers() )
25  , mHasCachedSnapResult( false )
26  , mOriginalMapPoint( mapCanvas ? mapCanvas->mapSettings().mapToPixel().toMapCoordinates( event->pos() ) : QgsPointXY() )
27  , mMapPoint( mOriginalMapPoint )
28  , mPixelPoint( event->pos() )
29  , mMapCanvas( mapCanvas )
30 {
31 }
32 
33 QgsMapMouseEvent::QgsMapMouseEvent( QgsMapCanvas *mapCanvas, QEvent::Type type, QPoint pos, Qt::MouseButton button, Qt::MouseButtons buttons, Qt::KeyboardModifiers modifiers )
34  : QMouseEvent( type, pos, button, buttons, modifiers )
35  , mHasCachedSnapResult( false )
36  , mOriginalMapPoint( mapCanvas ? mapCanvas->mapSettings().mapToPixel().toMapCoordinates( pos ) : QgsPointXY() )
37  , mMapPoint( mOriginalMapPoint )
38  , mPixelPoint( pos )
39  , mMapCanvas( mapCanvas )
40 {
41 }
42 
44 {
45  // Use cached result
46  if ( mHasCachedSnapResult )
47  return mMapPoint;
48 
49  mHasCachedSnapResult = true;
50 
51  QgsSnappingUtils *snappingUtils = mMapCanvas->snappingUtils();
52  mSnapMatch = snappingUtils->snapToMap( mMapPoint, nullptr, true );
53 
54  if ( mSnapMatch.isValid() )
55  {
56  mMapPoint = mSnapMatch.point();
57  mPixelPoint = mapToPixelCoordinates( mMapPoint );
58  }
59  else
60  {
61  mMapPoint = mOriginalMapPoint;
62  mPixelPoint = pos();
63  }
64 
65  return mMapPoint;
66 }
67 
69 {
70  mMapPoint = point;
71  mPixelPoint = mapToPixelCoordinates( point );
72 }
73 
75 {
76  if ( precision <= 0 )
77  return;
78 
79  try
80  {
81  QgsCoordinateTransform ct( mMapCanvas->mapSettings().destinationCrs(), crs, mMapCanvas->mapSettings().transformContext() );
82 
83  QgsPointXY pt = ct.transform( mMapPoint );
84 
85  pt.setX( std::round( pt.x() / precision ) * precision );
86  pt.setY( std::round( pt.y() / precision ) * precision );
87 
89 
90  setMapPoint( pt );
91  }
92  catch ( QgsCsException &e )
93  {
94  Q_UNUSED( e )
95  }
96 }
97 
98 QPoint QgsMapMouseEvent::mapToPixelCoordinates( const QgsPointXY &point )
99 {
100  double x = point.x(), y = point.y();
101 
102  mMapCanvas->mapSettings().mapToPixel().transformInPlace( x, y );
103 
104  return QPoint( std::round( x ), std::round( y ) );
105 }
This class represents a coordinate reference system (CRS).
Class for doing transforms between two map coordinate systems.
QgsPointXY transform(const QgsPointXY &point, TransformDirection direction=ForwardTransform) const SIP_THROW(QgsCsException)
Transform the point from the source CRS to the destination CRS.
@ ReverseTransform
Transform from destination to source CRS.
Custom exception class for Coordinate Reference System related exceptions.
Definition: qgsexception.h:66
Map canvas is a class for displaying all GIS data types on a canvas.
Definition: qgsmapcanvas.h:86
QgsSnappingUtils * snappingUtils() const
Returns snapping utility class that is associated with map canvas.
const QgsMapSettings & mapSettings() const
Gets access to properties used for map rendering.
QgsMapMouseEvent(QgsMapCanvas *mapCanvas, QMouseEvent *event)
Creates a new QgsMapMouseEvent.
void setMapPoint(const QgsPointXY &point)
Set the (snapped) point this event points to in map coordinates.
void snapToGrid(double precision, const QgsCoordinateReferenceSystem &crs)
Snaps the mapPoint to a grid with the given precision.
QgsPointXY snapPoint()
snapPoint will snap the points using the map canvas snapping utils configuration
const QgsMapToPixel & mapToPixel() const
QgsCoordinateReferenceSystem destinationCrs() const
Returns the destination coordinate reference system for the map render.
QgsCoordinateTransformContext transformContext() const
Returns the coordinate transform context, which stores various information regarding which datum tran...
void transformInPlace(double &x, double &y) const
Transforms device coordinates to map coordinates.
A class to represent a 2D point.
Definition: qgspointxy.h:44
void setX(double x) SIP_HOLDGIL
Sets the x value of the point.
Definition: qgspointxy.h:107
double y
Definition: qgspointxy.h:48
Q_GADGET double x
Definition: qgspointxy.h:47
void setY(double y) SIP_HOLDGIL
Sets the y value of the point.
Definition: qgspointxy.h:117
This class has all the configuration of snapping and can return answers to snapping queries.
QgsPointLocator::Match snapToMap(QPoint point, QgsPointLocator::MatchFilter *filter=nullptr, bool relaxed=false)
Snap to map according to the current configuration.
const QgsCoordinateReferenceSystem & crs
int precision
QgsPointXY point() const
for vertex / edge match coords depending on what class returns it (geom.cache: layer coords,...