void QgsMapToolCircularStringRadius::cadCanvasReleaseEvent( QgsMapMouseEvent* e ) { QgsPointV2 mapPoint( e->mapPoint() ); if ( e->button() == Qt::LeftButton ) { if ( mPoints.isEmpty() ) { mPoints.append( mapPoint ); } else { if ( mPoints.size() % 2 ) { mTemporaryEndPoint = mapPoint; //initial radius is distance( tempPoint - mPoints.last ) / 2.0 double minRadius = sqrt( QgsGeometryUtils::sqrDistance2D( mPoints.last(), mTemporaryEndPoint ) ) / 2.0; mRadius = minRadius + minRadius / 10.0; QgsPointV2 result; if ( QgsGeometryUtils::segmentMidPoint( mPoints.last(), mTemporaryEndPoint, result, mRadius, QgsPointV2( mapPoint.x(), mapPoint.y() ) ) ) { mPoints.append( result ); createRadiusSpinBox(); if ( mRadiusSpinBox ) { mRadiusSpinBox->setMinimum( minRadius ); } } } else { mPoints.append( mTemporaryEndPoint ); deleteRadiusSpinBox(); } recalculateRubberBand(); recalculateTempRubberBand( e->mapPoint() ); } } else if ( e->button() == Qt::RightButton ) { if ( !( mPoints.size() % 2 ) ) mPoints.removeLast(); deactivate(); if ( mParentTool ) { mParentTool->canvasReleaseEvent( e ); } } }
void QgsMapToolCircularStringRadius::cadCanvasReleaseEvent( QgsMapMouseEvent* e ) { QgsPointV2 mapPoint( e->mapPoint().x(), e->mapPoint().y() ); if ( e->button() == Qt::LeftButton ) { if ( mPoints.isEmpty() ) { //get first point from parent tool if there. Todo: move to upper class const QgsCompoundCurveV2* compoundCurve = mParentTool->captureCurve(); if ( compoundCurve && compoundCurve->nCurves() > 0 ) { const QgsCurveV2* curve = compoundCurve->curveAt( compoundCurve->nCurves() - 1 ); if ( curve ) { //mParentTool->captureCurve() is in layer coordinates, but we need map coordinates QgsPointV2 endPointLayerCoord = curve->endPoint(); QgsPoint mapPoint = toMapCoordinates( mCanvas->currentLayer(), QgsPoint( endPointLayerCoord.x(), endPointLayerCoord.y() ) ); mPoints.append( QgsPointV2( mapPoint.x(), mapPoint.y() ) ); } } else { mPoints.append( mapPoint ); return; } } if ( mPoints.size() % 2 == 1 ) { if ( !mRadiusMode ) { delete mRubberBand; mRubberBand = 0; mTemporaryEndPointX = mapPoint.x(); mTemporaryEndPointY = mapPoint.y(); mRadiusMode = true; //initial radius is distance( tempPoint - mPoints.last ) / 2.0 double minRadius = sqrt( QgsGeometryUtils::sqrDistance2D( mPoints.last(), QgsPointV2( mTemporaryEndPointX, mTemporaryEndPointY ) ) ) / 2.0; mRadius = minRadius + minRadius / 10.0; recalculateCircularString(); createRadiusSpinBox(); if ( mRadiusSpinBox ) { mRadiusSpinBox->setMinimum( minRadius ); } } else { QgsPointV2 result; if ( QgsGeometryUtils::segmentMidPoint( mPoints.last(), QgsPointV2( mTemporaryEndPointX, mTemporaryEndPointY ), result, mRadius, QgsPointV2( mapPoint.x(), mapPoint.y() ) ) ) { mPoints.append( result ); mPoints.append( QgsPointV2( mTemporaryEndPointX, mTemporaryEndPointY ) ); } mRadiusMode = false; deleteRadiusSpinBox(); } } else { //can we get there? } } else if ( e->button() == Qt::RightButton ) { deactivate(); if ( mParentTool ) { mParentTool->canvasReleaseEvent( e ); } } }