@@ -104,7 +104,7 @@ bool QgsVectorLayerEditUtils::deleteVertex( QgsFeatureId atFeatureId, int atVert
104
104
return true ;
105
105
}
106
106
107
- int QgsVectorLayerEditUtils::addRing ( const QList<QgsPoint>& ring, QgsFeatureId* modifiedFeatureId, const QgsFeatureIds& preferredFeatureIds )
107
+ int QgsVectorLayerEditUtils::addRing ( const QList<QgsPoint>& ring, const QgsFeatureIds& targetFeatureIds, QgsFeatureId* modifiedFeatureId )
108
108
{
109
109
QgsLineStringV2* ringLine = new QgsLineStringV2 ();
110
110
QList< QgsPointV2 > ringPoints;
@@ -114,10 +114,10 @@ int QgsVectorLayerEditUtils::addRing( const QList<QgsPoint>& ring, QgsFeatureId*
114
114
ringPoints.append ( QgsPointV2 ( ringIt->x (), ringIt->y () ) );
115
115
}
116
116
ringLine->setPoints ( ringPoints );
117
- return addRing ( ringLine, modifiedFeatureId, preferredFeatureIds );
117
+ return addRing ( ringLine, targetFeatureIds, modifiedFeatureId );
118
118
}
119
119
120
- int QgsVectorLayerEditUtils::addRing ( QgsCurveV2* ring, QgsFeatureId* modifiedFeatureId, const QgsFeatureIds& preferredFeatureIds )
120
+ int QgsVectorLayerEditUtils::addRing ( QgsCurveV2* ring, const QgsFeatureIds& targetFeatureIds, QgsFeatureId* modifiedFeatureId )
121
121
{
122
122
if ( !L->hasGeometryType () )
123
123
{
@@ -128,43 +128,32 @@ int QgsVectorLayerEditUtils::addRing( QgsCurveV2* ring, QgsFeatureId* modifiedFe
128
128
int addRingReturnCode = 5 ; // default: return code for 'ring not inserted'
129
129
QgsFeature f;
130
130
131
- // see if part can be added to preferred features
132
- if ( !preferredFeatureIds .isEmpty () )
131
+ QgsFeatureIterator fit;
132
+ if ( !targetFeatureIds .isEmpty () )
133
133
{
134
- QgsFeatureIterator fit = L->getFeatures ( QgsFeatureRequest ().setFilterFids ( preferredFeatureIds ) );
135
- while ( fit.nextFeature ( f ) )
136
- {
137
- // add ring takes ownership of ring, and deletes it if there's an error
138
- addRingReturnCode = f.geometry ()->addRing ( static_cast < QgsCurveV2* >( ring->clone () ) );
139
- if ( addRingReturnCode == 0 )
140
- {
141
- L->editBuffer ()->changeGeometry ( f.id (), f.geometry () );
142
- if ( modifiedFeatureId )
143
- *modifiedFeatureId = f.id ();
144
-
145
- break ;
146
- }
147
- }
134
+ // check only specified features
135
+ fit = L->getFeatures ( QgsFeatureRequest ().setFilterFids ( targetFeatureIds ) );
148
136
}
149
-
150
- // no match so far, so check other intersecting features
151
- if ( addRingReturnCode != 0 )
137
+ else
152
138
{
139
+ // check all intersecting features
153
140
QgsRectangle bBox = ring->boundingBox ();
154
- QgsFeatureIterator fit = L->getFeatures ( QgsFeatureRequest ().setFilterRect ( bBox ).setFlags ( QgsFeatureRequest::ExactIntersect ) );
155
- while ( fit.nextFeature ( f ) )
141
+ fit = L->getFeatures ( QgsFeatureRequest ().setFilterRect ( bBox ).setFlags ( QgsFeatureRequest::ExactIntersect ) );
142
+ }
143
+
144
+ // find first valid feature we can add the ring to
145
+ while ( fit.nextFeature ( f ) )
146
+ {
147
+ // add ring takes ownership of ring, and deletes it if there's an error
148
+ addRingReturnCode = f.geometry ()->addRing ( static_cast < QgsCurveV2* >( ring->clone () ) );
149
+ if ( addRingReturnCode == 0 )
156
150
{
157
- // add ring takes ownership of ring, and deletes it if there's an error
158
- addRingReturnCode = f.geometry ()->addRing ( static_cast < QgsCurveV2* >( ring->clone () ) );
159
- if ( addRingReturnCode == 0 )
160
- {
161
- L->editBuffer ()->changeGeometry ( f.id (), f.geometry () );
162
- if ( modifiedFeatureId )
163
- *modifiedFeatureId = f.id ();
151
+ L->editBuffer ()->changeGeometry ( f.id (), f.geometry () );
152
+ if ( modifiedFeatureId )
153
+ *modifiedFeatureId = f.id ();
164
154
165
- // setModified( true, true );
166
- break ;
167
- }
155
+ // setModified( true, true );
156
+ break ;
168
157
}
169
158
}
170
159
0 commit comments