29#include <QDomDocument> 
   33  : mStrokeColor( QColor( 35, 35, 35 ) )
 
   36  mPen.setColor( mStrokeColor );
 
   37  mPen.setStyle( mStrokeStyle );
 
   38  mPen.setJoinStyle( mPenJoinStyle );
 
   41  mBrush.setStyle( Qt::SolidPattern );
 
 
   51  if ( 
properties.contains( QStringLiteral( 
"symbol_name" ) ) )
 
   55  if ( 
properties.contains( QStringLiteral( 
"size" ) ) )
 
   59  if ( 
properties.contains( QStringLiteral( 
"size_unit" ) ) )
 
   63  if ( 
properties.contains( QStringLiteral( 
"size_map_unit_scale" ) ) )
 
   67  if ( 
properties.contains( QStringLiteral( 
"symbol_width" ) ) )
 
   71  if ( 
properties.contains( QStringLiteral( 
"symbol_width_unit" ) ) )
 
   75  if ( 
properties.contains( QStringLiteral( 
"symbol_width_map_unit_scale" ) ) )
 
   79  if ( 
properties.contains( QStringLiteral( 
"symbol_height" ) ) )
 
   83  if ( 
properties.contains( QStringLiteral( 
"symbol_height_unit" ) ) )
 
   87  if ( 
properties.contains( QStringLiteral( 
"symbol_height_map_unit_scale" ) ) )
 
   91  if ( 
properties.contains( QStringLiteral( 
"angle" ) ) )
 
   95  if ( 
properties.contains( QStringLiteral( 
"outline_style" ) ) )
 
   99  else if ( 
properties.contains( QStringLiteral( 
"line_style" ) ) )
 
  103  if ( 
properties.contains( QStringLiteral( 
"joinstyle" ) ) )
 
  107  if ( 
properties.contains( QStringLiteral( 
"cap_style" ) ) )
 
  111  if ( 
properties.contains( QStringLiteral( 
"outline_width" ) ) )
 
  115  else if ( 
properties.contains( QStringLiteral( 
"line_width" ) ) )
 
  119  if ( 
properties.contains( QStringLiteral( 
"outline_width_unit" ) ) )
 
  123  else if ( 
properties.contains( QStringLiteral( 
"line_width_unit" ) ) )
 
  127  if ( 
properties.contains( QStringLiteral( 
"outline_width_map_unit_scale" ) ) )
 
  131  if ( 
properties.contains( QStringLiteral( 
"fill_color" ) ) )
 
  136  else if ( 
properties.contains( QStringLiteral( 
"color" ) ) )
 
  140  if ( 
properties.contains( QStringLiteral( 
"outline_color" ) ) )
 
  144  else if ( 
properties.contains( QStringLiteral( 
"line_color" ) ) )
 
  148  if ( 
properties.contains( QStringLiteral( 
"offset" ) ) )
 
  152  if ( 
properties.contains( QStringLiteral( 
"offset_unit" ) ) )
 
  156  if ( 
properties.contains( QStringLiteral( 
"offset_map_unit_scale" ) ) )
 
  160  if ( 
properties.contains( QStringLiteral( 
"horizontal_anchor_point" ) ) )
 
  164  if ( 
properties.contains( QStringLiteral( 
"vertical_anchor_point" ) ) )
 
 
  177  double scaledWidth = mSymbolWidth;
 
  178  double scaledHeight = mSymbolHeight;
 
  180  QColor brushColor = 
mColor;
 
  181  brushColor.setAlphaF( brushColor.alphaF() * context.
opacity() );
 
  182  mBrush.setColor( brushColor );
 
  184  QColor penColor = mStrokeColor;
 
  185  penColor.setAlphaF( penColor.alphaF() * context.
opacity() );
 
  186  mPen.setColor( penColor );
 
  195      double width = exprVal.toDouble( &ok );
 
  199        mPen.setWidthF( width );
 
  200        mSelPen.setWidthF( width );
 
  212      mSelPen.setStyle( mPen.style() );
 
  223      mSelPen.setJoinStyle( mPen.joinStyle() );
 
  242    brushColor.setAlphaF( brushColor.alphaF() * context.
opacity() );
 
  243    mBrush.setColor( brushColor );
 
  250    penColor.setAlphaF( penColor.alphaF() * context.
opacity() );
 
  251    mPen.setColor( penColor );
 
  263    preparePath( 
shape, context, &scaledWidth, &scaledHeight, context.
feature() );
 
  267  bool hasDataDefinedRotation = 
false;
 
  270  calculateOffsetAndRotation( context, scaledWidth, scaledHeight, hasDataDefinedRotation, 
offset, 
angle );
 
  278  QTransform transform;
 
  279  transform.translate( point.x() + 
offset.x(), point.y() + 
offset.y() );
 
  282    transform.rotate( 
angle );
 
  288    p->setPen( useSelectedColor ? mSelPen : mPen );
 
  289    p->setBrush( useSelectedColor ? mSelBrush : mBrush );
 
  293    p->setPen( useSelectedColor ? mSelPen : mPen );
 
  294    p->setBrush( QBrush() );
 
  296  p->drawPath( transform.map( mPainterPath ) );
 
 
  303    bool &hasDataDefinedRotation,
 
  305    double &angle )
 const 
  309  markerOffset( context, scaledWidth, scaledHeight, mSymbolWidthUnit, mSymbolHeightUnit, offsetX, offsetY, mSymbolWidthMapUnitScale, mSymbolHeightMapUnitScale );
 
  310  offset = QPointF( offsetX, offsetY );
 
  313  const bool ok = 
true;
 
  315  bool usingDataDefinedRotation = 
false;
 
  320    usingDataDefinedRotation = ok;
 
  324  if ( hasDataDefinedRotation )
 
  349  return QStringLiteral( 
"EllipseMarker" );
 
 
  362    preparePath( mShape, context );
 
  364  mPen.setColor( mStrokeColor );
 
  365  mPen.setStyle( mStrokeStyle );
 
  366  mPen.setJoinStyle( mPenJoinStyle );
 
  367  mPen.setCapStyle( mPenCapStyle );
 
  369  mBrush.setColor( 
mColor );
 
  372  QColor selPenColor = selBrushColor == 
mColor ? selBrushColor : mStrokeColor;
 
  375    selBrushColor.setAlphaF( context.
opacity() );
 
  376    selPenColor.setAlphaF( context.
opacity() );
 
  378  mSelBrush = QBrush( selBrushColor );
 
  379  mSelPen = QPen( !
shapeIsFilled( mShape ) ? selBrushColor : selPenColor );
 
  380  mSelPen.setStyle( mStrokeStyle );
 
 
  425  toSld( doc, element, context );
 
 
  430  QDomElement symbolizerElem = doc.createElement( QStringLiteral( 
"se:PointSymbolizer" ) );
 
  432  if ( !props.value( QStringLiteral( 
"uom" ), QString() ).toString().isEmpty() )
 
  433    symbolizerElem.setAttribute( QStringLiteral( 
"uom" ), props.value( QStringLiteral( 
"uom" ), QString() ).toString() );
 
  434  element.appendChild( symbolizerElem );
 
 
  452  QDomElement graphicElem = doc.createElement( QStringLiteral( 
"se:Graphic" ) );
 
  453  element.appendChild( graphicElem );
 
  463  QString angleFunc = props.
value( QStringLiteral( 
"angle" ), QString() ).toString();
 
  464  if ( angleFunc.isEmpty() )  
 
  466    if ( ddRotation && ddRotation.
isActive() )
 
  471      angleFunc = QString::number( 
mAngle );
 
  473  else if ( ddRotation && ddRotation.
isActive() )
 
  477    angleFunc = QStringLiteral( 
"%1 + %2" ).arg( angleFunc, ddRotation.
asExpression() );
 
  483    const double angle = angleFunc.toDouble( &ok );
 
  487      angleFunc = QStringLiteral( 
"%1 + %2" ).arg( angleFunc ).arg( 
mAngle );
 
  502  const double widthHeightFactor = mSymbolWidth / mSymbolHeight;
 
  504  graphicElem.appendChild( factorElem );
 
 
  512  QDomElement graphicElem = element.firstChildElement( QStringLiteral( 
"Graphic" ) );
 
  513  if ( graphicElem.isNull() )
 
  516  QString name = QStringLiteral( 
"circle" );
 
  519  double widthHeightFactor = 1.0;
 
  523  for ( QgsStringMap::iterator it = vendorOptions.begin(); it != vendorOptions.end(); ++it )
 
  525    if ( it.key() == QLatin1String( 
"widthHeightFactor" ) )
 
  528      const double v = it.value().toDouble( &ok );
 
  530        widthHeightFactor = v;
 
  537  double scaleFactor = 1.0;
 
  538  const QString uom = element.attribute( QStringLiteral( 
"uom" ) );
 
  548    const double d = angleFunc.toDouble( &ok );
 
 
  569  map[QStringLiteral( 
"symbol_name" )] = 
encodeShape( mShape );
 
  570  map[QStringLiteral( 
"symbol_width" )] = QString::number( mSymbolWidth );
 
  573  map[QStringLiteral( 
"symbol_height" )] = QString::number( mSymbolHeight );
 
  576  map[QStringLiteral( 
"angle" )] = QString::number( 
mAngle );
 
  578  map[QStringLiteral( 
"outline_width" )] = QString::number( mStrokeWidth );
 
  588  map[QStringLiteral( 
"size" )] = QString::number( 
mSize );
 
  591  map[QStringLiteral( 
"horizontal_anchor_point" )] = QString::number( 
static_cast< int >( 
mHorizontalAnchorPoint ) );
 
  592  map[QStringLiteral( 
"vertical_anchor_point" )] = QString::number( 
static_cast< int >( 
mVerticalAnchorPoint ) );
 
 
  596QSizeF QgsEllipseSymbolLayer::calculateSize( 
QgsSymbolRenderContext &context, 
double *scaledWidth, 
double *scaledHeight )
 
  607    width = mSymbolWidth;
 
  611    *scaledWidth = width;
 
  623    height = mSymbolHeight;
 
  627    *scaledHeight = height;
 
  630  return QSizeF( width, height );
 
  635  mPainterPath = QPainterPath();
 
  637  const QSizeF 
size = calculateSize( context, scaledWidth, scaledHeight );
 
  642      mPainterPath.addEllipse( QRectF( -
size.width() / 2.0, -
size.height() / 2.0, 
size.width(), 
size.height() ) );
 
  646      mPainterPath.arcTo( -
size.width() / 2.0, -
size.height() / 2.0, 
size.width(), 
size.height(), 0, 180 );
 
  647      mPainterPath.lineTo( 0, 0 );
 
  651      mPainterPath.arcTo( -
size.width() / 2.0, -
size.height() / 2.0, 
size.width(), 
size.height(), 90, 120 );
 
  652      mPainterPath.lineTo( 0, 0 );
 
  656      mPainterPath.arcTo( -
size.width() / 2.0, -
size.height() / 2.0, 
size.width(), 
size.height(), 90, 90 );
 
  657      mPainterPath.lineTo( 0, 0 );
 
  661      mPainterPath.addRect( QRectF( -
size.width() / 2.0, -
size.height() / 2.0, 
size.width(), 
size.height() ) );
 
  665      mPainterPath.moveTo( -
size.width() / 2.0, 0 );
 
  666      mPainterPath.lineTo( 0, 
size.height() / 2.0 );
 
  667      mPainterPath.lineTo( 
size.width() / 2.0, 0 );
 
  668      mPainterPath.lineTo( 0, -
size.height() / 2.0 );
 
  669      mPainterPath.lineTo( -
size.width() / 2.0, 0 );
 
  673      mPainterPath.moveTo( 0, -
size.height() / 2.0 );
 
  674      mPainterPath.lineTo( 0, 
size.height() / 2.0 );
 
  675      mPainterPath.moveTo( -
size.width() / 2.0, 0 );
 
  676      mPainterPath.lineTo( 
size.width() / 2.0, 0 );
 
  680      mPainterPath.moveTo( -
size.width() / 2.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() / 2.0, 0 );
 
  687      mPainterPath.arcTo( -
size.width() / 2.0, -
size.height() / 2.0, 
size.width(), 
size.height(), 0, 180 );
 
  691      mPainterPath.moveTo( 0, -
size.height() / 2.0 );
 
  692      mPainterPath.lineTo( -
size.width() / 2.0, 
size.height() / 2.0 );
 
  693      mPainterPath.lineTo( 
size.width() / 2.0, 
size.height() / 2.0 );
 
  694      mPainterPath.lineTo( 0, -
size.height() / 2.0 );
 
  698      mPainterPath.moveTo( 0, 
size.height() / 2.0 );
 
  699      mPainterPath.lineTo( 
size.width() / 2.0, 
size.height() / 2.0 );
 
  700      mPainterPath.lineTo( 0, -
size.height() / 2.0 );
 
  701      mPainterPath.lineTo( 0, 
size.height() / 2.0 );
 
  705      mPainterPath.moveTo( -
size.width() / 2.0, 
size.height() / 2.0 );
 
  706      mPainterPath.lineTo( 0, 
size.height() / 2.0 );
 
  707      mPainterPath.lineTo( 0, -
size.height() / 2.0 );
 
  708      mPainterPath.lineTo( -
size.width() / 2.0, 
size.height() / 2.0 );
 
  712      mPainterPath.moveTo( ( 
size.width() * -0.9511 ) / 2.0, 
size.height() / ( 2 / -0.309 ) );
 
  713      mPainterPath.lineTo( ( 
size.width() * -0.5878 ) / 2.0, 
size.height() / ( 2 / 0.8090 ) );
 
  714      mPainterPath.lineTo( ( 
size.width() * 0.5878 ) / 2.0, 
size.height() / ( 2 / 0.8090 ) );
 
  715      mPainterPath.lineTo( ( 
size.width() * 0.9511 ) / 2.0, 
size.height() / ( 2 / -0.309 ) );
 
  716      mPainterPath.lineTo( 0, 
size.height() / -2.0 );
 
  717      mPainterPath.lineTo( ( 
size.width() * -0.9511 ) / 2.0, 
size.height() / ( 2 / -0.309 ) );
 
  721      mPainterPath.moveTo( ( 
size.width() * 0.8660 ) / 2.0, 
size.height() / 4.0 );
 
  722      mPainterPath.lineTo( ( 
size.width() * 0.8660 ) / 2.0, 
size.height() / -4.0 );
 
  723      mPainterPath.lineTo( 0, 
size.height() / -2.0 );
 
  724      mPainterPath.lineTo( ( 
size.width() * 0.8660 ) / -2.0, 
size.height() / -4.0 );
 
  725      mPainterPath.lineTo( ( 
size.width() * 0.8660 ) / -2.0, 
size.height() / 4.0 );
 
  726      mPainterPath.lineTo( 0, 
size.height() / 2.0 );
 
  727      mPainterPath.lineTo( ( 
size.width() * 0.8660 ) / 2.0, 
size.height() / 4.0 );
 
  732      static constexpr double VERTEX_OFFSET_FROM_ORIGIN = 1.0 / ( 1 + M_SQRT2 );
 
  733      mPainterPath.moveTo( ( 
size.width() * VERTEX_OFFSET_FROM_ORIGIN ) / -2.0, 
size.height() / 2.0 );
 
  734      mPainterPath.lineTo( ( 
size.width() * VERTEX_OFFSET_FROM_ORIGIN ) / 2.0, 
size.height() / 2.0 );
 
  735      mPainterPath.lineTo( 
size.width() / 2.0, ( 
size.height() * VERTEX_OFFSET_FROM_ORIGIN ) / 2.0 );
 
  736      mPainterPath.lineTo( 
size.width() / 2.0, ( 
size.height() * VERTEX_OFFSET_FROM_ORIGIN ) / -2.0 );
 
  737      mPainterPath.lineTo( ( 
size.width() * VERTEX_OFFSET_FROM_ORIGIN ) / 2.0, 
size.height() / -2.0 );
 
  738      mPainterPath.lineTo( ( 
size.width() * VERTEX_OFFSET_FROM_ORIGIN ) / -2.0, 
size.height() / -2.0 );
 
  739      mPainterPath.lineTo( 
size.width() / -2.0, ( 
size.height() * VERTEX_OFFSET_FROM_ORIGIN ) / -2.0 );
 
  740      mPainterPath.lineTo( 
size.width() / -2.0, ( 
size.height() * VERTEX_OFFSET_FROM_ORIGIN ) / 2.0 );
 
  741      mPainterPath.lineTo( ( 
size.width() * VERTEX_OFFSET_FROM_ORIGIN ) / -2.0, 
size.height() / 2.0 );
 
  747      const double inner_r = std::cos( 
DEG2RAD( 72.0 ) ) / std::cos( 
DEG2RAD( 36.0 ) );
 
  748      mPainterPath.moveTo( ( 
size.width() * inner_r * std::sin( 
DEG2RAD( 324.0 ) ) ) / 2.0, ( 
size.height() * inner_r * std::cos( 
DEG2RAD( 324.0 ) ) ) / -2.0 );
 
  749      mPainterPath.lineTo( ( 
size.width() * std::sin( 
DEG2RAD( 288.0 ) ) ) / 2.0, ( 
size.height() * std::cos( 
DEG2RAD( 288.0 ) ) ) / -2.0 );
 
  750      mPainterPath.lineTo( ( 
size.width() * inner_r * std::sin( 
DEG2RAD( 252.0 ) ) ) / 2.0, ( 
size.height() * inner_r * std::cos( 
DEG2RAD( 252.0 ) ) ) / -2.0 );
 
  751      mPainterPath.lineTo( ( 
size.width() * std::sin( 
DEG2RAD( 216.0 ) ) ) / 2.0, ( 
size.height() * std::cos( 
DEG2RAD( 216.0 ) ) ) / -2.0 );
 
  752      mPainterPath.lineTo( 0, ( 
size.height() * inner_r ) / 2.0 );
 
  753      mPainterPath.lineTo( ( 
size.width() * std::sin( 
DEG2RAD( 144.0 ) ) ) / 2.0, ( 
size.height() * std::cos( 
DEG2RAD( 144.0 ) ) ) / -2.0 );
 
  754      mPainterPath.lineTo( ( 
size.width() * inner_r * std::sin( 
DEG2RAD( 108.0 ) ) ) / 2.0, ( 
size.height() * inner_r * std::cos( 
DEG2RAD( 108.0 ) ) ) / -2.0 );
 
  755      mPainterPath.lineTo( ( 
size.width() * std::sin( 
DEG2RAD( 72.0 ) ) ) / 2.0, ( 
size.height() * std::cos( 
DEG2RAD( 72.0 ) ) ) / -2.0 );
 
  756      mPainterPath.lineTo( ( 
size.width() * inner_r * std::sin( 
DEG2RAD( 36.0 ) ) ) / 2.0, ( 
size.height() * inner_r * std::cos( 
DEG2RAD( 36.0 ) ) ) / -2.0 );
 
  757      mPainterPath.lineTo( 0, 
size.height() / -2.0 );
 
  758      mPainterPath.lineTo( ( 
size.width() * inner_r * std::sin( 
DEG2RAD( 324.0 ) ) ) / 2.0, ( 
size.height() * inner_r * std::cos( 
DEG2RAD( 324.0 ) ) ) / -2.0 );
 
  794  if ( mSymbolWidth >= mSymbolHeight )
 
  796    mSymbolHeight = mSymbolHeight * 
size / mSymbolWidth;
 
  801    mSymbolWidth = mSymbolWidth * 
size / mSymbolHeight;
 
  802    mSymbolHeight = 
size;
 
 
  822  mSymbolWidthUnit = unit;
 
  823  mSymbolHeightUnit = unit;
 
  824  mStrokeWidthUnit = unit;
 
 
  830  if ( mSymbolWidthUnit != unit || mSymbolHeightUnit != unit || mStrokeWidthUnit != unit )
 
 
  848  mSymbolWidthMapUnitScale = scale;
 
  849  mSymbolHeightMapUnitScale = scale;
 
  850  mStrokeWidthMapUnitScale = scale;
 
 
  856       mSymbolWidthMapUnitScale == mSymbolHeightMapUnitScale &&
 
  857       mSymbolHeightMapUnitScale == mStrokeWidthMapUnitScale )
 
  859    return mSymbolWidthMapUnitScale;
 
 
  866  const QSizeF 
size = calculateSize( context );
 
  868  bool hasDataDefinedRotation = 
false;
 
  871  calculateOffsetAndRotation( context, 
size.width(), 
size.height(), hasDataDefinedRotation, 
offset, 
angle );
 
  873  QTransform transform;
 
  876  transform.translate( point.x() + 
offset.x(), point.y() + 
offset.y() );
 
  879    transform.rotate( 
angle );
 
  881  double penWidth = mStrokeWidth;
 
  890      const double strokeWidth = exprVal.toDouble( &ok );
 
  908  else if ( mStrokeStyle == Qt::NoPen )
 
  914  QRectF symbolBounds = transform.mapRect( QRectF( -
size.width() / 2.0,
 
  915                        -
size.height() / 2.0,
 
  920  symbolBounds.adjust( -penWidth / 2.0, -penWidth / 2.0,
 
  921                       penWidth / 2.0, penWidth / 2.0 );
 
 
  975  QColor oc = mStrokeColor;
 
  994  QPointF off( offsetX, offsetY );
 
  997  double rotation = 0.0;
 
 1007  rotation = -rotation; 
 
 1012  t.translate( shift.x() + offsetX, shift.y() + offsetY );
 
 1015    t.rotate( rotation );
 
 1026        const QgsPoint pt( t.map( QPointF( 0, 0 ) ) );
 
 1033        const double stepsize = 2 * M_PI / 40;
 
 1034        for ( 
int i = 0; i < 39; ++i )
 
 1036          const double angle = stepsize * i;
 
 1037          const double x = halfWidth * std::cos( 
angle );
 
 1038          const double y = halfHeight * std::sin( 
angle );
 
 1039          line << 
QgsPoint( t.map( QPointF( x, y ) ) );
 
 1042        line << line.at( 0 );
 
 1044        if ( mBrush.style() != Qt::NoBrush )
 
 1046        if ( mPen.style() != Qt::NoPen )
 
 1055      p << 
QgsPoint( t.map( QPointF( -halfWidth, -halfHeight ) ) )
 
 1056        << 
QgsPoint( t.map( QPointF( halfWidth, -halfHeight ) ) )
 
 1057        << 
QgsPoint( t.map( QPointF( halfWidth, halfHeight ) ) )
 
 1058        << 
QgsPoint( t.map( QPointF( -halfWidth, halfHeight ) ) );
 
 1061      if ( mBrush.style() != Qt::NoBrush )
 
 1063      if ( mPen.style() != Qt::NoPen )
 
 1069      if ( mPen.style() != Qt::NoPen )
 
 1072                         << 
QgsPoint( t.map( QPointF( -halfWidth, 0 ) ) )
 
 1073                         << 
QgsPoint( t.map( QPointF( halfWidth, 0 ) ) ),
 
 1074                         layerName, QStringLiteral( 
"CONTINUOUS" ), oc, 
strokeWidth );
 
 1076                         << 
QgsPoint( t.map( QPointF( 0, halfHeight ) ) )
 
 1077                         << 
QgsPoint( t.map( QPointF( 0, -halfHeight ) ) ),
 
 1078                         layerName, QStringLiteral( 
"CONTINUOUS" ), oc, 
strokeWidth );
 
 1087      p << 
QgsPoint( t.map( QPointF( -halfWidth, -halfHeight ) ) )
 
 1088        << 
QgsPoint( t.map( QPointF( halfWidth, -halfHeight ) ) )
 
 1089        << 
QgsPoint( t.map( QPointF( 0, halfHeight ) ) );
 
 1091      if ( mBrush.style() != Qt::NoBrush )
 
 1093      if ( mPen.style() != Qt::NoPen )
 
 
 1120  const QString cleaned = name.toLower().trimmed();
 
 1122  if ( cleaned == QLatin1String( 
"circle" ) )
 
 1124  else if ( cleaned == QLatin1String( 
"square" ) || cleaned == QLatin1String( 
"rectangle" ) )
 
 1126  else if ( cleaned == QLatin1String( 
"diamond" ) )
 
 1128  else if ( cleaned == QLatin1String( 
"cross" ) )
 
 1130  else if ( cleaned == QLatin1String( 
"arrow" ) )
 
 1132  else if ( cleaned == QLatin1String( 
"half_arc" ) )
 
 1134  else if ( cleaned == QLatin1String( 
"triangle" ) )
 
 1136  else if ( cleaned == QLatin1String( 
"right_half_triangle" ) )
 
 1138  else if ( cleaned == QLatin1String( 
"left_half_triangle" ) )
 
 1140  else if ( cleaned == QLatin1String( 
"semi_circle" ) )
 
 1142  else if ( cleaned == QLatin1String( 
"third_circle" ) )
 
 1144  else if ( cleaned == QLatin1String( 
"quarter_circle" ) )
 
 1146  else if ( cleaned == QLatin1String( 
"pentagon" ) )
 
 1148  else if ( cleaned == QLatin1String( 
"hexagon" ) )
 
 1150  else if ( cleaned == QLatin1String( 
"octagon" ) )
 
 1152  else if ( cleaned == QLatin1String( 
"star" ) )
 
 1153    return Star;  
if ( ok )
 
 
 1163      return QStringLiteral( 
"circle" );
 
 1165      return QStringLiteral( 
"rectangle" );
 
 1167      return QStringLiteral( 
"diamond" );
 
 1169      return QStringLiteral( 
"cross" );
 
 1171      return QStringLiteral( 
"arrow" );
 
 1173      return QStringLiteral( 
"half_arc" );
 
 1175      return QStringLiteral( 
"triangle" );
 
 1177      return QStringLiteral( 
"right_half_triangle" );
 
 1179      return QStringLiteral( 
"left_half_triangle" );
 
 1181      return QStringLiteral( 
"semi_circle" );
 
 1183      return QStringLiteral( 
"third_circle" );
 
 1185      return QStringLiteral( 
"quarter_circle" );
 
 1187      return QStringLiteral( 
"pentagon" );
 
 1189      return QStringLiteral( 
"hexagon" );
 
 1191      return QStringLiteral( 
"octagon" );
 
 1193      return QStringLiteral( 
"star" );
 
 
 1200  QList< Shape > shapes;
 
 
@ DynamicRotation
Rotation of symbol may be changed during rendering and symbol should not be cached.
 
@ CanCalculateMaskGeometryPerFeature
If present, indicates that mask geometry can safely be calculated per feature for the symbol layer....
 
QFlags< SymbolLayerFlag > SymbolLayerFlags
Symbol layer flags.
 
VerticalAnchorPoint
Marker symbol vertical anchor points.
 
RenderUnit
Rendering size units.
 
@ Millimeters
Millimeters.
 
@ Unknown
Mixed or unknown units.
 
@ MetersInMapUnits
Meters value as Map units.
 
HorizontalAnchorPoint
Marker symbol horizontal anchor points.
 
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.
 
static QColor colorFromString(const QString &string)
Decodes a string into a color value.
 
static QString colorToString(const QColor &color)
Encodes a color into a string value.
 
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...
 
Qgis::RenderUnit outputUnit() const override
Returns the units to use for sizes and widths within the symbol layer.
 
void setSymbolWidth(double w)
 
void renderPoint(QPointF point, QgsSymbolRenderContext &context) override
Renders a marker at the specified point.
 
double strokeWidth() const
 
void setStrokeColor(const QColor &c) override
Sets the stroke color for the symbol layer.
 
void setStrokeStyle(Qt::PenStyle strokeStyle)
 
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 setStrokeWidthUnit(Qgis::RenderUnit unit)
Sets the units for the symbol's stroke width.
 
void setSize(double size) override
Sets the symbol size.
 
QgsMapUnitScale mapUnitScale() const override
 
Shape
Marker symbol shapes.
 
@ ThirdCircle
Third Circle.
 
@ Cross
Stroke-only cross.
 
@ QuarterCircle
Quarter Circle.
 
@ HalfArc
Stroke-only half arc.
 
@ Arrow
Stroke-only arrow.
 
@ RightHalfTriangle
Right half of a triangle.
 
@ 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)
 
Qgis::SymbolLayerFlags flags() const override
Returns flags which control the symbol layer's behavior.
 
void setOutputUnit(Qgis::RenderUnit unit) override
Sets the units to use for sizes and widths within the symbol layer.
 
Q_DECL_DEPRECATED void toSld(QDomDocument &doc, QDomElement &element, const QVariantMap &props=QVariantMap()) const override
Saves the symbol layer as SLD.
 
static QString encodeShape(QgsEllipseSymbolLayer::Shape shape)
Encodes a shape to its string representation.
 
double symbolWidth() const
 
void setStrokeWidthMapUnitScale(const QgsMapUnitScale &scale)
 
void setSymbolHeightUnit(Qgis::RenderUnit unit)
Sets the units for the symbol's height.
 
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 setPenJoinStyle(Qt::PenJoinStyle style)
Set stroke join style.
 
static bool shapeIsFilled(const QgsEllipseSymbolLayer::Shape &shape)
Returns true if a shape has a fill.
 
void setSymbolWidthUnit(Qgis::RenderUnit unit)
Sets the units for the symbol's width.
 
void startRender(QgsSymbolRenderContext &context) override
Called before a set of rendering operations commences on the supplied render context.
 
~QgsEllipseSymbolLayer() override
 
void setMapUnitScale(const QgsMapUnitScale &scale) override
 
double symbolHeight() const
 
void setSymbolHeight(double h)
 
Q_DECL_DEPRECATED 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.
 
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.
 
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.
 
void setVerticalAnchorPoint(Qgis::VerticalAnchorPoint v)
Sets the vertical anchor point for positioning the symbol.
 
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)
 
void setOffsetUnit(Qgis::RenderUnit unit)
Sets the units for the symbol's offset.
 
void setAngle(double angle)
Sets the rotation angle for the marker.
 
Qgis::RenderUnit outputUnit() const override
Returns the units to use for sizes and widths within the symbol layer.
 
QPointF mOffset
Marker offset.
 
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.
 
Qgis::VerticalAnchorPoint mVerticalAnchorPoint
Vertical anchor point.
 
static QPointF _rotatedOffset(QPointF offset, double angle)
Adjusts a marker offset to account for rotation.
 
void setHorizontalAnchorPoint(Qgis::HorizontalAnchorPoint h)
Sets the horizontal anchor point for positioning the symbol.
 
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.
 
void setSizeUnit(Qgis::RenderUnit unit)
Sets the units for the symbol's size.
 
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.
 
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.
 
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.
 
QVariant value(int key, const QgsExpressionContext &context, const QVariant &defaultValue=QVariant()) const final
Returns the calculated value of the property with the specified key from within the collection.
 
bool isActive(int key) const final
Returns true if the collection contains an active property with the specified key.
 
QgsProperty property(int key) const final
Returns a matching property from the collection, if one exists.
 
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.
 
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.
 
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.
 
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.
 
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 QgsMapUnitScale decodeMapUnitScale(const QString &str)
 
static double rescaleUom(double size, Qgis::RenderUnit unit, const QVariantMap &props)
Rescales the given size based on the uomScale found in the props, if any is found,...
 
static Qt::PenCapStyle decodePenCapStyle(const QString &str)
 
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)
Extracts properties from an SLD marker definition.
 
static void createDisplacementElement(QDomDocument &doc, QDomElement &element, QPointF offset)
 
static QString encodeColor(const QColor &color)
 
static Qgis::RenderUnit decodeSldUom(const QString &str, double *scaleFactor=nullptr)
Decodes a SLD unit of measure string to a render unit.
 
static Q_DECL_DEPRECATED void createGeometryElement(QDomDocument &doc, QDomElement &element, const QString &geomFunc)
Creates an SLD geometry element.
 
static Q_DECL_DEPRECATED void wellKnownMarkerToSld(QDomDocument &doc, QDomElement &element, const QString &name, const QColor &color, const QColor &strokeColor, Qt::PenStyle strokeStyle, double strokeWidth=-1, double size=-1)
Exports a marker to SLD.
 
static Qt::PenStyle decodePenStyle(const QString &str)
 
static Q_DECL_DEPRECATED void createRotationElement(QDomDocument &doc, QDomElement &element, const QString &rotationFunc)
Creates SLD rotation element.
 
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.
 
Abstract base class for symbol layers.
 
bool shouldRenderUsingSelectionColor(const QgsSymbolRenderContext &context) const
Returns true if the symbol layer should be rendered using the selection color from the render context...
 
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.
 
@ StrokeStyle
Stroke style (eg solid, dashed)
 
@ Name
Name, eg shape name for simple markers.
 
@ StrokeColor
Stroke color.
 
@ CapStyle
Line cap style.
 
@ JoinStyle
Line join style.
 
@ StrokeWidth
Stroke width.
 
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.
 
virtual Qgis::SymbolLayerFlags flags() const
Returns flags which control the symbol layer's behavior.
 
QgsPropertyCollection mDataDefinedProperties
 
QgsPropertyCollection & dataDefinedProperties()
Returns a reference to the symbol layer's property collection, used for data defined overrides.
 
Encapsulates the context in which a symbol is being rendered.
 
const QgsFeature * feature() const
Returns the current feature being rendered.
 
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 Qgis::RenderUnit decodeRenderUnit(const QString &string, bool *ok=nullptr)
Decodes a render unit from a string.
 
static Q_INVOKABLE QString encodeUnit(Qgis::DistanceUnit unit)
Encodes a distance unit to a string.
 
static bool isNull(const QVariant &variant, bool silenceNullWarnings=false)
Returns true if the specified variant should be considered a NULL value.
 
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)