28#include <QDomDocument> 
   32  : mStrokeColor( QColor( 35, 35, 35 ) )
 
   35  mPen.setColor( mStrokeColor );
 
   36  mPen.setStyle( mStrokeStyle );
 
   37  mPen.setJoinStyle( mPenJoinStyle );
 
   40  mBrush.setStyle( Qt::SolidPattern );
 
   50  if ( 
properties.contains( QStringLiteral( 
"symbol_name" ) ) )
 
   54  if ( 
properties.contains( QStringLiteral( 
"size" ) ) )
 
   58  if ( 
properties.contains( QStringLiteral( 
"size_unit" ) ) )
 
   62  if ( 
properties.contains( QStringLiteral( 
"size_map_unit_scale" ) ) )
 
   66  if ( 
properties.contains( QStringLiteral( 
"symbol_width" ) ) )
 
   70  if ( 
properties.contains( QStringLiteral( 
"symbol_width_unit" ) ) )
 
   74  if ( 
properties.contains( QStringLiteral( 
"symbol_width_map_unit_scale" ) ) )
 
   78  if ( 
properties.contains( QStringLiteral( 
"symbol_height" ) ) )
 
   82  if ( 
properties.contains( QStringLiteral( 
"symbol_height_unit" ) ) )
 
   86  if ( 
properties.contains( QStringLiteral( 
"symbol_height_map_unit_scale" ) ) )
 
   90  if ( 
properties.contains( QStringLiteral( 
"angle" ) ) )
 
   94  if ( 
properties.contains( QStringLiteral( 
"outline_style" ) ) )
 
   98  else if ( 
properties.contains( QStringLiteral( 
"line_style" ) ) )
 
  102  if ( 
properties.contains( QStringLiteral( 
"joinstyle" ) ) )
 
  106  if ( 
properties.contains( QStringLiteral( 
"cap_style" ) ) )
 
  110  if ( 
properties.contains( QStringLiteral( 
"outline_width" ) ) )
 
  114  else if ( 
properties.contains( QStringLiteral( 
"line_width" ) ) )
 
  118  if ( 
properties.contains( QStringLiteral( 
"outline_width_unit" ) ) )
 
  122  else if ( 
properties.contains( QStringLiteral( 
"line_width_unit" ) ) )
 
  126  if ( 
properties.contains( QStringLiteral( 
"outline_width_map_unit_scale" ) ) )
 
  130  if ( 
properties.contains( QStringLiteral( 
"fill_color" ) ) )
 
  135  else if ( 
properties.contains( QStringLiteral( 
"color" ) ) )
 
  139  if ( 
properties.contains( QStringLiteral( 
"outline_color" ) ) )
 
  143  else if ( 
properties.contains( QStringLiteral( 
"line_color" ) ) )
 
  147  if ( 
properties.contains( QStringLiteral( 
"offset" ) ) )
 
  151  if ( 
properties.contains( QStringLiteral( 
"offset_unit" ) ) )
 
  155  if ( 
properties.contains( QStringLiteral( 
"offset_map_unit_scale" ) ) )
 
  159  if ( 
properties.contains( QStringLiteral( 
"horizontal_anchor_point" ) ) )
 
  163  if ( 
properties.contains( QStringLiteral( 
"vertical_anchor_point" ) ) )
 
  176  double scaledWidth = mSymbolWidth;
 
  177  double scaledHeight = mSymbolHeight;
 
  179  QColor brushColor = 
mColor;
 
  180  brushColor.setAlphaF( brushColor.alphaF() * context.
opacity() );
 
  181  mBrush.setColor( brushColor );
 
  183  QColor penColor = mStrokeColor;
 
  184  penColor.setAlphaF( penColor.alphaF() * context.
opacity() );
 
  185  mPen.setColor( penColor );
 
  194      double width = exprVal.toDouble( &ok );
 
  198        mPen.setWidthF( width );
 
  199        mSelPen.setWidthF( width );
 
  211      mSelPen.setStyle( mPen.style() );
 
  222      mSelPen.setJoinStyle( mPen.joinStyle() );
 
  241    brushColor.setAlphaF( brushColor.alphaF() * context.
opacity() );
 
  242    mBrush.setColor( brushColor );
 
  249    penColor.setAlphaF( penColor.alphaF() * context.
opacity() );
 
  250    mPen.setColor( penColor );
 
  262    preparePath( 
shape, context, &scaledWidth, &scaledHeight, context.
feature() );
 
  266  bool hasDataDefinedRotation = 
false;
 
  269  calculateOffsetAndRotation( context, scaledWidth, scaledHeight, hasDataDefinedRotation, 
offset, 
angle );
 
  277  QTransform transform;
 
  278  transform.translate( point.x() + 
offset.x(), point.y() + 
offset.y() );
 
  281    transform.rotate( 
angle );
 
  286    p->setPen( context.
selected() ? mSelPen : mPen );
 
  287    p->setBrush( context.
selected() ? mSelBrush : mBrush );
 
  291    p->setPen( context.
selected() ? mSelPen : mPen );
 
  292    p->setBrush( QBrush() );
 
  294  p->drawPath( transform.map( mPainterPath ) );
 
  301    bool &hasDataDefinedRotation,
 
  303    double &
angle )
 const 
  307  markerOffset( context, scaledWidth, scaledHeight, mSymbolWidthUnit, mSymbolHeightUnit, offsetX, offsetY, mSymbolWidthMapUnitScale, mSymbolHeightMapUnitScale );
 
  308  offset = QPointF( offsetX, offsetY );
 
  311  const bool ok = 
true;
 
  313  bool usingDataDefinedRotation = 
false;
 
  318    usingDataDefinedRotation = ok;
 
  322  if ( hasDataDefinedRotation )
 
  347  return QStringLiteral( 
"EllipseMarker" );
 
  355    preparePath( mShape, context );
 
  357  mPen.setColor( mStrokeColor );
 
  358  mPen.setStyle( mStrokeStyle );
 
  359  mPen.setJoinStyle( mPenJoinStyle );
 
  360  mPen.setCapStyle( mPenCapStyle );
 
  362  mBrush.setColor( 
mColor );
 
  365  QColor selPenColor = selBrushColor == 
mColor ? selBrushColor : mStrokeColor;
 
  368    selBrushColor.setAlphaF( context.
opacity() );
 
  369    selPenColor.setAlphaF( context.
opacity() );
 
  371  mSelBrush = QBrush( selBrushColor );
 
  372  mSelPen = QPen( !
shapeIsFilled( mShape ) ? selBrushColor : selPenColor );
 
  373  mSelPen.setStyle( mStrokeStyle );
 
  414  QDomElement symbolizerElem = doc.createElement( QStringLiteral( 
"se:PointSymbolizer" ) );
 
  415  if ( !props.value( QStringLiteral( 
"uom" ), QString() ).toString().isEmpty() )
 
  416    symbolizerElem.setAttribute( QStringLiteral( 
"uom" ), props.value( QStringLiteral( 
"uom" ), QString() ).toString() );
 
  417  element.appendChild( symbolizerElem );
 
  428  QDomElement graphicElem = doc.createElement( QStringLiteral( 
"se:Graphic" ) );
 
  429  element.appendChild( graphicElem );
 
  438  QString angleFunc = props.
value( QStringLiteral( 
"angle" ), QString() ).toString();
 
  439  if ( angleFunc.isEmpty() )  
 
  441    if ( ddRotation && ddRotation.
isActive() )
 
  446      angleFunc = QString::number( 
mAngle );
 
  448  else if ( ddRotation && ddRotation.
isActive() )
 
  452    angleFunc = QStringLiteral( 
"%1 + %2" ).arg( angleFunc, ddRotation.
asExpression() );
 
  458    const double angle = angleFunc.toDouble( &ok );
 
  462      angleFunc = QStringLiteral( 
"%1 + %2" ).arg( angleFunc ).arg( 
mAngle );
 
  477  const double widthHeightFactor = mSymbolWidth / mSymbolHeight;
 
  479  graphicElem.appendChild( factorElem );
 
  486  QDomElement graphicElem = element.firstChildElement( QStringLiteral( 
"Graphic" ) );
 
  487  if ( graphicElem.isNull() )
 
  490  QString name = QStringLiteral( 
"circle" );
 
  493  double widthHeightFactor = 1.0;
 
  497  for ( QgsStringMap::iterator it = vendorOptions.begin(); it != vendorOptions.end(); ++it )
 
  499    if ( it.key() == QLatin1String( 
"widthHeightFactor" ) )
 
  502      const double v = it.value().toDouble( &ok );
 
  504        widthHeightFactor = v;
 
  511  double scaleFactor = 1.0;
 
  512  const QString uom = element.attribute( QStringLiteral( 
"uom" ) );
 
  522    const double d = angleFunc.toDouble( &ok );
 
  543  map[QStringLiteral( 
"symbol_name" )] = 
encodeShape( mShape );
 
  544  map[QStringLiteral( 
"symbol_width" )] = QString::number( mSymbolWidth );
 
  547  map[QStringLiteral( 
"symbol_height" )] = QString::number( mSymbolHeight );
 
  550  map[QStringLiteral( 
"angle" )] = QString::number( 
mAngle );
 
  552  map[QStringLiteral( 
"outline_width" )] = QString::number( mStrokeWidth );
 
  562  map[QStringLiteral( 
"size" )] = QString::number( 
mSize );
 
  570QSizeF QgsEllipseSymbolLayer::calculateSize( 
QgsSymbolRenderContext &context, 
double *scaledWidth, 
double *scaledHeight )
 
  581    width = mSymbolWidth;
 
  585    *scaledWidth = width;
 
  597    height = mSymbolHeight;
 
  601    *scaledHeight = height;
 
  604  return QSizeF( width, height );
 
  609  mPainterPath = QPainterPath();
 
  611  const QSizeF 
size = calculateSize( context, scaledWidth, scaledHeight );
 
  616      mPainterPath.addEllipse( QRectF( -
size.width() / 2.0, -
size.height() / 2.0, 
size.width(), 
size.height() ) );
 
  620      mPainterPath.arcTo( -
size.width() / 2.0, -
size.height() / 2.0, 
size.width(), 
size.height(), 0, 180 );
 
  621      mPainterPath.lineTo( 0, 0 );
 
  625      mPainterPath.arcTo( -
size.width() / 2.0, -
size.height() / 2.0, 
size.width(), 
size.height(), 90, 120 );
 
  626      mPainterPath.lineTo( 0, 0 );
 
  630      mPainterPath.arcTo( -
size.width() / 2.0, -
size.height() / 2.0, 
size.width(), 
size.height(), 90, 90 );
 
  631      mPainterPath.lineTo( 0, 0 );
 
  635      mPainterPath.addRect( QRectF( -
size.width() / 2.0, -
size.height() / 2.0, 
size.width(), 
size.height() ) );
 
  639      mPainterPath.moveTo( -
size.width() / 2.0, 0 );
 
  640      mPainterPath.lineTo( 0, 
size.height() / 2.0 );
 
  641      mPainterPath.lineTo( 
size.width() / 2.0, 0 );
 
  642      mPainterPath.lineTo( 0, -
size.height() / 2.0 );
 
  643      mPainterPath.lineTo( -
size.width() / 2.0, 0 );
 
  647      mPainterPath.moveTo( 0, -
size.height() / 2.0 );
 
  648      mPainterPath.lineTo( 0, 
size.height() / 2.0 );
 
  649      mPainterPath.moveTo( -
size.width() / 2.0, 0 );
 
  650      mPainterPath.lineTo( 
size.width() / 2.0, 0 );
 
  654      mPainterPath.moveTo( -
size.width() / 2.0, 
size.height() / 2.0 );
 
  655      mPainterPath.lineTo( 0, -
size.height() / 2.0 );
 
  656      mPainterPath.lineTo( 
size.width() / 2.0, 
size.height() / 2.0 );
 
  660      mPainterPath.moveTo( 
size.width() / 2.0, 0 );
 
  661      mPainterPath.arcTo( -
size.width() / 2.0, -
size.height() / 2.0, 
size.width(), 
size.height(), 0, 180 );
 
  665      mPainterPath.moveTo( 0, -
size.height() / 2.0 );
 
  666      mPainterPath.lineTo( -
size.width() / 2.0, 
size.height() / 2.0 );
 
  667      mPainterPath.lineTo( 
size.width() / 2.0, 
size.height() / 2.0 );
 
  668      mPainterPath.lineTo( 0, -
size.height() / 2.0 );
 
  672      mPainterPath.moveTo( 0, 
size.height() / 2.0 );
 
  673      mPainterPath.lineTo( 
size.width() / 2.0, 
size.height() / 2.0 );
 
  674      mPainterPath.lineTo( 0, -
size.height() / 2.0 );
 
  675      mPainterPath.lineTo( 0, 
size.height() / 2.0 );
 
  679      mPainterPath.moveTo( -
size.width() / 2.0, 
size.height() / 2.0 );
 
  680      mPainterPath.lineTo( 0, 
size.height() / 2.0 );
 
  681      mPainterPath.lineTo( 0, -
size.height() / 2.0 );
 
  682      mPainterPath.lineTo( -
size.width() / 2.0, 
size.height() / 2.0 );
 
  686      mPainterPath.moveTo( ( 
size.width() * -0.9511 ) / 2.0, 
size.height() / ( 2 / -0.309 ) );
 
  687      mPainterPath.lineTo( ( 
size.width() * -0.5878 ) / 2.0, 
size.height() / ( 2 / 0.8090 ) );
 
  688      mPainterPath.lineTo( ( 
size.width() * 0.5878 ) / 2.0, 
size.height() / ( 2 / 0.8090 ) );
 
  689      mPainterPath.lineTo( ( 
size.width() * 0.9511 ) / 2.0, 
size.height() / ( 2 / -0.309 ) );
 
  690      mPainterPath.lineTo( 0, 
size.height() / -2.0 );
 
  691      mPainterPath.lineTo( ( 
size.width() * -0.9511 ) / 2.0, 
size.height() / ( 2 / -0.309 ) );
 
  695      mPainterPath.moveTo( ( 
size.width() * 0.8660 ) / 2.0, 
size.height() / 4.0 );
 
  696      mPainterPath.lineTo( ( 
size.width() * 0.8660 ) / 2.0, 
size.height() / -4.0 );
 
  697      mPainterPath.lineTo( 0, 
size.height() / -2.0 );
 
  698      mPainterPath.lineTo( ( 
size.width() * 0.8660 ) / -2.0, 
size.height() / -4.0 );
 
  699      mPainterPath.lineTo( ( 
size.width() * 0.8660 ) / -2.0, 
size.height() / 4.0 );
 
  700      mPainterPath.lineTo( 0, 
size.height() / 2.0 );
 
  701      mPainterPath.lineTo( ( 
size.width() * 0.8660 ) / 2.0, 
size.height() / 4.0 );
 
  706      static constexpr double VERTEX_OFFSET_FROM_ORIGIN = 1.0 / ( 1 + M_SQRT2 );
 
  707      mPainterPath.moveTo( ( 
size.width() * VERTEX_OFFSET_FROM_ORIGIN ) / -2.0, 
size.height() / 2.0 );
 
  708      mPainterPath.lineTo( ( 
size.width() * VERTEX_OFFSET_FROM_ORIGIN ) / 2.0, 
size.height() / 2.0 );
 
  709      mPainterPath.lineTo( 
size.width() / 2.0, ( 
size.height() * VERTEX_OFFSET_FROM_ORIGIN ) / 2.0 );
 
  710      mPainterPath.lineTo( 
size.width() / 2.0, ( 
size.height() * VERTEX_OFFSET_FROM_ORIGIN ) / -2.0 );
 
  711      mPainterPath.lineTo( ( 
size.width() * VERTEX_OFFSET_FROM_ORIGIN ) / 2.0, 
size.height() / -2.0 );
 
  712      mPainterPath.lineTo( ( 
size.width() * VERTEX_OFFSET_FROM_ORIGIN ) / -2.0, 
size.height() / -2.0 );
 
  713      mPainterPath.lineTo( 
size.width() / -2.0, ( 
size.height() * VERTEX_OFFSET_FROM_ORIGIN ) / -2.0 );
 
  714      mPainterPath.lineTo( 
size.width() / -2.0, ( 
size.height() * VERTEX_OFFSET_FROM_ORIGIN ) / 2.0 );
 
  715      mPainterPath.lineTo( ( 
size.width() * VERTEX_OFFSET_FROM_ORIGIN ) / -2.0, 
size.height() / 2.0 );
 
  721      const double inner_r = std::cos( 
DEG2RAD( 72.0 ) ) / std::cos( 
DEG2RAD( 36.0 ) );
 
  722      mPainterPath.moveTo( ( 
size.width() * inner_r * std::sin( 
DEG2RAD( 324.0 ) ) ) / 2.0, ( 
size.height() * inner_r * std::cos( 
DEG2RAD( 324.0 ) ) ) / -2.0 );
 
  723      mPainterPath.lineTo( ( 
size.width() * std::sin( 
DEG2RAD( 288.0 ) ) ) / 2.0, ( 
size.height() * std::cos( 
DEG2RAD( 288.0 ) ) ) / -2.0 );
 
  724      mPainterPath.lineTo( ( 
size.width() * inner_r * std::sin( 
DEG2RAD( 252.0 ) ) ) / 2.0, ( 
size.height() * inner_r * std::cos( 
DEG2RAD( 252.0 ) ) ) / -2.0 );
 
  725      mPainterPath.lineTo( ( 
size.width() * std::sin( 
DEG2RAD( 216.0 ) ) ) / 2.0, ( 
size.height() * std::cos( 
DEG2RAD( 216.0 ) ) ) / -2.0 );
 
  726      mPainterPath.lineTo( 0, ( 
size.height() * inner_r ) / 2.0 );
 
  727      mPainterPath.lineTo( ( 
size.width() * std::sin( 
DEG2RAD( 144.0 ) ) ) / 2.0, ( 
size.height() * std::cos( 
DEG2RAD( 144.0 ) ) ) / -2.0 );
 
  728      mPainterPath.lineTo( ( 
size.width() * inner_r * std::sin( 
DEG2RAD( 108.0 ) ) ) / 2.0, ( 
size.height() * inner_r * std::cos( 
DEG2RAD( 108.0 ) ) ) / -2.0 );
 
  729      mPainterPath.lineTo( ( 
size.width() * std::sin( 
DEG2RAD( 72.0 ) ) ) / 2.0, ( 
size.height() * std::cos( 
DEG2RAD( 72.0 ) ) ) / -2.0 );
 
  730      mPainterPath.lineTo( ( 
size.width() * inner_r * std::sin( 
DEG2RAD( 36.0 ) ) ) / 2.0, ( 
size.height() * inner_r * std::cos( 
DEG2RAD( 36.0 ) ) ) / -2.0 );
 
  731      mPainterPath.lineTo( 0, 
size.height() / -2.0 );
 
  732      mPainterPath.lineTo( ( 
size.width() * inner_r * std::sin( 
DEG2RAD( 324.0 ) ) ) / 2.0, ( 
size.height() * inner_r * std::cos( 
DEG2RAD( 324.0 ) ) ) / -2.0 );
 
  768  if ( mSymbolWidth >= mSymbolHeight )
 
  770    mSymbolHeight = mSymbolHeight * 
size / mSymbolWidth;
 
  775    mSymbolWidth = mSymbolWidth * 
size / mSymbolHeight;
 
  776    mSymbolHeight = 
size;
 
  796  mSymbolWidthUnit = unit;
 
  797  mSymbolHeightUnit = unit;
 
  798  mStrokeWidthUnit = unit;
 
  804  if ( mSymbolWidthUnit != unit || mSymbolHeightUnit != unit || mStrokeWidthUnit != unit )
 
  822  mSymbolWidthMapUnitScale = scale;
 
  823  mSymbolHeightMapUnitScale = scale;
 
  824  mStrokeWidthMapUnitScale = scale;
 
  830       mSymbolWidthMapUnitScale == mSymbolHeightMapUnitScale &&
 
  831       mSymbolHeightMapUnitScale == mStrokeWidthMapUnitScale )
 
  833    return mSymbolWidthMapUnitScale;
 
  840  const QSizeF 
size = calculateSize( context );
 
  842  bool hasDataDefinedRotation = 
false;
 
  845  calculateOffsetAndRotation( context, 
size.width(), 
size.height(), hasDataDefinedRotation, 
offset, 
angle );
 
  847  QTransform transform;
 
  850  transform.translate( point.x() + 
offset.x(), point.y() + 
offset.y() );
 
  853    transform.rotate( 
angle );
 
  855  double penWidth = mStrokeWidth;
 
  864      const double strokeWidth = exprVal.toDouble( &ok );
 
  882  else if ( mStrokeStyle == Qt::NoPen )
 
  888  QRectF symbolBounds = transform.mapRect( QRectF( -
size.width() / 2.0,
 
  889                        -
size.height() / 2.0,
 
  894  symbolBounds.adjust( -penWidth / 2.0, -penWidth / 2.0,
 
  895                       penWidth / 2.0, penWidth / 2.0 );
 
  949  QColor oc = mStrokeColor;
 
  968  QPointF off( offsetX, offsetY );
 
  971  double rotation = 0.0;
 
  981  rotation = -rotation; 
 
  986  t.translate( shift.x() + offsetX, shift.y() + offsetY );
 
  989    t.rotate( rotation );
 
 1000        const QgsPoint pt( t.map( QPointF( 0, 0 ) ) );
 
 1007        const double stepsize = 2 * M_PI / 40;
 
 1008        for ( 
int i = 0; i < 39; ++i )
 
 1010          const double angle = stepsize * i;
 
 1011          const double x = halfWidth * std::cos( 
angle );
 
 1012          const double y = halfHeight * std::sin( 
angle );
 
 1013          line << 
QgsPoint( t.map( QPointF( x, y ) ) );
 
 1016        line << line.at( 0 );
 
 1018        if ( mBrush.style() != Qt::NoBrush )
 
 1020        if ( mPen.style() != Qt::NoPen )
 
 1029      p << 
QgsPoint( t.map( QPointF( -halfWidth, -halfHeight ) ) )
 
 1030        << 
QgsPoint( t.map( QPointF( halfWidth, -halfHeight ) ) )
 
 1031        << 
QgsPoint( t.map( QPointF( halfWidth, halfHeight ) ) )
 
 1032        << 
QgsPoint( t.map( QPointF( -halfWidth, halfHeight ) ) );
 
 1035      if ( mBrush.style() != Qt::NoBrush )
 
 1037      if ( mPen.style() != Qt::NoPen )
 
 1043      if ( mPen.style() != Qt::NoPen )
 
 1046                         << 
QgsPoint( t.map( QPointF( -halfWidth, 0 ) ) )
 
 1047                         << 
QgsPoint( t.map( QPointF( halfWidth, 0 ) ) ),
 
 1048                         layerName, QStringLiteral( 
"CONTINUOUS" ), oc, 
strokeWidth );
 
 1050                         << 
QgsPoint( t.map( QPointF( 0, halfHeight ) ) )
 
 1051                         << 
QgsPoint( t.map( QPointF( 0, -halfHeight ) ) ),
 
 1052                         layerName, QStringLiteral( 
"CONTINUOUS" ), oc, 
strokeWidth );
 
 1061      p << 
QgsPoint( t.map( QPointF( -halfWidth, -halfHeight ) ) )
 
 1062        << 
QgsPoint( t.map( QPointF( halfWidth, -halfHeight ) ) )
 
 1063        << 
QgsPoint( t.map( QPointF( 0, halfHeight ) ) );
 
 1065      if ( mBrush.style() != Qt::NoBrush )
 
 1067      if ( mPen.style() != Qt::NoPen )
 
 1094  const QString cleaned = name.toLower().trimmed();
 
 1096  if ( cleaned == QLatin1String( 
"circle" ) )
 
 1098  else if ( cleaned == QLatin1String( 
"square" ) || cleaned == QLatin1String( 
"rectangle" ) )
 
 1100  else if ( cleaned == QLatin1String( 
"diamond" ) )
 
 1102  else if ( cleaned == QLatin1String( 
"cross" ) )
 
 1104  else if ( cleaned == QLatin1String( 
"arrow" ) )
 
 1106  else if ( cleaned == QLatin1String( 
"half_arc" ) )
 
 1108  else if ( cleaned == QLatin1String( 
"triangle" ) )
 
 1110  else if ( cleaned == QLatin1String( 
"right_half_triangle" ) )
 
 1112  else if ( cleaned == QLatin1String( 
"left_half_triangle" ) )
 
 1114  else if ( cleaned == QLatin1String( 
"semi_circle" ) )
 
 1116  else if ( cleaned == QLatin1String( 
"third_circle" ) )
 
 1118  else if ( cleaned == QLatin1String( 
"quarter_circle" ) )
 
 1120  else if ( cleaned == QLatin1String( 
"pentagon" ) )
 
 1122  else if ( cleaned == QLatin1String( 
"hexagon" ) )
 
 1124  else if ( cleaned == QLatin1String( 
"octagon" ) )
 
 1126  else if ( cleaned == QLatin1String( 
"star" ) )
 
 1127    return Star;  
if ( ok )
 
 1137      return QStringLiteral( 
"circle" );
 
 1139      return QStringLiteral( 
"rectangle" );
 
 1141      return QStringLiteral( 
"diamond" );
 
 1143      return QStringLiteral( 
"cross" );
 
 1145      return QStringLiteral( 
"arrow" );
 
 1147      return QStringLiteral( 
"half_arc" );
 
 1149      return QStringLiteral( 
"triangle" );
 
 1151      return QStringLiteral( 
"right_half_triangle" );
 
 1153      return QStringLiteral( 
"left_half_triangle" );
 
 1155      return QStringLiteral( 
"semi_circle" );
 
 1157      return QStringLiteral( 
"third_circle" );
 
 1159      return QStringLiteral( 
"quarter_circle" );
 
 1161      return QStringLiteral( 
"pentagon" );
 
 1163      return QStringLiteral( 
"hexagon" );
 
 1165      return QStringLiteral( 
"octagon" );
 
 1167      return QStringLiteral( 
"star" );
 
 1174  QList< Shape > shapes;
 
@ DynamicRotation
Rotation of symbol may be changed during rendering and symbol should not be cached.
 
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.
 
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.
 
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.
 
Exports QGIS layers to the DXF format.
 
void writeFilledCircle(const QString &layer, const QColor &color, const QgsPoint &pt, double radius)
Write filled circle (as hatch)
 
void writePolygon(const QgsRingSequence &polygon, const QString &layer, const QString &hatchPattern, const QColor &color)
Draw dxf filled polygon (HATCH)
 
void writePolyline(const QgsPointSequence &line, const QString &layer, const QString &lineStyleName, const QColor &color, double width=-1)
Draw dxf primitives (LWPOLYLINE)
 
A symbol layer for rendering objects with major and minor axis (e.g.
 
void setPenCapStyle(Qt::PenCapStyle style)
Sets the marker's stroke cap style (e.g., flat, round, etc).
 
bool writeDxf(QgsDxfExport &e, double mmMapUnitScaleFactor, const QString &layerName, QgsSymbolRenderContext &context, QPointF shift=QPointF(0.0, 0.0)) const override
write as DXF
 
void setStrokeWidth(double w)
 
void setSymbolHeightMapUnitScale(const QgsMapUnitScale &scale)
 
void setSymbolWidthMapUnitScale(const QgsMapUnitScale &scale)
 
QVariantMap properties() const override
Should be reimplemented by subclasses to return a string map that contains the configuration informat...
 
QRectF bounds(QPointF point, QgsSymbolRenderContext &context) override
Returns the approximate bounding box of the marker symbol layer, taking into account any data defined...
 
void setSymbolWidth(double w)
 
void renderPoint(QPointF point, QgsSymbolRenderContext &context) override
Renders a marker at the specified point.
 
void toSld(QDomDocument &doc, QDomElement &element, const QVariantMap &props) const override
Saves the symbol layer as SLD.
 
double strokeWidth() const
 
void setStrokeColor(const QColor &c) override
Sets the stroke color for the symbol layer.
 
void setStrokeStyle(Qt::PenStyle strokeStyle)
 
QgsUnitTypes::RenderUnit outputUnit() const override
Returns the units to use for sizes and widths within the symbol layer.
 
static QgsEllipseSymbolLayer::Shape decodeShape(const QString &name, bool *ok=nullptr)
Attempts to decode a string representation of a shape name to the corresponding shape.
 
void setSize(double size) override
Sets the symbol size.
 
QgsMapUnitScale mapUnitScale() const override
 
Shape
Marker symbol shapes.
 
@ ThirdCircle
Third Circle (since QGIS 3.28)
 
@ Pentagon
Pentagon (since QGIS 3.28)
 
@ Hexagon
Hexagon (since QGIS 3.28)
 
@ Cross
Stroke-only cross.
 
@ QuarterCircle
Quarter Circle (since QGIS 3.28)
 
@ HalfArc
Stroke-only half arc (since QGIS 3.20)
 
@ Arrow
Stroke-only arrow (since QGIS 3.20)
 
@ RightHalfTriangle
Right half of a triangle.
 
@ Star
Star (since QGIS 3.28)
 
@ Octagon
Octagon (since QGIS 3.28)
 
@ LeftHalfTriangle
Left half of a triangle.
 
QColor fillColor() const override
Returns the fill color for the symbol layer.
 
QgsEllipseSymbolLayer::Shape shape() const
Returns the shape for the rendered ellipse marker symbol.
 
bool usesMapUnits() const override
Returns true if the symbol layer has any components which use map unit based sizes.
 
void setFillColor(const QColor &c) override
Sets the fill color for the symbol layer.
 
void setShape(QgsEllipseSymbolLayer::Shape shape)
Sets the rendered ellipse marker shape.
 
static QList< QgsEllipseSymbolLayer::Shape > availableShapes()
Returns a list of all available shape types.
 
Qt::PenStyle strokeStyle() const
 
static QgsSymbolLayer * create(const QVariantMap &properties=QVariantMap())
Creates the symbol layer.
 
static QgsSymbolLayer * createFromSld(QDomElement &element)
 
static QString encodeShape(QgsEllipseSymbolLayer::Shape shape)
Encodes a shape to its string representation.
 
double symbolWidth() const
 
void setStrokeWidthMapUnitScale(const QgsMapUnitScale &scale)
 
void stopRender(QgsSymbolRenderContext &context) override
Called after a set of rendering operations has finished on the supplied render context.
 
QString layerType() const override
Returns a string that represents this layer type.
 
QColor strokeColor() const override
Returns the stroke color for the symbol layer.
 
void setSymbolWidthUnit(QgsUnitTypes::RenderUnit unit)
Sets the units for the symbol's width.
 
void setPenJoinStyle(Qt::PenJoinStyle style)
Set stroke join style.
 
static bool shapeIsFilled(const QgsEllipseSymbolLayer::Shape &shape)
Returns true if a shape has a fill.
 
void startRender(QgsSymbolRenderContext &context) override
Called before a set of rendering operations commences on the supplied render context.
 
void setStrokeWidthUnit(QgsUnitTypes::RenderUnit unit)
Sets the units for the symbol's stroke width.
 
~QgsEllipseSymbolLayer() override
 
void setMapUnitScale(const QgsMapUnitScale &scale) override
 
double symbolHeight() const
 
void setSymbolHeight(double h)
 
void setSymbolHeightUnit(QgsUnitTypes::RenderUnit unit)
Sets the units for the symbol's height.
 
void writeSldMarker(QDomDocument &doc, QDomElement &element, const QVariantMap &props) const override
Writes the symbol layer definition as a SLD XML element.
 
QgsEllipseSymbolLayer * clone() const override
Shall be reimplemented by subclasses to create a deep copy of the instance.
 
void setOutputUnit(QgsUnitTypes::RenderUnit unit) override
Sets the units to use for sizes and widths within the symbol layer.
 
The feature class encapsulates a single feature including its unique ID, geometry and a list of field...
 
A geometry is the spatial representation of a feature.
 
QgsWkbTypes::GeometryType type
 
Perform transforms between map coordinates and device coordinates.
 
double mapRotation() const
Returns the current map rotation in degrees (clockwise).
 
Struct for storing maximum and minimum scales for measurements in map units.
 
virtual void setSize(double size)
Sets the symbol size.
 
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)
 
HorizontalAnchorPoint
Symbol horizontal anchor points.
 
void setAngle(double angle)
Sets the rotation angle for the marker.
 
QgsUnitTypes::RenderUnit mOffsetUnit
Offset units.
 
void setSizeUnit(QgsUnitTypes::RenderUnit unit)
Sets the units for the symbol's size.
 
void setVerticalAnchorPoint(VerticalAnchorPoint v)
Sets the vertical anchor point for positioning the symbol.
 
void setOutputUnit(QgsUnitTypes::RenderUnit unit) override
Sets the units to use for sizes and widths within the symbol layer.
 
QPointF mOffset
Marker offset.
 
void setHorizontalAnchorPoint(HorizontalAnchorPoint h)
Sets the horizontal anchor point for positioning the symbol.
 
QgsMapUnitScale mapUnitScale() const override
 
void setOffset(QPointF offset)
Sets the marker's offset, which is the horizontal and vertical displacement which the rendered marker...
 
void setSizeMapUnitScale(const QgsMapUnitScale &scale)
Sets the map unit scale for the symbol's size.
 
double size() const
Returns the symbol size.
 
QgsMapUnitScale mOffsetMapUnitScale
Offset map unit scale.
 
HorizontalAnchorPoint mHorizontalAnchorPoint
Horizontal anchor point.
 
static QPointF _rotatedOffset(QPointF offset, double angle)
Adjusts a marker offset to account for rotation.
 
QgsMapUnitScale mSizeMapUnitScale
Marker size map unit scale.
 
VerticalAnchorPoint
Symbol vertical anchor points.
 
void markerOffset(QgsSymbolRenderContext &context, double &offsetX, double &offsetY) const
Calculates the required marker offset, including both the symbol offset and any displacement required...
 
VerticalAnchorPoint mVerticalAnchorPoint
Vertical anchor point.
 
QgsUnitTypes::RenderUnit mSizeUnit
Marker size unit.
 
void setOffsetUnit(QgsUnitTypes::RenderUnit unit)
Sets the units for the symbol's offset.
 
void setOffsetMapUnitScale(const QgsMapUnitScale &scale)
Sets the map unit scale for the symbol's offset.
 
double mAngle
Marker rotation angle, in degrees clockwise from north.
 
QgsUnitTypes::RenderUnit outputUnit() const override
Returns the units to use for sizes and widths within the symbol layer.
 
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
 
Point geometry type, with support for z-dimension and m-values.
 
QgsProperty property(int key) const override
Returns a matching property from the collection, if one exists.
 
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.
 
bool isActive(int key) const override
Returns true if the collection contains an active property with the specified key.
 
A store for object properties.
 
QString asExpression() const
Returns an expression string representing the state of the property, or an empty string if the proper...
 
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...
 
bool isActive() const
Returns whether the property is currently active.
 
QPainter * painter()
Returns the destination QPainter for the render operation.
 
double convertToPainterUnits(double size, QgsUnitTypes::RenderUnit unit, const QgsMapUnitScale &scale=QgsMapUnitScale(), Qgis::RenderSubcomponentProperty property=Qgis::RenderSubcomponentProperty::Generic) const
Converts a size from the specified units to painter units (pixels).
 
QgsExpressionContext & expressionContext()
Gets the expression context.
 
const QgsMapToPixel & mapToPixel() const
Returns the context's map to pixel transform, which transforms between map coordinates and device coo...
 
QColor selectionColor() const
Returns the color to use when rendering selected features.
 
static bool rotationFromSldElement(QDomElement &element, QString &rotationFunc)
 
static QString encodePenStyle(Qt::PenStyle style)
 
static Qt::PenJoinStyle decodePenJoinStyle(const QString &str)
 
static QString encodeMapUnitScale(const QgsMapUnitScale &mapUnitScale)
 
static QColor decodeColor(const QString &str)
 
static double rescaleUom(double size, QgsUnitTypes::RenderUnit unit, const QVariantMap &props)
Rescales the given size based on the uomScale found in the props, if any is found,...
 
static QgsMapUnitScale decodeMapUnitScale(const QString &str)
 
static Qt::PenCapStyle decodePenCapStyle(const QString &str)
 
static QgsUnitTypes::RenderUnit decodeSldUom(const QString &str, double *scaleFactor=nullptr)
Decodes a SLD unit of measure string to a render unit.
 
static QString encodePenCapStyle(Qt::PenCapStyle style)
 
static QDomElement createVendorOptionElement(QDomDocument &doc, const QString &name, const QString &value)
 
static bool wellKnownMarkerFromSld(QDomElement &element, QString &name, QColor &color, QColor &strokeColor, Qt::PenStyle &strokeStyle, double &strokeWidth, double &size)
 
static void createDisplacementElement(QDomDocument &doc, QDomElement &element, QPointF offset)
 
static QString encodeColor(const QColor &color)
 
static void createGeometryElement(QDomDocument &doc, QDomElement &element, const QString &geomFunc)
 
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)
 
static Qt::PenStyle decodePenStyle(const QString &str)
 
static void createRotationElement(QDomDocument &doc, QDomElement &element, const QString &rotationFunc)
 
static QString encodePoint(QPointF point)
Encodes a QPointF to a string.
 
static QString encodePenJoinStyle(Qt::PenJoinStyle style)
 
static QgsStringMap getVendorOptionList(QDomElement &element)
 
static QPointF decodePoint(const QString &string)
Decodes a QSizeF from a string.
 
@ PropertyStrokeStyle
Stroke style (eg solid, dashed)
 
@ PropertyCapStyle
Line cap style.
 
@ PropertyAngle
Symbol angle.
 
@ PropertyJoinStyle
Line join style.
 
@ PropertyStrokeWidth
Stroke width.
 
@ PropertyFillColor
Fill color.
 
@ PropertyHeight
Symbol height.
 
@ PropertyName
Name, eg shape name for simple markers.
 
@ PropertyStrokeColor
Stroke color.
 
@ PropertyWidth
Symbol width.
 
static const bool SELECTION_IS_OPAQUE
Whether styles for selected features ignore symbol alpha.
 
void copyDataDefinedProperties(QgsSymbolLayer *destLayer) const
Copies all data defined properties of this layer to another symbol layer.
 
void restoreOldDataDefinedProperties(const QVariantMap &stringMap)
Restores older data defined properties from string map.
 
virtual void setColor(const QColor &color)
Sets the "representative" color for the symbol layer.
 
virtual QColor color() const
Returns the "representative" color of the symbol layer.
 
void copyPaintEffect(QgsSymbolLayer *destLayer) const
Copies paint effect of this layer to another symbol layer.
 
QgsPropertyCollection mDataDefinedProperties
 
QgsPropertyCollection & dataDefinedProperties()
Returns a reference to the symbol layer's property collection, used for data defined overrides.
 
const QgsFeature * feature() const
Returns the current feature being rendered.
 
bool selected() const
Returns true if symbols should be rendered using the selected symbol coloring and style.
 
Qgis::SymbolRenderHints renderHints() const
Returns the rendering hint flags for the symbol.
 
void setOriginalValueVariable(const QVariant &value)
Sets the original value variable value for data defined symbology.
 
qreal opacity() const
Returns the opacity for the symbol.
 
QgsRenderContext & renderContext()
Returns a reference to the context's render context.
 
static Q_INVOKABLE QString encodeUnit(QgsUnitTypes::DistanceUnit unit)
Encodes a distance unit to a string.
 
static Q_INVOKABLE QgsUnitTypes::RenderUnit decodeRenderUnit(const QString &string, bool *ok=nullptr)
Decodes a render unit from a string.
 
RenderUnit
Rendering size units.
 
@ RenderUnknownUnit
Mixed or unknown units.
 
@ RenderMetersInMapUnits
Meters value as Map units.
 
@ RenderMillimeters
Millimeters.
 
@ RenderMapUnits
Map units.
 
static bool isNull(const QVariant &variant)
Returns true if the specified variant should be considered a NULL value.
 
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)
 
bool qgsDoubleNear(double a, double b, double epsilon=4 *std::numeric_limits< double >::epsilon())
Compare two doubles (but allow some difference)
 
QMap< QString, QString > QgsStringMap
 
QVector< QgsPointSequence > QgsRingSequence
 
QVector< QgsPoint > QgsPointSequence
 
#define QgsDebugMsgLevel(str, level)