QGIS API Documentation 3.41.0-Master (af5edcb665c)
Loading...
Searching...
No Matches
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
578 void toSld( QDomDocument &doc, QDomElement &element, QVariantMap props ) const;
579
588 Qgis::RenderUnit outputUnit() const;
589
595 bool usesMapUnits() const;
596
605 void setOutputUnit( Qgis::RenderUnit unit ) const;
606
616 QgsMapUnitScale mapUnitScale() const;
617
626 void setMapUnitScale( const QgsMapUnitScale &scale ) const;
627
633 qreal opacity() const { return mOpacity; }
634
640 void setOpacity( qreal opacity ) { mOpacity = opacity; }
641
646 void setRenderHints( Qgis::SymbolRenderHints hints ) { mRenderHints = hints; }
647
652 Qgis::SymbolRenderHints renderHints() const;
653
660 void setFlags( Qgis::SymbolFlags flags ) { mSymbolFlags = flags; }
661
668 Qgis::SymbolFlags flags() const;
669
678 void setClipFeaturesToExtent( bool clipFeaturesToExtent ) { mClipFeaturesToExtent = clipFeaturesToExtent; }
679
688 bool clipFeaturesToExtent() const { return mClipFeaturesToExtent; }
689
699 void setForceRHR( bool force ) { mForceRHR = force; }
700
710 bool forceRHR() const { return mForceRHR; }
711
720 QgsSymbolBufferSettings *bufferSettings();
721
730 const QgsSymbolBufferSettings *bufferSettings() const SIP_SKIP;
731
740 void setBufferSettings( QgsSymbolBufferSettings *settings SIP_TRANSFER );
741
748 QgsSymbolAnimationSettings &animationSettings();
749
756 const QgsSymbolAnimationSettings &animationSettings() const SIP_SKIP;
757
764 void setAnimationSettings( const QgsSymbolAnimationSettings &settings );
765
771 QSet<QString> usedAttributes( const QgsRenderContext &context ) const;
772
780 void setDataDefinedProperty( Property key, const QgsProperty &property );
781
788 QgsPropertyCollection &dataDefinedProperties() { return mDataDefinedProperties; }
789
795 const QgsPropertyCollection &dataDefinedProperties() const SIP_SKIP { return mDataDefinedProperties; }
796
803 void setDataDefinedProperties( const QgsPropertyCollection &collection ) { mDataDefinedProperties = collection; }
804
808 bool hasDataDefinedProperties() const;
809
819 bool canCauseArtifactsBetweenAdjacentTiles() const;
820
825 Q_DECL_DEPRECATED void setLayer( const QgsVectorLayer *layer ) SIP_DEPRECATED;
826
830 Q_DECL_DEPRECATED const QgsVectorLayer *layer() const SIP_DEPRECATED;
831
836 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 );
837
843 QgsSymbolRenderContext *symbolRenderContext();
844
856 void startFeatureRender( const QgsFeature &feature, QgsRenderContext &context, int layer = -1 );
857
869 void stopFeatureRender( const QgsFeature &feature, QgsRenderContext &context, int layer = -1 );
870
877 double extentBuffer() const;
878
888 void setExtentBuffer( double extentBuffer );
889
897 Qgis::RenderUnit extentBufferSizeUnit() const { return mExtentBufferSizeUnit; }
898
906 void setExtentBufferSizeUnit( Qgis::RenderUnit unit ) { mExtentBufferSizeUnit = unit; }
907
908 protected:
909
915 QgsSymbol( Qgis::SymbolType type, const QgsSymbolLayerList &layers SIP_TRANSFER ); // can't be instantiated
916
920 static inline QPointF _getPoint( QgsRenderContext &context, const QgsPoint &point )
921 {
922 QPointF pt;
923 if ( context.coordinateTransform().isValid() )
924 {
925 double x = point.x();
926 double y = point.y();
927 double z = 0.0;
928 context.coordinateTransform().transformInPlace( x, y, z );
929 pt = QPointF( x, y );
930
931 }
932 else
933 pt = point.toQPointF();
934
935 context.mapToPixel().transformInPlace( pt.rx(), pt.ry() );
936 return pt;
937 }
938
942 static QPolygonF _getLineString( QgsRenderContext &context, const QgsCurve &curve, bool clipToExtent = true );
943
950 static QPolygonF _getPolygonRing( QgsRenderContext &context, const QgsCurve &curve, bool clipToExtent, bool isExteriorRing = false, bool correctRingOrientation = false );
951
959 static void _getPolygon( QPolygonF &pts, QVector<QPolygonF> &holes, QgsRenderContext &context, const QgsPolygon &polygon, bool clipToExtent = true, bool correctRingOrientation = false );
960
965 QgsSymbolLayerList cloneLayers() const SIP_FACTORY;
966
972 void copyCommonProperties( const QgsSymbol *other );
973
986 void renderUsingLayer( QgsSymbolLayer *layer, QgsSymbolRenderContext &context, Qgis::GeometryType geometryType = Qgis::GeometryType::Unknown, const QPolygonF *points = nullptr, const QVector<QPolygonF> *rings = nullptr );
987
991 void renderVertexMarker( QPointF pt, QgsRenderContext &context, Qgis::VertexMarkerType currentVertexMarkerType, double currentVertexMarkerSize );
992
993 Qgis::SymbolType mType;
995
996 double mExtentBuffer = 0;
997 Qgis::RenderUnit mExtentBufferSizeUnit = Qgis::RenderUnit::MapUnits;
998
1000 qreal mOpacity = 1.0;
1001
1002 Qgis::SymbolRenderHints mRenderHints;
1003
1009 Qgis::SymbolFlags mSymbolFlags = Qgis::SymbolFlags();
1010
1011 bool mClipFeaturesToExtent = true;
1012 bool mForceRHR = false;
1013
1014 std::unique_ptr< QgsSymbolBufferSettings > mBufferSettings;
1015 QgsSymbolAnimationSettings mAnimationSettings;
1016
1017 Q_DECL_DEPRECATED const QgsVectorLayer *mLayer = nullptr; //current vectorlayer
1018
1019 private:
1020#ifdef SIP_RUN
1021 QgsSymbol( const QgsSymbol & );
1022#endif
1023
1024 static void initPropertyDefinitions();
1025
1027 static QgsPropertiesDefinition sPropertyDefinitions;
1028
1033 bool mStarted = false;
1034
1036 std::unique_ptr< QgsSymbolRenderContext > mSymbolRenderContext;
1037
1038 QgsPropertyCollection mDataDefinedProperties;
1039
1043 static QPolygonF _getLineString2d( QgsRenderContext &context, const QgsCurve &curve, bool clipToExtent = true );
1044
1048 static QPolygonF _getLineString3d( QgsRenderContext &context, const QgsCurve &curve, bool clipToExtent = true );
1049
1056 static QPolygonF _getPolygonRing2d( QgsRenderContext &context, const QgsCurve &curve, bool clipToExtent, bool isExteriorRing = false, bool correctRingOrientation = false );
1057
1064 static QPolygonF _getPolygonRing3d( QgsRenderContext &context, const QgsCurve &curve, bool clipToExtent, bool isExteriorRing = false, bool correctRingOrientation = false );
1065
1066 Q_DISABLE_COPY( QgsSymbol )
1067
1068};
1069
1070#endif
The Qgis class provides global constants for use throughout the application.
Definition qgis.h:54
QFlags< SymbolPreviewFlag > SymbolPreviewFlags
Symbol preview flags.
Definition qgis.h:801
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:4910
@ 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:787
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:382
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 a integer key value.
A store for object properties.
The class is used as a container of context for various read/write operations on other 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.
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 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:803
Property
Data definable properties.
Definition qgssymbol.h:270
void setRenderHints(Qgis::SymbolRenderHints hints)
Sets rendering hint flags for the symbol.
Definition qgssymbol.h:646
static QPointF _getPoint(QgsRenderContext &context, const QgsPoint &point)
Creates a point in screen coordinates from a QgsPoint in map coordinates.
Definition qgssymbol.h:920
bool clipFeaturesToExtent() const
Returns whether features drawn by the symbol will be clipped to the render context's extent.
Definition qgssymbol.h:688
void setFlags(Qgis::SymbolFlags flags)
Sets flags for the symbol.
Definition qgssymbol.h:660
void setExtentBufferSizeUnit(Qgis::RenderUnit unit)
Sets the unit used for the extent buffer.
Definition qgssymbol.h:906
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:640
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:795
bool forceRHR() const
Returns true if polygon features drawn by the symbol will be reoriented to follow the standard right-...
Definition qgssymbol.h:710
void setClipFeaturesToExtent(bool clipFeaturesToExtent)
Sets whether features drawn by the symbol should be clipped to the render context's extent.
Definition qgssymbol.h:678
void setForceRHR(bool force)
Sets whether polygon features drawn by the symbol should be reoriented to follow the standard right-h...
Definition qgssymbol.h:699
Represents a vector layer which manages a vector based data sets.
#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