mirror of
https://github.com/qgis/QGIS.git
synced 2025-04-13 00:03:09 -04:00
[categorized][graduated] Handle categorized<->graduated renderer conversion
(fixes #31633)
This commit is contained in:
parent
f21e03c5ef
commit
531e1b0715
@ -336,6 +336,7 @@ the categories' color.
|
||||
.. seealso:: :py:func:`sourceColorRamp`
|
||||
%End
|
||||
|
||||
|
||||
void setSourceSymbol( QgsSymbol *sym /Transfer/ );
|
||||
%Docstring
|
||||
Sets the source symbol for the renderer, which is the base symbol used for the each categories' symbol before applying
|
||||
@ -357,6 +358,7 @@ Returns the source color ramp, from which each categories' color is derived.
|
||||
.. seealso:: :py:func:`sourceSymbol`
|
||||
%End
|
||||
|
||||
|
||||
void setSourceColorRamp( QgsColorRamp *ramp /Transfer/ );
|
||||
%Docstring
|
||||
Sets the source color ramp.
|
||||
|
@ -347,6 +347,7 @@ the classes' color.
|
||||
.. seealso:: :py:func:`sourceColorRamp`
|
||||
%End
|
||||
|
||||
|
||||
void setSourceSymbol( QgsSymbol *sym /Transfer/ );
|
||||
%Docstring
|
||||
Sets the source symbol for the renderer, which is the base symbol used for the each classes' symbol before applying
|
||||
@ -368,6 +369,7 @@ Returns the source color ramp, from which each classes' color is derived.
|
||||
.. seealso:: :py:func:`sourceSymbol`
|
||||
%End
|
||||
|
||||
|
||||
void setSourceColorRamp( QgsColorRamp *ramp /Transfer/ );
|
||||
%Docstring
|
||||
Sets the source color ramp.
|
||||
|
@ -20,6 +20,7 @@
|
||||
#include "qgssymbol.h"
|
||||
#include "qgssymbollayerutils.h"
|
||||
#include "qgscolorramp.h"
|
||||
#include "qgsgraduatedsymbolrenderer.h"
|
||||
#include "qgspointdisplacementrenderer.h"
|
||||
#include "qgsinvertedpolygonrenderer.h"
|
||||
#include "qgspainteffect.h"
|
||||
@ -953,6 +954,12 @@ QgsSymbol *QgsCategorizedSymbolRenderer::sourceSymbol()
|
||||
{
|
||||
return mSourceSymbol.get();
|
||||
}
|
||||
|
||||
const QgsSymbol *QgsCategorizedSymbolRenderer::sourceSymbol() const
|
||||
{
|
||||
return mSourceSymbol.get();
|
||||
}
|
||||
|
||||
void QgsCategorizedSymbolRenderer::setSourceSymbol( QgsSymbol *sym )
|
||||
{
|
||||
mSourceSymbol.reset( sym );
|
||||
@ -963,6 +970,11 @@ QgsColorRamp *QgsCategorizedSymbolRenderer::sourceColorRamp()
|
||||
return mSourceColorRamp.get();
|
||||
}
|
||||
|
||||
const QgsColorRamp *QgsCategorizedSymbolRenderer::sourceColorRamp() const
|
||||
{
|
||||
return mSourceColorRamp.get();
|
||||
}
|
||||
|
||||
void QgsCategorizedSymbolRenderer::setSourceColorRamp( QgsColorRamp *ramp )
|
||||
{
|
||||
mSourceColorRamp.reset( ramp );
|
||||
@ -1038,22 +1050,36 @@ void QgsCategorizedSymbolRenderer::checkLegendSymbolItem( const QString &key, bo
|
||||
|
||||
QgsCategorizedSymbolRenderer *QgsCategorizedSymbolRenderer::convertFromRenderer( const QgsFeatureRenderer *renderer )
|
||||
{
|
||||
QgsCategorizedSymbolRenderer *r = nullptr;
|
||||
std::unique_ptr< QgsCategorizedSymbolRenderer > r;
|
||||
if ( renderer->type() == QLatin1String( "categorizedSymbol" ) )
|
||||
{
|
||||
r = dynamic_cast<QgsCategorizedSymbolRenderer *>( renderer->clone() );
|
||||
r.reset( static_cast<QgsCategorizedSymbolRenderer *>( renderer->clone() ) );
|
||||
}
|
||||
else if ( renderer->type() == QLatin1String( "graduatedSymbol" ) )
|
||||
{
|
||||
const QgsGraduatedSymbolRenderer *graduatedSymbolRenderer = dynamic_cast<const QgsGraduatedSymbolRenderer *>( renderer );
|
||||
if ( graduatedSymbolRenderer )
|
||||
{
|
||||
r.reset( new QgsCategorizedSymbolRenderer( QString(), QgsCategoryList() ) );
|
||||
r->setSourceSymbol( graduatedSymbolRenderer->sourceSymbol()->clone() );
|
||||
if ( graduatedSymbolRenderer->sourceColorRamp() )
|
||||
{
|
||||
r->setSourceColorRamp( graduatedSymbolRenderer->sourceColorRamp()->clone() );
|
||||
}
|
||||
r->setClassAttribute( graduatedSymbolRenderer->classAttribute() );
|
||||
}
|
||||
}
|
||||
else if ( renderer->type() == QLatin1String( "pointDisplacement" ) || renderer->type() == QLatin1String( "pointCluster" ) )
|
||||
{
|
||||
const QgsPointDistanceRenderer *pointDistanceRenderer = dynamic_cast<const QgsPointDistanceRenderer *>( renderer );
|
||||
if ( pointDistanceRenderer )
|
||||
r = convertFromRenderer( pointDistanceRenderer->embeddedRenderer() );
|
||||
r.reset( convertFromRenderer( pointDistanceRenderer->embeddedRenderer() ) );
|
||||
}
|
||||
else if ( renderer->type() == QLatin1String( "invertedPolygonRenderer" ) )
|
||||
{
|
||||
const QgsInvertedPolygonRenderer *invertedPolygonRenderer = dynamic_cast<const QgsInvertedPolygonRenderer *>( renderer );
|
||||
if ( invertedPolygonRenderer )
|
||||
r = convertFromRenderer( invertedPolygonRenderer->embeddedRenderer() );
|
||||
r.reset( convertFromRenderer( invertedPolygonRenderer->embeddedRenderer() ) );
|
||||
}
|
||||
|
||||
// If not one of the specifically handled renderers, then just grab the symbol from the renderer
|
||||
@ -1061,7 +1087,7 @@ QgsCategorizedSymbolRenderer *QgsCategorizedSymbolRenderer::convertFromRenderer(
|
||||
|
||||
if ( !r )
|
||||
{
|
||||
r = new QgsCategorizedSymbolRenderer( QString(), QgsCategoryList() );
|
||||
r = qgis::make_unique< QgsCategorizedSymbolRenderer >( QString(), QgsCategoryList() );
|
||||
QgsRenderContext context;
|
||||
QgsSymbolList symbols = const_cast<QgsFeatureRenderer *>( renderer )->symbols( context );
|
||||
if ( !symbols.isEmpty() )
|
||||
@ -1073,7 +1099,7 @@ QgsCategorizedSymbolRenderer *QgsCategorizedSymbolRenderer::convertFromRenderer(
|
||||
r->setOrderBy( renderer->orderBy() );
|
||||
r->setOrderByEnabled( renderer->orderByEnabled() );
|
||||
|
||||
return r;
|
||||
return r.release();
|
||||
}
|
||||
|
||||
void QgsCategorizedSymbolRenderer::setDataDefinedSizeLegend( QgsDataDefinedSizeLegend *settings )
|
||||
|
@ -323,6 +323,15 @@ class CORE_EXPORT QgsCategorizedSymbolRenderer : public QgsFeatureRenderer
|
||||
*/
|
||||
QgsSymbol *sourceSymbol();
|
||||
|
||||
/**
|
||||
* Returns the renderer's source symbol, which is the base symbol used for the each categories' symbol before applying
|
||||
* the categories' color.
|
||||
* \see setSourceSymbol()
|
||||
* \see sourceColorRamp()
|
||||
* \note Not available in Python bindings.
|
||||
*/
|
||||
const QgsSymbol *sourceSymbol() const SIP_SKIP;
|
||||
|
||||
/**
|
||||
* Sets the source symbol for the renderer, which is the base symbol used for the each categories' symbol before applying
|
||||
* the categories' color.
|
||||
@ -339,6 +348,14 @@ class CORE_EXPORT QgsCategorizedSymbolRenderer : public QgsFeatureRenderer
|
||||
*/
|
||||
QgsColorRamp *sourceColorRamp();
|
||||
|
||||
/**
|
||||
* Returns the source color ramp, from which each categories' color is derived.
|
||||
* \see setSourceColorRamp()
|
||||
* \see sourceSymbol()
|
||||
* \note Not available in Python bindings.
|
||||
*/
|
||||
const QgsColorRamp *sourceColorRamp() const SIP_SKIP;
|
||||
|
||||
/**
|
||||
* Sets the source color ramp.
|
||||
* \param ramp color ramp. Ownership is transferred to the renderer
|
||||
|
@ -21,6 +21,7 @@
|
||||
#include "qgsgraduatedsymbolrenderer.h"
|
||||
|
||||
#include "qgsattributes.h"
|
||||
#include "qgscategorizedsymbolrenderer.h"
|
||||
#include "qgscolorramp.h"
|
||||
#include "qgsdatadefinedsizelegend.h"
|
||||
#include "qgsexpression.h"
|
||||
@ -795,6 +796,12 @@ QgsSymbol *QgsGraduatedSymbolRenderer::sourceSymbol()
|
||||
{
|
||||
return mSourceSymbol.get();
|
||||
}
|
||||
|
||||
const QgsSymbol *QgsGraduatedSymbolRenderer::sourceSymbol() const
|
||||
{
|
||||
return mSourceSymbol.get();
|
||||
}
|
||||
|
||||
void QgsGraduatedSymbolRenderer::setSourceSymbol( QgsSymbol *sym )
|
||||
{
|
||||
mSourceSymbol.reset( sym );
|
||||
@ -805,6 +812,11 @@ QgsColorRamp *QgsGraduatedSymbolRenderer::sourceColorRamp()
|
||||
return mSourceColorRamp.get();
|
||||
}
|
||||
|
||||
const QgsColorRamp *QgsGraduatedSymbolRenderer::sourceColorRamp() const
|
||||
{
|
||||
return mSourceColorRamp.get();
|
||||
}
|
||||
|
||||
void QgsGraduatedSymbolRenderer::setSourceColorRamp( QgsColorRamp *ramp )
|
||||
{
|
||||
if ( ramp == mSourceColorRamp.get() )
|
||||
@ -1208,22 +1220,39 @@ void QgsGraduatedSymbolRenderer::setAstride( bool astride ) SIP_DEPRECATED
|
||||
|
||||
QgsGraduatedSymbolRenderer *QgsGraduatedSymbolRenderer::convertFromRenderer( const QgsFeatureRenderer *renderer )
|
||||
{
|
||||
QgsGraduatedSymbolRenderer *r = nullptr;
|
||||
std::unique_ptr< QgsGraduatedSymbolRenderer > r;
|
||||
if ( renderer->type() == QLatin1String( "graduatedSymbol" ) )
|
||||
{
|
||||
r = dynamic_cast<QgsGraduatedSymbolRenderer *>( renderer->clone() );
|
||||
r.reset( static_cast<QgsGraduatedSymbolRenderer *>( renderer->clone() ) );
|
||||
}
|
||||
else if ( renderer->type() == QLatin1String( "categorizedSymbol" ) )
|
||||
{
|
||||
const QgsCategorizedSymbolRenderer *categorizedSymbolRenderer = dynamic_cast<const QgsCategorizedSymbolRenderer *>( renderer );
|
||||
if ( categorizedSymbolRenderer )
|
||||
{
|
||||
r = qgis::make_unique< QgsGraduatedSymbolRenderer >( QString(), QgsRangeList() );
|
||||
r->setSourceSymbol( categorizedSymbolRenderer->sourceSymbol()->clone() );
|
||||
if ( categorizedSymbolRenderer->sourceColorRamp() )
|
||||
{
|
||||
bool isRandom = dynamic_cast<const QgsRandomColorRamp *>( categorizedSymbolRenderer->sourceColorRamp() ) ||
|
||||
dynamic_cast<const QgsLimitedRandomColorRamp *>( categorizedSymbolRenderer->sourceColorRamp() );
|
||||
if ( !isRandom )
|
||||
r->setSourceColorRamp( categorizedSymbolRenderer->sourceColorRamp()->clone() );
|
||||
}
|
||||
r->setClassAttribute( categorizedSymbolRenderer->classAttribute() );
|
||||
}
|
||||
}
|
||||
else if ( renderer->type() == QLatin1String( "pointDisplacement" ) || renderer->type() == QLatin1String( "pointCluster" ) )
|
||||
{
|
||||
const QgsPointDistanceRenderer *pointDistanceRenderer = dynamic_cast<const QgsPointDistanceRenderer *>( renderer );
|
||||
if ( pointDistanceRenderer )
|
||||
r = convertFromRenderer( pointDistanceRenderer->embeddedRenderer() );
|
||||
r.reset( convertFromRenderer( pointDistanceRenderer->embeddedRenderer() ) );
|
||||
}
|
||||
else if ( renderer->type() == QLatin1String( "invertedPolygonRenderer" ) )
|
||||
{
|
||||
const QgsInvertedPolygonRenderer *invertedPolygonRenderer = dynamic_cast<const QgsInvertedPolygonRenderer *>( renderer );
|
||||
if ( invertedPolygonRenderer )
|
||||
r = convertFromRenderer( invertedPolygonRenderer->embeddedRenderer() );
|
||||
r.reset( convertFromRenderer( invertedPolygonRenderer->embeddedRenderer() ) );
|
||||
}
|
||||
|
||||
// If not one of the specifically handled renderers, then just grab the symbol from the renderer
|
||||
@ -1231,7 +1260,7 @@ QgsGraduatedSymbolRenderer *QgsGraduatedSymbolRenderer::convertFromRenderer( con
|
||||
|
||||
if ( !r )
|
||||
{
|
||||
r = new QgsGraduatedSymbolRenderer( QString(), QgsRangeList() );
|
||||
r = qgis::make_unique< QgsGraduatedSymbolRenderer >( QString(), QgsRangeList() );
|
||||
QgsRenderContext context;
|
||||
QgsSymbolList symbols = const_cast<QgsFeatureRenderer *>( renderer )->symbols( context );
|
||||
if ( !symbols.isEmpty() )
|
||||
@ -1243,7 +1272,7 @@ QgsGraduatedSymbolRenderer *QgsGraduatedSymbolRenderer::convertFromRenderer( con
|
||||
r->setOrderBy( renderer->orderBy() );
|
||||
r->setOrderByEnabled( renderer->orderByEnabled() );
|
||||
|
||||
return r;
|
||||
return r.release();
|
||||
}
|
||||
|
||||
void QgsGraduatedSymbolRenderer::setDataDefinedSizeLegend( QgsDataDefinedSizeLegend *settings )
|
||||
|
@ -300,6 +300,15 @@ class CORE_EXPORT QgsGraduatedSymbolRenderer : public QgsFeatureRenderer
|
||||
*/
|
||||
QgsSymbol *sourceSymbol();
|
||||
|
||||
/**
|
||||
* Returns the renderer's source symbol, which is the base symbol used for the each classes' symbol before applying
|
||||
* the classes' color.
|
||||
* \see setSourceSymbol()
|
||||
* \see sourceColorRamp()
|
||||
* \note Not available in Python bindings.
|
||||
*/
|
||||
const QgsSymbol *sourceSymbol() const SIP_SKIP;
|
||||
|
||||
/**
|
||||
* Sets the source symbol for the renderer, which is the base symbol used for the each classes' symbol before applying
|
||||
* the classes' color.
|
||||
@ -316,6 +325,14 @@ class CORE_EXPORT QgsGraduatedSymbolRenderer : public QgsFeatureRenderer
|
||||
*/
|
||||
QgsColorRamp *sourceColorRamp();
|
||||
|
||||
/**
|
||||
* Returns the source color ramp, from which each classes' color is derived.
|
||||
* \see setSourceColorRamp()
|
||||
* \see sourceSymbol()
|
||||
* \note Not available in Python bindings.
|
||||
*/
|
||||
const QgsColorRamp *sourceColorRamp() const SIP_SKIP;
|
||||
|
||||
/**
|
||||
* Sets the source color ramp.
|
||||
* \param ramp color ramp. Ownership is transferred to the renderer
|
||||
|
Loading…
x
Reference in New Issue
Block a user