Skip to content

Commit c33ae01

Browse files
committedSep 26, 2017
return geom compatibility check in addFeature and changeGeometry
1 parent ce11ebb commit c33ae01

File tree

2 files changed

+47
-5
lines changed

2 files changed

+47
-5
lines changed
 

‎src/core/qgsvectorlayereditbuffer.cpp

Lines changed: 45 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
#include "qgsgeometry.h"
1818
#include "qgslogger.h"
19+
#include <qgsmessagelog.h>
1920
#include "qgsvectorlayerundocommand.h"
2021
#include "qgsvectordataprovider.h"
2122
#include "qgsvectorlayer.h"
@@ -117,14 +118,34 @@ void QgsVectorLayerEditBuffer::updateChangedAttributes( QgsFeature &f )
117118

118119
bool QgsVectorLayerEditBuffer::addFeature( QgsFeature& f )
119120
{
120-
if ( !( L->dataProvider()->capabilities() & QgsVectorDataProvider::AddFeatures ) )
121+
QgsVectorDataProvider* provider = L->dataProvider();
122+
123+
if ( !( provider->capabilities() & QgsVectorDataProvider::AddFeatures ) )
121124
{
122125
return false;
123126
}
124127
if ( L->mUpdatedFields.count() != f.attributes().count() )
125128
return false;
126129

127130
// TODO: check correct geometry type
131+
// 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+
}
128149

129150
L->undoStack()->push( new QgsVectorLayerUndoCommandAddFeature( this, f ) );
130151
return true;
@@ -138,7 +159,8 @@ bool QgsVectorLayerEditBuffer::addFeatures( QgsFeatureList& features )
138159

139160
for ( QgsFeatureList::iterator iter = features.begin(); iter != features.end(); ++iter )
140161
{
141-
addFeature( *iter );
162+
if ( !addFeature( *iter ) )
163+
return false;
142164
}
143165

144166
L->updateExtents();
@@ -194,9 +216,29 @@ bool QgsVectorLayerEditBuffer::changeGeometry( QgsFeatureId fid, QgsGeometry* ge
194216
else if ( !( L->dataProvider()->capabilities() & QgsVectorDataProvider::ChangeGeometries ) )
195217
return false;
196218

219+
197220
// TODO: check compatible geometry
221+
// 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() )
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+
}
239+
}
198240

199-
L->undoStack()->push( new QgsVectorLayerUndoCommandChangeGeometry( this, fid, geom ) );
241+
L->undoStack()->push( new QgsVectorLayerUndoCommandChangeGeometry( this, fid, newGeom ? newGeom : geom ) );
200242
return true;
201243
}
202244

‎tests/src/python/test_qgsvectorlayereditbuffer.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -103,8 +103,8 @@ def testAddFeatures(self):
103103
f1 = QgsFeature(layer.fields(), 1)
104104
f1.setGeometry(QgsGeometry.fromMultiPolyline(multiline))
105105
f1.setAttributes(["test", 123])
106-
self.assertTrue(layer.addFeatures([f1]))
107-
self.assertFalse(layer.commitChanges())
106+
self.assertFalse(layer.addFeatures([f1]))
107+
# self.assertFalse(layer.commitChanges())
108108

109109
def testAddMultipleFeatures(self):
110110
# test adding multiple features to an edit buffer

0 commit comments

Comments
 (0)
Please sign in to comment.