QGIS API Documentation 3.99.0-Master (21b3aa880ba)
Loading...
Searching...
No Matches
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#include "qgsmaptoolextent.h"
18
19#include "qgsmapcanvas.h"
20#include "qgsmapmouseevent.h"
21
22#include "moc_qgsmaptoolextent.cpp"
23
29
34
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( Qgis::GeometryType::Polygon );
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( Qgis::GeometryType::Polygon );
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}
@ Polygon
Polygons.
Definition qgis.h:361
A mouse event which is the result of a user interaction with 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
QgsMapCanvas * canvas() const
returns pointer to the tool's map canvas
QgsMapTool(QgsMapCanvas *canvas)
Constructor takes a map canvas as a parameter.
QgsPointXY toMapCoordinates(QPoint point)
Transforms a point from screen coordinates to map coordinates.
friend class QgsMapCanvas
Definition qgsmaptool.h:381
virtual void activate()
called when set as currently active map tool
virtual void deactivate()
called when map tool is being deactivated
Represents a 2D point.
Definition qgspointxy.h:60
void setY(double y)
Sets the y value of the point.
Definition qgspointxy.h:129
double y
Definition qgspointxy.h:64
double x
Definition qgspointxy.h:63
A rectangle specified with double values.
Responsible for drawing transient features (e.g.
bool qgsDoubleNear(double a, double b, double epsilon=4 *std::numeric_limits< double >::epsilon())
Compare two doubles (but allow some difference).
Definition qgis.h:6607