Skip to content

Commit df31fc0

Browse files
committedJun 14, 2015
digitizing: disable split parts on single part geometries and allow adding and removing only part of single part features (fixes #12886, refs #12799)
1 parent c54013c commit df31fc0

File tree

3 files changed

+17
-14
lines changed

3 files changed

+17
-14
lines changed
 

‎src/app/qgisapp.cpp

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5531,14 +5531,7 @@ QgsGeometry* QgisApp::unionGeometries( const QgsVectorLayer* vl, QgsFeatureList&
55315531
}
55325532

55335533
//convert unionGeom to a multipart geometry in case it is necessary to match the layer type
5534-
QGis::WkbType t = vl->wkbType();
5535-
bool layerIsMultiType = ( t == QGis::WKBMultiPoint ||
5536-
t == QGis::WKBMultiPoint25D ||
5537-
t == QGis::WKBMultiLineString ||
5538-
t == QGis::WKBMultiLineString25D ||
5539-
t == QGis::WKBMultiPolygon ||
5540-
t == QGis::WKBMultiPolygon25D );
5541-
if ( layerIsMultiType && !unionGeom->isMultipart() )
5534+
if ( QGis::isMultiType( vl->wkbType() ) && !unionGeom->isMultipart() )
55425535
{
55435536
unionGeom->convertToMultiType();
55445537
}
@@ -9449,6 +9442,8 @@ void QgisApp::activateDeactivateLayerRelatedActions( QgsMapLayer* layer )
94499442
mActionMergeFeatureAttributes->setEnabled( false );
94509443
}
94519444

9445+
bool isMultiPart = QGis::isMultiType( vlayer->wkbType() ) || !dprovider->doesStrictFeatureTypeCheck();
9446+
94529447
// moving enabled if geometry changes are supported
94539448
mActionAddPart->setEnabled( isEditable && canChangeGeometry );
94549449
mActionDeletePart->setEnabled( isEditable && canChangeGeometry );
@@ -9484,7 +9479,7 @@ void QgisApp::activateDeactivateLayerRelatedActions( QgsMapLayer* layer )
94849479

94859480
mActionReshapeFeatures->setEnabled( isEditable && canAddFeatures );
94869481
mActionSplitFeatures->setEnabled( isEditable && canAddFeatures );
9487-
mActionSplitParts->setEnabled( isEditable && canAddFeatures );
9482+
mActionSplitParts->setEnabled( isEditable && canChangeGeometry && isMultiPart );
94889483
mActionSimplifyFeature->setEnabled( isEditable && canAddFeatures );
94899484
mActionOffsetCurve->setEnabled( isEditable && canAddFeatures && canChangeAttributes );
94909485

@@ -9500,7 +9495,7 @@ void QgisApp::activateDeactivateLayerRelatedActions( QgsMapLayer* layer )
95009495
mActionFillRing->setEnabled( isEditable && canChangeGeometry );
95019496
mActionReshapeFeatures->setEnabled( isEditable && canChangeGeometry );
95029497
mActionSplitFeatures->setEnabled( isEditable && canAddFeatures );
9503-
mActionSplitParts->setEnabled( isEditable && canChangeGeometry );
9498+
mActionSplitParts->setEnabled( isEditable && canChangeGeometry && isMultiPart );
95049499
mActionSimplifyFeature->setEnabled( isEditable && canChangeGeometry );
95059500
mActionDeleteRing->setEnabled( isEditable && canChangeGeometry );
95069501
mActionOffsetCurve->setEnabled( false );

‎src/app/qgsmaptooldeletepart.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,7 +170,10 @@ QgsGeometry* QgsMapToolDeletePart::partUnderPoint( QPoint point, QgsFeatureId& f
170170
if ( !g )
171171
return geomPart;
172172
if ( !g->isMultipart() )
173+
{
174+
fid = f.id();
173175
return geomPart;
176+
}
174177
QgsMultiPolygon mpolygon = g->asMultiPolygon();
175178
for ( int part = 0; part < mpolygon.count(); part++ ) // go through the polygons
176179
{

‎src/core/geometry/qgsgeometry.cpp

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -578,10 +578,7 @@ int QgsGeometry::addPart( const QList<QgsPoint> &points, QGis::GeometryType geom
578578
}
579579
}
580580

581-
if ( !isMultipart() )
582-
{
583-
convertToMultiType();
584-
}
581+
convertToMultiType();
585582

586583
QgsAbstractGeometryV2* partGeom = 0;
587584
if ( points.size() == 1 )
@@ -668,6 +665,8 @@ int QgsGeometry::splitGeometry( const QList<QgsPoint>& splitLine, QList<QgsGeome
668665
return 0;
669666
}
670667

668+
convertToMultiType();
669+
671670
QList<QgsAbstractGeometryV2*> newGeoms;
672671
QgsLineStringV2 splitLineString;
673672
QList<QgsPointV2> splitLinePointsV2;
@@ -1456,6 +1455,12 @@ bool QgsGeometry::deletePart( int partNum )
14561455
return false;
14571456
}
14581457

1458+
if ( !isMultipart() && partNum < 1 )
1459+
{
1460+
setGeometry( 0 );
1461+
return true;
1462+
}
1463+
14591464
detach( true );
14601465
bool ok = QgsGeometryEditUtils::deletePart( d->geometry, partNum );
14611466
removeWkbGeos();

0 commit comments

Comments
 (0)
Please sign in to comment.