@@ -205,64 +205,109 @@ QMessageBox::Ok);
205
205
char end=vlayer->endian ();
206
206
if (mTool == CaptureLine)
207
207
{
208
- size=1 +2 *sizeof (int )+2 *mCaptureList .size ()*sizeof (double );
209
- wkb= new unsigned char [size];
210
- int wkbtype=QGis::WKBLineString;
211
- int length=mCaptureList .size ();
212
- memcpy (&wkb[0 ],&end,1 );
213
- memcpy (&wkb[1 ],&wkbtype, sizeof (int ));
214
- memcpy (&wkb[5 ],&length, sizeof (int ));
215
- int position=1 +2 *sizeof (int );
216
- double x,y;
217
- for (std::list<QgsPoint>::iterator it=mCaptureList .begin ();it!=mCaptureList .end ();++it)
218
- {
219
- QgsPoint savePoint = maybeInversePoint (*it, " adding line" );
220
- x = savePoint.x ();
221
- y = savePoint.y ();
222
-
223
- memcpy (&wkb[position],&x,sizeof (double ));
224
- position+=sizeof (double );
225
-
226
- memcpy (&wkb[position],&y,sizeof (double ));
227
- position+=sizeof (double );
228
- }
208
+ if (vlayer->getGeometryType () == QGis::WKBLineString)
209
+ {
210
+ size=1 +2 *sizeof (int )+2 *mCaptureList .size ()*sizeof (double );
211
+ wkb= new unsigned char [size];
212
+ int wkbtype=QGis::WKBLineString;
213
+ int length=mCaptureList .size ();
214
+ memcpy (&wkb[0 ],&end,1 );
215
+ memcpy (&wkb[1 ],&wkbtype, sizeof (int ));
216
+ memcpy (&wkb[1 +sizeof (int )],&length, sizeof (int ));
217
+ int position=1 +2 *sizeof (int );
218
+ double x,y;
219
+ for (std::list<QgsPoint>::iterator it=mCaptureList .begin ();it!=mCaptureList .end ();++it)
220
+ {
221
+ QgsPoint savePoint = maybeInversePoint (*it, " adding line" );
222
+ x = savePoint.x ();
223
+ y = savePoint.y ();
224
+
225
+ memcpy (&wkb[position],&x,sizeof (double ));
226
+ position+=sizeof (double );
227
+
228
+ memcpy (&wkb[position],&y,sizeof (double ));
229
+ position+=sizeof (double );
230
+ }
231
+ }
232
+ else if (vlayer->getGeometryType () == QGis::WKBMultiLineString)
233
+ {
234
+ size = 1 +2 *sizeof (int )+1 +2 *sizeof (int )+2 *mCaptureList .size ()*sizeof (double );
235
+ wkb= new unsigned char [size];
236
+ int position = 0 ;
237
+ int wkbtype=QGis::WKBMultiLineString;
238
+ memcpy (&wkb[position], &end, 1 );
239
+ position += 1 ;
240
+ memcpy (&wkb[position], &wkbtype, sizeof (int ));
241
+ position += sizeof (int );
242
+ int nlines = 1 ;
243
+ memcpy (&wkb[position], &nlines, sizeof (int ));
244
+ position += sizeof (int );
245
+ memcpy (&wkb[position], &end, 1 );
246
+ position += 1 ;
247
+ int linewkbtype = QGis::WKBLineString;
248
+ memcpy (&wkb[position], &linewkbtype, sizeof (int ));
249
+ position += sizeof (int );
250
+ int length=mCaptureList .size ();
251
+ memcpy (&wkb[position], &length, sizeof (int ));
252
+ position += sizeof (int );
253
+ double x,y;
254
+ for (std::list<QgsPoint>::iterator it=mCaptureList .begin ();it!=mCaptureList .end ();++it)
255
+ {
256
+ QgsPoint savePoint = maybeInversePoint (*it, " adding line" );
257
+ x = savePoint.x ();
258
+ y = savePoint.y ();
259
+
260
+ memcpy (&wkb[position],&x,sizeof (double ));
261
+ position+=sizeof (double );
262
+
263
+ memcpy (&wkb[position],&y,sizeof (double ));
264
+ position+=sizeof (double );
265
+ }
266
+ }
229
267
}
230
268
else // polygon
231
269
{
232
- size=1 +3 *sizeof (int )+2 *(mCaptureList .size ()+1 )*sizeof (double );
233
- wkb= new unsigned char [size];
234
- int wkbtype=QGis::WKBPolygon;
235
- int length=mCaptureList .size ()+1 ;// +1 because the first point is needed twice
236
- int numrings=1 ;
237
- memcpy (&wkb[0 ],&end,1 );
238
- memcpy (&wkb[1 ],&wkbtype, sizeof (int ));
239
- memcpy (&wkb[1 +sizeof (int )],&numrings,sizeof (int ));
240
- memcpy (&wkb[1 +2 *sizeof (int )],&length, sizeof (int ));
241
- int position=1 +3 *sizeof (int );
242
- double x,y;
243
- std::list<QgsPoint>::iterator it;
244
- for (it=mCaptureList .begin ();it!=mCaptureList .end ();++it)
245
- {
246
- QgsPoint savePoint = maybeInversePoint (*it, " adding poylgon" );
247
- x = savePoint.x ();
248
- y = savePoint.y ();
249
-
250
- memcpy (&wkb[position],&x,sizeof (double ));
251
- position+=sizeof (double );
252
-
253
- memcpy (&wkb[position],&y,sizeof (double ));
254
- position+=sizeof (double );
255
- }
256
- // close the polygon
257
- it=mCaptureList .begin ();
258
- QgsPoint savePoint = maybeInversePoint (*it, " closing polygon" );
259
- x = savePoint.x ();
260
- y = savePoint.y ();
261
-
262
- memcpy (&wkb[position],&x,sizeof (double ));
263
- position+=sizeof (double );
270
+ if (vlayer->getGeometryType () == QGis::WKBPolygon)
271
+ {
272
+ size=1 +3 *sizeof (int )+2 *(mCaptureList .size ()+1 )*sizeof (double );
273
+ wkb= new unsigned char [size];
274
+ int wkbtype=QGis::WKBPolygon;
275
+ int length=mCaptureList .size ()+1 ;// +1 because the first point is needed twice
276
+ int numrings=1 ;
277
+ memcpy (&wkb[0 ],&end,1 );
278
+ memcpy (&wkb[1 ],&wkbtype, sizeof (int ));
279
+ memcpy (&wkb[1 +sizeof (int )],&numrings,sizeof (int ));
280
+ memcpy (&wkb[1 +2 *sizeof (int )],&length, sizeof (int ));
281
+ int position=1 +3 *sizeof (int );
282
+ double x,y;
283
+ std::list<QgsPoint>::iterator it;
284
+ for (it=mCaptureList .begin ();it!=mCaptureList .end ();++it)
285
+ {
286
+ QgsPoint savePoint = maybeInversePoint (*it, " adding poylgon" );
287
+ x = savePoint.x ();
288
+ y = savePoint.y ();
289
+
290
+ memcpy (&wkb[position],&x,sizeof (double ));
291
+ position+=sizeof (double );
292
+
293
+ memcpy (&wkb[position],&y,sizeof (double ));
294
+ position+=sizeof (double );
295
+ }
296
+ // close the polygon
297
+ it=mCaptureList .begin ();
298
+ QgsPoint savePoint = maybeInversePoint (*it, " closing polygon" );
299
+ x = savePoint.x ();
300
+ y = savePoint.y ();
264
301
265
- memcpy (&wkb[position],&y,sizeof (double ));
302
+ memcpy (&wkb[position],&x,sizeof (double ));
303
+ position+=sizeof (double );
304
+
305
+ memcpy (&wkb[position],&y,sizeof (double ));
306
+ }
307
+ else if (vlayer->getGeometryType () == QGis::WKBMultiPolygon)
308
+ {
309
+ // todo
310
+ }
266
311
}
267
312
f->setGeometryAndOwnership (&wkb[0 ],size);
268
313
0 commit comments