@@ -5580,6 +5580,7 @@ void QgisApp::editPaste( QgsMapLayer *destinationLayer )
55805580 {
55815581 features = clipboard ()->copyOf ( pasteVectorLayer->pendingFields () );
55825582 }
5583+ int nTotalFeatures = features.count ();
55835584
55845585 QHash<int , int > remap;
55855586 const QgsFields &fields = clipboard ()->fields ();
@@ -5594,10 +5595,11 @@ void QgisApp::editPaste( QgsMapLayer *destinationLayer )
55945595 }
55955596
55965597 int dstAttrCount = pasteVectorLayer->pendingFields ().count ();
5597- for ( int i = 0 ; i < features.size (); i++ )
5598+
5599+ QgsFeatureList::iterator featureIt = features.begin ();
5600+ while ( featureIt != features.end () )
55985601 {
5599- QgsFeature &f = features[i];
5600- const QgsAttributes &srcAttr = f.attributes ();
5602+ const QgsAttributes &srcAttr = featureIt->attributes ();
56015603 QgsAttributes dstAttr ( dstAttrCount );
56025604
56035605 for ( int src = 0 ; src < srcAttr.count (); ++src )
@@ -5617,17 +5619,54 @@ void QgisApp::editPaste( QgsMapLayer *destinationLayer )
56175619 dstAttr[ dst ] = srcAttr[ src ];
56185620 }
56195621
5620- f. setAttributes ( dstAttr );
5622+ featureIt-> setAttributes ( dstAttr );
56215623
5622- // avoid intersection if enabled in digitize settings
5623- if ( f.geometry () )
5624+ if ( featureIt->geometry () )
5625+ {
5626+ // convert geometry to match destination layer
5627+ QgsGeometry* newGeometry = featureIt->geometry ()->convertToType ( pasteVectorLayer->geometryType (), QGis::isMultiType ( pasteVectorLayer->wkbType () ) );
5628+ if ( newGeometry )
5629+ {
5630+ // avoid intersection if enabled in digitize settings
5631+ featureIt->setGeometry ( newGeometry );
5632+ featureIt->geometry ()->avoidIntersections ();
5633+ ++featureIt;
5634+ }
5635+ else
5636+ {
5637+ featureIt = features.erase ( featureIt );
5638+ }
5639+ }
5640+ else
56245641 {
5625- f. geometry ()-> avoidIntersections () ;
5642+ ++featureIt ;
56265643 }
56275644 }
56285645
56295646 pasteVectorLayer->addFeatures ( features );
56305647 pasteVectorLayer->endEditCommand ();
5648+
5649+ int nCopiedFeatures = features.count ();
5650+ if ( nCopiedFeatures == 0 )
5651+ {
5652+ messageBar ()->pushMessage ( tr ( " Paste features" ),
5653+ tr ( " no features could be successfully pasted." ),
5654+ QgsMessageBar::WARNING , messageTimeout () );
5655+
5656+ }
5657+ else if ( nCopiedFeatures == nTotalFeatures )
5658+ {
5659+ messageBar ()->pushMessage ( tr ( " Paste features" ),
5660+ tr ( " %1 features were successfully pasted." ).arg ( nCopiedFeatures ),
5661+ QgsMessageBar::INFO , messageTimeout () );
5662+ }
5663+ else
5664+ {
5665+ messageBar ()->pushMessage ( tr ( " Paste features" ),
5666+ tr ( " %1 of %2 features could be successfully pasted." ).arg ( nCopiedFeatures ).arg ( nTotalFeatures ),
5667+ QgsMessageBar::WARNING , messageTimeout () );
5668+ }
5669+
56315670 mMapCanvas ->refresh ();
56325671}
56335672
0 commit comments