QGIS API Documentation 3.99.0-Master (d270888f95f)
Loading...
Searching...
No Matches
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
18#include "qgsdxfexport.h"
22#include "qgsgeos.h"
23#include "qgslegendpatchshape.h"
24#include "qgspainteffect.h"
26#include "qgsproperty.h"
27#include "qgsrendercontext.h"
28#include "qgssldexportcontext.h"
29#include "qgsstyle.h"
30#include "qgssymbol.h"
32#include "qgssymbollayerutils.h"
33
34#include <QPainter>
35#include <QPointF>
36#include <QPolygonF>
37#include <QSize>
38#include <QString>
39#include <QUuid>
40
41using namespace Qt::StringLiterals;
42
43QgsPropertiesDefinition QgsSymbolLayer::sPropertyDefinitions;
44
45void QgsSymbolLayer::initPropertyDefinitions()
46{
47 if ( !sPropertyDefinitions.isEmpty() )
48 return;
49
50 QString origin = u"symbol"_s;
51
52 sPropertyDefinitions = QgsPropertiesDefinition
53 {
54 { static_cast< int >( QgsSymbolLayer::Property::Size ), QgsPropertyDefinition( "size", QObject::tr( "Symbol size" ), QgsPropertyDefinition::Size, origin ) },
55 { static_cast< int >( QgsSymbolLayer::Property::Angle ), QgsPropertyDefinition( "angle", QObject::tr( "Rotation angle" ), QgsPropertyDefinition::Rotation, origin ) },
56 { static_cast< int >( QgsSymbolLayer::Property::Name ), QgsPropertyDefinition( "name", QObject::tr( "Symbol name" ), QgsPropertyDefinition::String, origin ) },
57 { static_cast< int >( QgsSymbolLayer::Property::FillColor ), QgsPropertyDefinition( "fillColor", QObject::tr( "Symbol fill color" ), QgsPropertyDefinition::ColorWithAlpha, origin ) },
58 { static_cast< int >( QgsSymbolLayer::Property::StrokeColor ), QgsPropertyDefinition( "outlineColor", QObject::tr( "Symbol stroke color" ), QgsPropertyDefinition::ColorWithAlpha, origin ) },
59 { static_cast< int >( QgsSymbolLayer::Property::StrokeWidth ), QgsPropertyDefinition( "outlineWidth", QObject::tr( "Symbol stroke width" ), QgsPropertyDefinition::StrokeWidth, origin ) },
60 { static_cast< int >( QgsSymbolLayer::Property::StrokeStyle ), QgsPropertyDefinition( "outlineStyle", QObject::tr( "Symbol stroke style" ), QgsPropertyDefinition::LineStyle, origin )},
61 { static_cast< int >( QgsSymbolLayer::Property::Offset ), QgsPropertyDefinition( "offset", QObject::tr( "Symbol offset" ), QgsPropertyDefinition::Offset, origin )},
62 { static_cast< int >( QgsSymbolLayer::Property::Character ), QgsPropertyDefinition( "char", QObject::tr( "Marker character(s)" ), QgsPropertyDefinition::String, origin )},
63 { static_cast< int >( QgsSymbolLayer::Property::FontFamily ), QgsPropertyDefinition( "fontFamily", QObject::tr( "Font family" ), QgsPropertyDefinition::String, origin )},
64 { static_cast< int >( QgsSymbolLayer::Property::FontStyle ), QgsPropertyDefinition( "fontStyle", QObject::tr( "Font style" ), QgsPropertyDefinition::String, origin )},
65 { static_cast< int >( QgsSymbolLayer::Property::Width ), QgsPropertyDefinition( "width", QObject::tr( "Symbol width" ), QgsPropertyDefinition::DoublePositive, origin )},
66 { static_cast< int >( QgsSymbolLayer::Property::Height ), QgsPropertyDefinition( "height", QObject::tr( "Symbol height" ), QgsPropertyDefinition::DoublePositive, origin )},
67 { static_cast< int >( QgsSymbolLayer::Property::PreserveAspectRatio ), QgsPropertyDefinition( "preserveAspectRatio", QObject::tr( "Preserve aspect ratio between width and height" ), QgsPropertyDefinition::Boolean, origin )},
68 { static_cast< int >( QgsSymbolLayer::Property::FillStyle ), QgsPropertyDefinition( "fillStyle", QObject::tr( "Symbol fill style" ), QgsPropertyDefinition::FillStyle, origin )},
69 { static_cast< int >( QgsSymbolLayer::Property::JoinStyle ), QgsPropertyDefinition( "joinStyle", QObject::tr( "Outline join style" ), QgsPropertyDefinition::PenJoinStyle, origin )},
70 { static_cast< int >( QgsSymbolLayer::Property::SecondaryColor ), QgsPropertyDefinition( "color2", QObject::tr( "Secondary fill color" ), QgsPropertyDefinition::ColorWithAlpha, origin )},
71 { static_cast< int >( QgsSymbolLayer::Property::LineAngle ), QgsPropertyDefinition( "lineAngle", QObject::tr( "Angle for line fills" ), QgsPropertyDefinition::Rotation, origin )},
72 { static_cast< int >( QgsSymbolLayer::Property::GradientType ), QgsPropertyDefinition( "gradientType", QgsPropertyDefinition::DataTypeString, QObject::tr( "Gradient type" ), QObject::tr( "string " ) + "[<b>linear</b>|<b>radial</b>|<b>conical</b>]"_L1, origin )},
73 { static_cast< int >( QgsSymbolLayer::Property::CoordinateMode ), QgsPropertyDefinition( "gradientMode", QgsPropertyDefinition::DataTypeString, QObject::tr( "Gradient mode" ), QObject::tr( "string " ) + "[<b>feature</b>|<b>viewport</b>]"_L1, origin )},
74 { static_cast< int >( QgsSymbolLayer::Property::GradientSpread ), QgsPropertyDefinition( "gradientSpread", QgsPropertyDefinition::DataTypeString, QObject::tr( "Gradient spread" ), QObject::tr( "string " ) + "[<b>pad</b>|<b>repeat</b>|<b>reflect</b>]"_L1, origin )},
75 { static_cast< int >( QgsSymbolLayer::Property::GradientReference1X ), QgsPropertyDefinition( "gradientRef1X", QObject::tr( "Reference point 1 (X)" ), QgsPropertyDefinition::Double0To1, origin )},
76 { static_cast< int >( QgsSymbolLayer::Property::GradientReference1Y ), QgsPropertyDefinition( "gradientRef1Y", QObject::tr( "Reference point 1 (Y)" ), QgsPropertyDefinition::Double0To1, origin )},
77 { static_cast< int >( QgsSymbolLayer::Property::GradientReference2X ), QgsPropertyDefinition( "gradientRef2X", QObject::tr( "Reference point 2 (X)" ), QgsPropertyDefinition::Double0To1, origin )},
78 { static_cast< int >( QgsSymbolLayer::Property::GradientReference2Y ), QgsPropertyDefinition( "gradientRef2Y", QObject::tr( "Reference point 2 (Y)" ), QgsPropertyDefinition::Double0To1, origin )},
79 { static_cast< int >( QgsSymbolLayer::Property::GradientReference1IsCentroid ), QgsPropertyDefinition( "gradientRef1Centroid", QObject::tr( "Reference point 1 follows feature centroid" ), QgsPropertyDefinition::Boolean, origin )},
80 { static_cast< int >( QgsSymbolLayer::Property::GradientReference2IsCentroid ), QgsPropertyDefinition( "gradientRef2Centroid", QObject::tr( "Reference point 2 follows feature centroid" ), QgsPropertyDefinition::Boolean, origin )},
81 { static_cast< int >( QgsSymbolLayer::Property::BlurRadius ), QgsPropertyDefinition( "blurRadius", QgsPropertyDefinition::DataTypeNumeric, QObject::tr( "Blur radius" ), QObject::tr( "Integer between 0 and 18" ), origin )},
82 { static_cast< int >( QgsSymbolLayer::Property::LineDistance ), QgsPropertyDefinition( "lineDistance", QObject::tr( "Distance between lines" ), QgsPropertyDefinition::DoublePositive, origin )},
83 { static_cast< int >( QgsSymbolLayer::Property::ShapeburstUseWholeShape ), QgsPropertyDefinition( "shapeburstWholeShape", QObject::tr( "Shade whole shape" ), QgsPropertyDefinition::Boolean, origin )},
84 { static_cast< int >( QgsSymbolLayer::Property::ShapeburstMaxDistance ), QgsPropertyDefinition( "shapeburstMaxDist", QObject::tr( "Maximum distance for shapeburst fill" ), QgsPropertyDefinition::DoublePositive, origin )},
85 { static_cast< int >( QgsSymbolLayer::Property::ShapeburstIgnoreRings ), QgsPropertyDefinition( "shapeburstIgnoreRings", QObject::tr( "Ignore rings in feature" ), QgsPropertyDefinition::Boolean, origin )},
86 { static_cast< int >( QgsSymbolLayer::Property::File ), QgsPropertyDefinition( "file", QObject::tr( "Symbol file path" ), QgsPropertyDefinition::String, origin )},
87 { static_cast< int >( QgsSymbolLayer::Property::DistanceX ), QgsPropertyDefinition( "distanceX", QObject::tr( "Horizontal distance between markers" ), QgsPropertyDefinition::DoublePositive, origin )},
88 { static_cast< int >( QgsSymbolLayer::Property::DistanceY ), QgsPropertyDefinition( "distanceY", QObject::tr( "Vertical distance between markers" ), QgsPropertyDefinition::DoublePositive, origin )},
89 { static_cast< int >( QgsSymbolLayer::Property::DisplacementX ), QgsPropertyDefinition( "displacementX", QObject::tr( "Horizontal displacement between rows" ), QgsPropertyDefinition::DoublePositive, origin )},
90 { static_cast< int >( QgsSymbolLayer::Property::DisplacementY ), QgsPropertyDefinition( "displacementY", QObject::tr( "Vertical displacement between columns" ), QgsPropertyDefinition::DoublePositive, origin )},
91 { static_cast< int >( QgsSymbolLayer::Property::OffsetX ), QgsPropertyDefinition( "offsetX", QObject::tr( "Horizontal offset" ), QgsPropertyDefinition::Double, origin )},
92 { static_cast< int >( QgsSymbolLayer::Property::OffsetY ), QgsPropertyDefinition( "offsetY", QObject::tr( "Vertical offset" ), QgsPropertyDefinition::Double, origin )},
93 { static_cast< int >( QgsSymbolLayer::Property::Opacity ), QgsPropertyDefinition( "alpha", QObject::tr( "Opacity" ), QgsPropertyDefinition::Opacity, origin )},
94 { 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 )},
95 { static_cast< int >( QgsSymbolLayer::Property::CapStyle ), QgsPropertyDefinition( "capStyle", QObject::tr( "Line cap style" ), QgsPropertyDefinition::CapStyle, origin )},
96 { 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 )},
97 { static_cast< int >( QgsSymbolLayer::Property::Interval ), QgsPropertyDefinition( "interval", QObject::tr( "Marker interval" ), QgsPropertyDefinition::DoublePositive, origin )},
98 { static_cast< int >( QgsSymbolLayer::Property::OffsetAlongLine ), QgsPropertyDefinition( "offsetAlongLine", QObject::tr( "Offset along line" ), QgsPropertyDefinition::Double, origin )},
99 { static_cast< int >( QgsSymbolLayer::Property::AverageAngleLength ), QgsPropertyDefinition( "averageAngleLength", QObject::tr( "Average line angles over" ), QgsPropertyDefinition::DoublePositive, origin )},
100 { static_cast< int >( QgsSymbolLayer::Property::HorizontalAnchor ), QgsPropertyDefinition( "hAnchor", QObject::tr( "Horizontal anchor point" ), QgsPropertyDefinition::HorizontalAnchor, origin )},
101 { static_cast< int >( QgsSymbolLayer::Property::VerticalAnchor ), QgsPropertyDefinition( "vAnchor", QObject::tr( "Vertical anchor point" ), QgsPropertyDefinition::VerticalAnchor, origin )},
102 { static_cast< int >( QgsSymbolLayer::Property::LayerEnabled ), QgsPropertyDefinition( "enabled", QObject::tr( "Layer enabled" ), QgsPropertyDefinition::Boolean, origin )},
103 { static_cast< int >( QgsSymbolLayer::Property::ArrowWidth ), QgsPropertyDefinition( "arrowWidth", QObject::tr( "Arrow line width" ), QgsPropertyDefinition::StrokeWidth, origin )},
104 { static_cast< int >( QgsSymbolLayer::Property::ArrowStartWidth ), QgsPropertyDefinition( "arrowStartWidth", QObject::tr( "Arrow line start width" ), QgsPropertyDefinition::StrokeWidth, origin )},
105 { static_cast< int >( QgsSymbolLayer::Property::ArrowHeadLength ), QgsPropertyDefinition( "arrowHeadLength", QObject::tr( "Arrow head length" ), QgsPropertyDefinition::DoublePositive, origin )},
106 { static_cast< int >( QgsSymbolLayer::Property::ArrowHeadThickness ), QgsPropertyDefinition( "arrowHeadThickness", QObject::tr( "Arrow head thickness" ), QgsPropertyDefinition::DoublePositive, origin )},
107 { static_cast< int >( QgsSymbolLayer::Property::ArrowHeadType ), QgsPropertyDefinition( "arrowHeadType", QgsPropertyDefinition::DataTypeString, QObject::tr( "Arrow head type" ), QObject::tr( "string " ) + "[<b>single</b>|<b>reversed</b>|<b>double</b>]"_L1, origin )},
108 { static_cast< int >( QgsSymbolLayer::Property::ArrowType ), QgsPropertyDefinition( "arrowType", QgsPropertyDefinition::DataTypeString, QObject::tr( "Arrow type" ), QObject::tr( "string " ) + "[<b>plain</b>|<b>lefthalf</b>|<b>righthalf</b>]"_L1, origin )},
109 { static_cast< int >( QgsSymbolLayer::Property::PointCount ), QgsPropertyDefinition( "pointCount", QObject::tr( "Point count" ), QgsPropertyDefinition::IntegerPositive, origin )},
110 { 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 )},
111 { static_cast< int >( QgsSymbolLayer::Property::ClipPoints ), QgsPropertyDefinition( "clipPoints", QObject::tr( "Clip markers" ), QgsPropertyDefinition::Boolean, origin )},
112 { static_cast< int >( QgsSymbolLayer::Property::DensityArea ), QgsPropertyDefinition( "densityArea", QObject::tr( "Density area" ), QgsPropertyDefinition::DoublePositive, origin )},
113 { static_cast< int >( QgsSymbolLayer::Property::DashPatternOffset ), QgsPropertyDefinition( "dashPatternOffset", QObject::tr( "Dash pattern offset" ), QgsPropertyDefinition::DoublePositive, origin )},
114 { static_cast< int >( QgsSymbolLayer::Property::TrimStart ), QgsPropertyDefinition( "trimStart", QObject::tr( "Start trim distance" ), QgsPropertyDefinition::DoublePositive, origin )},
115 { static_cast< int >( QgsSymbolLayer::Property::TrimEnd ), QgsPropertyDefinition( "trimEnd", QObject::tr( "End trim distance" ), QgsPropertyDefinition::DoublePositive, origin )},
116 { static_cast< int >( QgsSymbolLayer::Property::LineStartWidthValue ), QgsPropertyDefinition( "lineStartWidthValue", QObject::tr( "Line start width value" ), QgsPropertyDefinition::Double, origin )},
117 { static_cast< int >( QgsSymbolLayer::Property::LineEndWidthValue ), QgsPropertyDefinition( "lineEndWidthValue", QObject::tr( "Line end width value" ), QgsPropertyDefinition::Double, origin )},
118 { static_cast< int >( QgsSymbolLayer::Property::LineStartColorValue ), QgsPropertyDefinition( "lineStartColorValue", QObject::tr( "Line start color value" ), QgsPropertyDefinition::Double, origin )},
119 { static_cast< int >( QgsSymbolLayer::Property::LineEndColorValue ), QgsPropertyDefinition( "lineEndColorValue", QObject::tr( "Line end color value" ), QgsPropertyDefinition::Double, origin )},
120 { static_cast< int >( QgsSymbolLayer::Property::MarkerClipping ), QgsPropertyDefinition( "markerClipping", QgsPropertyDefinition::DataTypeString, QObject::tr( "Marker clipping mode" ), QObject::tr( "string " ) + "[<b>no</b>|<b>shape</b>|<b>centroid_within</b>|<b>completely_within</b>]"_L1, origin )},
121 { static_cast< int >( QgsSymbolLayer::Property::RandomOffsetX ), QgsPropertyDefinition( "randomOffsetX", QObject::tr( "Horizontal random offset" ), QgsPropertyDefinition::Double, origin )},
122 { static_cast< int >( QgsSymbolLayer::Property::RandomOffsetY ), QgsPropertyDefinition( "randomOffsetY", QObject::tr( "Vertical random offset" ), QgsPropertyDefinition::Double, origin )},
123 { static_cast< int >( QgsSymbolLayer::Property::LineClipping ), QgsPropertyDefinition( "lineClipping", QgsPropertyDefinition::DataTypeString, QObject::tr( "Line clipping mode" ), QObject::tr( "string " ) + "[<b>no</b>|<b>during_render</b>|<b>before_render</b>]"_L1, origin )},
124 { static_cast< int >( QgsSymbolLayer::Property::SkipMultiples ), QgsPropertyDefinition( "skipMultiples", QObject::tr( "Skip multiples of" ), QgsPropertyDefinition::DoublePositive, origin )},
125 { static_cast< int >( QgsSymbolLayer::Property::ShowMarker ), QgsPropertyDefinition( "showMarker", QObject::tr( "Show marker" ), QgsPropertyDefinition::Boolean, origin )},
126 { static_cast< int >( QgsSymbolLayer::Property::BlankSegments ), QgsPropertyDefinition( "blankSegments", QObject::tr( "Line blank segments" ), QgsPropertyDefinition::String, origin )},
127 };
128}
129
134
136{
137 installMasks( context, false );
138
139 if ( QgsSymbol *lSubSymbol = subSymbol() )
140 lSubSymbol->startFeatureRender( feature, context );
141}
142
144{
145 if ( QgsSymbol *lSubSymbol = subSymbol() )
146 lSubSymbol->stopFeatureRender( feature, context );
147
148 removeMasks( context, false );
149}
150
152{
153 return nullptr;
154}
155
157{
158 delete symbol;
159 return false;
160}
161
162bool QgsSymbolLayer::writeDxf( QgsDxfExport &e, double mmMapUnitScaleFactor, const QString &layerName, QgsSymbolRenderContext &context, QPointF shift ) const
163{
164 Q_UNUSED( e )
165 Q_UNUSED( mmMapUnitScaleFactor )
166 Q_UNUSED( layerName )
167 Q_UNUSED( context )
168 Q_UNUSED( shift )
169 return false;
170}
171
173{
174 Q_UNUSED( e )
175 Q_UNUSED( context )
176 return 1.0;
177}
178
180{
181 Q_UNUSED( e )
182 Q_UNUSED( context )
183 return 1.0;
184}
185
187{
188 Q_UNUSED( e )
189 Q_UNUSED( context )
190 return 0.0;
191}
192
194{
195 Q_UNUSED( context )
196 return color();
197}
198
200{
201 Q_UNUSED( context )
202 return 0.0;
203}
204
206{
207 Q_UNUSED( unit )
208 return QVector<qreal>();
209}
210
211Qt::PenStyle QgsSymbolLayer::dxfPenStyle() const
212{
213 return Qt::SolidLine;
214}
215
217{
218 Q_UNUSED( context )
219 return color();
220}
221
222Qt::BrushStyle QgsSymbolLayer::dxfBrushStyle() const
223{
224 return Qt::NoBrush;
225}
226
228{
229 return mPaintEffect.get();
230}
231
233{
234 if ( effect == mPaintEffect.get() )
235 return;
236
237 mPaintEffect.reset( effect );
238}
239
241 : mType( other.mType )
242 , mEnabled( other.mEnabled )
243 , mUserFlags( other.mUserFlags )
244 , mLocked( other.mLocked )
245 , mColor( other.mColor )
247 , mId( other.mId )
249 , mPaintEffect( other.mPaintEffect ? other.mPaintEffect->clone() : nullptr )
250 , mFields( other.mFields )
251 , mClipPath( other.mClipPath )
252{
253}
254
256 : mType( type )
257 , mLocked( locked )
258 , mId( QUuid::createUuid().toString() )
259{
260}
261
263{
264 if ( !other )
265 return false;
266
267 if ( layerType() != other->layerType() )
268 return false;
269
270 // TODO -- we could consider each property individually
272 return false;
273
274 // shortcut now that we know there's no randomness/changing overrides involved
275 if ( other == this )
276 return true;
277
278 if ( mEnabled != other->mEnabled
279 || mColor != other->mColor
280 || mRenderingPass != other->mRenderingPass
281
282 // TODO -- we could consider the actual settings of the paint effect
284 || ( other->mPaintEffect && !QgsPaintEffectRegistry::isDefaultStack( other->mPaintEffect.get() ) ) )
285 return false;
286
287 return properties() == other->properties();
288}
289
294
299
304
306{
307 return mColor;
308}
309
310void QgsSymbolLayer::setColor( const QColor &color )
311{
312 mColor = color;
313}
314
315void QgsSymbolLayer::setStrokeColor( const QColor & )
316{
317
318}
319
321{
322 return QColor();
323}
324
325void QgsSymbolLayer::setFillColor( const QColor & )
326{
327}
328
330{
331 return QColor();
332}
333
335{
337
338 if ( !context.fields().isEmpty() )
339 {
340 //QgsFields is implicitly shared, so it's cheap to make a copy
341 mFields = context.fields();
342 }
343}
344
346{
347 return mDataDefinedProperties.hasActiveProperties();
348}
349
351{
352 QgsSymbolLayer::initPropertyDefinitions();
353 return sPropertyDefinitions;
354}
355
357
359{
361 return true;
362
363 return symbol->type() == mType;
364}
365
367{
368 return false;
369}
370
372{
373 return false;
374}
375
380
382{
383 return mRenderingPass;
384}
385
386QSet<QString> QgsSymbolLayer::usedAttributes( const QgsRenderContext &context ) const
387{
388 // calling referencedFields() with ignoreContext=true because in our expression context
389 // we do not have valid QgsFields yet - because of that the field names from expressions
390 // wouldn't get reported
391 QSet<QString> columns = mDataDefinedProperties.referencedFields( context.expressionContext(), true );
392 return columns;
393}
394
395QgsProperty propertyFromMap( const QVariantMap &map, const QString &baseName )
396{
397 QString prefix;
398 if ( !baseName.isEmpty() )
399 {
400 prefix.append( u"%1_dd_"_s.arg( baseName ) );
401 }
402
403 if ( !map.contains( u"%1expression"_s.arg( prefix ) ) )
404 {
405 //requires at least the expression value
406 return QgsProperty();
407 }
408
409 bool active = ( map.value( u"%1active"_s.arg( prefix ), u"1"_s ) != "0"_L1 );
410 QString expression = map.value( u"%1expression"_s.arg( prefix ) ).toString();
411 bool useExpression = ( map.value( u"%1useexpr"_s.arg( prefix ), u"1"_s ) != "0"_L1 );
412 QString field = map.value( u"%1field"_s.arg( prefix ), QString() ).toString();
413
414 if ( useExpression )
415 return QgsProperty::fromExpression( expression, active );
416 else
417 return QgsProperty::fromField( field, active );
418}
419
420void QgsSymbolLayer::restoreOldDataDefinedProperties( const QVariantMap &stringMap )
421{
422 // property string to type upgrade map
423 static const QMap < QString, int > OLD_PROPS
424 {
425 { "color", static_cast< int >( QgsSymbolLayer::Property::FillColor ) },
426 { "arrow_width", static_cast< int >( QgsSymbolLayer::Property::ArrowWidth ) },
427 { "arrow_start_width", static_cast< int >( QgsSymbolLayer::Property::ArrowStartWidth ) },
428 { "head_length", static_cast< int >( QgsSymbolLayer::Property::ArrowHeadLength ) },
429 { "head_thickness", static_cast< int >( QgsSymbolLayer::Property::ArrowHeadThickness ) },
430 { "offset", static_cast< int >( QgsSymbolLayer::Property::Offset ) },
431 { "head_type", static_cast< int >( QgsSymbolLayer::Property::ArrowHeadType ) },
432 { "arrow_type", static_cast< int >( QgsSymbolLayer::Property::ArrowType ) },
433 { "width_field", static_cast< int >( QgsSymbolLayer::Property::Width ) },
434 { "height_field", static_cast< int >( QgsSymbolLayer::Property::Height ) },
435 { "rotation_field", static_cast< int >( QgsSymbolLayer::Property::Angle ) },
436 { "outline_width_field", static_cast< int >( QgsSymbolLayer::Property::StrokeWidth ) },
437 { "fill_color_field", static_cast< int >( QgsSymbolLayer::Property::FillColor ) },
438 { "outline_color_field", static_cast< int >( QgsSymbolLayer::Property::StrokeColor ) },
439 { "symbol_name_field", static_cast< int >( QgsSymbolLayer::Property::Name ) },
440 { "outline_width", static_cast< int >( QgsSymbolLayer::Property::StrokeWidth ) },
441 { "outline_style", static_cast< int >( QgsSymbolLayer::Property::StrokeStyle ) },
442 { "join_style", static_cast< int >( QgsSymbolLayer::Property::JoinStyle ) },
443 { "fill_color", static_cast< int >( QgsSymbolLayer::Property::FillColor ) },
444 { "outline_color", static_cast< int >( QgsSymbolLayer::Property::StrokeColor ) },
445 { "width", static_cast< int >( QgsSymbolLayer::Property::Width ) },
446 { "height", static_cast< int >( QgsSymbolLayer::Property::Height ) },
447 { "symbol_name", static_cast< int >( QgsSymbolLayer::Property::Name ) },
448 { "angle", static_cast< int >( QgsSymbolLayer::Property::Angle ) },
449 { "fill_style", static_cast< int >( QgsSymbolLayer::Property::FillStyle ) },
450 { "color_border", static_cast< int >( QgsSymbolLayer::Property::StrokeColor ) },
451 { "width_border", static_cast< int >( QgsSymbolLayer::Property::StrokeWidth ) },
452 { "border_color", static_cast< int >( QgsSymbolLayer::Property::StrokeColor ) },
453 { "border_style", static_cast< int >( QgsSymbolLayer::Property::StrokeStyle ) },
454 { "color2", static_cast< int >( QgsSymbolLayer::Property::SecondaryColor ) },
455 { "gradient_type", static_cast< int >( QgsSymbolLayer::Property::GradientType ) },
456 { "coordinate_mode", static_cast< int >( QgsSymbolLayer::Property::CoordinateMode )},
457 { "spread", static_cast< int >( QgsSymbolLayer::Property::GradientSpread ) },
458 { "reference1_x", static_cast< int >( QgsSymbolLayer::Property::GradientReference1X ) },
459 { "reference1_y", static_cast< int >( QgsSymbolLayer::Property::GradientReference1Y ) },
460 { "reference2_x", static_cast< int >( QgsSymbolLayer::Property::GradientReference2X ) },
461 { "reference2_y", static_cast< int >( QgsSymbolLayer::Property::GradientReference2Y )},
462 { "reference1_iscentroid", static_cast< int >( QgsSymbolLayer::Property::GradientReference1IsCentroid )},
463 { "reference2_iscentroid", static_cast< int >( QgsSymbolLayer::Property::GradientReference2IsCentroid )},
464 { "blur_radius", static_cast< int >( QgsSymbolLayer::Property::BlurRadius ) },
465 { "use_whole_shape", static_cast< int >( QgsSymbolLayer::Property::ShapeburstUseWholeShape ) },
466 { "max_distance", static_cast< int >( QgsSymbolLayer::Property::ShapeburstMaxDistance ) },
467 { "ignore_rings", static_cast< int >( QgsSymbolLayer::Property::ShapeburstIgnoreRings ) },
468 { "svgFillColor", static_cast< int >( QgsSymbolLayer::Property::FillColor ) },
469 { "svgOutlineColor", static_cast< int >( QgsSymbolLayer::Property::StrokeColor ) },
470 { "svgOutlineWidth", static_cast< int >( QgsSymbolLayer::Property::StrokeWidth ) },
471 { "svgFile", static_cast< int >( QgsSymbolLayer::Property::File ) },
472 { "lineangle", static_cast< int >( QgsSymbolLayer::Property::LineAngle ) },
473 { "distance", static_cast< int >( QgsSymbolLayer::Property::LineDistance )},
474 { "distance_x", static_cast< int >( QgsSymbolLayer::Property::DistanceX )},
475 { "distance_y", static_cast< int >( QgsSymbolLayer::Property::DistanceY ) },
476 { "displacement_x", static_cast< int >( QgsSymbolLayer::Property::DisplacementX )},
477 { "displacement_y", static_cast< int >( QgsSymbolLayer::Property::DisplacementY ) },
478 { "file", static_cast< int >( QgsSymbolLayer::Property::File ) },
479 { "alpha", static_cast< int >( QgsSymbolLayer::Property::Opacity )},
480 { "customdash", static_cast< int >( QgsSymbolLayer::Property::CustomDash ) },
481 { "line_style", static_cast< int >( QgsSymbolLayer::Property::StrokeStyle ) },
482 { "joinstyle", static_cast< int >( QgsSymbolLayer::Property::JoinStyle ) },
483 { "capstyle", static_cast< int >( QgsSymbolLayer::Property::CapStyle ) },
484 { "placement", static_cast< int >( QgsSymbolLayer::Property::Placement ) },
485 { "interval", static_cast< int >( QgsSymbolLayer::Property::Interval ) },
486 { "offset_along_line", static_cast< int >( QgsSymbolLayer::Property::OffsetAlongLine ) },
487 { "name", static_cast< int >( QgsSymbolLayer::Property::Name ) },
488 { "size", static_cast< int >( QgsSymbolLayer::Property::Size ) },
489 { "fill", static_cast< int >( QgsSymbolLayer::Property::FillColor ) },
490 { "outline", static_cast< int >( QgsSymbolLayer::Property::StrokeColor )},
491 { "char", static_cast< int >( QgsSymbolLayer::Property::Character )},
492 { "enabled", static_cast< int >( QgsSymbolLayer::Property::LayerEnabled ) },
493 { "rotation", static_cast< int >( QgsSymbolLayer::Property::Angle )},
494 { "horizontal_anchor_point", static_cast< int >( QgsSymbolLayer::Property::HorizontalAnchor ) },
495 { "vertical_anchor_point", static_cast< int >( QgsSymbolLayer::Property::VerticalAnchor ) },
496 };
497
498 QVariantMap::const_iterator propIt = stringMap.constBegin();
499 for ( ; propIt != stringMap.constEnd(); ++propIt )
500 {
501 std::unique_ptr<QgsProperty> prop;
502 QString propertyName;
503
504 if ( propIt.key().endsWith( "_dd_expression"_L1 ) )
505 {
506 //found a data defined property
507
508 //get data defined property name by stripping "_dd_expression" from property key
509 propertyName = propIt.key().left( propIt.key().length() - 14 );
510
511 prop = std::make_unique<QgsProperty>( propertyFromMap( stringMap, propertyName ) );
512 }
513 else if ( propIt.key().endsWith( "_expression"_L1 ) )
514 {
515 //old style data defined property, upgrade
516
517 //get data defined property name by stripping "_expression" from property key
518 propertyName = propIt.key().left( propIt.key().length() - 11 );
519
520 prop = std::make_unique<QgsProperty>( QgsProperty::fromExpression( propIt.value().toString() ) );
521 }
522
523 if ( !prop || !OLD_PROPS.contains( propertyName ) )
524 continue;
525
526 int key = OLD_PROPS.value( propertyName );
527
528 if ( type() == Qgis::SymbolType::Line )
529 {
530 //these keys had different meaning for line symbol layers
531 if ( propertyName == "width"_L1 )
532 key = static_cast< int >( QgsSymbolLayer::Property::StrokeWidth );
533 else if ( propertyName == "color"_L1 )
534 key = static_cast< int >( QgsSymbolLayer::Property::StrokeColor );
535 }
536
537 setDataDefinedProperty( static_cast< QgsSymbolLayer::Property >( key ), QgsProperty( *prop.get() ) );
538 }
539}
540
542{
543 if ( !destLayer )
544 return;
545
547}
548
550{
551 if ( !destLayer || !mPaintEffect )
552 return;
553
555 destLayer->setPaintEffect( mPaintEffect->clone() );
556 else
557 destLayer->setPaintEffect( nullptr );
558}
559
561 : QgsSymbolLayer( Qgis::SymbolType::Marker, locked )
562{
563
564}
565
567 : QgsSymbolLayer( Qgis::SymbolType::Line, locked )
568{
569}
570
575
577{
578 mRingFilter = filter;
579}
580
582 : QgsSymbolLayer( Qgis::SymbolType::Fill, locked )
583{
584}
585
602
604{
605 Q_UNUSED( context )
606}
607
609{
610 Q_UNUSED( context )
611}
612
614{
615 startRender( context );
616 QgsPaintEffect *effect = paintEffect();
617
618 QPolygonF points = context.patchShape() ? context.patchShape()->toQPolygonF( Qgis::SymbolType::Marker, size ).value( 0 ).value( 0 )
620
621 std::unique_ptr< QgsEffectPainter > effectPainter;
622 if ( effect && effect->enabled() )
623 effectPainter = std::make_unique< QgsEffectPainter >( context.renderContext(), effect );
624
625 for ( QPointF point : std::as_const( points ) )
626 renderPoint( point, context );
627
628 effectPainter.reset();
629
630 stopRender( context );
631}
632
633void QgsMarkerSymbolLayer::markerOffset( QgsSymbolRenderContext &context, double &offsetX, double &offsetY ) const
634{
636}
637
638void QgsMarkerSymbolLayer::markerOffset( QgsSymbolRenderContext &context, double width, double height, double &offsetX, double &offsetY ) const
639{
640 markerOffset( context, width, height, mSizeUnit, mSizeUnit, offsetX, offsetY, mSizeMapUnitScale, mSizeMapUnitScale );
641}
642
643void QgsMarkerSymbolLayer::markerOffset( QgsSymbolRenderContext &context, double width, double height,
644 Qgis::RenderUnit widthUnit, Qgis::RenderUnit heightUnit,
645 double &offsetX, double &offsetY, const QgsMapUnitScale &widthMapUnitScale, const QgsMapUnitScale &heightMapUnitScale ) const
646{
647 offsetX = mOffset.x();
648 offsetY = mOffset.y();
649
651 {
654 bool ok = false;
655 const QPointF offset = QgsSymbolLayerUtils::toPoint( exprVal, &ok );
656 if ( ok )
657 {
658 offsetX = offset.x();
659 offsetY = offset.y();
660 }
661 }
662
665
669 {
671 if ( !QgsVariantUtils::isNull( exprVal ) )
672 {
673 horizontalAnchorPoint = decodeHorizontalAnchorPoint( exprVal.toString() );
674 }
675 }
677 {
679 if ( !QgsVariantUtils::isNull( exprVal ) )
680 {
681 verticalAnchorPoint = decodeVerticalAnchorPoint( exprVal.toString() );
682 }
683 }
684
685 //correct horizontal position according to anchor point
687 {
688 return;
689 }
690
691 double anchorPointCorrectionX = context.renderContext().convertToPainterUnits( width, widthUnit, widthMapUnitScale ) / 2.0;
693 {
694 // rendering for symbol previews -- an size in meters in map units can't be calculated, so treat the size as millimeters
695 // and clamp it to a reasonable range. It's the best we can do in this situation!
696 anchorPointCorrectionX = std::min( std::max( context.renderContext().convertToPainterUnits( width, Qgis::RenderUnit::Millimeters ), 3.0 ), 100.0 ) / 2.0;
697 }
698
699 double anchorPointCorrectionY = context.renderContext().convertToPainterUnits( height, heightUnit, heightMapUnitScale ) / 2.0;
701 {
702 // rendering for symbol previews -- an size in meters in map units can't be calculated, so treat the size as millimeters
703 // and clamp it to a reasonable range. It's the best we can do in this situation!
704 anchorPointCorrectionY = std::min( std::max( context.renderContext().convertToPainterUnits( height, Qgis::RenderUnit::Millimeters ), 3.0 ), 100.0 ) / 2.0;
705 }
706
707 switch ( horizontalAnchorPoint )
708 {
710 offsetX += anchorPointCorrectionX;
711 break;
713 offsetX -= anchorPointCorrectionX;
714 break;
716 break;
717 }
718
719 //correct vertical position according to anchor point
720 switch ( verticalAnchorPoint )
721 {
723 offsetY += anchorPointCorrectionY;
724 break;
727 offsetY -= anchorPointCorrectionY;
728 break;
730 break;
731 }
732}
733
735{
736 angle = DEG2RAD( angle );
737 double c = std::cos( angle ), s = std::sin( angle );
738 return QPointF( offset.x() * c - offset.y() * s, offset.x() * s + offset.y() * c );
739}
740
741Qgis::HorizontalAnchorPoint QgsMarkerSymbolLayer::decodeHorizontalAnchorPoint( const QString &str )
742{
743 if ( str.compare( "left"_L1, Qt::CaseInsensitive ) == 0 )
744 {
746 }
747 else if ( str.compare( "right"_L1, Qt::CaseInsensitive ) == 0 )
748 {
750 }
751 else
752 {
754 }
755}
756
757Qgis::VerticalAnchorPoint QgsMarkerSymbolLayer::decodeVerticalAnchorPoint( const QString &str )
758{
759 if ( str.compare( "top"_L1, Qt::CaseInsensitive ) == 0 )
760 {
762 }
763 else if ( str.compare( "bottom"_L1, Qt::CaseInsensitive ) == 0 )
764 {
766 }
767 else
768 {
770 }
771}
772
774{
775 mSizeUnit = unit;
776 mOffsetUnit = unit;
777}
778
780{
781 if ( mOffsetUnit != mSizeUnit )
782 {
784 }
785 return mOffsetUnit;
786}
787
793
802
804{
805 mWidthUnit = unit;
806 mOffsetUnit = unit;
807}
808
813
818
823
824
826{
827 const QList< QList< QPolygonF > > points = context.patchShape() ? context.patchShape()->toQPolygonF( Qgis::SymbolType::Line, size )
829 startRender( context );
830 QgsPaintEffect *effect = paintEffect();
831
832 std::unique_ptr< QgsEffectPainter > effectPainter;
833 if ( effect && effect->enabled() )
834 effectPainter = std::make_unique< QgsEffectPainter >( context.renderContext(), effect );
835
836 for ( const QList< QPolygonF > &line : points )
837 renderPolyline( line.value( 0 ), context );
838
839 effectPainter.reset();
840
841 stopRender( context );
842}
843
844void QgsLineSymbolLayer::renderPolygonStroke( const QPolygonF &points, const QVector<QPolygonF> *rings, QgsSymbolRenderContext &context )
845{
846 QgsExpressionContextScope *scope = nullptr;
847 std::unique_ptr< QgsExpressionContextScopePopper > scopePopper;
849 {
850 scope = new QgsExpressionContextScope();
851 scopePopper = std::make_unique< QgsExpressionContextScopePopper >( context.renderContext().expressionContext(), scope );
852 }
853
854 switch ( mRingFilter )
855 {
856 case AllRings:
857 case ExteriorRingOnly:
858 {
859 if ( scope )
861 renderPolyline( points, context );
862 break;
863 }
865 break;
866 }
867
868 if ( rings )
869 {
870 switch ( mRingFilter )
871 {
872 case AllRings:
874 {
875 int ringIndex = 1;
876 for ( const QPolygonF &ring : std::as_const( *rings ) )
877 {
878 if ( scope )
880
881 renderPolyline( ring, context );
882 ringIndex++;
883 }
884 }
885 break;
886 case ExteriorRingOnly:
887 break;
888 }
889 }
890}
891
892double QgsLineSymbolLayer::width( const QgsRenderContext &context ) const
893{
895}
896
898{
899 Q_UNUSED( context )
901}
902
903
905{
906 const QList< QList< QPolygonF > > polys = context.patchShape() ? context.patchShape()->toQPolygonF( Qgis::SymbolType::Fill, size )
908
909 startRender( context );
910 QgsPaintEffect *effect = paintEffect();
911
912 std::unique_ptr< QgsEffectPainter > effectPainter;
913 if ( effect && effect->enabled() )
914 effectPainter = std::make_unique< QgsEffectPainter >( context.renderContext(), effect );
915
916 for ( const QList< QPolygonF > &poly : polys )
917 {
918 QVector< QPolygonF > rings;
919 for ( int i = 1; i < poly.size(); ++i )
920 rings << poly.at( i );
921 renderPolygon( poly.value( 0 ), &rings, context );
922 }
923
924 effectPainter.reset();
925
926 stopRender( context );
927}
928
930{
931 return QImage();
932}
933
934void QgsFillSymbolLayer::_renderPolygon( QPainter *p, const QPolygonF &points, const QVector<QPolygonF> *rings, QgsSymbolRenderContext &context )
935{
936 if ( !p )
937 {
938 return;
939 }
940
941 // Disable 'Antialiasing' if the geometry was generalized in the current RenderContext (We known that it must have least #5 points).
942 if ( points.size() <= 5 &&
945 ( p->renderHints() & QPainter::Antialiasing ) )
946 {
947 p->setRenderHint( QPainter::Antialiasing, false );
948 p->drawRect( points.boundingRect() );
949 p->setRenderHint( QPainter::Antialiasing, true );
950 return;
951 }
952
953 // polygons outlines are sometimes rendered wrongly with drawPolygon, when
954 // clipped (see #13343), so use drawPath instead.
955 if ( !rings && p->pen().style() == Qt::NoPen )
956 {
957 // simple polygon without holes
958 p->drawPolygon( points );
959 }
960 else
961 {
962 // polygon with holes must be drawn using painter path
963 QPainterPath path;
964 path.addPolygon( points );
965
966 if ( rings )
967 {
968 for ( auto it = rings->constBegin(); it != rings->constEnd(); ++it )
969 {
970 QPolygonF ring = *it;
971 path.addPolygon( ring );
972 }
973 }
974
975 p->drawPath( path );
976 }
977}
978
979bool QgsMarkerSymbolLayer::toSld( QDomDocument &doc, QDomElement &element, QgsSldExportContext &context ) const
980{
981 QDomElement symbolizerElem = doc.createElement( u"se:PointSymbolizer"_s );
982 const QVariantMap props = context.extraProperties();
983 if ( !props.value( u"uom"_s, QString() ).toString().isEmpty() )
984 symbolizerElem.setAttribute( u"uom"_s, props.value( u"uom"_s, QString() ).toString() );
985 element.appendChild( symbolizerElem );
986
987 // <Geometry>
988 QgsSymbolLayerUtils::createGeometryElement( doc, symbolizerElem, props.value( u"geom"_s, QString() ).toString(), context );
989
990 return writeSldMarker( doc, symbolizerElem, context );
991}
992
993void QgsMarkerSymbolLayer::writeSldMarker( QDomDocument &doc, QDomElement &element, const QVariantMap &props ) const
994{
995 QgsSldExportContext context;
996 context.setExtraProperties( props );
997 writeSldMarker( doc, element, context );
998}
999
1000bool QgsMarkerSymbolLayer::writeSldMarker( QDomDocument &, QDomElement &, QgsSldExportContext &context ) const
1001{
1002 context.pushError( QObject::tr( "Marker symbol layer %1 cannot be converted to SLD" ).arg( layerType() ) );
1003 return false;
1004}
1005
1006QList<QgsSymbolLayerReference> QgsSymbolLayer::masks() const
1007{
1008 return {};
1009}
1010
1012{
1013 double size = mSize;
1015 {
1016 bool ok = false;
1018
1019 if ( ok )
1020 {
1021 switch ( mScaleMethod )
1022 {
1024 size = std::sqrt( size );
1025 break;
1027 break;
1028 }
1029 }
1030 }
1032}
1033
1035{
1036 double angle = mAngle;
1038 {
1041 }
1042 return angle;
1043}
1044
1045QPainterPath generateClipPath( const QgsRenderContext &renderContext, const QString &id, const QRectF *rect, bool &foundGeometries )
1046{
1047 foundGeometries = false;
1048 const QVector<QgsGeometry> clipGeometries = rect
1049 ? QgsSymbolLayerUtils::collectSymbolLayerClipGeometries( renderContext, id, *rect )
1050 : renderContext.symbolLayerClipGeometries( id );
1051 if ( !clipGeometries.empty() )
1052 {
1053 foundGeometries = true;
1054 QgsGeometry mergedGeom = QgsGeometry::unaryUnion( clipGeometries );
1055 if ( renderContext.maskSettings().simplifyTolerance() > 0 )
1056 {
1057 QgsGeos geos( mergedGeom.constGet() );
1058 mergedGeom = QgsGeometry( geos.simplify( renderContext.maskSettings().simplifyTolerance() ) );
1059 }
1060#if GEOS_VERSION_MAJOR==3 && GEOS_VERSION_MINOR<10
1061 // structure would be better, but too old GEOS
1062 mergedGeom = mergedGeom.makeValid( Qgis::MakeValidMethod::Linework );
1063#else
1064 mergedGeom = mergedGeom.makeValid( Qgis::MakeValidMethod::Structure );
1065#endif
1066 if ( !mergedGeom.isEmpty() )
1067 {
1068 QgsGeometry exterior;
1069 const QgsRectangle contextBounds( 0, 0,
1070 renderContext.outputSize().width(),
1071 renderContext.outputSize().height() );
1072 if ( rect )
1073 {
1074 exterior = QgsGeometry::fromRect( QgsRectangle( *rect ).intersect( contextBounds ) );
1075 }
1076 else
1077 {
1078 exterior = QgsGeometry::fromRect( contextBounds );
1079 }
1080 const QgsGeometry maskGeom = exterior.difference( mergedGeom );
1081 if ( !maskGeom.isNull() )
1082 {
1083 return maskGeom.constGet()->asQPainterPath();
1084 }
1085 }
1086 }
1087 return QPainterPath();
1088}
1089
1091{
1092 const QgsRenderContext &renderContext = context.renderContext();
1093
1094 bool foundGeometries = false;
1095 mClipPath = generateClipPath( renderContext, id(), nullptr, foundGeometries );
1096}
1097
1098bool QgsSymbolLayer::installMasks( QgsRenderContext &context, bool recursive, const QRectF &rect )
1099{
1100 bool res = false;
1101 if ( !mClipPath.isEmpty() )
1102 {
1103 context.painter()->save();
1104 context.painter()->setClipPath( mClipPath, Qt::IntersectClip );
1105 res = true;
1106 }
1107 else if ( rect.isValid() )
1108 {
1109 // find just the clip geometries within the area the symbol layer will be drawn over
1110 bool foundGeometries = false;
1111 const QPainterPath clipPath = generateClipPath( context, id(), &rect, foundGeometries );
1112 if ( !clipPath.isEmpty() )
1113 {
1114 context.painter()->setClipPath( clipPath, context.painter()->clipPath().isEmpty() ? Qt::ReplaceClip : Qt::IntersectClip );
1115 res = true;
1116 }
1117 }
1118
1119 if ( QgsSymbol *lSubSymbol = recursive ? subSymbol() : nullptr )
1120 {
1121 const QList<QgsSymbolLayer *> layers = lSubSymbol->symbolLayers();
1122 for ( QgsSymbolLayer *sl : layers )
1123 res = sl->installMasks( context, true ) || res;
1124 }
1125
1126 return res;
1127}
1128
1129void QgsSymbolLayer::removeMasks( QgsRenderContext &context, bool recursive )
1130{
1131 if ( !mClipPath.isEmpty() )
1132 {
1133 context.painter()->restore();
1134 }
1135
1136 if ( QgsSymbol *lSubSymbol = recursive ? subSymbol() : nullptr )
1137 {
1138 const QList<QgsSymbolLayer *> layers = lSubSymbol->symbolLayers();
1139 for ( QgsSymbolLayer *sl : layers )
1140 sl->removeMasks( context, true );
1141 }
1142}
1143
1148
1149void QgsSymbolLayer::setId( const QString &id )
1150{
1151 mId = id;
1152}
1153
1154QString QgsSymbolLayer::id() const
1155{
1156 return mId;
1157}
1158
1159void QgsSymbolLayer::toSld( QDomDocument &doc, QDomElement &element, const QVariantMap &props ) const
1160{
1161 QgsSldExportContext context;
1162 context.setExtraProperties( props );
1163 toSld( doc, element, context );
1164}
1165
1166bool QgsSymbolLayer::toSld( QDomDocument &, QDomElement &, QgsSldExportContext &context ) const
1167{
1168 context.pushError( QObject::tr( "Symbol layer %1 cannot be converted to SLD" ).arg( layerType() ) );
1169 return false;
1170}
Provides global constants and enumerations for use throughout the application.
Definition qgis.h:59
@ AntialiasingSimplification
The geometries can be rendered with 'AntiAliasing' disabled because of it is '1-pixel size'.
Definition qgis.h:3090
@ ScaleDiameter
Calculate scale by the diameter.
Definition qgis.h:645
@ ScaleArea
Calculate scale by the area.
Definition qgis.h:644
QFlags< SymbolLayerFlag > SymbolLayerFlags
Symbol layer flags.
Definition qgis.h:906
QFlags< SymbolLayerUserFlag > SymbolLayerUserFlags
Symbol layer user flags.
Definition qgis.h:929
VerticalAnchorPoint
Marker symbol vertical anchor points.
Definition qgis.h:833
@ Bottom
Align to bottom of symbol.
Definition qgis.h:836
@ Center
Align to vertical center of symbol.
Definition qgis.h:835
@ Baseline
Align to baseline of symbol, e.g. font baseline for font marker symbol layers. Treated as Bottom if n...
Definition qgis.h:837
@ Top
Align to top of symbol.
Definition qgis.h:834
RenderUnit
Rendering size units.
Definition qgis.h:5255
@ Millimeters
Millimeters.
Definition qgis.h:5256
@ Unknown
Mixed or unknown units.
Definition qgis.h:5262
@ MetersInMapUnits
Meters value as Map units.
Definition qgis.h:5263
@ RenderSymbolPreview
The render is for a symbol preview only and map based properties may not be available,...
Definition qgis.h:2818
@ RenderLayerTree
The render is for a layer tree display where map based properties are not available and where avoidan...
Definition qgis.h:2829
@ Linework
Combines all rings into a set of noded lines and then extracts valid polygons from that linework.
Definition qgis.h:2239
@ Structure
Structured method, first makes all rings valid and then merges shells and subtracts holes from shells...
Definition qgis.h:2240
@ DisableSelectionRecoloring
If present, indicates that the symbol layer should not be recolored when rendering selected features.
Definition qgis.h:920
SymbolType
Symbol types.
Definition qgis.h:629
@ Marker
Marker symbol.
Definition qgis.h:630
@ Line
Line symbol.
Definition qgis.h:631
@ Fill
Fill symbol.
Definition qgis.h:632
HorizontalAnchorPoint
Marker symbol horizontal anchor points.
Definition qgis.h:819
@ Center
Align to horizontal center of symbol.
Definition qgis.h:821
@ Right
Align to right side of symbol.
Definition qgis.h:822
@ Left
Align to left side of symbol.
Definition qgis.h:820
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.
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:60
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:141
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.
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...
double mLineAngle
Line rotation angle (see setLineAngle() for details).
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.
double dxfAngle(QgsSymbolRenderContext &context) const override
Gets angle.
Qgis::ScaleMethod mScaleMethod
Marker size scaling method.
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.
void setProperty(int key, const QgsProperty &property)
Adds a property to the collection and takes ownership of it.
@ HorizontalAnchor
Horizontal anchor point.
Definition qgsproperty.h:75
@ Double
Double value (including negative values).
Definition qgsproperty.h:57
@ VerticalAnchor
Vertical anchor point.
Definition qgsproperty.h:76
@ Double0To1
Double value between 0-1 (inclusive).
Definition qgsproperty.h:59
@ FillStyle
Fill style (eg solid, lines).
Definition qgsproperty.h:73
@ StrokeWidth
Line stroke width.
Definition qgsproperty.h:72
@ LineStyle
Line style (eg solid/dashed).
Definition qgsproperty.h:71
@ String
Any string value.
Definition qgsproperty.h:61
@ Boolean
Boolean value.
Definition qgsproperty.h:53
@ PenJoinStyle
Pen join style.
Definition qgsproperty.h:66
@ IntegerPositive
Positive integer values (including 0).
Definition qgsproperty.h:55
@ Opacity
Opacity (0-100).
Definition qgsproperty.h:62
@ CapStyle
Line cap style (eg round).
Definition qgsproperty.h:74
@ Rotation
Rotation (value between 0-360 degrees).
Definition qgsproperty.h:60
@ Size
1D size (eg marker radius, or square marker height/width)
Definition qgsproperty.h:69
@ ColorWithAlpha
Color with alpha channel.
Definition qgsproperty.h:64
@ DoublePositive
Positive double value (including 0).
Definition qgsproperty.h:58
@ DataTypeString
Property requires a string value.
Definition qgsproperty.h:92
@ DataTypeNumeric
Property requires a numeric value.
Definition qgsproperty.h:99
A store for object properties.
QVariant value(const QgsExpressionContext &context, const QVariant &defaultValue=QVariant(), bool *ok=nullptr) const
Calculates the current value of the property, including any transforms which are set for the property...
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:150
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.
virtual QgsSymbolLayer * clone() const =0
Shall be reimplemented by subclasses to create a deep copy of the instance.
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.
@ BlankSegments
String list of distance to define blank segments along line for templated line symbol layers.
@ 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.
@ 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.
@ CoordinateMode
Gradient coordinate mode.
@ FillStyle
Fill style (eg solid, dots).
@ GradientReference2X
Gradient reference point 2 x.
@ 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.
@ 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.
@ RandomOffsetX
Random offset X.
@ TrimEnd
Trim distance from end of line.
@ 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.
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
virtual Qt::PenStyle dxfPenStyle() const
Gets pen style.
virtual void setFillColor(const QColor &color)
Sets the fill color for the symbol layer.
bool mEnabled
True if layer is enabled and should be drawn.
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 bool rendersIdenticallyTo(const QgsSymbolLayer *other) const
Returns true if this symbol layer will always render identically to an other symbol layer.
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:77
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.