void QgsSelectedFeature::moveSelectedVertexes( QgsVector v ) { int nUpdates = 0; Q_FOREACH ( QgsVertexEntry *entry, mVertexMap ) { if ( entry->isSelected() ) nUpdates++; } if ( nUpdates == 0 ) return; mVlayer->beginEditCommand( QObject::tr( "Moved vertices" ) ); int topologicalEditing = QgsProject::instance()->readNumEntry( "Digitizing", "/TopologicalEditing", 0 ); beginGeometryChange(); QMultiMap<double, QgsSnappingResult> currentResultList; for ( int i = mVertexMap.size() - 1; i > -1 && nUpdates > 0; i-- ) { QgsVertexEntry *entry = mVertexMap.value( i, nullptr ); if ( !entry || !entry->isSelected() ) continue; if ( topologicalEditing ) { // snap from current vertex currentResultList.clear(); mVlayer->snapWithContext( entry->pointV1(), ZERO_TOLERANCE, currentResultList, QgsSnapper::SnapToVertex ); } // only last update should trigger the geometry update // as vertex selection gets lost on the update if ( --nUpdates == 0 ) endGeometryChange(); QgsPointV2 p = entry->point(); p.setX( p.x() + v.x() ); p.setY( p.y() + v.y() ); mVlayer->moveVertex( p, mFeatureId, i ); if ( topologicalEditing ) { QMultiMap<double, QgsSnappingResult>::iterator resultIt = currentResultList.begin(); for ( ; resultIt != currentResultList.end(); ++resultIt ) { // move all other if ( mFeatureId != resultIt.value().snappedAtGeometry ) mVlayer->moveVertex( p, resultIt.value().snappedAtGeometry, resultIt.value().snappedVertexNr ); } } } if ( nUpdates > 0 ) endGeometryChange(); mVlayer->endEditCommand(); }
void QgsSelectedFeature::deleteSelectedVertexes() { int nSelected = 0; foreach ( QgsVertexEntry *entry, mVertexMap ) { if ( entry->isSelected() ) nSelected++; } if ( nSelected == 0 ) return; int topologicalEditing = QgsProject::instance()->readNumEntry( "Digitizing", "/TopologicalEditing", 0 ); QMultiMap<double, QgsSnappingResult> currentResultList; mVlayer->beginEditCommand( QObject::tr( "Deleted vertices" ) ); beginGeometryChange(); int count = 0; for ( int i = mVertexMap.size() - 1; i > -1; i-- ) { if ( mVertexMap[i]->isSelected() ) { if ( mVertexMap[i]->equals() != -1 ) { // to avoid try to delete some vertex twice mVertexMap[ mVertexMap[i]->equals()]->setSelected( false ); nSelected--; } if ( topologicalEditing ) { // snap from current vertex currentResultList.clear(); mVlayer->snapWithContext( mVertexMap[i]->point(), ZERO_TOLERANCE, currentResultList, QgsSnapper::SnapToVertex ); } // only last update should trigger the geometry update // as vertex selection gets lost on the update if ( --nSelected == 0 ) endGeometryChange(); if ( !mVlayer->deleteVertex( mFeatureId, i ) ) { count = 0; QgsDebugMsg( QString( "Deleting vertex %1 failed - resetting" ).arg( i ) ); break; } count++; if ( topologicalEditing ) { QMultiMap<double, QgsSnappingResult>::iterator resultIt = currentResultList.begin(); for ( ; resultIt != currentResultList.end(); ++resultIt ) { // move all other if ( mFeatureId != resultIt.value().snappedAtGeometry ) mVlayer->deleteVertex( resultIt.value().snappedAtGeometry, resultIt.value().snappedVertexNr ); } } } } if ( count > 0 ) { mVlayer->endEditCommand(); } else { mVlayer->destroyEditCommand(); } }
void QgsSelectedFeature::deleteSelectedVertexes() { int nSelected = 0; Q_FOREACH ( QgsVertexEntry *entry, mVertexMap ) { if ( entry->isSelected() ) nSelected++; } if ( nSelected == 0 ) return; int topologicalEditing = QgsProject::instance()->readNumEntry( "Digitizing", "/TopologicalEditing", 0 ); QMultiMap<double, QgsSnappingResult> currentResultList; mVlayer->beginEditCommand( QObject::tr( "Deleted vertices" ) ); beginGeometryChange(); bool success = false; QgsVectorLayer::EditResult res = QgsVectorLayer::Success; for ( int i = mVertexMap.size() - 1; i > -1 && nSelected > 0; i-- ) { if ( mVertexMap.at( i )->isSelected() ) { if ( topologicalEditing ) { // snap from current vertex currentResultList.clear(); mVlayer->snapWithContext( mVertexMap.at( i )->pointV1(), ZERO_TOLERANCE, currentResultList, QgsSnapper::SnapToVertex ); } // only last update should trigger the geometry update // as vertex selection gets lost on the update if ( --nSelected == 0 ) endGeometryChange(); if ( res != QgsVectorLayer::EmptyGeometry ) res = mVlayer->deleteVertexV2( mFeatureId, i ); if ( res != QgsVectorLayer::Success && res != QgsVectorLayer::EmptyGeometry ) { success = false; QgsDebugMsg( QString( "Deleting vertex %1 failed - resetting" ).arg( i ) ); break; } success = true; if ( topologicalEditing ) { QMultiMap<double, QgsSnappingResult>::iterator resultIt = currentResultList.begin(); for ( ; resultIt != currentResultList.end(); ++resultIt ) { // move all other if ( mFeatureId != resultIt.value().snappedAtGeometry ) mVlayer->deleteVertexV2( resultIt.value().snappedAtGeometry, resultIt.value().snappedVertexNr ); } } if ( res == QgsVectorLayer::EmptyGeometry ) { //geometry has been cleared as a result of deleting vertices (eg not enough vertices left to leave a valid geometry), //so nothing more to do QgsGeometry empty; geometryChanged( mFeatureId, empty ); break; } } } if ( nSelected > 0 ) endGeometryChange(); if ( success ) { mVlayer->endEditCommand(); } else { mVlayer->destroyEditCommand(); } }