void QgsMapToolCircularStringCurvePoint::cadCanvasReleaseEvent( QgsMapMouseEvent* e ) { QgsPointV2 mapPoint( e->mapPoint() ); if ( e->button() == Qt::LeftButton ) { mPoints.append( mapPoint ); if ( !mCenterPointRubberBand && mShowCenterPointRubberBand ) { createCenterPointRubberBand(); } if ( !mPoints.isEmpty() ) { if ( !mTempRubberBand ) { mTempRubberBand = createGeometryRubberBand(( mode() == CapturePolygon ) ? QgsWkbTypes::PolygonGeometry : QgsWkbTypes::LineGeometry, true ); mTempRubberBand->show(); } QgsCircularStringV2* c = new QgsCircularStringV2(); QgsPointSequenceV2 rubberBandPoints = mPoints.mid( mPoints.size() - 1 - ( mPoints.size() + 1 ) % 2 ); rubberBandPoints.append( mapPoint ); c->setPoints( rubberBandPoints ); mTempRubberBand->setGeometry( c ); } if ( mPoints.size() > 1 && mPoints.size() % 2 ) { if ( !mRubberBand ) { mRubberBand = createGeometryRubberBand(( mode() == CapturePolygon ) ? QgsWkbTypes::PolygonGeometry : QgsWkbTypes::LineGeometry ); mRubberBand->show(); } QgsCircularStringV2* c = new QgsCircularStringV2(); QgsPointSequenceV2 rubberBandPoints = mPoints; rubberBandPoints.append( mapPoint ); c->setPoints( rubberBandPoints ); mRubberBand->setGeometry( c ); removeCenterPointRubberBand(); } } else if ( e->button() == Qt::RightButton ) { deactivate(); if ( mParentTool ) { mParentTool->canvasReleaseEvent( e ); } } }
void QgsMapToolCircularStringRadius::recalculateTempRubberBand( const QgsPoint& mousePosition ) { QList<QgsPointV2> rubberBandPoints; if ( !( mPoints.size() % 2 ) ) { //recalculate midpoint on circle segment QgsPointV2 midPoint; if ( !QgsGeometryUtils::segmentMidPoint( mPoints.at( mPoints.size() - 2 ), mTemporaryEndPoint, midPoint, mRadius, QgsPointV2( mousePosition ) ) ) { return; } mPoints.replace( mPoints.size() - 1, midPoint ); rubberBandPoints.append( mPoints.at( mPoints.size() - 2 ) ); rubberBandPoints.append( mPoints.last() ); rubberBandPoints.append( mTemporaryEndPoint ); } else { rubberBandPoints.append( mPoints.last() ); rubberBandPoints.append( QgsPointV2( mousePosition ) ); } QgsCircularStringV2* cString = new QgsCircularStringV2(); cString->setPoints( rubberBandPoints ); delete mTempRubberBand; mTempRubberBand = createGeometryRubberBand(( mode() == CapturePolygon ) ? QGis::Polygon : QGis::Line, true ); mTempRubberBand->setGeometry( cString ); mTempRubberBand->show(); }
void QgsMapToolAddCircularString::activate() { if ( mParentTool ) { mParentTool->deleteTempRubberBand(); if ( mPoints.isEmpty() ) { // if the parent tool has a curve, use its last point as the first point in this curve 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 ) ); if ( !mTempRubberBand ) { mTempRubberBand = createGeometryRubberBand(( mode() == CapturePolygon ) ? Qgis::Polygon : Qgis::Line, true ); mTempRubberBand->show(); } QgsCircularStringV2* c = new QgsCircularStringV2(); QgsPointSequenceV2 rubberBandPoints = mPoints; rubberBandPoints.append( QgsPointV2( mapPoint ) ); c->setPoints( rubberBandPoints ); mTempRubberBand->setGeometry( c ); } } } } QgsMapToolCapture::activate(); }
void QgsMapToolCircularStringRadius::recalculateRubberBand() { if ( mPoints.size() >= 3 ) { 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(); } }
void QgsMapToolCircularStringRadius::recalculateCircularString() { //new midpoint on circle segment QgsPointV2 midPoint; if ( !QgsGeometryUtils::segmentMidPoint( mPoints.last(), QgsPointV2( mTemporaryEndPointX, mTemporaryEndPointY ), midPoint, mRadius, mLastMouseMapPos ) ) { return; } QList<QgsPointV2> rubberBandPoints = mPoints; rubberBandPoints.append( midPoint ); rubberBandPoints.append( QgsPointV2( mTemporaryEndPointX, mTemporaryEndPointY ) ); QgsCircularStringV2* cString = new QgsCircularStringV2(); cString->setPoints( rubberBandPoints ); delete mRubberBand; mRubberBand = createGeometryRubberBand(( mode() == CapturePolygon ) ? QGis::Polygon : QGis::Line ); mRubberBand->setGeometry( cString ); mRubberBand->show(); }
void QgsMapToolAddCircularString::updateCenterPointRubberBand( const QgsPointV2& pt ) { if ( !mShowCenterPointRubberBand || !mCenterPointRubberBand || mPoints.size() < 2 ) { return; } if (( mPoints.size() ) % 2 != 0 ) { return; } //create circular string QgsCircularStringV2* cs = new QgsCircularStringV2(); QgsPointSequenceV2 csPoints; csPoints.append( mPoints.at( mPoints.size() - 2 ) ); csPoints.append( mPoints.at( mPoints.size() - 1 ) ); csPoints.append( pt ); cs->setPoints( csPoints ); QgsPointV2 center; double radius; QgsGeometryUtils::circleCenterRadius( csPoints.at( 0 ), csPoints.at( 1 ), csPoints.at( 2 ), radius, center.rx(), center.ry() ); QgsLineStringV2* segment1 = new QgsLineStringV2(); segment1->addVertex( center ); segment1->addVertex( csPoints.at( 0 ) ); QgsLineStringV2* segment2 = new QgsLineStringV2(); segment2->addVertex( csPoints.at( 2 ) ); segment2->addVertex( center ); QgsCompoundCurveV2* cc = new QgsCompoundCurveV2(); cc->addCurve( segment1 ); cc->addCurve( cs ); cc->addCurve( segment2 ); QgsCurvePolygonV2* cp = new QgsCurvePolygonV2(); cp->setExteriorRing( cc ); mCenterPointRubberBand->setGeometry( cp ); mCenterPointRubberBand->show(); }
void QgsMapToolAddCircularString::deactivate() { if ( !mParentTool || mPoints.size() < 3 ) { return; } if ( mPoints.size() % 2 == 0 ) //a valid circularstring needs to have an odd number of vertices { mPoints.removeLast(); } QgsCircularStringV2* c = new QgsCircularStringV2(); c->setPoints( mPoints ); mParentTool->addCurve( c ); mPoints.clear(); delete mRubberBand; mRubberBand = 0; removeCenterPointRubberBand(); QgsMapToolCapture::deactivate(); }