From 8b2331a40df065208b50647c9a67717233ed6378 Mon Sep 17 00:00:00 2001 From: lbartoletti Date: Tue, 13 Nov 2018 08:54:09 +0100 Subject: [PATCH] Paul's review --- src/app/qgsmaptooltrimextendfeature.cpp | 85 ++++++++++++------------- src/app/qgsmaptooltrimextendfeature.h | 25 +++++--- src/core/geometry/qgsgeometryutils.cpp | 2 +- src/core/geometry/qgsgeometryutils.h | 2 +- 4 files changed, 59 insertions(+), 55 deletions(-) diff --git a/src/app/qgsmaptooltrimextendfeature.cpp b/src/app/qgsmaptooltrimextendfeature.cpp index 843001a7314..6b7e1c36147 100644 --- a/src/app/qgsmaptooltrimextendfeature.cpp +++ b/src/app/qgsmaptooltrimextendfeature.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - qgmaptoolextendfeature.cpp - map tool for extending feature + qgmaptooltrimextendfeature.cpp - map tool to trim or extend feature --------------------- begin : October 2018 copyright : (C) 2018 by Loïc Bartoletti @@ -73,19 +73,19 @@ static void getPoints( const QgsPointLocator::Match &match, QgsPoint &p1, QgsPoi void QgsMapToolTrimExtendFeature::canvasMoveEvent( QgsMapMouseEvent *e ) { - mapPoint = e->mapPoint(); + mMapPoint = e->mapPoint(); FeatureFilter filter; QgsPointLocator::Match match; - switch ( step ) + switch ( mStep ) { - case 0: + case StepLimit: - match = mCanvas->snappingUtils()->snapToMap( mapPoint, &filter ); + match = mCanvas->snappingUtils()->snapToMap( mMapPoint, &filter ); if ( match.isValid() ) { - is3DLayer = QgsWkbTypes::hasZ( match.layer()->wkbType() ); + mIs3DLayer = QgsWkbTypes::hasZ( match.layer()->wkbType() ); QgsPointXY p1, p2; match.edgePoints( p1, p2 ); @@ -96,31 +96,30 @@ void QgsMapToolTrimExtendFeature::canvasMoveEvent( QgsMapMouseEvent *e ) mRubberBandLimit->show(); } - else + else if ( mRubberBandLimit ) { - if ( mRubberBandLimit ) mRubberBandLimit->hide(); } break; - case 1: + case StepExtend: QgsMapLayer *currentLayer = mCanvas->currentLayer(); if ( !currentLayer ) break; - vlayer = qobject_cast( currentLayer ); - if ( !vlayer ) + mVlayer = qobject_cast( currentLayer ); + if ( !mVlayer ) break; - if ( !vlayer->isEditable() ) + if ( !mVlayer->isEditable() ) break; - filter.setLayer( vlayer ); - match = mCanvas->snappingUtils()->snapToMap( mapPoint, &filter ); + filter.setLayer( mVlayer ); + match = mCanvas->snappingUtils()->snapToMap( mMapPoint, &filter ); if ( match.isValid() ) { - if ( match.layer() != vlayer ) + if ( match.layer() != mVlayer ) break; QgsPointXY p1, p2; @@ -132,34 +131,35 @@ void QgsMapToolTrimExtendFeature::canvasMoveEvent( QgsMapMouseEvent *e ) if ( ( ( pLimit1 == pExtend1 ) || ( pLimit1 == pExtend2 ) ) || ( ( pLimit2 == pExtend1 ) || ( pLimit2 == pExtend2 ) ) ) break; - segmentIntersects = QgsGeometryUtils::segmentIntersection( pLimit1, pLimit2, pExtend1, pExtend2, intersection, isIntersection, 1e-8, true ); + mSegmentIntersects = QgsGeometryUtils::segmentIntersection( pLimit1, pLimit2, pExtend1, pExtend2, mIntersection, mIsIntersection, 1e-8, true ); - if ( is3DLayer && QgsWkbTypes::hasZ( match.layer()->wkbType() ) ) + if ( mIs3DLayer && QgsWkbTypes::hasZ( match.layer()->wkbType() ) ) { /* Z Interpolation */ QgsLineString line( pLimit1, pLimit2 ); - intersection = QgsGeometryUtils::closestPoint( line, QgsPoint( intersection ) ); + mIntersection = QgsGeometryUtils::closestPoint( line, QgsPoint( mIntersection ) ); } - if ( isIntersection ) + if ( mIsIntersection ) { mRubberBandIntersection.reset( createRubberBand( QgsWkbTypes::PointGeometry ) ); - mRubberBandIntersection->addPoint( QgsPointXY( intersection ) ); + mRubberBandIntersection->addPoint( QgsPointXY( mIntersection ) ); mRubberBandIntersection->show(); mRubberBandExtend.reset( createRubberBand( match.layer()->geometryType() ) ); - geom = match.layer()->getGeometry( match.featureId() ); + mGeom = match.layer()->getGeometry( match.featureId() ); int index = match.vertexIndex(); - if ( !segmentIntersects ) + if ( !mSegmentIntersects ) { - QgsPoint ptInter( intersection.x(), intersection.y() ); + QgsPoint ptInter( mIntersection.x(), mIntersection.y() ); if ( pExtend2.distance( ptInter ) < pExtend1.distance( ptInter ) ) index += 1; } - else // TRIM PART + // TRIM PART + else if ( QgsGeometryUtils::leftOfLine( QgsPoint( mMapPoint ), pLimit1, pLimit2 ) != QgsGeometryUtils::leftOfLine( pExtend1, pLimit1, pLimit2 ) ) { // Part where the mouse is (+) will be trimed /* | @@ -177,15 +177,14 @@ void QgsMapToolTrimExtendFeature::canvasMoveEvent( QgsMapMouseEvent *e ) * + * | */ - if ( QgsGeometryUtils::leftOfLine( QgsPoint( mapPoint ), pLimit1, pLimit2 ) != QgsGeometryUtils::leftOfLine( pExtend1, pLimit1, pLimit2 ) ) index += 1; } - isModified = geom.moveVertex( intersection, index ); + mIsModified = mGeom.moveVertex( mIntersection, index ); - if ( isModified ) + if ( mIsModified ) { - mRubberBandExtend->setToGeometry( geom ); + mRubberBandExtend->setToGeometry( mGeom ); mRubberBandExtend->show(); } } @@ -210,31 +209,31 @@ void QgsMapToolTrimExtendFeature::canvasMoveEvent( QgsMapMouseEvent *e ) void QgsMapToolTrimExtendFeature::canvasReleaseEvent( QgsMapMouseEvent *e ) { - mapPoint = e->mapPoint(); + mMapPoint = e->mapPoint(); FeatureFilter filter; QgsPointLocator::Match match; if ( e->button() == Qt::LeftButton ) { - switch ( step ) + switch ( mStep ) { - case 0: - match = mCanvas->snappingUtils()->snapToMap( mapPoint, &filter ); + case StepLimit: + match = mCanvas->snappingUtils()->snapToMap( mMapPoint, &filter ); if ( mRubberBandLimit && mRubberBandLimit->isVisible() ) { getPoints( match, pLimit1, pLimit2 ); - step += 1; + mStep += 1; } break; - case 1: - if ( isModified ) + case StepExtend: + if ( mIsModified ) { - filter.setLayer( vlayer ); - match = mCanvas->snappingUtils()->snapToMap( mapPoint, &filter ); + filter.setLayer( mVlayer ); + match = mCanvas->snappingUtils()->snapToMap( mMapPoint, &filter ); match.layer()->beginEditCommand( tr( "Trim/Extend feature" ) ); - match.layer()->changeGeometry( match.featureId(), geom ); + match.layer()->changeGeometry( match.featureId(), mGeom ); match.layer()->endEditCommand(); match.layer()->triggerRepaint(); @@ -270,11 +269,11 @@ void QgsMapToolTrimExtendFeature::keyPressEvent( QKeyEvent *e ) void QgsMapToolTrimExtendFeature::deactivate() { - step = 0; - isModified = false; - is3DLayer = false; - isIntersection = false; - segmentIntersects = false; + mStep = 0; + mIsModified = false; + mIs3DLayer = false; + mIsIntersection = false; + mSegmentIntersects = false; mRubberBandLimit.reset(); mRubberBandExtend.reset(); mRubberBandIntersection.reset(); diff --git a/src/app/qgsmaptooltrimextendfeature.h b/src/app/qgsmaptooltrimextendfeature.h index bd698659a29..16cf089615d 100644 --- a/src/app/qgsmaptooltrimextendfeature.h +++ b/src/app/qgsmaptooltrimextendfeature.h @@ -1,5 +1,5 @@ /*************************************************************************** - qgmaptoolextendfeature.h - map tool for extending feature + qgmaptooltrimextendfeature.h - map tool to trim or extend feature --------------------- begin : October 2018 copyright : (C) 2018 by Loïc Bartoletti @@ -51,23 +51,28 @@ class APP_EXPORT QgsMapToolTrimExtendFeature : public QgsMapToolEdit //! Points for extend QgsPoint pExtend1, pExtend2; //! intersection point between the projection of [pExtend1 - pExtend2] on [pLimit1 - pLimit2] - QgsPoint intersection; + QgsPoint mIntersection; //! map point used to determine which edges will be used for trim the feature - QgsPointXY mapPoint; + QgsPointXY mMapPoint; //! geometry that will be returned - QgsGeometry geom; + QgsGeometry mGeom; //! Current layer which will be modified - QgsVectorLayer *vlayer = nullptr; + QgsVectorLayer *mVlayer = nullptr; //! Keep information about the state of the intersection - bool isIntersection = false; + bool mIsIntersection = false; //! Keep information of the first layer snapped is 3D or not - bool is3DLayer = false; + bool mIs3DLayer = false; //! if feature is modified - bool isModified = false; + bool mIsModified = false; //! if the segments are intersected = trim - bool segmentIntersects = false; + bool mSegmentIntersects = false; + enum Step + { + StepLimit, + StepExtend, + }; //! The first step (0): choose the limit. The second step (1): choose the segment to trim/extend - int step = 0; + int mStep = StepLimit; }; #endif // QGSMAPTOOLTRIMEXTENDFEATURE_H diff --git a/src/core/geometry/qgsgeometryutils.cpp b/src/core/geometry/qgsgeometryutils.cpp index bb676d18dbd..c13892a7122 100644 --- a/src/core/geometry/qgsgeometryutils.cpp +++ b/src/core/geometry/qgsgeometryutils.cpp @@ -529,7 +529,7 @@ QVector QgsGeometryUtils::selfIntersections( return intersections; } -int QgsGeometryUtils::leftOfLine( const QgsPoint point, const QgsPoint p1, const QgsPoint p2 ) +int QgsGeometryUtils::leftOfLine( const QgsPoint &point, const QgsPoint &p1, const QgsPoint &p2 ) { return leftOfLine( point.x(), point.y(), p1.x(), p1.y(), p2.x(), p2.y() ); } diff --git a/src/core/geometry/qgsgeometryutils.h b/src/core/geometry/qgsgeometryutils.h index 7d34db41f1c..7703f1da28f 100644 --- a/src/core/geometry/qgsgeometryutils.h +++ b/src/core/geometry/qgsgeometryutils.h @@ -255,7 +255,7 @@ class CORE_EXPORT QgsGeometryUtils * * \since QGIS 3.6 */ - static int leftOfLine( const QgsPoint point, const QgsPoint p1, const QgsPoint p2 ); + static int leftOfLine(const QgsPoint &point, const QgsPoint &p1, const QgsPoint &p2 ); /** * Returns a point a specified \a distance toward a second point.