Skip to content

Commit d0859f1

Browse files
committedSep 26, 2017
added adaptGeometry method to avoid code redundance + removed control in commitChanges
1 parent 6cd38fe commit d0859f1

File tree

2 files changed

+37
-71
lines changed

2 files changed

+37
-71
lines changed
 

‎src/core/qgsvectorlayereditbuffer.cpp

Lines changed: 28 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -127,25 +127,9 @@ bool QgsVectorLayerEditBuffer::addFeature( QgsFeature& f )
127127
if ( L->mUpdatedFields.count() != f.attributes().count() )
128128
return false;
129129

130-
// TODO: check correct geometry type
131130
// 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;
149133

150134
L->undoStack()->push( new QgsVectorLayerUndoCommandAddFeature( this, f ) );
151135
return true;
@@ -200,6 +184,28 @@ bool QgsVectorLayerEditBuffer::deleteFeatures( const QgsFeatureIds& fids )
200184
return true;
201185
}
202186

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+
}
203209

204210
bool QgsVectorLayerEditBuffer::changeGeometry( QgsFeatureId fid, QgsGeometry* geom )
205211
{
@@ -216,29 +222,14 @@ bool QgsVectorLayerEditBuffer::changeGeometry( QgsFeatureId fid, QgsGeometry* ge
216222
else if ( !( L->dataProvider()->capabilities() & QgsVectorDataProvider::ChangeGeometries ) )
217223
return false;
218224

219-
220-
// TODO: check compatible geometry
221225
// 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 ) )
227227
{
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;
239230
}
240231

241-
L->undoStack()->push( new QgsVectorLayerUndoCommandChangeGeometry( this, fid, newGeom ? newGeom : geom ) );
232+
L->undoStack()->push( new QgsVectorLayerUndoCommandChangeGeometry( this, fid, geom ) );
242233
return true;
243234
}
244235

@@ -344,40 +335,6 @@ bool QgsVectorLayerEditBuffer::commitChanges( QStringList& commitErrors )
344335
// no yes => changeAttributeValues
345336
// yes yes => changeFeatures
346337

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-
381338
//
382339
// update geometries
383340
//

‎src/core/qgsvectorlayereditbuffer.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,15 @@ class CORE_EXPORT QgsVectorLayerEditBuffer : public QObject
178178

179179
void updateLayerFields();
180180

181+
/** Apply geom modification basing on provider geometry type.
182+
* Geom is modified only if successful convertion is possibile.
183+
* In case of convertion a message is notified in the log
184+
* @param geom pointer to the geometry that is adapted to provider
185+
* @return bool true if success
186+
* @note added in QGIS 2.18
187+
*/
188+
bool adaptGeometry( QgsGeometry* geom );
189+
181190
protected:
182191
QgsVectorLayer* L;
183192
friend class QgsVectorLayer;

0 commit comments

Comments
 (0)
Please sign in to comment.