diff --git a/src/app/qgsmaptooladdfeature.cpp b/src/app/qgsmaptooladdfeature.cpp index e0f4fe0753e..9828aea7bad 100644 --- a/src/app/qgsmaptooladdfeature.cpp +++ b/src/app/qgsmaptooladdfeature.cpp @@ -273,7 +273,26 @@ void QgsMapToolAddFeature::canvasReleaseEvent( QMouseEvent * e ) { //add points to other features to keep topology up-to-date int topologicalEditing = QgsProject::instance()->readNumEntry( "Digitizing", "/TopologicalEditing", 0 ); - if ( topologicalEditing ) + + //use always topological editing for avoidIntersection. + //Otherwise, no way to guarantee the geometries don't have a small gap in between. + QStringList intersectionLayers = QgsProject::instance()->readListEntry( "Digitizing", "/AvoidIntersectionsList" ); + bool avoidIntersection = !intersectionLayers.isEmpty(); + if ( avoidIntersection ) //try to add topological points also to background layers + { + QStringList::const_iterator lIt = intersectionLayers.constBegin(); + for ( ; lIt != intersectionLayers.constEnd(); ++lIt ) + { + QgsMapLayer* ml = QgsMapLayerRegistry::instance()->mapLayer( *lIt ); + QgsVectorLayer* vl = qobject_cast( ml ); + //can only add topological points if background layer is editable... + if ( vl && vl->geometryType() == QGis::Polygon && vl->isEditable() ) + { + vl->addTopologicalPoints( f->geometry() ); + } + } + } + else if ( topologicalEditing ) { vlayer->addTopologicalPoints( f->geometry() ); }