Skip to content

Commit 3cd9383

Browse files
committed
centerpoint-rubberband works w/ maptool circular by radius
1 parent 931b3d1 commit 3cd9383

File tree

2 files changed

+51
-48
lines changed

2 files changed

+51
-48
lines changed

src/app/qgsmaptoolcircularstringradius.cpp

Lines changed: 50 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@ QgsMapToolCircularStringRadius::QgsMapToolCircularStringRadius( QgsMapToolCaptur
2929
: QgsMapToolAddCircularString( parentTool, canvas, mode ),
3030
mTemporaryEndPointX( 0.0 ),
3131
mTemporaryEndPointY( 0.0 ),
32-
mRadiusMode( false ),
3332
mRadius( 0.0 ),
3433
mRadiusSpinBox( nullptr )
3534
{
@@ -41,6 +40,12 @@ QgsMapToolCircularStringRadius::~QgsMapToolCircularStringRadius()
4140

4241
}
4342

43+
void QgsMapToolCircularStringRadius::deactivate()
44+
{
45+
deleteRadiusSpinBox();
46+
QgsMapToolAddCircularString::deactivate();
47+
}
48+
4449
void QgsMapToolCircularStringRadius::cadCanvasReleaseEvent( QgsMapMouseEvent* e )
4550
{
4651
QgsPointV2 mapPoint( e->mapPoint().x(), e->mapPoint().y() );
@@ -50,45 +55,41 @@ void QgsMapToolCircularStringRadius::cadCanvasReleaseEvent( QgsMapMouseEvent* e
5055
if ( mPoints.isEmpty() )
5156
{
5257
mPoints.append( mapPoint );
53-
return;
5458
}
55-
56-
if ( mPoints.size() % 2 == 1 )
59+
else
5760
{
58-
if ( !mRadiusMode )
61+
if ( mPoints.size() % 2 )
5962
{
6063
mTemporaryEndPointX = mapPoint.x();
6164
mTemporaryEndPointY = mapPoint.y();
6265

6366
//initial radius is distance( tempPoint - mPoints.last ) / 2.0
6467
double minRadius = sqrt( QgsGeometryUtils::sqrDistance2D( mPoints.last(), QgsPointV2( mTemporaryEndPointX, mTemporaryEndPointY ) ) ) / 2.0;
6568
mRadius = minRadius + minRadius / 10.0;
66-
createRadiusSpinBox();
67-
if ( mRadiusSpinBox )
68-
{
69-
mRadiusSpinBox->setMinimum( minRadius );
70-
}
71-
}
72-
else
73-
{
69+
7470
QgsPointV2 result;
7571
if ( QgsGeometryUtils::segmentMidPoint( mPoints.last(), QgsPointV2( mTemporaryEndPointX, mTemporaryEndPointY ), result, mRadius, QgsPointV2( mapPoint.x(), mapPoint.y() ) ) )
7672
{
7773
mPoints.append( result );
78-
mPoints.append( QgsPointV2( mTemporaryEndPointX, mTemporaryEndPointY ) );
74+
createRadiusSpinBox();
75+
if ( mRadiusSpinBox )
76+
{
77+
mRadiusSpinBox->setMinimum( minRadius );
78+
}
7979
}
80+
}
81+
else
82+
{
83+
mPoints.append( QgsPointV2( mTemporaryEndPointX, mTemporaryEndPointY ) );
8084
deleteRadiusSpinBox();
8185
}
82-
mRadiusMode = !mRadiusMode;
8386
recalculateCircularString();
8487
}
85-
else
86-
{
87-
//can we get there?
88-
}
8988
}
9089
else if ( e->button() == Qt::RightButton )
9190
{
91+
if ( !( mPoints.size() % 2 ) )
92+
mPoints.removeLast();
9293
deactivate();
9394
if ( mParentTool )
9495
{
@@ -99,46 +100,48 @@ void QgsMapToolCircularStringRadius::cadCanvasReleaseEvent( QgsMapMouseEvent* e
99100

100101
void QgsMapToolCircularStringRadius::cadCanvasMoveEvent( QgsMapMouseEvent* e )
101102
{
102-
if ( !mPoints.isEmpty() && mRadiusMode )
103+
if ( !mPoints.isEmpty() )
103104
{
104105
mLastMouseMapPos.setX( e->mapPoint().x() );
105106
mLastMouseMapPos.setY( e->mapPoint().y() );
106107
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 ) );
119109
}
120110
}
121111

122112
void QgsMapToolCircularStringRadius::recalculateCircularString()
123113
{
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 )
135115
{
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();
137123
}
138124

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+
}
142145
QgsCircularStringV2* cString = new QgsCircularStringV2();
143146
cString->setPoints( rubberBandPoints );
144147
delete mTempRubberBand;

src/app/qgsmaptoolcircularstringradius.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,14 +31,14 @@ class QgsMapToolCircularStringRadius: public QgsMapToolAddCircularString
3131

3232
virtual void cadCanvasReleaseEvent( QgsMapMouseEvent* e ) override;
3333
virtual void cadCanvasMoveEvent( QgsMapMouseEvent* e ) override;
34+
virtual void deactivate() override;
3435

3536
private slots:
3637
void updateRadiusFromSpinBox( double radius );
3738

3839
private:
3940
double mTemporaryEndPointX;
4041
double mTemporaryEndPointY;
41-
bool mRadiusMode;
4242
double mRadius;
4343
QgsPointV2 mLastMouseMapPos;
4444
QDoubleSpinBox* mRadiusSpinBox;

0 commit comments

Comments
 (0)