22
22
#include " qgisinterface.h"
23
23
#include " qgslogger.h"
24
24
#include " qgsmapcanvas.h"
25
+ #include " qgsmaprenderer.h"
25
26
#include " qgsmaptool.h"
26
27
27
28
#include < QButtonGroup>
@@ -38,11 +39,19 @@ QgsGrassRegionEdit::QgsGrassRegionEdit( QgsMapCanvas* canvas )
38
39
{
39
40
mDraw = false ;
40
41
mRubberBand = new QgsRubberBand ( mCanvas , true );
42
+ mSrcRubberBand = new QgsRubberBand ( mCanvas , true );
43
+ QString gisdbase = QgsGrass::getDefaultGisdbase ();
44
+ QString location = QgsGrass::getDefaultLocation ();
45
+ mCrs = QgsGrass::crs ( gisdbase, location );
46
+ QgsDebugMsg ( " mCrs: " + mCrs .toWkt () );
47
+ setTransform ();
48
+ connect ( canvas->mapRenderer (), SIGNAL ( destinationSrsChanged () ), this , SLOT ( setTransform () ) );
41
49
}
42
50
43
51
QgsGrassRegionEdit::~QgsGrassRegionEdit ()
44
52
{
45
53
delete mRubberBand ;
54
+ delete mSrcRubberBand ;
46
55
}
47
56
48
57
// ! mouse pressed in map canvas
@@ -51,6 +60,7 @@ void QgsGrassRegionEdit::canvasPressEvent( QMouseEvent * event )
51
60
QgsDebugMsg ( " entered." );
52
61
mDraw = true ;
53
62
mRubberBand ->reset ( true );
63
+ mSrcRubberBand ->reset ( true );
54
64
emit captureStarted ();
55
65
56
66
mStartPoint = toMapCoordinates ( event->pos () );
@@ -82,28 +92,88 @@ void QgsGrassRegionEdit::canvasReleaseEvent( QMouseEvent * event )
82
92
void QgsGrassRegionEdit::deactivate ()
83
93
{
84
94
mRubberBand ->reset ( true );
95
+ mSrcRubberBand ->reset ( true );
85
96
QgsMapTool::deactivate ();
86
97
}
87
98
88
99
void QgsGrassRegionEdit::setRegion ( const QgsPoint& ul, const QgsPoint& lr )
89
100
{
90
101
mStartPoint = ul;
91
102
mEndPoint = lr;
103
+ calcSrcRegion ();
104
+ drawRegion ( canvas (), mRubberBand , mSrcRectangle , &mCoordinateTransform );
105
+ drawRegion ( canvas (), mSrcRubberBand , QgsRectangle ( mStartPoint , mEndPoint ) );
106
+ }
92
107
93
- mRubberBand ->reset ( true );
94
- mRubberBand ->addPoint ( ul, false );
95
- mRubberBand ->addPoint ( QgsPoint ( ul.x (), lr.y () ), false );
96
- mRubberBand ->addPoint ( lr, false );
97
- mRubberBand ->addPoint ( QgsPoint ( lr.x (), ul.y () ), true ); // true to update canvas
108
+ void QgsGrassRegionEdit::calcSrcRegion ()
109
+ {
110
+ mSrcRectangle .set ( mStartPoint , mEndPoint );
111
+
112
+ if ( mCanvas ->mapRenderer ()->hasCrsTransformEnabled () && mCrs .isValid () && mCanvas ->mapRenderer ()->destinationCrs ().isValid () )
113
+ {
114
+ QgsCoordinateTransform coordinateTransform;
115
+ coordinateTransform.setSourceCrs ( mCanvas ->mapRenderer ()->destinationCrs () );
116
+ coordinateTransform.setDestCRS ( mCrs );
117
+ mSrcRectangle = coordinateTransform.transformBoundingBox ( mSrcRectangle );
118
+ }
119
+ }
120
+
121
+ void QgsGrassRegionEdit::setTransform ()
122
+ {
123
+ if ( mCrs .isValid () && canvas ()->mapRenderer ()->destinationCrs ().isValid () )
124
+ {
125
+ mCoordinateTransform .setSourceCrs ( mCrs );
126
+ mCoordinateTransform .setDestCRS ( canvas ()->mapRenderer ()->destinationCrs () );
127
+ }
128
+ }
98
129
99
- mRubberBand ->show ();
130
+ void QgsGrassRegionEdit::transform ( QgsMapCanvas *canvas, QVector<QgsPoint> &points, QgsCoordinateTransform *coordinateTransform, QgsCoordinateTransform::TransformDirection direction )
131
+ {
132
+ QgsDebugMsg ( " Entered" );
133
+ /* * Coordinate transform */
134
+ if ( canvas->mapRenderer ()->hasCrsTransformEnabled () )
135
+ {
136
+ // QgsDebugMsg ( "srcCrs = " + coordinateTransform->sourceCrs().toWkt() );
137
+ // QgsDebugMsg ( "destCrs = " + coordinateTransform->destCRS().toWkt() );
138
+ for ( int i = 0 ; i < points.size (); i++ )
139
+ {
140
+ points[i] = coordinateTransform->transform ( points[i], direction );
141
+ }
142
+ }
143
+ }
144
+
145
+ void QgsGrassRegionEdit::drawRegion ( QgsMapCanvas *canvas, QgsRubberBand* rubberBand, const QgsRectangle &rect, QgsCoordinateTransform * coordinateTransform )
146
+ {
147
+ QVector<QgsPoint> points;
148
+ points.append ( QgsPoint ( rect.xMinimum (), rect.yMinimum () ) );
149
+ points.append ( QgsPoint ( rect.xMaximum (), rect.yMinimum () ) );
150
+ points.append ( QgsPoint ( rect.xMaximum (), rect.yMaximum () ) );
151
+ points.append ( QgsPoint ( rect.xMinimum (), rect.yMaximum () ) );
152
+
153
+ if ( coordinateTransform )
154
+ {
155
+ transform ( canvas, points, coordinateTransform );
156
+ }
157
+ rubberBand->reset ( true );
158
+ for ( int i = 0 ; i < points.size (); i++ )
159
+ {
160
+ bool update = false ; // true to update canvas
161
+ if ( i == points.size () - 1 ) update = true ;
162
+ rubberBand->addPoint ( points[i], update );
163
+ }
164
+ rubberBand->show ();
100
165
}
101
166
102
167
QgsRectangle QgsGrassRegionEdit::getRegion ()
103
168
{
104
- return QgsRectangle ( mStartPoint , mEndPoint );
169
+ // return QgsRectangle( mStartPoint, mEndPoint );
170
+ return mSrcRectangle ;
105
171
}
106
172
173
+ void QgsGrassRegionEdit::setSrcRegion ( const QgsRectangle &rect )
174
+ {
175
+ mSrcRectangle = rect;
176
+ }
107
177
108
178
QgsGrassRegion::QgsGrassRegion ( QgsGrassPlugin *plugin, QgisInterface *iface,
109
179
QWidget * parent, Qt::WFlags f )
@@ -397,7 +467,8 @@ void QgsGrassRegion::displayRegion()
397
467
QgsPoint ul ( mWindow .west , mWindow .north );
398
468
QgsPoint lr ( mWindow .east , mWindow .south );
399
469
400
- mRegionEdit ->setRegion ( ul, lr );
470
+ // mRegionEdit->setRegion( ul, lr );
471
+ mRegionEdit ->setSrcRegion ( QgsRectangle ( ul, lr ) );
401
472
}
402
473
403
474
void QgsGrassRegion::accept ()
@@ -448,4 +519,4 @@ void QgsGrassRegion::saveWindowLocation()
448
519
{
449
520
QSettings settings;
450
521
settings.setValue ( " /GRASS/windows/region/geometry" , saveGeometry () );
451
- }
522
+ }
0 commit comments