Skip to content

Commit ef912d2

Browse files
committed
Fix advanced digitizing display for rotated map canvas
1 parent 7980cef commit ef912d2

File tree

1 file changed

+29
-17
lines changed

1 file changed

+29
-17
lines changed

src/gui/qgsadvanceddigitizingcanvasitem.cpp

+29-17
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,16 @@ void QgsAdvancedDigitizingCanvasItem::paint( QPainter *painter )
3838
if ( !mAdvancedDigitizingDockWidget->cadEnabled() )
3939
return;
4040

41-
QgsRectangle mapRect = mMapCanvas->extent();
41+
// Use visible polygon rather than extent to properly handle rotated maps
42+
QPolygonF mapPoly = mMapCanvas->mapSettings().visiblePolygon();
43+
double canvasWidth = QLineF( mapPoly[0], mapPoly[1] ).length();
44+
double canvasHeight = QLineF( mapPoly[0], mapPoly[3] ).length();
45+
QgsRectangle mapRect = QgsRectangle( mapPoly[0],
46+
QgsPointXY(
47+
mapPoly[0].x() + canvasWidth,
48+
mapPoly[0].y() - canvasHeight
49+
)
50+
);
4251
if ( rect() != mapRect )
4352
setRect( mapRect );
4453

@@ -54,12 +63,16 @@ void QgsAdvancedDigitizingCanvasItem::paint( QPainter *painter )
5463
const QList<QgsPointXY> snappedSegment = mAdvancedDigitizingDockWidget->snappedSegment();
5564
const bool hasSnappedSegment = snappedSegment.count() == 2;
5665

57-
const bool curPointExist = mapRect.contains( curPoint );
66+
const bool curPointExist = mapPoly.containsPoint( curPoint.toQPointF(), Qt::OddEvenFill );
5867

5968
const double mupp = mMapCanvas->getCoordinateTransform()->mapUnitsPerPixel();
6069
if ( mupp == 0 )
6170
return;
6271

72+
const double canvasRotation = mMapCanvas->rotation();
73+
const double canvasRotationRad = canvasRotation * M_PI / 180;
74+
const double canvasMaxDimension = std::max( canvasWidth / mupp, canvasHeight / mupp );
75+
6376
QPointF curPointPix, prevPointPix, penulPointPix, snapSegmentPix1, snapSegmentPix2;
6477

6578
if ( curPointExist )
@@ -116,19 +129,19 @@ void QgsAdvancedDigitizingCanvasItem::paint( QPainter *painter )
116129
double a0, a;
117130
if ( mAdvancedDigitizingDockWidget->constraintAngle()->relative() && nPoints > 2 )
118131
{
119-
a0 = std::atan2( -( prevPoint.y() - penulPoint.y() ), prevPoint.x() - penulPoint.x() );
132+
a0 = std::atan2( -( prevPoint.y() - penulPoint.y() ), prevPoint.x() - penulPoint.x() ) + canvasRotationRad;
120133
}
121134
else
122135
{
123-
a0 = 0;
136+
a0 = canvasRotationRad;
124137
}
125138
if ( mAdvancedDigitizingDockWidget->constraintAngle()->isLocked() )
126139
{
127140
a = a0 - mAdvancedDigitizingDockWidget->constraintAngle()->value() * M_PI / 180;
128141
}
129142
else
130143
{
131-
a = std::atan2( -( curPoint.y() - prevPoint.y() ), curPoint.x() - prevPoint.x() );
144+
a = std::atan2( -( curPoint.y() - prevPoint.y() ), curPoint.x() - prevPoint.x() ) + canvasRotationRad;
132145
}
133146
painter->setPen( mConstruction2Pen );
134147
painter->drawArc( QRectF( prevPointPix.x() - 20,
@@ -143,9 +156,8 @@ void QgsAdvancedDigitizingCanvasItem::paint( QPainter *painter )
143156
if ( mAdvancedDigitizingDockWidget->constraintAngle()->isLocked() )
144157
{
145158
painter->setPen( mLockedPen );
146-
double d = std::max( boundingRect().width(), boundingRect().height() );
147-
painter->drawLine( prevPointPix - d * QPointF( std::cos( a ), std::sin( a ) ),
148-
prevPointPix + d * QPointF( std::cos( a ), std::sin( a ) ) );
159+
painter->drawLine( prevPointPix - canvasMaxDimension * QPointF( std::cos( a ), std::sin( a ) ),
160+
prevPointPix + canvasMaxDimension * QPointF( std::cos( a ), std::sin( a ) ) );
149161
}
150162
}
151163

@@ -167,7 +179,7 @@ void QgsAdvancedDigitizingCanvasItem::paint( QPainter *painter )
167179
{
168180
if ( nPoints > 1 )
169181
{
170-
x = mAdvancedDigitizingDockWidget->constraintX()->value() / mupp + prevPointPix.x();
182+
x = mAdvancedDigitizingDockWidget->constraintX()->value() + prevPoint.x();
171183
}
172184
else
173185
{
@@ -176,12 +188,12 @@ void QgsAdvancedDigitizingCanvasItem::paint( QPainter *painter )
176188
}
177189
else
178190
{
179-
x = toCanvasCoordinates( QgsPointXY( mAdvancedDigitizingDockWidget->constraintX()->value(), 0 ) ).x();
191+
x = mAdvancedDigitizingDockWidget->constraintX()->value();
180192
}
181193
if ( draw )
182194
{
183-
painter->drawLine( QPointF( x, 0 ),
184-
QPointF( x, boundingRect().height() ) );
195+
painter->drawLine( toCanvasCoordinates( QgsPointXY( x, mapPoly[0].y() ) ) - canvasMaxDimension * QPointF( std::sin( -canvasRotationRad ), std::cos( -canvasRotationRad ) ),
196+
toCanvasCoordinates( QgsPointXY( x, mapPoly[0].y() ) ) + canvasMaxDimension * QPointF( std::sin( -canvasRotationRad ), std::cos( -canvasRotationRad ) ) );
185197
}
186198
}
187199

@@ -195,8 +207,7 @@ void QgsAdvancedDigitizingCanvasItem::paint( QPainter *painter )
195207
{
196208
if ( nPoints > 1 )
197209
{
198-
// y is reversed!
199-
y = -mAdvancedDigitizingDockWidget->constraintY()->value() / mupp + prevPointPix.y();
210+
y = mAdvancedDigitizingDockWidget->constraintY()->value() + prevPoint.y();
200211
}
201212
else
202213
{
@@ -205,12 +216,13 @@ void QgsAdvancedDigitizingCanvasItem::paint( QPainter *painter )
205216
}
206217
else
207218
{
208-
y = toCanvasCoordinates( QgsPointXY( 0, mAdvancedDigitizingDockWidget->constraintY()->value() ) ).y();
219+
y = mAdvancedDigitizingDockWidget->constraintY()->value();
209220
}
210221
if ( draw )
211222
{
212-
painter->drawLine( QPointF( 0, y ),
213-
QPointF( boundingRect().width(), y ) );
223+
painter->drawLine( toCanvasCoordinates( QgsPointXY( mapPoly[0].x(), y ) ) - canvasMaxDimension * QPointF( std::cos( -canvasRotationRad ), -std::sin( -canvasRotationRad ) ),
224+
toCanvasCoordinates( QgsPointXY( mapPoly[0].x(), y ) ) + canvasMaxDimension * QPointF( std::cos( -canvasRotationRad ), -std::sin( -canvasRotationRad ) ) );
225+
214226
}
215227
}
216228

0 commit comments

Comments
 (0)