@@ -127,25 +127,9 @@ bool QgsVectorLayerEditBuffer::addFeature( QgsFeature& f )
127
127
if ( L->mUpdatedFields .count () != f.attributes ().count () )
128
128
return false ;
129
129
130
- // TODO: check correct geometry type
131
130
// if not then try to convert to a compatible geometry type
132
- if ( f.geometry () && f.geometry ()->geometry () &&
133
- !f.geometry ()->isEmpty () &&
134
- f.geometry ()->wkbType () != provider->geometryType () )
135
- {
136
- // check if provider do strict geometry control
137
- // otherwise leave to the commit to rise provider errors
138
- if ( provider->doesStrictFeatureTypeCheck () )
139
- {
140
- QgsGeometry* newGeom = provider->convertToProviderType ( f.geometry () );
141
- if ( !newGeom )
142
- {
143
- QgsMessageLog::logMessage ( tr ( " ERROR: feature not added - geometry type is not compatible with the current layer." , " not added feature" ) );
144
- return false ;
145
- }
146
- f.setGeometry ( newGeom );
147
- }
148
- }
131
+ if ( !adaptGeometry ( f.geometry () ) )
132
+ return false ;
149
133
150
134
L->undoStack ()->push ( new QgsVectorLayerUndoCommandAddFeature ( this , f ) );
151
135
return true ;
@@ -200,6 +184,28 @@ bool QgsVectorLayerEditBuffer::deleteFeatures( const QgsFeatureIds& fids )
200
184
return true ;
201
185
}
202
186
187
+ bool QgsVectorLayerEditBuffer::adaptGeometry ( QgsGeometry* geom )
188
+ {
189
+ QgsVectorDataProvider* provider = L->dataProvider ();
190
+ if ( geom && geom->geometry () &&
191
+ !geom->isEmpty () &&
192
+ geom->wkbType () != provider->geometryType () )
193
+ {
194
+ // check if provider do strict geometry control
195
+ // otherwise leave to the commit to rise provider errors
196
+ if ( provider->doesStrictFeatureTypeCheck () )
197
+ {
198
+ QgsGeometry* newGeom = provider->convertToProviderType ( geom );
199
+ if ( !newGeom )
200
+ {
201
+ QgsMessageLog::logMessage ( tr ( " ERROR: geometry type is not compatible with the layer." , " not compatible geometry" ) );
202
+ return false ;
203
+ }
204
+ geom = newGeom;
205
+ }
206
+ }
207
+ return true ;
208
+ }
203
209
204
210
bool QgsVectorLayerEditBuffer::changeGeometry ( QgsFeatureId fid, QgsGeometry* geom )
205
211
{
@@ -216,29 +222,14 @@ bool QgsVectorLayerEditBuffer::changeGeometry( QgsFeatureId fid, QgsGeometry* ge
216
222
else if ( !( L->dataProvider ()->capabilities () & QgsVectorDataProvider::ChangeGeometries ) )
217
223
return false ;
218
224
219
-
220
- // TODO: check compatible geometry
221
225
// if not then try to convert to a compatible geometry type
222
- QgsGeometry* newGeom = nullptr ;
223
- QgsVectorDataProvider* provider = L->dataProvider ();
224
- if ( geom && geom->geometry () &&
225
- !geom->isEmpty () &&
226
- geom->wkbType () != provider->geometryType () )
226
+ if ( !adaptGeometry ( geom ) )
227
227
{
228
- // check if provider do strict geometry control
229
- // otherwise leave to the commit to rise provider errors
230
- if ( provider->doesStrictFeatureTypeCheck () )
231
- {
232
- newGeom = provider->convertToProviderType ( geom );
233
- if ( !newGeom )
234
- {
235
- QgsMessageLog::logMessage ( tr ( " ERROR: feature %1 not updated - geometry type is not compatible with the layer." , " not added feature" ).arg ( fid ) );
236
- return false ;
237
- }
238
- }
228
+ QgsMessageLog::logMessage ( tr ( " ERROR: feature %1 not updated" , " not updated feature" ).arg ( fid ) );
229
+ return false ;
239
230
}
240
231
241
- L->undoStack ()->push ( new QgsVectorLayerUndoCommandChangeGeometry ( this , fid, newGeom ? newGeom : geom ) );
232
+ L->undoStack ()->push ( new QgsVectorLayerUndoCommandChangeGeometry ( this , fid, geom ) );
242
233
return true ;
243
234
}
244
235
@@ -344,40 +335,6 @@ bool QgsVectorLayerEditBuffer::commitChanges( QStringList& commitErrors )
344
335
// no yes => changeAttributeValues
345
336
// yes yes => changeFeatures
346
337
347
- // to fix https://issues.qgis.org/issues/15741
348
- // first of all check if feature to add is compatible with provider type
349
- // this check have to be done before all checks to avoid to clear internal
350
- // buffer if some of next steps success.
351
- if ( success && !mAddedFeatures .isEmpty () )
352
- {
353
- if ( cap & QgsVectorDataProvider::AddFeatures )
354
- {
355
- if ( provider->doesStrictFeatureTypeCheck () )
356
- {
357
- QgsFeatureMap::iterator featureIt = mAddedFeatures .begin ();
358
- for ( ; featureIt != mAddedFeatures .end (); ++featureIt )
359
- {
360
- if ( !featureIt->geometry () ||
361
- featureIt->geometry ()->isEmpty () ||
362
- featureIt->geometry ()->wkbType () == provider->geometryType () )
363
- continue ;
364
-
365
- if ( !provider->convertToProviderType ( featureIt->geometry () ) )
366
- {
367
- commitErrors << tr ( " ERROR: %n feature(s) not added - geometry type is not compatible with the current layer." , " not added features count" , mAddedFeatures .size () );
368
- success = false ;
369
- break ;
370
- }
371
- }
372
- }
373
- }
374
- else
375
- {
376
- commitErrors << tr ( " ERROR: %n feature(s) not added - provider doesn't support adding features." , " not added features count" , mAddedFeatures .size () );
377
- success = false ;
378
- }
379
- }
380
-
381
338
//
382
339
// update geometries
383
340
//
0 commit comments