Skip to content

Commit 743f72d

Browse files
committedJan 23, 2015
Use QgsSnappingUtils in offset curve tool (instead of QgsSnapper)
1 parent 7860138 commit 743f72d

File tree

2 files changed

+37
-54
lines changed

2 files changed

+37
-54
lines changed
 

‎src/app/qgsmaptooloffsetcurve.cpp

Lines changed: 35 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -64,32 +64,43 @@ void QgsMapToolOffsetCurve::canvasPressEvent( QMouseEvent* e )
6464
return;
6565
}
6666

67+
QgsSnappingUtils* snapping = mCanvas->snappingUtils();
6768

68-
QgsSnapper snapper( mCanvas->mapSettings() );
69-
configureSnapper( snapper );
70-
QList<QgsSnappingResult> snapResults;
71-
snapper.snapPoint( e->pos(), snapResults );
72-
if ( snapResults.size() > 0 )
69+
// store previous settings
70+
int oldType;
71+
double oldSearchRadius;
72+
QgsTolerance::UnitType oldSearchRadiusUnit;
73+
QgsSnappingUtils::SnapToMapMode oldMode = snapping->snapToMapMode();
74+
snapping->defaultSettings( oldType, oldSearchRadius, oldSearchRadiusUnit );
75+
76+
// setup new settings (temporary)
77+
QSettings settings;
78+
snapping->setSnapToMapMode( QgsSnappingUtils::SnapAllLayers );
79+
snapping->setDefaultSettings( QgsPointLocator::Edge,
80+
settings.value( "/qgis/digitizing/search_radius_vertex_edit", 10 ).toDouble(),
81+
( QgsTolerance::UnitType ) settings.value( "/qgis/digitizing/search_radius_vertex_edit_unit", QgsTolerance::Pixels ).toInt() );
82+
83+
QgsPointLocator::Match match = snapping->snapToMap( e->pos() );
84+
85+
// restore old settings
86+
snapping->setSnapToMapMode( oldMode );
87+
snapping->setDefaultSettings( oldType, oldSearchRadius, oldSearchRadiusUnit );
88+
89+
if ( match.hasEdge() && match.layer() )
7390
{
91+
mSourceLayerId = match.layer()->id();
7492
QgsFeature fet;
75-
const QgsSnappingResult& snapResult = snapResults.at( 0 );
76-
if ( snapResult.layer )
93+
if ( match.layer()->getFeatures( QgsFeatureRequest( match.featureId() ) ).nextFeature( fet ) )
7794
{
78-
mSourceLayerId = snapResult.layer->id();
79-
80-
QgsVectorLayer* vl = dynamic_cast<QgsVectorLayer*>( QgsMapLayerRegistry::instance()->mapLayer( mSourceLayerId ) );
81-
if ( vl && vl->getFeatures( QgsFeatureRequest().setFilterFid( snapResult.snappedAtGeometry ) ).nextFeature( fet ) )
95+
mForceCopy = ( e->modifiers() & Qt::ControlModifier ); //no geometry modification if ctrl is pressed
96+
mOriginalGeometry = createOriginGeometry( match.layer(), match, fet );
97+
mRubberBand = createRubberBand();
98+
if ( mRubberBand )
8299
{
83-
mForceCopy = ( e->modifiers() & Qt::ControlModifier ); //no geometry modification if ctrl is pressed
84-
mOriginalGeometry = createOriginGeometry( vl, snapResult, fet );
85-
mRubberBand = createRubberBand();
86-
if ( mRubberBand )
87-
{
88-
mRubberBand->setToGeometry( mOriginalGeometry, layer );
89-
}
90-
mModifiedFeature = fet.id();
91-
createDistanceItem();
100+
mRubberBand->setToGeometry( mOriginalGeometry, layer );
92101
}
102+
mModifiedFeature = fet.id();
103+
createDistanceItem();
93104
}
94105
}
95106
}
@@ -232,7 +243,7 @@ void QgsMapToolOffsetCurve::canvasMoveEvent( QMouseEvent * e )
232243
}
233244
}
234245

235-
QgsGeometry* QgsMapToolOffsetCurve::createOriginGeometry( QgsVectorLayer* vl, const QgsSnappingResult& sr, QgsFeature& snappedFeature )
246+
QgsGeometry* QgsMapToolOffsetCurve::createOriginGeometry( QgsVectorLayer* vl, const QgsPointLocator::Match& match, QgsFeature& snappedFeature )
236247
{
237248
if ( !vl )
238249
{
@@ -241,7 +252,7 @@ QgsGeometry* QgsMapToolOffsetCurve::createOriginGeometry( QgsVectorLayer* vl, co
241252

242253
mMultiPartGeometry = false;
243254
//assign feature part by vertex number (snap to vertex) or by before vertex number (snap to segment)
244-
int partVertexNr = ( sr.snappedVertexNr == -1 ? sr.beforeVertexNr : sr.snappedVertexNr );
255+
int partVertexNr = match.vertexIndex();
245256

246257
if ( vl == currentVectorLayer() && !mForceCopy )
247258
{
@@ -259,7 +270,7 @@ QgsGeometry* QgsMapToolOffsetCurve::createOriginGeometry( QgsVectorLayer* vl, co
259270

260271
//for background layers, try to merge selected entries together if snapped feature is contained in selection
261272
const QgsFeatureIds& selection = vl->selectedFeaturesIds();
262-
if ( selection.size() < 1 || !selection.contains( sr.snappedAtGeometry ) )
273+
if ( selection.size() < 1 || !selection.contains( match.featureId() ) )
263274
{
264275
return convertToSingleLine( snappedFeature.geometryAndOwnership(), partVertexNr, mMultiPartGeometry );
265276
}
@@ -279,7 +290,7 @@ QgsGeometry* QgsMapToolOffsetCurve::createOriginGeometry( QgsVectorLayer* vl, co
279290
if ( geom->isMultipart() )
280291
{
281292
delete geom;
282-
return convertToSingleLine( snappedFeature.geometryAndOwnership(), sr.snappedVertexNr, mMultiPartGeometry );
293+
return convertToSingleLine( snappedFeature.geometryAndOwnership(), match.vertexIndex(), mMultiPartGeometry );
283294
}
284295

285296
return geom;
@@ -431,32 +442,6 @@ QgsGeometry* QgsMapToolOffsetCurve::linestringFromPolygon( QgsGeometry* featureG
431442
return 0;
432443
}
433444

434-
void QgsMapToolOffsetCurve::configureSnapper( QgsSnapper& s )
435-
{
436-
//use default vertex snap tolerance to all visible layers, but always to segment
437-
QList<QgsSnapper::SnapLayer> snapLayers;
438-
if ( mCanvas )
439-
{
440-
QList<QgsMapLayer*> layerList = mCanvas->layers();
441-
QList<QgsMapLayer*>::const_iterator layerIt = layerList.constBegin();
442-
for ( ; layerIt != layerList.constEnd(); ++layerIt )
443-
{
444-
QgsVectorLayer* vl = qobject_cast<QgsVectorLayer*>( *layerIt );
445-
if ( vl )
446-
{
447-
QgsSnapper::SnapLayer sl;
448-
sl.mLayer = vl;
449-
QSettings settings;
450-
sl.mTolerance = settings.value( "/qgis/digitizing/search_radius_vertex_edit", 10 ).toDouble();
451-
sl.mUnitType = ( QgsTolerance::UnitType ) settings.value( "/qgis/digitizing/search_radius_vertex_edit_unit", QgsTolerance::Pixels ).toInt();
452-
sl.mSnapTo = QgsSnapper::SnapToSegment;
453-
snapLayers.push_back( sl );
454-
}
455-
}
456-
}
457-
s.setSnapLayers( snapLayers );
458-
s.setSnapMode( QgsSnapper::SnapWithOneResult );
459-
}
460445

461446
QgsGeometry* QgsMapToolOffsetCurve::convertToSingleLine( QgsGeometry* geom, int vertex, bool& isMulti )
462447
{

‎src/app/qgsmaptooloffsetcurve.h

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818

1919
#include "qgsmaptooledit.h"
2020
#include "qgsgeometry.h"
21-
#include "qgssnapper.h"
21+
#include "qgspointlocator.h"
2222

2323
class QgsVertexMarker;
2424
class QDoubleSpinBox;
@@ -65,14 +65,12 @@ class APP_EXPORT QgsMapToolOffsetCurve: public QgsMapToolEdit
6565

6666

6767
void deleteRubberBandAndGeometry();
68-
QgsGeometry* createOriginGeometry( QgsVectorLayer* vl, const QgsSnappingResult& sr, QgsFeature& snappedFeature );
68+
QgsGeometry* createOriginGeometry( QgsVectorLayer* vl, const QgsPointLocator::Match& match, QgsFeature& snappedFeature );
6969
void createDistanceItem();
7070
void deleteDistanceItem();
7171
void setOffsetForRubberBand( double offset, bool leftSide );
7272
/**Creates a linestring from the polygon ring containing the snapped vertex. Caller takes ownership of the created object*/
7373
QgsGeometry* linestringFromPolygon( QgsGeometry* featureGeom, int vertex );
74-
/**Sets snapping with default vertex search tolerance to all layers (to vertex and segment)*/
75-
void configureSnapper( QgsSnapper& s );
7674
/**Returns a single line from a multiline (or does nothing if geometry is already a single line). Deletes the input geometry*/
7775
QgsGeometry* convertToSingleLine( QgsGeometry* geom, int vertex, bool& isMulti );
7876
/**Converts offset line back to a multiline if necessary*/

0 commit comments

Comments
 (0)
Please sign in to comment.