Skip to content

Commit

Permalink
centerpoint-rubberband works w/ maptool circular by radius
Browse files Browse the repository at this point in the history
  • Loading branch information
SebDieBln committed Dec 21, 2015
1 parent 931b3d1 commit 3cd9383
Show file tree
Hide file tree
Showing 2 changed files with 51 additions and 48 deletions.
97 changes: 50 additions & 47 deletions src/app/qgsmaptoolcircularstringradius.cpp
Expand Up @@ -29,7 +29,6 @@ QgsMapToolCircularStringRadius::QgsMapToolCircularStringRadius( QgsMapToolCaptur
: QgsMapToolAddCircularString( parentTool, canvas, mode ), : QgsMapToolAddCircularString( parentTool, canvas, mode ),
mTemporaryEndPointX( 0.0 ), mTemporaryEndPointX( 0.0 ),
mTemporaryEndPointY( 0.0 ), mTemporaryEndPointY( 0.0 ),
mRadiusMode( false ),
mRadius( 0.0 ), mRadius( 0.0 ),
mRadiusSpinBox( nullptr ) mRadiusSpinBox( nullptr )
{ {
Expand All @@ -41,6 +40,12 @@ QgsMapToolCircularStringRadius::~QgsMapToolCircularStringRadius()


} }


void QgsMapToolCircularStringRadius::deactivate()
{
deleteRadiusSpinBox();
QgsMapToolAddCircularString::deactivate();
}

void QgsMapToolCircularStringRadius::cadCanvasReleaseEvent( QgsMapMouseEvent* e ) void QgsMapToolCircularStringRadius::cadCanvasReleaseEvent( QgsMapMouseEvent* e )
{ {
QgsPointV2 mapPoint( e->mapPoint().x(), e->mapPoint().y() ); QgsPointV2 mapPoint( e->mapPoint().x(), e->mapPoint().y() );
Expand All @@ -50,45 +55,41 @@ void QgsMapToolCircularStringRadius::cadCanvasReleaseEvent( QgsMapMouseEvent* e
if ( mPoints.isEmpty() ) if ( mPoints.isEmpty() )
{ {
mPoints.append( mapPoint ); mPoints.append( mapPoint );
return;
} }

else
if ( mPoints.size() % 2 == 1 )
{ {
if ( !mRadiusMode ) if ( mPoints.size() % 2 )
{ {
mTemporaryEndPointX = mapPoint.x(); mTemporaryEndPointX = mapPoint.x();
mTemporaryEndPointY = mapPoint.y(); mTemporaryEndPointY = mapPoint.y();


//initial radius is distance( tempPoint - mPoints.last ) / 2.0 //initial radius is distance( tempPoint - mPoints.last ) / 2.0
double minRadius = sqrt( QgsGeometryUtils::sqrDistance2D( mPoints.last(), QgsPointV2( mTemporaryEndPointX, mTemporaryEndPointY ) ) ) / 2.0; double minRadius = sqrt( QgsGeometryUtils::sqrDistance2D( mPoints.last(), QgsPointV2( mTemporaryEndPointX, mTemporaryEndPointY ) ) ) / 2.0;
mRadius = minRadius + minRadius / 10.0; mRadius = minRadius + minRadius / 10.0;
createRadiusSpinBox();
if ( mRadiusSpinBox )
{
mRadiusSpinBox->setMinimum( minRadius );
}
}
else
{
QgsPointV2 result; QgsPointV2 result;
if ( QgsGeometryUtils::segmentMidPoint( mPoints.last(), QgsPointV2( mTemporaryEndPointX, mTemporaryEndPointY ), result, mRadius, QgsPointV2( mapPoint.x(), mapPoint.y() ) ) ) if ( QgsGeometryUtils::segmentMidPoint( mPoints.last(), QgsPointV2( mTemporaryEndPointX, mTemporaryEndPointY ), result, mRadius, QgsPointV2( mapPoint.x(), mapPoint.y() ) ) )
{ {
mPoints.append( result ); mPoints.append( result );
mPoints.append( QgsPointV2( mTemporaryEndPointX, mTemporaryEndPointY ) ); createRadiusSpinBox();
if ( mRadiusSpinBox )
{
mRadiusSpinBox->setMinimum( minRadius );
}
} }
}
else
{
mPoints.append( QgsPointV2( mTemporaryEndPointX, mTemporaryEndPointY ) );
deleteRadiusSpinBox(); deleteRadiusSpinBox();
} }
mRadiusMode = !mRadiusMode;
recalculateCircularString(); recalculateCircularString();
} }
else
{
//can we get there?
}
} }
else if ( e->button() == Qt::RightButton ) else if ( e->button() == Qt::RightButton )
{ {
if ( !( mPoints.size() % 2 ) )
mPoints.removeLast();
deactivate(); deactivate();
if ( mParentTool ) if ( mParentTool )
{ {
Expand All @@ -99,46 +100,48 @@ void QgsMapToolCircularStringRadius::cadCanvasReleaseEvent( QgsMapMouseEvent* e


void QgsMapToolCircularStringRadius::cadCanvasMoveEvent( QgsMapMouseEvent* e ) void QgsMapToolCircularStringRadius::cadCanvasMoveEvent( QgsMapMouseEvent* e )
{ {
if ( !mPoints.isEmpty() && mRadiusMode ) if ( !mPoints.isEmpty() )
{ {
mLastMouseMapPos.setX( e->mapPoint().x() ); mLastMouseMapPos.setX( e->mapPoint().x() );
mLastMouseMapPos.setY( e->mapPoint().y() ); mLastMouseMapPos.setY( e->mapPoint().y() );
recalculateCircularString(); recalculateCircularString();
} updateCenterPointRubberBand( QgsPointV2( mTemporaryEndPointX, mTemporaryEndPointY ) );
if ( !mPoints.isEmpty() && !mRadiusMode )
{
delete mTempRubberBand;
mTempRubberBand = createGeometryRubberBand(( mode() == CapturePolygon ) ? QGis::Polygon : QGis::Line, true );
QgsCircularStringV2* cString = new QgsCircularStringV2();
QList<QgsPointV2> rubberBandPoints;
rubberBandPoints.append( mPoints.last() );
rubberBandPoints.append( QgsPointV2( e->mapPoint() ) );
cString->setPoints( rubberBandPoints );
mTempRubberBand->setGeometry( cString );
mTempRubberBand->show();
} }
} }


void QgsMapToolCircularStringRadius::recalculateCircularString() void QgsMapToolCircularStringRadius::recalculateCircularString()
{ {
QgsCircularStringV2* cString2 = new QgsCircularStringV2(); if ( mPoints.size() >= 3 )
cString2->setPoints( mPoints );
delete mRubberBand;
mRubberBand = createGeometryRubberBand(( mode() == CapturePolygon ) ? QGis::Polygon : QGis::Line );
mRubberBand->setGeometry( cString2 );
mRubberBand->show();

//new midpoint on circle segment
QgsPointV2 midPoint;
if ( !QgsGeometryUtils::segmentMidPoint( mPoints.last(), QgsPointV2( mTemporaryEndPointX, mTemporaryEndPointY ), midPoint, mRadius,
mLastMouseMapPos ) )
{ {
return; QgsCircularStringV2* cString = new QgsCircularStringV2();
int rubberBandSize = mPoints.size() - ( mPoints.size() + 1 ) % 2;
cString->setPoints( mPoints.mid( 0, rubberBandSize ) );
delete mRubberBand;
mRubberBand = createGeometryRubberBand(( mode() == CapturePolygon ) ? QGis::Polygon : QGis::Line );
mRubberBand->setGeometry( cString );
mRubberBand->show();
} }


QList<QgsPointV2> rubberBandPoints = mPoints; QList<QgsPointV2> rubberBandPoints;
rubberBandPoints.append( midPoint ); if ( !( mPoints.size() % 2 ) )
rubberBandPoints.append( QgsPointV2( mTemporaryEndPointX, mTemporaryEndPointY ) ); {
//recalculate midpoint on circle segment
QgsPointV2 midPoint;
if ( !QgsGeometryUtils::segmentMidPoint( mPoints.at( mPoints.size() - 2 ), QgsPointV2( mTemporaryEndPointX, mTemporaryEndPointY ), midPoint, mRadius,
mLastMouseMapPos ) )
{
return;
}
mPoints.replace( mPoints.size() - 1, midPoint );
rubberBandPoints.append( mPoints.at( mPoints.size() - 2 ) );
rubberBandPoints.append( mPoints.last() );
rubberBandPoints.append( QgsPointV2( mTemporaryEndPointX, mTemporaryEndPointY ) );
}
else
{
rubberBandPoints.append( mPoints.last() );
rubberBandPoints.append( mLastMouseMapPos );
}
QgsCircularStringV2* cString = new QgsCircularStringV2(); QgsCircularStringV2* cString = new QgsCircularStringV2();
cString->setPoints( rubberBandPoints ); cString->setPoints( rubberBandPoints );
delete mTempRubberBand; delete mTempRubberBand;
Expand Down
2 changes: 1 addition & 1 deletion src/app/qgsmaptoolcircularstringradius.h
Expand Up @@ -31,14 +31,14 @@ class QgsMapToolCircularStringRadius: public QgsMapToolAddCircularString


virtual void cadCanvasReleaseEvent( QgsMapMouseEvent* e ) override; virtual void cadCanvasReleaseEvent( QgsMapMouseEvent* e ) override;
virtual void cadCanvasMoveEvent( QgsMapMouseEvent* e ) override; virtual void cadCanvasMoveEvent( QgsMapMouseEvent* e ) override;
virtual void deactivate() override;


private slots: private slots:
void updateRadiusFromSpinBox( double radius ); void updateRadiusFromSpinBox( double radius );


private: private:
double mTemporaryEndPointX; double mTemporaryEndPointX;
double mTemporaryEndPointY; double mTemporaryEndPointY;
bool mRadiusMode;
double mRadius; double mRadius;
QgsPointV2 mLastMouseMapPos; QgsPointV2 mLastMouseMapPos;
QDoubleSpinBox* mRadiusSpinBox; QDoubleSpinBox* mRadiusSpinBox;
Expand Down

0 comments on commit 3cd9383

Please sign in to comment.