QGIS API Documentation  3.37.0-Master (a5b4d9743e8)
qgssymbollayer.h
Go to the documentation of this file.
1 /***************************************************************************
2  qgssymbollayer.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 #ifndef QGSSYMBOLLAYER_H
16 #define QGSSYMBOLLAYER_H
17 
18 #define DEG2RAD(x) ((x)*M_PI/180)
19 #define DEFAULT_SCALE_METHOD Qgis::ScaleMethod::ScaleDiameter
20 
21 #include "qgis_core.h"
22 #include "qgis.h"
23 #include "qgsfields.h"
24 #include "qgspropertycollection.h"
25 #include "qgssymbolrendercontext.h"
26 
27 #include <QColor>
28 #include <QMap>
29 #include <QPointF>
30 #include <QSet>
31 #include <QDomDocument>
32 #include <QDomElement>
33 #include <QPainterPath>
34 #include <QImage>
35 
36 class QPainter;
37 class QSize;
38 class QPolygonF;
39 
40 class QgsDxfExport;
41 class QgsExpression;
42 class QgsRenderContext;
43 class QgsPaintEffect;
45 
46 #ifndef SIP_RUN
47 typedef QMap<QString, QString> QgsStringMap;
48 #endif
49 
54 class CORE_EXPORT QgsSymbolLayer
55 {
56 #ifdef SIP_RUN
57 #include <qgslinesymbollayer.h>
58 #endif
59 
60 
61 #ifdef SIP_RUN
63  switch ( sipCpp->type() )
64  {
66  if ( sipCpp->layerType() == "EllipseMarker" )
67  sipType = sipType_QgsEllipseSymbolLayer;
68  else if ( sipCpp->layerType() == "FontMarker" )
69  sipType = sipType_QgsFontMarkerSymbolLayer;
70  else if ( sipCpp->layerType() == "SimpleMarker" )
71  sipType = sipType_QgsSimpleMarkerSymbolLayer;
72  else if ( sipCpp->layerType() == "FilledMarker" )
73  sipType = sipType_QgsFilledMarkerSymbolLayer;
74  else if ( sipCpp->layerType() == "SvgMarker" )
75  sipType = sipType_QgsSvgMarkerSymbolLayer;
76  else if ( sipCpp->layerType() == "RasterMarker" )
77  sipType = sipType_QgsRasterMarkerSymbolLayer;
78  else if ( sipCpp->layerType() == "AnimatedMarker" )
79  sipType = sipType_QgsAnimatedMarkerSymbolLayer;
80  else if ( sipCpp->layerType() == "VectorField" )
81  sipType = sipType_QgsVectorFieldSymbolLayer;
82  else if ( sipCpp->layerType() == "MaskMarker" )
83  sipType = sipType_QgsMaskMarkerSymbolLayer;
84  else
85  sipType = sipType_QgsMarkerSymbolLayer;
86  break;
87 
89  if ( sipCpp->layerType() == "MarkerLine" )
90  sipType = sipType_QgsMarkerLineSymbolLayer;
91  else if ( sipCpp->layerType() == "SimpleLine" )
92  sipType = sipType_QgsSimpleLineSymbolLayer;
93  else if ( sipCpp->layerType() == "HashLine" )
94  sipType = sipType_QgsHashedLineSymbolLayer;
95  else if ( sipCpp->layerType() == "ArrowLine" )
96  sipType = sipType_QgsArrowSymbolLayer;
97  else if ( sipCpp->layerType() == "InterpolatedLine" )
98  sipType = sipType_QgsInterpolatedLineSymbolLayer;
99  else if ( sipCpp->layerType() == "RasterLine" )
100  sipType = sipType_QgsRasterLineSymbolLayer;
101  else if ( sipCpp->layerType() == "Lineburst" )
102  sipType = sipType_QgsLineburstSymbolLayer;
103  else
104  sipType = sipType_QgsLineSymbolLayer;
105  break;
106 
108  if ( sipCpp->layerType() == "SimpleFill" )
109  sipType = sipType_QgsSimpleFillSymbolLayer;
110  else if ( sipCpp->layerType() == "LinePatternFill" )
111  sipType = sipType_QgsLinePatternFillSymbolLayer;
112  else if ( sipCpp->layerType() == "PointPatternFill" )
113  sipType = sipType_QgsPointPatternFillSymbolLayer;
114  else if ( sipCpp->layerType() == "SVGFill" )
115  sipType = sipType_QgsSVGFillSymbolLayer;
116  else if ( sipCpp->layerType() == "RasterFill" )
117  sipType = sipType_QgsRasterFillSymbolLayer;
118  else if ( sipCpp->layerType() == "CentroidFill" )
119  sipType = sipType_QgsCentroidFillSymbolLayer;
120  else if ( sipCpp->layerType() == "GradientFill" )
121  sipType = sipType_QgsGradientFillSymbolLayer;
122  else if ( sipCpp->layerType() == "ShapeburstFill" )
123  sipType = sipType_QgsShapeburstFillSymbolLayer;
124  else if ( sipCpp->layerType() == "RandomMarkerFill" )
125  sipType = sipType_QgsRandomMarkerFillSymbolLayer;
126  else
127  sipType = sipType_QgsFillSymbolLayer;
128  break;
129 
131  sipType = sipType_QgsGeometryGeneratorSymbolLayer;
132  break;
133  }
134  SIP_END
135 #endif
136  public:
137 
138  // *INDENT-OFF*
139 
144  {
145  Size SIP_MONKEYPATCH_COMPAT_NAME( PropertySize ) = 0,
146  Angle SIP_MONKEYPATCH_COMPAT_NAME( PropertyAngle ),
147  Name SIP_MONKEYPATCH_COMPAT_NAME( PropertyName ),
148  FillColor SIP_MONKEYPATCH_COMPAT_NAME( PropertyFillColor ),
149  StrokeColor SIP_MONKEYPATCH_COMPAT_NAME( PropertyStrokeColor ),
150  StrokeWidth SIP_MONKEYPATCH_COMPAT_NAME( PropertyStrokeWidth ),
151  StrokeStyle SIP_MONKEYPATCH_COMPAT_NAME( PropertyStrokeStyle ),
152  Offset SIP_MONKEYPATCH_COMPAT_NAME( PropertyOffset ),
153  Character SIP_MONKEYPATCH_COMPAT_NAME( PropertyCharacter ),
154  Width SIP_MONKEYPATCH_COMPAT_NAME( PropertyWidth ),
155  Height SIP_MONKEYPATCH_COMPAT_NAME( PropertyHeight ),
156  PreserveAspectRatio SIP_MONKEYPATCH_COMPAT_NAME( PropertyPreserveAspectRatio ),
157  FillStyle SIP_MONKEYPATCH_COMPAT_NAME( PropertyFillStyle ),
158  JoinStyle SIP_MONKEYPATCH_COMPAT_NAME( PropertyJoinStyle ),
159  SecondaryColor SIP_MONKEYPATCH_COMPAT_NAME( PropertySecondaryColor ),
160  LineAngle SIP_MONKEYPATCH_COMPAT_NAME( PropertyLineAngle ),
161  LineDistance SIP_MONKEYPATCH_COMPAT_NAME( PropertyLineDistance ),
162  GradientType SIP_MONKEYPATCH_COMPAT_NAME( PropertyGradientType ),
163  CoordinateMode SIP_MONKEYPATCH_COMPAT_NAME( PropertyCoordinateMode ),
164  GradientSpread SIP_MONKEYPATCH_COMPAT_NAME( PropertyGradientSpread ),
165  GradientReference1X SIP_MONKEYPATCH_COMPAT_NAME( PropertyGradientReference1X ),
166  GradientReference1Y SIP_MONKEYPATCH_COMPAT_NAME( PropertyGradientReference1Y ),
167  GradientReference2X SIP_MONKEYPATCH_COMPAT_NAME( PropertyGradientReference2X ),
168  GradientReference2Y SIP_MONKEYPATCH_COMPAT_NAME( PropertyGradientReference2Y ),
169  GradientReference1IsCentroid SIP_MONKEYPATCH_COMPAT_NAME( PropertyGradientReference1IsCentroid ),
170  GradientReference2IsCentroid SIP_MONKEYPATCH_COMPAT_NAME( PropertyGradientReference2IsCentroid ),
171  BlurRadius SIP_MONKEYPATCH_COMPAT_NAME( PropertyBlurRadius ),
172  ShapeburstUseWholeShape SIP_MONKEYPATCH_COMPAT_NAME( PropertyShapeburstUseWholeShape ),
173  ShapeburstMaxDistance SIP_MONKEYPATCH_COMPAT_NAME( PropertyShapeburstMaxDistance ),
174  ShapeburstIgnoreRings SIP_MONKEYPATCH_COMPAT_NAME( PropertyShapeburstIgnoreRings ),
175  File SIP_MONKEYPATCH_COMPAT_NAME( PropertyFile ),
176  DistanceX SIP_MONKEYPATCH_COMPAT_NAME( PropertyDistanceX ),
177  DistanceY SIP_MONKEYPATCH_COMPAT_NAME( PropertyDistanceY ),
178  DisplacementX SIP_MONKEYPATCH_COMPAT_NAME( PropertyDisplacementX ),
179  DisplacementY SIP_MONKEYPATCH_COMPAT_NAME( PropertyDisplacementY ),
180  Opacity SIP_MONKEYPATCH_COMPAT_NAME( PropertyOpacity ),
181  CustomDash SIP_MONKEYPATCH_COMPAT_NAME( PropertyCustomDash ),
182  CapStyle SIP_MONKEYPATCH_COMPAT_NAME( PropertyCapStyle ),
183  Placement SIP_MONKEYPATCH_COMPAT_NAME( PropertyPlacement ),
184  Interval SIP_MONKEYPATCH_COMPAT_NAME( PropertyInterval ),
185  OffsetAlongLine SIP_MONKEYPATCH_COMPAT_NAME( PropertyOffsetAlongLine ),
186  AverageAngleLength SIP_MONKEYPATCH_COMPAT_NAME( PropertyAverageAngleLength ),
187  HorizontalAnchor SIP_MONKEYPATCH_COMPAT_NAME( PropertyHorizontalAnchor ),
188  VerticalAnchor SIP_MONKEYPATCH_COMPAT_NAME( PropertyVerticalAnchor ),
189  LayerEnabled SIP_MONKEYPATCH_COMPAT_NAME( PropertyLayerEnabled ),
190  ArrowWidth SIP_MONKEYPATCH_COMPAT_NAME( PropertyArrowWidth ),
191  ArrowStartWidth SIP_MONKEYPATCH_COMPAT_NAME( PropertyArrowStartWidth ),
192  ArrowHeadLength SIP_MONKEYPATCH_COMPAT_NAME( PropertyArrowHeadLength ),
193  ArrowHeadThickness SIP_MONKEYPATCH_COMPAT_NAME( PropertyArrowHeadThickness ),
194  ArrowHeadType SIP_MONKEYPATCH_COMPAT_NAME( PropertyArrowHeadType ),
195  ArrowType SIP_MONKEYPATCH_COMPAT_NAME( PropertyArrowType ),
196  OffsetX SIP_MONKEYPATCH_COMPAT_NAME( PropertyOffsetX ),
197  OffsetY SIP_MONKEYPATCH_COMPAT_NAME( PropertyOffsetY ),
198  PointCount SIP_MONKEYPATCH_COMPAT_NAME( PropertyPointCount ),
199  RandomSeed SIP_MONKEYPATCH_COMPAT_NAME( PropertyRandomSeed ),
200  ClipPoints SIP_MONKEYPATCH_COMPAT_NAME( PropertyClipPoints ),
201  DensityArea SIP_MONKEYPATCH_COMPAT_NAME( PropertyDensityArea ),
202  FontFamily SIP_MONKEYPATCH_COMPAT_NAME( PropertyFontFamily ),
203  FontStyle SIP_MONKEYPATCH_COMPAT_NAME( PropertyFontStyle ),
204  DashPatternOffset SIP_MONKEYPATCH_COMPAT_NAME( PropertyDashPatternOffset ),
205  TrimStart SIP_MONKEYPATCH_COMPAT_NAME( PropertyTrimStart ),
206  TrimEnd SIP_MONKEYPATCH_COMPAT_NAME( PropertyTrimEnd ),
207  LineStartWidthValue SIP_MONKEYPATCH_COMPAT_NAME( PropertyLineStartWidthValue ),
208  LineEndWidthValue SIP_MONKEYPATCH_COMPAT_NAME( PropertyLineEndWidthValue ),
209  LineStartColorValue SIP_MONKEYPATCH_COMPAT_NAME( PropertyLineStartColorValue ),
210  LineEndColorValue SIP_MONKEYPATCH_COMPAT_NAME( PropertyLineEndColorValue ),
211  MarkerClipping SIP_MONKEYPATCH_COMPAT_NAME( PropertyMarkerClipping ),
212  RandomOffsetX SIP_MONKEYPATCH_COMPAT_NAME( PropertyRandomOffsetX ),
213  RandomOffsetY SIP_MONKEYPATCH_COMPAT_NAME( PropertyRandomOffsetY ),
214  LineClipping SIP_MONKEYPATCH_COMPAT_NAME( PropertyLineClipping ),
215  };
216  // *INDENT-ON*
217 
221  static const QgsPropertiesDefinition &propertyDefinitions();
222 
223  virtual ~QgsSymbolLayer();
224 
226  QgsSymbolLayer( const QgsSymbolLayer &other ) = delete;
227 
229  QgsSymbolLayer &operator=( const QgsSymbolLayer &other ) = delete;
230 
236  virtual Qgis::SymbolLayerFlags flags() const;
237 
242  bool enabled() const { return mEnabled; }
243 
250  void setEnabled( bool enabled ) { mEnabled = enabled; }
251 
258  Qgis::SymbolLayerUserFlags userFlags() const;
259 
266  void setUserFlags( Qgis::SymbolLayerUserFlags flags );
267 
282  virtual QColor color() const;
283 
295  virtual void setColor( const QColor &color );
296 
307  virtual void setStrokeColor( const QColor &color );
308 
320  virtual QColor strokeColor() const;
321 
332  virtual void setFillColor( const QColor &color );
333 
345  virtual QColor fillColor() const;
346 
351  virtual QString layerType() const = 0;
352 
365  virtual void startRender( QgsSymbolRenderContext &context ) = 0;
366 
378  virtual void stopRender( QgsSymbolRenderContext &context ) = 0;
379 
398  virtual void startFeatureRender( const QgsFeature &feature, QgsRenderContext &context );
399 
418  virtual void stopFeatureRender( const QgsFeature &feature, QgsRenderContext &context );
419 
423  virtual QgsSymbolLayer *clone() const = 0 SIP_FACTORY;
424 
426  virtual void toSld( QDomDocument &doc, QDomElement &element, const QVariantMap &props ) const
427  { Q_UNUSED( props ) element.appendChild( doc.createComment( QStringLiteral( "SymbolLayerV2 %1 not implemented yet" ).arg( layerType() ) ) ); }
428 
429  virtual QString ogrFeatureStyle( double mmScaleFactor, double mapUnitScaleFactor ) const { Q_UNUSED( mmScaleFactor ) Q_UNUSED( mapUnitScaleFactor ); return QString(); }
430 
436  virtual QVariantMap properties() const = 0;
437 
438  virtual void drawPreviewIcon( QgsSymbolRenderContext &context, QSize size ) = 0;
439 
443  virtual QgsSymbol *subSymbol();
444 
446  virtual bool setSubSymbol( QgsSymbol *symbol SIP_TRANSFER );
447 
448  Qgis::SymbolType type() const { return mType; }
449 
451  virtual bool isCompatibleWithSymbol( QgsSymbol *symbol ) const;
452 
461  virtual bool canCauseArtifactsBetweenAdjacentTiles() const;
462 
470  void setLocked( bool locked ) { mLocked = locked; }
471 
477  bool isLocked() const { return mLocked; }
478 
486  virtual double estimateMaxBleed( const QgsRenderContext &context ) const { Q_UNUSED( context ) return 0; }
487 
496  virtual void setOutputUnit( Qgis::RenderUnit unit ) { Q_UNUSED( unit ) }
497 
507 
513  virtual bool usesMapUnits() const;
514 
515  virtual void setMapUnitScale( const QgsMapUnitScale &scale ) { Q_UNUSED( scale ) }
516  virtual QgsMapUnitScale mapUnitScale() const { return QgsMapUnitScale(); }
517 
524  void setRenderingPass( int renderingPass );
525 
532  int renderingPass() const;
533 
538  virtual QSet<QString> usedAttributes( const QgsRenderContext &context ) const;
539 
546  virtual void setDataDefinedProperty( Property key, const QgsProperty &property );
547 
549  virtual bool writeDxf( QgsDxfExport &e, double mmMapUnitScaleFactor, const QString &layerName, QgsSymbolRenderContext &context, QPointF shift = QPointF( 0.0, 0.0 ) ) const;
550 
552  virtual double dxfWidth( const QgsDxfExport &e, QgsSymbolRenderContext &context ) const;
553 
555  virtual double dxfSize( const QgsDxfExport &e, QgsSymbolRenderContext &context ) const;
556 
558  virtual double dxfOffset( const QgsDxfExport &e, QgsSymbolRenderContext &context ) const;
559 
561  virtual QColor dxfColor( QgsSymbolRenderContext &context ) const;
562 
564  virtual double dxfAngle( QgsSymbolRenderContext &context ) const;
565 
567  virtual QVector<qreal> dxfCustomDashPattern( Qgis::RenderUnit &unit ) const;
568 
570  virtual Qt::PenStyle dxfPenStyle() const;
571 
573  virtual QColor dxfBrushColor( QgsSymbolRenderContext &context ) const;
574 
576  virtual Qt::BrushStyle dxfBrushStyle() const;
577 
583  QgsPaintEffect *paintEffect() const;
584 
590  void setPaintEffect( QgsPaintEffect *effect SIP_TRANSFER );
591 
597  virtual void prepareExpressions( const QgsSymbolRenderContext &context );
598 
604  QgsPropertyCollection &dataDefinedProperties() { return mDataDefinedProperties; }
605 
610  const QgsPropertyCollection &dataDefinedProperties() const { return mDataDefinedProperties; } SIP_SKIP
611 
617  void setDataDefinedProperties( const QgsPropertyCollection &collection ) { mDataDefinedProperties = collection; }
618 
624  virtual bool hasDataDefinedProperties() const;
625 
631  virtual QList<QgsSymbolLayerReference> masks() const;
632 
640  virtual void prepareMasks( const QgsSymbolRenderContext &context );
641 
647  void setId( const QString &id );
648 
654  QString id() const;
655 
656  protected:
657 
663  QgsSymbolLayer( Qgis::SymbolType type, bool locked = false );
664 
666 
668  bool mEnabled = true;
669 
672 
673  bool mLocked = false;
674  QColor mColor;
675  int mRenderingPass = 0;
676  QString mId;
678 
679  std::unique_ptr< QgsPaintEffect > mPaintEffect;
681 
682  // clip path to be used during rendering
683  QPainterPath mClipPath;
684 
685  // Configuration of selected symbology implementation
687  static const bool SELECTION_IS_OPAQUE = true;
689  static const bool SELECT_FILL_BORDER = false;
691  static const bool SELECT_FILL_STYLE = false;
692 
696  void restoreOldDataDefinedProperties( const QVariantMap &stringMap );
697 
702  void copyDataDefinedProperties( QgsSymbolLayer *destLayer ) const;
703 
708  void copyPaintEffect( QgsSymbolLayer *destLayer ) const;
709 
717  void installMasks( QgsRenderContext &context, bool recursive );
718 
726  void removeMasks( QgsRenderContext &context, bool recursive );
727 
734  bool shouldRenderUsingSelectionColor( const QgsSymbolRenderContext &context ) const;
735 
736  private:
737  static void initPropertyDefinitions();
738 
740  static QgsPropertiesDefinition sPropertyDefinitions;
741 
742 #ifdef SIP_RUN
743  QgsSymbolLayer( const QgsSymbolLayer &other );
744 #endif
745 
746 };
747 
749 
755 class CORE_EXPORT QgsMarkerSymbolLayer : public QgsSymbolLayer
756 {
757  public:
758 
761  {
765  };
766 
769  {
770  Top,
773  };
774 
776  QgsMarkerSymbolLayer( const QgsMarkerSymbolLayer &other ) = delete;
777 
780 
781  void startRender( QgsSymbolRenderContext &context ) override;
782 
783  void stopRender( QgsSymbolRenderContext &context ) override;
784 
791  virtual void renderPoint( QPointF point, QgsSymbolRenderContext &context ) = 0;
792 
793  void drawPreviewIcon( QgsSymbolRenderContext &context, QSize size ) override;
794 
801  void setAngle( double angle ) { mAngle = angle; }
802 
807  double angle() const { return mAngle; }
808 
817  void setLineAngle( double lineAngle ) { mLineAngle = lineAngle; }
818 
826  virtual void setSize( double size ) { mSize = size; }
827 
834  double size() const { return mSize; }
835 
843  void setSizeUnit( Qgis::RenderUnit unit ) { mSizeUnit = unit; }
844 
851  Qgis::RenderUnit sizeUnit() const { return mSizeUnit; }
852 
860  void setSizeMapUnitScale( const QgsMapUnitScale &scale ) { mSizeMapUnitScale = scale; }
861 
868  const QgsMapUnitScale &sizeMapUnitScale() const { return mSizeMapUnitScale; }
869 
875  void setScaleMethod( Qgis::ScaleMethod scaleMethod ) { mScaleMethod = scaleMethod; }
876 
881  Qgis::ScaleMethod scaleMethod() const { return mScaleMethod; }
882 
891  void setOffset( QPointF offset ) { mOffset = offset; }
892 
900  QPointF offset() const { return mOffset; }
901 
909  void setOffsetUnit( Qgis::RenderUnit unit ) { mOffsetUnit = unit; }
910 
917  Qgis::RenderUnit offsetUnit() const { return mOffsetUnit; }
918 
926  void setOffsetMapUnitScale( const QgsMapUnitScale &scale ) { mOffsetMapUnitScale = scale; }
927 
934  const QgsMapUnitScale &offsetMapUnitScale() const { return mOffsetMapUnitScale; }
935 
943  void setHorizontalAnchorPoint( HorizontalAnchorPoint h ) { mHorizontalAnchorPoint = h; }
944 
951  HorizontalAnchorPoint horizontalAnchorPoint() const { return mHorizontalAnchorPoint; }
952 
960  void setVerticalAnchorPoint( VerticalAnchorPoint v ) { mVerticalAnchorPoint = v; }
961 
968  VerticalAnchorPoint verticalAnchorPoint() const { return mVerticalAnchorPoint; }
969 
970  void toSld( QDomDocument &doc, QDomElement &element, const QVariantMap &props ) const override;
971 
978  virtual void writeSldMarker( QDomDocument &doc, QDomElement &element, const QVariantMap &props ) const
979  { Q_UNUSED( props ) element.appendChild( doc.createComment( QStringLiteral( "QgsMarkerSymbolLayer %1 not implemented yet" ).arg( layerType() ) ) ); }
980 
981  void setOutputUnit( Qgis::RenderUnit unit ) override;
982  Qgis::RenderUnit outputUnit() const override;
983  void setMapUnitScale( const QgsMapUnitScale &scale ) override;
984  QgsMapUnitScale mapUnitScale() const override;
985  virtual double dxfSize( const QgsDxfExport &e, QgsSymbolRenderContext &context ) const override;
986  virtual double dxfAngle( QgsSymbolRenderContext &context ) const override;
987 
993  virtual QRectF bounds( QPointF point, QgsSymbolRenderContext &context ) = 0;
994 
995  protected:
996 
1001  QgsMarkerSymbolLayer( bool locked = false );
1002 
1010  void markerOffset( QgsSymbolRenderContext &context, double &offsetX, double &offsetY ) const;
1011 
1022  void markerOffset( QgsSymbolRenderContext &context, double width, double height, double &offsetX, double &offsetY ) const SIP_PYNAME( markerOffsetWithWidthAndHeight );
1023 
1025  void markerOffset( QgsSymbolRenderContext &context, double width, double height,
1026  Qgis::RenderUnit widthUnit, Qgis::RenderUnit heightUnit,
1027  double &offsetX, double &offsetY,
1028  const QgsMapUnitScale &widthMapUnitScale, const QgsMapUnitScale &heightMapUnitScale ) const SIP_PYNAME( markerOffset2 );
1029 
1036  static QPointF _rotatedOffset( QPointF offset, double angle );
1037 
1039  double mAngle = 0;
1041  double mLineAngle = 0;
1043  double mSize = 2.0;
1049  QPointF mOffset;
1057  HorizontalAnchorPoint mHorizontalAnchorPoint = HCenter;
1059  VerticalAnchorPoint mVerticalAnchorPoint = VCenter;
1060 
1061  private:
1062  static QgsMarkerSymbolLayer::HorizontalAnchorPoint decodeHorizontalAnchorPoint( const QString &str );
1063  static QgsMarkerSymbolLayer::VerticalAnchorPoint decodeVerticalAnchorPoint( const QString &str );
1064 
1065 #ifdef SIP_RUN
1067 #endif
1068 };
1069 
1074 class CORE_EXPORT QgsLineSymbolLayer : public QgsSymbolLayer
1075 {
1076  public:
1077 
1080  {
1084  };
1085 
1087  QgsLineSymbolLayer( const QgsLineSymbolLayer &other ) = delete;
1088 
1091 
1092  void setOutputUnit( Qgis::RenderUnit unit ) override;
1093  Qgis::RenderUnit outputUnit() const override;
1094  void setMapUnitScale( const QgsMapUnitScale &scale ) override;
1095  QgsMapUnitScale mapUnitScale() const override;
1096  void drawPreviewIcon( QgsSymbolRenderContext &context, QSize size ) override;
1097  double dxfWidth( const QgsDxfExport &e, QgsSymbolRenderContext &context ) const override;
1098 
1103  virtual void renderPolyline( const QPolygonF &points, QgsSymbolRenderContext &context ) = 0;
1104 
1113  virtual void renderPolygonStroke( const QPolygonF &points, const QVector<QPolygonF> *rings, QgsSymbolRenderContext &context );
1114 
1128  virtual void setWidth( double width ) { mWidth = width; }
1129 
1139  virtual double width() const { return mWidth; }
1140 
1151  virtual double width( const QgsRenderContext &context ) const;
1152 
1162  double offset() const { return mOffset; }
1163 
1173  void setOffset( double offset ) { mOffset = offset; }
1174 
1181  void setOffsetUnit( Qgis::RenderUnit unit ) { mOffsetUnit = unit; }
1182 
1189  Qgis::RenderUnit offsetUnit() const { return mOffsetUnit; }
1190 
1197  void setOffsetMapUnitScale( const QgsMapUnitScale &scale ) { mOffsetMapUnitScale = scale; }
1198 
1205  const QgsMapUnitScale &offsetMapUnitScale() const { return mOffsetMapUnitScale; }
1206 
1207  // TODO QGIS 4.0 - setWidthUnit(), widthUnit(), setWidthUnitScale(), widthUnitScale()
1208  // only apply to simple line symbol layers and do not belong here.
1209 
1215  void setWidthUnit( Qgis::RenderUnit unit ) { mWidthUnit = unit; }
1216 
1221  Qgis::RenderUnit widthUnit() const { return mWidthUnit; }
1222 
1223  void setWidthMapUnitScale( const QgsMapUnitScale &scale ) { mWidthMapUnitScale = scale; }
1224  const QgsMapUnitScale &widthMapUnitScale() const { return mWidthMapUnitScale; }
1225 
1236  RenderRingFilter ringFilter() const;
1237 
1248  void setRingFilter( QgsLineSymbolLayer::RenderRingFilter filter );
1249 
1250  protected:
1251  QgsLineSymbolLayer( bool locked = false );
1252 
1253  double mWidth = 0;
1256  double mOffset = 0;
1259 
1260  RenderRingFilter mRingFilter = AllRings;
1261 
1262  private:
1263 #ifdef SIP_RUN
1264  QgsLineSymbolLayer( const QgsLineSymbolLayer &other );
1265 #endif
1266 };
1267 
1272 class CORE_EXPORT QgsFillSymbolLayer : public QgsSymbolLayer
1273 {
1274  public:
1275 
1277  QgsFillSymbolLayer( const QgsFillSymbolLayer &other ) = delete;
1278 
1281 
1287  virtual void renderPolygon( const QPolygonF &points, const QVector<QPolygonF> *rings, QgsSymbolRenderContext &context ) = 0;
1288 
1289  void drawPreviewIcon( QgsSymbolRenderContext &context, QSize size ) override;
1290 
1298  void setAngle( double angle ) { mAngle = angle; }
1299 
1307  double angle() const { return mAngle; }
1308 
1319  virtual QImage toTiledPatternImage( ) const;
1320 
1321  protected:
1322  QgsFillSymbolLayer( bool locked = false );
1324  void _renderPolygon( QPainter *p, const QPolygonF &points, const QVector<QPolygonF> *rings, QgsSymbolRenderContext &context );
1325 
1326  double mAngle = 0.0;
1327 
1328  private:
1329 #ifdef SIP_RUN
1330  QgsFillSymbolLayer( const QgsFillSymbolLayer &other );
1331 #endif
1332 };
1333 
1334 class QgsSymbolLayerWidget; // why does SIP fail, when this isn't here
1335 
1336 #endif
ScaleMethod
Scale methods.
Definition: qgis.h:415
@ ScaleDiameter
Calculate scale by the diameter.
QFlags< SymbolLayerFlag > SymbolLayerFlags
Symbol layer flags.
Definition: qgis.h:623
QFlags< SymbolLayerUserFlag > SymbolLayerUserFlags
Symbol layer user flags.
Definition: qgis.h:646
RenderUnit
Rendering size units.
Definition: qgis.h:4221
@ Millimeters
Millimeters.
@ Unknown
Mixed or unknown units.
SymbolType
Symbol types.
Definition: qgis.h:401
@ Marker
Marker symbol.
@ Line
Line symbol.
@ Fill
Fill symbol.
@ Hybrid
Hybrid symbol.
Exports QGIS layers to the DXF format.
Definition: qgsdxfexport.h:66
Class for parsing and evaluation of expressions (formerly called "search strings").
The feature class encapsulates a single feature including its unique ID, geometry and a list of field...
Definition: qgsfeature.h:56
Container of fields for a vector layer.
Definition: qgsfields.h:45
virtual void renderPolygon(const QPolygonF &points, const QVector< QPolygonF > *rings, QgsSymbolRenderContext &context)=0
Renders the fill symbol layer for the polygon whose outer ring is defined by points,...
double angle() const
Returns the rotation angle of the fill symbol, in degrees clockwise.
QgsFillSymbolLayer & operator=(const QgsFillSymbolLayer &other)=delete
QgsFillSymbolLayer cannot be copied.
void setAngle(double angle)
Sets the rotation angle of the pattern, in degrees clockwise.
QgsFillSymbolLayer(const QgsFillSymbolLayer &other)=delete
QgsFillSymbolLayer cannot be copied.
RenderRingFilter
Options for filtering rings when the line symbol layer is being used to render a polygon's rings.
@ ExteriorRingOnly
Render the exterior ring only.
@ InteriorRingsOnly
Render the interior rings only.
@ AllRings
Render both exterior and interior rings.
QgsMapUnitScale mWidthMapUnitScale
virtual void setWidth(double width)
Sets the width of the line symbol layer.
const QgsMapUnitScale & offsetMapUnitScale() const
Returns the map unit scale for the line's offset.
QgsLineSymbolLayer(const QgsLineSymbolLayer &other)=delete
QgsLineSymbolLayer cannot be copied.
void setWidthMapUnitScale(const QgsMapUnitScale &scale)
void setOffset(double offset)
Sets the line's offset.
virtual void renderPolyline(const QPolygonF &points, QgsSymbolRenderContext &context)=0
Renders the line symbol layer along the line joining points, using the given render context.
void setOffsetUnit(Qgis::RenderUnit unit)
Sets the unit for the line's offset.
void setWidthUnit(Qgis::RenderUnit unit)
Sets the units for the line's width.
virtual double width() const
Returns the estimated width for the line symbol layer.
QgsMapUnitScale mOffsetMapUnitScale
void setOffsetMapUnitScale(const QgsMapUnitScale &scale)
Sets the map unit scale for the line's offset.
double offset() const
Returns the line's offset.
const QgsMapUnitScale & widthMapUnitScale() const
Qgis::RenderUnit offsetUnit() const
Returns the units for the line's offset.
QgsLineSymbolLayer & operator=(const QgsLineSymbolLayer &other)=delete
QgsLineSymbolLayer cannot be copied.
Qgis::RenderUnit widthUnit() const
Returns the units for the line's width.
Struct for storing maximum and minimum scales for measurements in map units.
Abstract base class for marker symbol layers.
virtual void setSize(double size)
Sets the symbol size.
virtual QRectF bounds(QPointF point, QgsSymbolRenderContext &context)=0
Returns the approximate bounding box of the marker symbol layer, taking into account any data defined...
QPointF offset() const
Returns the marker's offset, which is the horizontal and vertical displacement which the rendered mar...
HorizontalAnchorPoint
Symbol horizontal anchor points.
@ Right
Align to right side of symbol.
@ HCenter
Align to horizontal center of symbol.
@ Left
Align to left side of symbol.
void setOffsetUnit(Qgis::RenderUnit unit)
Sets the units for the symbol's offset.
void setAngle(double angle)
Sets the rotation angle for the marker.
Qgis::ScaleMethod scaleMethod() const
Returns the method to use for scaling the marker's size.
QgsMarkerSymbolLayer & operator=(const QgsMarkerSymbolLayer &other)=delete
QgsMarkerSymbolLayer cannot be copied.
void setVerticalAnchorPoint(VerticalAnchorPoint v)
Sets the vertical anchor point for positioning the symbol.
virtual void renderPoint(QPointF point, QgsSymbolRenderContext &context)=0
Renders a marker at the specified point.
QPointF mOffset
Marker offset.
void setHorizontalAnchorPoint(HorizontalAnchorPoint h)
Sets the horizontal anchor point for positioning the symbol.
void setOffset(QPointF offset)
Sets the marker's offset, which is the horizontal and vertical displacement which the rendered marker...
void setSizeMapUnitScale(const QgsMapUnitScale &scale)
Sets the map unit scale for the symbol's size.
const QgsMapUnitScale & offsetMapUnitScale() const
Returns the map unit scale for the symbol's offset.
void setLineAngle(double lineAngle)
Sets the line angle modification for the symbol's angle.
double size() const
Returns the symbol size.
QgsMapUnitScale mOffsetMapUnitScale
Offset map unit scale.
QgsMarkerSymbolLayer(const QgsMarkerSymbolLayer &other)=delete
QgsMarkerSymbolLayer cannot be copied.
Qgis::RenderUnit offsetUnit() const
Returns the units for the symbol's offset.
void setScaleMethod(Qgis::ScaleMethod scaleMethod)
Sets the method to use for scaling the marker's size.
VerticalAnchorPoint verticalAnchorPoint() const
Returns the vertical anchor point for positioning the symbol.
QgsMapUnitScale mSizeMapUnitScale
Marker size map unit scale.
Qgis::RenderUnit sizeUnit() const
Returns the units for the symbol's size.
HorizontalAnchorPoint horizontalAnchorPoint() const
Returns the horizontal anchor point for positioning the symbol.
void setSizeUnit(Qgis::RenderUnit unit)
Sets the units for the symbol's size.
VerticalAnchorPoint
Symbol vertical anchor points.
@ VCenter
Align to vertical center of symbol.
@ Bottom
Align to bottom of symbol.
@ Top
Align to top of symbol.
const QgsMapUnitScale & sizeMapUnitScale() const
Returns the map unit scale for the symbol's size.
virtual void writeSldMarker(QDomDocument &doc, QDomElement &element, const QVariantMap &props) const
Writes the symbol layer definition as a SLD XML element.
void setOffsetMapUnitScale(const QgsMapUnitScale &scale)
Sets the map unit scale for the symbol's offset.
double angle() const
Returns the rotation angle for the marker, in degrees clockwise from north.
Base class for visual effects which can be applied to QPicture drawings.
A grouped map of multiple QgsProperty objects, each referenced by a integer key value.
A store for object properties.
Definition: qgsproperty.h:228
Contains information about the context of a rendering operation.
Type used to refer to a specific symbol layer in a symbol of a layer.
QgsFields mFields
Qgis::SymbolType type() const
QgsSymbolLayer & operator=(const QgsSymbolLayer &other)=delete
QgsSymbolLayer cannot be copied.
QPainterPath mClipPath
bool isLocked() const
Returns true if the symbol layer colors are locked and the layer will ignore any symbol-level color c...
virtual QgsMapUnitScale mapUnitScale() const
Qgis::SymbolType mType
Property
Data definable properties.
virtual void toSld(QDomDocument &doc, QDomElement &element, const QVariantMap &props) const
Saves the symbol layer as SLD.
virtual double estimateMaxBleed(const QgsRenderContext &context) const
Returns the estimated maximum distance which the layer style will bleed outside the drawn shape when ...
virtual void startRender(QgsSymbolRenderContext &context)=0
Called before a set of rendering operations commences on the supplied render context.
QgsSymbolLayer(const QgsSymbolLayer &other)=delete
QgsSymbolLayer cannot be copied.
void setEnabled(bool enabled)
Sets whether symbol layer is enabled and should be drawn.
virtual QgsSymbolLayer * clone() const =0
Shall be reimplemented by subclasses to create a deep copy of the instance.
virtual QVariantMap properties() const =0
Should be reimplemented by subclasses to return a string map that contains the configuration informat...
std::unique_ptr< QgsPaintEffect > mPaintEffect
bool enabled() const
Returns true if symbol layer is enabled and will be drawn.
virtual QString layerType() const =0
Returns a string that represents this layer type.
virtual void stopRender(QgsSymbolRenderContext &context)=0
Called after a set of rendering operations has finished on the supplied render context.
virtual QString ogrFeatureStyle(double mmScaleFactor, double mapUnitScaleFactor) const
virtual Qgis::RenderUnit outputUnit() const
Returns the units to use for sizes and widths within the symbol layer.
Qgis::SymbolLayerUserFlags mUserFlags
User controlled flags.
void setLocked(bool locked)
Sets whether the layer's colors are locked.
virtual void setMapUnitScale(const QgsMapUnitScale &scale)
virtual ~QgsSymbolLayer()
virtual void setOutputUnit(Qgis::RenderUnit unit)
Sets the units to use for sizes and widths within the symbol layer.
const QgsPropertyCollection & dataDefinedProperties() const
Returns a reference to the symbol layer's property collection, used for data defined overrides.
QgsPropertyCollection & dataDefinedProperties()
Returns a reference to the symbol layer's property collection, used for data defined overrides.
virtual void drawPreviewIcon(QgsSymbolRenderContext &context, QSize size)=0
QgsPropertyCollection mDataDefinedProperties
void setDataDefinedProperties(const QgsPropertyCollection &collection)
Sets the symbol layer's property collection, used for data defined overrides.
Abstract base class for all rendered symbols.
Definition: qgssymbol.h:94
double ANALYSIS_EXPORT angle(QgsPoint *p1, QgsPoint *p2, QgsPoint *p3, QgsPoint *p4)
Calculates the angle between two segments (in 2 dimension, z-values are ignored)
Definition: MathUtils.cpp:716
#define str(x)
Definition: qgis.cpp:38
#define SIP_CONVERT_TO_SUBCLASS_CODE(code)
Definition: qgis_sip.h:191
#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_FACTORY
Definition: qgis_sip.h:76
#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.
QMap< QString, QString > QgsStringMap