void QgsPolygonV2::addInteriorRing( QgsCurve *ring ) { if ( !ring ) return; if ( ring->hasCurvedSegments() ) { //can't add a curved ring to a QgsPolygonV2 QgsLineString *segmented = ring->curveToLine(); delete ring; ring = segmented; } QgsLineString *lineString = qgsgeometry_cast< QgsLineString *>( ring ); if ( lineString && !lineString->isClosed() ) { lineString->close(); } if ( mWkbType == QgsWkbTypes::Polygon25D ) { ring->convertTo( QgsWkbTypes::LineString25D ); mInteriorRings.append( ring ); } else { QgsCurvePolygon::addInteriorRing( ring ); } clearCache(); }
void QgsPolygonV2::setExteriorRing( QgsCurve *ring ) { if ( !ring ) { return; } if ( ring->hasCurvedSegments() ) { //need to segmentize ring as polygon does not support curves QgsCurve *line = ring->segmentize(); delete ring; ring = line; } QgsLineString *lineString = qgsgeometry_cast< QgsLineString *>( ring ); if ( lineString && !lineString->isClosed() ) { lineString->close(); } mExteriorRing.reset( ring ); //set proper wkb type setZMTypeFromSubGeometry( ring, QgsWkbTypes::Polygon ); //match dimensionality for rings for ( QgsCurve *ring : qgis::as_const( mInteriorRings ) ) { ring->convertTo( mExteriorRing->wkbType() ); } clearCache(); }
void QgsTriangle::setExteriorRing( QgsCurve *ring ) { if ( !ring ) { return; } if ( ring->hasCurvedSegments() ) { //need to segmentize ring as polygon does not support curves QgsCurve *line = ring->segmentize(); delete ring; ring = line; } if ( ( ring->numPoints() > 4 ) || ( ring->numPoints() < 3 ) ) { delete ring; return; } else if ( ring->numPoints() == 4 ) { if ( !ring->isClosed() ) { delete ring; return; } } else if ( ring->numPoints() == 3 ) { if ( ring->isClosed() ) { delete ring; return; } QgsLineString *lineString = static_cast< QgsLineString *>( ring ); if ( !lineString->isClosed() ) { lineString->close(); } ring = lineString; } if ( !validateGeom( ring->vertexAt( QgsVertexId( 0, 0, 0 ) ), ring->vertexAt( QgsVertexId( 0, 0, 1 ) ), ring->vertexAt( QgsVertexId( 0, 0, 2 ) ) ) ) { delete ring; return; } mExteriorRing.reset( ring ); //set proper wkb type setZMTypeFromSubGeometry( ring, QgsWkbTypes::Triangle ); clearCache(); }