Skip to content

Commit 3368244

Browse files
author
mhugent
committed
added code to allow line capturing in multiline layers
git-svn-id: http://svn.osgeo.org/qgis/trunk/qgis@5479 c8812cc2-4d05-0410-92ff-de0c093fc19c
1 parent b9fae47 commit 3368244

File tree

3 files changed

+106
-54
lines changed

3 files changed

+106
-54
lines changed

src/gui/qgsmaptoolcapture.cpp

+99-54
Original file line numberDiff line numberDiff line change
@@ -205,64 +205,109 @@ QMessageBox::Ok);
205205
char end=vlayer->endian();
206206
if(mTool == CaptureLine)
207207
{
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+
}
229267
}
230268
else // polygon
231269
{
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();
264301

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+
}
266311
}
267312
f->setGeometryAndOwnership(&wkb[0],size);
268313

src/gui/qgsvectorlayer.cpp

+5
Original file line numberDiff line numberDiff line change
@@ -1263,6 +1263,11 @@ QGis::VectorType QgsVectorLayer::vectorType() const
12631263
return QGis::Unknown;
12641264
}
12651265

1266+
QGis::WKBTYPE QgsVectorLayer::getGeometryType() const
1267+
{
1268+
return (QGis::WKBTYPE)(geometryType);
1269+
}
1270+
12661271
QgsVectorLayerProperties *QgsVectorLayer::propertiesDialog()
12671272
{
12681273
return m_propertiesDialog;

src/gui/qgsvectorlayer.h

+2
Original file line numberDiff line numberDiff line change
@@ -208,6 +208,8 @@ public slots:
208208
void setLayerProperties(QgsVectorLayerProperties * properties);
209209
/**Returns point, line or polygon*/
210210
QGis::VectorType vectorType() const;
211+
/**Returns the WKBType or WKBUnknown in case of error*/
212+
QGis::WKBTYPE getGeometryType() const;
211213
/**Returns a pointer to the properties dialog*/
212214
QgsVectorLayerProperties *propertiesDialog();
213215
/**Returns the bounding box of the selected features. If there is no selection, QgsRect(0,0,0,0) is returned*/

0 commit comments

Comments
 (0)