From 60360f9b970894f5fb61be6394231d8aa4bf8309 Mon Sep 17 00:00:00 2001 From: Nyall Dawson Date: Wed, 12 Feb 2025 13:14:14 +1000 Subject: [PATCH] Add method to directly convert QgsAbstractGeometry to QPolygonF lists This overload avoids creating a QgsGeometry if we only have a QgsAbstractGeometry pointer object to convert --- .../symbology/qgssymbollayerutils.sip.in | 9 +++++++++ .../symbology/qgssymbollayerutils.sip.in | 9 +++++++++ src/core/symbology/qgssymbollayerutils.cpp | 18 +++++++++++++----- src/core/symbology/qgssymbollayerutils.h | 9 +++++++++ 4 files changed, 40 insertions(+), 5 deletions(-) diff --git a/python/PyQt6/core/auto_generated/symbology/qgssymbollayerutils.sip.in b/python/PyQt6/core/auto_generated/symbology/qgssymbollayerutils.sip.in index 5dfda106322..b0fc83d6b5a 100644 --- a/python/PyQt6/core/auto_generated/symbology/qgssymbollayerutils.sip.in +++ b/python/PyQt6/core/auto_generated/symbology/qgssymbollayerutils.sip.in @@ -814,6 +814,15 @@ how the geometry should be drawn for a symbol of the given ``type``, as a list of geometry parts and rings. .. versionadded:: 3.40 +%End + + static QList< QList< QPolygonF > > toQPolygonF( const QgsAbstractGeometry *geometry, Qgis::SymbolType type ); +%Docstring +Converts a ``geometry`` to a set of QPolygonF objects representing +how the geometry should be drawn for a symbol of the given ``type``, +as a list of geometry parts and rings. + +.. versionadded:: 3.42 %End static QPointF polygonCentroid( const QPolygonF &points ); diff --git a/python/core/auto_generated/symbology/qgssymbollayerutils.sip.in b/python/core/auto_generated/symbology/qgssymbollayerutils.sip.in index 5dfda106322..b0fc83d6b5a 100644 --- a/python/core/auto_generated/symbology/qgssymbollayerutils.sip.in +++ b/python/core/auto_generated/symbology/qgssymbollayerutils.sip.in @@ -814,6 +814,15 @@ how the geometry should be drawn for a symbol of the given ``type``, as a list of geometry parts and rings. .. versionadded:: 3.40 +%End + + static QList< QList< QPolygonF > > toQPolygonF( const QgsAbstractGeometry *geometry, Qgis::SymbolType type ); +%Docstring +Converts a ``geometry`` to a set of QPolygonF objects representing +how the geometry should be drawn for a symbol of the given ``type``, +as a list of geometry parts and rings. + +.. versionadded:: 3.42 %End static QPointF polygonCentroid( const QPolygonF &points ); diff --git a/src/core/symbology/qgssymbollayerutils.cpp b/src/core/symbology/qgssymbollayerutils.cpp index ba66abd62f0..24d9f032ddf 100644 --- a/src/core/symbology/qgssymbollayerutils.cpp +++ b/src/core/symbology/qgssymbollayerutils.cpp @@ -4498,15 +4498,23 @@ QPolygonF curveToPolygonF( const QgsCurve *curve ) QList > QgsSymbolLayerUtils::toQPolygonF( const QgsGeometry &geometry, Qgis::SymbolType type ) { + return toQPolygonF( geometry.constGet(), type ); +} + +QList > QgsSymbolLayerUtils::toQPolygonF( const QgsAbstractGeometry *geometry, Qgis::SymbolType type ) +{ + if ( !geometry ) + return {}; + switch ( type ) { case Qgis::SymbolType::Marker: { QPolygonF points; - if ( QgsWkbTypes::flatType( geometry.wkbType() ) == Qgis::WkbType::MultiPoint ) + if ( QgsWkbTypes::flatType( geometry->wkbType() ) == Qgis::WkbType::MultiPoint ) { - for ( auto it = geometry.vertices_begin(); it != geometry.vertices_end(); ++it ) + for ( auto it = geometry->vertices_begin(); it != geometry->vertices_end(); ++it ) points << QPointF( ( *it ).x(), ( *it ).y() ); } else @@ -4519,9 +4527,9 @@ QList > QgsSymbolLayerUtils::toQPolygonF( const QgsGeometry &ge case Qgis::SymbolType::Line: { QList< QList > res; - if ( QgsWkbTypes::geometryType( geometry.wkbType() ) == Qgis::GeometryType::Line ) + if ( QgsWkbTypes::geometryType( geometry->wkbType() ) == Qgis::GeometryType::Line ) { - for ( auto it = geometry.const_parts_begin(); it != geometry.const_parts_end(); ++it ) + for ( auto it = geometry->const_parts_begin(); it != geometry->const_parts_end(); ++it ) { res << ( QList< QPolygonF >() << curveToPolygonF( qgsgeometry_cast< const QgsCurve * >( *it ) ) ); } @@ -4533,7 +4541,7 @@ QList > QgsSymbolLayerUtils::toQPolygonF( const QgsGeometry &ge { QList< QList > res; - for ( auto it = geometry.const_parts_begin(); it != geometry.const_parts_end(); ++it ) + for ( auto it = geometry->const_parts_begin(); it != geometry->const_parts_end(); ++it ) { QList thisPart; const QgsCurvePolygon *surface = qgsgeometry_cast< const QgsCurvePolygon * >( *it ); diff --git a/src/core/symbology/qgssymbollayerutils.h b/src/core/symbology/qgssymbollayerutils.h index c1a3221209b..16017ff3450 100644 --- a/src/core/symbology/qgssymbollayerutils.h +++ b/src/core/symbology/qgssymbollayerutils.h @@ -763,6 +763,15 @@ class CORE_EXPORT QgsSymbolLayerUtils */ static QList< QList< QPolygonF > > toQPolygonF( const QgsGeometry &geometry, Qgis::SymbolType type ); + /** + * Converts a \a geometry to a set of QPolygonF objects representing + * how the geometry should be drawn for a symbol of the given \a type, + * as a list of geometry parts and rings. + * + * \since QGIS 3.42 + */ + static QList< QList< QPolygonF > > toQPolygonF( const QgsAbstractGeometry *geometry, Qgis::SymbolType type ); + //! Calculate the centroid point of a QPolygonF static QPointF polygonCentroid( const QPolygonF &points );