30 #include <QDomDocument> 31 #include <QDomElement> 36 : mPenStyle( penStyle )
40 mCustomDashVector << 5 << 2;
48 mCustomDashPatternUnit = unit;
66 mCustomDashPatternMapUnitScale = scale;
86 if ( props.contains( QStringLiteral(
"line_color" ) ) )
90 else if ( props.contains( QStringLiteral(
"outline_color" ) ) )
94 else if ( props.contains( QStringLiteral(
"color" ) ) )
99 if ( props.contains( QStringLiteral(
"line_width" ) ) )
101 width = props[QStringLiteral(
"line_width" )].toDouble();
103 else if ( props.contains( QStringLiteral(
"outline_width" ) ) )
105 width = props[QStringLiteral(
"outline_width" )].toDouble();
107 else if ( props.contains( QStringLiteral(
"width" ) ) )
110 width = props[QStringLiteral(
"width" )].toDouble();
112 if ( props.contains( QStringLiteral(
"line_style" ) ) )
116 else if ( props.contains( QStringLiteral(
"outline_style" ) ) )
120 else if ( props.contains( QStringLiteral(
"penstyle" ) ) )
126 if ( props.contains( QStringLiteral(
"line_width_unit" ) ) )
130 else if ( props.contains( QStringLiteral(
"outline_width_unit" ) ) )
134 else if ( props.contains( QStringLiteral(
"width_unit" ) ) )
139 if ( props.contains( QStringLiteral(
"width_map_unit_scale" ) ) )
141 if ( props.contains( QStringLiteral(
"offset" ) ) )
142 l->
setOffset( props[QStringLiteral(
"offset" )].toDouble() );
143 if ( props.contains( QStringLiteral(
"offset_unit" ) ) )
145 if ( props.contains( QStringLiteral(
"offset_map_unit_scale" ) ) )
147 if ( props.contains( QStringLiteral(
"joinstyle" ) ) )
149 if ( props.contains( QStringLiteral(
"capstyle" ) ) )
152 if ( props.contains( QStringLiteral(
"use_custom_dash" ) ) )
156 if ( props.contains( QStringLiteral(
"customdash" ) ) )
160 if ( props.contains( QStringLiteral(
"customdash_unit" ) ) )
164 if ( props.contains( QStringLiteral(
"customdash_map_unit_scale" ) ) )
169 if ( props.contains( QStringLiteral(
"draw_inside_polygon" ) ) )
174 if ( props.contains( QStringLiteral(
"ring_filter" ) ) )
176 l->
setRingFilter( static_cast< RenderRingFilter>( props[QStringLiteral(
"ring_filter" )].toInt() ) );
187 return QStringLiteral(
"SimpleLine" );
194 mPen.setColor( penColor );
196 mPen.setWidthF( scaledWidth );
197 if ( mUseCustomDashPattern )
199 mPen.setStyle( Qt::CustomDashLine );
202 double dashWidthDiv =
qgsDoubleNear( scaledWidth, 0 ) ? 1.0 : scaledWidth;
205 QStringList versionSplit = QString( qVersion() ).split(
'.' );
206 if ( versionSplit.size() > 1
207 && versionSplit.at( 1 ).toInt() >= 8
208 && scaledWidth < 1.0 )
212 QVector<qreal> scaledVector;
213 QVector<qreal>::const_iterator it = mCustomDashVector.constBegin();
214 for ( ; it != mCustomDashVector.constEnd(); ++it )
219 mPen.setDashPattern( scaledVector );
223 mPen.setStyle( mPenStyle );
225 mPen.setJoinStyle( mPenJoinStyle );
226 mPen.setCapStyle( mPenCapStyle );
231 selColor.setAlphaF( context.
opacity() );
232 mSelPen.setColor( selColor );
248 if ( mDrawInsidePolygon )
256 if ( mDrawInsidePolygon )
259 QPainterPath clipPath;
260 clipPath.addPolygon( points );
265 QList<QPolygonF>::const_iterator it = rings->constBegin();
266 for ( ; it != rings->constEnd(); ++it )
268 QPolygonF ring = *it;
269 clipPath.addPolygon( ring );
274 p->setClipPath( clipPath, Qt::IntersectClip );
293 for (
const QPolygonF &ring : qgis::as_const( *rings ) )
303 if ( mDrawInsidePolygon )
320 applyDataDefinedSymbology( context, mPen, mSelPen, offset );
322 p->setPen( context.
selected() ? mSelPen : mPen );
323 p->setBrush( Qt::NoBrush );
326 if ( points.size() <= 2 &&
329 ( p->renderHints() & QPainter::Antialiasing ) )
331 p->setRenderHint( QPainter::Antialiasing,
false );
333 p->drawPolyline( points );
336 path.addPolygon( points );
339 p->setRenderHint( QPainter::Antialiasing,
true );
346 p->drawPolyline( points );
349 path.addPolygon( points );
357 for (
int part = 0; part < mline.count(); ++part )
360 p->drawPolyline( mline );
363 path.addPolygon( mline[ part ] );
374 map[QStringLiteral(
"line_width" )] = QString::number(
mWidth );
380 map[QStringLiteral(
"offset" )] = QString::number(
mOffset );
383 map[QStringLiteral(
"use_custom_dash" )] = ( mUseCustomDashPattern ? QStringLiteral(
"1" ) : QStringLiteral(
"0" ) );
387 map[QStringLiteral(
"draw_inside_polygon" )] = ( mDrawInsidePolygon ? QStringLiteral(
"1" ) : QStringLiteral(
"0" ) );
388 map[QStringLiteral(
"ring_filter" )] = QString::number( static_cast< int >(
mRingFilter ) );
415 if ( mPenStyle == Qt::NoPen )
418 QDomElement symbolizerElem = doc.createElement( QStringLiteral(
"se:LineSymbolizer" ) );
419 if ( !props.value( QStringLiteral(
"uom" ), QString() ).isEmpty() )
420 symbolizerElem.setAttribute( QStringLiteral(
"uom" ), props.value( QStringLiteral(
"uom" ), QString() ) );
421 element.appendChild( symbolizerElem );
427 QDomElement strokeElem = doc.createElement( QStringLiteral(
"se:Stroke" ) );
428 symbolizerElem.appendChild( strokeElem );
430 Qt::PenStyle
penStyle = mUseCustomDashPattern ? Qt::CustomDashLine : mPenStyle;
434 &mPenJoinStyle, &mPenCapStyle, &customDashVector );
439 QDomElement perpOffsetElem = doc.createElement( QStringLiteral(
"se:PerpendicularOffset" ) );
442 symbolizerElem.appendChild( perpOffsetElem );
448 if ( mUseCustomDashPattern )
451 mPen.color(), mPenJoinStyle,
452 mPenCapStyle,
mOffset, &mCustomDashVector );
465 QDomElement strokeElem = element.firstChildElement( QStringLiteral(
"Stroke" ) );
466 if ( strokeElem.isNull() )
478 &penJoinStyle, &penCapStyle,
479 &customDashVector ) )
483 QDomElement perpOffsetElem = element.firstChildElement( QStringLiteral(
"PerpendicularOffset" ) );
484 if ( !perpOffsetElem.isNull() )
487 double d = perpOffsetElem.firstChild().nodeValue().toDouble( &ok );
492 QString uom = element.attribute( QStringLiteral(
"uom" ) );
512 bool hasStrokeWidthExpression =
false;
519 pen.setWidthF( scaledWidth );
520 selPen.setWidthF( scaledWidth );
521 hasStrokeWidthExpression =
true;
542 double dashWidthDiv = mPen.widthF();
544 if ( hasStrokeWidthExpression )
546 dashWidthDiv = pen.widthF();
547 scaledWidth = pen.widthF();
551 QStringList versionSplit = QString( qVersion() ).split(
'.' );
552 if ( versionSplit.size() > 1
553 && versionSplit.at( 1 ).toInt() >= 8
554 && scaledWidth < 1.0 )
559 QVector<qreal> dashVector;
561 if ( exprVal.isValid() )
563 QStringList dashList = exprVal.toString().split(
';' );
564 QStringList::const_iterator dashIt = dashList.constBegin();
565 for ( ; dashIt != dashList.constEnd(); ++dashIt )
569 pen.setDashPattern( dashVector );
578 if ( exprVal.isValid() )
587 if ( exprVal.isValid() )
596 if ( exprVal.isValid() )
603 if ( mDrawInsidePolygon )
617 unit = mCustomDashPatternUnit;
618 return mUseCustomDashPattern ? mCustomDashVector : QVector<qreal>();
679 MyLine( QPointF p1, QPointF p2 )
681 , mIncreasing(
false )
693 mIncreasing = ( p2.y() > p1.y() );
698 mT = ( p2.y() - p1.y() ) / ( p2.x() - p1.x() );
699 mIncreasing = ( p2.x() > p1.x() );
703 double x = ( p2.x() - p1.x() );
704 double y = ( p2.y() - p1.y() );
705 mLength = std::sqrt( x * x + y * y );
711 double a = ( mVertical ? M_PI_2 : std::atan( mT ) );
719 QPointF diffForInterval(
double interval )
722 return ( mIncreasing ? QPointF( 0, interval ) : QPointF( 0, -interval ) );
724 double alpha = std::atan( mT );
725 double dx = std::cos( alpha ) * interval;
726 double dy = std::sin( alpha ) * interval;
727 return ( mIncreasing ? QPointF( dx, dy ) : QPointF( -dx, -dy ) );
730 double length() {
return mLength; }
745 : mRotateSymbols( rotateSymbol )
746 , mInterval( interval )
766 if ( exprVal.isValid() )
768 QString placementString = exprVal.toString();
769 if ( placementString.compare( QLatin1String(
"interval" ), Qt::CaseInsensitive ) == 0 )
773 else if ( placementString.compare( QLatin1String(
"vertex" ), Qt::CaseInsensitive ) == 0 )
777 else if ( placementString.compare( QLatin1String(
"lastvertex" ), Qt::CaseInsensitive ) == 0 )
781 else if ( placementString.compare( QLatin1String(
"firstvertex" ), Qt::CaseInsensitive ) == 0 )
785 else if ( placementString.compare( QLatin1String(
"centerpoint" ), Qt::CaseInsensitive ) == 0 )
789 else if ( placementString.compare( QLatin1String(
"curvepoint" ), Qt::CaseInsensitive ) == 0 )
803 double averageOver = mAverageAngleLength;
816 renderPolylineInterval( points, context, averageOver );
820 renderPolylineCentral( points, context, averageOver );
827 renderPolylineVertex( points, context, placement );
836 for (
int part = 0; part < mline.count(); ++part )
838 const QPolygonF &points2 = mline[ part ];
843 renderPolylineInterval( points2, context, averageOver );
847 renderPolylineCentral( points2, context, averageOver );
854 renderPolylineVertex( points2, context, placement );
890 for (
int i = 0; i < rings->size(); ++i )
939 map[QStringLiteral(
"rotate" )] = (
rotateSymbols() ? QStringLiteral(
"1" ) : QStringLiteral(
"0" ) );
940 map[QStringLiteral(
"interval" )] = QString::number(
interval() );
941 map[QStringLiteral(
"offset" )] = QString::number(
mOffset );
942 map[QStringLiteral(
"offset_along_line" )] = QString::number(
offsetAlongLine() );
949 map[QStringLiteral(
"average_angle_length" )] = QString::number( mAverageAngleLength );
953 switch ( mPlacement )
956 map[QStringLiteral(
"placement" )] = QStringLiteral(
"vertex" );
959 map[QStringLiteral(
"placement" )] = QStringLiteral(
"lastvertex" );
962 map[QStringLiteral(
"placement" )] = QStringLiteral(
"firstvertex" );
965 map[QStringLiteral(
"placement" )] = QStringLiteral(
"centralpoint" );
968 map[QStringLiteral(
"placement" )] = QStringLiteral(
"curvepoint" );
971 map[QStringLiteral(
"placement" )] = QStringLiteral(
"interval" );
975 map[QStringLiteral(
"ring_filter" )] = QString::number( static_cast< int >(
mRingFilter ) );
1001 if ( properties.contains( QStringLiteral(
"offset" ) ) )
1003 destLayer->
setOffset( properties[QStringLiteral(
"offset" )].toDouble() );
1005 if ( properties.contains( QStringLiteral(
"offset_unit" ) ) )
1009 if ( properties.contains( QStringLiteral(
"interval_unit" ) ) )
1013 if ( properties.contains( QStringLiteral(
"offset_along_line" ) ) )
1015 destLayer->
setOffsetAlongLine( properties[QStringLiteral(
"offset_along_line" )].toDouble() );
1017 if ( properties.contains( QStringLiteral(
"offset_along_line_unit" ) ) )
1021 if ( properties.contains( ( QStringLiteral(
"offset_along_line_map_unit_scale" ) ) ) )
1026 if ( properties.contains( QStringLiteral(
"offset_map_unit_scale" ) ) )
1030 if ( properties.contains( QStringLiteral(
"interval_map_unit_scale" ) ) )
1035 if ( properties.contains( QStringLiteral(
"average_angle_length" ) ) )
1037 destLayer->
setAverageAngleLength( properties[QStringLiteral(
"average_angle_length" )].toDouble() );
1039 if ( properties.contains( QStringLiteral(
"average_angle_unit" ) ) )
1043 if ( properties.contains( ( QStringLiteral(
"average_angle_map_unit_scale" ) ) ) )
1048 if ( properties.contains( QStringLiteral(
"placement" ) ) )
1050 if ( properties[QStringLiteral(
"placement" )] == QLatin1String(
"vertex" ) )
1052 else if ( properties[QStringLiteral(
"placement" )] == QLatin1String(
"lastvertex" ) )
1054 else if ( properties[QStringLiteral(
"placement" )] == QLatin1String(
"firstvertex" ) )
1056 else if ( properties[QStringLiteral(
"placement" )] == QLatin1String(
"centralpoint" ) )
1058 else if ( properties[QStringLiteral(
"placement" )] == QLatin1String(
"curvepoint" ) )
1064 if ( properties.contains( QStringLiteral(
"ring_filter" ) ) )
1066 destLayer->
setRingFilter( static_cast< RenderRingFilter>( properties[QStringLiteral(
"ring_filter" )].toInt() ) );
1072 void QgsTemplatedLineSymbolLayerBase::renderPolylineInterval(
const QPolygonF &points,
QgsSymbolRenderContext &context,
double averageOver )
1074 if ( points.isEmpty() )
1077 double lengthLeft = 0;
1090 if ( interval <= 0 )
1103 if ( painterUnitInterval < 0 )
1107 lengthLeft = painterUnitInterval - painterUnitOffsetAlongLine;
1109 if ( averageOver > 0 && !
qgsDoubleNear( averageOver, 0.0 ) )
1111 QVector< QPointF > angleStartPoints;
1112 QVector< QPointF > symbolPoints;
1113 QVector< QPointF > angleEndPoints;
1121 collectOffsetPoints( points, symbolPoints, painterUnitInterval, lengthLeft );
1123 if ( symbolPoints.empty() )
1129 if ( symbolPoints.count() > 1 && symbolPoints.constFirst() == symbolPoints.constLast() )
1132 symbolPoints.pop_back();
1135 angleEndPoints.reserve( symbolPoints.size() );
1136 angleStartPoints.reserve( symbolPoints.size() );
1137 if ( averageOver <= painterUnitOffsetAlongLine )
1139 collectOffsetPoints( points, angleStartPoints, painterUnitInterval, lengthLeft + averageOver, 0, symbolPoints.size() );
1143 collectOffsetPoints( points, angleStartPoints, painterUnitInterval, 0, averageOver - painterUnitOffsetAlongLine, symbolPoints.size() );
1145 collectOffsetPoints( points, angleEndPoints, painterUnitInterval, lengthLeft - averageOver, 0, symbolPoints.size() );
1148 for (
int i = 0; i < symbolPoints.size(); ++ i )
1153 const QPointF pt = symbolPoints[i];
1154 const QPointF startPt = angleStartPoints[i];
1155 const QPointF endPt = angleEndPoints[i];
1157 MyLine l( startPt, endPt );
1172 QPointF lastPt = points[0];
1173 for (
int i = 1; i < points.count(); ++i )
1178 const QPointF &pt = points[i];
1184 MyLine l( lastPt, pt );
1185 QPointF diff = l.diffForInterval( painterUnitInterval );
1189 double c = 1 - lengthLeft / painterUnitInterval;
1191 lengthLeft += l.length();
1200 while ( lengthLeft > painterUnitInterval )
1204 lengthLeft -= painterUnitInterval;
1218 static double _averageAngle( QPointF prevPt, QPointF pt, QPointF nextPt )
1221 double a1 = MyLine( prevPt, pt ).angle();
1222 double a2 = MyLine( pt, nextPt ).angle();
1223 double unitX = std::cos( a1 ) + std::cos( a2 ), unitY = std::sin( a1 ) + std::sin( a2 );
1225 return std::atan2( unitY, unitX );
1230 if ( points.isEmpty() )
1237 bool isRing =
false;
1300 switch ( placement )
1311 i = points.count() - 1;
1312 maxCount = points.count();
1319 maxCount = points.count();
1320 if ( points.first() == points.last() )
1338 renderOffsetVertexAlongLine( points, i, distance, context );
1347 for ( ; i < maxCount; ++i )
1358 double angle = markerAngle( points, isRing, i );
1371 double QgsTemplatedLineSymbolLayerBase::markerAngle(
const QPolygonF &points,
bool isRing,
int vertex )
1374 const QPointF &pt = points[vertex];
1376 if ( isRing || ( vertex > 0 && vertex < points.count() - 1 ) )
1378 int prevIndex = vertex - 1;
1379 int nextIndex = vertex + 1;
1381 if ( isRing && ( vertex == 0 || vertex == points.count() - 1 ) )
1383 prevIndex = points.count() - 2;
1387 QPointF prevPoint, nextPoint;
1388 while ( prevIndex >= 0 )
1390 prevPoint = points[ prevIndex ];
1391 if ( prevPoint != pt )
1398 while ( nextIndex < points.count() )
1400 nextPoint = points[ nextIndex ];
1401 if ( nextPoint != pt )
1408 if ( prevIndex >= 0 && nextIndex < points.count() )
1410 angle = _averageAngle( prevPoint, pt, nextPoint );
1417 while ( vertex < points.size() - 1 )
1419 const QPointF &nextPt = points[vertex + 1];
1422 angle = MyLine( pt, nextPt ).angle();
1431 while ( vertex >= 1 )
1433 const QPointF &prevPt = points[vertex - 1];
1436 angle = MyLine( prevPt, pt ).angle();
1446 void QgsTemplatedLineSymbolLayerBase::renderOffsetVertexAlongLine(
const QPolygonF &points,
int vertex,
double distance,
QgsSymbolRenderContext &context )
1448 if ( points.isEmpty() )
1458 bool isRing =
false;
1459 if ( points.first() == points.last() )
1461 double angle = markerAngle( points, isRing, vertex );
1468 int pointIncrement = distance > 0 ? 1 : -1;
1469 QPointF previousPoint = points[vertex];
1470 int startPoint = distance > 0 ? std::min( vertex + 1, points.count() - 1 ) : std::max( vertex - 1, 0 );
1471 int endPoint = distance > 0 ? points.count() - 1 : 0;
1472 double distanceLeft = std::fabs( distance );
1474 for (
int i = startPoint; pointIncrement > 0 ? i <= endPoint : i >= endPoint; i += pointIncrement )
1476 const QPointF &pt = points[i];
1478 if ( previousPoint == pt )
1482 MyLine l( previousPoint, pt );
1484 if ( distanceLeft < l.length() )
1487 QPointF markerPoint = previousPoint + l.diffForInterval( distanceLeft );
1497 distanceLeft -= l.length();
1504 void QgsTemplatedLineSymbolLayerBase::collectOffsetPoints(
const QVector<QPointF> &p, QVector<QPointF> &dest,
double intervalPainterUnits,
double initialOffset,
double initialLag,
int numberPointsRequired )
1509 QVector< QPointF > points = p;
1510 const bool closedRing = points.first() == points.last();
1512 double lengthLeft = initialOffset;
1514 double initialLagLeft = initialLag > 0 ? -initialLag : 1;
1515 if ( initialLagLeft < 0 && closedRing )
1518 QPointF lastPt = points.constLast();
1519 QVector< QPointF > pseudoPoints;
1520 for (
int i = points.count() - 2; i > 0; --i )
1522 if ( initialLagLeft >= 0 )
1527 const QPointF &pt = points[i];
1532 MyLine l( lastPt, pt );
1533 initialLagLeft += l.length();
1538 std::reverse( pseudoPoints.begin(), pseudoPoints.end() );
1540 points = pseudoPoints;
1545 while ( initialLagLeft < 0 )
1547 dest << points.constFirst();
1548 initialLagLeft += intervalPainterUnits;
1551 if ( initialLag > 0 )
1553 lengthLeft += intervalPainterUnits - initialLagLeft;
1556 QPointF lastPt = points[0];
1557 for (
int i = 1; i < points.count(); ++i )
1559 const QPointF &pt = points[i];
1563 if ( closedRing && i == points.count() - 1 && numberPointsRequired > 0 && dest.size() < numberPointsRequired )
1572 MyLine l( lastPt, pt );
1573 QPointF diff = l.diffForInterval( intervalPainterUnits );
1577 double c = 1 - lengthLeft / intervalPainterUnits;
1579 lengthLeft += l.length();
1582 while ( lengthLeft > intervalPainterUnits ||
qgsDoubleNear( lengthLeft, intervalPainterUnits, 0.000000001 ) )
1586 lengthLeft -= intervalPainterUnits;
1589 if ( numberPointsRequired > 0 && dest.size() >= numberPointsRequired )
1594 if ( numberPointsRequired > 0 && dest.size() >= numberPointsRequired )
1598 if ( closedRing && i == points.count() - 1 && numberPointsRequired > 0 && dest.size() < numberPointsRequired )
1605 if ( !closedRing && numberPointsRequired > 0 && dest.size() < numberPointsRequired )
1608 while ( dest.size() < numberPointsRequired )
1609 dest << points.constLast();
1613 void QgsTemplatedLineSymbolLayerBase::renderPolylineCentral(
const QPolygonF &points,
QgsSymbolRenderContext &context,
double averageAngleOver )
1615 if ( !points.isEmpty() )
1619 QPolygonF::const_iterator it = points.constBegin();
1621 for ( ++it; it != points.constEnd(); ++it )
1623 length += std::sqrt( ( last.x() - it->x() ) * ( last.x() - it->x() ) +
1624 ( last.y() - it->y() ) * ( last.y() - it->y() ) );
1628 const double midPoint = length / 2;
1631 double thisSymbolAngle = 0;
1633 if ( averageAngleOver > 0 && !
qgsDoubleNear( averageAngleOver, 0.0 ) )
1635 QVector< QPointF > angleStartPoints;
1636 QVector< QPointF > symbolPoints;
1637 QVector< QPointF > angleEndPoints;
1639 collectOffsetPoints( points, symbolPoints, midPoint, midPoint, 0.0, 2 );
1640 collectOffsetPoints( points, angleStartPoints, midPoint, 0, averageAngleOver, 2 );
1641 collectOffsetPoints( points, angleEndPoints, midPoint, midPoint - averageAngleOver, 0, 2 );
1643 pt = symbolPoints.at( 1 );
1644 MyLine l( angleStartPoints.at( 1 ), angleEndPoints.at( 1 ) );
1645 thisSymbolAngle = l.angle();
1650 it = points.constBegin();
1652 qreal last_at = 0, next_at = 0;
1655 for ( ++it; it != points.constEnd(); ++it )
1658 next_at += std::sqrt( ( last.x() - it->x() ) * ( last.x() - it->x() ) +
1659 ( last.y() - it->y() ) * ( last.y() - it->y() ) );
1660 if ( next_at >= midPoint )
1668 MyLine l( last, next );
1669 qreal k = ( length * 0.5 - last_at ) / ( next_at - last_at );
1670 pt = last + ( next - last ) * k;
1671 thisSymbolAngle = l.angle();
1686 return mMarker.get();
1697 mMarker.reset( static_cast<QgsMarkerSymbol *>( symbol ) );
1698 mColor = mMarker->color();
1719 if ( props.contains( QStringLiteral(
"interval" ) ) )
1720 interval = props[QStringLiteral(
"interval" )].toDouble();
1721 if ( props.contains( QStringLiteral(
"rotate" ) ) )
1722 rotate = ( props[QStringLiteral(
"rotate" )] == QLatin1String(
"1" ) );
1724 std::unique_ptr< QgsMarkerLineSymbolLayer > x = qgis::make_unique< QgsMarkerLineSymbolLayer >( rotate,
interval );
1731 return QStringLiteral(
"MarkerLine" );
1750 QgsSymbol::RenderHints hints =
nullptr;
1753 mMarker->setRenderHints( hints );
1766 std::unique_ptr< QgsMarkerLineSymbolLayer > x = qgis::make_unique< QgsMarkerLineSymbolLayer >(
rotateSymbols(),
interval() );
1773 for (
int i = 0; i <
mMarker->symbolLayerCount(); i++ )
1775 QDomElement symbolizerElem = doc.createElement( QStringLiteral(
"se:LineSymbolizer" ) );
1776 if ( !props.value( QStringLiteral(
"uom" ), QString() ).isEmpty() )
1777 symbolizerElem.setAttribute( QStringLiteral(
"uom" ), props.value( QStringLiteral(
"uom" ), QString() ) );
1778 element.appendChild( symbolizerElem );
1813 QDomElement strokeElem = doc.createElement( QStringLiteral(
"se:Stroke" ) );
1814 symbolizerElem.appendChild( strokeElem );
1817 QDomElement graphicStrokeElem = doc.createElement( QStringLiteral(
"se:GraphicStroke" ) );
1818 strokeElem.appendChild( graphicStrokeElem );
1824 graphicStrokeElem.appendChild( doc.createComment( QStringLiteral(
"MarkerSymbolLayerV2 expected, %1 found. Skip it." ).arg( layer->
layerType() ) ) );
1831 if ( !gap.isEmpty() )
1833 QDomElement gapElem = doc.createElement( QStringLiteral(
"se:Gap" ) );
1835 graphicStrokeElem.appendChild( gapElem );
1840 QDomElement perpOffsetElem = doc.createElement( QStringLiteral(
"se:PerpendicularOffset" ) );
1842 perpOffsetElem.appendChild( doc.createTextNode(
qgsDoubleToString( offset ) ) );
1843 symbolizerElem.appendChild( perpOffsetElem );
1852 QDomElement strokeElem = element.firstChildElement( QStringLiteral(
"Stroke" ) );
1853 if ( strokeElem.isNull() )
1856 QDomElement graphicStrokeElem = strokeElem.firstChildElement( QStringLiteral(
"GraphicStroke" ) );
1857 if ( graphicStrokeElem.isNull() )
1865 for ( QgsStringMap::iterator it = vendorOptions.begin(); it != vendorOptions.end(); ++it )
1867 if ( it.key() == QLatin1String(
"placement" ) )
1869 if ( it.value() == QLatin1String(
"points" ) )
1871 else if ( it.value() == QLatin1String(
"firstPoint" ) )
1873 else if ( it.value() == QLatin1String(
"lastPoint" ) )
1875 else if ( it.value() == QLatin1String(
"centralPoint" ) )
1878 else if ( it.value() == QLatin1String(
"rotateMarker" ) )
1880 rotateMarker = it.value() == QLatin1String(
"0" );
1884 std::unique_ptr< QgsMarkerSymbol > marker;
1898 QDomElement gapElem = graphicStrokeElem.firstChildElement( QStringLiteral(
"Gap" ) );
1899 if ( !gapElem.isNull() )
1902 double d = gapElem.firstChild().nodeValue().toDouble( &ok );
1908 QDomElement perpOffsetElem = graphicStrokeElem.firstChildElement( QStringLiteral(
"PerpendicularOffset" ) );
1909 if ( !perpOffsetElem.isNull() )
1912 double d = perpOffsetElem.firstChild().nodeValue().toDouble( &ok );
1917 QString uom = element.attribute( QStringLiteral(
"uom" ) );
1939 mMarker->setDataDefinedSize( property );
1946 mMarker->setLineAngle( angle );
1961 mMarker->renderPoint( point, feature, context, layer, selected );
1971 return mMarker->size( context );
1977 mMarker->setOutputUnit( unit );
1988 attr.unite(
mMarker->usedAttributes( context ) );
2003 return (
mMarker->size( context ) / 2.0 ) +
2023 if ( props.contains( QStringLiteral(
"interval" ) ) )
2024 interval = props[QStringLiteral(
"interval" )].toDouble();
2025 if ( props.contains( QStringLiteral(
"rotate" ) ) )
2026 rotate = ( props[QStringLiteral(
"rotate" )] == QLatin1String(
"1" ) );
2028 std::unique_ptr< QgsHashedLineSymbolLayer > x = qgis::make_unique< QgsHashedLineSymbolLayer >( rotate,
interval );
2030 if ( props.contains( QStringLiteral(
"hash_angle" ) ) )
2032 x->setHashAngle( props[QStringLiteral(
"hash_angle" )].toDouble() );
2035 if ( props.contains( QStringLiteral(
"hash_length" ) ) )
2036 x->setHashLength( props[QStringLiteral(
"hash_length" )].toDouble() );
2038 if ( props.contains( QStringLiteral(
"hash_length_unit" ) ) )
2041 if ( props.contains( QStringLiteral(
"hash_length_map_unit_scale" ) ) )
2049 return QStringLiteral(
"HashLine" );
2054 mHashSymbol->setOpacity( context.
opacity() );
2057 QgsSymbol::RenderHints hints =
nullptr;
2060 mHashSymbol->setRenderHints( hints );
2073 map[ QStringLiteral(
"hash_angle" ) ] = QString::number( mHashAngle );
2075 map[QStringLiteral(
"hash_length" )] = QString::number( mHashLength );
2084 std::unique_ptr< QgsHashedLineSymbolLayer > x = qgis::make_unique< QgsHashedLineSymbolLayer >(
rotateSymbols(),
interval() );
2086 x->setHashAngle( mHashAngle );
2087 x->setHashLength( mHashLength );
2088 x->setHashLengthUnit( mHashLengthUnit );
2089 x->setHashLengthMapUnitScale( mHashLengthMapUnitScale );
2095 mHashSymbol->setColor( color );
2101 return mHashSymbol ? mHashSymbol->color() :
mColor;
2106 return mHashSymbol.get();
2117 mHashSymbol.reset( static_cast<QgsLineSymbol *>( symbol ) );
2118 mColor = mHashSymbol->color();
2124 mHashLength =
width;
2139 return ( mHashSymbol->width( context ) / 2.0 )
2147 mHashSymbol->setOutputUnit( unit );
2157 attr.unite( mHashSymbol->usedAttributes( context ) );
2165 if ( mHashSymbol && mHashSymbol->hasDataDefinedProperties() )
2174 mHashSymbol->setDataDefinedWidth( property );
2181 mSymbolLineAngle =
angle;
2186 return mSymbolAngle;
2191 mSymbolAngle =
angle;
2196 double lineLength = mHashLength;
2202 const double w = context.
convertToPainterUnits( lineLength, mHashLengthUnit, mHashLengthMapUnitScale ) / 2.0;
2212 QgsPointXY start = center.
project( w, 180 - ( mSymbolAngle + mSymbolLineAngle + hashAngle ) );
2213 QgsPointXY end = center.
project( -w, 180 - ( mSymbolAngle + mSymbolLineAngle + hashAngle ) );
2216 points << QPointF( start.
x(), start.
y() ) << QPointF( end.
x(), end.
y() );
2218 mHashSymbol->renderPolyline( points, feature, context, layer, selected );
QgsStringMap properties() const override
Should be reimplemented by subclasses to return a string map that contains the configuration informat...
void setOutputUnit(QgsUnitTypes::RenderUnit unit) override
Sets the units to use for sizes and widths within the symbol layer.
void setOffsetAlongLine(double offsetAlongLine)
Sets the the offset along the line for the symbol placement.
double estimateMaxBleed(const QgsRenderContext &context) const override
Returns the estimated maximum distance which the layer style will bleed outside the drawn shape when ...
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...
Place symbols on the first vertex in the line.
Single variable definition for use within a QgsExpressionContextScope.
void setMapUnitScale(const QgsMapUnitScale &scale) override
double symbolAngle() const override
Returns the symbol's current angle, in degrees clockwise.
double dxfOffset(const QgsDxfExport &e, QgsSymbolRenderContext &context) const override
Gets offset.
double symbologyScale() const
Returns the reference scale for output.
QgsHashedLineSymbolLayer * clone() const override
Shall be reimplemented by subclasses to create a deep copy of the instance.
void setMapUnitScale(const QgsMapUnitScale &scale) override
void clipValueToMapUnitScale(double &value, const QgsMapUnitScale &scale, double pixelToMMFactor) const
Clips value to scale minimum/maximum.
static QDomElement createVendorOptionElement(QDomDocument &doc, const QString &name, const QString &value)
void renderPolygonStroke(const QPolygonF &points, QList< QPolygonF > *rings, QgsSymbolRenderContext &context) override
Renders the line symbol layer along the outline of polygon, using the given render context...
QSet< QString > usedAttributes(const QgsRenderContext &context) const override
Returns the set of attributes referenced by the layer.
void setPlacement(Placement placement)
Sets the placement of the symbols.
const QgsVectorSimplifyMethod & vectorSimplifyMethod() const
Added in QGIS v2.4.
QgsFields fields() const
Fields of the layer.
static const QString EXPR_GEOMETRY_POINT_COUNT
Inbuilt variable name for point count variable.
Abstract base class for all rendered symbols.
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...
void setUseCustomDashPattern(bool b)
Sets whether the line uses a custom dash pattern.
virtual QgsSymbol * subSymbol()
Returns the symbol's sub symbol, if present.
void renderPolyline(const QPolygonF &points, QgsSymbolRenderContext &context) FINAL
Renders the line symbol layer along the line joining points, using the given render context...
void toSld(QDomDocument &doc, QDomElement &element, const QgsStringMap &props) const override
static QgsSymbolLayer * createFromSld(QDomElement &element)
Creates a new QgsSimpleLineSymbolLayer from an SLD XML DOM element.
A class to represent a 2D point.
void setSymbolLineAngle(double angle) override
Sets the line angle modification for the symbol's angle.
A simple line symbol layer, which renders lines using a line in a variety of styles (e...
bool qgsDoubleNear(double a, double b, double epsilon=4 *std::numeric_limits< double >::epsilon())
Compare two doubles (but allow some difference)
Render both exterior and interior rings.
const QgsCurve * interiorRing(int i) const
Retrieves an interior ring from the curve polygon.
virtual void setSymbolLineAngle(double angle)=0
Sets the line angle modification for the symbol's angle.
void renderSymbol(const QPointF &point, const QgsFeature *feature, QgsRenderContext &context, int layer=-1, bool selected=false) override
Renders the templated symbol at the specified point, using the given render context.
#define DEFAULT_MARKERLINE_INTERVAL
virtual double vertexAngle(QgsVertexId vertex) const =0
Returns approximate angle at a vertex.
bool renderingStopped() const
Returns true if the rendering operation has been stopped and any ongoing rendering should be canceled...
void copyPaintEffect(QgsSymbolLayer *destLayer) const
Copies paint effect of this layer to another symbol layer.
Curve polygon geometry type.
QgsUnitTypes::RenderUnit mOffsetUnit
static QString encodeMapUnitScale(const QgsMapUnitScale &mapUnitScale)
void restoreOldDataDefinedProperties(const QgsStringMap &stringMap)
Restores older data defined properties from string map.
static double sizeInPixelsFromSldUom(const QString &uom, double size)
Returns the size scaled in pixels according to the uom attribute.
QgsUnitTypes::DistanceUnit mapUnits() const
Retrieve map units.
static QgsSymbolLayer * create(const QgsStringMap &properties=QgsStringMap())
Creates a new QgsHashedLineSymbolLayer, using the settings serialized in the properties map (correspo...
void copyTemplateSymbolProperties(QgsTemplatedLineSymbolLayerBase *destLayer) const
Copies all common properties of this layer to another templated symbol layer.
QString ogrFeatureStyle(double mmScaleFactor, double mapUnitScaleFactor) const override
QgsUnitTypes::RenderUnit offsetUnit() const
Returns the units for the line's offset.
The feature class encapsulates a single feature including its id, geometry and a list of field/values...
virtual bool nextVertex(QgsVertexId &id, QgsPoint &vertex) const =0
Returns next vertex id and coordinates.
Place symbols on every vertex in the line.
QgsUnitTypes::RenderUnit intervalUnit() const
Returns the units for the interval between symbols.
QgsHashedLineSymbolLayer(bool rotateSymbol=true, double interval=3)
Constructor for QgsHashedLineSymbolLayer.
double interval() const
Returns the interval between individual symbols.
static bool createExpressionElement(QDomDocument &doc, QDomElement &element, const QString &function)
Creates a OGC Expression element based on the provided function expression.
QMap< QString, QString > QgsStringMap
Rotation of symbol may be changed during rendering and symbol should not be cached.
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)
void addVariable(const QgsExpressionContextScope::StaticVariable &variable)
Adds a variable into the context scope.
void setInterval(double interval)
Sets the interval between individual symbols.
virtual double width() const
Returns the estimated width for the line symbol layer.
A marker symbol type, for rendering Point and MultiPoint geometries.
static Qt::PenJoinStyle decodePenJoinStyle(const QString &str)
void setWidthUnit(QgsUnitTypes::RenderUnit unit)
Sets the units for the line's width.
A line symbol type, for rendering LineString and MultiLineString geometries.
void setWidth(double width) override
Sets the width of the line symbol layer.
bool isActive(int key) const override
Returns true if the collection contains an active property with the specified key.
Place symbols at every virtual curve point in the line (used when rendering curved geometry types onl...
static QVector< qreal > decodeRealVector(const QString &s)
void setCustomDashPatternUnit(QgsUnitTypes::RenderUnit unit)
Sets the unit for lengths used in the custom dash pattern.
static QString encodeColor(const QColor &color)
double symbolAngle() const override
Returns the symbol's current angle, in degrees clockwise.
virtual bool hasDataDefinedProperties() const
Returns true if the symbol layer (or any of its sub-symbols) contains data defined properties...
QgsStringMap properties() const override
Should be reimplemented by subclasses to return a string map that contains the configuration informat...
void setAverageAngleUnit(QgsUnitTypes::RenderUnit unit)
Sets the unit for the length over which the line's direction is averaged when calculating individual ...
As part of the API refactoring and improvements which landed in the Processing API was substantially reworked from the x version This was done in order to allow much of the underlying Processing framework to be ported into c
std::unique_ptr< QgsMarkerSymbol > mMarker
void transformInPlace(double &x, double &y) const
Transform device coordinates to map coordinates.
double estimateMaxBleed(const QgsRenderContext &context) const override
Returns the estimated maximum distance which the layer style will bleed outside the drawn shape when ...
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...
QString layerType() const override
Returns a string that represents this layer type.
void setOriginalValueVariable(const QVariant &value)
Sets the original value variable value for data defined symbology.
static QString encodePenStyle(Qt::PenStyle style)
Perform transforms between map coordinates and device coordinates.
virtual void writeSldMarker(QDomDocument &doc, QDomElement &element, const QgsStringMap &props) const
Writes the symbol layer definition as a SLD XML element.
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, otherwise returns the value un-modified.
virtual bool setSubSymbol(QgsSymbol *symbol)
Sets layer's subsymbol. takes ownership of the passed symbol.
void setOffsetAlongLineMapUnitScale(const QgsMapUnitScale &scale)
Sets the map unit scale used for calculating the offset in map units along line for symbols...
QgsSymbol * subSymbol() override
Returns the symbol's sub symbol, if present.
void setIntervalUnit(QgsUnitTypes::RenderUnit unit)
Sets the units for the interval between symbols.
QgsUnitTypes::RenderUnit outputUnit() const override
Returns the units to use for sizes and widths within the symbol layer.
static QgsSymbolLayer * create(const QgsStringMap &properties=QgsStringMap())
Creates a new QgsMarkerLineSymbolLayer, using the settings serialized in the properties map (correspo...
QgsUnitTypes::RenderUnit widthUnit() const
Returns the units for the line's width.
Utility class for identifying a unique vertex within a geometry.
void setGeometry(const QgsAbstractGeometry *geometry)
Sets pointer to original (unsegmentized) geometry.
The geometries can be rendered with 'AntiAliasing' disabled because of it is '1-pixel size'...
QVector< qreal > customDashVector() const
Returns the custom dash vector, which is the pattern of alternating drawn/skipped lengths used while ...
static QgsStringMap getVendorOptionList(QDomElement &element)
double estimateMaxBleed(const QgsRenderContext &context) const override
Returns the estimated maximum distance which the layer style will bleed outside the drawn shape when ...
bool hasDataDefinedProperties() const override
Returns true if the symbol layer (or any of its sub-symbols) contains data defined properties...
qreal opacity() const
Returns the opacity for the symbol.
static void setCommonProperties(QgsTemplatedLineSymbolLayerBase *destLayer, const QgsStringMap &properties)
Sets all common symbol properties in the destLayer, using the settings serialized in the properties m...
const QgsAbstractGeometry * geometry() const
Returns pointer to the unsegmentized geometry.
Render the interior rings only.
QString qgsDoubleToString(double a, int precision=17)
Returns a string representation of a double.
QgsTemplatedLineSymbolLayerBase(bool rotateSymbol=true, double interval=3)
Constructor for QgsTemplatedLineSymbolLayerBase.
QgsPropertyCollection & dataDefinedProperties()
Returns a reference to the symbol layer's property collection, used for data defined overrides...
Line symbol layer type which draws repeating line sections along a line feature.
virtual QgsSymbolLayer * clone() const =0
Shall be reimplemented by subclasses to create a deep copy of the instance.
#define DEFAULT_SIMPLELINE_PENSTYLE
static double mapUnitScaleFactor(double scale, QgsUnitTypes::RenderUnit symbolUnits, QgsUnitTypes::DistanceUnit mapUnits, double mapUnitsPerPixel=1.0)
Returns scale factor for conversion to map units.
QgsMapUnitScale mOffsetMapUnitScale
virtual QColor color() const
The fill color.
static QgsSymbolLayer * createMarkerLayerFromSld(QDomElement &element)
QColor selectionColor() const
Returns the color to use when rendering selected features.
QgsMarkerLineSymbolLayer * clone() const override
Shall be reimplemented by subclasses to create a deep copy of the instance.
void renderPolyline(const QPolygonF &points, QgsSymbolRenderContext &context) override
Renders the line symbol layer along the line joining points, using the given render context...
double width() const override
Returns the estimated width for the line symbol layer.
virtual double symbolAngle() const =0
Returns the symbol's current angle, in degrees clockwise.
QgsUnitTypes::RenderUnit outputUnit() const override
Returns the units to use for sizes and widths within the symbol layer.
float threshold() const
Gets the simplification threshold of the vector layer managed.
QList< QgsSymbolLayer * > QgsSymbolLayerList
void stopRender(QgsSymbolRenderContext &context) override
#define DEFAULT_SIMPLELINE_COLOR
QgsUnitTypes::RenderUnit offsetAlongLineUnit() const
Returns the unit used for calculating the offset along line for symbols.
QgsSimpleLineSymbolLayer(const QColor &color=DEFAULT_SIMPLELINE_COLOR, double width=DEFAULT_SIMPLELINE_WIDTH, Qt::PenStyle penStyle=DEFAULT_SIMPLELINE_PENSTYLE)
Constructor for QgsSimpleLineSymbolLayer.
QgsPointXY project(double distance, double bearing) const
Returns a new point which corresponds to this point projected by a specified distance in a specified ...
QgsCoordinateTransform coordinateTransform() const
Returns the current coordinate transform for the context.
static Qt::PenCapStyle decodePenCapStyle(const QString &str)
Qt::PenJoinStyle penJoinStyle() const
Returns the pen join style used to render the line (e.g.
QgsUnitTypes::RenderUnit outputUnit() const FINAL
Returns the units to use for sizes and widths within the symbol layer.
double offset() const
Returns the line's offset.
void stopRender(QgsSymbolRenderContext &context) override
void setDataDefinedProperty(QgsSymbolLayer::Property key, const QgsProperty &property) override
Sets a data defined property for the layer.
static Q_INVOKABLE QgsUnitTypes::RenderUnit decodeRenderUnit(const QString &string, bool *ok=nullptr)
Decodes a render unit from a string.
static bool lineFromSld(QDomElement &element, Qt::PenStyle &penStyle, QColor &color, double &width, Qt::PenJoinStyle *penJoinStyle=nullptr, Qt::PenCapStyle *penCapStyle=nullptr, QVector< qreal > *customDashPattern=nullptr, double *dashOffset=nullptr)
Base class for templated line symbols, e.g.
Single scope for storing variables and functions for use within a QgsExpressionContext.
double mapUnitsPerPixel() const
Returns current map units per pixel.
Q_DECL_DEPRECATED bool rotateMarker() const
Shall the marker be rotated.
A store for object properties.
QgsMapUnitScale mWidthMapUnitScale
QgsRenderContext & renderContext()
Returns a reference to the context's render context.
void setHashAngle(double angle)
Sets the angle to use when drawing the hashed lines sections, in degrees clockwise.
void setSymbolAngle(double angle) override
Sets the symbol's angle, in degrees clockwise.
const QgsMapUnitScale & offsetAlongLineMapUnitScale() const
Returns the map unit scale used for calculating the offset in map units along line for symbols...
Point geometry type, with support for z-dimension and m-values.
static Qt::PenStyle decodePenStyle(const QString &str)
QString layerType() const override
Returns a string that represents this layer type.
bool selected() const
Returns true if symbols should be rendered using the selected symbol coloring and style...
void setMapUnitScale(const QgsMapUnitScale &scale) FINAL
static QgsSymbolLayer * create(const QgsStringMap &properties=QgsStringMap())
Creates a new QgsSimpleLineSymbolLayer, using the settings serialized in the properties map (correspo...
double width() const override
Returns the estimated width for the line symbol layer.
QSet< QString > usedAttributes(const QgsRenderContext &context) const override
Returns the set of attributes referenced by the layer.
Place symbols at regular intervals.
static void createGeometryElement(QDomDocument &doc, QDomElement &element, const QString &geomFunc)
static Q_INVOKABLE QString encodeUnit(QgsUnitTypes::DistanceUnit unit)
Encodes a distance unit to a string.
QgsWkbTypes::GeometryType originalGeometryType() const
Returns the geometry type for the original feature geometry being rendered.
void startRender(QgsSymbolRenderContext &context) override
void setPenCapStyle(Qt::PenCapStyle style)
Sets the pen cap style used to render the line (e.g.
QgsExpressionContext & expressionContext()
Gets the expression context.
double dxfWidth(const QgsDxfExport &e, QgsSymbolRenderContext &context) const override
Gets line width.
Line angle, or angle of hash lines for hash line symbols.
#define DEFAULT_SIMPLELINE_WIDTH
void setOutputUnit(QgsUnitTypes::RenderUnit unit) override
Sets the units to use for sizes and widths within the symbol layer.
void stopRender(QgsSymbolRenderContext &context) override
QgsStringMap properties() const override
Should be reimplemented by subclasses to return a string map that contains the configuration informat...
Stroke style (eg solid, dashed)
virtual QSet< QString > usedAttributes(const QgsRenderContext &context) const
Returns the set of attributes referenced by the layer.
double hashAngle() const
Returns the angle to use when drawing the hashed lines sections, in degrees clockwise.
Contains information about the context of a rendering operation.
Abstract base class for marker symbol layers.
QColor color() const override
The fill color.
double convertToPainterUnits(double size, QgsUnitTypes::RenderUnit unit, const QgsMapUnitScale &scale=QgsMapUnitScale()) const
Converts a size from the specified units to painter units (pixels).
void startRender(QgsSymbolRenderContext &context) override
QgsSimpleLineSymbolLayer * clone() const override
Shall be reimplemented by subclasses to create a deep copy of the instance.
const QgsMapUnitScale & intervalMapUnitScale() const
Returns the map unit scale for the interval between symbols.
QPainter * painter()
Returns the destination QPainter for the render operation.
const QgsMapToPixel & mapToPixel() const
Returns the context's map to pixel transform, which transforms between map coordinates and device coo...
void setWidth(double width) override
Sets the width of the line symbol layer.
Line symbol layer type which draws repeating marker symbols along a line feature. ...
RenderRingFilter mRingFilter
void startRender(QgsSymbolRenderContext &context) override
SymbolType type() const
Returns the symbol's type.
Struct for storing maximum and minimum scales for measurements in map units.
void setCustomDashPatternMapUnitScale(const QgsMapUnitScale &scale)
Sets the map unit scale for lengths used in the custom dash pattern.
bool setSubSymbol(QgsSymbol *symbol) override
Sets layer's subsymbol. takes ownership of the passed symbol.
Placement
Defines how/where the templated symbol should be placed on the line.
void setWidthMapUnitScale(const QgsMapUnitScale &scale)
void setIntervalMapUnitScale(const QgsMapUnitScale &scale)
Sets the map unit scale for the interval between symbols.
Qt::PenStyle penStyle() const
Returns the pen style used to render the line (e.g.
virtual void setSymbolAngle(double angle)=0
Sets the symbol's angle, in degrees clockwise.
void appendScope(QgsExpressionContextScope *scope)
Appends a scope to the end of the context.
QgsUnitTypes::RenderUnit mWidthUnit
static const bool SELECTION_IS_OPAQUE
Whether styles for selected features ignore symbol alpha.
const QgsFeature * feature() const
Returns the current feature being rendered.
Distance between lines, or length of lines for hash line symbols.
void setOffsetUnit(QgsUnitTypes::RenderUnit unit)
Sets the unit for the line's offset.
void setRingFilter(QgsLineSymbolLayer::RenderRingFilter filter)
Sets the line symbol layer's ring filter, which controls which rings are rendered when the line symbo...
void setColor(const QColor &color) override
The fill color.
void setOutputUnit(QgsUnitTypes::RenderUnit unit) override
Sets the units to use for sizes and widths within the symbol layer.
SimplifyHints simplifyHints() const
Gets the simplification hints of the vector layer managed.
void setDrawInsidePolygon(bool drawInsidePolygon)
Sets whether the line should only be drawn inside polygons, and any portion of the line which falls o...
QgsMarkerLineSymbolLayer(bool rotateMarker=DEFAULT_MARKERLINE_ROTATE, double interval=DEFAULT_MARKERLINE_INTERVAL)
Constructor for QgsMarkerLineSymbolLayer.
void setCustomDashVector(const QVector< qreal > &vector)
Sets the custom dash vector, which is the pattern of alternating drawn/skipped lengths used while ren...
void setDataDefinedProperty(QgsSymbolLayer::Property key, const QgsProperty &property) override
Sets a data defined property for the layer.
QgsMapUnitScale mapUnitScale() const FINAL
static const QString EXPR_GEOMETRY_POINT_NUM
Inbuilt variable name for point number variable.
QList< QPolygonF > offsetLine(QPolygonF polyline, double dist, QgsWkbTypes::GeometryType geometryType)
calculate geometry shifted by a specified distance
static QgsMapUnitScale decodeMapUnitScale(const QString &str)
Placement placement() const
Returns the placement of the symbols.
Place symbols on the last vertex in the line.
Length to average symbol angles over.
bool hasDataDefinedProperties() const override
Returns true if the symbol layer (or any of its sub-symbols) contains data defined properties...
void setOffsetAlongLineUnit(QgsUnitTypes::RenderUnit unit)
Sets the unit used for calculating the offset along line for symbols.
Render the exterior ring only.
static void lineToSld(QDomDocument &doc, QDomElement &element, Qt::PenStyle penStyle, const QColor &color, double width=-1, const Qt::PenJoinStyle *penJoinStyle=nullptr, const Qt::PenCapStyle *penCapStyle=nullptr, const QVector< qreal > *customDashPattern=nullptr, double dashOffset=0.0)
void setAverageAngleLength(double length)
Sets the length of line over which the line's direction is averaged when calculating individual symbo...
void setSymbolLineAngle(double angle) override
Sets the line angle modification for the symbol's angle.
static QString encodePenCapStyle(Qt::PenCapStyle style)
QgsExpressionContextScope * popScope()
Removes the last scope from the expression context and return it.
Place symbols at the mid point of the line.
QString layerType() const override
Returns a string that represents this layer type.
static QgsSymbolLayer * createFromSld(QDomElement &element)
Creates a new QgsMarkerLineSymbolLayer from an SLD XML DOM element.
void setOffsetMapUnitScale(const QgsMapUnitScale &scale)
Sets the map unit scale for the line's offset.
const QgsCurve * exteriorRing() const
Returns the curve polygon's exterior ring.
QVector< qreal > dxfCustomDashPattern(QgsUnitTypes::RenderUnit &unit) const override
Gets dash pattern.
QgsMapUnitScale mapUnitScale() const override
void setAverageAngleMapUnitScale(const QgsMapUnitScale &scale)
Sets the map unit scale for the length over which the line's direction is averaged when calculating i...
void setColor(const QColor &color) override
The fill color.
static bool isGeneralizableByDeviceBoundingBox(const QgsRectangle &envelope, float mapToPixelTol=1.0f)
Returns whether the device-envelope can be replaced by its BBOX when is applied the specified toleran...
void toSld(QDomDocument &doc, QDomElement &element, const QgsStringMap &props) const override
bool setSubSymbol(QgsSymbol *symbol) override
Sets layer's subsymbol. takes ownership of the passed symbol.
double scaleFactor() const
Returns the scaling factor for the render to convert painter units to physical sizes.
Qt::PenCapStyle penCapStyle() const
Returns the pen cap style used to render the line (e.g.
void renderPolygonStroke(const QPolygonF &points, QList< QPolygonF > *rings, QgsSymbolRenderContext &context) FINAL
Renders the line symbol layer along the outline of polygon, using the given render context...
void setOriginalValueVariable(const QVariant &value)
Sets the original value variable value for the context.
static QString ogrFeatureStylePen(double width, double mmScaleFactor, double mapUnitsScaleFactor, const QColor &c, Qt::PenJoinStyle joinStyle=Qt::MiterJoin, Qt::PenCapStyle capStyle=Qt::FlatCap, double offset=0.0, const QVector< qreal > *dashPattern=nullptr)
Create ogr feature style string for pen.
virtual bool hasCurvedSegments() const
Returns true if the geometry contains curved segments.
QColor dxfColor(QgsSymbolRenderContext &context) const override
Gets color.
Qt::PenStyle dxfPenStyle() const override
Gets pen style.
#define DEFAULT_MARKERLINE_ROTATE
double offsetAlongLine() const
Returns the offset along the line for the symbol placement.
static QString encodePenJoinStyle(Qt::PenJoinStyle style)
virtual void renderSymbol(const QPointF &point, const QgsFeature *feature, QgsRenderContext &context, int layer=-1, bool selected=false)=0
Renders the templated symbol at the specified point, using the given render context.
void setSymbolAngle(double angle) override
Sets the symbol's angle, in degrees clockwise.
QgsPropertyCollection mDataDefinedProperties
QColor color() const override
The fill color.
QgsMapUnitScale mapUnitScale() const override
void renderSymbol(const QPointF &point, const QgsFeature *feature, QgsRenderContext &context, int layer=-1, bool selected=false) override
Renders the templated symbol at the specified point, using the given render context.
QgsSymbol * subSymbol() override
Returns the symbol's sub symbol, if present.
void setOutputUnit(QgsUnitTypes::RenderUnit unit) override
Sets the units to use for sizes and widths within the symbol layer.
Property
Data definable properties.
static QString encodeRealVector(const QVector< qreal > &v)
RenderUnit
Rendering size units.
static QColor decodeColor(const QString &str)
virtual void setDataDefinedProperty(Property key, const QgsProperty &property)
Sets a data defined property for the layer.
void copyDataDefinedProperties(QgsSymbolLayer *destLayer) const
Copies all data defined properties of this layer to another symbol layer.
void setPenJoinStyle(Qt::PenJoinStyle style)
Sets the pen join style used to render the line (e.g.
void setOffset(double offset)
Sets the line's offset.
virtual QString layerType() const =0
Returns a string that represents this layer type.
bool rotateSymbols() const
Returns true if the repeating symbols be rotated to match their line segment orientation.