Skip to content

Commit

Permalink
Merge pull request #3229 from mhugo/fix_15113
Browse files Browse the repository at this point in the history
Allow curved polygons to be inverted (fixes #15113)
  • Loading branch information
Hugo Mercier committed Jun 23, 2016
2 parents e6970ba + 8976c9d commit defd738
Show file tree
Hide file tree
Showing 6 changed files with 38 additions and 18 deletions.
8 changes: 4 additions & 4 deletions src/core/symbology-ng/qgsinvertedpolygonrenderer.cpp
Expand Up @@ -288,13 +288,13 @@ void QgsInvertedPolygonRenderer::stopRender( QgsRenderContext& context )
Q_FOREACH ( QgsGeometry* geom, cit.geometries )
{
QgsMultiPolygon multi;
if (( geom->wkbType() == QGis::WKBPolygon ) ||
( geom->wkbType() == QGis::WKBPolygon25D ) )
QgsWKBTypes::Type type = QgsWKBTypes::flatType( geom->geometry()->wkbType() );

if (( type == QgsWKBTypes::Polygon ) || ( type == QgsWKBTypes::CurvePolygon ) )
{
multi.append( geom->asPolygon() );
}
else if (( geom->wkbType() == QGis::WKBMultiPolygon ) ||
( geom->wkbType() == QGis::WKBMultiPolygon25D ) )
else if (( type == QgsWKBTypes::MultiPolygon ) || ( type == QgsWKBTypes::MultiSurface ) )
{
multi = geom->asMultiPolygon();
}
Expand Down
7 changes: 3 additions & 4 deletions src/gui/symbology-ng/qgsinvertedpolygonrendererwidget.cpp
Expand Up @@ -34,11 +34,10 @@ QgsInvertedPolygonRendererWidget::QgsInvertedPolygonRendererWidget( QgsVectorLay
return;
}

QgsWKBTypes::Type type = QgsWKBTypes::singleType( QgsWKBTypes::flatType( QGis::fromOldWkbType( layer->wkbType() ) ) );

// the renderer only applies to polygon vector layers
if ( layer->wkbType() != QGis::WKBPolygon &&
layer->wkbType() != QGis::WKBPolygon25D &&
layer->wkbType() != QGis::WKBMultiPolygon &&
layer->wkbType() != QGis::WKBMultiPolygon25D )
if ( type != QgsWKBTypes::Polygon && type != QgsWKBTypes::CurvePolygon )
{
//setup blank dialog
mRenderer.reset( nullptr );
Expand Down
41 changes: 31 additions & 10 deletions tests/src/core/testqgsinvertedpolygonrenderer.cpp
Expand Up @@ -51,10 +51,13 @@ class TestQgsInvertedPolygon : public QObject
void graduatedSubRenderer();
void preprocess();
void projectionTest();
#if defined(GDAL_VERSION_NUM) && GDAL_VERSION_MAJOR >= 2
void curvedPolygons();
#endif

private:
bool mTestHasError;
bool setQml( const QString& qmlFile );
bool setQml( QgsVectorLayer* vlayer, const QString& qmlFile );
bool imageCheck( const QString& theType, const QgsRectangle* = 0 );
QgsMapSettings mMapSettings;
QgsVectorLayer * mpPolysLayer;
Expand Down Expand Up @@ -93,8 +96,7 @@ void TestQgsInvertedPolygon::initTestCase()
mpPolysLayer->setSimplifyMethod( simplifyMethod );

// Register the layer with the registry
QgsMapLayerRegistry::instance()->addMapLayers(
QList<QgsMapLayer *>() << mpPolysLayer );
QgsMapLayerRegistry::instance()->addMapLayers( QList<QgsMapLayer *>() << mpPolysLayer );

mMapSettings.setLayers( QStringList() << mpPolysLayer->id() );
mReport += "<h1>Inverted Polygon Renderer Tests</h1>\n";
Expand All @@ -117,22 +119,22 @@ void TestQgsInvertedPolygon::cleanupTestCase()
void TestQgsInvertedPolygon::singleSubRenderer()
{
mReport += "<h2>Inverted polygon renderer, single sub renderer test</h2>\n";
QVERIFY( setQml( "inverted_polys_single.qml" ) );
QVERIFY( setQml( mpPolysLayer, "inverted_polys_single.qml" ) );
QVERIFY( imageCheck( "inverted_polys_single" ) );
}

void TestQgsInvertedPolygon::graduatedSubRenderer()
{
mReport += "<h2>Inverted polygon renderer, graduated sub renderer test</h2>\n";
QVERIFY( setQml( "inverted_polys_graduated.qml" ) );
QVERIFY( setQml( mpPolysLayer, "inverted_polys_graduated.qml" ) );
QVERIFY( imageCheck( "inverted_polys_graduated" ) );
}

void TestQgsInvertedPolygon::preprocess()
{
// FIXME will have to find some overlapping polygons
mReport += "<h2>Inverted polygon renderer, preprocessing test</h2>\n";
QVERIFY( setQml( "inverted_polys_preprocess.qml" ) );
QVERIFY( setQml( mpPolysLayer, "inverted_polys_preprocess.qml" ) );
QVERIFY( imageCheck( "inverted_polys_preprocess" ) );
}

Expand All @@ -142,25 +144,44 @@ void TestQgsInvertedPolygon::projectionTest()
mMapSettings.setDestinationCrs( QgsCoordinateReferenceSystem( "EPSG:2154" ) );
mMapSettings.setCrsTransformEnabled( true );
QgsRectangle extent( QgsPoint( -8639421, 8382691 ), QgsPoint( -3969110, 12570905 ) );
QVERIFY( setQml( "inverted_polys_single.qml" ) );
QVERIFY( setQml( mpPolysLayer, "inverted_polys_single.qml" ) );
QVERIFY( imageCheck( "inverted_polys_projection", &extent ) );
QVERIFY( setQml( "inverted_polys_preprocess.qml" ) );
QVERIFY( setQml( mpPolysLayer, "inverted_polys_preprocess.qml" ) );
QVERIFY( imageCheck( "inverted_polys_projection2", &extent ) );
mMapSettings.setCrsTransformEnabled( false );
}

#if defined(GDAL_VERSION_NUM) && GDAL_VERSION_MAJOR >= 2
// This test relies on GDAL support of curved polygons
void TestQgsInvertedPolygon::curvedPolygons()
{
QString myCurvedPolysFileName = mTestDataDir + "curved_polys.gpkg";
QFileInfo myCurvedPolyFileInfo( myCurvedPolysFileName );
QgsVectorLayer* curvedLayer = new QgsVectorLayer( myCurvedPolyFileInfo.filePath() + "|layername=polys",
myCurvedPolyFileInfo.completeBaseName(), "ogr" );
curvedLayer->setSimplifyMethod( simplifyMethod );
QgsMapLayerRegistry::instance()->addMapLayers( QList<QgsMapLayer *>() << curvedLayer );

mReport += "<h2>Inverted polygon renderer, curved polygons test</h2>\n";
mMapSettings.setLayers( QStringList() << curvedLayer->id() );
QVERIFY( setQml( mpCurvedPolysLayer, "inverted_polys_single.qml" ) );
QVERIFY( imageCheck( "inverted_polys_curved" ) );
mMapSettings.setLayers( QStringList() << curvedLayer->id() );
}
#endif

//
// Private helper functions not called directly by CTest
//

bool TestQgsInvertedPolygon::setQml( const QString& qmlFile )
bool TestQgsInvertedPolygon::setQml( QgsVectorLayer* vlayer, const QString& qmlFile )
{
//load a qml style and apply to our layer
//the style will correspond to the renderer
//type we are testing
bool myStyleFlag = false;
QString myFileName = mTestDataDir + qmlFile;
QString error = mpPolysLayer->loadNamedStyle( myFileName, myStyleFlag );
QString error = vlayer->loadNamedStyle( myFileName, myStyleFlag );
if ( !myStyleFlag )
{
qDebug( "%s", error.toLocal8Bit().constData() );
Expand Down
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added tests/testdata/curved_polys.gpkg
Binary file not shown.

0 comments on commit defd738

Please sign in to comment.