Skip to content

Commit 5b2b3a4

Browse files
committedJun 12, 2015
allow adding polygons to multipolygons. fixes split part tool (refs #12799)
1 parent b113d2a commit 5b2b3a4

File tree

2 files changed

+52
-9
lines changed

2 files changed

+52
-9
lines changed
 

‎src/core/geometry/qgsgeometryeditutils.cpp

Lines changed: 39 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -110,22 +110,52 @@ int QgsGeometryEditUtils::addPart( QgsAbstractGeometryV2* geom, QgsAbstractGeome
110110
if ( geom->geometryType() == "MultiSurface" || geom->geometryType() == "MultiPolygon" )
111111
{
112112
QgsCurveV2* curve = dynamic_cast<QgsCurveV2*>( part );
113-
if ( !curve || !curve->isClosed() || curve->numPoints() < 4 )
113+
if ( curve && curve->isClosed() && curve->numPoints() >= 4 )
114114
{
115-
delete part; return 2;
115+
QgsCurvePolygonV2 *poly = 0;
116+
if ( curve->geometryType() == "LineString" )
117+
{
118+
poly = new QgsPolygonV2();
119+
}
120+
else
121+
{
122+
poly = new QgsCurvePolygonV2();
123+
}
124+
poly->setExteriorRing( curve );
125+
added = geomCollection->addGeometry( poly );
116126
}
117-
118-
QgsCurvePolygonV2* poly = 0;
119-
if ( curve->geometryType() == "LineString" )
127+
else if ( part->geometryType() == "Polygon" )
120128
{
121-
poly = new QgsPolygonV2();
129+
added = geomCollection->addGeometry( part );
130+
}
131+
else if ( part->geometryType() == "MultiPolygon" )
132+
{
133+
QgsGeometryCollectionV2 *parts = dynamic_cast<QgsGeometryCollectionV2*>( part );
134+
135+
int i;
136+
int n = geomCollection->numGeometries();
137+
for ( i = 0; i < parts->numGeometries() && geomCollection->addGeometry( parts->geometryN( i ) ); i++ )
138+
;
139+
140+
added = i == parts->numGeometries();
141+
if ( !added )
142+
{
143+
while ( geomCollection->numGeometries() > n )
144+
geomCollection->removeGeometry( n );
145+
delete part; return 2;
146+
}
147+
148+
while ( parts->numGeometries() > 0 )
149+
{
150+
parts->removeGeometry( 0 );
151+
}
152+
153+
delete part;
122154
}
123155
else
124156
{
125-
poly = new QgsCurvePolygonV2();
157+
delete part; return 2;
126158
}
127-
poly->setExteriorRing( curve );
128-
added = geomCollection->addGeometry( poly );
129159
}
130160
else
131161
{

‎tests/src/python/test_qgsgeometry.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1150,6 +1150,19 @@ def testAddPart(self):
11501150
wkt = polygon.exportToWkt()
11511151
assert compareWkt( expwkt, wkt ), "Expected:\n%s\nGot:\n%s\n" % (expwkt, wkt )
11521152

1153+
mp = QgsGeometry.fromMultiPolygon( points[:1] )
1154+
p = QgsGeometry.fromPolygon( points[1] )
1155+
1156+
assert mp.addPartGeometry( p ) == 0
1157+
wkt = mp.exportToWkt()
1158+
assert compareWkt( expwkt, wkt ), "Expected:\n%s\nGot:\n%s\n" % (expwkt, wkt )
1159+
1160+
mp = QgsGeometry.fromMultiPolygon( points[:1] )
1161+
mp2 = QgsGeometry.fromMultiPolygon( points[1:] )
1162+
assert mp.addPartGeometry( mp2 ) == 0
1163+
wkt = mp.exportToWkt()
1164+
assert compareWkt( expwkt, wkt ), "Expected:\n%s\nGot:\n%s\n" % (expwkt, wkt )
1165+
11531166
def testConvertToType(self):
11541167
# 5-+-4 0-+-9 13-+-+-12
11551168
# | | | | | |

0 commit comments

Comments
 (0)
Please sign in to comment.