@@ -38,7 +38,16 @@ void QgsAdvancedDigitizingCanvasItem::paint( QPainter *painter )
38
38
if ( !mAdvancedDigitizingDockWidget ->cadEnabled () )
39
39
return ;
40
40
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
+ );
42
51
if ( rect () != mapRect )
43
52
setRect ( mapRect );
44
53
@@ -54,12 +63,16 @@ void QgsAdvancedDigitizingCanvasItem::paint( QPainter *painter )
54
63
const QList<QgsPointXY> snappedSegment = mAdvancedDigitizingDockWidget ->snappedSegment ();
55
64
const bool hasSnappedSegment = snappedSegment.count () == 2 ;
56
65
57
- const bool curPointExist = mapRect. contains ( curPoint );
66
+ const bool curPointExist = mapPoly. containsPoint ( curPoint. toQPointF (), Qt::OddEvenFill );
58
67
59
68
const double mupp = mMapCanvas ->getCoordinateTransform ()->mapUnitsPerPixel ();
60
69
if ( mupp == 0 )
61
70
return ;
62
71
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
+
63
76
QPointF curPointPix, prevPointPix, penulPointPix, snapSegmentPix1, snapSegmentPix2;
64
77
65
78
if ( curPointExist )
@@ -116,19 +129,19 @@ void QgsAdvancedDigitizingCanvasItem::paint( QPainter *painter )
116
129
double a0, a;
117
130
if ( mAdvancedDigitizingDockWidget ->constraintAngle ()->relative () && nPoints > 2 )
118
131
{
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 ;
120
133
}
121
134
else
122
135
{
123
- a0 = 0 ;
136
+ a0 = canvasRotationRad ;
124
137
}
125
138
if ( mAdvancedDigitizingDockWidget ->constraintAngle ()->isLocked () )
126
139
{
127
140
a = a0 - mAdvancedDigitizingDockWidget ->constraintAngle ()->value () * M_PI / 180 ;
128
141
}
129
142
else
130
143
{
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 ;
132
145
}
133
146
painter->setPen ( mConstruction2Pen );
134
147
painter->drawArc ( QRectF ( prevPointPix.x () - 20 ,
@@ -143,9 +156,8 @@ void QgsAdvancedDigitizingCanvasItem::paint( QPainter *painter )
143
156
if ( mAdvancedDigitizingDockWidget ->constraintAngle ()->isLocked () )
144
157
{
145
158
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 ) ) );
149
161
}
150
162
}
151
163
@@ -167,7 +179,7 @@ void QgsAdvancedDigitizingCanvasItem::paint( QPainter *painter )
167
179
{
168
180
if ( nPoints > 1 )
169
181
{
170
- x = mAdvancedDigitizingDockWidget ->constraintX ()->value () / mupp + prevPointPix .x ();
182
+ x = mAdvancedDigitizingDockWidget ->constraintX ()->value () + prevPoint .x ();
171
183
}
172
184
else
173
185
{
@@ -176,12 +188,12 @@ void QgsAdvancedDigitizingCanvasItem::paint( QPainter *painter )
176
188
}
177
189
else
178
190
{
179
- x = toCanvasCoordinates ( QgsPointXY ( mAdvancedDigitizingDockWidget ->constraintX ()->value (), 0 ) ). x ();
191
+ x = mAdvancedDigitizingDockWidget ->constraintX ()->value ();
180
192
}
181
193
if ( draw )
182
194
{
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 ) ) );
185
197
}
186
198
}
187
199
@@ -195,8 +207,7 @@ void QgsAdvancedDigitizingCanvasItem::paint( QPainter *painter )
195
207
{
196
208
if ( nPoints > 1 )
197
209
{
198
- // y is reversed!
199
- y = -mAdvancedDigitizingDockWidget ->constraintY ()->value () / mupp + prevPointPix.y ();
210
+ y = mAdvancedDigitizingDockWidget ->constraintY ()->value () + prevPoint.y ();
200
211
}
201
212
else
202
213
{
@@ -205,12 +216,13 @@ void QgsAdvancedDigitizingCanvasItem::paint( QPainter *painter )
205
216
}
206
217
else
207
218
{
208
- y = toCanvasCoordinates ( QgsPointXY ( 0 , mAdvancedDigitizingDockWidget ->constraintY ()->value () ) ). y ();
219
+ y = mAdvancedDigitizingDockWidget ->constraintY ()->value ();
209
220
}
210
221
if ( draw )
211
222
{
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
+
214
226
}
215
227
}
216
228
0 commit comments