@@ -29,7 +29,6 @@ QgsMapToolCircularStringRadius::QgsMapToolCircularStringRadius( QgsMapToolCaptur
29
29
: QgsMapToolAddCircularString( parentTool, canvas, mode ),
30
30
mTemporaryEndPointX( 0.0 ),
31
31
mTemporaryEndPointY( 0.0 ),
32
- mRadiusMode( false ),
33
32
mRadius( 0.0 ),
34
33
mRadiusSpinBox( nullptr )
35
34
{
@@ -41,6 +40,12 @@ QgsMapToolCircularStringRadius::~QgsMapToolCircularStringRadius()
41
40
42
41
}
43
42
43
+ void QgsMapToolCircularStringRadius::deactivate ()
44
+ {
45
+ deleteRadiusSpinBox ();
46
+ QgsMapToolAddCircularString::deactivate ();
47
+ }
48
+
44
49
void QgsMapToolCircularStringRadius::cadCanvasReleaseEvent ( QgsMapMouseEvent* e )
45
50
{
46
51
QgsPointV2 mapPoint ( e->mapPoint ().x (), e->mapPoint ().y () );
@@ -50,45 +55,41 @@ void QgsMapToolCircularStringRadius::cadCanvasReleaseEvent( QgsMapMouseEvent* e
50
55
if ( mPoints .isEmpty () )
51
56
{
52
57
mPoints .append ( mapPoint );
53
- return ;
54
58
}
55
-
56
- if ( mPoints .size () % 2 == 1 )
59
+ else
57
60
{
58
- if ( ! mRadiusMode )
61
+ if ( mPoints . size () % 2 )
59
62
{
60
63
mTemporaryEndPointX = mapPoint.x ();
61
64
mTemporaryEndPointY = mapPoint.y ();
62
65
63
66
// initial radius is distance( tempPoint - mPoints.last ) / 2.0
64
67
double minRadius = sqrt ( QgsGeometryUtils::sqrDistance2D ( mPoints .last (), QgsPointV2 ( mTemporaryEndPointX , mTemporaryEndPointY ) ) ) / 2.0 ;
65
68
mRadius = minRadius + minRadius / 10.0 ;
66
- createRadiusSpinBox ();
67
- if ( mRadiusSpinBox )
68
- {
69
- mRadiusSpinBox ->setMinimum ( minRadius );
70
- }
71
- }
72
- else
73
- {
69
+
74
70
QgsPointV2 result;
75
71
if ( QgsGeometryUtils::segmentMidPoint ( mPoints .last (), QgsPointV2 ( mTemporaryEndPointX , mTemporaryEndPointY ), result, mRadius , QgsPointV2 ( mapPoint.x (), mapPoint.y () ) ) )
76
72
{
77
73
mPoints .append ( result );
78
- mPoints .append ( QgsPointV2 ( mTemporaryEndPointX , mTemporaryEndPointY ) );
74
+ createRadiusSpinBox ();
75
+ if ( mRadiusSpinBox )
76
+ {
77
+ mRadiusSpinBox ->setMinimum ( minRadius );
78
+ }
79
79
}
80
+ }
81
+ else
82
+ {
83
+ mPoints .append ( QgsPointV2 ( mTemporaryEndPointX , mTemporaryEndPointY ) );
80
84
deleteRadiusSpinBox ();
81
85
}
82
- mRadiusMode = !mRadiusMode ;
83
86
recalculateCircularString ();
84
87
}
85
- else
86
- {
87
- // can we get there?
88
- }
89
88
}
90
89
else if ( e->button () == Qt::RightButton )
91
90
{
91
+ if ( !( mPoints .size () % 2 ) )
92
+ mPoints .removeLast ();
92
93
deactivate ();
93
94
if ( mParentTool )
94
95
{
@@ -99,46 +100,48 @@ void QgsMapToolCircularStringRadius::cadCanvasReleaseEvent( QgsMapMouseEvent* e
99
100
100
101
void QgsMapToolCircularStringRadius::cadCanvasMoveEvent ( QgsMapMouseEvent* e )
101
102
{
102
- if ( !mPoints .isEmpty () && mRadiusMode )
103
+ if ( !mPoints .isEmpty () )
103
104
{
104
105
mLastMouseMapPos .setX ( e->mapPoint ().x () );
105
106
mLastMouseMapPos .setY ( e->mapPoint ().y () );
106
107
recalculateCircularString ();
107
- }
108
- if ( !mPoints .isEmpty () && !mRadiusMode )
109
- {
110
- delete mTempRubberBand ;
111
- mTempRubberBand = createGeometryRubberBand (( mode () == CapturePolygon ) ? QGis::Polygon : QGis::Line, true );
112
- QgsCircularStringV2* cString = new QgsCircularStringV2 ();
113
- QList<QgsPointV2> rubberBandPoints;
114
- rubberBandPoints.append ( mPoints .last () );
115
- rubberBandPoints.append ( QgsPointV2 ( e->mapPoint () ) );
116
- cString->setPoints ( rubberBandPoints );
117
- mTempRubberBand ->setGeometry ( cString );
118
- mTempRubberBand ->show ();
108
+ updateCenterPointRubberBand ( QgsPointV2 ( mTemporaryEndPointX , mTemporaryEndPointY ) );
119
109
}
120
110
}
121
111
122
112
void QgsMapToolCircularStringRadius::recalculateCircularString ()
123
113
{
124
- QgsCircularStringV2* cString2 = new QgsCircularStringV2 ();
125
- cString2->setPoints ( mPoints );
126
- delete mRubberBand ;
127
- mRubberBand = createGeometryRubberBand (( mode () == CapturePolygon ) ? QGis::Polygon : QGis::Line );
128
- mRubberBand ->setGeometry ( cString2 );
129
- mRubberBand ->show ();
130
-
131
- // new midpoint on circle segment
132
- QgsPointV2 midPoint;
133
- if ( !QgsGeometryUtils::segmentMidPoint ( mPoints .last (), QgsPointV2 ( mTemporaryEndPointX , mTemporaryEndPointY ), midPoint, mRadius ,
134
- mLastMouseMapPos ) )
114
+ if ( mPoints .size () >= 3 )
135
115
{
136
- return ;
116
+ QgsCircularStringV2* cString = new QgsCircularStringV2 ();
117
+ int rubberBandSize = mPoints .size () - ( mPoints .size () + 1 ) % 2 ;
118
+ cString->setPoints ( mPoints .mid ( 0 , rubberBandSize ) );
119
+ delete mRubberBand ;
120
+ mRubberBand = createGeometryRubberBand (( mode () == CapturePolygon ) ? QGis::Polygon : QGis::Line );
121
+ mRubberBand ->setGeometry ( cString );
122
+ mRubberBand ->show ();
137
123
}
138
124
139
- QList<QgsPointV2> rubberBandPoints = mPoints ;
140
- rubberBandPoints.append ( midPoint );
141
- rubberBandPoints.append ( QgsPointV2 ( mTemporaryEndPointX , mTemporaryEndPointY ) );
125
+ QList<QgsPointV2> rubberBandPoints;
126
+ if ( !( mPoints .size () % 2 ) )
127
+ {
128
+ // recalculate midpoint on circle segment
129
+ QgsPointV2 midPoint;
130
+ if ( !QgsGeometryUtils::segmentMidPoint ( mPoints .at ( mPoints .size () - 2 ), QgsPointV2 ( mTemporaryEndPointX , mTemporaryEndPointY ), midPoint, mRadius ,
131
+ mLastMouseMapPos ) )
132
+ {
133
+ return ;
134
+ }
135
+ mPoints .replace ( mPoints .size () - 1 , midPoint );
136
+ rubberBandPoints.append ( mPoints .at ( mPoints .size () - 2 ) );
137
+ rubberBandPoints.append ( mPoints .last () );
138
+ rubberBandPoints.append ( QgsPointV2 ( mTemporaryEndPointX , mTemporaryEndPointY ) );
139
+ }
140
+ else
141
+ {
142
+ rubberBandPoints.append ( mPoints .last () );
143
+ rubberBandPoints.append ( mLastMouseMapPos );
144
+ }
142
145
QgsCircularStringV2* cString = new QgsCircularStringV2 ();
143
146
cString->setPoints ( rubberBandPoints );
144
147
delete mTempRubberBand ;
0 commit comments