2222#include " qgisinterface.h"
2323#include " qgslogger.h"
2424#include " qgsmapcanvas.h"
25+ #include " qgsmaprenderer.h"
2526#include " qgsmaptool.h"
2627
2728#include < QButtonGroup>
@@ -38,11 +39,19 @@ QgsGrassRegionEdit::QgsGrassRegionEdit( QgsMapCanvas* canvas )
3839{
3940 mDraw = false ;
4041 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 () ) );
4149}
4250
4351QgsGrassRegionEdit::~QgsGrassRegionEdit ()
4452{
4553 delete mRubberBand ;
54+ delete mSrcRubberBand ;
4655}
4756
4857// ! mouse pressed in map canvas
@@ -51,6 +60,7 @@ void QgsGrassRegionEdit::canvasPressEvent( QMouseEvent * event )
5160 QgsDebugMsg ( " entered." );
5261 mDraw = true ;
5362 mRubberBand ->reset ( true );
63+ mSrcRubberBand ->reset ( true );
5464 emit captureStarted ();
5565
5666 mStartPoint = toMapCoordinates ( event->pos () );
@@ -82,28 +92,88 @@ void QgsGrassRegionEdit::canvasReleaseEvent( QMouseEvent * event )
8292void QgsGrassRegionEdit::deactivate ()
8393{
8494 mRubberBand ->reset ( true );
95+ mSrcRubberBand ->reset ( true );
8596 QgsMapTool::deactivate ();
8697}
8798
8899void QgsGrassRegionEdit::setRegion ( const QgsPoint& ul, const QgsPoint& lr )
89100{
90101 mStartPoint = ul;
91102 mEndPoint = lr;
103+ calcSrcRegion ();
104+ drawRegion ( canvas (), mRubberBand , mSrcRectangle , &mCoordinateTransform );
105+ drawRegion ( canvas (), mSrcRubberBand , QgsRectangle ( mStartPoint , mEndPoint ) );
106+ }
92107
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+ }
98129
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 ();
100165}
101166
102167QgsRectangle QgsGrassRegionEdit::getRegion ()
103168{
104- return QgsRectangle ( mStartPoint , mEndPoint );
169+ // return QgsRectangle( mStartPoint, mEndPoint );
170+ return mSrcRectangle ;
105171}
106172
173+ void QgsGrassRegionEdit::setSrcRegion ( const QgsRectangle &rect )
174+ {
175+ mSrcRectangle = rect;
176+ }
107177
108178QgsGrassRegion::QgsGrassRegion ( QgsGrassPlugin *plugin, QgisInterface *iface,
109179 QWidget * parent, Qt::WFlags f )
@@ -397,7 +467,8 @@ void QgsGrassRegion::displayRegion()
397467 QgsPoint ul ( mWindow .west , mWindow .north );
398468 QgsPoint lr ( mWindow .east , mWindow .south );
399469
400- mRegionEdit ->setRegion ( ul, lr );
470+ // mRegionEdit->setRegion( ul, lr );
471+ mRegionEdit ->setSrcRegion ( QgsRectangle ( ul, lr ) );
401472}
402473
403474void QgsGrassRegion::accept ()
@@ -448,4 +519,4 @@ void QgsGrassRegion::saveWindowLocation()
448519{
449520 QSettings settings;
450521 settings.setValue ( " /GRASS/windows/region/geometry" , saveGeometry () );
451- }
522+ }
0 commit comments