@@ -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