From 67d43327388122e89bad007f6d1d4f8df0acc407 Mon Sep 17 00:00:00 2001 From: Andrea Giudiceandrea Date: Mon, 14 Oct 2024 11:34:59 +0200 Subject: [PATCH] Fix QgsVectorLayerEditUtils::addRingV2 (#59066) --- src/core/vector/qgsvectorlayereditutils.cpp | 6 ++-- .../python/test_qgsvectorlayereditutils.py | 29 +++++++++++++++++++ 2 files changed, 33 insertions(+), 2 deletions(-) diff --git a/src/core/vector/qgsvectorlayereditutils.cpp b/src/core/vector/qgsvectorlayereditutils.cpp index 57fe27593aa1..59bbc7f106e3 100644 --- a/src/core/vector/qgsvectorlayereditutils.cpp +++ b/src/core/vector/qgsvectorlayereditutils.cpp @@ -174,7 +174,8 @@ Qgis::GeometryOperationResult staticAddRing( QgsVectorLayer *layer, std::unique_ fit = layer->getFeatures( QgsFeatureRequest().setFilterRect( bBox ).setFlags( Qgis::FeatureRequestFlag::ExactIntersect ) ); } - //find first valid feature we can add the ring to + //find valid features we can add the ring to + bool success = false; while ( fit.nextFeature( f ) ) { if ( !f.hasGeometry() ) @@ -193,6 +194,7 @@ Qgis::GeometryOperationResult staticAddRing( QgsVectorLayer *layer, std::unique_ } if ( addRingReturnCode == Qgis::GeometryOperationResult::Success ) { + success = true; layer->changeGeometry( f.id(), g ); if ( modifiedFeatureIds ) { @@ -206,7 +208,7 @@ Qgis::GeometryOperationResult staticAddRing( QgsVectorLayer *layer, std::unique_ } } - return addRingReturnCode; + return success ? Qgis::GeometryOperationResult::Success : addRingReturnCode; } Qgis::GeometryOperationResult QgsVectorLayerEditUtils::addRing( const QVector &ring, const QgsFeatureIds &targetFeatureIds, QgsFeatureId *modifiedFeatureId ) diff --git a/tests/src/python/test_qgsvectorlayereditutils.py b/tests/src/python/test_qgsvectorlayereditutils.py index 02c2fd2377b7..a4c8a452d887 100644 --- a/tests/src/python/test_qgsvectorlayereditutils.py +++ b/tests/src/python/test_qgsvectorlayereditutils.py @@ -279,6 +279,35 @@ def testAddRingV2SelectedFeatures(self): "Polygon ((2 2, 6 2, 6 6, 2 6, 2 2))" ) + def testAddRingV2AtLeastOne(self): + # test adding ring on multi features + # Succeed if the ring can be added at least to 1 feature + layer = createEmptyPolygonLayer() + self.assertTrue(layer.startEditing()) + + pr = layer.dataProvider() + f1 = QgsFeature(layer.fields(), 1) + f1.setGeometry(QgsGeometry.fromWkt('POLYGON((0 0, 5 0, 5 5, 0 5, 0 0))')) + f2 = QgsFeature(layer.fields(), 1) + f2.setGeometry(QgsGeometry.fromWkt('POLYGON((2 2, 6 2, 6 6, 2 6, 2 2))')) + assert pr.addFeatures([f1, f2]) + self.assertEqual(layer.featureCount(), 2) + + vle = QgsVectorLayerEditUtils(layer) + result = vle.addRingV2(QgsLineString([QgsPoint(0.5, 3), QgsPoint(1.5, 3), QgsPoint(1.5, 1.5), QgsPoint(3, 1.5), QgsPoint(3, 0.5), QgsPoint(0.5, 0.5), QgsPoint(0.5, 3)])) + self.assertEqual(Qgis.GeometryOperationResult.Success, result[0]) + self.assertEqual({1}, set(result[1])) + layer.commitChanges() + + self.assertEqual( + layer.getFeature(1).geometry().asWkt(), + "Polygon ((0 0, 5 0, 5 5, 0 5, 0 0),(0.5 3, 1.5 3, 1.5 1.5, 3 1.5, 3 0.5, 0.5 0.5, 0.5 3))" + ) + self.assertEqual( + layer.getFeature(2).geometry().asWkt(), + "Polygon ((2 2, 6 2, 6 6, 2 6, 2 2))" + ) + def testMoveVertex(self): layer = QgsVectorLayer("Point", "point", "memory") self.assertTrue(layer.startEditing())