@@ -5580,6 +5580,7 @@ void QgisApp::editPaste( QgsMapLayer *destinationLayer )
5580
5580
{
5581
5581
features = clipboard ()->copyOf ( pasteVectorLayer->pendingFields () );
5582
5582
}
5583
+ int nTotalFeatures = features.count ();
5583
5584
5584
5585
QHash<int , int > remap;
5585
5586
const QgsFields &fields = clipboard ()->fields ();
@@ -5594,10 +5595,11 @@ void QgisApp::editPaste( QgsMapLayer *destinationLayer )
5594
5595
}
5595
5596
5596
5597
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 () )
5598
5601
{
5599
- QgsFeature &f = features[i];
5600
- const QgsAttributes &srcAttr = f.attributes ();
5602
+ const QgsAttributes &srcAttr = featureIt->attributes ();
5601
5603
QgsAttributes dstAttr ( dstAttrCount );
5602
5604
5603
5605
for ( int src = 0 ; src < srcAttr.count (); ++src )
@@ -5617,17 +5619,54 @@ void QgisApp::editPaste( QgsMapLayer *destinationLayer )
5617
5619
dstAttr[ dst ] = srcAttr[ src ];
5618
5620
}
5619
5621
5620
- f. setAttributes ( dstAttr );
5622
+ featureIt-> setAttributes ( dstAttr );
5621
5623
5622
- // avoid intersection if enabled in digitize settings
5623
- if ( f.geometry () )
5624
+ if ( featureIt->geometry () )
5624
5625
{
5625
- f.geometry ()->avoidIntersections ();
5626
+ // convert geometry to match destination layer
5627
+ QGis::GeometryType destType = pasteVectorLayer->geometryType ();
5628
+ bool destIsMulti = QGis::isMultiType ( pasteVectorLayer->wkbType () );
5629
+ if ( destType != QGis::UnknownGeometry )
5630
+ {
5631
+ QgsGeometry* newGeometry = featureIt->geometry ()->convertToType ( destType, destIsMulti );
5632
+ if ( !newGeometry )
5633
+ {
5634
+ featureIt = features.erase ( featureIt );
5635
+ continue ;
5636
+ }
5637
+ featureIt->setGeometry ( newGeometry );
5638
+ }
5639
+ // avoid intersection if enabled in digitize settings
5640
+ featureIt->geometry ()->avoidIntersections ();
5626
5641
}
5642
+
5643
+ ++featureIt;
5627
5644
}
5628
5645
5629
5646
pasteVectorLayer->addFeatures ( features );
5630
5647
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
+
5631
5670
mMapCanvas ->refresh ();
5632
5671
}
5633
5672
0 commit comments