Skip to content

Commit

Permalink
Fixes to the advanced digitizing
Browse files Browse the repository at this point in the history
- make snapSegment() work if no segment was previously snapped
- fix highlight when a segment is snapped
- fix ghost marker at (0,0) when digitizing first point
  • Loading branch information
wonder-sk committed Feb 2, 2015
1 parent ca459ee commit d928caf
Show file tree
Hide file tree
Showing 6 changed files with 24 additions and 27 deletions.
6 changes: 3 additions & 3 deletions src/app/qgsadvanceddigitizingcanvasitem.cpp
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ void QgsAdvancedDigitizingCanvasItem::paint( QPainter* painter )
const QgsPoint curPoint = mAdvancedDigitizingDockWidget->currentPoint( ); const QgsPoint curPoint = mAdvancedDigitizingDockWidget->currentPoint( );
const QgsPoint prevPoint = mAdvancedDigitizingDockWidget->previousPoint( &previousPointExist ); const QgsPoint prevPoint = mAdvancedDigitizingDockWidget->previousPoint( &previousPointExist );
const QgsPoint penulPoint = mAdvancedDigitizingDockWidget->penultimatePoint( &penulPointExist ); const QgsPoint penulPoint = mAdvancedDigitizingDockWidget->penultimatePoint( &penulPointExist );
const bool pointSnapped = mAdvancedDigitizingDockWidget->pointSnapped(); const bool snappedToVertex = mAdvancedDigitizingDockWidget->snappedToVertex();
const QList<QgsPoint> snappedSegment = mAdvancedDigitizingDockWidget->snappedSegment(); const QList<QgsPoint> snappedSegment = mAdvancedDigitizingDockWidget->snappedSegment();
const bool hasSnappedSegment = snappedSegment.count() == 2; const bool hasSnappedSegment = snappedSegment.count() == 2;


Expand Down Expand Up @@ -81,14 +81,14 @@ void QgsAdvancedDigitizingCanvasItem::paint( QPainter* painter )
painter->setRenderHints( QPainter::Antialiasing ); painter->setRenderHints( QPainter::Antialiasing );


// Draw point snap // Draw point snap
if ( curPointExist && pointSnapped ) if ( curPointExist && snappedToVertex )
{ {
painter->setPen( mSnapPen ); painter->setPen( mSnapPen );
painter->drawEllipse( curPointPix, 10, 10 ); painter->drawEllipse( curPointPix, 10, 10 );
} }


// Draw segment snap // Draw segment snap
if ( hasSnappedSegment && !pointSnapped ) if ( hasSnappedSegment && !snappedToVertex )
{ {
painter->setPen( mSnapPen ); painter->setPen( mSnapPen );
painter->drawLine( snapSegmentPix1.x(), painter->drawLine( snapSegmentPix1.x(),
Expand Down
9 changes: 5 additions & 4 deletions src/app/qgsadvanceddigitizingdockwidget.cpp
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -90,7 +90,7 @@ QgsAdvancedDigitizingDockWidget::QgsAdvancedDigitizingDockWidget( QgsMapCanvas*
, mSnappingMode(( QgsMapMouseEvent::SnappingMode ) QSettings().value( "/Cad/SnappingMode", ( int )QgsMapMouseEvent::SnapProjectConfig ).toInt() ) , mSnappingMode(( QgsMapMouseEvent::SnappingMode ) QSettings().value( "/Cad/SnappingMode", ( int )QgsMapMouseEvent::SnapProjectConfig ).toInt() )
, mCommonAngleConstraint( QSettings().value( "/Cad/CommonAngle", 90 ).toInt() ) , mCommonAngleConstraint( QSettings().value( "/Cad/CommonAngle", 90 ).toInt() )
, mCadPointList( QList<QgsPoint>() ) , mCadPointList( QList<QgsPoint>() )
, mPointSnapped( false ) , mSnappedToVertex( false )
, mSnappedSegment( QList<QgsPoint>() ) , mSnappedSegment( QList<QgsPoint>() )
{ {
setupUi( this ); setupUi( this );
Expand Down Expand Up @@ -520,7 +520,8 @@ bool QgsAdvancedDigitizingDockWidget::applyConstraints( QgsMapMouseEvent* e )
QgsDebugMsg( QString( "X: %1 %2 %3" ).arg( mXConstraint->isLocked() ).arg( mXConstraint->relative() ).arg( mXConstraint->value() ) ); QgsDebugMsg( QString( "X: %1 %2 %3" ).arg( mXConstraint->isLocked() ).arg( mXConstraint->relative() ).arg( mXConstraint->value() ) );
QgsDebugMsg( QString( "Y: %1 %2 %3" ).arg( mYConstraint->isLocked() ).arg( mYConstraint->relative() ).arg( mYConstraint->value() ) ); QgsDebugMsg( QString( "Y: %1 %2 %3" ).arg( mYConstraint->isLocked() ).arg( mYConstraint->relative() ).arg( mYConstraint->value() ) );


QgsPoint point = e->mapPoint( &mPointSnapped ); QgsPoint point = e->mapPoint();
mSnappedToVertex = e->isSnappedToVertex();
mSnappedSegment = e->snapSegment(); mSnappedSegment = e->snapSegment();


bool previousPointExist, penulPointExist; bool previousPointExist, penulPointExist;
Expand Down Expand Up @@ -1136,7 +1137,7 @@ QgsPoint QgsAdvancedDigitizingDockWidget::currentPoint( bool* exist ) const
{ {
if ( exist ) if ( exist )
*exist = pointsCount() > 0; *exist = pointsCount() > 0;
if ( pointsCount() > 1 ) if ( pointsCount() > 0 )
return mCadPointList.at( 0 ); return mCadPointList.at( 0 );
else else
return QgsPoint(); return QgsPoint();
Expand Down Expand Up @@ -1190,7 +1191,7 @@ void QgsAdvancedDigitizingDockWidget::clearPoints()
{ {
mCadPointList.clear(); mCadPointList.clear();
mSnappedSegment.clear(); mSnappedSegment.clear();
mPointSnapped = false; mSnappedToVertex = false;


updateCapacity(); updateCapacity();
} }
Expand Down
4 changes: 2 additions & 2 deletions src/app/qgsadvanceddigitizingdockwidget.h
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -155,7 +155,7 @@ class APP_EXPORT QgsAdvancedDigitizingDockWidget : public QDockWidget, private U
QgsPoint previousPoint( bool *exist = 0 ) const; QgsPoint previousPoint( bool *exist = 0 ) const;
QgsPoint penultimatePoint( bool *exist = 0 ) const; QgsPoint penultimatePoint( bool *exist = 0 ) const;
int pointsCount() const {return mCadPointList.count();} int pointsCount() const {return mCadPointList.count();}
bool pointSnapped() const {return mPointSnapped;} bool snappedToVertex() const {return mSnappedToVertex;}
const QList<QgsPoint>& snappedSegment() const {return mSnappedSegment;} const QList<QgsPoint>& snappedSegment() const {return mSnappedSegment;}


//! return the action used to enable/disable the tools //! return the action used to enable/disable the tools
Expand Down Expand Up @@ -252,7 +252,7 @@ class APP_EXPORT QgsAdvancedDigitizingDockWidget : public QDockWidget, private U


// point list and current snap point / segment // point list and current snap point / segment
QList<QgsPoint> mCadPointList; QList<QgsPoint> mCadPointList;
bool mPointSnapped; bool mSnappedToVertex;
QList<QgsPoint> mSnappedSegment; QList<QgsPoint> mSnappedSegment;


// error message // error message
Expand Down
16 changes: 3 additions & 13 deletions src/app/qgsmapmouseevent.cpp
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ void QgsMapMouseEvent::snapPoint()
QgsTolerance::UnitType unit; QgsTolerance::UnitType unit;
snappingUtils->defaultSettings( type, tolerance, unit ); snappingUtils->defaultSettings( type, tolerance, unit );
snappingUtils->setSnapToMapMode( QgsSnappingUtils::SnapAllLayers ); snappingUtils->setSnapToMapMode( QgsSnappingUtils::SnapAllLayers );
snappingUtils->setDefaultSettings( QgsPointLocator::Vertex, tolerance, unit ); snappingUtils->setDefaultSettings( QgsPointLocator::Vertex | QgsPointLocator::Edge, tolerance, unit );
mSnapMatch = snappingUtils->snapToMap( mMapPoint ); mSnapMatch = snappingUtils->snapToMap( mMapPoint );
snappingUtils->setSnapToMapMode( canvasMode ); snappingUtils->setSnapToMapMode( canvasMode );
snappingUtils->setDefaultSettings( type, tolerance, unit ); snappingUtils->setDefaultSettings( type, tolerance, unit );
Expand All @@ -94,15 +94,6 @@ QPoint QgsMapMouseEvent::mapToPixelCoordinates( QgsMapCanvas* canvas, const QgsP
return QPoint( qRound( x ), qRound( y ) ); return QPoint( qRound( x ), qRound( y ) );
} }


QgsPoint QgsMapMouseEvent::mapPoint( bool* snappedPoint ) const
{
if ( snappedPoint )
{
*snappedPoint = mSnapMatch.isValid();
}
return mMapPoint;
}

QList<QgsPoint> QgsMapMouseEvent::snapSegment( bool* snapped, bool allLayers ) const QList<QgsPoint> QgsMapMouseEvent::snapSegment( bool* snapped, bool allLayers ) const
{ {
QList<QgsPoint> segment = QList<QgsPoint>(); QList<QgsPoint> segment = QList<QgsPoint>();
Expand All @@ -117,12 +108,11 @@ QList<QgsPoint> QgsMapMouseEvent::snapSegment( bool* snapped, bool allLayers ) c
else if ( mSnappingMode != NoSnapping ) else if ( mSnappingMode != NoSnapping )
{ {
QgsPointLocator::Match match; QgsPointLocator::Match match;
QgsPoint point;
if ( mSnappingMode == SnapProjectConfig && !allLayers ) if ( mSnappingMode == SnapProjectConfig && !allLayers )
{ {
// run snapToMap with only segments // run snapToMap with only segments
EdgesOnlyFilter filter; EdgesOnlyFilter filter;
match = mMapTool->canvas()->snappingUtils()->snapToMap( point, &filter ); match = mMapTool->canvas()->snappingUtils()->snapToMap( mOriginalPoint, &filter );
} }
else if ( mSnappingMode == SnapAllLayers || allLayers ) else if ( mSnappingMode == SnapAllLayers || allLayers )
{ {
Expand All @@ -135,7 +125,7 @@ QList<QgsPoint> QgsMapMouseEvent::snapSegment( bool* snapped, bool allLayers ) c
snappingUtils->defaultSettings( type, tolerance, unit ); snappingUtils->defaultSettings( type, tolerance, unit );
snappingUtils->setSnapToMapMode( QgsSnappingUtils::SnapAllLayers ); snappingUtils->setSnapToMapMode( QgsSnappingUtils::SnapAllLayers );
snappingUtils->setDefaultSettings( QgsPointLocator::Edge, tolerance, unit ); snappingUtils->setDefaultSettings( QgsPointLocator::Edge, tolerance, unit );
match = snappingUtils->snapToMap( point ); match = snappingUtils->snapToMap( mOriginalPoint );
snappingUtils->setSnapToMapMode( canvasMode ); snappingUtils->setSnapToMapMode( canvasMode );
snappingUtils->setDefaultSettings( type, tolerance, unit ); snappingUtils->setDefaultSettings( type, tolerance, unit );
} }
Expand Down
12 changes: 9 additions & 3 deletions src/app/qgsmapmouseevent.h
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -47,17 +47,23 @@ class APP_EXPORT QgsMapMouseEvent : public QMouseEvent
//! modify the point in map coordinates without changing values in pixel coordinates //! modify the point in map coordinates without changing values in pixel coordinates
void setPoint( const QgsPoint& point ); void setPoint( const QgsPoint& point );


//! returns the first snapped segment //! returns the first snapped segment. If the snapped match is a segment, it will simply return it.
//! Otherwise it will try to snap a segment according to the event's snapping mode
//! @param snapped if given, determines if a segment has been snapped //! @param snapped if given, determines if a segment has been snapped
//! @param allLayers if true, override snapping mode //! @param allLayers if true, override snapping mode
QList<QgsPoint> snapSegment( bool* snapped = 0, bool allLayers = false ) const; QList<QgsPoint> snapSegment( bool* snapped = 0, bool allLayers = false ) const;


/** /**
* @brief mapPoint returns the point in coordinates * @brief mapPoint returns the point in coordinates
* @param snappedPoint determines if the result is a snapped point or not. If snapped to a segment, will be set to false.
* @return the point in map coordinates, after snapping if requested in the event. * @return the point in map coordinates, after snapping if requested in the event.
*/ */
QgsPoint mapPoint( bool* snappedPoint = 0 ) const; QgsPoint mapPoint() const { return mMapPoint; }

//! determines if the returned mapPoint() is snapped (to a vertex or to a segment)
bool isSnapped() const { return mSnapMatch.isValid(); }

//! determines if the returned mapPoint() is snapped to a vertex. If snapped to a segment (or not snapped at all), will be set to false.
bool isSnappedToVertex() const { return mSnapMatch.hasVertex(); }


private: private:
/** /**
Expand Down
4 changes: 2 additions & 2 deletions src/app/qgsmaptoolcapture.cpp
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -112,8 +112,8 @@ void QgsMapToolCapture::currentLayerChanged( QgsMapLayer *layer )


void QgsMapToolCapture::canvasMapMoveEvent( QgsMapMouseEvent * e ) void QgsMapToolCapture::canvasMapMoveEvent( QgsMapMouseEvent * e )
{ {
bool snapped; bool snapped = e->isSnapped();
QgsPoint point = e->mapPoint( &snapped ); QgsPoint point = e->mapPoint();


if ( !snapped ) if ( !snapped )
{ {
Expand Down

0 comments on commit d928caf

Please sign in to comment.