QGIS API Documentation 3.43.0-Master (ac9f54ad1f7)
qgssymbollayer.cpp
Go to the documentation of this file.
1/***************************************************************************
2 qgssymbollayer.cpp
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#include "qgssymbollayer.h"
17#include "qgsrendercontext.h"
18#include "qgsdxfexport.h"
20#include "qgspainteffect.h"
22#include "qgsproperty.h"
24#include "qgssymbollayerutils.h"
25#include "qgslegendpatchshape.h"
26#include "qgsstyle.h"
28#include "qgssymbol.h"
30#include "qgsgeos.h"
31#include "qgssldexportcontext.h"
32
33#include <QSize>
34#include <QPainter>
35#include <QPointF>
36#include <QPolygonF>
37#include <QUuid>
38
39QgsPropertiesDefinition QgsSymbolLayer::sPropertyDefinitions;
40
41void QgsSymbolLayer::initPropertyDefinitions()
42{
43 if ( !sPropertyDefinitions.isEmpty() )
44 return;
45
46 QString origin = QStringLiteral( "symbol" );
47
48 sPropertyDefinitions = QgsPropertiesDefinition
49 {
50 { static_cast< int >( QgsSymbolLayer::Property::Size ), QgsPropertyDefinition( "size", QObject::tr( "Symbol size" ), QgsPropertyDefinition::Size, origin ) },
51 { static_cast< int >( QgsSymbolLayer::Property::Angle ), QgsPropertyDefinition( "angle", QObject::tr( "Rotation angle" ), QgsPropertyDefinition::Rotation, origin ) },
52 { static_cast< int >( QgsSymbolLayer::Property::Name ), QgsPropertyDefinition( "name", QObject::tr( "Symbol name" ), QgsPropertyDefinition::String, origin ) },
53 { static_cast< int >( QgsSymbolLayer::Property::FillColor ), QgsPropertyDefinition( "fillColor", QObject::tr( "Symbol fill color" ), QgsPropertyDefinition::ColorWithAlpha, origin ) },
54 { static_cast< int >( QgsSymbolLayer::Property::StrokeColor ), QgsPropertyDefinition( "outlineColor", QObject::tr( "Symbol stroke color" ), QgsPropertyDefinition::ColorWithAlpha, origin ) },
55 { static_cast< int >( QgsSymbolLayer::Property::StrokeWidth ), QgsPropertyDefinition( "outlineWidth", QObject::tr( "Symbol stroke width" ), QgsPropertyDefinition::StrokeWidth, origin ) },
56 { static_cast< int >( QgsSymbolLayer::Property::StrokeStyle ), QgsPropertyDefinition( "outlineStyle", QObject::tr( "Symbol stroke style" ), QgsPropertyDefinition::LineStyle, origin )},
57 { static_cast< int >( QgsSymbolLayer::Property::Offset ), QgsPropertyDefinition( "offset", QObject::tr( "Symbol offset" ), QgsPropertyDefinition::Offset, origin )},
58 { static_cast< int >( QgsSymbolLayer::Property::Character ), QgsPropertyDefinition( "char", QObject::tr( "Marker character(s)" ), QgsPropertyDefinition::String, origin )},
59 { static_cast< int >( QgsSymbolLayer::Property::FontFamily ), QgsPropertyDefinition( "fontFamily", QObject::tr( "Font family" ), QgsPropertyDefinition::String, origin )},
60 { static_cast< int >( QgsSymbolLayer::Property::FontStyle ), QgsPropertyDefinition( "fontStyle", QObject::tr( "Font style" ), QgsPropertyDefinition::String, origin )},
61 { static_cast< int >( QgsSymbolLayer::Property::Width ), QgsPropertyDefinition( "width", QObject::tr( "Symbol width" ), QgsPropertyDefinition::DoublePositive, origin )},
62 { static_cast< int >( QgsSymbolLayer::Property::Height ), QgsPropertyDefinition( "height", QObject::tr( "Symbol height" ), QgsPropertyDefinition::DoublePositive, origin )},
63 { static_cast< int >( QgsSymbolLayer::Property::PreserveAspectRatio ), QgsPropertyDefinition( "preserveAspectRatio", QObject::tr( "Preserve aspect ratio between width and height" ), QgsPropertyDefinition::Boolean, origin )},
64 { static_cast< int >( QgsSymbolLayer::Property::FillStyle ), QgsPropertyDefinition( "fillStyle", QObject::tr( "Symbol fill style" ), QgsPropertyDefinition::FillStyle, origin )},
65 { static_cast< int >( QgsSymbolLayer::Property::JoinStyle ), QgsPropertyDefinition( "joinStyle", QObject::tr( "Outline join style" ), QgsPropertyDefinition::PenJoinStyle, origin )},
66 { static_cast< int >( QgsSymbolLayer::Property::SecondaryColor ), QgsPropertyDefinition( "color2", QObject::tr( "Secondary fill color" ), QgsPropertyDefinition::ColorWithAlpha, origin )},
67 { static_cast< int >( QgsSymbolLayer::Property::LineAngle ), QgsPropertyDefinition( "lineAngle", QObject::tr( "Angle for line fills" ), QgsPropertyDefinition::Rotation, origin )},
68 { static_cast< int >( QgsSymbolLayer::Property::GradientType ), QgsPropertyDefinition( "gradientType", QgsPropertyDefinition::DataTypeString, QObject::tr( "Gradient type" ), QObject::tr( "string " ) + QLatin1String( "[<b>linear</b>|<b>radial</b>|<b>conical</b>]" ), origin )},
69 { static_cast< int >( QgsSymbolLayer::Property::CoordinateMode ), QgsPropertyDefinition( "gradientMode", QgsPropertyDefinition::DataTypeString, QObject::tr( "Gradient mode" ), QObject::tr( "string " ) + QLatin1String( "[<b>feature</b>|<b>viewport</b>]" ), origin )},
70 { static_cast< int >( QgsSymbolLayer::Property::GradientSpread ), QgsPropertyDefinition( "gradientSpread", QgsPropertyDefinition::DataTypeString, QObject::tr( "Gradient spread" ), QObject::tr( "string " ) + QLatin1String( "[<b>pad</b>|<b>repeat</b>|<b>reflect</b>]" ), origin )},
71 { static_cast< int >( QgsSymbolLayer::Property::GradientReference1X ), QgsPropertyDefinition( "gradientRef1X", QObject::tr( "Reference point 1 (X)" ), QgsPropertyDefinition::Double0To1, origin )},
72 { static_cast< int >( QgsSymbolLayer::Property::GradientReference1Y ), QgsPropertyDefinition( "gradientRef1Y", QObject::tr( "Reference point 1 (Y)" ), QgsPropertyDefinition::Double0To1, origin )},
73 { static_cast< int >( QgsSymbolLayer::Property::GradientReference2X ), QgsPropertyDefinition( "gradientRef2X", QObject::tr( "Reference point 2 (X)" ), QgsPropertyDefinition::Double0To1, origin )},
74 { static_cast< int >( QgsSymbolLayer::Property::GradientReference2Y ), QgsPropertyDefinition( "gradientRef2Y", QObject::tr( "Reference point 2 (Y)" ), QgsPropertyDefinition::Double0To1, origin )},
75 { static_cast< int >( QgsSymbolLayer::Property::GradientReference1IsCentroid ), QgsPropertyDefinition( "gradientRef1Centroid", QObject::tr( "Reference point 1 follows feature centroid" ), QgsPropertyDefinition::Boolean, origin )},
76 { static_cast< int >( QgsSymbolLayer::Property::GradientReference2IsCentroid ), QgsPropertyDefinition( "gradientRef2Centroid", QObject::tr( "Reference point 2 follows feature centroid" ), QgsPropertyDefinition::Boolean, origin )},
77 { static_cast< int >( QgsSymbolLayer::Property::BlurRadius ), QgsPropertyDefinition( "blurRadius", QgsPropertyDefinition::DataTypeNumeric, QObject::tr( "Blur radius" ), QObject::tr( "Integer between 0 and 18" ), origin )},
78 { static_cast< int >( QgsSymbolLayer::Property::LineDistance ), QgsPropertyDefinition( "lineDistance", QObject::tr( "Distance between lines" ), QgsPropertyDefinition::DoublePositive, origin )},
79 { static_cast< int >( QgsSymbolLayer::Property::ShapeburstUseWholeShape ), QgsPropertyDefinition( "shapeburstWholeShape", QObject::tr( "Shade whole shape" ), QgsPropertyDefinition::Boolean, origin )},
80 { static_cast< int >( QgsSymbolLayer::Property::ShapeburstMaxDistance ), QgsPropertyDefinition( "shapeburstMaxDist", QObject::tr( "Maximum distance for shapeburst fill" ), QgsPropertyDefinition::DoublePositive, origin )},
81 { static_cast< int >( QgsSymbolLayer::Property::ShapeburstIgnoreRings ), QgsPropertyDefinition( "shapeburstIgnoreRings", QObject::tr( "Ignore rings in feature" ), QgsPropertyDefinition::Boolean, origin )},
82 { static_cast< int >( QgsSymbolLayer::Property::File ), QgsPropertyDefinition( "file", QObject::tr( "Symbol file path" ), QgsPropertyDefinition::String, origin )},
83 { static_cast< int >( QgsSymbolLayer::Property::DistanceX ), QgsPropertyDefinition( "distanceX", QObject::tr( "Horizontal distance between markers" ), QgsPropertyDefinition::DoublePositive, origin )},
84 { static_cast< int >( QgsSymbolLayer::Property::DistanceY ), QgsPropertyDefinition( "distanceY", QObject::tr( "Vertical distance between markers" ), QgsPropertyDefinition::DoublePositive, origin )},
85 { static_cast< int >( QgsSymbolLayer::Property::DisplacementX ), QgsPropertyDefinition( "displacementX", QObject::tr( "Horizontal displacement between rows" ), QgsPropertyDefinition::DoublePositive, origin )},
86 { static_cast< int >( QgsSymbolLayer::Property::DisplacementY ), QgsPropertyDefinition( "displacementY", QObject::tr( "Vertical displacement between columns" ), QgsPropertyDefinition::DoublePositive, origin )},
87 { static_cast< int >( QgsSymbolLayer::Property::OffsetX ), QgsPropertyDefinition( "offsetX", QObject::tr( "Horizontal offset" ), QgsPropertyDefinition::Double, origin )},
88 { static_cast< int >( QgsSymbolLayer::Property::OffsetY ), QgsPropertyDefinition( "offsetY", QObject::tr( "Vertical offset" ), QgsPropertyDefinition::Double, origin )},
89 { static_cast< int >( QgsSymbolLayer::Property::Opacity ), QgsPropertyDefinition( "alpha", QObject::tr( "Opacity" ), QgsPropertyDefinition::Opacity, origin )},
90 { static_cast< int >( QgsSymbolLayer::Property::CustomDash ), QgsPropertyDefinition( "customDash", QgsPropertyDefinition::DataTypeString, QObject::tr( "Custom dash pattern" ), QObject::tr( "[<b><dash>;<space></b>] e.g. '8;2;1;2'" ), origin )},
91 { static_cast< int >( QgsSymbolLayer::Property::CapStyle ), QgsPropertyDefinition( "capStyle", QObject::tr( "Line cap style" ), QgsPropertyDefinition::CapStyle, origin )},
92 { static_cast< int >( QgsSymbolLayer::Property::Placement ), QgsPropertyDefinition( "placement", QgsPropertyDefinition::DataTypeString, QObject::tr( "Marker placement" ), QObject::tr( "string " ) + "[<b>interval</b>|<b>innervertices</b>|<b>vertex</b>|<b>lastvertex</b>|<b>firstvertex</b>|<b>centerpoint</b>|<b>curvepoint</b>|<b>segmentcenter</b>]", origin )},
93 { static_cast< int >( QgsSymbolLayer::Property::Interval ), QgsPropertyDefinition( "interval", QObject::tr( "Marker interval" ), QgsPropertyDefinition::DoublePositive, origin )},
94 { static_cast< int >( QgsSymbolLayer::Property::OffsetAlongLine ), QgsPropertyDefinition( "offsetAlongLine", QObject::tr( "Offset along line" ), QgsPropertyDefinition::Double, origin )},
95 { static_cast< int >( QgsSymbolLayer::Property::AverageAngleLength ), QgsPropertyDefinition( "averageAngleLength", QObject::tr( "Average line angles over" ), QgsPropertyDefinition::DoublePositive, origin )},
96 { static_cast< int >( QgsSymbolLayer::Property::HorizontalAnchor ), QgsPropertyDefinition( "hAnchor", QObject::tr( "Horizontal anchor point" ), QgsPropertyDefinition::HorizontalAnchor, origin )},
97 { static_cast< int >( QgsSymbolLayer::Property::VerticalAnchor ), QgsPropertyDefinition( "vAnchor", QObject::tr( "Vertical anchor point" ), QgsPropertyDefinition::VerticalAnchor, origin )},
98 { static_cast< int >( QgsSymbolLayer::Property::LayerEnabled ), QgsPropertyDefinition( "enabled", QObject::tr( "Layer enabled" ), QgsPropertyDefinition::Boolean, origin )},
99 { static_cast< int >( QgsSymbolLayer::Property::ArrowWidth ), QgsPropertyDefinition( "arrowWidth", QObject::tr( "Arrow line width" ), QgsPropertyDefinition::StrokeWidth, origin )},
100 { static_cast< int >( QgsSymbolLayer::Property::ArrowStartWidth ), QgsPropertyDefinition( "arrowStartWidth", QObject::tr( "Arrow line start width" ), QgsPropertyDefinition::StrokeWidth, origin )},
101 { static_cast< int >( QgsSymbolLayer::Property::ArrowHeadLength ), QgsPropertyDefinition( "arrowHeadLength", QObject::tr( "Arrow head length" ), QgsPropertyDefinition::DoublePositive, origin )},
102 { static_cast< int >( QgsSymbolLayer::Property::ArrowHeadThickness ), QgsPropertyDefinition( "arrowHeadThickness", QObject::tr( "Arrow head thickness" ), QgsPropertyDefinition::DoublePositive, origin )},
103 { static_cast< int >( QgsSymbolLayer::Property::ArrowHeadType ), QgsPropertyDefinition( "arrowHeadType", QgsPropertyDefinition::DataTypeString, QObject::tr( "Arrow head type" ), QObject::tr( "string " ) + QLatin1String( "[<b>single</b>|<b>reversed</b>|<b>double</b>]" ), origin )},
104 { static_cast< int >( QgsSymbolLayer::Property::ArrowType ), QgsPropertyDefinition( "arrowType", QgsPropertyDefinition::DataTypeString, QObject::tr( "Arrow type" ), QObject::tr( "string " ) + QLatin1String( "[<b>plain</b>|<b>lefthalf</b>|<b>righthalf</b>]" ), origin )},
105 { static_cast< int >( QgsSymbolLayer::Property::PointCount ), QgsPropertyDefinition( "pointCount", QObject::tr( "Point count" ), QgsPropertyDefinition::IntegerPositive, origin )},
106 { static_cast< int >( QgsSymbolLayer::Property::RandomSeed ), QgsPropertyDefinition( "randomSeed", QgsPropertyDefinition::DataTypeNumeric, QObject::tr( "Random number seed" ), QObject::tr( "integer > 0, or 0 for completely random sequence" ), origin )},
107 { static_cast< int >( QgsSymbolLayer::Property::ClipPoints ), QgsPropertyDefinition( "clipPoints", QObject::tr( "Clip markers" ), QgsPropertyDefinition::Boolean, origin )},
108 { static_cast< int >( QgsSymbolLayer::Property::DensityArea ), QgsPropertyDefinition( "densityArea", QObject::tr( "Density area" ), QgsPropertyDefinition::DoublePositive, origin )},
109 { static_cast< int >( QgsSymbolLayer::Property::DashPatternOffset ), QgsPropertyDefinition( "dashPatternOffset", QObject::tr( "Dash pattern offset" ), QgsPropertyDefinition::DoublePositive, origin )},
110 { static_cast< int >( QgsSymbolLayer::Property::TrimStart ), QgsPropertyDefinition( "trimStart", QObject::tr( "Start trim distance" ), QgsPropertyDefinition::DoublePositive, origin )},
111 { static_cast< int >( QgsSymbolLayer::Property::TrimEnd ), QgsPropertyDefinition( "trimEnd", QObject::tr( "End trim distance" ), QgsPropertyDefinition::DoublePositive, origin )},
112 { static_cast< int >( QgsSymbolLayer::Property::LineStartWidthValue ), QgsPropertyDefinition( "lineStartWidthValue", QObject::tr( "Line start width value" ), QgsPropertyDefinition::Double, origin )},
113 { static_cast< int >( QgsSymbolLayer::Property::LineEndWidthValue ), QgsPropertyDefinition( "lineEndWidthValue", QObject::tr( "Line end width value" ), QgsPropertyDefinition::Double, origin )},
114 { static_cast< int >( QgsSymbolLayer::Property::LineStartColorValue ), QgsPropertyDefinition( "lineStartColorValue", QObject::tr( "Line start color value" ), QgsPropertyDefinition::Double, origin )},
115 { static_cast< int >( QgsSymbolLayer::Property::LineEndColorValue ), QgsPropertyDefinition( "lineEndColorValue", QObject::tr( "Line end color value" ), QgsPropertyDefinition::Double, origin )},
116 { static_cast< int >( QgsSymbolLayer::Property::MarkerClipping ), QgsPropertyDefinition( "markerClipping", QgsPropertyDefinition::DataTypeString, QObject::tr( "Marker clipping mode" ), QObject::tr( "string " ) + QLatin1String( "[<b>no</b>|<b>shape</b>|<b>centroid_within</b>|<b>completely_within</b>]" ), origin )},
117 { static_cast< int >( QgsSymbolLayer::Property::RandomOffsetX ), QgsPropertyDefinition( "randomOffsetX", QObject::tr( "Horizontal random offset" ), QgsPropertyDefinition::Double, origin )},
118 { static_cast< int >( QgsSymbolLayer::Property::RandomOffsetY ), QgsPropertyDefinition( "randomOffsetY", QObject::tr( "Vertical random offset" ), QgsPropertyDefinition::Double, origin )},
119 { static_cast< int >( QgsSymbolLayer::Property::LineClipping ), QgsPropertyDefinition( "lineClipping", QgsPropertyDefinition::DataTypeString, QObject::tr( "Line clipping mode" ), QObject::tr( "string " ) + QLatin1String( "[<b>no</b>|<b>during_render</b>|<b>before_render</b>]" ), origin )},
120 { static_cast< int >( QgsSymbolLayer::Property::SkipMultiples ), QgsPropertyDefinition( "skipMultiples", QObject::tr( "Skip multiples of" ), QgsPropertyDefinition::DoublePositive, origin )},
121 { static_cast< int >( QgsSymbolLayer::Property::ShowMarker ), QgsPropertyDefinition( "showMarker", QObject::tr( "Show marker" ), QgsPropertyDefinition::Boolean, origin )},
122 };
123}
124
129
131{
132 installMasks( context, false );
133
134 if ( QgsSymbol *lSubSymbol = subSymbol() )
135 lSubSymbol->startFeatureRender( feature, context );
136}
137
139{
140 if ( QgsSymbol *lSubSymbol = subSymbol() )
141 lSubSymbol->stopFeatureRender( feature, context );
142
143 removeMasks( context, false );
144}
145
147{
148 return nullptr;
149}
150
152{
153 delete symbol;
154 return false;
155}
156
157bool QgsSymbolLayer::writeDxf( QgsDxfExport &e, double mmMapUnitScaleFactor, const QString &layerName, QgsSymbolRenderContext &context, QPointF shift ) const
158{
159 Q_UNUSED( e )
160 Q_UNUSED( mmMapUnitScaleFactor )
161 Q_UNUSED( layerName )
162 Q_UNUSED( context )
163 Q_UNUSED( shift )
164 return false;
165}
166
168{
169 Q_UNUSED( e )
170 Q_UNUSED( context )
171 return 1.0;
172}
173
175{
176 Q_UNUSED( e )
177 Q_UNUSED( context )
178 return 1.0;
179}
180
182{
183 Q_UNUSED( e )
184 Q_UNUSED( context )
185 return 0.0;
186}
187
189{
190 Q_UNUSED( context )
191 return color();
192}
193
195{
196 Q_UNUSED( context )
197 return 0.0;
198}
199
201{
202 Q_UNUSED( unit )
203 return QVector<qreal>();
204}
205
206Qt::PenStyle QgsSymbolLayer::dxfPenStyle() const
207{
208 return Qt::SolidLine;
209}
210
212{
213 Q_UNUSED( context )
214 return color();
215}
216
217Qt::BrushStyle QgsSymbolLayer::dxfBrushStyle() const
218{
219 return Qt::NoBrush;
220}
221
223{
224 return mPaintEffect.get();
225}
226
228{
229 if ( effect == mPaintEffect.get() )
230 return;
231
232 mPaintEffect.reset( effect );
233}
234
236 : mType( other.mType )
237 , mEnabled( other.mEnabled )
238 , mUserFlags( other.mUserFlags )
239 , mLocked( other.mLocked )
240 , mColor( other.mColor )
241 , mRenderingPass( other.mRenderingPass )
242 , mId( other.mId )
243 , mDataDefinedProperties( other.mDataDefinedProperties )
244 , mPaintEffect( other.mPaintEffect ? other.mPaintEffect->clone() : nullptr )
245 , mFields( other.mFields )
246 , mClipPath( other.mClipPath )
247{
248}
249
251 : mType( type )
252 , mLocked( locked )
253 , mId( QUuid::createUuid().toString() )
254{
255}
256
261
266
271
273{
274 return mColor;
275}
276
277void QgsSymbolLayer::setColor( const QColor &color )
278{
279 mColor = color;
280}
281
282void QgsSymbolLayer::setStrokeColor( const QColor & )
283{
284
285}
286
288{
289 return QColor();
290}
291
292void QgsSymbolLayer::setFillColor( const QColor & )
293{
294}
295
297{
298 return QColor();
299}
300
302{
304
305 if ( !context.fields().isEmpty() )
306 {
307 //QgsFields is implicitly shared, so it's cheap to make a copy
308 mFields = context.fields();
309 }
310}
311
316
318{
319 QgsSymbolLayer::initPropertyDefinitions();
320 return sPropertyDefinitions;
321}
322
324
326{
328 return true;
329
330 return symbol->type() == mType;
331}
332
334{
335 return false;
336}
337
339{
340 return false;
341}
342
343void QgsSymbolLayer::setRenderingPass( int renderingPass )
344{
346}
347
349{
350 return mRenderingPass;
351}
352
353QSet<QString> QgsSymbolLayer::usedAttributes( const QgsRenderContext &context ) const
354{
355 // calling referencedFields() with ignoreContext=true because in our expression context
356 // we do not have valid QgsFields yet - because of that the field names from expressions
357 // wouldn't get reported
358 QSet<QString> columns = mDataDefinedProperties.referencedFields( context.expressionContext(), true );
359 return columns;
360}
361
362QgsProperty propertyFromMap( const QVariantMap &map, const QString &baseName )
363{
364 QString prefix;
365 if ( !baseName.isEmpty() )
366 {
367 prefix.append( QStringLiteral( "%1_dd_" ).arg( baseName ) );
368 }
369
370 if ( !map.contains( QStringLiteral( "%1expression" ).arg( prefix ) ) )
371 {
372 //requires at least the expression value
373 return QgsProperty();
374 }
375
376 bool active = ( map.value( QStringLiteral( "%1active" ).arg( prefix ), QStringLiteral( "1" ) ) != QLatin1String( "0" ) );
377 QString expression = map.value( QStringLiteral( "%1expression" ).arg( prefix ) ).toString();
378 bool useExpression = ( map.value( QStringLiteral( "%1useexpr" ).arg( prefix ), QStringLiteral( "1" ) ) != QLatin1String( "0" ) );
379 QString field = map.value( QStringLiteral( "%1field" ).arg( prefix ), QString() ).toString();
380
381 if ( useExpression )
382 return QgsProperty::fromExpression( expression, active );
383 else
384 return QgsProperty::fromField( field, active );
385}
386
387void QgsSymbolLayer::restoreOldDataDefinedProperties( const QVariantMap &stringMap )
388{
389 // property string to type upgrade map
390 static const QMap < QString, int > OLD_PROPS
391 {
392 { "color", static_cast< int >( QgsSymbolLayer::Property::FillColor ) },
393 { "arrow_width", static_cast< int >( QgsSymbolLayer::Property::ArrowWidth ) },
394 { "arrow_start_width", static_cast< int >( QgsSymbolLayer::Property::ArrowStartWidth ) },
395 { "head_length", static_cast< int >( QgsSymbolLayer::Property::ArrowHeadLength ) },
396 { "head_thickness", static_cast< int >( QgsSymbolLayer::Property::ArrowHeadThickness ) },
397 { "offset", static_cast< int >( QgsSymbolLayer::Property::Offset ) },
398 { "head_type", static_cast< int >( QgsSymbolLayer::Property::ArrowHeadType ) },
399 { "arrow_type", static_cast< int >( QgsSymbolLayer::Property::ArrowType ) },
400 { "width_field", static_cast< int >( QgsSymbolLayer::Property::Width ) },
401 { "height_field", static_cast< int >( QgsSymbolLayer::Property::Height ) },
402 { "rotation_field", static_cast< int >( QgsSymbolLayer::Property::Angle ) },
403 { "outline_width_field", static_cast< int >( QgsSymbolLayer::Property::StrokeWidth ) },
404 { "fill_color_field", static_cast< int >( QgsSymbolLayer::Property::FillColor ) },
405 { "outline_color_field", static_cast< int >( QgsSymbolLayer::Property::StrokeColor ) },
406 { "symbol_name_field", static_cast< int >( QgsSymbolLayer::Property::Name ) },
407 { "outline_width", static_cast< int >( QgsSymbolLayer::Property::StrokeWidth ) },
408 { "outline_style", static_cast< int >( QgsSymbolLayer::Property::StrokeStyle ) },
409 { "join_style", static_cast< int >( QgsSymbolLayer::Property::JoinStyle ) },
410 { "fill_color", static_cast< int >( QgsSymbolLayer::Property::FillColor ) },
411 { "outline_color", static_cast< int >( QgsSymbolLayer::Property::StrokeColor ) },
412 { "width", static_cast< int >( QgsSymbolLayer::Property::Width ) },
413 { "height", static_cast< int >( QgsSymbolLayer::Property::Height ) },
414 { "symbol_name", static_cast< int >( QgsSymbolLayer::Property::Name ) },
415 { "angle", static_cast< int >( QgsSymbolLayer::Property::Angle ) },
416 { "fill_style", static_cast< int >( QgsSymbolLayer::Property::FillStyle ) },
417 { "color_border", static_cast< int >( QgsSymbolLayer::Property::StrokeColor ) },
418 { "width_border", static_cast< int >( QgsSymbolLayer::Property::StrokeWidth ) },
419 { "border_color", static_cast< int >( QgsSymbolLayer::Property::StrokeColor ) },
420 { "border_style", static_cast< int >( QgsSymbolLayer::Property::StrokeStyle ) },
421 { "color2", static_cast< int >( QgsSymbolLayer::Property::SecondaryColor ) },
422 { "gradient_type", static_cast< int >( QgsSymbolLayer::Property::GradientType ) },
423 { "coordinate_mode", static_cast< int >( QgsSymbolLayer::Property::CoordinateMode )},
424 { "spread", static_cast< int >( QgsSymbolLayer::Property::GradientSpread ) },
425 { "reference1_x", static_cast< int >( QgsSymbolLayer::Property::GradientReference1X ) },
426 { "reference1_y", static_cast< int >( QgsSymbolLayer::Property::GradientReference1Y ) },
427 { "reference2_x", static_cast< int >( QgsSymbolLayer::Property::GradientReference2X ) },
428 { "reference2_y", static_cast< int >( QgsSymbolLayer::Property::GradientReference2Y )},
429 { "reference1_iscentroid", static_cast< int >( QgsSymbolLayer::Property::GradientReference1IsCentroid )},
430 { "reference2_iscentroid", static_cast< int >( QgsSymbolLayer::Property::GradientReference2IsCentroid )},
431 { "blur_radius", static_cast< int >( QgsSymbolLayer::Property::BlurRadius ) },
432 { "use_whole_shape", static_cast< int >( QgsSymbolLayer::Property::ShapeburstUseWholeShape ) },
433 { "max_distance", static_cast< int >( QgsSymbolLayer::Property::ShapeburstMaxDistance ) },
434 { "ignore_rings", static_cast< int >( QgsSymbolLayer::Property::ShapeburstIgnoreRings ) },
435 { "svgFillColor", static_cast< int >( QgsSymbolLayer::Property::FillColor ) },
436 { "svgOutlineColor", static_cast< int >( QgsSymbolLayer::Property::StrokeColor ) },
437 { "svgOutlineWidth", static_cast< int >( QgsSymbolLayer::Property::StrokeWidth ) },
438 { "svgFile", static_cast< int >( QgsSymbolLayer::Property::File ) },
439 { "lineangle", static_cast< int >( QgsSymbolLayer::Property::LineAngle ) },
440 { "distance", static_cast< int >( QgsSymbolLayer::Property::LineDistance )},
441 { "distance_x", static_cast< int >( QgsSymbolLayer::Property::DistanceX )},
442 { "distance_y", static_cast< int >( QgsSymbolLayer::Property::DistanceY ) },
443 { "displacement_x", static_cast< int >( QgsSymbolLayer::Property::DisplacementX )},
444 { "displacement_y", static_cast< int >( QgsSymbolLayer::Property::DisplacementY ) },
445 { "file", static_cast< int >( QgsSymbolLayer::Property::File ) },
446 { "alpha", static_cast< int >( QgsSymbolLayer::Property::Opacity )},
447 { "customdash", static_cast< int >( QgsSymbolLayer::Property::CustomDash ) },
448 { "line_style", static_cast< int >( QgsSymbolLayer::Property::StrokeStyle ) },
449 { "joinstyle", static_cast< int >( QgsSymbolLayer::Property::JoinStyle ) },
450 { "capstyle", static_cast< int >( QgsSymbolLayer::Property::CapStyle ) },
451 { "placement", static_cast< int >( QgsSymbolLayer::Property::Placement ) },
452 { "interval", static_cast< int >( QgsSymbolLayer::Property::Interval ) },
453 { "offset_along_line", static_cast< int >( QgsSymbolLayer::Property::OffsetAlongLine ) },
454 { "name", static_cast< int >( QgsSymbolLayer::Property::Name ) },
455 { "size", static_cast< int >( QgsSymbolLayer::Property::Size ) },
456 { "fill", static_cast< int >( QgsSymbolLayer::Property::FillColor ) },
457 { "outline", static_cast< int >( QgsSymbolLayer::Property::StrokeColor )},
458 { "char", static_cast< int >( QgsSymbolLayer::Property::Character )},
459 { "enabled", static_cast< int >( QgsSymbolLayer::Property::LayerEnabled ) },
460 { "rotation", static_cast< int >( QgsSymbolLayer::Property::Angle )},
461 { "horizontal_anchor_point", static_cast< int >( QgsSymbolLayer::Property::HorizontalAnchor ) },
462 { "vertical_anchor_point", static_cast< int >( QgsSymbolLayer::Property::VerticalAnchor ) },
463 };
464
465 QVariantMap::const_iterator propIt = stringMap.constBegin();
466 for ( ; propIt != stringMap.constEnd(); ++propIt )
467 {
468 std::unique_ptr<QgsProperty> prop;
469 QString propertyName;
470
471 if ( propIt.key().endsWith( QLatin1String( "_dd_expression" ) ) )
472 {
473 //found a data defined property
474
475 //get data defined property name by stripping "_dd_expression" from property key
476 propertyName = propIt.key().left( propIt.key().length() - 14 );
477
478 prop = std::make_unique<QgsProperty>( propertyFromMap( stringMap, propertyName ) );
479 }
480 else if ( propIt.key().endsWith( QLatin1String( "_expression" ) ) )
481 {
482 //old style data defined property, upgrade
483
484 //get data defined property name by stripping "_expression" from property key
485 propertyName = propIt.key().left( propIt.key().length() - 11 );
486
487 prop = std::make_unique<QgsProperty>( QgsProperty::fromExpression( propIt.value().toString() ) );
488 }
489
490 if ( !prop || !OLD_PROPS.contains( propertyName ) )
491 continue;
492
493 int key = OLD_PROPS.value( propertyName );
494
495 if ( type() == Qgis::SymbolType::Line )
496 {
497 //these keys had different meaning for line symbol layers
498 if ( propertyName == QLatin1String( "width" ) )
499 key = static_cast< int >( QgsSymbolLayer::Property::StrokeWidth );
500 else if ( propertyName == QLatin1String( "color" ) )
501 key = static_cast< int >( QgsSymbolLayer::Property::StrokeColor );
502 }
503
504 setDataDefinedProperty( static_cast< QgsSymbolLayer::Property >( key ), QgsProperty( *prop.get() ) );
505 }
506}
507
509{
510 if ( !destLayer )
511 return;
512
514}
515
517{
518 if ( !destLayer || !mPaintEffect )
519 return;
520
522 destLayer->setPaintEffect( mPaintEffect->clone() );
523 else
524 destLayer->setPaintEffect( nullptr );
525}
526
528 : QgsSymbolLayer( Qgis::SymbolType::Marker, locked )
529{
530
531}
532
534 : QgsSymbolLayer( Qgis::SymbolType::Line, locked )
535{
536}
537
542
544{
545 mRingFilter = filter;
546}
547
549 : QgsSymbolLayer( Qgis::SymbolType::Fill, locked )
550{
551}
552
554 : QgsSymbolLayer( other )
555 , mAngle( other.mAngle )
556 , mLineAngle( other.mLineAngle )
557 , mSize( other.mSize )
558 , mSizeUnit( other.mSizeUnit )
559 , mSizeMapUnitScale( other.mSizeMapUnitScale )
560 , mOffset( other.mOffset )
561 , mOffsetUnit( other.mOffsetUnit )
562 , mOffsetMapUnitScale( other.mOffsetMapUnitScale )
563 , mScaleMethod( other.mScaleMethod )
564 , mHorizontalAnchorPoint( other.mHorizontalAnchorPoint )
565 , mVerticalAnchorPoint( other.mVerticalAnchorPoint )
566{
567
568}
569
571{
572 Q_UNUSED( context )
573}
574
576{
577 Q_UNUSED( context )
578}
579
581{
582 startRender( context );
583 QgsPaintEffect *effect = paintEffect();
584
585 QPolygonF points = context.patchShape() ? context.patchShape()->toQPolygonF( Qgis::SymbolType::Marker, size ).value( 0 ).value( 0 )
587
588 std::unique_ptr< QgsEffectPainter > effectPainter;
589 if ( effect && effect->enabled() )
590 effectPainter = std::make_unique< QgsEffectPainter >( context.renderContext(), effect );
591
592 for ( QPointF point : std::as_const( points ) )
593 renderPoint( point, context );
594
595 effectPainter.reset();
596
597 stopRender( context );
598}
599
600void QgsMarkerSymbolLayer::markerOffset( QgsSymbolRenderContext &context, double &offsetX, double &offsetY ) const
601{
603}
604
605void QgsMarkerSymbolLayer::markerOffset( QgsSymbolRenderContext &context, double width, double height, double &offsetX, double &offsetY ) const
606{
607 markerOffset( context, width, height, mSizeUnit, mSizeUnit, offsetX, offsetY, mSizeMapUnitScale, mSizeMapUnitScale );
608}
609
610void QgsMarkerSymbolLayer::markerOffset( QgsSymbolRenderContext &context, double width, double height,
611 Qgis::RenderUnit widthUnit, Qgis::RenderUnit heightUnit,
612 double &offsetX, double &offsetY, const QgsMapUnitScale &widthMapUnitScale, const QgsMapUnitScale &heightMapUnitScale ) const
613{
614 offsetX = mOffset.x();
615 offsetY = mOffset.y();
616
618 {
621 bool ok = false;
622 const QPointF offset = QgsSymbolLayerUtils::toPoint( exprVal, &ok );
623 if ( ok )
624 {
625 offsetX = offset.x();
626 offsetY = offset.y();
627 }
628 }
629
632
636 {
638 if ( !QgsVariantUtils::isNull( exprVal ) )
639 {
640 horizontalAnchorPoint = decodeHorizontalAnchorPoint( exprVal.toString() );
641 }
642 }
644 {
646 if ( !QgsVariantUtils::isNull( exprVal ) )
647 {
648 verticalAnchorPoint = decodeVerticalAnchorPoint( exprVal.toString() );
649 }
650 }
651
652 //correct horizontal position according to anchor point
654 {
655 return;
656 }
657
658 double anchorPointCorrectionX = context.renderContext().convertToPainterUnits( width, widthUnit, widthMapUnitScale ) / 2.0;
660 {
661 // rendering for symbol previews -- an size in meters in map units can't be calculated, so treat the size as millimeters
662 // and clamp it to a reasonable range. It's the best we can do in this situation!
663 anchorPointCorrectionX = std::min( std::max( context.renderContext().convertToPainterUnits( width, Qgis::RenderUnit::Millimeters ), 3.0 ), 100.0 ) / 2.0;
664 }
665
666 double anchorPointCorrectionY = context.renderContext().convertToPainterUnits( height, heightUnit, heightMapUnitScale ) / 2.0;
668 {
669 // rendering for symbol previews -- an size in meters in map units can't be calculated, so treat the size as millimeters
670 // and clamp it to a reasonable range. It's the best we can do in this situation!
671 anchorPointCorrectionY = std::min( std::max( context.renderContext().convertToPainterUnits( height, Qgis::RenderUnit::Millimeters ), 3.0 ), 100.0 ) / 2.0;
672 }
673
674 switch ( horizontalAnchorPoint )
675 {
677 offsetX += anchorPointCorrectionX;
678 break;
680 offsetX -= anchorPointCorrectionX;
681 break;
683 break;
684 }
685
686 //correct vertical position according to anchor point
687 switch ( verticalAnchorPoint )
688 {
690 offsetY += anchorPointCorrectionY;
691 break;
694 offsetY -= anchorPointCorrectionY;
695 break;
697 break;
698 }
699}
700
701QPointF QgsMarkerSymbolLayer::_rotatedOffset( QPointF offset, double angle )
702{
703 angle = DEG2RAD( angle );
704 double c = std::cos( angle ), s = std::sin( angle );
705 return QPointF( offset.x() * c - offset.y() * s, offset.x() * s + offset.y() * c );
706}
707
708Qgis::HorizontalAnchorPoint QgsMarkerSymbolLayer::decodeHorizontalAnchorPoint( const QString &str )
709{
710 if ( str.compare( QLatin1String( "left" ), Qt::CaseInsensitive ) == 0 )
711 {
713 }
714 else if ( str.compare( QLatin1String( "right" ), Qt::CaseInsensitive ) == 0 )
715 {
717 }
718 else
719 {
721 }
722}
723
724Qgis::VerticalAnchorPoint QgsMarkerSymbolLayer::decodeVerticalAnchorPoint( const QString &str )
725{
726 if ( str.compare( QLatin1String( "top" ), Qt::CaseInsensitive ) == 0 )
727 {
729 }
730 else if ( str.compare( QLatin1String( "bottom" ), Qt::CaseInsensitive ) == 0 )
731 {
733 }
734 else
735 {
737 }
738}
739
741{
742 mSizeUnit = unit;
743 mOffsetUnit = unit;
744}
745
747{
748 if ( mOffsetUnit != mSizeUnit )
749 {
751 }
752 return mOffsetUnit;
753}
754
760
769
771{
772 mWidthUnit = unit;
773 mOffsetUnit = unit;
774}
775
780
785
790
791
793{
794 const QList< QList< QPolygonF > > points = context.patchShape() ? context.patchShape()->toQPolygonF( Qgis::SymbolType::Line, size )
796 startRender( context );
797 QgsPaintEffect *effect = paintEffect();
798
799 std::unique_ptr< QgsEffectPainter > effectPainter;
800 if ( effect && effect->enabled() )
801 effectPainter = std::make_unique< QgsEffectPainter >( context.renderContext(), effect );
802
803 for ( const QList< QPolygonF > &line : points )
804 renderPolyline( line.value( 0 ), context );
805
806 effectPainter.reset();
807
808 stopRender( context );
809}
810
811void QgsLineSymbolLayer::renderPolygonStroke( const QPolygonF &points, const QVector<QPolygonF> *rings, QgsSymbolRenderContext &context )
812{
813 QgsExpressionContextScope *scope = nullptr;
814 std::unique_ptr< QgsExpressionContextScopePopper > scopePopper;
816 {
817 scope = new QgsExpressionContextScope();
818 scopePopper = std::make_unique< QgsExpressionContextScopePopper >( context.renderContext().expressionContext(), scope );
819 }
820
821 switch ( mRingFilter )
822 {
823 case AllRings:
824 case ExteriorRingOnly:
825 {
826 if ( scope )
828 renderPolyline( points, context );
829 break;
830 }
832 break;
833 }
834
835 if ( rings )
836 {
837 switch ( mRingFilter )
838 {
839 case AllRings:
841 {
842 int ringIndex = 1;
843 for ( const QPolygonF &ring : std::as_const( *rings ) )
844 {
845 if ( scope )
847
848 renderPolyline( ring, context );
849 ringIndex++;
850 }
851 }
852 break;
853 case ExteriorRingOnly:
854 break;
855 }
856 }
857}
858
859double QgsLineSymbolLayer::width( const QgsRenderContext &context ) const
860{
862}
863
865{
866 Q_UNUSED( context )
868}
869
870
872{
873 const QList< QList< QPolygonF > > polys = context.patchShape() ? context.patchShape()->toQPolygonF( Qgis::SymbolType::Fill, size )
875
876 startRender( context );
877 QgsPaintEffect *effect = paintEffect();
878
879 std::unique_ptr< QgsEffectPainter > effectPainter;
880 if ( effect && effect->enabled() )
881 effectPainter = std::make_unique< QgsEffectPainter >( context.renderContext(), effect );
882
883 for ( const QList< QPolygonF > &poly : polys )
884 {
885 QVector< QPolygonF > rings;
886 for ( int i = 1; i < poly.size(); ++i )
887 rings << poly.at( i );
888 renderPolygon( poly.value( 0 ), &rings, context );
889 }
890
891 effectPainter.reset();
892
893 stopRender( context );
894}
895
897{
898 return QImage();
899}
900
901void QgsFillSymbolLayer::_renderPolygon( QPainter *p, const QPolygonF &points, const QVector<QPolygonF> *rings, QgsSymbolRenderContext &context )
902{
903 if ( !p )
904 {
905 return;
906 }
907
908 // Disable 'Antialiasing' if the geometry was generalized in the current RenderContext (We known that it must have least #5 points).
909 if ( points.size() <= 5 &&
912 ( p->renderHints() & QPainter::Antialiasing ) )
913 {
914 p->setRenderHint( QPainter::Antialiasing, false );
915 p->drawRect( points.boundingRect() );
916 p->setRenderHint( QPainter::Antialiasing, true );
917 return;
918 }
919
920 // polygons outlines are sometimes rendered wrongly with drawPolygon, when
921 // clipped (see #13343), so use drawPath instead.
922 if ( !rings && p->pen().style() == Qt::NoPen )
923 {
924 // simple polygon without holes
925 p->drawPolygon( points );
926 }
927 else
928 {
929 // polygon with holes must be drawn using painter path
930 QPainterPath path;
931 path.addPolygon( points );
932
933 if ( rings )
934 {
935 for ( auto it = rings->constBegin(); it != rings->constEnd(); ++it )
936 {
937 QPolygonF ring = *it;
938 path.addPolygon( ring );
939 }
940 }
941
942 p->drawPath( path );
943 }
944}
945
946bool QgsMarkerSymbolLayer::toSld( QDomDocument &doc, QDomElement &element, QgsSldExportContext &context ) const
947{
948 QDomElement symbolizerElem = doc.createElement( QStringLiteral( "se:PointSymbolizer" ) );
949 const QVariantMap props = context.extraProperties();
950 if ( !props.value( QStringLiteral( "uom" ), QString() ).toString().isEmpty() )
951 symbolizerElem.setAttribute( QStringLiteral( "uom" ), props.value( QStringLiteral( "uom" ), QString() ).toString() );
952 element.appendChild( symbolizerElem );
953
954 // <Geometry>
955 QgsSymbolLayerUtils::createGeometryElement( doc, symbolizerElem, props.value( QStringLiteral( "geom" ), QString() ).toString(), context );
956
957 return writeSldMarker( doc, symbolizerElem, context );
958}
959
960void QgsMarkerSymbolLayer::writeSldMarker( QDomDocument &doc, QDomElement &element, const QVariantMap &props ) const
961{
962 QgsSldExportContext context;
963 context.setExtraProperties( props );
964 writeSldMarker( doc, element, context );
965}
966
967bool QgsMarkerSymbolLayer::writeSldMarker( QDomDocument &, QDomElement &, QgsSldExportContext &context ) const
968{
969 context.pushError( QObject::tr( "Marker symbol layer %1 cannot be converted to SLD" ).arg( layerType() ) );
970 return false;
971}
972
973QList<QgsSymbolLayerReference> QgsSymbolLayer::masks() const
974{
975 return {};
976}
977
979{
980 double size = mSize;
982 {
983 bool ok = false;
985
986 if ( ok )
987 {
988 switch ( mScaleMethod )
989 {
991 size = std::sqrt( size );
992 break;
994 break;
995 }
996 }
997 }
999}
1000
1011
1012QPainterPath generateClipPath( const QgsRenderContext &renderContext, const QString &id, const QRectF *rect, bool &foundGeometries )
1013{
1014 foundGeometries = false;
1015 const QVector<QgsGeometry> clipGeometries = rect
1016 ? QgsSymbolLayerUtils::collectSymbolLayerClipGeometries( renderContext, id, *rect )
1017 : renderContext.symbolLayerClipGeometries( id );
1018 if ( !clipGeometries.empty() )
1019 {
1020 foundGeometries = true;
1021 QgsGeometry mergedGeom = QgsGeometry::unaryUnion( clipGeometries );
1022 if ( renderContext.maskSettings().simplifyTolerance() > 0 )
1023 {
1024 QgsGeos geos( mergedGeom.constGet() );
1025 mergedGeom = QgsGeometry( geos.simplify( renderContext.maskSettings().simplifyTolerance() ) );
1026 }
1027#if GEOS_VERSION_MAJOR==3 && GEOS_VERSION_MINOR<10
1028 // structure would be better, but too old GEOS
1029 mergedGeom = mergedGeom.makeValid( Qgis::MakeValidMethod::Linework );
1030#else
1031 mergedGeom = mergedGeom.makeValid( Qgis::MakeValidMethod::Structure );
1032#endif
1033 if ( !mergedGeom.isEmpty() )
1034 {
1035 QgsGeometry exterior;
1036 const QgsRectangle contextBounds( 0, 0,
1037 renderContext.outputSize().width(),
1038 renderContext.outputSize().height() );
1039 if ( rect )
1040 {
1041 exterior = QgsGeometry::fromRect( QgsRectangle( *rect ).intersect( contextBounds ) );
1042 }
1043 else
1044 {
1045 exterior = QgsGeometry::fromRect( contextBounds );
1046 }
1047 const QgsGeometry maskGeom = exterior.difference( mergedGeom );
1048 if ( !maskGeom.isNull() )
1049 {
1050 return maskGeom.constGet()->asQPainterPath();
1051 }
1052 }
1053 }
1054 return QPainterPath();
1055}
1056
1058{
1059 const QgsRenderContext &renderContext = context.renderContext();
1060
1061 bool foundGeometries = false;
1062 mClipPath = generateClipPath( renderContext, id(), nullptr, foundGeometries );
1063}
1064
1065bool QgsSymbolLayer::installMasks( QgsRenderContext &context, bool recursive, const QRectF &rect )
1066{
1067 bool res = false;
1068 if ( !mClipPath.isEmpty() )
1069 {
1070 context.painter()->save();
1071 context.painter()->setClipPath( mClipPath, Qt::IntersectClip );
1072 res = true;
1073 }
1074 else if ( rect.isValid() )
1075 {
1076 // find just the clip geometries within the area the symbol layer will be drawn over
1077 bool foundGeometries = false;
1078 const QPainterPath clipPath = generateClipPath( context, id(), &rect, foundGeometries );
1079 if ( !clipPath.isEmpty() )
1080 {
1081 context.painter()->setClipPath( clipPath, context.painter()->clipPath().isEmpty() ? Qt::ReplaceClip : Qt::IntersectClip );
1082 res = true;
1083 }
1084 }
1085
1086 if ( QgsSymbol *lSubSymbol = recursive ? subSymbol() : nullptr )
1087 {
1088 const QList<QgsSymbolLayer *> layers = lSubSymbol->symbolLayers();
1089 for ( QgsSymbolLayer *sl : layers )
1090 res = sl->installMasks( context, true ) || res;
1091 }
1092
1093 return res;
1094}
1095
1096void QgsSymbolLayer::removeMasks( QgsRenderContext &context, bool recursive )
1097{
1098 if ( !mClipPath.isEmpty() )
1099 {
1100 context.painter()->restore();
1101 }
1102
1103 if ( QgsSymbol *lSubSymbol = recursive ? subSymbol() : nullptr )
1104 {
1105 const QList<QgsSymbolLayer *> layers = lSubSymbol->symbolLayers();
1106 for ( QgsSymbolLayer *sl : layers )
1107 sl->removeMasks( context, true );
1108 }
1109}
1110
1115
1116void QgsSymbolLayer::setId( const QString &id )
1117{
1118 mId = id;
1119}
1120
1121QString QgsSymbolLayer::id() const
1122{
1123 return mId;
1124}
1125
1126void QgsSymbolLayer::toSld( QDomDocument &doc, QDomElement &element, const QVariantMap &props ) const
1127{
1128 QgsSldExportContext context;
1129 context.setExtraProperties( props );
1130 toSld( doc, element, context );
1131}
1132
1133bool QgsSymbolLayer::toSld( QDomDocument &, QDomElement &, QgsSldExportContext &context ) const
1134{
1135 context.pushError( QObject::tr( "Symbol layer %1 cannot be converted to SLD" ).arg( layerType() ) );
1136 return false;
1137}
Provides global constants and enumerations for use throughout the application.
Definition qgis.h:54
@ AntialiasingSimplification
The geometries can be rendered with 'AntiAliasing' disabled because of it is '1-pixel size'.
@ ScaleDiameter
Calculate scale by the diameter.
@ ScaleArea
Calculate scale by the area.
QFlags< SymbolLayerFlag > SymbolLayerFlags
Symbol layer flags.
Definition qgis.h:851
QFlags< SymbolLayerUserFlag > SymbolLayerUserFlags
Symbol layer user flags.
Definition qgis.h:874
VerticalAnchorPoint
Marker symbol vertical anchor points.
Definition qgis.h:778
@ Bottom
Align to bottom of symbol.
@ Center
Align to vertical center of symbol.
@ Baseline
Align to baseline of symbol, e.g. font baseline for font marker symbol layers. Treated as Bottom if n...
@ Top
Align to top of symbol.
RenderUnit
Rendering size units.
Definition qgis.h:5029
@ Millimeters
Millimeters.
@ Unknown
Mixed or unknown units.
@ MetersInMapUnits
Meters value as Map units.
@ RenderSymbolPreview
The render is for a symbol preview only and map based properties may not be available,...
@ Linework
Combines all rings into a set of noded lines and then extracts valid polygons from that linework.
@ Structure
Structured method, first makes all rings valid and then merges shells and subtracts holes from shells...
@ DisableSelectionRecoloring
If present, indicates that the symbol layer should not be recolored when rendering selected features.
SymbolType
Symbol types.
Definition qgis.h:574
@ Marker
Marker symbol.
@ Line
Line symbol.
@ Fill
Fill symbol.
HorizontalAnchorPoint
Marker symbol horizontal anchor points.
Definition qgis.h:764
@ Center
Align to horizontal center of symbol.
@ Right
Align to right side of symbol.
@ Left
Align to left side of symbol.
static bool isGeneralizableByDeviceBoundingBox(const QgsRectangle &envelope, float mapToPixelTol=1.0f)
Returns whether the device-envelope can be replaced by its BBOX when is applied the specified toleran...
virtual QPainterPath asQPainterPath() const =0
Returns the geometry represented as a QPainterPath.
double valueAsDouble(int key, const QgsExpressionContext &context, double defaultValue=0.0, bool *ok=nullptr) const
Calculates the current value of the property with the specified key and interprets it as a double.
Exports QGIS layers to the DXF format.
static double mapUnitScaleFactor(double scale, Qgis::RenderUnit symbolUnits, Qgis::DistanceUnit mapUnits, double mapUnitsPerPixel=1.0)
Returns scale factor for conversion to map units.
Qgis::DistanceUnit mapUnits() const
Retrieve map units.
double symbologyScale() const
Returns the reference scale for output.
Single scope for storing variables and functions for use within a QgsExpressionContext.
void addVariable(const QgsExpressionContextScope::StaticVariable &variable)
Adds a variable into the context scope.
static const QString EXPR_GEOMETRY_RING_NUM
Inbuilt variable name for geometry ring number variable.
The feature class encapsulates a single feature including its unique ID, geometry and a list of field...
Definition qgsfeature.h:58
bool isEmpty
Definition qgsfields.h:49
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,...
void _renderPolygon(QPainter *p, const QPolygonF &points, const QVector< QPolygonF > *rings, QgsSymbolRenderContext &context)
Default method to render polygon.
virtual QImage toTiledPatternImage() const
Renders the symbol layer as an image that can be used as a seamless pattern fill for polygons,...
void drawPreviewIcon(QgsSymbolRenderContext &context, QSize size) override
QgsFillSymbolLayer(const QgsFillSymbolLayer &other)=delete
A geometry is the spatial representation of a feature.
static QgsGeometry fromRect(const QgsRectangle &rect)
Creates a new geometry from a QgsRectangle.
QgsGeometry difference(const QgsGeometry &geometry, const QgsGeometryParameters &parameters=QgsGeometryParameters()) const
Returns a geometry representing the points making up this geometry that do not make up other.
QgsGeometry makeValid(Qgis::MakeValidMethod method=Qgis::MakeValidMethod::Linework, bool keepCollapsed=false) const
Attempts to make an invalid geometry valid without losing vertices.
const QgsAbstractGeometry * constGet() const
Returns a non-modifiable (const) reference to the underlying abstract geometry primitive.
bool isEmpty() const
Returns true if the geometry is empty (eg a linestring with no vertices, or a collection with no geom...
static QgsGeometry unaryUnion(const QVector< QgsGeometry > &geometries, const QgsGeometryParameters &parameters=QgsGeometryParameters())
Compute the unary union on a list of geometries.
Does vector analysis using the GEOS library and handles import, export, and exception handling.
Definition qgsgeos.h:139
QList< QList< QPolygonF > > toQPolygonF(Qgis::SymbolType type, QSizeF size) const
Converts the patch shape to a set of QPolygonF objects representing how the patch should be drawn for...
Qgis::RenderUnit mOffsetUnit
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
RenderRingFilter ringFilter() const
Returns the line symbol layer's ring filter, which controls which rings are rendered when the line sy...
void drawPreviewIcon(QgsSymbolRenderContext &context, QSize size) override
QgsLineSymbolLayer(const QgsLineSymbolLayer &other)=delete
void setOutputUnit(Qgis::RenderUnit unit) override
Sets the units to use for sizes and widths within the symbol layer.
Qgis::RenderUnit outputUnit() const override
Returns the units to use for sizes and widths within the symbol layer.
virtual void renderPolygonStroke(const QPolygonF &points, const QVector< QPolygonF > *rings, QgsSymbolRenderContext &context)
Renders the line symbol layer along the outline of polygon, using the given render context.
Qgis::RenderUnit mWidthUnit
virtual void renderPolyline(const QPolygonF &points, QgsSymbolRenderContext &context)=0
Renders the line symbol layer along the line joining points, using the given render context.
RenderRingFilter mRingFilter
virtual double width() const
Returns the estimated width for the line symbol layer.
double dxfWidth(const QgsDxfExport &e, QgsSymbolRenderContext &context) const override
Gets line width.
QgsMapUnitScale mapUnitScale() const override
void setRingFilter(QgsLineSymbolLayer::RenderRingFilter filter)
Sets the line symbol layer's ring filter, which controls which rings are rendered when the line symbo...
void setMapUnitScale(const QgsMapUnitScale &scale) override
Qgis::RenderUnit widthUnit() const
Returns the units for the line's width.
double mapUnitsPerPixel() const
Returns the current map units per pixel.
Struct for storing maximum and minimum scales for measurements in map units.
Abstract base class for marker symbol layers.
double mSize
Marker size.
QgsMarkerSymbolLayer(const QgsMarkerSymbolLayer &other)
void drawPreviewIcon(QgsSymbolRenderContext &context, QSize size) override
Qgis::RenderUnit mOffsetUnit
Offset units.
QPointF offset() const
Returns the marker's offset, which is the horizontal and vertical displacement which the rendered mar...
bool toSld(QDomDocument &doc, QDomElement &element, QgsSldExportContext &context) const override
Saves the symbol layer as SLD.
Qgis::RenderUnit outputUnit() const override
Returns the units to use for sizes and widths within the symbol layer.
virtual void renderPoint(QPointF point, QgsSymbolRenderContext &context)=0
Renders a marker at the specified point.
QPointF mOffset
Marker offset.
QgsMapUnitScale mapUnitScale() const override
double size() const
Returns the symbol size.
Qgis::VerticalAnchorPoint verticalAnchorPoint() const
Returns the vertical anchor point for positioning the symbol.
QgsMapUnitScale mOffsetMapUnitScale
Offset map unit scale.
Qgis::VerticalAnchorPoint mVerticalAnchorPoint
Vertical anchor point.
static QPointF _rotatedOffset(QPointF offset, double angle)
Adjusts a marker offset to account for rotation.
virtual double dxfAngle(QgsSymbolRenderContext &context) const override
Gets angle.
Qgis::ScaleMethod mScaleMethod
Marker size scaling method.
virtual double dxfSize(const QgsDxfExport &e, QgsSymbolRenderContext &context) const override
Gets marker size.
Qgis::HorizontalAnchorPoint horizontalAnchorPoint() const
Returns the horizontal anchor point for positioning the symbol.
void stopRender(QgsSymbolRenderContext &context) override
Called after a set of rendering operations has finished on the supplied render context.
QgsMapUnitScale mSizeMapUnitScale
Marker size map unit scale.
Qgis::RenderUnit mSizeUnit
Marker size unit.
void setOutputUnit(Qgis::RenderUnit unit) override
Sets the units to use for sizes and widths within the symbol layer.
virtual Q_DECL_DEPRECATED void writeSldMarker(QDomDocument &doc, QDomElement &element, const QVariantMap &props) const
Writes the symbol layer definition as a SLD XML element.
void markerOffset(QgsSymbolRenderContext &context, double &offsetX, double &offsetY) const
Calculates the required marker offset, including both the symbol offset and any displacement required...
Qgis::HorizontalAnchorPoint mHorizontalAnchorPoint
Horizontal anchor point.
double mAngle
Marker rotation angle, in degrees clockwise from north.
void startRender(QgsSymbolRenderContext &context) override
Called before a set of rendering operations commences on the supplied render context.
double angle() const
Returns the rotation angle for the marker, in degrees clockwise from north.
void setMapUnitScale(const QgsMapUnitScale &scale) override
double simplifyTolerance() const
Returns the simplification tolerance (in painter units) to use for on-the-fly simplification of mask ...
static bool isDefaultStack(QgsPaintEffect *effect)
Tests whether a paint effect matches the default effects stack.
Base class for visual effects which can be applied to QPicture drawings.
bool enabled() const
Returns whether the effect is enabled.
QVariant value(int key, const QgsExpressionContext &context, const QVariant &defaultValue=QVariant()) const final
Returns the calculated value of the property with the specified key from within the collection.
void setProperty(int key, const QgsProperty &property)
Adds a property to the collection and takes ownership of it.
bool isActive(int key) const final
Returns true if the collection contains an active property with the specified key.
bool prepare(const QgsExpressionContext &context=QgsExpressionContext()) const final
Prepares the collection against a specified expression context.
bool hasActiveProperties() const final
Returns true if the collection has any active properties, or false if all properties within the colle...
QSet< QString > referencedFields(const QgsExpressionContext &context=QgsExpressionContext(), bool ignoreContext=false) const final
Returns the set of any fields referenced by the active properties from the collection.
Definition for a property.
Definition qgsproperty.h:45
@ HorizontalAnchor
Horizontal anchor point.
Definition qgsproperty.h:73
@ Double
Double value (including negative values)
Definition qgsproperty.h:55
@ VerticalAnchor
Vertical anchor point.
Definition qgsproperty.h:74
@ Double0To1
Double value between 0-1 (inclusive)
Definition qgsproperty.h:57
@ FillStyle
Fill style (eg solid, lines)
Definition qgsproperty.h:71
@ StrokeWidth
Line stroke width.
Definition qgsproperty.h:70
@ LineStyle
Line style (eg solid/dashed)
Definition qgsproperty.h:69
@ String
Any string value.
Definition qgsproperty.h:59
@ Boolean
Boolean value.
Definition qgsproperty.h:51
@ PenJoinStyle
Pen join style.
Definition qgsproperty.h:64
@ IntegerPositive
Positive integer values (including 0)
Definition qgsproperty.h:53
@ Opacity
Opacity (0-100)
Definition qgsproperty.h:60
@ CapStyle
Line cap style (eg round)
Definition qgsproperty.h:72
@ Rotation
Rotation (value between 0-360 degrees)
Definition qgsproperty.h:58
@ Size
1D size (eg marker radius, or square marker height/width)
Definition qgsproperty.h:67
@ ColorWithAlpha
Color with alpha channel.
Definition qgsproperty.h:62
@ DoublePositive
Positive double value (including 0)
Definition qgsproperty.h:56
@ DataTypeString
Property requires a string value.
Definition qgsproperty.h:90
@ DataTypeNumeric
Property requires a numeric value.
Definition qgsproperty.h:97
A store for object properties.
static QgsProperty fromExpression(const QString &expression, bool isActive=true)
Returns a new ExpressionBasedProperty created from the specified expression.
static QgsProperty fromField(const QString &fieldName, bool isActive=true)
Returns a new FieldBasedProperty created from the specified field name.
A rectangle specified with double values.
QgsRectangle intersect(const QgsRectangle &rect) const
Returns the intersection with the given rectangle.
Contains information about the context of a rendering operation.
QgsVectorSimplifyMethod & vectorSimplifyMethod()
Returns the simplification settings to use when rendering vector layers.
double convertToPainterUnits(double size, Qgis::RenderUnit unit, const QgsMapUnitScale &scale=QgsMapUnitScale(), Qgis::RenderSubcomponentProperty property=Qgis::RenderSubcomponentProperty::Generic) const
Converts a size from the specified units to painter units (pixels).
QPainter * painter()
Returns the destination QPainter for the render operation.
QgsExpressionContext & expressionContext()
Gets the expression context.
QSize outputSize() const
Returns the size of the resulting rendered image, in pixels.
const QgsMapToPixel & mapToPixel() const
Returns the context's map to pixel transform, which transforms between map coordinates and device coo...
QVector< QgsGeometry > symbolLayerClipGeometries(const QString &symbolLayerId) const
Returns clipping geometries to be applied to the symbolLayer before rendering.
Qgis::RenderContextFlags flags() const
Returns combination of flags used for rendering.
const QgsMaskRenderSettings & maskSettings() const
Returns a reference to the mask render settings, which control how masks are drawn and behave during ...
Holds SLD export options and other information related to SLD export of a QGIS layer style.
void setExtraProperties(const QVariantMap &properties)
Sets the open ended set of properties that can drive/inform the SLD encoding.
QVariantMap extraProperties() const
Returns the open ended set of properties that can drive/inform the SLD encoding.
void pushError(const QString &error)
Pushes a error message generated during the conversion.
static QgsStyle * defaultStyle(bool initialize=true)
Returns the default application-wide style.
Definition qgsstyle.cpp:146
QList< QList< QPolygonF > > defaultPatchAsQPolygonF(Qgis::SymbolType type, QSizeF size) const
Returns the default patch geometry for the given symbol type and size as a set of QPolygonF objects (...
static QPointF toPoint(const QVariant &value, bool *ok=nullptr)
Converts a value to a point.
static QVector< QgsGeometry > collectSymbolLayerClipGeometries(const QgsRenderContext &context, const QString &symbolLayerId, const QRectF &bounds)
Returns a list of the symbol layer clip geometries to be used for the symbol layer with the specified...
static Q_DECL_DEPRECATED void createGeometryElement(QDomDocument &doc, QDomElement &element, const QString &geomFunc)
Creates an SLD geometry element.
static QString encodePoint(QPointF point)
Encodes a QPointF to a string.
Abstract base class for symbol layers.
virtual bool setSubSymbol(QgsSymbol *symbol)
Sets layer's subsymbol. takes ownership of the passed symbol.
bool shouldRenderUsingSelectionColor(const QgsSymbolRenderContext &context) const
Returns true if the symbol layer should be rendered using the selection color from the render context...
Qgis::SymbolType type() const
virtual void startFeatureRender(const QgsFeature &feature, QgsRenderContext &context)
Called before the layer will be rendered for a particular feature.
virtual QColor fillColor() const
Returns the fill color for the symbol layer.
void setId(const QString &id)
Set symbol layer identifier This id has to be unique in the whole project.
virtual void setStrokeColor(const QColor &color)
Sets the stroke color for the symbol layer.
QPainterPath mClipPath
bool installMasks(QgsRenderContext &context, bool recursive, const QRectF &rect=QRectF())
When rendering, install masks on context painter.
virtual double dxfSize(const QgsDxfExport &e, QgsSymbolRenderContext &context) const
Gets marker size.
virtual double dxfOffset(const QgsDxfExport &e, QgsSymbolRenderContext &context) const
Gets offset.
virtual QColor dxfBrushColor(QgsSymbolRenderContext &context) const
Gets brush/fill color.
Qgis::SymbolType mType
void removeMasks(QgsRenderContext &context, bool recursive)
When rendering, remove previously installed masks from context painter if recursive is true masks are...
virtual QSet< QString > usedAttributes(const QgsRenderContext &context) const
Returns the set of attributes referenced by the layer.
void copyDataDefinedProperties(QgsSymbolLayer *destLayer) const
Copies all data defined properties of this layer to another symbol layer.
Property
Data definable properties.
@ SkipMultiples
Skip multiples of.
@ ArrowHeadLength
Arrow head length.
@ GradientType
Gradient fill type.
@ SecondaryColor
Secondary color (eg for gradient fills)
@ File
Filename, eg for svg files.
@ VerticalAnchor
Vertical anchor point.
@ GradientReference2Y
Gradient reference point 2 y.
@ GradientReference1X
Gradient reference point 1 x.
@ OffsetY
Vertical offset.
@ OffsetX
Horizontal offset.
@ GradientReference1Y
Gradient reference point 1 y.
@ ArrowWidth
Arrow tail width.
@ PointCount
Point count.
@ DashPatternOffset
Dash pattern offset,.
@ GradientSpread
Gradient spread mode.
@ OffsetAlongLine
Offset along line.
@ ArrowHeadType
Arrow head type.
@ CustomDash
Custom dash pattern.
@ ShapeburstMaxDistance
Shapeburst fill from edge distance.
@ HorizontalAnchor
Horizontal anchor point.
@ StrokeStyle
Stroke style (eg solid, dashed)
@ Name
Name, eg shape name for simple markers.
@ DistanceY
Vertical distance between points.
@ LineEndColorValue
End line color for interpolated line renderer.
@ DensityArea
Density area.
@ ClipPoints
Whether markers should be clipped to polygon boundaries.
@ ArrowHeadThickness
Arrow head thickness.
@ LineClipping
Line clipping mode.
@ ShapeburstIgnoreRings
Shapeburst ignore rings.
@ Character
Character, eg for font marker symbol layers.
@ ShapeburstUseWholeShape
Shapeburst use whole shape.
@ DisplacementX
Horizontal displacement.
@ ShowMarker
Show markers.
@ CoordinateMode
Gradient coordinate mode.
@ FillStyle
Fill style (eg solid, dots)
@ GradientReference2X
Gradient reference point 2 x.
@ StrokeColor
Stroke color.
@ TrimStart
Trim distance from start of line.
@ ArrowStartWidth
Arrow tail start width.
@ CapStyle
Line cap style.
@ BlurRadius
Shapeburst blur radius.
@ Placement
Line marker placement.
@ MarkerClipping
Marker clipping mode.
@ RandomSeed
Random number seed.
@ LineAngle
Line angle, or angle of hash lines for hash line symbols.
@ JoinStyle
Line join style.
@ RandomOffsetY
Random offset Y.
@ DisplacementY
Vertical displacement.
@ PreserveAspectRatio
Preserve aspect ratio between width and height.
@ LineStartColorValue
Start line color for interpolated line renderer.
@ DistanceX
Horizontal distance between points.
@ AverageAngleLength
Length to average symbol angles over.
@ LineEndWidthValue
End line width for interpolated line renderer.
@ GradientReference1IsCentroid
Gradient reference point 1 is centroid.
@ Interval
Line marker interval.
@ StrokeWidth
Stroke width.
@ FontFamily
Font family.
@ GradientReference2IsCentroid
Gradient reference point 2 is centroid.
@ LineStartWidthValue
Start line width for interpolated line renderer.
@ LineDistance
Distance between lines, or length of lines for hash line symbols.
@ Offset
Symbol offset.
@ RandomOffsetX
Random offset X.
@ TrimEnd
Trim distance from end of line.
@ Height
Symbol height.
@ LayerEnabled
Whether symbol layer is enabled.
void restoreOldDataDefinedProperties(const QVariantMap &stringMap)
Restores older data defined properties from string map.
void setPaintEffect(QgsPaintEffect *effect)
Sets the current paint effect for the layer.
void setRenderingPass(int renderingPass)
Specifies the rendering pass in which this symbol layer should be rendered.
QgsPaintEffect * paintEffect() const
Returns the current paint effect for the layer.
virtual void startRender(QgsSymbolRenderContext &context)=0
Called before a set of rendering operations commences on the supplied render context.
std::unique_ptr< QgsPaintEffect > mPaintEffect
virtual Qt::PenStyle dxfPenStyle() const
Gets pen style.
virtual void setFillColor(const QColor &color)
Sets the fill color for the symbol layer.
virtual void prepareExpressions(const QgsSymbolRenderContext &context)
Prepares all data defined property expressions for evaluation.
void setUserFlags(Qgis::SymbolLayerUserFlags flags)
Sets user-controlled flags which control the symbol layer's behavior.
virtual QColor dxfColor(QgsSymbolRenderContext &context) const
Gets color.
virtual QString layerType() const =0
Returns a string that represents this layer type.
int renderingPass() const
Specifies the rendering pass in which this symbol layer should be rendered.
virtual void stopRender(QgsSymbolRenderContext &context)=0
Called after a set of rendering operations has finished on the supplied render context.
virtual Q_DECL_DEPRECATED void toSld(QDomDocument &doc, QDomElement &element, const QVariantMap &props) const
Saves the symbol layer as SLD.
virtual bool isCompatibleWithSymbol(QgsSymbol *symbol) const
Returns if the layer can be used below the specified symbol.
QString id() const
Returns symbol layer identifier This id is unique in the whole project.
virtual void setDataDefinedProperty(Property key, const QgsProperty &property)
Sets a data defined property for the layer.
virtual void setColor(const QColor &color)
Sets the "representative" color for the symbol layer.
virtual QgsSymbol * subSymbol()
Returns the symbol's sub symbol, if present.
Qgis::SymbolLayerUserFlags userFlags() const
Returns user-controlled flags which control the symbol layer's behavior.
virtual QColor color() const
Returns the "representative" color of the symbol layer.
virtual void prepareMasks(const QgsSymbolRenderContext &context)
Prepares all mask internal objects according to what is defined in context This should be called prio...
virtual void stopFeatureRender(const QgsFeature &feature, QgsRenderContext &context)
Called after the layer has been rendered for a particular feature.
static const QgsPropertiesDefinition & propertyDefinitions()
Returns the symbol layer property definitions.
virtual double dxfWidth(const QgsDxfExport &e, QgsSymbolRenderContext &context) const
Gets line width.
virtual QColor strokeColor() const
Returns the stroke color for the symbol layer.
virtual double dxfAngle(QgsSymbolRenderContext &context) const
Gets angle.
Qgis::SymbolLayerUserFlags mUserFlags
User controlled flags.
virtual bool canCauseArtifactsBetweenAdjacentTiles() const
Returns true if the symbol layer rendering can cause visible artifacts across a single feature when t...
virtual ~QgsSymbolLayer()
virtual bool usesMapUnits() const
Returns true if the symbol layer has any components which use map unit based sizes.
virtual bool writeDxf(QgsDxfExport &e, double mmMapUnitScaleFactor, const QString &layerName, QgsSymbolRenderContext &context, QPointF shift=QPointF(0.0, 0.0)) const
write as DXF
void copyPaintEffect(QgsSymbolLayer *destLayer) const
Copies paint effect of this layer to another symbol layer.
virtual Qgis::SymbolLayerFlags flags() const
Returns flags which control the symbol layer's behavior.
QgsPropertyCollection mDataDefinedProperties
virtual QList< QgsSymbolLayerReference > masks() const
Returns masks defined by this symbol layer.
QgsPropertyCollection & dataDefinedProperties()
Returns a reference to the symbol layer's property collection, used for data defined overrides.
virtual Qt::BrushStyle dxfBrushStyle() const
Gets brush/fill style.
virtual QVector< qreal > dxfCustomDashPattern(Qgis::RenderUnit &unit) const
Gets dash pattern.
virtual bool hasDataDefinedProperties() const
Returns true if the symbol layer (or any of its sub-symbols) contains data defined properties.
QgsSymbolLayer(const QgsSymbolLayer &other)
void setDataDefinedProperties(const QgsPropertyCollection &collection)
Sets the symbol layer's property collection, used for data defined overrides.
Encapsulates the context in which a symbol is being rendered.
QgsFields fields() const
Fields of the layer.
bool selected() const
Returns true if symbols should be rendered using the selected symbol coloring and style.
void setOriginalValueVariable(const QVariant &value)
Sets the original value variable value for data defined symbology.
const QgsLegendPatchShape * patchShape() const
Returns the symbol patch shape, to use if rendering symbol preview icons.
QgsRenderContext & renderContext()
Returns a reference to the context's render context.
Abstract base class for all rendered symbols.
Definition qgssymbol.h:231
Qgis::SymbolType type() const
Returns the symbol's type.
Definition qgssymbol.h:294
static bool isNull(const QVariant &variant, bool silenceNullWarnings=false)
Returns true if the specified variant should be considered a NULL value.
Qgis::VectorRenderingSimplificationFlags simplifyHints() const
Gets the simplification hints of the vector layer managed.
float threshold() const
Gets the simplification threshold of the vector layer managed.
Contains geos related utilities and functions.
Definition qgsgeos.h:75
As part of the API refactoring and improvements which landed in the Processing API was substantially reworked from the x version This was done in order to allow much of the underlying Processing framework to be ported into c
QMap< int, QgsPropertyDefinition > QgsPropertiesDefinition
Definition of available properties.
QgsProperty propertyFromMap(const QVariantMap &map, const QString &baseName)
QPainterPath generateClipPath(const QgsRenderContext &renderContext, const QString &id, const QRectF *rect, bool &foundGeometries)
#define DEG2RAD(x)
Single variable definition for use within a QgsExpressionContextScope.