16
16
17
17
#include " qgsgeometry.h"
18
18
#include " qgslogger.h"
19
+ #include < qgsmessagelog.h>
19
20
#include " qgsvectorlayerundocommand.h"
20
21
#include " qgsvectordataprovider.h"
21
22
#include " qgsvectorlayer.h"
@@ -117,14 +118,34 @@ void QgsVectorLayerEditBuffer::updateChangedAttributes( QgsFeature &f )
117
118
118
119
bool QgsVectorLayerEditBuffer::addFeature ( QgsFeature& f )
119
120
{
120
- if ( !( L->dataProvider ()->capabilities () & QgsVectorDataProvider::AddFeatures ) )
121
+ QgsVectorDataProvider* provider = L->dataProvider ();
122
+
123
+ if ( !( provider->capabilities () & QgsVectorDataProvider::AddFeatures ) )
121
124
{
122
125
return false ;
123
126
}
124
127
if ( L->mUpdatedFields .count () != f.attributes ().count () )
125
128
return false ;
126
129
127
130
// 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
+ }
128
149
129
150
L->undoStack ()->push ( new QgsVectorLayerUndoCommandAddFeature ( this , f ) );
130
151
return true ;
@@ -138,7 +159,8 @@ bool QgsVectorLayerEditBuffer::addFeatures( QgsFeatureList& features )
138
159
139
160
for ( QgsFeatureList::iterator iter = features.begin (); iter != features.end (); ++iter )
140
161
{
141
- addFeature ( *iter );
162
+ if ( !addFeature ( *iter ) )
163
+ return false ;
142
164
}
143
165
144
166
L->updateExtents ();
@@ -194,9 +216,29 @@ bool QgsVectorLayerEditBuffer::changeGeometry( QgsFeatureId fid, QgsGeometry* ge
194
216
else if ( !( L->dataProvider ()->capabilities () & QgsVectorDataProvider::ChangeGeometries ) )
195
217
return false ;
196
218
219
+
197
220
// 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
+ }
198
240
199
- L->undoStack ()->push ( new QgsVectorLayerUndoCommandChangeGeometry ( this , fid, geom ) );
241
+ L->undoStack ()->push ( new QgsVectorLayerUndoCommandChangeGeometry ( this , fid, newGeom ? newGeom : geom ) );
200
242
return true ;
201
243
}
202
244
0 commit comments