42using namespace Qt::StringLiterals;
46void QgsDiagramLayerSettings::initPropertyDefinitions()
48 if ( !sPropertyDefinitions.isEmpty() )
51 const QString origin = u
"diagram"_s;
72 initPropertyDefinitions();
73 return sPropertyDefinitions;
78 initPropertyDefinitions();
84 , mPlacement( rh.mPlacement )
85 , mPlacementFlags( rh.mPlacementFlags )
86 , mPriority( rh.mPriority )
87 , mZIndex( rh.mZIndex )
88 , mObstacle( rh.mObstacle )
89 , mDistance( rh.mDistance )
90 , mRenderer( rh.mRenderer ? rh.mRenderer->clone() : nullptr )
91 , mShowAll( rh.mShowAll )
92 , mDataDefinedProperties( rh.mDataDefinedProperties )
95 initPropertyDefinitions();
99 : mCt( std::move( rh.mCt ) )
100 , mPlacement( rh.mPlacement )
101 , mPlacementFlags( rh.mPlacementFlags )
102 , mPriority( rh.mPriority )
103 , mZIndex( rh.mZIndex )
104 , mObstacle( rh.mObstacle )
105 , mDistance( rh.mDistance )
106 , mRenderer( std::move( rh.mRenderer ) )
107 , mShowAll( rh.mShowAll )
108 , mDataDefinedProperties( std::move( rh.mDataDefinedProperties ) )
118 mPlacement = rh.mPlacement;
119 mPlacementFlags = rh.mPlacementFlags;
120 mPriority = rh.mPriority;
121 mZIndex = rh.mZIndex;
122 mObstacle = rh.mObstacle;
123 mDistance = rh.mDistance;
124 mRenderer.reset( rh.mRenderer ? rh.mRenderer->clone() :
nullptr );
126 mShowAll = rh.mShowAll;
127 mDataDefinedProperties = rh.mDataDefinedProperties;
137 mPlacement = rh.mPlacement;
138 mPlacementFlags = rh.mPlacementFlags;
139 mPriority = rh.mPriority;
140 mZIndex = rh.mZIndex;
141 mObstacle = rh.mObstacle;
142 mDistance = rh.mDistance;
143 mRenderer = std::move( rh.mRenderer );
144 mCt = std::move( rh.mCt );
145 mShowAll = rh.mShowAll;
146 mDataDefinedProperties = std::move( rh.mDataDefinedProperties );
157 if ( diagramRenderer == mRenderer.get() )
160 mRenderer.reset( diagramRenderer );
171 const QDomNodeList propertyElems = elem.elementsByTagName( u
"properties"_s );
172 if ( !propertyElems.isEmpty() )
174 ( void )mDataDefinedProperties.readXml( propertyElems.at( 0 ).toElement(), sPropertyDefinitions );
178 mDataDefinedProperties.clear();
181 mPlacement =
static_cast< Placement >( elem.attribute( u
"placement"_s ).toInt() );
182 mPlacementFlags =
static_cast< LinePlacementFlag >( elem.attribute( u
"linePlacementFlags"_s ).toInt() );
183 mPriority = elem.attribute( u
"priority"_s ).toInt();
184 mZIndex = elem.attribute( u
"zIndex"_s ).toDouble();
185 mObstacle = elem.attribute( u
"obstacle"_s ).toInt();
186 mDistance = elem.attribute( u
"dist"_s ).toDouble();
187 mShowAll = ( elem.attribute( u
"showAll"_s, u
"0"_s ) !=
"0"_L1 );
192 QDomElement diagramLayerElem = doc.createElement( u
"DiagramLayerSettings"_s );
193 QDomElement propertiesElem = doc.createElement( u
"properties"_s );
194 ( void )mDataDefinedProperties.writeXml( propertiesElem, sPropertyDefinitions );
195 diagramLayerElem.appendChild( propertiesElem );
196 diagramLayerElem.setAttribute( u
"placement"_s, mPlacement );
197 diagramLayerElem.setAttribute( u
"linePlacementFlags"_s, mPlacementFlags );
198 diagramLayerElem.setAttribute( u
"priority"_s, mPriority );
199 diagramLayerElem.setAttribute( u
"zIndex"_s, mZIndex );
200 diagramLayerElem.setAttribute( u
"obstacle"_s, mObstacle );
201 diagramLayerElem.setAttribute( u
"dist"_s, QString::number( mDistance ) );
202 diagramLayerElem.setAttribute( u
"showAll"_s, mShowAll );
203 layerElem.appendChild( diagramLayerElem );
208 return mDataDefinedProperties.prepare( context );
213 QSet< QString > referenced;
215 referenced = mRenderer->referencedFields( context );
218 referenced.unite( mDataDefinedProperties.referencedFields( context ) );
225 enabled = ( elem.attribute( u
"enabled"_s, u
"1"_s ) !=
"0"_L1 );
228 font.fromString( elem.attribute( u
"font"_s ) );
230 backgroundColor.setNamedColor( elem.attribute( u
"backgroundColor"_s ) );
231 backgroundColor.setAlpha( elem.attribute( u
"backgroundAlpha"_s ).toInt() );
232 size.setWidth( elem.attribute( u
"width"_s ).toDouble() );
233 size.setHeight( elem.attribute( u
"height"_s ).toDouble() );
234 if ( elem.hasAttribute( u
"transparency"_s ) )
236 opacity = 1 - elem.attribute( u
"transparency"_s, u
"0"_s ).toInt() / 255.0;
240 opacity = elem.attribute( u
"opacity"_s, u
"1.00"_s ).toDouble();
243 penColor.setNamedColor( elem.attribute( u
"penColor"_s ) );
244 const int penAlpha = elem.attribute( u
"penAlpha"_s, u
"255"_s ).toInt();
246 penWidth = elem.attribute( u
"penWidth"_s ).toDouble();
248 mDirection =
static_cast< Direction >( elem.attribute( u
"direction"_s, u
"1"_s ).toInt() );
250 maximumScale = elem.attribute( u
"minScaleDenominator"_s, u
"-1"_s ).toDouble();
251 minimumScale = elem.attribute( u
"maxScaleDenominator"_s, u
"-1"_s ).toDouble();
252 if ( elem.hasAttribute( u
"scaleBasedVisibility"_s ) )
262 if ( elem.attribute( u
"sizeType"_s ) ==
"MapUnits"_L1 )
277 mSpacing = elem.attribute( u
"spacing"_s ).toDouble();
281 mStackedDiagramSpacing = elem.attribute( u
"stackedDiagramSpacing"_s ).toDouble();
286 if ( elem.attribute( u
"labelPlacementMethod"_s ) ==
"Height"_L1 )
296 if ( elem.attribute( u
"diagramOrientation"_s ) ==
"Left"_L1 )
300 else if ( elem.attribute( u
"diagramOrientation"_s ) ==
"Right"_L1 )
304 else if ( elem.attribute( u
"diagramOrientation"_s ) ==
"Down"_L1 )
314 if ( elem.attribute( u
"stackedDiagramMode"_s ) ==
"Horizontal"_L1 )
318 else if ( elem.attribute( u
"stackedDiagramMode"_s ) ==
"Vertical"_L1 )
324 if ( elem.attribute( u
"scaleDependency"_s ) ==
"Diameter"_L1 )
333 barWidth = elem.attribute( u
"barWidth"_s ).toDouble();
335 if ( elem.hasAttribute( u
"angleOffset"_s ) )
336 rotationOffset = std::fmod( 360.0 - elem.attribute( u
"angleOffset"_s ).toInt() / 16.0, 360.0 );
338 rotationOffset = elem.attribute( u
"rotationOffset"_s ).toDouble();
340 minimumSize = elem.attribute( u
"minimumSize"_s ).toDouble();
342 const QDomNodeList axisSymbolNodes = elem.elementsByTagName( u
"axisSymbol"_s );
343 if ( axisSymbolNodes.count() > 0 )
345 const QDomElement axisSymbolElem = axisSymbolNodes.at( 0 ).toElement().firstChildElement();
350 mAxisLineSymbol = std::make_unique< QgsLineSymbol >();
353 mShowAxis = elem.attribute( u
"showAxis"_s, u
"0"_s ).toInt();
357 const QDomNodeList attributes = elem.elementsByTagName( u
"attribute"_s );
360 if ( attributes.length() > 0 )
362 for (
int i = 0; i < attributes.size(); i++ )
364 const QDomElement attrElem = attributes.at( i ).toElement();
365 QColor newColor( attrElem.attribute( u
"color"_s ) );
366 newColor.setAlphaF( attrElem.attribute( u
"colorOpacity"_s, u
"1.0"_s ).toDouble() );
380 const QStringList colorList = elem.attribute( u
"colors"_s ).split(
'/' );
381 QStringList::const_iterator colorIt = colorList.constBegin();
382 for ( ; colorIt != colorList.constEnd(); ++colorIt )
384 QColor newColor( *colorIt );
390 const QStringList catList = elem.attribute( u
"categories"_s ).split(
'/' );
391 QStringList::const_iterator catIt = catList.constBegin();
392 for ( ; catIt != catList.constEnd(); ++catIt )
399 const QDomElement effectElem = elem.firstChildElement( u
"effect"_s );
400 if ( !effectElem.isNull() )
408 QDomElement categoryElem = doc.createElement( u
"DiagramCategory"_s );
409 categoryElem.setAttribute( u
"enabled"_s,
enabled );
411 categoryElem.setAttribute( u
"backgroundColor"_s,
backgroundColor.name() );
412 categoryElem.setAttribute( u
"backgroundAlpha"_s,
backgroundColor.alpha() );
413 categoryElem.setAttribute( u
"width"_s, QString::number(
size.width() ) );
414 categoryElem.setAttribute( u
"height"_s, QString::number(
size.height() ) );
415 categoryElem.setAttribute( u
"penColor"_s,
penColor.name() );
416 categoryElem.setAttribute( u
"penAlpha"_s,
penColor.alpha() );
417 categoryElem.setAttribute( u
"penWidth"_s, QString::number(
penWidth ) );
419 categoryElem.setAttribute( u
"minScaleDenominator"_s, QString::number(
maximumScale ) );
420 categoryElem.setAttribute( u
"maxScaleDenominator"_s, QString::number(
minimumScale ) );
421 categoryElem.setAttribute( u
"opacity"_s, QString::number(
opacity ) );
422 categoryElem.setAttribute( u
"spacing"_s, QString::number( mSpacing ) );
425 categoryElem.setAttribute( u
"stackedDiagramSpacing"_s, QString::number( mStackedDiagramSpacing ) );
426 categoryElem.setAttribute( u
"stackedDiagramSpacingUnit"_s,
QgsUnitTypes::encodeUnit( mStackedDiagramSpacingUnit ) );
428 categoryElem.setAttribute( u
"direction"_s, QString::number( mDirection ) );
441 categoryElem.setAttribute( u
"labelPlacementMethod"_s, u
"Height"_s );
445 categoryElem.setAttribute( u
"labelPlacementMethod"_s, u
"XHeight"_s );
450 categoryElem.setAttribute( u
"scaleDependency"_s, u
"Area"_s );
454 categoryElem.setAttribute( u
"scaleDependency"_s, u
"Diameter"_s );
461 categoryElem.setAttribute( u
"diagramOrientation"_s, u
"Left"_s );
465 categoryElem.setAttribute( u
"diagramOrientation"_s, u
"Right"_s );
469 categoryElem.setAttribute( u
"diagramOrientation"_s, u
"Down"_s );
473 categoryElem.setAttribute( u
"diagramOrientation"_s, u
"Up"_s );
481 categoryElem.setAttribute( u
"stackedDiagramMode"_s, u
"Horizontal"_s );
485 categoryElem.setAttribute( u
"stackedDiagramMode"_s, u
"Vertical"_s );
489 categoryElem.setAttribute( u
"barWidth"_s, QString::number(
barWidth ) );
490 categoryElem.setAttribute( u
"minimumSize"_s, QString::number(
minimumSize ) );
491 categoryElem.setAttribute( u
"rotationOffset"_s, QString::number(
rotationOffset ) );
494 for (
int i = 0; i < nCats; ++i )
496 QDomElement attributeElem = doc.createElement( u
"attribute"_s );
499 attributeElem.setAttribute( u
"color"_s,
categoryColors.at( i ).name() );
500 attributeElem.setAttribute( u
"colorOpacity"_s, QString::number(
categoryColors.at( i ).alphaF() ) );
502 categoryElem.appendChild( attributeElem );
505 categoryElem.setAttribute( u
"showAxis"_s, mShowAxis ? u
"1"_s : u
"0"_s );
506 QDomElement axisSymbolElem = doc.createElement( u
"axisSymbol"_s );
508 axisSymbolElem.appendChild( symbolElem );
509 categoryElem.appendChild( axisSymbolElem );
512 mPaintEffect->saveProperties( doc, categoryElem );
514 rendererElem.appendChild( categoryElem );
533 if ( &other ==
this )
560 c.expressionContext().setOriginalValueVariable( s.
penWidth );
567 std::unique_ptr< QgsEffectPainter > effectPainter;
568 if ( effect && effect->
enabled() )
570 effectPainter = std::make_unique< QgsEffectPainter >(
c, effect );
573 mDiagram->renderDiagram( feature,
c, s, pos );
587 const double rendererScale =
c.rendererScale();
605 if ( size.isValid() )
608 size.rheight() *= width / size.width();
609 size.setWidth( width );
616 QSet< QString > referenced;
622 for (
const QString &att : constDiagramAttributes )
626 for (
const QString &field : constReferencedColumns )
636 if ( !size.isValid() )
642 size.rwidth() *= pixelToMap;
643 size.rheight() *= pixelToMap;
650 QPaintDevice *device = painter->device();
653 return device->logicalDpiX();
663 const QString diagramType = elem.attribute( u
"diagramType"_s );
666 mDiagram = std::make_unique<QgsPieDiagram>( );
670 mDiagram = std::make_unique<QgsTextDiagram>( );
674 mDiagram = std::make_unique<QgsHistogramDiagram>( );
678 mDiagram = std::make_unique<QgsStackedBarDiagram>( );
682 mDiagram = std::make_unique<QgsStackedDiagram>( );
687 mDiagram = std::make_unique<QgsHistogramDiagram>( );
699 rendererElem.setAttribute( u
"diagramType"_s,
mDiagram->diagramName() );
725 QList<QgsDiagramSettings> settingsList;
726 settingsList.push_back( mSettings );
732 const QDomElement categoryElem = elem.firstChildElement( u
"DiagramCategory"_s );
733 if ( categoryElem.isNull() )
738 mSettings.readXml( categoryElem, context );
744 QDomElement rendererElem = doc.createElement( u
"SingleCategoryDiagramRenderer"_s );
745 mSettings.writeXml( rendererElem, doc, context );
747 layerElem.appendChild( rendererElem );
754 mInterpolationSettings.classificationAttributeIsExpression =
false;
759 , mSettings( other.mSettings )
760 , mInterpolationSettings( other.mInterpolationSettings )
761 , mDataDefinedSizeLegend( other.mDataDefinedSizeLegend ? new
QgsDataDefinedSizeLegend( *other.mDataDefinedSizeLegend ) : nullptr )
772 if ( &other ==
this )
776 mSettings = other.mSettings;
777 mInterpolationSettings = other.mInterpolationSettings;
778 mDataDefinedSizeLegend = std::make_unique<QgsDataDefinedSizeLegend>( *other.mDataDefinedSizeLegend );
790 QList<QgsDiagramSettings> settingsList;
791 settingsList.push_back( mSettings );
804 return mSettings.categoryAttributes;
810 if ( mInterpolationSettings.classificationAttributeIsExpression )
812 QgsExpression *expression =
mDiagram->getExpression( mInterpolationSettings.classificationAttributeExpression, context );
814 for (
const QString &field : constReferencedColumns )
821 referenced << mInterpolationSettings.classificationField;
828 return mDiagram->diagramSize( feature,
c, mSettings, mInterpolationSettings );
833 mInterpolationSettings.lowerValue = elem.attribute( u
"lowerValue"_s ).toDouble();
834 mInterpolationSettings.upperValue = elem.attribute( u
"upperValue"_s ).toDouble();
835 mInterpolationSettings.lowerSize.setWidth( elem.attribute( u
"lowerWidth"_s ).toDouble() );
836 mInterpolationSettings.lowerSize.setHeight( elem.attribute( u
"lowerHeight"_s ).toDouble() );
837 mInterpolationSettings.upperSize.setWidth( elem.attribute( u
"upperWidth"_s ).toDouble() );
838 mInterpolationSettings.upperSize.setHeight( elem.attribute( u
"upperHeight"_s ).toDouble() );
839 mInterpolationSettings.classificationAttributeIsExpression = elem.hasAttribute( u
"classificationAttributeExpression"_s );
840 if ( mInterpolationSettings.classificationAttributeIsExpression )
842 mInterpolationSettings.classificationAttributeExpression = elem.attribute( u
"classificationAttributeExpression"_s );
846 mInterpolationSettings.classificationField = elem.attribute( u
"classificationField"_s );
848 const QDomElement settingsElem = elem.firstChildElement( u
"DiagramCategory"_s );
849 if ( !settingsElem.isNull() )
851 mSettings.readXml( settingsElem );
854 mDataDefinedSizeLegend.reset( );
856 const QDomElement ddsLegendSizeElem = elem.firstChildElement( u
"data-defined-size-legend"_s );
857 if ( !ddsLegendSizeElem.isNull() )
864 if ( elem.attribute( u
"sizeLegend"_s, u
"0"_s ) !=
"0"_L1 )
866 mDataDefinedSizeLegend = std::make_unique<QgsDataDefinedSizeLegend>();
867 const QDomElement sizeLegendSymbolElem = elem.firstChildElement( u
"symbol"_s );
868 if ( !sizeLegendSymbolElem.isNull() && sizeLegendSymbolElem.attribute( u
"name"_s ) ==
"sizeSymbol"_L1 )
875 mDataDefinedSizeLegend =
nullptr;
884 QDomElement rendererElem = doc.createElement( u
"LinearlyInterpolatedDiagramRenderer"_s );
885 rendererElem.setAttribute( u
"lowerValue"_s, QString::number( mInterpolationSettings.lowerValue ) );
886 rendererElem.setAttribute( u
"upperValue"_s, QString::number( mInterpolationSettings.upperValue ) );
887 rendererElem.setAttribute( u
"lowerWidth"_s, QString::number( mInterpolationSettings.lowerSize.width() ) );
888 rendererElem.setAttribute( u
"lowerHeight"_s, QString::number( mInterpolationSettings.lowerSize.height() ) );
889 rendererElem.setAttribute( u
"upperWidth"_s, QString::number( mInterpolationSettings.upperSize.width() ) );
890 rendererElem.setAttribute( u
"upperHeight"_s, QString::number( mInterpolationSettings.upperSize.height() ) );
891 if ( mInterpolationSettings.classificationAttributeIsExpression )
893 rendererElem.setAttribute( u
"classificationAttributeExpression"_s, mInterpolationSettings.classificationAttributeExpression );
897 rendererElem.setAttribute( u
"classificationField"_s, mInterpolationSettings.classificationField );
899 mSettings.writeXml( rendererElem, doc );
901 if ( mDataDefinedSizeLegend )
903 QDomElement ddsLegendElem = doc.createElement( u
"data-defined-size-legend"_s );
904 mDataDefinedSizeLegend->writeXml( ddsLegendElem, context );
905 rendererElem.appendChild( ddsLegendElem );
909 layerElem.appendChild( rendererElem );
916 , mSettings( other.mSettings )
917 , mDiagramRenderers()
922 mDiagramRenderers << renderer->clone();
928 if ( &other ==
this )
931 mSettings = other.mSettings;
932 qDeleteAll( mDiagramRenderers );
933 mDiagramRenderers.clear();
937 mDiagramRenderers <<
renderer->clone();
945 qDeleteAll( mDiagramRenderers );
955 QSizeF stackedSize( 0, 0 );
956 int enabledDiagramCount = 0;
963 QSizeF size = subRenderer->sizeMapUnits( feature,
c );
965 if ( size.isValid() )
967 enabledDiagramCount++;
968 switch ( mSettings.stackedDiagramMode )
971 stackedSize.setWidth( stackedSize.width() + size.width() );
972 stackedSize.setHeight( std::max( stackedSize.height(), size.height() ) );
976 stackedSize.setWidth( std::max( stackedSize.width(), size.width() ) );
977 stackedSize.setHeight( stackedSize.height() + size.height() );
983 if ( stackedSize.isValid() )
985 const double spacing =
c.convertToMapUnits( mSettings.stackedDiagramSpacing(), mSettings.stackedDiagramSpacingUnit(), mSettings.stackedDiagramSpacingMapUnitScale() );
987 switch ( mSettings.stackedDiagramMode )
990 stackedSize.scale( stackedSize.width() + spacing * ( enabledDiagramCount - 1 ), stackedSize.height(), Qt::IgnoreAspectRatio );
994 stackedSize.scale( stackedSize.width(), stackedSize.height() + spacing * ( enabledDiagramCount - 1 ), Qt::IgnoreAspectRatio );
1008 QPointF newPos = pos;
1011 const QList< QgsDiagramRenderer * > stackedRenderers =
renderers(
true );
1018 stackedRenderer->renderDiagram( feature,
c, newPos, properties );
1023 if ( !stackedRenderer->diagramSettings( feature,
c, s ) )
1036 const double rendererScale =
c.rendererScale();
1059 c.expressionContext().setOriginalValueVariable( s.
penWidth );
1066 std::unique_ptr< QgsEffectPainter > effectPainter;
1067 if ( effect && effect->
enabled() )
1069 effectPainter = std::make_unique< QgsEffectPainter >(
c, effect );
1072 stackedRenderer->diagram()->renderDiagram( feature,
c, s, newPos );
1090 return QSizeF( 0, 0 );
1095 QList<QgsDiagramSettings> settingsList;
1096 settingsList.push_back( mSettings );
1097 return settingsList;
1102 return mSettings.categoryAttributes;
1107 QList< QgsLayerTreeModelLegendNode * > nodes;
1110 nodes <<
renderer->legendItems( nodeLayer );
1118 QList< QgsDiagramRenderer * >
renderers = mDiagramRenderers;
1133 mDiagramRenderers.append(
renderer );
1139 return mDiagramRenderers.value( index );
1144 return mDiagramRenderers.size();
1149 const QDomElement categoryElem = elem.firstChildElement( u
"DiagramCategory"_s );
1150 if ( categoryElem.isNull() )
1155 mSettings.
readXml( categoryElem, context );
1162 qDeleteAll( mDiagramRenderers );
1163 mDiagramRenderers.clear();
1165 const QDomElement subRenderersElem = elem.firstChildElement( u
"DiagramRenderers"_s );
1167 if ( !subRenderersElem.isNull() )
1169 const QDomNodeList childRendererList = subRenderersElem.childNodes();
1171 for (
int i = 0; i < childRendererList.size(); i++ )
1173 const QDomElement subRendererElem = childRendererList.at( i ).toElement();
1175 if ( subRendererElem.nodeName() ==
"SingleCategoryDiagramRenderer"_L1 )
1177 auto singleCatDiagramRenderer = std::make_unique< QgsSingleCategoryDiagramRenderer >();
1178 singleCatDiagramRenderer->readXml( subRendererElem, context );
1179 addRenderer( singleCatDiagramRenderer.release() );
1181 else if ( subRendererElem.nodeName() ==
"LinearlyInterpolatedDiagramRenderer"_L1 )
1183 auto linearDiagramRenderer = std::make_unique< QgsLinearlyInterpolatedDiagramRenderer >();
1184 linearDiagramRenderer->readXml( subRendererElem, context );
1187 else if ( subRendererElem.nodeName() ==
"StackedDiagramRenderer"_L1 )
1189 auto stackedDiagramRenderer = std::make_unique< QgsStackedDiagramRenderer >();
1190 stackedDiagramRenderer->readXml( subRendererElem, context );
1199 QDomElement rendererElem = doc.createElement( u
"StackedDiagramRenderer"_s );
1200 mSettings.writeXml( rendererElem, doc, context );
1201 _writeXml( rendererElem, doc, context );
1203 layerElem.appendChild( rendererElem );
1208 QDomElement renderersElem = doc.createElement( u
"DiagramRenderers"_s );
1211 for (
int i = 0; i < mDiagramRenderers.count(); i++ )
1213 mDiagramRenderers.at( i )->writeXml( renderersElem, doc, context );
1215 rendererElem.appendChild( renderersElem );
1220 QList< QgsLayerTreeModelLegendNode * > list;
1224 QPixmap pix( 16, 16 );
1233 return mAxisLineSymbol.get();
1254 return mPaintEffect.get();
1259 if ( effect != mPaintEffect.get() )
1260 mPaintEffect.reset( effect );
1295 , mSpacing( other.mSpacing )
1296 , mSpacingUnit( other.mSpacingUnit )
1297 , mSpacingMapUnitScale( other.mSpacingMapUnitScale )
1298 , mStackedDiagramSpacing( other.mStackedDiagramSpacing )
1299 , mStackedDiagramSpacingUnit( other.mStackedDiagramSpacingUnit )
1300 , mStackedDiagramSpacingMapUnitScale( other.mStackedDiagramSpacingMapUnitScale )
1301 , mDirection( other.mDirection )
1302 , mShowAxis( other.mShowAxis )
1303 , mAxisLineSymbol( other.mAxisLineSymbol ? other.mAxisLineSymbol->clone() : nullptr )
1304 , mPaintEffect( other.mPaintEffect ? other.mPaintEffect->clone() : nullptr )
1311 if ( &other ==
this )
1338 mSpacing = other.mSpacing;
1339 mSpacingUnit = other.mSpacingUnit;
1340 mSpacingMapUnitScale = other.mSpacingMapUnitScale;
1341 mStackedDiagramSpacing = other.mStackedDiagramSpacing;
1342 mStackedDiagramSpacingUnit = other.mStackedDiagramSpacingUnit;
1343 mStackedDiagramSpacingMapUnitScale = other.mStackedDiagramSpacingMapUnitScale;
1344 mDirection = other.mDirection;
1345 mAxisLineSymbol.reset( other.mAxisLineSymbol ? other.mAxisLineSymbol->clone() :
nullptr );
1346 mShowAxis = other.mShowAxis;
1347 mPaintEffect.reset( other.mPaintEffect ? other.mPaintEffect->clone() :
nullptr );
1363 return QList< QgsLayerTreeModelLegendNode * >();
1368 QList< QgsLayerTreeModelLegendNode * > nodes;
1370 nodes = mSettings.legendItems( nodeLayer );
1377 QList< QgsLayerTreeModelLegendNode * > nodes;
1378 if ( !mSettings.enabled )
1384 nodes = mSettings.legendItems( nodeLayer );
1386 if ( mDataDefinedSizeLegend &&
mDiagram )
1396 QList<QgsDataDefinedSizeLegend::SizeClass> sizeClasses;
1397 if ( ddSizeLegend.
classes().isEmpty() )
1401 for (
const double v : prettyBreaks )
1403 const double size =
mDiagram->legendSize( v, mSettings, mInterpolationSettings );
1410 const auto constClasses = ddSizeLegend.
classes();
1413 const double size =
mDiagram->legendSize( sc.size, mSettings, mInterpolationSettings );
1422 if (
auto *lDataDefinedSizeLegendSettings = si.dataDefinedSizeLegendSettings() )
1434 mDataDefinedSizeLegend.reset( settings );
1440 return mDataDefinedSizeLegend.get();
QColor valueAsColor(int key, const QgsExpressionContext &context, const QColor &defaultColor=QColor(), bool *ok=nullptr) const
Calculates the current value of the property with the specified key and interprets it as a color.
double valueAsDouble(int key, const QgsExpressionContext &context, double defaultValue=0.0, bool *ok=nullptr) const
Calculates the current value of the property with the specified key and interprets it as a double.
static QgsPaintEffectRegistry * paintEffectRegistry()
Returns the application's paint effect registry, used for managing paint effects.
static QString colorToString(const QColor &color)
Encodes a color into a string value.
A legend node with a marker symbol.
Object that keeps configuration of appearance of marker symbol's data-defined size in legend.
QList< QgsDataDefinedSizeLegend::SizeClass > classes() const
Returns list of classes: each class is a pair of symbol size (in units used by the symbol) and label.
void setSymbol(QgsMarkerSymbol *symbol SIP_TRANSFER)
Sets marker symbol that will be used to draw markers in legend.
void setClasses(const QList< QgsDataDefinedSizeLegend::SizeClass > &classes)
Sets list of classes: each class is a pair of symbol size (in units used by the symbol) and label.
static QgsDataDefinedSizeLegend * readXml(const QDomElement &elem, const QgsReadWriteContext &context) SIP_FACTORY
Creates instance from given element and returns it (caller takes ownership). Returns nullptr on error...
QgsLegendSymbolList legendSymbolList() const
Generates legend symbol items according to the configuration.
LinePlacementFlag
Line placement flags for controlling line based placements.
QgsDiagramLayerSettings & operator=(const QgsDiagramLayerSettings &rh)
void setRenderer(QgsDiagramRenderer *diagramRenderer)
Sets the diagram renderer associated with the layer.
~QgsDiagramLayerSettings()
@ PositionX
X-coordinate data defined diagram position.
@ Distance
Distance to diagram from feature.
@ PositionY
Y-coordinate data defined diagram position.
@ Show
Whether to show the diagram.
@ Priority
Diagram priority (between 0 and 10).
@ ZIndex
Z-index for diagram ordering.
@ StrokeColor
Stroke color.
@ BackgroundColor
Diagram background color.
@ StartAngle
Angle offset for pie diagram.
@ IsObstacle
Whether diagram features act as obstacles for other diagrams/labels.
@ StrokeWidth
Stroke width.
@ AlwaysShow
Whether the diagram should always be shown, even if it overlaps other diagrams/labels.
void readXml(const QDomElement &elem)
Reads the diagram settings from a DOM element.
static const QgsPropertiesDefinition & propertyDefinitions()
Returns the diagram property definitions.
QgsDiagramLayerSettings()
QSet< QString > referencedFields(const QgsExpressionContext &context=QgsExpressionContext()) const
Returns the set of any fields referenced by the layer's diagrams.
void writeXml(QDomElement &layerElem, QDomDocument &doc) const
Writes the diagram settings to a DOM element.
bool prepare(const QgsExpressionContext &context=QgsExpressionContext()) const
Prepares the diagrams for a specified expression context.
void setCoordinateTransform(const QgsCoordinateTransform &transform)
Sets the coordinate transform associated with the layer.
Evaluates and returns the diagram settings relating to a diagram for a specific feature.
virtual QList< QgsLayerTreeModelLegendNode * > legendItems(QgsLayerTreeLayer *nodeLayer) const
Returns list of legend nodes for the diagram.
virtual QSizeF diagramSize(const QgsFeature &feature, const QgsRenderContext &c) const =0
Returns size of the diagram (in painter units) or an invalid size in case of error.
void _writeXml(QDomElement &rendererElem, QDomDocument &doc, const QgsReadWriteContext &context) const
Writes internal QgsDiagramRenderer diagram state to a DOM element.
virtual QSet< QString > referencedFields(const QgsExpressionContext &context=QgsExpressionContext()) const
Returns the set of any fields required for diagram rendering.
virtual void renderDiagram(const QgsFeature &feature, QgsRenderContext &c, QPointF pos, const QgsPropertyCollection &properties=QgsPropertyCollection()) const
Renders the diagram for a specified feature at a specific position in the passed render context.
void _readXml(const QDomElement &elem, const QgsReadWriteContext &context)
Reads internal QgsDiagramRenderer state from a DOM element.
QgsDiagramRenderer & operator=(const QgsDiagramRenderer &other)
virtual QSizeF sizeMapUnits(const QgsFeature &feature, const QgsRenderContext &c) const
Returns size of the diagram for a feature in map units. Returns an invalid QSizeF in case of error.
virtual QList< QString > diagramAttributes() const =0
Returns attribute indices needed for diagram rendering.
std::unique_ptr< QgsDiagram > mDiagram
Reference to the object that does the real diagram rendering.
void convertSizeToMapUnits(QSizeF &size, const QgsRenderContext &context) const
Converts size from mm to map units.
virtual QList< QgsDiagramSettings > diagramSettings() const =0
Returns list with all diagram settings in the renderer.
bool mShowAttributeLegend
Whether to show an attribute legend for the diagrams.
QgsDiagramRenderer()=default
virtual void readXml(const QDomElement &elem, const QgsReadWriteContext &context)=0
Reads diagram state from a DOM element.
void setDiagram(QgsDiagram *d)
virtual QgsDiagramRenderer * clone() const =0
Returns new instance that is equivalent to this one.
static int dpiPaintDevice(const QPainter *)
Returns the paint device dpi (or -1 in case of error.
Stores the settings for rendering a single diagram.
Direction direction() const
Returns the chart's angular direction.
StackedDiagramMode stackedDiagramMode
void setDirection(Direction direction)
Sets the chart's angular direction.
bool showAxis() const
Returns true if the diagram axis should be shown.
LabelPlacementMethod labelPlacementMethod
void readXml(const QDomElement &elem, const QgsReadWriteContext &context=QgsReadWriteContext())
Reads diagram settings from XML.
double opacity
Opacity, from 0 (transparent) to 1.0 (opaque).
QgsDiagramSettings & operator=(const QgsDiagramSettings &other)
QgsLineSymbol * axisLineSymbol() const
Returns the line symbol to use for rendering axis in diagrams.
Qgis::RenderUnit sizeType
Diagram size unit.
QList< QString > categoryAttributes
QList< QString > categoryLabels
DiagramOrientation diagramOrientation
QList< QgsLayerTreeModelLegendNode * > legendItems(QgsLayerTreeLayer *nodeLayer) const
Returns list of legend nodes for the diagram.
QgsMapUnitScale lineSizeScale
Line unit scale.
void writeXml(QDomElement &rendererElem, QDomDocument &doc, const QgsReadWriteContext &context=QgsReadWriteContext()) const
Writes diagram settings to XML.
QList< QColor > categoryColors
double rotationOffset
Rotation offset, in degrees clockwise from horizontal.
QgsMapUnitScale sizeScale
Diagram size unit scale.
double minimumScale
The minimum map scale (i.e.
bool scaleBasedVisibility
double maximumScale
The maximum map scale (i.e.
void setAxisLineSymbol(QgsLineSymbol *symbol)
Sets the line symbol to use for rendering axis in diagrams.
Qgis::RenderUnit lineSizeUnit
Line unit index.
double minimumSize
Scale diagrams smaller than mMinimumSize to mMinimumSize.
Direction
Angular directions.
void setShowAxis(bool showAxis)
Sets whether the diagram axis should be shown.
void setPaintEffect(QgsPaintEffect *effect)
Sets the paint effect to use while rendering diagrams.
QgsPaintEffect * paintEffect() const
Returns the paint effect to use while rendering diagrams.
Base class for all diagram types.
Expression contexts are used to encapsulate the parameters around which a QgsExpression should be eva...
Handles parsing and evaluation of expressions (formerly called "search strings").
QSet< QString > referencedColumns() const
Gets list of columns referenced by the expression.
The feature class encapsulates a single feature including its unique ID, geometry and a list of field...
static bool setFromXmlChildNode(QFont &font, const QDomElement &element, const QString &childNode)
Sets the properties of a font to match the properties stored in an XML child node.
static QDomElement toXmlElement(const QFont &font, QDomDocument &document, const QString &elementName)
Returns a DOM element containing the properties of the font.
static const QString DIAGRAM_NAME_HISTOGRAM
Layer tree node points to a map layer.
Stores information about one class/rule of a vector layer renderer in a unified way that can be used ...
A line symbol type, for rendering LineString and MultiLineString geometries.
QgsLinearlyInterpolatedDiagramRenderer()
void setDataDefinedSizeLegend(QgsDataDefinedSizeLegend *settings)
Configures appearance of legend.
QSizeF diagramSize(const QgsFeature &, const QgsRenderContext &c) const override
Returns size of the diagram (in painter units) or an invalid size in case of error.
QList< QString > diagramAttributes() const override
Returns attribute indices needed for diagram rendering.
QSet< QString > referencedFields(const QgsExpressionContext &context=QgsExpressionContext()) const override
Returns the set of any fields required for diagram rendering.
QList< QgsDiagramSettings > diagramSettings() const override
Returns list with all diagram settings in the renderer.
void writeXml(QDomElement &layerElem, QDomDocument &doc, const QgsReadWriteContext &context) const override
Writes diagram state to a DOM element.
QgsLinearlyInterpolatedDiagramRenderer * clone() const override
Returns new instance that is equivalent to this one.
QList< QgsLayerTreeModelLegendNode * > legendItems(QgsLayerTreeLayer *nodeLayer) const override
Returns list of legend nodes for the diagram.
void readXml(const QDomElement &elem, const QgsReadWriteContext &context) override
Reads diagram state from a DOM element.
QgsDataDefinedSizeLegend * dataDefinedSizeLegend() const
Returns configuration of appearance of legend.
~QgsLinearlyInterpolatedDiagramRenderer() override
QgsLinearlyInterpolatedDiagramRenderer & operator=(const QgsLinearlyInterpolatedDiagramRenderer &other)
static const QString DIAGRAM_RENDERER_NAME_LINEARLY_INTERPOLATED
double mapUnitsPerPixel() const
Returns the current map units per pixel.
A marker symbol type, for rendering Point and MultiPoint geometries.
static std::unique_ptr< QgsMarkerSymbol > createSimple(const QVariantMap &properties)
Create a marker symbol with one symbol layer: SimpleMarker with specified properties.
QgsMarkerSymbol * clone() const override
Returns a deep copy of this symbol.
void setSizeMapUnitScale(const QgsMapUnitScale &scale) const
Sets the size map unit scale for the whole symbol (including all symbol layers).
void setSizeUnit(Qgis::RenderUnit unit) const
Sets the size units for the whole symbol (including all symbol layers).
static QgsPaintEffect * defaultStack()
Returns a new effect stack consisting of a sensible selection of default effects.
static bool isDefaultStack(QgsPaintEffect *effect)
Tests whether a paint effect matches the default effects stack.
Base class for visual effects which can be applied to QPicture drawings.
bool enabled() const
Returns whether the effect is enabled.
static const QString DIAGRAM_NAME_PIE
A grouped map of multiple QgsProperty objects, each referenced by an integer key value.
bool hasActiveProperties() const final
Returns true if the collection has any active properties, or false if all properties within the colle...
@ Double
Double value (including negative values).
@ StrokeWidth
Line stroke width.
@ Rotation
Rotation (value between 0-360 degrees).
@ ColorWithAlpha
Color with alpha channel.
@ DoublePositive
Positive double value (including 0).
A container for the context for various read/write operations on objects.
Contains information about the context of a rendering operation.
double scaleFactor() const
Returns the scaling factor for the render to convert painter units to physical sizes.
const QgsMapToPixel & mapToPixel() const
Returns the context's map to pixel transform, which transforms between map coordinates and device coo...
static bool equalToOrGreaterThanMinimumScale(const double scale, const double minScale)
Returns whether the scale is equal to or greater than the minScale, taking non-round numbers into acc...
static bool lessThanMaximumScale(const double scale, const double maxScale)
Returns whether the scale is less than the maxScale, taking non-round numbers into account.
Implementation of legend node interface for displaying arbitrary labels with icons.
QSizeF diagramSize(const QgsFeature &, const QgsRenderContext &c) const override
Returns size of the diagram (in painter units) or an invalid size in case of error.
void writeXml(QDomElement &layerElem, QDomDocument &doc, const QgsReadWriteContext &context) const override
Writes diagram state to a DOM element.
QgsSingleCategoryDiagramRenderer * clone() const override
Returns new instance that is equivalent to this one.
QgsSingleCategoryDiagramRenderer()=default
QList< QgsLayerTreeModelLegendNode * > legendItems(QgsLayerTreeLayer *nodeLayer) const override
Returns list of legend nodes for the diagram.
void readXml(const QDomElement &elem, const QgsReadWriteContext &context) override
Reads diagram state from a DOM element.
QList< QgsDiagramSettings > diagramSettings() const override
Returns list with all diagram settings in the renderer.
static const QString DIAGRAM_RENDERER_NAME_SINGLE_CATEGORY
static const QString DIAGRAM_NAME_STACKED_BAR
QgsStackedDiagramRenderer * clone() const override
Returns new instance that is equivalent to this one.
QList< QgsDiagramSettings > diagramSettings() const override
Returns list with all diagram settings in the renderer.
QSizeF diagramSize(const QgsFeature &, const QgsRenderContext &c) const override
Returns size of the diagram (in painter units) or an invalid size in case of error.
void renderDiagram(const QgsFeature &feature, QgsRenderContext &c, QPointF pos, const QgsPropertyCollection &properties=QgsPropertyCollection()) const override
Renders the diagram for a specified feature at a specific position in the passed render context,...
QList< QString > diagramAttributes() const override
Returns attribute indices needed for diagram rendering.
void writeXml(QDomElement &layerElem, QDomDocument &doc, const QgsReadWriteContext &context) const override
Writes diagram state to a DOM element.
static const QString DIAGRAM_RENDERER_NAME_STACKED
QgsStackedDiagramRenderer & operator=(const QgsStackedDiagramRenderer &other)
void readXml(const QDomElement &elem, const QgsReadWriteContext &context) override
Reads diagram state from a DOM element.
void addRenderer(QgsDiagramRenderer *renderer)
Adds a renderer to the stacked renderer object.
void _writeXmlSubRenderers(QDomElement &rendererElem, QDomDocument &doc, const QgsReadWriteContext &context) const
Writes stacked renderers state to a DOM element.
QList< QgsDiagramRenderer * > renderers(bool sortByDiagramMode=false) const
Returns an ordered list with the renderers of the stacked renderer object.
const QgsDiagramRenderer * renderer(const int index) const
Returns the renderer at the given index.
void _readXmlSubRenderers(const QDomElement &elem, const QgsReadWriteContext &context)
Reads stacked renderers state from a DOM element.
int rendererCount() const
Returns the number of sub renderers in the stacked diagram renderer.
QList< QgsLayerTreeModelLegendNode * > legendItems(QgsLayerTreeLayer *nodeLayer) const override
Returns list of legend nodes for the diagram.
QgsStackedDiagramRenderer()=default
~QgsStackedDiagramRenderer() override
QSizeF sizeMapUnits(const QgsFeature &feature, const QgsRenderContext &c) const override
Returns size of the diagram for a feature in map units. Returns an invalid QSizeF in case of error.
A diagram composed of several subdiagrams, located side by side.
static const QString DIAGRAM_NAME_STACKED
void subDiagramPosition(QPointF &newPos, const QgsRenderContext &c, const QgsDiagramSettings &s, const QgsDiagramSettings &subSettings)
Calculates the position for the next subdiagram, updating the newPos object.
static QString encodeMapUnitScale(const QgsMapUnitScale &mapUnitScale)
static QList< double > prettyBreaks(double minimum, double maximum, int classes)
Computes a sequence of about 'classes' equally spaced round values which cover the range of values fr...
static QgsMapUnitScale decodeMapUnitScale(const QString &str)
static std::unique_ptr< QgsSymbol > loadSymbol(const QDomElement &element, const QgsReadWriteContext &context)
Attempts to load a symbol from a DOM element.
static QDomElement saveSymbol(const QString &symbolName, const QgsSymbol *symbol, QDomDocument &doc, const QgsReadWriteContext &context)
Writes a symbol definition to XML.
Implementation of legend node interface for displaying preview of vector symbols and their labels and...
static const QString DIAGRAM_NAME_TEXT
static Q_INVOKABLE Qgis::RenderUnit decodeRenderUnit(const QString &string, bool *ok=nullptr)
Decodes a render unit from a string.
static Q_INVOKABLE QString encodeUnit(Qgis::DistanceUnit unit)
Encodes a distance unit to a string.
As part of the API refactoring and improvements which landed in the Processing API was substantially reworked from the x version This was done in order to allow much of the underlying Processing framework to be ported into c
QMap< int, QgsPropertyDefinition > QgsPropertiesDefinition
Definition of available properties.
Definition of one class for the legend.