@@ -708,18 +708,17 @@ int QgsVectorLayerEditUtils::addTopologicalPoints( const QgsPointXY &p )
708
708
return addTopologicalPoints ( QgsPoint ( p ) );
709
709
}
710
710
711
- bool QgsVectorLayerEditUtils::mergeFeatures ( const QgsFeatureIds &mergeFeatureIds, const QgsAttributes &mergeAttributes, QgsGeometry unionGeometry, QString &errorMessage )
711
+ bool QgsVectorLayerEditUtils::mergeFeatures ( const QgsFeatureId &targetFeatureId, const QgsFeatureIds &mergeFeatureIds, const QgsAttributes &mergeAttributes, const QgsGeometry & unionGeometry, QString &errorMessage )
712
712
{
713
713
errorMessage.clear ();
714
714
715
- if ( mergeFeatureIds.size () < 2 )
715
+ if ( mergeFeatureIds.isEmpty () )
716
716
{
717
- errorMessage = QObject::tr ( " Not enough features to merge, the merge tool requires at least two features " );
717
+ errorMessage = QObject::tr ( " List of features to merge is empty " );
718
718
return false ;
719
719
}
720
720
721
721
QgsAttributeMap newAttributes;
722
- QgsFeatureId mergeFeatureId = FID_NULL;
723
722
for ( int i = 0 ; i < mergeAttributes.count (); ++i )
724
723
{
725
724
QVariant val = mergeAttributes.at ( i );
@@ -728,48 +727,6 @@ bool QgsVectorLayerEditUtils::mergeFeatures( const QgsFeatureIds &mergeFeatureId
728
727
mLayer ->dataProvider () &&
729
728
mLayer ->dataProvider ()->defaultValueClause ( mLayer ->fields ().fieldOriginIndex ( i ) ) == val;
730
729
731
- // Check if features can merged into an existing one
732
- if ( mergeFeatureId == FID_NULL )
733
- {
734
- bool isPrimaryKey = mLayer ->fields ().fieldOrigin ( i ) == QgsFields::OriginProvider &&
735
- mLayer ->dataProvider () &&
736
- mLayer ->dataProvider ()->pkAttributeIndexes ().contains ( mLayer ->fields ().fieldOriginIndex ( i ) );
737
-
738
- if ( isPrimaryKey && !isDefaultValue )
739
- {
740
- QgsFeatureRequest request;
741
- request.setFlags ( QgsFeatureRequest::Flag::NoGeometry );
742
- // Handle multi pks
743
- if ( mLayer ->dataProvider ()->pkAttributeIndexes ().count () > 1 && mLayer ->dataProvider ()->pkAttributeIndexes ().count () <= mergeAttributes.count () )
744
- {
745
- const auto pkIdxList { mLayer ->dataProvider ()->pkAttributeIndexes () };
746
- QStringList conditions;
747
- QStringList fieldNames;
748
- for ( const int &pkIdx : std::as_const ( pkIdxList ) )
749
- {
750
- const QgsField pkField { mLayer ->fields ().field ( pkIdx ) };
751
- conditions.push_back ( QgsExpression::createFieldEqualityExpression ( pkField.name (), mergeAttributes.at ( pkIdx ), pkField.type ( ) ) );
752
- fieldNames.push_back ( pkField.name () );
753
- }
754
- request.setSubsetOfAttributes ( fieldNames, mLayer ->fields ( ) );
755
- request.setFilterExpression ( conditions.join ( QLatin1String ( " AND " ) ) );
756
- }
757
- else // single pk
758
- {
759
- const QgsField pkField { mLayer ->fields ().field ( i ) };
760
- request.setSubsetOfAttributes ( QStringList () << pkField.name (), mLayer ->fields ( ) );
761
- request.setFilterExpression ( QgsExpression::createFieldEqualityExpression ( pkField.name (), val, pkField.type ( ) ) );
762
- }
763
-
764
- QgsFeature f;
765
- QgsFeatureIterator featureIterator = mLayer ->getFeatures ( request );
766
- if ( featureIterator.nextFeature ( f ) )
767
- {
768
- mergeFeatureId = f.id ( );
769
- }
770
- }
771
- }
772
-
773
730
// convert to destination data type
774
731
QString errorMessageConvertCompatible;
775
732
if ( !isDefaultValue && !mLayer ->fields ().at ( i ).convertCompatible ( val, &errorMessageConvertCompatible ) )
@@ -782,38 +739,18 @@ bool QgsVectorLayerEditUtils::mergeFeatures( const QgsFeatureIds &mergeFeatureId
782
739
783
740
mLayer ->beginEditCommand ( QObject::tr ( " Merged features" ) );
784
741
785
- QgsFeatureIds featureIdsToDelete = mergeFeatureIds;
786
-
787
- QgsFeature mergeFeature;
788
- if ( mergeFeatureId == FID_NULL )
789
- {
790
- // Create new feature
791
- mergeFeature = QgsVectorLayerUtils::createFeature ( mLayer , unionGeometry, newAttributes );
792
- }
793
- else
794
- {
795
- // Merge into existing feature
796
- featureIdsToDelete.remove ( mergeFeatureId );
797
- }
798
-
799
- // Delete other features
800
- QgsFeatureIds::const_iterator feature_it = featureIdsToDelete.constBegin ();
801
- for ( ; feature_it != featureIdsToDelete.constEnd (); ++feature_it )
742
+ // Delete other features but the target feature
743
+ QgsFeatureIds::const_iterator feature_it = mergeFeatureIds.constBegin ();
744
+ for ( ; feature_it != mergeFeatureIds.constEnd (); ++feature_it )
802
745
{
803
- mLayer ->deleteFeature ( *feature_it );
746
+ if ( *feature_it != targetFeatureId )
747
+ mLayer ->deleteFeature ( *feature_it );
804
748
}
805
749
806
- if ( mergeFeatureId == FID_NULL )
807
- {
808
- // Add the new feature
809
- mLayer ->addFeature ( mergeFeature );
810
- }
811
- else
812
- {
813
- // Modify merge feature
814
- mLayer ->changeGeometry ( mergeFeatureId, unionGeometry );
815
- mLayer ->changeAttributeValues ( mergeFeatureId, newAttributes );
816
- }
750
+ // Modify merge feature
751
+ QgsGeometry mergeGeometry = unionGeometry;
752
+ mLayer ->changeGeometry ( targetFeatureId, mergeGeometry );
753
+ mLayer ->changeAttributeValues ( targetFeatureId, newAttributes );
817
754
818
755
mLayer ->endEditCommand ();
819
756
0 commit comments