Skip to content

Commit 624d142

Browse files
committedJun 7, 2015
Fix bugs related to adding and removing geometry parts
1 parent faf3bcd commit 624d142

File tree

3 files changed

+33
-22
lines changed

3 files changed

+33
-22
lines changed
 

‎python/core/geometry/qgsgeometry.sip

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -260,7 +260,7 @@ class QgsGeometry
260260
/**Adds a new part to this geometry (takes ownership)
261261
@return 0 in case of success, 1 if not a multipolygon, 2 if ring is not a valid geometry, 3 if new polygon ring
262262
not disjoint with existing polygons of the feature*/
263-
int addPart( QgsCurveV2* part /Transfer/ );
263+
int addPart( QgsAbstractGeometryV2* part /Transfer/ );
264264

265265
/**Adds a new island polygon to a multipolygon feature
266266
@return 0 in case of success, 1 if not a multipolygon, 2 if ring is not a valid geometry, 3 if new polygon ring

‎src/core/geometry/qgsgeometry.cpp

Lines changed: 31 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -315,7 +315,11 @@ QGis::GeometryType QgsGeometry::type() const
315315

316316
bool QgsGeometry::isMultipart() const
317317
{
318-
return QGis::isMultiType( wkbType() );
318+
if ( !d || !d->geometry )
319+
{
320+
return false;
321+
}
322+
return QgsWKBTypes::isMultiType( d->geometry->wkbType() );
319323
}
320324

321325
void QgsGeometry::fromGeos( GEOSGeometry *geos )
@@ -538,13 +542,29 @@ int QgsGeometry::addRing( QgsCurveV2* ring )
538542

539543
int QgsGeometry::addPart( const QList<QgsPoint> &points, QGis::GeometryType geomType )
540544
{
541-
Q_UNUSED( geomType );
542-
if ( !d || !d->geometry )
545+
if ( !d )
543546
{
544-
return 2;
547+
return 1;
545548
}
546549

547-
detach( true );
550+
if ( !d->geometry )
551+
{
552+
detach( false );
553+
switch ( geomType )
554+
{
555+
case QGis::Point:
556+
d->geometry = new QgsMultiPointV2();
557+
break;
558+
case QGis::Line:
559+
d->geometry = new QgsMultiLineStringV2();
560+
break;
561+
case QGis::Polygon:
562+
d->geometry = new QgsMultiPolygonV2();
563+
break;
564+
default:
565+
return 1;
566+
}
567+
}
548568

549569
if ( !isMultipart() )
550570
{
@@ -564,14 +584,12 @@ int QgsGeometry::addPart( const QList<QgsPoint> &points, QGis::GeometryType geom
564584
ringLine->setPoints( partPoints );
565585
partGeom = ringLine;
566586
}
567-
removeWkbGeos();
568-
return addPart( dynamic_cast<QgsCurveV2*>( partGeom ) );
587+
return addPart( partGeom );
569588
}
570589

571-
int QgsGeometry::addPart( QgsCurveV2* part )
590+
int QgsGeometry::addPart( QgsAbstractGeometryV2* part )
572591
{
573592
detach( true );
574-
575593
removeWkbGeos();
576594
return QgsGeometryEditUtils::addPart( d->geometry, part );
577595
}
@@ -583,15 +601,7 @@ int QgsGeometry::addPart( const QgsGeometry *newPart )
583601
return 1;
584602
}
585603

586-
detach( true );
587-
588-
QgsAbstractGeometryV2* g = d->geometry->clone();
589-
QgsCurveV2* curve = dynamic_cast<QgsCurveV2*>( g );
590-
if ( !curve )
591-
{
592-
delete g; return 1;
593-
}
594-
return addPart( curve );
604+
return addPart( newPart->d->geometry->clone() );
595605
}
596606

597607
int QgsGeometry::addPart( GEOSGeometry *newPart )
@@ -1435,8 +1445,9 @@ bool QgsGeometry::deletePart( int partNum )
14351445
}
14361446

14371447
detach( true );
1438-
1439-
return QgsGeometryEditUtils::deletePart( d->geometry, partNum );
1448+
bool ok = QgsGeometryEditUtils::deletePart( d->geometry, partNum );
1449+
removeWkbGeos();
1450+
return ok;
14401451
}
14411452

14421453
int QgsGeometry::avoidIntersections( QMap<QgsVectorLayer*, QSet< QgsFeatureId > > ignoreFeatures )

‎src/core/geometry/qgsgeometry.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -308,7 +308,7 @@ class CORE_EXPORT QgsGeometry
308308
/**Adds a new part to this geometry (takes ownership)
309309
@return 0 in case of success, 1 if not a multipolygon, 2 if ring is not a valid geometry, 3 if new polygon ring
310310
not disjoint with existing polygons of the feature*/
311-
int addPart( QgsCurveV2* part );
311+
int addPart( QgsAbstractGeometryV2* part );
312312

313313
/**Adds a new island polygon to a multipolygon feature
314314
@return 0 in case of success, 1 if not a multipolygon, 2 if ring is not a valid geometry, 3 if new polygon ring

0 commit comments

Comments
 (0)
Please sign in to comment.