QGIS API Documentation 3.43.0-Master (2366440f66a)
qgssymbol.h
Go to the documentation of this file.
1/***************************************************************************
2 qgssymbol.h
3 ---------------------
4 begin : November 2009
5 copyright : (C) 2009 by Martin Dobias
6 email : wonder dot sk at gmail dot com
7 ***************************************************************************
8 * *
9 * This program is free software; you can redistribute it and/or modify *
10 * it under the terms of the GNU General Public License as published by *
11 * the Free Software Foundation; either version 2 of the License, or *
12 * (at your option) any later version. *
13 * *
14 ***************************************************************************/
15
16#ifndef QGSSYMBOL_H
17#define QGSSYMBOL_H
18
19#include "qgis_core.h"
20#include "qgis.h"
22#include "qgsrendercontext.h"
23#include "qgsscreenproperties.h"
24
25class QgsSymbolLayer;
29
30typedef QList<QgsSymbolLayer *> QgsSymbolLayerList;
31
41{
42 public:
43
53 void setIsAnimated( bool animated ) { mIsAnimated = animated; }
54
64 bool isAnimated() const { return mIsAnimated; }
65
71 void setFrameRate( double rate ) { mFrameRate = rate; }
72
78 double frameRate() const { return mFrameRate; }
79
80 private:
81
82 bool mIsAnimated = false;
83 double mFrameRate = 10;
84
85};
86
87
96class CORE_EXPORT QgsSymbolBufferSettings
97{
98 public:
99
102
105
110 bool enabled() const { return mEnabled; }
111
116 void setEnabled( bool enabled ) { mEnabled = enabled; }
117
123 double size() const { return mSize; }
124
133 void setSize( double size ) { mSize = size; }
134
141 Qgis::RenderUnit sizeUnit() const { return mSizeUnit; }
142
149 void setSizeUnit( Qgis::RenderUnit unit ) { mSizeUnit = unit; }
150
158 QgsMapUnitScale sizeMapUnitScale() const { return mSizeMapUnitScale; }
159
168 void setSizeMapUnitScale( const QgsMapUnitScale &scale ) { mSizeMapUnitScale = scale; }
169
174 Qt::PenJoinStyle joinStyle() const { return mJoinStyle; }
175
180 void setJoinStyle( Qt::PenJoinStyle style ) { mJoinStyle = style; }
181
189 QgsFillSymbol *fillSymbol() const;
190
197 void setFillSymbol( QgsFillSymbol *symbol SIP_TRANSFER );
198
199
205 void writeXml( QDomElement &element, const QgsReadWriteContext &context ) const;
206
212 void readXml( const QDomElement &element, const QgsReadWriteContext &context );
213
214 private:
215 bool mEnabled = false;
216 double mSize = 1;
218 QgsMapUnitScale mSizeMapUnitScale;
219 Qt::PenJoinStyle mJoinStyle = Qt::RoundJoin;
220 std::unique_ptr< QgsFillSymbol > mFillSymbol;
221};
222
223
230class CORE_EXPORT QgsSymbol
231{
232
233#ifdef SIP_RUN
235 switch ( sipCpp->type() )
236 {
237 case Qgis::SymbolType::Marker: sipType = sipType_QgsMarkerSymbol; break;
238 case Qgis::SymbolType::Line: sipType = sipType_QgsLineSymbol; break;
239 case Qgis::SymbolType::Fill: sipType = sipType_QgsFillSymbol; break;
240 default: sipType = 0; break;
241 }
242 SIP_END
243#endif
244
245 friend class QgsFeatureRenderer;
246
247 public:
248
254 static QString symbolTypeToString( Qgis::SymbolType type );
255
261 static Qgis::SymbolType symbolTypeForGeometryType( Qgis::GeometryType type );
262
263 // *INDENT-OFF*
264
270 {
271 Opacity SIP_MONKEYPATCH_COMPAT_NAME( PropertyOpacity ),
272 ExtentBuffer,
273 };
274 // *INDENT-ON*
275
280 static const QgsPropertiesDefinition &propertyDefinitions();
281
282 virtual ~QgsSymbol();
283
289 static QgsSymbol *defaultSymbol( Qgis::GeometryType geomType ) SIP_FACTORY;
290
294 Qgis::SymbolType type() const { return mType; }
295
296 // symbol layers handling
297
304 QgsSymbolLayerList symbolLayers() const { return mLayers; }
305
306#ifndef SIP_RUN
307
313 QgsSymbolLayer *symbolLayer( int layer );
314
321 const QgsSymbolLayer *symbolLayer( int layer ) const;
322#else
323
332 SIP_PYOBJECT symbolLayer( int layer ) SIP_TYPEHINT( QgsSymbolLayer );
333 % MethodCode
334 const int count = sipCpp->symbolLayerCount();
335 if ( a0 < 0 || a0 >= count )
336 {
337 PyErr_SetString( PyExc_IndexError, QByteArray::number( a0 ) );
338 sipIsErr = 1;
339 }
340 else
341 {
342 sipRes = sipConvertFromType( sipCpp->symbolLayer( a0 ), sipType_QgsSymbolLayer, NULL );
343 }
344 % End
345#endif
346
353 int symbolLayerCount() const { return mLayers.count(); }
354
355#ifdef SIP_RUN
356
360 int __len__() const;
361 % MethodCode
362 sipRes = sipCpp->symbolLayerCount();
363 % End
364
366 int __bool__() const;
367 % MethodCode
368 sipRes = true;
369 % End
370
381 SIP_PYOBJECT __getitem__( int index ) SIP_TYPEHINT( QgsSymbolLayer );
382 % MethodCode
383 const int count = sipCpp->symbolLayerCount();
384 if ( a0 < -count || a0 >= count )
385 {
386 PyErr_SetString( PyExc_IndexError, QByteArray::number( a0 ) );
387 sipIsErr = 1;
388 }
389 else if ( a0 >= 0 )
390 {
391 return sipConvertFromType( sipCpp->symbolLayer( a0 ), sipType_QgsSymbolLayer, NULL );
392 }
393 else
394 {
395 return sipConvertFromType( sipCpp->symbolLayer( count + a0 ), sipType_QgsSymbolLayer, NULL );
396 }
397 % End
398
409 void __delitem__( int index );
410 % MethodCode
411 const int count = sipCpp->symbolLayerCount();
412 if ( a0 >= 0 && a0 < count )
413 sipCpp->deleteSymbolLayer( a0 );
414 else if ( a0 < 0 && a0 >= -count )
415 sipCpp->deleteSymbolLayer( count + a0 );
416 else
417 {
418 PyErr_SetString( PyExc_IndexError, QByteArray::number( a0 ) );
419 sipIsErr = 1;
420 }
421 % End
422#endif
423
431 bool insertSymbolLayer( int index, QgsSymbolLayer *layer SIP_TRANSFER );
432
439 bool appendSymbolLayer( QgsSymbolLayer *layer SIP_TRANSFER );
440
444 bool deleteSymbolLayer( int index );
445
452 QgsSymbolLayer *takeSymbolLayer( int index ) SIP_TRANSFERBACK;
453
461 bool changeSymbolLayer( int index, QgsSymbolLayer *layer SIP_TRANSFER );
462
472 void startRender( QgsRenderContext &context, const QgsFields &fields = QgsFields() );
473
480 void stopRender( QgsRenderContext &context );
481
492 void setColor( const QColor &color ) const;
493
502 QColor color() const;
503
520 void drawPreviewIcon( QPainter *painter, QSize size, QgsRenderContext *customContext = nullptr, bool selected = false, const QgsExpressionContext *expressionContext = nullptr,
521 const QgsLegendPatchShape *patchShape = nullptr, const QgsScreenProperties &screen = QgsScreenProperties() );
522
532 void exportImage( const QString &path, const QString &format, QSize size );
533
543 QImage asImage( QSize size, QgsRenderContext *customContext = nullptr );
544
556 QImage bigSymbolPreviewImage( QgsExpressionContext *expressionContext = nullptr, Qgis::SymbolPreviewFlags flags = Qgis::SymbolPreviewFlag::FlagIncludeCrosshairsForMarkerSymbols, const QgsScreenProperties &screen = QgsScreenProperties() ) SIP_PYNAME( bigSymbolPreviewImageV2 );
557
561 Q_DECL_DEPRECATED QImage bigSymbolPreviewImage( QgsExpressionContext *expressionContext = nullptr, int flags = static_cast< int >( Qgis::SymbolPreviewFlag::FlagIncludeCrosshairsForMarkerSymbols ) ) SIP_DEPRECATED;
562
566 QString dump() const;
567
573 virtual QgsSymbol *clone() const = 0 SIP_FACTORY;
574
580 Q_DECL_DEPRECATED void toSld( QDomDocument &doc, QDomElement &element, QVariantMap props ) const SIP_DEPRECATED;
581
589 bool toSld( QDomDocument &doc, QDomElement &element, QgsSldExportContext &context ) const;
590
599 Qgis::RenderUnit outputUnit() const;
600
606 bool usesMapUnits() const;
607
616 void setOutputUnit( Qgis::RenderUnit unit ) const;
617
627 QgsMapUnitScale mapUnitScale() const;
628
637 void setMapUnitScale( const QgsMapUnitScale &scale ) const;
638
644 qreal opacity() const { return mOpacity; }
645
651 void setOpacity( qreal opacity ) { mOpacity = opacity; }
652
657 void setRenderHints( Qgis::SymbolRenderHints hints ) { mRenderHints = hints; }
658
663 Qgis::SymbolRenderHints renderHints() const;
664
671 void setFlags( Qgis::SymbolFlags flags ) { mSymbolFlags = flags; }
672
679 Qgis::SymbolFlags flags() const;
680
689 void setClipFeaturesToExtent( bool clipFeaturesToExtent ) { mClipFeaturesToExtent = clipFeaturesToExtent; }
690
699 bool clipFeaturesToExtent() const { return mClipFeaturesToExtent; }
700
710 void setForceRHR( bool force ) { mForceRHR = force; }
711
721 bool forceRHR() const { return mForceRHR; }
722
731 QgsSymbolBufferSettings *bufferSettings();
732
741 const QgsSymbolBufferSettings *bufferSettings() const SIP_SKIP;
742
751 void setBufferSettings( QgsSymbolBufferSettings *settings SIP_TRANSFER );
752
759 QgsSymbolAnimationSettings &animationSettings();
760
767 const QgsSymbolAnimationSettings &animationSettings() const SIP_SKIP;
768
775 void setAnimationSettings( const QgsSymbolAnimationSettings &settings );
776
782 QSet<QString> usedAttributes( const QgsRenderContext &context ) const;
783
791 void setDataDefinedProperty( Property key, const QgsProperty &property );
792
799 QgsPropertyCollection &dataDefinedProperties() { return mDataDefinedProperties; }
800
806 const QgsPropertyCollection &dataDefinedProperties() const SIP_SKIP { return mDataDefinedProperties; }
807
814 void setDataDefinedProperties( const QgsPropertyCollection &collection ) { mDataDefinedProperties = collection; }
815
819 bool hasDataDefinedProperties() const;
820
830 bool canCauseArtifactsBetweenAdjacentTiles() const;
831
838 Q_DECL_DEPRECATED void setLayer( const QgsVectorLayer *layer ) SIP_DEPRECATED;
839
843 Q_DECL_DEPRECATED const QgsVectorLayer *layer() const SIP_DEPRECATED;
844
849 void renderFeature( const QgsFeature &feature, QgsRenderContext &context, int layer = -1, bool selected = false, bool drawVertexMarker = false, Qgis::VertexMarkerType currentVertexMarkerType = Qgis::VertexMarkerType::SemiTransparentCircle, double currentVertexMarkerSize = 0.0 ) SIP_THROW( QgsCsException );
850
856 QgsSymbolRenderContext *symbolRenderContext();
857
869 void startFeatureRender( const QgsFeature &feature, QgsRenderContext &context, int layer = -1 );
870
882 void stopFeatureRender( const QgsFeature &feature, QgsRenderContext &context, int layer = -1 );
883
890 double extentBuffer() const;
891
901 void setExtentBuffer( double extentBuffer );
902
910 Qgis::RenderUnit extentBufferSizeUnit() const { return mExtentBufferSizeUnit; }
911
919 void setExtentBufferSizeUnit( Qgis::RenderUnit unit ) { mExtentBufferSizeUnit = unit; }
920
921 protected:
922
928 QgsSymbol( Qgis::SymbolType type, const QgsSymbolLayerList &layers SIP_TRANSFER ); // can't be instantiated
929
933 static inline QPointF _getPoint( QgsRenderContext &context, const QgsPoint &point )
934 {
935 QPointF pt;
936 if ( context.coordinateTransform().isValid() )
937 {
938 double x = point.x();
939 double y = point.y();
940 double z = 0.0;
941 context.coordinateTransform().transformInPlace( x, y, z );
942 pt = QPointF( x, y );
943
944 }
945 else
946 pt = point.toQPointF();
947
948 context.mapToPixel().transformInPlace( pt.rx(), pt.ry() );
949 return pt;
950 }
951
955 static QPolygonF _getLineString( QgsRenderContext &context, const QgsCurve &curve, bool clipToExtent = true );
956
963 static QPolygonF _getPolygonRing( QgsRenderContext &context, const QgsCurve &curve, bool clipToExtent, bool isExteriorRing = false, bool correctRingOrientation = false );
964
972 static void _getPolygon( QPolygonF &pts, QVector<QPolygonF> &holes, QgsRenderContext &context, const QgsPolygon &polygon, bool clipToExtent = true, bool correctRingOrientation = false );
973
978 QgsSymbolLayerList cloneLayers() const SIP_FACTORY;
979
985 void copyCommonProperties( const QgsSymbol *other );
986
999 void renderUsingLayer( QgsSymbolLayer *layer, QgsSymbolRenderContext &context, Qgis::GeometryType geometryType = Qgis::GeometryType::Unknown, const QPolygonF *points = nullptr, const QVector<QPolygonF> *rings = nullptr );
1000
1004 void renderVertexMarker( QPointF pt, QgsRenderContext &context, Qgis::VertexMarkerType currentVertexMarkerType, double currentVertexMarkerSize );
1005
1006 Qgis::SymbolType mType;
1008
1009 double mExtentBuffer = 0;
1010 Qgis::RenderUnit mExtentBufferSizeUnit = Qgis::RenderUnit::MapUnits;
1011
1013 qreal mOpacity = 1.0;
1014
1015 Qgis::SymbolRenderHints mRenderHints;
1016
1022 Qgis::SymbolFlags mSymbolFlags = Qgis::SymbolFlags();
1023
1024 bool mClipFeaturesToExtent = true;
1025 bool mForceRHR = false;
1026
1027 std::unique_ptr< QgsSymbolBufferSettings > mBufferSettings;
1028 QgsSymbolAnimationSettings mAnimationSettings;
1029
1030 Q_DECL_DEPRECATED const QgsVectorLayer *mLayer = nullptr; //current vectorlayer
1031
1032 private:
1033#ifdef SIP_RUN
1034 QgsSymbol( const QgsSymbol & );
1035#endif
1036
1037 static void initPropertyDefinitions();
1038
1040 static QgsPropertiesDefinition sPropertyDefinitions;
1041
1046 bool mStarted = false;
1047
1049 std::unique_ptr< QgsSymbolRenderContext > mSymbolRenderContext;
1050
1051 QgsPropertyCollection mDataDefinedProperties;
1052
1056 static QPolygonF _getLineString2d( QgsRenderContext &context, const QgsCurve &curve, bool clipToExtent = true );
1057
1061 static QPolygonF _getLineString3d( QgsRenderContext &context, const QgsCurve &curve, bool clipToExtent = true );
1062
1069 static QPolygonF _getPolygonRing2d( QgsRenderContext &context, const QgsCurve &curve, bool clipToExtent, bool isExteriorRing = false, bool correctRingOrientation = false );
1070
1077 static QPolygonF _getPolygonRing3d( QgsRenderContext &context, const QgsCurve &curve, bool clipToExtent, bool isExteriorRing = false, bool correctRingOrientation = false );
1078
1079 Q_DISABLE_COPY( QgsSymbol )
1080
1081};
1082
1083#endif
Provides global constants and enumerations for use throughout the application.
Definition qgis.h:54
QFlags< SymbolPreviewFlag > SymbolPreviewFlags
Symbol preview flags.
Definition qgis.h:831
GeometryType
The geometry types are used to group Qgis::WkbType in a coarse way.
Definition qgis.h:337
RenderUnit
Rendering size units.
Definition qgis.h:5029
@ Millimeters
Millimeters.
@ FlagIncludeCrosshairsForMarkerSymbols
Include a crosshairs reference image in the background of marker symbol previews.
QFlags< SymbolRenderHint > SymbolRenderHints
Symbol render hints.
Definition qgis.h:741
QFlags< SymbolFlag > SymbolFlags
Symbol flags.
Definition qgis.h:817
SymbolType
Symbol types.
Definition qgis.h:574
@ Marker
Marker symbol.
@ Line
Line symbol.
@ Fill
Fill symbol.
void transformInPlace(double &x, double &y, double &z, Qgis::TransformDirection direction=Qgis::TransformDirection::Forward) const
Transforms an array of x, y and z double coordinates in place, from the source CRS to the destination...
bool isValid() const
Returns true if the coordinate transform is valid, ie both the source and destination CRS have been s...
Custom exception class for Coordinate Reference System related exceptions.
Abstract base class for curved geometry type.
Definition qgscurve.h:35
Expression contexts are used to encapsulate the parameters around which a QgsExpression should be eva...
Abstract base class for all 2D vector feature renderers.
The feature class encapsulates a single feature including its unique ID, geometry and a list of field...
Definition qgsfeature.h:58
Container of fields for a vector layer.
Definition qgsfields.h:46
A fill symbol type, for rendering Polygon and MultiPolygon geometries.
Represents a patch shape for use in map legends.
Abstract base class for line symbol layers.
void transformInPlace(double &x, double &y) const
Transforms map coordinates to device coordinates.
Struct for storing maximum and minimum scales for measurements in map units.
Point geometry type, with support for z-dimension and m-values.
Definition qgspoint.h:49
QPointF toQPointF() const
Returns the point as a QPointF.
Definition qgspoint.h:376
double x
Definition qgspoint.h:52
double y
Definition qgspoint.h:53
Polygon geometry type.
Definition qgspolygon.h:33
A grouped map of multiple QgsProperty objects, each referenced by an integer key value.
A store for object properties.
A container for the context for various read/write operations on objects.
Contains information about the context of a rendering operation.
const QgsMapToPixel & mapToPixel() const
Returns the context's map to pixel transform, which transforms between map coordinates and device coo...
QgsCoordinateTransform coordinateTransform() const
Returns the current coordinate transform for the context.
Stores properties relating to a screen.
Holds SLD export options and other information related to SLD export of a QGIS layer style.
Contains settings relating to symbol animation.
Definition qgssymbol.h:41
bool isAnimated() const
Returns true if the symbol is animated.
Definition qgssymbol.h:64
void setIsAnimated(bool animated)
Sets whether the symbol is animated.
Definition qgssymbol.h:53
void setFrameRate(double rate)
Sets the symbol animation frame rate (in frames per second).
Definition qgssymbol.h:71
double frameRate() const
Returns the symbol animation frame rate (in frames per second).
Definition qgssymbol.h:78
Contains settings relating to symbol buffers, which draw a "halo" effect around the symbol.
Definition qgssymbol.h:97
void setEnabled(bool enabled)
Sets whether the symbol buffer will be drawn.
Definition qgssymbol.h:116
void setSizeMapUnitScale(const QgsMapUnitScale &scale)
Sets the map unit scale object for the buffer size.
Definition qgssymbol.h:168
bool enabled() const
Returns whether the buffer is enabled.
Definition qgssymbol.h:110
QgsMapUnitScale sizeMapUnitScale() const
Returns the map unit scale object for the buffer size.
Definition qgssymbol.h:158
void setSize(double size)
Sets the size of the buffer.
Definition qgssymbol.h:133
void setJoinStyle(Qt::PenJoinStyle style)
Sets the join style used for drawing the buffer.
Definition qgssymbol.h:180
void setSizeUnit(Qgis::RenderUnit unit)
Sets the unit used for the buffer size.
Definition qgssymbol.h:149
Qt::PenJoinStyle joinStyle() const
Returns the buffer join style.
Definition qgssymbol.h:174
Qgis::RenderUnit sizeUnit() const
Returns the units for the buffer size.
Definition qgssymbol.h:141
double size() const
Returns the size of the buffer.
Definition qgssymbol.h:123
Abstract base class for symbol layers.
Encapsulates the context in which a symbol is being rendered.
Abstract base class for all rendered symbols.
Definition qgssymbol.h:231
void setDataDefinedProperties(const QgsPropertyCollection &collection)
Sets the symbol's property collection, used for data defined overrides.
Definition qgssymbol.h:814
Property
Data definable properties.
Definition qgssymbol.h:270
void setRenderHints(Qgis::SymbolRenderHints hints)
Sets rendering hint flags for the symbol.
Definition qgssymbol.h:657
static QPointF _getPoint(QgsRenderContext &context, const QgsPoint &point)
Creates a point in screen coordinates from a QgsPoint in map coordinates.
Definition qgssymbol.h:933
bool clipFeaturesToExtent() const
Returns whether features drawn by the symbol will be clipped to the render context's extent.
Definition qgssymbol.h:699
void setFlags(Qgis::SymbolFlags flags)
Sets flags for the symbol.
Definition qgssymbol.h:671
void setExtentBufferSizeUnit(Qgis::RenderUnit unit)
Sets the unit used for the extent buffer.
Definition qgssymbol.h:919
QgsSymbolLayerList symbolLayers() const
Returns the list of symbol layers contained in the symbol.
Definition qgssymbol.h:304
void setOpacity(qreal opacity)
Sets the opacity for the symbol.
Definition qgssymbol.h:651
int symbolLayerCount() const
Returns the total number of symbol layers contained in the symbol.
Definition qgssymbol.h:353
Qgis::SymbolType type() const
Returns the symbol's type.
Definition qgssymbol.h:294
const QgsPropertyCollection & dataDefinedProperties() const
Returns a reference to the symbol's property collection, used for data defined overrides.
Definition qgssymbol.h:806
bool forceRHR() const
Returns true if polygon features drawn by the symbol will be reoriented to follow the standard right-...
Definition qgssymbol.h:721
void setClipFeaturesToExtent(bool clipFeaturesToExtent)
Sets whether features drawn by the symbol should be clipped to the render context's extent.
Definition qgssymbol.h:689
void setForceRHR(bool force)
Sets whether polygon features drawn by the symbol should be reoriented to follow the standard right-h...
Definition qgssymbol.h:710
Represents a vector layer which manages a vector based dataset.
#define SIP_TYPEHINT(type)
Definition qgis_sip.h:232
#define SIP_CONVERT_TO_SUBCLASS_CODE(code)
Definition qgis_sip.h:191
#define SIP_DEPRECATED
Definition qgis_sip.h:106
#define SIP_SKIP
Definition qgis_sip.h:126
#define SIP_MONKEYPATCH_SCOPEENUM_UNNEST(OUTSIDE_CLASS, FORMERNAME)
Definition qgis_sip.h:271
#define SIP_PYNAME(name)
Definition qgis_sip.h:81
#define SIP_TRANSFER
Definition qgis_sip.h:36
#define SIP_TRANSFERBACK
Definition qgis_sip.h:48
#define SIP_FACTORY
Definition qgis_sip.h:76
#define SIP_THROW(name,...)
Definition qgis_sip.h:203
#define SIP_END
Definition qgis_sip.h:208
#define SIP_MONKEYPATCH_COMPAT_NAME(FORMERNAME)
Definition qgis_sip.h:273
QMap< int, QgsPropertyDefinition > QgsPropertiesDefinition
Definition of available properties.
QList< QgsSymbolLayer * > QgsSymbolLayerList
Definition qgssymbol.h:30