QGIS API Documentation  3.26.3-Buenos Aires (65e4edfdad)
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"
21 #include "qgspropertycollection.h"
22 #include "qgsrendercontext.h"
23 
24 class QgsSymbolLayer;
28 
29 typedef QList<QgsSymbolLayer *> QgsSymbolLayerList;
30 
39 class CORE_EXPORT QgsSymbolAnimationSettings
40 {
41  public:
42 
52  void setIsAnimated( bool animated ) { mIsAnimated = animated; }
53 
63  bool isAnimated() const { return mIsAnimated; }
64 
70  void setFrameRate( double rate ) { mFrameRate = rate; }
71 
77  double frameRate() const { return mFrameRate; }
78 
79  private:
80 
81  bool mIsAnimated = false;
82  double mFrameRate = 10;
83 
84 };
85 
92 class CORE_EXPORT QgsSymbol
93 {
94 
95 #ifdef SIP_RUN
97  switch ( sipCpp->type() )
98  {
99  case Qgis::SymbolType::Marker: sipType = sipType_QgsMarkerSymbol; break;
100  case Qgis::SymbolType::Line: sipType = sipType_QgsLineSymbol; break;
101  case Qgis::SymbolType::Fill: sipType = sipType_QgsFillSymbol; break;
102  default: sipType = 0; break;
103  }
104  SIP_END
105 #endif
106 
107  friend class QgsFeatureRenderer;
108 
109  public:
110 
116  static QString symbolTypeToString( Qgis::SymbolType type );
117 
123  static Qgis::SymbolType symbolTypeForGeometryType( QgsWkbTypes::GeometryType type );
124 
129  enum Property
130  {
132  };
133 
138  static const QgsPropertiesDefinition &propertyDefinitions();
139 
140  virtual ~QgsSymbol();
141 
147  static QgsSymbol *defaultSymbol( QgsWkbTypes::GeometryType geomType ) SIP_FACTORY;
148 
152  Qgis::SymbolType type() const { return mType; }
153 
154  // symbol layers handling
155 
163  QgsSymbolLayerList symbolLayers() { return mLayers; }
164 
165 #ifndef SIP_RUN
166 
173  QgsSymbolLayer *symbolLayer( int layer );
174 
181  const QgsSymbolLayer *symbolLayer( int layer ) const;
182 #else
183 
193  SIP_PYOBJECT symbolLayer( int layer ) SIP_TYPEHINT( QgsSymbolLayer );
194  % MethodCode
195  const int count = sipCpp->symbolLayerCount();
196  if ( a0 < 0 || a0 >= count )
197  {
198  PyErr_SetString( PyExc_IndexError, QByteArray::number( a0 ) );
199  sipIsErr = 1;
200  }
201  else
202  {
203  sipRes = sipConvertFromType( sipCpp->symbolLayer( a0 ), sipType_QgsSymbolLayer, NULL );
204  }
205  % End
206 #endif
207 
215  int symbolLayerCount() const { return mLayers.count(); }
216 
217 #ifdef SIP_RUN
218 
222  int __len__() const;
223  % MethodCode
224  sipRes = sipCpp->symbolLayerCount();
225  % End
226 
228  int __bool__() const;
229  % MethodCode
230  sipRes = true;
231  % End
232 
243  SIP_PYOBJECT __getitem__( int index ) SIP_TYPEHINT( QgsSymbolLayer );
244  % MethodCode
245  const int count = sipCpp->symbolLayerCount();
246  if ( a0 < -count || a0 >= count )
247  {
248  PyErr_SetString( PyExc_IndexError, QByteArray::number( a0 ) );
249  sipIsErr = 1;
250  }
251  else if ( a0 >= 0 )
252  {
253  return sipConvertFromType( sipCpp->symbolLayer( a0 ), sipType_QgsSymbolLayer, NULL );
254  }
255  else
256  {
257  return sipConvertFromType( sipCpp->symbolLayer( count + a0 ), sipType_QgsSymbolLayer, NULL );
258  }
259  % End
260 
271  void __delitem__( int index );
272  % MethodCode
273  const int count = sipCpp->symbolLayerCount();
274  if ( a0 >= 0 && a0 < count )
275  sipCpp->deleteSymbolLayer( a0 );
276  else if ( a0 < 0 && a0 >= -count )
277  sipCpp->deleteSymbolLayer( count + a0 );
278  else
279  {
280  PyErr_SetString( PyExc_IndexError, QByteArray::number( a0 ) );
281  sipIsErr = 1;
282  }
283  % End
284 #endif
285 
293  bool insertSymbolLayer( int index, QgsSymbolLayer *layer SIP_TRANSFER );
294 
301  bool appendSymbolLayer( QgsSymbolLayer *layer SIP_TRANSFER );
302 
306  bool deleteSymbolLayer( int index );
307 
314  QgsSymbolLayer *takeSymbolLayer( int index ) SIP_TRANSFERBACK;
315 
323  bool changeSymbolLayer( int index, QgsSymbolLayer *layer SIP_TRANSFER );
324 
334  void startRender( QgsRenderContext &context, const QgsFields &fields = QgsFields() );
335 
342  void stopRender( QgsRenderContext &context );
343 
354  void setColor( const QColor &color ) const;
355 
364  QColor color() const;
365 
383  void drawPreviewIcon( QPainter *painter, QSize size, QgsRenderContext *customContext = nullptr, bool selected = false, const QgsExpressionContext *expressionContext = nullptr,
384  const QgsLegendPatchShape *patchShape = nullptr );
385 
395  void exportImage( const QString &path, const QString &format, QSize size );
396 
406  QImage asImage( QSize size, QgsRenderContext *customContext = nullptr );
407 
418  QImage bigSymbolPreviewImage( QgsExpressionContext *expressionContext = nullptr, Qgis::SymbolPreviewFlags flags = Qgis::SymbolPreviewFlag::FlagIncludeCrosshairsForMarkerSymbols ) SIP_PYNAME( bigSymbolPreviewImageV2 );
419 
423  Q_DECL_DEPRECATED QImage bigSymbolPreviewImage( QgsExpressionContext *expressionContext = nullptr, int flags = static_cast< int >( Qgis::SymbolPreviewFlag::FlagIncludeCrosshairsForMarkerSymbols ) ) SIP_DEPRECATED;
424 
428  QString dump() const;
429 
435  virtual QgsSymbol *clone() const = 0 SIP_FACTORY;
436 
440  void toSld( QDomDocument &doc, QDomElement &element, QVariantMap props ) const;
441 
450  QgsUnitTypes::RenderUnit outputUnit() const;
451 
457  bool usesMapUnits() const;
458 
467  void setOutputUnit( QgsUnitTypes::RenderUnit unit ) const;
468 
478  QgsMapUnitScale mapUnitScale() const;
479 
488  void setMapUnitScale( const QgsMapUnitScale &scale ) const;
489 
495  qreal opacity() const { return mOpacity; }
496 
502  void setOpacity( qreal opacity ) { mOpacity = opacity; }
503 
508  void setRenderHints( Qgis::SymbolRenderHints hints ) { mRenderHints = hints; }
509 
514  Qgis::SymbolRenderHints renderHints() const { return mRenderHints; }
515 
522  void setFlags( Qgis::SymbolFlags flags ) { mSymbolFlags = flags; }
523 
530  Qgis::SymbolFlags flags() const { return mSymbolFlags; }
531 
541  void setClipFeaturesToExtent( bool clipFeaturesToExtent ) { mClipFeaturesToExtent = clipFeaturesToExtent; }
542 
552  bool clipFeaturesToExtent() const { return mClipFeaturesToExtent; }
553 
563  void setForceRHR( bool force ) { mForceRHR = force; }
564 
574  bool forceRHR() const { return mForceRHR; }
575 
582  QgsSymbolAnimationSettings &animationSettings();
583 
590  const QgsSymbolAnimationSettings &animationSettings() const SIP_SKIP;
591 
598  void setAnimationSettings( const QgsSymbolAnimationSettings &settings );
599 
605  QSet<QString> usedAttributes( const QgsRenderContext &context ) const;
606 
614  void setDataDefinedProperty( Property key, const QgsProperty &property );
615 
622  QgsPropertyCollection &dataDefinedProperties() { return mDataDefinedProperties; }
623 
629  const QgsPropertyCollection &dataDefinedProperties() const { return mDataDefinedProperties; } SIP_SKIP
630 
637  void setDataDefinedProperties( const QgsPropertyCollection &collection ) { mDataDefinedProperties = collection; }
638 
643  bool hasDataDefinedProperties() const;
644 
654  bool canCauseArtifactsBetweenAdjacentTiles() const;
655 
660  Q_DECL_DEPRECATED void setLayer( const QgsVectorLayer *layer ) SIP_DEPRECATED;
661 
665  Q_DECL_DEPRECATED const QgsVectorLayer *layer() const SIP_DEPRECATED;
666 
671  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 );
672 
678  QgsSymbolRenderContext *symbolRenderContext();
679 
691  void startFeatureRender( const QgsFeature &feature, QgsRenderContext &context, int layer = -1 );
692 
704  void stopFeatureRender( const QgsFeature &feature, QgsRenderContext &context, int layer = -1 );
705 
706  protected:
707 
713  QgsSymbol( Qgis::SymbolType type, const QgsSymbolLayerList &layers SIP_TRANSFER ); // can't be instantiated
714 
718  static inline QPointF _getPoint( QgsRenderContext &context, const QgsPoint &point )
719  {
720  QPointF pt;
721  if ( context.coordinateTransform().isValid() )
722  {
723  double x = point.x();
724  double y = point.y();
725  double z = 0.0;
726  context.coordinateTransform().transformInPlace( x, y, z );
727  pt = QPointF( x, y );
728 
729  }
730  else
731  pt = point.toQPointF();
732 
733  context.mapToPixel().transformInPlace( pt.rx(), pt.ry() );
734  return pt;
735  }
736 
740  static QPolygonF _getLineString( QgsRenderContext &context, const QgsCurve &curve, bool clipToExtent = true );
741 
748  static QPolygonF _getPolygonRing( QgsRenderContext &context, const QgsCurve &curve, bool clipToExtent, bool isExteriorRing = false, bool correctRingOrientation = false );
749 
757  static void _getPolygon( QPolygonF &pts, QVector<QPolygonF> &holes, QgsRenderContext &context, const QgsPolygon &polygon, bool clipToExtent = true, bool correctRingOrientation = false );
758 
763  QgsSymbolLayerList cloneLayers() const SIP_FACTORY;
764 
777  void renderUsingLayer( QgsSymbolLayer *layer, QgsSymbolRenderContext &context, QgsWkbTypes::GeometryType geometryType = QgsWkbTypes::GeometryType::UnknownGeometry, const QPolygonF *points = nullptr, const QVector<QPolygonF> *rings = nullptr );
778 
783  void renderVertexMarker( QPointF pt, QgsRenderContext &context, Qgis::VertexMarkerType currentVertexMarkerType, double currentVertexMarkerSize );
784 
785  Qgis::SymbolType mType;
787 
789  qreal mOpacity = 1.0;
790 
791  Qgis::SymbolRenderHints mRenderHints;
792 
798  Qgis::SymbolFlags mSymbolFlags = Qgis::SymbolFlags();
799 
800  bool mClipFeaturesToExtent = true;
801  bool mForceRHR = false;
802 
803  QgsSymbolAnimationSettings mAnimationSettings;
804 
805  Q_DECL_DEPRECATED const QgsVectorLayer *mLayer = nullptr; //current vectorlayer
806 
807  private:
808 #ifdef SIP_RUN
809  QgsSymbol( const QgsSymbol & );
810 #endif
811 
812  static void initPropertyDefinitions();
813 
815  static QgsPropertiesDefinition sPropertyDefinitions;
816 
821  bool mStarted = false;
822 
824  std::unique_ptr< QgsSymbolRenderContext > mSymbolRenderContext;
825 
826  QgsPropertyCollection mDataDefinedProperties;
827 
831  static QPolygonF _getLineString2d( QgsRenderContext &context, const QgsCurve &curve, bool clipToExtent = true );
832 
836  static QPolygonF _getLineString3d( QgsRenderContext &context, const QgsCurve &curve, bool clipToExtent = true );
837 
844  static QPolygonF _getPolygonRing2d( QgsRenderContext &context, const QgsCurve &curve, bool clipToExtent, bool isExteriorRing = false, bool correctRingOrientation = false );
845 
852  static QPolygonF _getPolygonRing3d( QgsRenderContext &context, const QgsCurve &curve, bool clipToExtent, bool isExteriorRing = false, bool correctRingOrientation = false );
853 
854  Q_DISABLE_COPY( QgsSymbol )
855 
856 };
857 
858 #endif
859 
QgsCurve
Abstract base class for curved geometry type.
Definition: qgscurve.h:35
QgsLineSymbolLayer
Definition: qgssymbollayer.h:1024
QgsExpressionContext
Expression contexts are used to encapsulate the parameters around which a QgsExpression should be eva...
Definition: qgsexpressioncontext.h:406
SIP_PYNAME
#define SIP_PYNAME(name)
Definition: qgis_sip.h:81
QgsSymbol::dataDefinedProperties
const QgsPropertyCollection & dataDefinedProperties() const
Returns a reference to the symbol's property collection, used for data defined overrides.
Definition: qgssymbol.h:629
QgsProperty
A store for object properties.
Definition: qgsproperty.h:230
QgsUnitTypes::RenderUnit
RenderUnit
Rendering size units.
Definition: qgsunittypes.h:167
Qgis::SymbolType::Fill
@ Fill
Fill symbol.
Qgis::SymbolType::Line
@ Line
Line symbol.
Qgis::SymbolPreviewFlag::FlagIncludeCrosshairsForMarkerSymbols
@ FlagIncludeCrosshairsForMarkerSymbols
Include a crosshairs reference image in the background of marker symbol previews.
QgsPolygon
Polygon geometry type.
Definition: qgspolygon.h:33
QgsPoint
Point geometry type, with support for z-dimension and m-values.
Definition: qgspoint.h:48
QgsSymbolAnimationSettings::setIsAnimated
void setIsAnimated(bool animated)
Sets whether the symbol is animated.
Definition: qgssymbol.h:52
QgsFields
Container of fields for a vector layer.
Definition: qgsfields.h:44
QgsFeatureRenderer::type
QString type() const
Definition: qgsrenderer.h:142
QgsSymbol::setDataDefinedProperties
void setDataDefinedProperties(const QgsPropertyCollection &collection)
Sets the symbol's property collection, used for data defined overrides.
Definition: qgssymbol.h:637
qgis.h
QgsRenderContext
Contains information about the context of a rendering operation.
Definition: qgsrendercontext.h:59
QgsFeatureRenderer::usedAttributes
virtual QSet< QString > usedAttributes(const QgsRenderContext &context) const =0
Returns a list of attributes required by this renderer.
QgsSymbolAnimationSettings::frameRate
double frameRate() const
Returns the symbol animation frame rate (in frames per second).
Definition: qgssymbol.h:77
QgsSymbol
Abstract base class for all rendered symbols.
Definition: qgssymbol.h:92
QgsLegendPatchShape
Represents a patch shape for use in map legends.
Definition: qgslegendpatchshape.h:33
QgsFeatureRenderer::stopRender
virtual void stopRender(QgsRenderContext &context)
Must be called when a render cycle has finished, to allow the renderer to clean up.
Definition: qgsrenderer.cpp:110
QgsSymbol::PropertyOpacity
@ PropertyOpacity
Opacity.
Definition: qgssymbol.h:131
SIP_TYPEHINT
#define SIP_TYPEHINT(type)
Definition: qgis_sip.h:227
SIP_TRANSFERBACK
#define SIP_TRANSFERBACK
Definition: qgis_sip.h:48
SIP_FACTORY
#define SIP_FACTORY
Definition: qgis_sip.h:76
QgsSymbolRenderContext
Definition: qgssymbolrendercontext.h:35
SIP_DEPRECATED
#define SIP_DEPRECATED
Definition: qgis_sip.h:106
QgsSymbol::setOpacity
void setOpacity(qreal opacity)
Sets the opacity for the symbol.
Definition: qgssymbol.h:502
SIP_CONVERT_TO_SUBCLASS_CODE
#define SIP_CONVERT_TO_SUBCLASS_CODE(code)
Definition: qgis_sip.h:186
QgsSymbol::setClipFeaturesToExtent
void setClipFeaturesToExtent(bool clipFeaturesToExtent)
Sets whether features drawn by the symbol should be clipped to the render context's extent.
Definition: qgssymbol.h:541
QgsSymbol::opacity
qreal opacity() const
Returns the opacity for the symbol.
Definition: qgssymbol.h:495
QgsSymbol::renderHints
Qgis::SymbolRenderHints renderHints() const
Returns the rendering hint flags for the symbol.
Definition: qgssymbol.h:514
QgsPropertiesDefinition
QMap< int, QgsPropertyDefinition > QgsPropertiesDefinition
Definition of available properties.
Definition: qgspropertycollection.h:29
QgsCsException
Custom exception class for Coordinate Reference System related exceptions.
Definition: qgsexception.h:65
QgsSymbolLayer
Definition: qgssymbollayer.h:54
SIP_SKIP
#define SIP_SKIP
Definition: qgis_sip.h:126
QgsSymbol::flags
Qgis::SymbolFlags flags() const
Returns flags for the symbol.
Definition: qgssymbol.h:530
SIP_THROW
#define SIP_THROW(name)
Definition: qgis_sip.h:198
Qgis::SymbolType
SymbolType
Symbol types.
Definition: qgis.h:205
QgsFeatureRenderer::_getPoint
static QPointF _getPoint(QgsRenderContext &context, const QgsPoint &point)
Creates a point in screen coordinates from a wkb string in map coordinates.
Definition: qgsrenderer.cpp:47
QgsSymbol::type
Qgis::SymbolType type() const
Returns the symbol's type.
Definition: qgssymbol.h:152
QgsFeatureRenderer::clone
virtual QgsFeatureRenderer * clone() const =0
Create a deep copy of this renderer.
QgsSymbol::setRenderHints
void setRenderHints(Qgis::SymbolRenderHints hints)
Sets rendering hint flags for the symbol.
Definition: qgssymbol.h:508
QgsFeatureRenderer::toSld
virtual void toSld(QDomDocument &doc, QDomElement &element, const QVariantMap &props=QVariantMap()) const
used from subclasses to create SLD Rule elements following SLD v1.1 specs
Definition: qgsrenderer.h:326
SIP_TRANSFER
#define SIP_TRANSFER
Definition: qgis_sip.h:36
QgsSymbolAnimationSettings::isAnimated
bool isAnimated() const
Returns true if the symbol is animated.
Definition: qgssymbol.h:63
qgsrendercontext.h
QgsMapUnitScale
Struct for storing maximum and minimum scales for measurements in map units.
Definition: qgsmapunitscale.h:36
QgsSymbol::setForceRHR
void setForceRHR(bool force)
Sets whether polygon features drawn by the symbol should be reoriented to follow the standard right-h...
Definition: qgssymbol.h:563
QgsPropertyCollection
A grouped map of multiple QgsProperty objects, each referenced by a integer key value.
Definition: qgspropertycollection.h:318
QgsFeatureRenderer
Definition: qgsrenderer.h:101
QgsWkbTypes::GeometryType
GeometryType
The geometry types are used to group QgsWkbTypes::Type in a coarse way.
Definition: qgswkbtypes.h:140
QgsSymbol::clipFeaturesToExtent
bool clipFeaturesToExtent() const
Returns whether features drawn by the symbol will be clipped to the render context's extent.
Definition: qgssymbol.h:552
QgsFeatureRenderer::mType
QString mType
Definition: qgsrenderer.h:595
QgsSymbol::Property
Property
Data definable properties.
Definition: qgssymbol.h:129
QgsVectorLayer
Represents a vector layer which manages a vector based data sets.
Definition: qgsvectorlayer.h:391
QgsSymbolLayerList
QList< QgsSymbolLayer * > QgsSymbolLayerList
Definition: qgssymbol.h:27
QgsFeatureRenderer::renderFeature
virtual bool renderFeature(const QgsFeature &feature, QgsRenderContext &context, int layer=-1, bool selected=false, bool drawVertexMarker=false) SIP_THROW(QgsCsException)
Render a feature using this renderer in the given context.
Definition: qgsrenderer.cpp:127
QgsSymbol::setFlags
void setFlags(Qgis::SymbolFlags flags)
Sets flags for the symbol.
Definition: qgssymbol.h:522
QgsFeatureRenderer::renderVertexMarker
void renderVertexMarker(QPointF pt, QgsRenderContext &context)
render editing vertex marker at specified point
Definition: qgsrenderer.cpp:393
qgspropertycollection.h
QgsSymbolAnimationSettings
Contains settings relating to symbol animation.
Definition: qgssymbol.h:39
Qgis
The Qgis class provides global constants for use throughout the application.
Definition: qgis.h:71
QgsSymbolAnimationSettings::setFrameRate
void setFrameRate(double rate)
Sets the symbol animation frame rate (in frames per second).
Definition: qgssymbol.h:70
QgsFeatureRenderer::dump
virtual QString dump() const
Returns debug information about this renderer.
Definition: qgsrenderer.cpp:146
QgsFeature
The feature class encapsulates a single feature including its unique ID, geometry and a list of field...
Definition: qgsfeature.h:55
QgsWkbTypes
Handles storage of information regarding WKB types and their properties.
Definition: qgswkbtypes.h:41
QgsSymbol::symbolLayers
QgsSymbolLayerList symbolLayers()
Returns the list of symbol layers contained in the symbol.
Definition: qgssymbol.h:163
QgsFeatureRenderer::startRender
virtual void startRender(QgsRenderContext &context, const QgsFields &fields)
Must be called when a new render cycle is started.
Definition: qgsrenderer.cpp:96
SIP_END
#define SIP_END
Definition: qgis_sip.h:203
QgsSymbol::forceRHR
bool forceRHR() const
Returns true if polygon features drawn by the symbol will be reoriented to follow the standard right-...
Definition: qgssymbol.h:574
Qgis::SymbolType::Marker
@ Marker
Marker symbol.
QgsSymbol::symbolLayerCount
int symbolLayerCount() const
Returns the total number of symbol layers contained in the symbol.
Definition: qgssymbol.h:215