QGIS API Documentation  3.14.0-Pi (9f7028fd23)
qgsellipsesymbollayer.cpp
Go to the documentation of this file.
1 /***************************************************************************
2  qgsellipsesymbollayer.cpp
3  ---------------------
4  begin : June 2011
5  copyright : (C) 2011 by Marco Hugentobler
6  email : marco dot hugentobler at sourcepole dot ch
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 #include "qgsellipsesymbollayer.h"
16 #include "qgsdxfexport.h"
17 #include "qgsexpression.h"
18 #include "qgsfeature.h"
19 #include "qgsrendercontext.h"
20 #include "qgsvectorlayer.h"
21 #include "qgslogger.h"
22 #include "qgsunittypes.h"
23 #include "qgsproperty.h"
24 #include "qgssymbollayerutils.h"
25 
26 #include <QPainter>
27 #include <QSet>
28 #include <QDomDocument>
29 #include <QDomElement>
30 
32  : mSymbolName( QStringLiteral( "circle" ) )
33  , mStrokeColor( QColor( 35, 35, 35 ) )
34 {
35  mColor = Qt::white;
36  mPen.setColor( mStrokeColor );
37  mPen.setStyle( mStrokeStyle );
38  mPen.setJoinStyle( mPenJoinStyle );
39  mPen.setWidth( 1.0 );
40  mBrush.setColor( mColor );
41  mBrush.setStyle( Qt::SolidPattern );
42  mOffset = QPointF( 0, 0 );
43  mAngle = 0;
44 }
45 
47 {
49  if ( properties.contains( QStringLiteral( "symbol_name" ) ) )
50  {
51  layer->setSymbolName( properties[ QStringLiteral( "symbol_name" )] );
52  }
53  if ( properties.contains( QStringLiteral( "size" ) ) )
54  {
55  layer->setSize( properties[QStringLiteral( "size" )].toDouble() );
56  }
57  if ( properties.contains( QStringLiteral( "size_unit" ) ) )
58  {
59  layer->setSizeUnit( QgsUnitTypes::decodeRenderUnit( properties[QStringLiteral( "size_unit" )] ) );
60  }
61  if ( properties.contains( QStringLiteral( "size_map_unit_scale" ) ) )
62  {
63  layer->setSizeMapUnitScale( QgsSymbolLayerUtils::decodeMapUnitScale( properties[QStringLiteral( "size_map_unit_scale" )] ) );
64  }
65  if ( properties.contains( QStringLiteral( "symbol_width" ) ) )
66  {
67  layer->setSymbolWidth( properties[QStringLiteral( "symbol_width" )].toDouble() );
68  }
69  if ( properties.contains( QStringLiteral( "symbol_width_unit" ) ) )
70  {
71  layer->setSymbolWidthUnit( QgsUnitTypes::decodeRenderUnit( properties[QStringLiteral( "symbol_width_unit" )] ) );
72  }
73  if ( properties.contains( QStringLiteral( "symbol_width_map_unit_scale" ) ) )
74  {
75  layer->setSymbolWidthMapUnitScale( QgsSymbolLayerUtils::decodeMapUnitScale( properties[QStringLiteral( "symbol_width_map_unit_scale" )] ) );
76  }
77  if ( properties.contains( QStringLiteral( "symbol_height" ) ) )
78  {
79  layer->setSymbolHeight( properties[QStringLiteral( "symbol_height" )].toDouble() );
80  }
81  if ( properties.contains( QStringLiteral( "symbol_height_unit" ) ) )
82  {
83  layer->setSymbolHeightUnit( QgsUnitTypes::decodeRenderUnit( properties[QStringLiteral( "symbol_height_unit" )] ) );
84  }
85  if ( properties.contains( QStringLiteral( "symbol_height_map_unit_scale" ) ) )
86  {
87  layer->setSymbolHeightMapUnitScale( QgsSymbolLayerUtils::decodeMapUnitScale( properties[QStringLiteral( "symbol_height_map_unit_scale" )] ) );
88  }
89  if ( properties.contains( QStringLiteral( "angle" ) ) )
90  {
91  layer->setAngle( properties[QStringLiteral( "angle" )].toDouble() );
92  }
93  if ( properties.contains( QStringLiteral( "outline_style" ) ) )
94  {
95  layer->setStrokeStyle( QgsSymbolLayerUtils::decodePenStyle( properties[QStringLiteral( "outline_style" )] ) );
96  }
97  else if ( properties.contains( QStringLiteral( "line_style" ) ) )
98  {
99  layer->setStrokeStyle( QgsSymbolLayerUtils::decodePenStyle( properties[QStringLiteral( "line_style" )] ) );
100  }
101  if ( properties.contains( QStringLiteral( "joinstyle" ) ) )
102  {
103  layer->setPenJoinStyle( QgsSymbolLayerUtils::decodePenJoinStyle( properties[QStringLiteral( "joinstyle" )] ) );
104  }
105  if ( properties.contains( QStringLiteral( "outline_width" ) ) )
106  {
107  layer->setStrokeWidth( properties[QStringLiteral( "outline_width" )].toDouble() );
108  }
109  else if ( properties.contains( QStringLiteral( "line_width" ) ) )
110  {
111  layer->setStrokeWidth( properties[QStringLiteral( "line_width" )].toDouble() );
112  }
113  if ( properties.contains( QStringLiteral( "outline_width_unit" ) ) )
114  {
115  layer->setStrokeWidthUnit( QgsUnitTypes::decodeRenderUnit( properties[QStringLiteral( "outline_width_unit" )] ) );
116  }
117  else if ( properties.contains( QStringLiteral( "line_width_unit" ) ) )
118  {
119  layer->setStrokeWidthUnit( QgsUnitTypes::decodeRenderUnit( properties[QStringLiteral( "line_width_unit" )] ) );
120  }
121  if ( properties.contains( QStringLiteral( "outline_width_map_unit_scale" ) ) )
122  {
123  layer->setStrokeWidthMapUnitScale( QgsSymbolLayerUtils::decodeMapUnitScale( properties[QStringLiteral( "outline_width_map_unit_scale" )] ) );
124  }
125  if ( properties.contains( QStringLiteral( "fill_color" ) ) )
126  {
127  //pre 2.5 projects used "fill_color"
128  layer->setFillColor( QgsSymbolLayerUtils::decodeColor( properties[QStringLiteral( "fill_color" )] ) );
129  }
130  else if ( properties.contains( QStringLiteral( "color" ) ) )
131  {
132  layer->setFillColor( QgsSymbolLayerUtils::decodeColor( properties[QStringLiteral( "color" )] ) );
133  }
134  if ( properties.contains( QStringLiteral( "outline_color" ) ) )
135  {
136  layer->setStrokeColor( QgsSymbolLayerUtils::decodeColor( properties[QStringLiteral( "outline_color" )] ) );
137  }
138  else if ( properties.contains( QStringLiteral( "line_color" ) ) )
139  {
140  layer->setStrokeColor( QgsSymbolLayerUtils::decodeColor( properties[QStringLiteral( "line_color" )] ) );
141  }
142  if ( properties.contains( QStringLiteral( "offset" ) ) )
143  {
144  layer->setOffset( QgsSymbolLayerUtils::decodePoint( properties[QStringLiteral( "offset" )] ) );
145  }
146  if ( properties.contains( QStringLiteral( "offset_unit" ) ) )
147  {
148  layer->setOffsetUnit( QgsUnitTypes::decodeRenderUnit( properties[QStringLiteral( "offset_unit" )] ) );
149  }
150  if ( properties.contains( QStringLiteral( "offset_map_unit_scale" ) ) )
151  {
152  layer->setOffsetMapUnitScale( QgsSymbolLayerUtils::decodeMapUnitScale( properties[QStringLiteral( "offset_map_unit_scale" )] ) );
153  }
154  if ( properties.contains( QStringLiteral( "horizontal_anchor_point" ) ) )
155  {
156  layer->setHorizontalAnchorPoint( QgsMarkerSymbolLayer::HorizontalAnchorPoint( properties[ QStringLiteral( "horizontal_anchor_point" )].toInt() ) );
157  }
158  if ( properties.contains( QStringLiteral( "vertical_anchor_point" ) ) )
159  {
160  layer->setVerticalAnchorPoint( QgsMarkerSymbolLayer::VerticalAnchorPoint( properties[ QStringLiteral( "vertical_anchor_point" )].toInt() ) );
161  }
162 
163  //data defined properties
165 
166  return layer;
167 }
168 
170 {
171  double scaledWidth = mSymbolWidth;
172  double scaledHeight = mSymbolHeight;
173 
175  {
176  bool ok;
177  context.setOriginalValueVariable( mStrokeWidth );
179  if ( exprVal.isValid() )
180  {
181  double width = exprVal.toDouble( &ok );
182  if ( ok )
183  {
184  width = context.renderContext().convertToPainterUnits( width, mStrokeWidthUnit, mStrokeWidthMapUnitScale );
185  mPen.setWidthF( width );
186  }
187  }
188 
191  if ( exprVal.isValid() )
192  {
193  mPen.setStyle( QgsSymbolLayerUtils::decodePenStyle( exprVal.toString() ) );
194  }
195 
198  if ( exprVal.isValid() )
199  {
200  mPen.setJoinStyle( QgsSymbolLayerUtils::decodePenJoinStyle( exprVal.toString() ) );
201  }
202 
205 
208 
210  {
211  QString symbolName = mSymbolName;
212  context.setOriginalValueVariable( mSymbolName );
214  if ( exprVal.isValid() )
215  {
216  symbolName = exprVal.toString();
217  }
218  preparePath( symbolName, context, &scaledWidth, &scaledHeight, context.feature() );
219  }
220  }
221 
222  //offset and rotation
223  bool hasDataDefinedRotation = false;
224  QPointF offset;
225  double angle = 0;
226  calculateOffsetAndRotation( context, scaledWidth, scaledHeight, hasDataDefinedRotation, offset, angle );
227 
228  QPainter *p = context.renderContext().painter();
229  if ( !p )
230  {
231  return;
232  }
233 
234  QMatrix transform;
235  transform.translate( point.x() + offset.x(), point.y() + offset.y() );
236  if ( !qgsDoubleNear( angle, 0.0 ) )
237  {
238  transform.rotate( angle );
239  }
240 
241  p->setPen( mPen );
242  p->setBrush( mBrush );
243  p->drawPath( transform.map( mPainterPath ) );
244 }
245 
246 
247 void QgsEllipseSymbolLayer::calculateOffsetAndRotation( QgsSymbolRenderContext &context,
248  double scaledWidth,
249  double scaledHeight,
250  bool &hasDataDefinedRotation,
251  QPointF &offset,
252  double &angle ) const
253 {
254  double offsetX = 0;
255  double offsetY = 0;
256  markerOffset( context, scaledWidth, scaledHeight, mSymbolWidthUnit, mSymbolHeightUnit, offsetX, offsetY, mSymbolWidthMapUnitScale, mSymbolHeightMapUnitScale );
257  offset = QPointF( offsetX, offsetY );
258 
259 //priority for rotation: 1. data defined symbol level, 2. symbol layer rotation (mAngle)
260  bool ok = true;
261  angle = mAngle + mLineAngle;
262  bool usingDataDefinedRotation = false;
264  {
265  context.setOriginalValueVariable( angle );
267  usingDataDefinedRotation = ok;
268  }
269 
270  hasDataDefinedRotation = context.renderHints() & QgsSymbol::DynamicRotation || usingDataDefinedRotation;
271  if ( hasDataDefinedRotation )
272  {
273  // For non-point markers, "dataDefinedRotation" means following the
274  // shape (shape-data defined). For them, "field-data defined" does
275  // not work at all. TODO: if "field-data defined" ever gets implemented
276  // we'll need a way to distinguish here between the two, possibly
277  // using another flag in renderHints()
278  const QgsFeature *f = context.feature();
279  if ( f )
280  {
281  const QgsGeometry g = f->geometry();
282  if ( !g.isNull() && g.type() == QgsWkbTypes::PointGeometry )
283  {
284  const QgsMapToPixel &m2p = context.renderContext().mapToPixel();
285  angle += m2p.mapRotation();
286  }
287  }
288  }
289 
290  if ( angle )
292 }
293 
295 {
296  return QStringLiteral( "EllipseMarker" );
297 }
298 
300 {
301  QgsMarkerSymbolLayer::startRender( context ); // get anchor point expressions
302  if ( !context.feature() || !dataDefinedProperties().hasActiveProperties() )
303  {
304  preparePath( mSymbolName, context );
305  }
306  mPen.setColor( mStrokeColor );
307  mPen.setStyle( mStrokeStyle );
308  mPen.setJoinStyle( mPenJoinStyle );
309  mPen.setWidthF( context.renderContext().convertToPainterUnits( mStrokeWidth, mStrokeWidthUnit, mStrokeWidthMapUnitScale ) );
310  mBrush.setColor( mColor );
311 }
312 
314 {
315 }
316 
318 {
320  m->setSymbolName( mSymbolName );
321  m->setSymbolWidth( mSymbolWidth );
322  m->setSymbolHeight( mSymbolHeight );
323  m->setStrokeStyle( mStrokeStyle );
324  m->setOffset( mOffset );
327  m->setStrokeStyle( mStrokeStyle );
328  m->setPenJoinStyle( mPenJoinStyle );
329  m->setStrokeWidth( mStrokeWidth );
330  m->setColor( color() );
331  m->setStrokeColor( mStrokeColor );
332  m->setSymbolWidthUnit( mSymbolWidthUnit );
333  m->setSymbolWidthMapUnitScale( mSymbolWidthMapUnitScale );
334  m->setSymbolHeightUnit( mSymbolHeightUnit );
335  m->setSymbolHeightMapUnitScale( mSymbolHeightMapUnitScale );
336  m->setStrokeWidthUnit( mStrokeWidthUnit );
337  m->setStrokeWidthMapUnitScale( mStrokeWidthMapUnitScale );
338  m->setAngle( mAngle );
341 
343  copyPaintEffect( m );
344  return m;
345 }
346 
347 void QgsEllipseSymbolLayer::toSld( QDomDocument &doc, QDomElement &element, const QgsStringMap &props ) const
348 {
349  QDomElement symbolizerElem = doc.createElement( QStringLiteral( "se:PointSymbolizer" ) );
350  if ( !props.value( QStringLiteral( "uom" ), QString() ).isEmpty() )
351  symbolizerElem.setAttribute( QStringLiteral( "uom" ), props.value( QStringLiteral( "uom" ), QString() ) );
352  element.appendChild( symbolizerElem );
353 
354  // <Geometry>
355  QgsSymbolLayerUtils::createGeometryElement( doc, symbolizerElem, props.value( QStringLiteral( "geom" ), QString() ) );
356 
357  writeSldMarker( doc, symbolizerElem, props );
358 }
359 
360 void QgsEllipseSymbolLayer::writeSldMarker( QDomDocument &doc, QDomElement &element, const QgsStringMap &props ) const
361 {
362  // <Graphic>
363  QDomElement graphicElem = doc.createElement( QStringLiteral( "se:Graphic" ) );
364  element.appendChild( graphicElem );
365 
366  double strokeWidth = QgsSymbolLayerUtils::rescaleUom( mStrokeWidth, mStrokeWidthUnit, props );
367  double symbolWidth = QgsSymbolLayerUtils::rescaleUom( mSymbolWidth, mSymbolWidthUnit, props );
368  QgsSymbolLayerUtils::wellKnownMarkerToSld( doc, graphicElem, mSymbolName, mColor, mStrokeColor, mStrokeStyle, strokeWidth, symbolWidth );
369 
370  // <Rotation>
372 
373  QString angleFunc = props.value( QStringLiteral( "angle" ), QString() );
374  if ( angleFunc.isEmpty() ) // symbol has no angle set
375  {
376  if ( ddRotation && ddRotation.isActive() )
377  {
378  angleFunc = ddRotation.asExpression();
379  }
380  else if ( !qgsDoubleNear( mAngle, 0.0 ) )
381  angleFunc = QString::number( mAngle );
382  }
383  else if ( ddRotation && ddRotation.isActive() )
384  {
385  // the symbol has an angle and the symbol layer have a rotation
386  // property set
387  angleFunc = QStringLiteral( "%1 + %2" ).arg( angleFunc, ddRotation.asExpression() );
388  }
389  else if ( !qgsDoubleNear( mAngle, 0.0 ) )
390  {
391  // both the symbol and the symbol layer have angle value set
392  bool ok;
393  double angle = angleFunc.toDouble( &ok );
394  if ( !ok )
395  {
396  // its a string (probably a property name or a function)
397  angleFunc = QStringLiteral( "%1 + %2" ).arg( angleFunc ).arg( mAngle );
398  }
399  else if ( !qgsDoubleNear( angle + mAngle, 0.0 ) )
400  {
401  // it's a double value
402  angleFunc = QString::number( angle + mAngle );
403  }
404  }
405  QgsSymbolLayerUtils::createRotationElement( doc, graphicElem, angleFunc );
406 
407  // <Displacement>
410 
411  // store w/h factor in a <VendorOption>
412  double widthHeightFactor = mSymbolWidth / mSymbolHeight;
413  QDomElement factorElem = QgsSymbolLayerUtils::createVendorOptionElement( doc, QStringLiteral( "widthHeightFactor" ), QString::number( widthHeightFactor ) );
414  graphicElem.appendChild( factorElem );
415 }
416 
418 {
419  QgsDebugMsgLevel( QStringLiteral( "Entered." ), 4 );
420 
421  QDomElement graphicElem = element.firstChildElement( QStringLiteral( "Graphic" ) );
422  if ( graphicElem.isNull() )
423  return nullptr;
424 
425  QString name = QStringLiteral( "circle" );
426  QColor fillColor, strokeColor;
427  double strokeWidth, size;
428  double widthHeightFactor = 1.0;
429  Qt::PenStyle strokeStyle;
430 
431  QgsStringMap vendorOptions = QgsSymbolLayerUtils::getVendorOptionList( graphicElem );
432  for ( QgsStringMap::iterator it = vendorOptions.begin(); it != vendorOptions.end(); ++it )
433  {
434  if ( it.key() == QLatin1String( "widthHeightFactor" ) )
435  {
436  bool ok;
437  double v = it.value().toDouble( &ok );
438  if ( ok && !qgsDoubleNear( v, 0.0 ) && v > 0 )
439  widthHeightFactor = v;
440  }
441  }
442 
444  return nullptr;
445 
446  QString uom = element.attribute( QStringLiteral( "uom" ) );
449 
450  double angle = 0.0;
451  QString angleFunc;
452  if ( QgsSymbolLayerUtils::rotationFromSldElement( graphicElem, angleFunc ) )
453  {
454  bool ok;
455  double d = angleFunc.toDouble( &ok );
456  if ( ok )
457  angle = d;
458  }
459 
461  m->setOutputUnit( QgsUnitTypes::RenderUnit::RenderPixels );
462  m->setSymbolName( name );
463  m->setFillColor( fillColor );
467  m->setSymbolWidth( size );
468  m->setSymbolHeight( size / widthHeightFactor );
469  m->setAngle( angle );
470  return m;
471 }
472 
474 {
475  QgsStringMap map;
476  map[QStringLiteral( "symbol_name" )] = mSymbolName;
477  map[QStringLiteral( "symbol_width" )] = QString::number( mSymbolWidth );
478  map[QStringLiteral( "symbol_width_unit" )] = QgsUnitTypes::encodeUnit( mSymbolWidthUnit );
479  map[QStringLiteral( "symbol_width_map_unit_scale" )] = QgsSymbolLayerUtils::encodeMapUnitScale( mSymbolWidthMapUnitScale );
480  map[QStringLiteral( "symbol_height" )] = QString::number( mSymbolHeight );
481  map[QStringLiteral( "symbol_height_unit" )] = QgsUnitTypes::encodeUnit( mSymbolHeightUnit );
482  map[QStringLiteral( "symbol_height_map_unit_scale" )] = QgsSymbolLayerUtils::encodeMapUnitScale( mSymbolHeightMapUnitScale );
483  map[QStringLiteral( "angle" )] = QString::number( mAngle );
484  map[QStringLiteral( "outline_style" )] = QgsSymbolLayerUtils::encodePenStyle( mStrokeStyle );
485  map[QStringLiteral( "outline_width" )] = QString::number( mStrokeWidth );
486  map[QStringLiteral( "outline_width_unit" )] = QgsUnitTypes::encodeUnit( mStrokeWidthUnit );
487  map[QStringLiteral( "outline_width_map_unit_scale" )] = QgsSymbolLayerUtils::encodeMapUnitScale( mStrokeWidthMapUnitScale );
488  map[QStringLiteral( "joinstyle" )] = QgsSymbolLayerUtils::encodePenJoinStyle( mPenJoinStyle );
489  map[QStringLiteral( "color" )] = QgsSymbolLayerUtils::encodeColor( mColor );
490  map[QStringLiteral( "outline_color" )] = QgsSymbolLayerUtils::encodeColor( mStrokeColor );
491  map[QStringLiteral( "offset" )] = QgsSymbolLayerUtils::encodePoint( mOffset );
492  map[QStringLiteral( "offset_unit" )] = QgsUnitTypes::encodeUnit( mOffsetUnit );
493  map[QStringLiteral( "offset_map_unit_scale" )] = QgsSymbolLayerUtils::encodeMapUnitScale( mOffsetMapUnitScale );
494  map[QStringLiteral( "size" )] = QString::number( mSize );
495  map[QStringLiteral( "size_unit" )] = QgsUnitTypes::encodeUnit( mSizeUnit );
496  map[QStringLiteral( "size_map_unit_scale" )] = QgsSymbolLayerUtils::encodeMapUnitScale( mSizeMapUnitScale );
497  map[QStringLiteral( "horizontal_anchor_point" )] = QString::number( mHorizontalAnchorPoint );
498  map[QStringLiteral( "vertical_anchor_point" )] = QString::number( mVerticalAnchorPoint );
499  return map;
500 }
501 
502 QSizeF QgsEllipseSymbolLayer::calculateSize( QgsSymbolRenderContext &context, double *scaledWidth, double *scaledHeight )
503 {
504  double width = 0;
505 
506  if ( mDataDefinedProperties.isActive( QgsSymbolLayer::PropertyWidth ) ) //1. priority: data defined setting on symbol layer le
507  {
508  context.setOriginalValueVariable( mSymbolWidth );
510  }
511  else //2. priority: global width setting
512  {
513  width = mSymbolWidth;
514  }
515  if ( scaledWidth )
516  {
517  *scaledWidth = width;
518  }
519  width = context.renderContext().convertToPainterUnits( width, mSymbolWidthUnit, mSymbolHeightMapUnitScale );
520 
521  double height = 0;
522  if ( mDataDefinedProperties.isActive( QgsSymbolLayer::PropertyHeight ) ) //1. priority: data defined setting on symbol layer level
523  {
524  context.setOriginalValueVariable( mSymbolHeight );
526  }
527  else //2. priority: global height setting
528  {
529  height = mSymbolHeight;
530  }
531  if ( scaledHeight )
532  {
533  *scaledHeight = height;
534  }
535  height = context.renderContext().convertToPainterUnits( height, mSymbolHeightUnit, mSymbolHeightMapUnitScale );
536  return QSizeF( width, height );
537 }
538 
539 void QgsEllipseSymbolLayer::preparePath( const QString &symbolName, QgsSymbolRenderContext &context, double *scaledWidth, double *scaledHeight, const QgsFeature * )
540 {
541  mPainterPath = QPainterPath();
542 
543  QSizeF size = calculateSize( context, scaledWidth, scaledHeight );
544 
545  if ( symbolName == QLatin1String( "circle" ) )
546  {
547  mPainterPath.addEllipse( QRectF( -size.width() / 2.0, -size.height() / 2.0, size.width(), size.height() ) );
548  }
549  else if ( symbolName == QLatin1String( "semi_circle" ) )
550  {
551  mPainterPath.arcTo( -size.width() / 2.0, -size.height() / 2.0, size.width(), size.height(), 0, 180 );
552  mPainterPath.lineTo( 0, 0 );
553  }
554  else if ( symbolName == QLatin1String( "rectangle" ) )
555  {
556  mPainterPath.addRect( QRectF( -size.width() / 2.0, -size.height() / 2.0, size.width(), size.height() ) );
557  }
558  else if ( symbolName == QLatin1String( "diamond" ) )
559  {
560  mPainterPath.moveTo( -size.width() / 2.0, 0 );
561  mPainterPath.lineTo( 0, size.height() / 2.0 );
562  mPainterPath.lineTo( size.width() / 2.0, 0 );
563  mPainterPath.lineTo( 0, -size.height() / 2.0 );
564  mPainterPath.lineTo( -size.width() / 2.0, 0 );
565  }
566  else if ( symbolName == QLatin1String( "cross" ) )
567  {
568  mPainterPath.moveTo( 0, -size.height() / 2.0 );
569  mPainterPath.lineTo( 0, size.height() / 2.0 );
570  mPainterPath.moveTo( -size.width() / 2.0, 0 );
571  mPainterPath.lineTo( size.width() / 2.0, 0 );
572  }
573  else if ( symbolName == QLatin1String( "triangle" ) )
574  {
575  mPainterPath.moveTo( 0, -size.height() / 2.0 );
576  mPainterPath.lineTo( -size.width() / 2.0, size.height() / 2.0 );
577  mPainterPath.lineTo( size.width() / 2.0, size.height() / 2.0 );
578  mPainterPath.lineTo( 0, -size.height() / 2.0 );
579  }
580  else if ( symbolName == QLatin1String( "left_half_triangle" ) )
581  {
582  mPainterPath.moveTo( 0, size.height() / 2.0 );
583  mPainterPath.lineTo( size.width() / 2.0, size.height() / 2.0 );
584  mPainterPath.lineTo( 0, -size.height() / 2.0 );
585  mPainterPath.lineTo( 0, size.height() / 2.0 );
586  }
587  else if ( symbolName == QLatin1String( "right_half_triangle" ) )
588  {
589  mPainterPath.moveTo( -size.width() / 2.0, size.height() / 2.0 );
590  mPainterPath.lineTo( 0, size.height() / 2.0 );
591  mPainterPath.lineTo( 0, -size.height() / 2.0 );
592  mPainterPath.lineTo( -size.width() / 2.0, size.height() / 2.0 );
593  }
594 }
595 
597 {
598  if ( mSymbolWidth >= mSymbolHeight )
599  {
600  mSymbolHeight = mSymbolHeight * size / mSymbolWidth;
601  mSymbolWidth = size;
602  }
603  else
604  {
605  mSymbolWidth = mSymbolWidth * size / mSymbolHeight;
606  mSymbolHeight = size;
607  }
609 }
610 
612 {
613  mSymbolWidth = w;
614  QgsMarkerSymbolLayer::setSize( mSymbolWidth >= mSymbolHeight ? mSymbolWidth : mSymbolHeight );
615 }
616 
618 {
619  mSymbolHeight = h;
620  QgsMarkerSymbolLayer::setSize( mSymbolWidth >= mSymbolHeight ? mSymbolWidth : mSymbolHeight );
621 }
622 
624 {
626  mSymbolWidthUnit = unit;
627  mSymbolHeightUnit = unit;
628  mStrokeWidthUnit = unit;
629 }
630 
632 {
634  if ( mSymbolWidthUnit != unit || mSymbolHeightUnit != unit || mStrokeWidthUnit != unit )
635  {
637  }
638  return unit;
639 }
640 
642 {
644  mSymbolWidthMapUnitScale = scale;
645  mSymbolHeightMapUnitScale = scale;
646  mStrokeWidthMapUnitScale = scale;
647 }
648 
650 {
651  if ( QgsMarkerSymbolLayer::mapUnitScale() == mSymbolWidthMapUnitScale &&
652  mSymbolWidthMapUnitScale == mSymbolHeightMapUnitScale &&
653  mSymbolHeightMapUnitScale == mStrokeWidthMapUnitScale )
654  {
655  return mSymbolWidthMapUnitScale;
656  }
657  return QgsMapUnitScale();
658 }
659 
660 QRectF QgsEllipseSymbolLayer::bounds( QPointF point, QgsSymbolRenderContext &context )
661 {
662  QSizeF size = calculateSize( context );
663 
664  bool hasDataDefinedRotation = false;
665  QPointF offset;
666  double angle = 0;
667  calculateOffsetAndRotation( context, size.width(), size.height(), hasDataDefinedRotation, offset, angle );
668 
669  QMatrix transform;
670 
671  // move to the desired position
672  transform.translate( point.x() + offset.x(), point.y() + offset.y() );
673 
674  if ( !qgsDoubleNear( angle, 0.0 ) )
675  transform.rotate( angle );
676 
677  double penWidth = mStrokeWidth;
679  {
680  context.setOriginalValueVariable( mStrokeWidth );
682 
683  if ( exprVal.isValid() )
684  {
685  bool ok;
686  double strokeWidth = exprVal.toDouble( &ok );
687  if ( ok )
688  {
689  penWidth = strokeWidth;
690  }
691  }
692  }
693  penWidth = context.renderContext().convertToPainterUnits( penWidth, mStrokeWidthUnit, mStrokeWidthMapUnitScale );
694 
696  {
699  if ( exprVal.isValid() && exprVal.toString() == QLatin1String( "no" ) )
700  {
701  penWidth = 0.0;
702  }
703  }
704  else if ( mStrokeStyle == Qt::NoPen )
705  penWidth = 0;
706 
707  //antialiasing, add 1 pixel
708  penWidth += 1;
709 
710  QRectF symbolBounds = transform.mapRect( QRectF( -size.width() / 2.0,
711  -size.height() / 2.0,
712  size.width(),
713  size.height() ) );
714 
715  //extend bounds by pen width / 2.0
716  symbolBounds.adjust( -penWidth / 2.0, -penWidth / 2.0,
717  penWidth / 2.0, penWidth / 2.0 );
718 
719  return symbolBounds;
720 }
721 
722 bool QgsEllipseSymbolLayer::writeDxf( QgsDxfExport &e, double mmMapUnitScaleFactor, const QString &layerName, QgsSymbolRenderContext &context, QPointF shift ) const
723 {
724  //width
725  double symbolWidth = mSymbolWidth;
726 
727  if ( mDataDefinedProperties.isActive( QgsSymbolLayer::PropertyWidth ) ) //1. priority: data defined setting on symbol layer le
728  {
729  context.setOriginalValueVariable( mSymbolWidth );
731  }
732  if ( mSymbolWidthUnit == QgsUnitTypes::RenderMillimeters )
733  {
734  symbolWidth *= mmMapUnitScaleFactor;
735  }
736 
737  //height
738  double symbolHeight = mSymbolHeight;
739  if ( mDataDefinedProperties.isActive( QgsSymbolLayer::PropertyHeight ) ) //1. priority: data defined setting on symbol layer level
740  {
741  context.setOriginalValueVariable( mSymbolHeight );
743  }
744  if ( mSymbolHeightUnit == QgsUnitTypes::RenderMillimeters )
745  {
746  symbolHeight *= mmMapUnitScaleFactor;
747  }
748 
749  //stroke width
750  double strokeWidth = mStrokeWidth;
751 
753  {
754  context.setOriginalValueVariable( mStrokeWidth );
756  }
757  if ( mStrokeWidthUnit == QgsUnitTypes::RenderMillimeters )
758  {
760  }
761 
762  //fill color
763  QColor fc = mColor;
765  {
768  }
769 
770  //stroke color
771  QColor oc = mStrokeColor;
773  {
776  }
777 
778  //symbol name
779  QString symbolName = mSymbolName;
781  {
782  context.setOriginalValueVariable( mSymbolName );
784  }
785 
786  //offset
787  double offsetX = 0;
788  double offsetY = 0;
789  markerOffset( context, offsetX, offsetY );
790  QPointF off( offsetX, offsetY );
791 
792  //priority for rotation: 1. data defined symbol level, 2. symbol layer rotation (mAngle)
793  double rotation = 0.0;
795  {
796  context.setOriginalValueVariable( mAngle );
798  }
799  else if ( !qgsDoubleNear( mAngle + mLineAngle, 0.0 ) )
800  {
801  rotation = mAngle + mLineAngle;
802  }
803  rotation = -rotation; //rotation in Qt is counterclockwise
804  if ( rotation )
805  off = _rotatedOffset( off, rotation );
806 
807  QTransform t;
808  t.translate( shift.x() + offsetX, shift.y() + offsetY );
809 
810  if ( !qgsDoubleNear( rotation, 0.0 ) )
811  t.rotate( rotation );
812 
813  double halfWidth = symbolWidth / 2.0;
814  double halfHeight = symbolHeight / 2.0;
815 
816  if ( symbolName == QLatin1String( "circle" ) )
817  {
818  if ( qgsDoubleNear( halfWidth, halfHeight ) )
819  {
820  QgsPoint pt( t.map( QPointF( 0, 0 ) ) );
821  e.writeFilledCircle( layerName, oc, pt, halfWidth );
822  }
823  else
824  {
825  QgsPointSequence line;
826 
827  double stepsize = 2 * M_PI / 40;
828  for ( int i = 0; i < 39; ++i )
829  {
830  double angle = stepsize * i;
831  double x = halfWidth * std::cos( angle );
832  double y = halfHeight * std::sin( angle );
833  line << QgsPoint( t.map( QPointF( x, y ) ) );
834  }
835  //close ellipse with first point
836  line << line.at( 0 );
837 
838  if ( mBrush.style() != Qt::NoBrush )
839  e.writePolygon( QgsRingSequence() << line, layerName, QStringLiteral( "SOLID" ), fc );
840  if ( mPen.style() != Qt::NoPen )
841  e.writePolyline( line, layerName, QStringLiteral( "CONTINUOUS" ), oc, strokeWidth );
842  }
843  }
844  else if ( symbolName == QLatin1String( "rectangle" ) )
845  {
847  p << QgsPoint( t.map( QPointF( -halfWidth, -halfHeight ) ) )
848  << QgsPoint( t.map( QPointF( halfWidth, -halfHeight ) ) )
849  << QgsPoint( t.map( QPointF( halfWidth, halfHeight ) ) )
850  << QgsPoint( t.map( QPointF( -halfWidth, halfHeight ) ) );
851  p << p[0];
852 
853  if ( mBrush.style() != Qt::NoBrush )
854  e.writePolygon( QgsRingSequence() << p, layerName, QStringLiteral( "SOLID" ), fc );
855  if ( mPen.style() != Qt::NoPen )
856  e.writePolyline( p, layerName, QStringLiteral( "CONTINUOUS" ), oc, strokeWidth );
857  return true;
858  }
859  else if ( symbolName == QLatin1String( "cross" ) && mPen.style() != Qt::NoPen )
860  {
862  << QgsPoint( t.map( QPointF( -halfWidth, 0 ) ) )
863  << QgsPoint( t.map( QPointF( halfWidth, 0 ) ) ),
864  layerName, QStringLiteral( "CONTINUOUS" ), oc, strokeWidth );
866  << QgsPoint( t.map( QPointF( 0, halfHeight ) ) )
867  << QgsPoint( t.map( QPointF( 0, -halfHeight ) ) ),
868  layerName, QStringLiteral( "CONTINUOUS" ), oc, strokeWidth );
869  return true;
870  }
871  else if ( symbolName == QLatin1String( "triangle" ) )
872  {
874  p << QgsPoint( t.map( QPointF( -halfWidth, -halfHeight ) ) )
875  << QgsPoint( t.map( QPointF( halfWidth, -halfHeight ) ) )
876  << QgsPoint( t.map( QPointF( 0, halfHeight ) ) );
877  p << p[0];
878  if ( mBrush.style() != Qt::NoBrush )
879  e.writePolygon( QgsRingSequence() << p, layerName, QStringLiteral( "SOLID" ), fc );
880  if ( mPen.style() != Qt::NoPen )
881  e.writePolyline( p, layerName, QStringLiteral( "CONTINUOUS" ), oc, strokeWidth );
882  return true;
883  }
884 
885  return false; //soon...
886 }
887 
888 
QgsEllipseSymbolLayer::setStrokeWidthUnit
void setStrokeWidthUnit(QgsUnitTypes::RenderUnit unit)
Sets the units for the symbol's stroke width.
Definition: qgsellipsesymbollayer.h:124
QgsEllipseSymbolLayer::stopRender
void stopRender(QgsSymbolRenderContext &context) override
Called after a set of rendering operations has finished on the supplied render context.
Definition: qgsellipsesymbollayer.cpp:313
QgsSymbolRenderContext::setOriginalValueVariable
void setOriginalValueVariable(const QVariant &value)
Sets the original value variable value for data defined symbology.
Definition: qgssymbol.cpp:1370
QgsProperty::isActive
bool isActive() const
Returns whether the property is currently active.
Definition: qgsproperty.cpp:266
QgsEllipseSymbolLayer::strokeStyle
Qt::PenStyle strokeStyle() const
Definition: qgsellipsesymbollayer.h:61
QgsMarkerSymbolLayer::setSizeUnit
void setSizeUnit(QgsUnitTypes::RenderUnit unit)
Sets the units for the symbol's size.
Definition: qgssymbollayer.h:664
QgsEllipseSymbolLayer::strokeWidth
double strokeWidth() const
Definition: qgsellipsesymbollayer.h:75
QgsAbstractPropertyCollection::valueAsDouble
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.
Definition: qgspropertycollection.cpp:66
QgsSymbolLayerUtils::encodeColor
static QString encodeColor(const QColor &color)
Definition: qgssymbollayerutils.cpp:52
QgsMarkerSymbolLayer::setHorizontalAnchorPoint
void setHorizontalAnchorPoint(HorizontalAnchorPoint h)
Sets the horizontal anchor point for positioning the symbol.
Definition: qgssymbollayer.h:764
QgsMarkerSymbolLayer::VerticalAnchorPoint
VerticalAnchorPoint
Symbol vertical anchor points.
Definition: qgssymbollayer.h:588
QgsRenderContext::convertToPainterUnits
double convertToPainterUnits(double size, QgsUnitTypes::RenderUnit unit, const QgsMapUnitScale &scale=QgsMapUnitScale()) const
Converts a size from the specified units to painter units (pixels).
Definition: qgsrendercontext.cpp:287
QgsSymbolLayer::mColor
QColor mColor
Definition: qgssymbollayer.h:521
QgsRenderContext::mapToPixel
const QgsMapToPixel & mapToPixel() const
Returns the context's map to pixel transform, which transforms between map coordinates and device coo...
Definition: qgsrendercontext.h:309
QgsMarkerSymbolLayer::size
double size() const
Returns the symbol size.
Definition: qgssymbollayer.h:655
QgsSymbolLayer::dataDefinedProperties
QgsPropertyCollection & dataDefinedProperties()
Returns a reference to the symbol layer's property collection, used for data defined overrides.
Definition: qgssymbollayer.h:480
QgsProperty
A store for object properties.
Definition: qgsproperty.h:231
QgsUnitTypes::RenderUnit
RenderUnit
Rendering size units.
Definition: qgsunittypes.h:166
QgsDxfExport
Definition: qgsdxfexport.h:62
QgsMarkerSymbolLayer::mSizeMapUnitScale
QgsMapUnitScale mSizeMapUnitScale
Marker size map unit scale.
Definition: qgssymbollayer.h:867
QgsRenderContext::expressionContext
QgsExpressionContext & expressionContext()
Gets the expression context.
Definition: qgsrendercontext.h:580
QgsEllipseSymbolLayer::mapUnitScale
QgsMapUnitScale mapUnitScale() const override
Definition: qgsellipsesymbollayer.cpp:649
QgsSymbolLayerUtils::wellKnownMarkerFromSld
static bool wellKnownMarkerFromSld(QDomElement &element, QString &name, QColor &color, QColor &strokeColor, Qt::PenStyle &strokeStyle, double &strokeWidth, double &size)
Definition: qgssymbollayerutils.cpp:2432
QgsMarkerSymbolLayer::mapUnitScale
QgsMapUnitScale mapUnitScale() const override
Definition: qgssymbollayer.cpp:627
QgsSymbolLayerUtils::encodeMapUnitScale
static QString encodeMapUnitScale(const QgsMapUnitScale &mapUnitScale)
Definition: qgssymbollayerutils.cpp:558
QgsPoint
Point geometry type, with support for z-dimension and m-values.
Definition: qgspoint.h:37
QgsDxfExport::writePolygon
void writePolygon(const QgsRingSequence &polygon, const QString &layer, const QString &hatchPattern, const QColor &color)
Draw dxf filled polygon (HATCH)
Definition: qgsdxfexport.cpp:1163
QgsSymbolLayerUtils::sizeInPixelsFromSldUom
static double sizeInPixelsFromSldUom(const QString &uom, double size)
Returns the size scaled in pixels according to the uom attribute.
Definition: qgssymbollayerutils.cpp:4397
QgsDebugMsgLevel
#define QgsDebugMsgLevel(str, level)
Definition: qgslogger.h:39
QgsSymbolRenderContext::feature
const QgsFeature * feature() const
Returns the current feature being rendered.
Definition: qgssymbol.h:789
QgsEllipseSymbolLayer::strokeColor
QColor strokeColor() const override
Gets stroke color.
Definition: qgsellipsesymbollayer.h:81
qgsexpression.h
QgsEllipseSymbolLayer::setSymbolName
void setSymbolName(const QString &name)
Definition: qgsellipsesymbollayer.h:50
QgsSymbolLayer::setColor
virtual void setColor(const QColor &color)
The fill color.
Definition: qgssymbollayer.h:231
QgsSymbolLayer::color
virtual QColor color() const
The fill color.
Definition: qgssymbollayer.h:226
QgsSymbolLayer::PropertyFillColor
@ PropertyFillColor
Fill color.
Definition: qgssymbollayer.h:135
QgsEllipseSymbolLayer::setOutputUnit
void setOutputUnit(QgsUnitTypes::RenderUnit unit) override
Sets the units to use for sizes and widths within the symbol layer.
Definition: qgsellipsesymbollayer.cpp:623
qgssymbollayerutils.h
QgsMarkerSymbolLayer::setAngle
void setAngle(double angle)
Sets the rotation angle for the marker.
Definition: qgssymbollayer.h:621
QgsEllipseSymbolLayer::setFillColor
void setFillColor(const QColor &c) override
Set fill color.
Definition: qgsellipsesymbollayer.h:77
qgsfeature.h
QgsProperty::asExpression
QString asExpression() const
Returns an expression string representing the state of the property, or an empty string if the proper...
Definition: qgsproperty.cpp:332
QgsFeature::geometry
QgsGeometry geometry
Definition: qgsfeature.h:71
QgsEllipseSymbolLayer::setMapUnitScale
void setMapUnitScale(const QgsMapUnitScale &scale) override
Definition: qgsellipsesymbollayer.cpp:641
QgsMarkerSymbolLayer::startRender
void startRender(QgsSymbolRenderContext &context) override
Called before a set of rendering operations commences on the supplied render context.
Definition: qgssymbollayer.cpp:443
qgsunittypes.h
QgsUnitTypes::RenderMillimeters
@ RenderMillimeters
Millimeters.
Definition: qgsunittypes.h:168
QgsEllipseSymbolLayer::outputUnit
QgsUnitTypes::RenderUnit outputUnit() const override
Returns the units to use for sizes and widths within the symbol layer.
Definition: qgsellipsesymbollayer.cpp:631
QgsEllipseSymbolLayer::renderPoint
void renderPoint(QPointF point, QgsSymbolRenderContext &context) override
Renders a marker at the specified point.
Definition: qgsellipsesymbollayer.cpp:169
QgsEllipseSymbolLayer::symbolName
QString symbolName() const
Definition: qgsellipsesymbollayer.h:51
QgsSymbolLayerUtils::encodePenStyle
static QString encodePenStyle(Qt::PenStyle style)
Definition: qgssymbollayerutils.cpp:141
QgsMarkerSymbolLayer::setMapUnitScale
void setMapUnitScale(const QgsMapUnitScale &scale) override
Definition: qgssymbollayer.cpp:621
QgsMarkerSymbolLayer::mSizeUnit
QgsUnitTypes::RenderUnit mSizeUnit
Marker size unit.
Definition: qgssymbollayer.h:865
QgsEllipseSymbolLayer::setStrokeColor
void setStrokeColor(const QColor &c) override
Set stroke color.
Definition: qgsellipsesymbollayer.h:80
QgsEllipseSymbolLayer::setSymbolHeightUnit
void setSymbolHeightUnit(QgsUnitTypes::RenderUnit unit)
Sets the units for the symbol's height.
Definition: qgsellipsesymbollayer.h:107
QgsSymbolLayer::PropertyStrokeColor
@ PropertyStrokeColor
Stroke color.
Definition: qgssymbollayer.h:136
QgsEllipseSymbolLayer
Definition: qgsellipsesymbollayer.h:30
QgsSymbolLayerUtils::decodeColor
static QColor decodeColor(const QString &str)
Definition: qgssymbollayerutils.cpp:57
QgsMarkerSymbolLayer::mVerticalAnchorPoint
VerticalAnchorPoint mVerticalAnchorPoint
Vertical anchor point.
Definition: qgssymbollayer.h:879
QgsSymbolLayerUtils::wellKnownMarkerToSld
static void wellKnownMarkerToSld(QDomDocument &doc, QDomElement &element, const QString &name, const QColor &color, const QColor &strokeColor, Qt::PenStyle strokeStyle, double strokeWidth=-1, double size=-1)
Definition: qgssymbollayerutils.cpp:2396
QgsProperty::value
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...
Definition: qgsproperty.cpp:519
QgsSymbolLayerUtils::createGeometryElement
static void createGeometryElement(QDomDocument &doc, QDomElement &element, const QString &geomFunc)
Definition: qgssymbollayerutils.cpp:2695
QgsPropertyCollection::property
QgsProperty property(int key) const override
Returns a matching property from the collection, if one exists.
Definition: qgspropertycollection.cpp:204
QgsEllipseSymbolLayer::setSymbolWidthMapUnitScale
void setSymbolWidthMapUnitScale(const QgsMapUnitScale &scale)
Definition: qgsellipsesymbollayer.h:98
QgsEllipseSymbolLayer::setPenJoinStyle
void setPenJoinStyle(Qt::PenJoinStyle style)
Set stroke join style.
Definition: qgsellipsesymbollayer.h:72
QgsMarkerSymbolLayer::mOffsetUnit
QgsUnitTypes::RenderUnit mOffsetUnit
Offset units.
Definition: qgssymbollayer.h:871
QgsSymbolLayerUtils::createDisplacementElement
static void createDisplacementElement(QDomDocument &doc, QDomElement &element, QPointF offset)
Definition: qgssymbollayerutils.cpp:2520
QgsMarkerSymbolLayer::mSize
double mSize
Marker size.
Definition: qgssymbollayer.h:863
QgsUnitTypes::decodeRenderUnit
static Q_INVOKABLE QgsUnitTypes::RenderUnit decodeRenderUnit(const QString &string, bool *ok=nullptr)
Decodes a render unit from a string.
Definition: qgsunittypes.cpp:2900
QgsSymbolRenderContext
Definition: qgssymbol.h:681
QgsMarkerSymbolLayer::HorizontalAnchorPoint
HorizontalAnchorPoint
Symbol horizontal anchor points.
Definition: qgssymbollayer.h:580
QgsMarkerSymbolLayer::setOutputUnit
void setOutputUnit(QgsUnitTypes::RenderUnit unit) override
Sets the units to use for sizes and widths within the symbol layer.
Definition: qgssymbollayer.cpp:606
QgsMarkerSymbolLayer::markerOffset
void markerOffset(QgsSymbolRenderContext &context, double &offsetX, double &offsetY) const
Calculates the required marker offset, including both the symbol offset and any displacement required...
Definition: qgssymbollayer.cpp:473
QgsSymbolLayer
Definition: qgssymbollayer.h:52
QgsUnitTypes::encodeUnit
static Q_INVOKABLE QString encodeUnit(QgsUnitTypes::DistanceUnit unit)
Encodes a distance unit to a string.
Definition: qgsunittypes.cpp:122
QgsEllipseSymbolLayer::createFromSld
static QgsSymbolLayer * createFromSld(QDomElement &element)
Definition: qgsellipsesymbollayer.cpp:417
QgsEllipseSymbolLayer::setStrokeWidth
void setStrokeWidth(double w)
Definition: qgsellipsesymbollayer.h:74
QgsEllipseSymbolLayer::setSymbolWidthUnit
void setSymbolWidthUnit(QgsUnitTypes::RenderUnit unit)
Sets the units for the symbol's width.
Definition: qgsellipsesymbollayer.h:89
QgsPropertyCollection::hasActiveProperties
bool hasActiveProperties() const override
Returns true if the collection has any active properties, or false if all properties within the colle...
Definition: qgspropertycollection.cpp:294
qgsDoubleNear
bool qgsDoubleNear(double a, double b, double epsilon=4 *std::numeric_limits< double >::epsilon())
Compare two doubles (but allow some difference)
Definition: qgis.h:315
QgsMapToPixel::mapRotation
double mapRotation() const
Returns current map rotation in degrees.
Definition: qgsmaptopixel.cpp:158
QgsSymbolLayerUtils::rescaleUom
static double rescaleUom(double size, QgsUnitTypes::RenderUnit unit, const QgsStringMap &props)
Rescales the given size based on the uomScale found in the props, if any is found,...
Definition: qgssymbollayerutils.cpp:4262
QgsEllipseSymbolLayer::clone
QgsEllipseSymbolLayer * clone() const override
Shall be reimplemented by subclasses to create a deep copy of the instance.
Definition: qgsellipsesymbollayer.cpp:317
QgsSymbolLayer::copyPaintEffect
void copyPaintEffect(QgsSymbolLayer *destLayer) const
Copies paint effect of this layer to another symbol layer.
Definition: qgssymbollayer.cpp:406
QgsSymbolLayerUtils::decodePoint
static QPointF decodePoint(const QString &string)
Decodes a QSizeF from a string.
Definition: qgssymbollayerutils.cpp:435
QgsSymbolLayer::PropertyStrokeStyle
@ PropertyStrokeStyle
Stroke style (eg solid, dashed)
Definition: qgssymbollayer.h:138
QgsMarkerSymbolLayer::outputUnit
QgsUnitTypes::RenderUnit outputUnit() const override
Returns the units to use for sizes and widths within the symbol layer.
Definition: qgssymbollayer.cpp:612
QgsEllipseSymbolLayer::writeSldMarker
void writeSldMarker(QDomDocument &doc, QDomElement &element, const QgsStringMap &props) const override
Writes the symbol layer definition as a SLD XML element.
Definition: qgsellipsesymbollayer.cpp:360
qgsrendercontext.h
QgsSymbolLayerUtils::createVendorOptionElement
static QDomElement createVendorOptionElement(QDomDocument &doc, const QString &name, const QString &value)
Definition: qgssymbollayerutils.cpp:2887
QgsSymbolLayer::PropertyName
@ PropertyName
Name, eg shape name for simple markers.
Definition: qgssymbollayer.h:134
QgsGeometry::isNull
bool isNull
Definition: qgsgeometry.h:125
QgsMarkerSymbolLayer::setOffset
void setOffset(QPointF offset)
Sets the marker's offset, which is the horizontal and vertical displacement which the rendered marker...
Definition: qgssymbollayer.h:712
QgsMapUnitScale
Struct for storing maximum and minimum scales for measurements in map units.
Definition: qgsmapunitscale.h:37
QgsSymbolLayer::mDataDefinedProperties
QgsPropertyCollection mDataDefinedProperties
Definition: qgssymbollayer.h:524
QgsSymbolLayer::PropertyStrokeWidth
@ PropertyStrokeWidth
Stroke width.
Definition: qgssymbollayer.h:137
QgsRingSequence
QVector< QgsPointSequence > QgsRingSequence
Definition: qgsabstractgeometry.h:48
QgsEllipseSymbolLayer::fillColor
QColor fillColor() const override
Gets fill color.
Definition: qgsellipsesymbollayer.h:78
QgsMarkerSymbolLayer::setOffsetUnit
void setOffsetUnit(QgsUnitTypes::RenderUnit unit)
Sets the units for the symbol's offset.
Definition: qgssymbollayer.h:730
QgsSymbolLayerUtils::encodePoint
static QString encodePoint(QPointF point)
Encodes a QPointF to a string.
Definition: qgssymbollayerutils.cpp:430
QgsAbstractPropertyCollection::valueAsString
QString valueAsString(int key, const QgsExpressionContext &context, const QString &defaultString=QString(), bool *ok=nullptr) const
Calculates the current value of the property with the specified key and interprets it as a string.
Definition: qgspropertycollection.cpp:42
QgsSymbolRenderContext::renderHints
QgsSymbol::RenderHints renderHints() const
Returns the rendering hint flags for the symbol.
Definition: qgssymbol.h:776
QgsEllipseSymbolLayer::setSymbolHeight
void setSymbolHeight(double h)
Definition: qgsellipsesymbollayer.cpp:617
qgsvectorlayer.h
QgsMarkerSymbolLayer::setOffsetMapUnitScale
void setOffsetMapUnitScale(const QgsMapUnitScale &scale)
Sets the map unit scale for the symbol's offset.
Definition: qgssymbollayer.h:747
QgsStringMap
QMap< QString, QString > QgsStringMap
Definition: qgis.h:714
QgsMarkerSymbolLayer::mOffset
QPointF mOffset
Marker offset.
Definition: qgssymbollayer.h:869
QgsWkbTypes::PointGeometry
@ PointGeometry
Definition: qgswkbtypes.h:141
QgsMarkerSymbolLayer::mHorizontalAnchorPoint
HorizontalAnchorPoint mHorizontalAnchorPoint
Horizontal anchor point.
Definition: qgssymbollayer.h:877
QgsPointSequence
QVector< QgsPoint > QgsPointSequence
Definition: qgsabstractgeometry.h:44
QgsPropertyCollection::value
QVariant value(int key, const QgsExpressionContext &context, const QVariant &defaultValue=QVariant()) const override
Returns the calculated value of the property with the specified key from within the collection.
Definition: qgspropertycollection.cpp:218
QgsGeometry
Definition: qgsgeometry.h:122
QgsEllipseSymbolLayer::toSld
void toSld(QDomDocument &doc, QDomElement &element, const QgsStringMap &props) const override
Definition: qgsellipsesymbollayer.cpp:347
QgsMapToPixel
Definition: qgsmaptopixel.h:37
QgsDxfExport::writeFilledCircle
void writeFilledCircle(const QString &layer, const QColor &color, const QgsPoint &pt, double radius)
Write filled circle (as hatch)
Definition: qgsdxfexport.cpp:1403
QgsSymbol::DynamicRotation
@ DynamicRotation
Rotation of symbol may be changed during rendering and symbol should not be cached.
Definition: qgssymbol.h:106
QgsSymbolLayerUtils::getVendorOptionList
static QgsStringMap getVendorOptionList(QDomElement &element)
Definition: qgssymbollayerutils.cpp:2895
QgsMarkerSymbolLayer::mLineAngle
double mLineAngle
Line rotation angle (see setLineAngle() for details)
Definition: qgssymbollayer.h:861
QgsEllipseSymbolLayer::writeDxf
bool writeDxf(QgsDxfExport &e, double mmMapUnitScaleFactor, const QString &layerName, QgsSymbolRenderContext &context, QPointF shift=QPointF(0.0, 0.0)) const override
write as DXF
Definition: qgsellipsesymbollayer.cpp:722
qgsellipsesymbollayer.h
QgsSymbolLayerUtils::rotationFromSldElement
static bool rotationFromSldElement(QDomElement &element, QString &rotationFunc)
Definition: qgssymbollayerutils.cpp:2489
QgsEllipseSymbolLayer::startRender
void startRender(QgsSymbolRenderContext &context) override
Called before a set of rendering operations commences on the supplied render context.
Definition: qgsellipsesymbollayer.cpp:299
QgsSymbolLayer::PropertyAngle
@ PropertyAngle
Symbol angle.
Definition: qgssymbollayer.h:133
QgsEllipseSymbolLayer::symbolWidth
double symbolWidth() const
Definition: qgsellipsesymbollayer.h:56
qgsproperty.h
QgsUnitTypes::RenderUnknownUnit
@ RenderUnknownUnit
Mixed or unknown units.
Definition: qgsunittypes.h:174
QgsSymbolLayer::restoreOldDataDefinedProperties
void restoreOldDataDefinedProperties(const QgsStringMap &stringMap)
Restores older data defined properties from string map.
Definition: qgssymbollayer.cpp:277
QgsSymbolLayerUtils::decodePenJoinStyle
static Qt::PenJoinStyle decodePenJoinStyle(const QString &str)
Definition: qgssymbollayerutils.cpp:188
QgsSymbolLayerUtils::createRotationElement
static void createRotationElement(QDomDocument &doc, QDomElement &element, const QString &rotationFunc)
Definition: qgssymbollayerutils.cpp:2479
QgsMarkerSymbolLayer::_rotatedOffset
static QPointF _rotatedOffset(QPointF offset, double angle)
Adjusts a marker offset to account for rotation.
Definition: qgssymbollayer.cpp:567
QgsMarkerSymbolLayer::setSize
virtual void setSize(double size)
Sets the symbol size.
Definition: qgssymbollayer.h:647
QgsMarkerSymbolLayer::offset
QPointF offset() const
Returns the marker's offset, which is the horizontal and vertical displacement which the rendered mar...
Definition: qgssymbollayer.h:721
QgsMarkerSymbolLayer::setSizeMapUnitScale
void setSizeMapUnitScale(const QgsMapUnitScale &scale)
Sets the map unit scale for the symbol's size.
Definition: qgssymbollayer.h:681
QgsMarkerSymbolLayer::setVerticalAnchorPoint
void setVerticalAnchorPoint(VerticalAnchorPoint v)
Sets the vertical anchor point for positioning the symbol.
Definition: qgssymbollayer.h:781
qgsdxfexport.h
QgsEllipseSymbolLayer::properties
QgsStringMap properties() const override
Should be reimplemented by subclasses to return a string map that contains the configuration informat...
Definition: qgsellipsesymbollayer.cpp:473
QgsEllipseSymbolLayer::create
static QgsSymbolLayer * create(const QgsStringMap &properties=QgsStringMap())
Definition: qgsellipsesymbollayer.cpp:46
QgsMarkerSymbolLayer::mAngle
double mAngle
Marker rotation angle, in degrees clockwise from north.
Definition: qgssymbollayer.h:859
QgsSymbolLayerUtils::encodePenJoinStyle
static QString encodePenJoinStyle(Qt::PenJoinStyle style)
Definition: qgssymbollayerutils.cpp:173
QgsFeature
Definition: qgsfeature.h:55
QgsSymbolRenderContext::renderContext
QgsRenderContext & renderContext()
Returns a reference to the context's render context.
Definition: qgssymbol.h:708
QgsEllipseSymbolLayer::QgsEllipseSymbolLayer
QgsEllipseSymbolLayer()
Definition: qgsellipsesymbollayer.cpp:31
QgsSymbolLayer::PropertyHeight
@ PropertyHeight
Symbol height.
Definition: qgssymbollayer.h:142
QgsEllipseSymbolLayer::setStrokeStyle
void setStrokeStyle(Qt::PenStyle strokeStyle)
Definition: qgsellipsesymbollayer.h:62
qgslogger.h
QgsRenderContext::painter
QPainter * painter()
Returns the destination QPainter for the render operation.
Definition: qgsrendercontext.h:174
QgsSymbolLayerUtils::decodePenStyle
static Qt::PenStyle decodePenStyle(const QString &str)
Definition: qgssymbollayerutils.cpp:162
QgsPropertyCollection::isActive
bool isActive(int key) const override
Returns true if the collection contains an active property with the specified key.
Definition: qgspropertycollection.cpp:258
QgsEllipseSymbolLayer::setSize
void setSize(double size) override
Sets the symbol size.
Definition: qgsellipsesymbollayer.cpp:596
QgsEllipseSymbolLayer::setStrokeWidthMapUnitScale
void setStrokeWidthMapUnitScale(const QgsMapUnitScale &scale)
Definition: qgsellipsesymbollayer.h:132
QgsGeometry::type
QgsWkbTypes::GeometryType type
Definition: qgsgeometry.h:126
QgsMarkerSymbolLayer::mOffsetMapUnitScale
QgsMapUnitScale mOffsetMapUnitScale
Offset map unit scale.
Definition: qgssymbollayer.h:873
MathUtils::angle
double ANALYSIS_EXPORT angle(QgsPoint *p1, QgsPoint *p2, QgsPoint *p3, QgsPoint *p4)
Calculates the angle between two segments (in 2 dimension, z-values are ignored)
Definition: MathUtils.cpp:786
QgsSymbolLayer::copyDataDefinedProperties
void copyDataDefinedProperties(QgsSymbolLayer *destLayer) const
Copies all data defined properties of this layer to another symbol layer.
Definition: qgssymbollayer.cpp:398
QgsEllipseSymbolLayer::setSymbolHeightMapUnitScale
void setSymbolHeightMapUnitScale(const QgsMapUnitScale &scale)
Definition: qgsellipsesymbollayer.h:116
QgsSymbolLayerUtils::decodeMapUnitScale
static QgsMapUnitScale decodeMapUnitScale(const QString &str)
Definition: qgssymbollayerutils.cpp:568
QgsMarkerSymbolLayer::angle
double angle() const
Returns the rotation angle for the marker, in degrees clockwise from north.
Definition: qgssymbollayer.h:627
QgsEllipseSymbolLayer::bounds
QRectF bounds(QPointF point, QgsSymbolRenderContext &context) override
Returns the approximate bounding box of the marker symbol layer, taking into account any data defined...
Definition: qgsellipsesymbollayer.cpp:660
QgsEllipseSymbolLayer::layerType
QString layerType() const override
Returns a string that represents this layer type.
Definition: qgsellipsesymbollayer.cpp:294
QgsEllipseSymbolLayer::symbolHeight
double symbolHeight() const
Definition: qgsellipsesymbollayer.h:59
QgsAbstractPropertyCollection::valueAsColor
QColor valueAsColor(int key, const QgsExpressionContext &context, const QColor &defaultColor=QColor(), bool *ok=nullptr) const
Calculates the current value of the property with the specified key and interprets it as a color.
Definition: qgspropertycollection.cpp:54
QgsEllipseSymbolLayer::setSymbolWidth
void setSymbolWidth(double w)
Definition: qgsellipsesymbollayer.cpp:611
QgsDxfExport::writePolyline
void writePolyline(const QgsPointSequence &line, const QString &layer, const QString &lineStyleName, const QColor &color, double width=-1)
Draw dxf primitives (LWPOLYLINE)
Definition: qgsdxfexport.cpp:937
QgsSymbolLayer::PropertyJoinStyle
@ PropertyJoinStyle
Line join style.
Definition: qgssymbollayer.h:145
QgsSymbolLayer::PropertyWidth
@ PropertyWidth
Symbol width.
Definition: qgssymbollayer.h:141