Skip to content

Commit d0e927a

Browse files
authored
Fix rubber band handing of curved geometries (#5790)
1 parent f8788b9 commit d0e927a

File tree

1 file changed

+47
-69
lines changed

1 file changed

+47
-69
lines changed

src/gui/qgsrubberband.cpp

+47-69
Original file line numberDiff line numberDiff line change
@@ -261,97 +261,75 @@ void QgsRubberBand::addGeometry( const QgsGeometry &geometry, const QgsCoordinat
261261
geom.transform( ct );
262262
}
263263

264-
switch ( QgsWkbTypes::flatType( geom.wkbType() ) )
264+
QgsWkbTypes::Type geomType = geom.wkbType();
265+
if ( QgsWkbTypes::geometryType( geomType ) == QgsWkbTypes::PointGeometry && !QgsWkbTypes::isMultiType( geomType ) )
265266
{
266-
267-
case QgsWkbTypes::Point:
268-
case QgsWkbTypes::Point25D:
267+
QgsPointXY pt = geom.asPoint();
268+
addPoint( pt, false, idx );
269+
removeLastPoint( idx, false );
270+
}
271+
else if ( QgsWkbTypes::geometryType( geomType ) == QgsWkbTypes::PointGeometry && QgsWkbTypes::isMultiType( geomType ) )
272+
{
273+
const QgsMultiPointXY mpt = geom.asMultiPoint();
274+
for ( QgsPointXY pt : mpt )
269275
{
270-
QgsPointXY pt = geom.asPoint();
271276
addPoint( pt, false, idx );
272277
removeLastPoint( idx, false );
278+
idx++;
273279
}
274-
break;
275-
276-
case QgsWkbTypes::MultiPoint:
277-
case QgsWkbTypes::MultiPoint25D:
280+
}
281+
else if ( QgsWkbTypes::geometryType( geomType ) == QgsWkbTypes::LineGeometry && !QgsWkbTypes::isMultiType( geomType ) )
282+
{
283+
const QgsPolylineXY line = geom.asPolyline();
284+
for ( QgsPointXY pt : line )
278285
{
279-
const QgsMultiPointXY mpt = geom.asMultiPoint();
280-
for ( QgsPointXY pt : mpt )
281-
{
282-
addPoint( pt, false, idx );
283-
removeLastPoint( idx, false );
284-
idx++;
285-
}
286+
addPoint( pt, false, idx );
286287
}
287-
break;
288-
289-
case QgsWkbTypes::LineString:
290-
case QgsWkbTypes::LineString25D:
288+
}
289+
else if ( QgsWkbTypes::geometryType( geomType ) == QgsWkbTypes::LineGeometry && QgsWkbTypes::isMultiType( geomType ) )
290+
{
291+
const QgsMultiPolylineXY mline = geom.asMultiPolyline();
292+
for ( const QgsPolylineXY &line : mline )
291293
{
292-
const QgsPolylineXY line = geom.asPolyline();
294+
if ( line.isEmpty() )
295+
{
296+
continue;
297+
}
293298
for ( QgsPointXY pt : line )
294299
{
295300
addPoint( pt, false, idx );
296301
}
302+
idx++;
297303
}
298-
break;
299-
300-
case QgsWkbTypes::MultiLineString:
301-
case QgsWkbTypes::MultiLineString25D:
304+
}
305+
else if ( QgsWkbTypes::geometryType( geomType ) == QgsWkbTypes::PolygonGeometry && !QgsWkbTypes::isMultiType( geomType ) )
306+
{
307+
const QgsPolygonXY poly = geom.asPolygon();
308+
const QgsPolylineXY line = poly.at( 0 );
309+
for ( QgsPointXY pt : line )
302310
{
303-
304-
const QgsMultiPolylineXY mline = geom.asMultiPolyline();
305-
for ( const QgsPolylineXY &line : mline )
306-
{
307-
if ( line.isEmpty() )
308-
{
309-
continue;
310-
}
311-
312-
for ( QgsPointXY pt : line )
313-
{
314-
addPoint( pt, false, idx );
315-
}
316-
idx++;
317-
}
311+
addPoint( pt, false, idx );
318312
}
319-
break;
320-
321-
case QgsWkbTypes::Polygon:
322-
case QgsWkbTypes::Polygon25D:
313+
}
314+
else if ( QgsWkbTypes::geometryType( geomType ) == QgsWkbTypes::PolygonGeometry && QgsWkbTypes::isMultiType( geomType ) )
315+
{
316+
const QgsMultiPolygonXY multipoly = geom.asMultiPolygon();
317+
for ( const QgsPolygonXY &poly : multipoly )
323318
{
324-
const QgsPolygonXY poly = geom.asPolygon();
319+
if ( poly.empty() )
320+
continue;
321+
325322
const QgsPolylineXY line = poly.at( 0 );
326323
for ( QgsPointXY pt : line )
327324
{
328325
addPoint( pt, false, idx );
329326
}
327+
idx++;
330328
}
331-
break;
332-
333-
case QgsWkbTypes::MultiPolygon:
334-
case QgsWkbTypes::MultiPolygon25D:
335-
{
336-
const QgsMultiPolygonXY multipoly = geom.asMultiPolygon();
337-
for ( const QgsPolygonXY &poly : multipoly )
338-
{
339-
if ( poly.empty() )
340-
continue;
341-
342-
const QgsPolylineXY line = poly.at( 0 );
343-
for ( QgsPointXY pt : line )
344-
{
345-
addPoint( pt, false, idx );
346-
}
347-
idx++;
348-
}
349-
}
350-
break;
351-
352-
case QgsWkbTypes::Unknown:
353-
default:
354-
return;
329+
}
330+
else
331+
{
332+
return;
355333
}
356334

357335
setVisible( true );

0 commit comments

Comments
 (0)