QGIS API Documentation 3.28.0-Firenze (ed3ad0430f)
qgsmaptoolextent.cpp
Go to the documentation of this file.
1/***************************************************************************
2 qgsmaptoolextent.h - map tool that emits an extent
3 ---------------------
4 begin : July 2017
5 copyright : (C) 2017 by Mathieu Pellerin
6 email : nirvn dot asia at gmail dot com
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
18#include "qgsmaptoolextent.h"
19#include "qgsmapcanvas.h"
20#include "qgswkbtypes.h"
21#include "qgsmapmouseevent.h"
22
23
25 : QgsMapTool( canvas )
26{
28}
29
31{
33}
34
36{
39}
40
42{
43 if ( !mDraw )
44 return;
45
46
47 QgsPointXY p = toMapCoordinates( e->pos() );
48 if ( mRatio.width() > 0 && mRatio.height() > 0 )
49 {
50 const double width = std::fabs( p.x() - mStartPoint.x() );
51 double height = width * ( mRatio.width() / mRatio.height() );
52 if ( p.y() - mStartPoint.y() < 0 )
53 height *= -1;
54 p.setY( mStartPoint.y() + height );
55 }
56
57 mEndPoint = toMapCoordinates( e->pos() );
58 calculateEndPoint( mEndPoint );
59 drawExtent();
60}
61
63{
64 mStartPoint = toMapCoordinates( e->pos() );
65 mEndPoint = mStartPoint;
66 drawExtent();
67
68 mDraw = true;
69}
70
72{
73 if ( !mDraw )
74 return;
75
76 mEndPoint = toMapCoordinates( e->pos() );
77 calculateEndPoint( mEndPoint );
78 drawExtent();
79
80 emit extentChanged( extent() );
81
82 mDraw = false;
83}
84
86{
87 if ( mStartPoint.x() != mEndPoint.x() && mStartPoint.y() != mEndPoint.y() )
88 {
89 return QgsRectangle( mStartPoint, mEndPoint );
90 }
91 else
92 {
93 return QgsRectangle();
94 }
95}
96
98{
99 mRubberBand->reset( QgsWkbTypes::PolygonGeometry );
100}
101
102void QgsMapToolExtent::calculateEndPoint( QgsPointXY &point )
103{
104 if ( mRatio.width() > 0 && mRatio.height() > 0 )
105 {
106 const double width = std::fabs( point.x() - mStartPoint.x() );
107 double height = width * mRatio.height() / mRatio.width();
108 if ( point.y() - mStartPoint.y() < 0 )
109 height *= -1;
110 point.setY( mStartPoint.y() + height );
111 }
112}
113
114void QgsMapToolExtent::drawExtent()
115{
116 if ( qgsDoubleNear( mStartPoint.x(), mEndPoint.x() ) && qgsDoubleNear( mStartPoint.y(), mEndPoint.y() ) )
117 return;
118
119 const QgsRectangle rect( mStartPoint, mEndPoint );
120
121 mRubberBand->reset( QgsWkbTypes::PolygonGeometry );
122 mRubberBand->addPoint( QgsPointXY( rect.xMinimum(), rect.yMinimum() ), false );
123 mRubberBand->addPoint( QgsPointXY( rect.xMaximum(), rect.yMinimum() ), false );
124 mRubberBand->addPoint( QgsPointXY( rect.xMaximum(), rect.yMaximum() ), false );
125 mRubberBand->addPoint( QgsPointXY( rect.xMinimum(), rect.yMaximum() ), true );
126
127 mRubberBand->show();
128}
void reset(T *p=nullptr)
Will reset the managed pointer to p.
Map canvas is a class for displaying all GIS data types on a canvas.
Definition: qgsmapcanvas.h:90
A QgsMapMouseEvent is the result of a user interaction with the mouse on a QgsMapCanvas.
void clearRubberBand()
Removes the tool's rubber band from the canvas.
void canvasMoveEvent(QgsMapMouseEvent *e) override
Mouse move event for overriding. Default implementation does nothing.
void deactivate() override
called when map tool is being deactivated
QgsRectangle extent() const
Returns the current extent drawn onto the canvas.
void canvasReleaseEvent(QgsMapMouseEvent *e) override
Mouse release event for overriding. Default implementation does nothing.
void canvasPressEvent(QgsMapMouseEvent *e) override
Mouse press event for overriding. Default implementation does nothing.
void activate() override
called when set as currently active map tool
void extentChanged(const QgsRectangle &extent)
signal emitted on extent change
QgsMapToolExtent(QgsMapCanvas *canvas)
constructor
Abstract base class for all map tools.
Definition: qgsmaptool.h:71
QgsMapCanvas * canvas() const
returns pointer to the tool's map canvas
Definition: qgsmaptool.cpp:215
QgsPointXY toMapCoordinates(QPoint point)
Transforms a point from screen coordinates to map coordinates.
Definition: qgsmaptool.cpp:41
virtual void activate()
called when set as currently active map tool
Definition: qgsmaptool.cpp:94
virtual void deactivate()
called when map tool is being deactivated
Definition: qgsmaptool.cpp:110
A class to represent a 2D point.
Definition: qgspointxy.h:59
double y
Definition: qgspointxy.h:63
Q_GADGET double x
Definition: qgspointxy.h:62
void setY(double y) SIP_HOLDGIL
Sets the y value of the point.
Definition: qgspointxy.h:132
A rectangle specified with double values.
Definition: qgsrectangle.h:42
A class for drawing transient features (e.g.
Definition: qgsrubberband.h:52
void reset(QgsWkbTypes::GeometryType geometryType=QgsWkbTypes::LineGeometry)
Clears all the geometries in this rubberband.
void addPoint(const QgsPointXY &p, bool doUpdate=true, int geometryIndex=0, int ringIndex=0)
Adds a vertex to the rubberband and update canvas.
bool qgsDoubleNear(double a, double b, double epsilon=4 *std::numeric_limits< double >::epsilon())
Compare two doubles (but allow some difference)
Definition: qgis.h:2527