|
44 | 44 | start_app()
|
45 | 45 |
|
46 | 46 |
|
47 |
| -def createEmptyPolygonLayer(): |
48 |
| - layer = QgsVectorLayer("Polygon", |
49 |
| - "polygon", "memory") |
| 47 | +def createEmptyLayer(geomType): |
| 48 | + layer = QgsVectorLayer(geomType, |
| 49 | + geomType.lower(), "memory") |
50 | 50 | assert layer.isValid()
|
51 | 51 | return layer
|
52 | 52 |
|
53 | 53 |
|
| 54 | +def createEmptyPolygonLayer(): |
| 55 | + return createEmptyLayer("Polygon") |
| 56 | + |
| 57 | + |
| 58 | +def createEmptyMultiPolygonLayer(): |
| 59 | + return createEmptyLayer("MultiPolygon") |
| 60 | + |
| 61 | + |
54 | 62 | class TestQgsVectorLayerEditUtils(unittest.TestCase):
|
55 | 63 |
|
56 | 64 | def testAddRing(self):
|
@@ -272,6 +280,57 @@ def testAddRingV2SelectedFeatures(self):
|
272 | 280 | "Polygon ((2 2, 6 2, 6 6, 2 6, 2 2))"
|
273 | 281 | )
|
274 | 282 |
|
| 283 | + def testSplitParts(self): |
| 284 | + layer = createEmptyMultiPolygonLayer() |
| 285 | + self.assertTrue(layer.startEditing()) |
| 286 | + |
| 287 | + pr = layer.dataProvider() |
| 288 | + |
| 289 | + # Add three MultiPolygon features |
| 290 | + # Each feature is composed of two squares side by side |
| 291 | + # Each feature is on a separate row to form a 3*2 grid |
| 292 | + f = QgsFeature(layer.fields(), 1) |
| 293 | + f.setGeometry(QgsGeometry.fromWkt('MULTIPOLYGON(((0 0, 4 0, 4 4, 0 4, 0 0)), ((6 0, 10 0, 10 4, 6 4, 6 0)))')) |
| 294 | + assert pr.addFeatures([f]) |
| 295 | + |
| 296 | + f = QgsFeature(layer.fields(), 2) |
| 297 | + f.setGeometry(QgsGeometry.fromWkt('MULTIPOLYGON(((0 6, 4 6, 4 10, 0 10, 0 6)), ((6 6, 10 6, 10 10, 6 10, 6 6)))')) |
| 298 | + assert pr.addFeatures([f]) |
| 299 | + |
| 300 | + f = QgsFeature(layer.fields(), 3) |
| 301 | + f.setGeometry(QgsGeometry.fromWkt('MULTIPOLYGON(((0 12, 4 12, 4 16, 0 16, 0 12)), ((6 12, 10 12, 10 16, 6 16, 6 12)))')) |
| 302 | + assert pr.addFeatures([f]) |
| 303 | + |
| 304 | + self.assertEqual(layer.featureCount(), 3) |
| 305 | + |
| 306 | + vle = QgsVectorLayerEditUtils(layer) |
| 307 | + |
| 308 | + # Split the first feature with a horizontal line that crosses both its parts |
| 309 | + # After this operation, the first feature has 4 parts, the other two are unchanged |
| 310 | + result = vle.splitParts([QgsPointXY(0, 2), QgsPointXY(10, 2)], False) |
| 311 | + self.assertEqual(result, Qgis.GeometryOperationResult.Success) |
| 312 | + |
| 313 | + # Split all three features with a vertical Line |
| 314 | + # After this operation, the first feature has 6 parts, the other two have 6 parts |
| 315 | + result = vle.splitParts([QgsPointXY(2, 0), QgsPointXY(2, 16)], False) |
| 316 | + self.assertEqual(result, Qgis.GeometryOperationResult.Success) |
| 317 | + |
| 318 | + layer.commitChanges() |
| 319 | + |
| 320 | + self.assertEqual( |
| 321 | + layer.getFeature(1).geometry().asWkt(), |
| 322 | + 'MultiPolygon (((2 0, 2 2, 4 2, 4 0, 2 0)),((2 2, 2 0, 0 0, 0 2, 2 2)),((2 2, 2 4, 4 4, 4 2, 2 2)),((2 4, 2 2, 0 2, 0 4, 2 4)),((6 2, 10 2, 10 0, 6 0, 6 2)),((10 2, 6 2, 6 4, 10 4, 10 2)))' |
| 323 | + ) |
| 324 | + self.assertEqual( |
| 325 | + layer.getFeature(2).geometry().asWkt(), |
| 326 | + 'MultiPolygon (((2 6, 2 10, 4 10, 4 6, 2 6)),((2 10, 2 6, 0 6, 0 10, 2 10)),((6 6, 10 6, 10 10, 6 10, 6 6)))' |
| 327 | + ) |
| 328 | + |
| 329 | + self.assertEqual( |
| 330 | + layer.getFeature(3).geometry().asWkt(), |
| 331 | + 'MultiPolygon (((2 12, 2 16, 4 16, 4 12, 2 12)),((2 16, 2 12, 0 12, 0 16, 2 16)),((6 12, 10 12, 10 16, 6 16, 6 12)))' |
| 332 | + ) |
| 333 | + |
275 | 334 |
|
276 | 335 | if __name__ == '__main__':
|
277 | 336 | unittest.main()
|
0 commit comments