29 #include <QDomDocument> 30 #include <QDomElement> 35 : mPenStyle( penStyle )
38 , mUseCustomDashPattern( false )
40 , mDrawInsidePolygon( false )
90 if ( props.
contains(
"line_color" ) )
94 else if ( props.
contains(
"outline_color" ) )
98 else if ( props.
contains(
"color" ) )
103 if ( props.
contains(
"line_width" ) )
105 width = props[
"line_width"].toDouble();
107 else if ( props.
contains(
"outline_width" ) )
109 width = props[
"outline_width"].toDouble();
111 else if ( props.
contains(
"width" ) )
114 width = props[
"width"].toDouble();
116 if ( props.
contains(
"line_style" ) )
120 else if ( props.
contains(
"outline_style" ) )
124 else if ( props.
contains(
"penstyle" ) )
130 if ( props.
contains(
"line_width_unit" ) )
134 else if ( props.
contains(
"outline_width_unit" ) )
138 else if ( props.
contains(
"width_unit" ) )
143 if ( props.
contains(
"width_map_unit_scale" ) )
146 l->
setOffset( props[
"offset"].toDouble() );
147 if ( props.
contains(
"offset_unit" ) )
149 if ( props.
contains(
"offset_map_unit_scale" ) )
151 if ( props.
contains(
"joinstyle" ) )
156 if ( props.
contains(
"use_custom_dash" ) )
160 if ( props.
contains(
"customdash" ) )
164 if ( props.
contains(
"customdash_unit" ) )
168 if ( props.
contains(
"customdash_map_unit_scale" ) )
173 if ( props.
contains(
"draw_inside_polygon" ) )
201 double dashWidthDiv = scaledWidth;
204 if ( versionSplit.
size() > 1
205 && versionSplit.
at( 1 ).toInt() >= 8
260 for ( ; it != rings->
constEnd(); ++it )
275 Q_FOREACH (
const QPolygonF& ring, *rings )
303 applyDataDefinedSymbology( context,
mPen,
mSelPen, offset );
309 if ( points.
size() <= 2 &&
340 for (
int part = 0; part < mline.count(); ++part )
401 if ( !props.
value(
"uom",
"" ).isEmpty() )
445 if ( strokeElem.
isNull() )
457 &penJoinStyle, &penCapStyle,
458 &customDashVector ) )
463 if ( !perpOffsetElem.
isNull() )
493 bool hasStrokeWidthExpression =
false;
502 hasStrokeWidthExpression =
true;
528 if ( hasStrokeWidthExpression )
530 dashWidthDiv = pen.
widthF();
531 scaledWidth = pen.
widthF();
536 if ( versionSplit.
size() > 1
537 && versionSplit.
at( 1 ).toInt() >= 8
548 for ( ; dashIt != dashList.
constEnd(); ++dashIt )
658 MyLine(
QPointF p1,
QPointF p2 ) : mVertical(
false ), mIncreasing(
false ), mT( 0.0 ), mLength( 0.0 )
668 mIncreasing = ( p2.
y() > p1.
y() );
673 mT = float( p2.
y() - p1.
y() ) / ( p2.
x() - p1.
x() );
674 mIncreasing = ( p2.
x() > p1.
x() );
678 double x = ( p2.
x() - p1.
x() );
679 double y = ( p2.
y() - p1.
y() );
680 mLength = sqrt( x * x + y * y );
686 double a = ( mVertical ?
M_PI / 2 : atan( mT ) );
694 QPointF diffForInterval(
double interval )
697 return ( mIncreasing ?
QPointF( 0, interval ) :
QPointF( 0, -interval ) );
699 double alpha = atan( mT );
700 double dx = cos( alpha ) * interval;
701 double dy = sin( alpha ) * interval;
705 double length() {
return mLength; }
718 mRotateMarker = rotateMarker;
719 mInterval = interval;
722 mPlacement = Interval;
723 mOffsetAlongLine = 0;
741 interval = props[
"interval"].toDouble();
743 rotate = ( props[
"rotate"] ==
"1" );
748 x->
setOffset( props[
"offset"].toDouble() );
750 if ( props.
contains(
"offset_unit" ) )
754 if ( props.
contains(
"interval_unit" ) )
758 if ( props.
contains(
"offset_along_line" ) )
762 if ( props.
contains(
"offset_along_line_unit" ) )
766 if ( props.
contains((
"offset_along_line_map_unit_scale" ) ) )
771 if ( props.
contains(
"offset_map_unit_scale" ) )
775 if ( props.
contains(
"interval_map_unit_scale" ) )
780 if ( props.
contains(
"placement" ) )
782 if ( props[
"placement"] ==
"vertex" )
784 else if ( props[
"placement"] ==
"lastvertex" )
786 else if ( props[
"placement"] ==
"firstvertex" )
788 else if ( props[
"placement"] ==
"centralpoint" )
790 else if ( props[
"placement"] ==
"curvepoint" )
808 mMarker->setColor( color );
814 mMarker->setAlpha( context.
alpha() );
822 mMarker->setRenderHints( hints );
853 if ( placementString.
compare(
"vertex", Qt::CaseInsensitive ) == 0 )
857 else if ( placementString.
compare(
"lastvertex", Qt::CaseInsensitive ) == 0 )
859 placement = LastVertex;
861 else if ( placementString.
compare(
"firstvertex", Qt::CaseInsensitive ) == 0 )
863 placement = FirstVertex;
865 else if ( placementString.
compare(
"centerpoint", Qt::CaseInsensitive ) == 0 )
867 placement = CentralPoint;
869 else if ( placementString.
compare(
"curvepoint", Qt::CaseInsensitive ) == 0 )
871 placement = CurvePoint;
875 placement = Interval;
882 if ( placement == Interval )
883 renderPolylineInterval( points, context );
884 else if ( placement == CentralPoint )
885 renderPolylineCentral( points, context );
887 renderPolylineVertex( points, context, placement );
894 for (
int part = 0; part < mline.
count(); ++part )
896 const QPolygonF &points2 = mline[ part ];
898 if ( placement == Interval )
899 renderPolylineInterval( points2, context );
900 else if ( placement == CentralPoint )
901 renderPolylineCentral( points2, context );
903 renderPolylineVertex( points2, context, placement );
920 for (
int i = 0; i < rings->
size(); ++i )
938 double lengthLeft = 0;
939 bool first = mOffsetAlongLine ?
false :
true;
942 double interval = mInterval;
953 double offsetAlongLine = mOffsetAlongLine;
963 for (
int i = 1; i < points.
count(); ++i )
971 MyLine l( lastPt, pt );
972 QPointF diff = l.diffForInterval( painterUnitInterval );
976 double c = 1 - lengthLeft / painterUnitInterval;
978 lengthLeft += l.length();
983 mMarker->setLineAngle( l.angle() * 180 /
M_PI );
989 mMarker->renderPoint( lastPt, context.
feature(), rc, -1, context.
selected() );
994 while ( lengthLeft > painterUnitInterval )
998 lengthLeft -= painterUnitInterval;
999 mMarker->renderPoint( lastPt, context.
feature(), rc, -1, context.
selected() );
1010 double a1 = MyLine( prevPt, pt ).angle();
1011 double a2 = MyLine( pt, nextPt ).angle();
1012 double unitX = cos( a1 ) + cos( a2 ), unitY = sin( a1 ) + sin( a2 );
1014 return atan2( unitY, unitX );
1024 double origAngle = mMarker->angle();
1026 bool isRing =
false;
1028 double offsetAlongLine = mOffsetAlongLine;
1056 x = vPoint.
x(), y = vPoint.
y();
1065 if ( mRotateMarker )
1068 mMarker->setAngle( angle * 180 /
M_PI );
1070 mMarker->renderPoint( mapPoint, context.
feature(), rc, -1, context.
selected() );
1076 if ( placement == FirstVertex )
1081 else if ( placement == LastVertex )
1083 i = points.
count() - 1;
1084 maxCount = points.
count();
1086 else if ( placement == Vertex )
1089 maxCount = points.
count();
1098 if ( offsetAlongLine > 0 && ( placement == FirstVertex || placement == LastVertex ) )
1101 distance = placement == FirstVertex ? offsetAlongLine : -offsetAlongLine;
1102 renderOffsetVertexAlongLine( points, i, distance, context );
1104 mMarker->setAngle( origAngle );
1108 for ( ; i < maxCount; ++i )
1110 if ( isRing && placement == Vertex && i == points.
count() - 1 )
1115 if ( mRotateMarker )
1117 double angle = markerAngle( points, isRing, i );
1118 mMarker->setAngle( origAngle + angle * 180 /
M_PI );
1121 mMarker->renderPoint( points.
at( i ), context.
feature(), rc, -1, context.
selected() );
1125 mMarker->setAngle( origAngle );
1131 const QPointF& pt = points[vertex];
1133 if ( isRing || ( vertex > 0 && vertex < points.
count() - 1 ) )
1135 int prevIndex = vertex - 1;
1136 int nextIndex = vertex + 1;
1138 if ( isRing && ( vertex == 0 || vertex == points.
count() - 1 ) )
1140 prevIndex = points.
count() - 2;
1145 while ( prevIndex >= 0 )
1147 prevPoint = points[ prevIndex ];
1148 if ( prevPoint != pt )
1155 while ( nextIndex < points.
count() )
1157 nextPoint = points[ nextIndex ];
1158 if ( nextPoint != pt )
1165 if ( prevIndex >= 0 && nextIndex < points.
count() )
1174 while ( vertex < points.
size() - 1 )
1176 const QPointF& nextPt = points[vertex+1];
1179 angle = MyLine( pt, nextPt ).angle();
1188 while ( vertex >= 1 )
1190 const QPointF& prevPt = points[vertex-1];
1193 angle = MyLine( prevPt, pt ).angle();
1209 double origAngle = mMarker->angle();
1213 if ( mRotateMarker )
1215 bool isRing =
false;
1218 double angle = markerAngle( points, isRing, vertex );
1219 mMarker->setAngle( origAngle + angle * 180 /
M_PI );
1221 mMarker->renderPoint( points[vertex], context.
feature(), rc, -1, context.
selected() );
1225 int pointIncrement = distance > 0 ? 1 : -1;
1226 QPointF previousPoint = points[vertex];
1227 int startPoint = distance > 0 ? qMin( vertex + 1, points.
count() - 1 ) : qMax( vertex - 1, 0 );
1228 int endPoint = distance > 0 ? points.
count() - 1 : 0;
1229 double distanceLeft = qAbs( distance );
1231 for (
int i = startPoint; pointIncrement > 0 ? i <= endPoint : i >= endPoint; i += pointIncrement )
1233 const QPointF& pt = points[i];
1235 if ( previousPoint == pt )
1239 MyLine l( previousPoint, pt );
1241 if ( distanceLeft < l.length() )
1244 QPointF markerPoint = previousPoint + l.diffForInterval( distanceLeft );
1246 if ( mRotateMarker )
1248 mMarker->setAngle( origAngle + ( l.angle() * 180 /
M_PI ) );
1250 mMarker->renderPoint( markerPoint, context.
feature(), rc, -1, context.
selected() );
1254 distanceLeft -= l.length();
1270 for ( ++it; it != points.
constEnd(); ++it )
1272 length += sqrt(( last.
x() - it->x() ) * ( last.
x() - it->x() ) +
1273 ( last.
y() - it->y() ) * ( last.
y() - it->y() ) );
1280 qreal last_at = 0, next_at = 0;
1283 for ( ++it; it != points.
constEnd(); ++it )
1286 next_at += sqrt(( last.
x() - it->x() ) * ( last.
x() - it->x() ) +
1287 ( last.
y() - it->y() ) * ( last.
y() - it->y() ) );
1288 if ( next_at >= length / 2 )
1296 MyLine l( last, next );
1297 qreal k = ( length * 0.5 - last_at ) / ( next_at - last_at );
1298 QPointF pt = last + ( next - last ) * k;
1301 double origAngle = mMarker->angle();
1302 if ( mRotateMarker )
1303 mMarker->setAngle( origAngle + l.angle() * 180 /
M_PI );
1305 if ( mRotateMarker )
1306 mMarker->setAngle( origAngle );
1314 map[
"rotate"] = ( mRotateMarker ?
"1" :
"0" );
1324 if ( mPlacement == Vertex )
1325 map[
"placement"] =
"vertex";
1326 else if ( mPlacement == LastVertex )
1327 map[
"placement"] =
"lastvertex";
1328 else if ( mPlacement == FirstVertex )
1329 map[
"placement"] =
"firstvertex";
1330 else if ( mPlacement == CentralPoint )
1331 map[
"placement"] =
"centralpoint";
1332 else if ( mPlacement == CurvePoint )
1333 map[
"placement"] =
"curvepoint";
1335 map[
"placement"] =
"interval";
1356 mColor = mMarker->color();
1380 for (
int i = 0; i < mMarker->symbolLayerCount(); i++ )
1383 if ( !props.
value(
"uom",
"" ).isEmpty() )
1391 switch ( mPlacement )
1411 if ( !mRotateMarker )
1437 if ( !gap.isEmpty() )
1458 if ( strokeElem.
isNull() )
1462 if ( graphicStrokeElem.
isNull() )
1466 bool rotateMarker =
true;
1472 if ( it.key() ==
"placement" )
1474 if ( it.value() ==
"points" ) placement = Vertex;
1475 else if ( it.value() ==
"firstPoint" ) placement = FirstVertex;
1476 else if ( it.value() ==
"lastPoint" ) placement = LastVertex;
1477 else if ( it.value() ==
"centralPoint" ) placement = CentralPoint;
1479 else if ( it.value() ==
"rotateMarker" )
1481 rotateMarker = it.value() ==
"0";
1498 double interval = 0.0;
1510 if ( !perpOffsetElem.
isNull() )
1528 mMarker->setSize( width );
1535 mMarker->setDataDefinedSize( *dataDefined );
1542 return mMarker->size();
1548 mIntervalUnit = unit;
1550 mOffsetAlongLineUnit = unit;
1556 if ( mIntervalUnit != unit ||
mOffsetUnit != unit || mOffsetAlongLineUnit != unit )
1566 mIntervalMapUnitScale = scale;
1568 mOffsetAlongLineMapUnitScale = scale;
1586 attr.
unite( mMarker->usedAttributes() );
1592 return ( mMarker->size() / 2.0 ) +
mOffset;
virtual QSet< QString > usedAttributes() const
Returns the set of attributes referenced by the layer.
static double mapUnitScaleFactor(double scaleDenominator, QgsSymbolV2::OutputUnit symbolUnits, QGis::UnitType mapUnits)
void setIntervalUnit(QgsSymbolV2::OutputUnit unit)
static QString encodeOutputUnit(QgsSymbolV2::OutputUnit unit)
const QgsCurveV2 * exteriorRing() const
#define DEFAULT_SIMPLELINE_PENSTYLE
#define DEFAULT_MARKERLINE_ROTATE
static const QString EXPR_JOINSTYLE
double estimateMaxBleed() const override
Returns the estimated maximum distance which the layer style will bleed outside the drawn shape...
void setStyle(Qt::PenStyle style)
double dxfWidth(const QgsDxfExport &e, QgsSymbolV2RenderContext &context) const override
OutputUnit
The unit of the output.
float threshold() const
Gets the simplification threshold of the vector layer managed.
QVector< qreal > dxfCustomDashPattern(QgsSymbolV2::OutputUnit &unit) const override
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)
A container class for data source field mapping or expression.
bool contains(const Key &key) const
virtual double width() const
void setClipPath(const QPainterPath &path, Qt::ClipOperation operation)
double markerAngle(const QPolygonF &points, bool isRing, int vertex)
void renderPolyline(const QPolygonF &points, QgsSymbolV2RenderContext &context) override
static double _averageAngle(QPointF prevPt, QPointF pt, QPointF nextPt)
void setRenderHint(RenderHint hint, bool on)
QDomNode appendChild(const QDomNode &newChild)
#define DEFAULT_MARKERLINE_INTERVAL
QgsStringMap properties() const override
Should be reimplemented by subclasses to return a string map that contains the configuration informat...
double x() const
Returns the point's x-coordinate.
static QDomElement createVendorOptionElement(QDomDocument &doc, const QString &name, const QString &value)
RenderHints renderHints() const
static void createGeometryElement(QDomDocument &doc, QDomElement &element, const QString &geomFunc)
QColor selectionColor() const
const QgsVectorSimplifyMethod & vectorSimplifyMethod() const
Added in QGIS v2.4.
QString nodeValue() const
virtual void setWidth(double width) override
void setCustomDashPatternUnit(QgsSymbolV2::OutputUnit unit)
QStringList split(const QString &sep, SplitBehavior behavior, Qt::CaseSensitivity cs) const
static QString encodeColor(const QColor &color)
Placement
Defines how/where the marker should be placed on the line.
QgsMapUnitScale mCustomDashPatternMapUnitScale
void renderPolyline(const QPolygonF &points, QgsSymbolV2RenderContext &context) override
static const QString EXPR_WIDTH
static const QString EXPR_CUSTOMDASH
void drawPolyline(const QPointF *points, int pointCount)
static QgsStringMap getVendorOptionList(QDomElement &element)
virtual void writeSldMarker(QDomDocument &doc, QDomElement &element, const QgsStringMap &props) const
QGis::UnitType mapUnits() const
Retrieve map units.
const_iterator constEnd() const
void startRender(QgsSymbolV2RenderContext &context) override
const T & at(int i) const
void setUseCustomDashPattern(bool b)
static QVector< qreal > decodeRealVector(const QString &s)
void renderPolylineInterval(const QPolygonF &points, QgsSymbolV2RenderContext &context)
QgsSymbolV2::OutputUnit outputUnit() const override
QVector< qreal > customDashVector() const
bool setSubSymbol(QgsSymbolV2 *symbol) override
set layer's subsymbol. takes ownership of the passed symbol
QGis::GeometryType type() const
Returns type of the geometry as a QGis::GeometryType.
void setPenJoinStyle(Qt::PenJoinStyle style)
void setOriginalValueVariable(const QVariant &value)
Sets the original value variable value for data defined symbology.
double dxfOffset(const QgsDxfExport &e, QgsSymbolV2RenderContext &context) const override
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.
void setJoinStyle(Qt::PenJoinStyle style)
Qt::PenCapStyle mPenCapStyle
static Qt::PenJoinStyle decodePenJoinStyle(const QString &str)
void copyPaintEffect(QgsSymbolLayerV2 *destLayer) const
Copies paint effect of this layer to another symbol layer.
static const bool selectionIsOpaque
static QString encodeMapUnitScale(const QgsMapUnitScale &mapUnitScale)
virtual bool hasDataDefinedProperty(const QString &property) const
Checks whether the layer has a matching data defined property and if that property is currently activ...
static const QString EXPR_OFFSET_ALONG_LINE
QgsMapUnitScale mWidthMapUnitScale
void setIntervalMapUnitScale(const QgsMapUnitScale &scale)
const QgsCoordinateTransform * coordinateTransform() const
QString layerType() const override
Returns a string that represents this layer type.
double toDouble(bool *ok) const
void setMapUnitScale(const QgsMapUnitScale &scale) override
QgsMapUnitScale mOffsetMapUnitScale
bool qgsDoubleNear(double a, double b, double epsilon=4 *DBL_EPSILON)
static const QString EXPR_OFFSET
Qt::PenStyle penStyle() const
QgsSymbolV2::OutputUnit mOffsetUnit
void setWidthUnit(QgsSymbolV2::OutputUnit unit)
void setOffsetAlongLine(double offsetAlongLine)
Sets the the offset along the line for the marker placement.
void setInterval(double interval)
The interval between individual markers.
double y() const
Returns the point's y-coordinate.
QgsMapUnitScale mapUnitScale() const override
static QgsSymbolV2::OutputUnit decodeOutputUnit(const QString &str)
qreal alpha() const
Get alpha transparency 1 for opaque, 0 for invisible.
bool mUseCustomDashPattern
void setDrawInsidePolygon(bool drawInsidePolygon)
static QString encodePenStyle(Qt::PenStyle style)
void setCapStyle(Qt::PenCapStyle style)
Perform transforms between map coordinates and device coordinates.
QgsSimpleLineSymbolLayerV2 * clone() const override
Shall be reimplemented by subclasses to create a deep copy of the instance.
Mixed units in symbol layers.
void transformInPlace(double &x, double &y) const
Transform device coordinates to map coordinates.
static QgsSymbolLayerV2 * createMarkerLayerFromSld(QDomElement &element)
The output shall be in millimeters.
static const QString EXPR_PLACEMENT
QString number(int n, int base)
int count(const T &value) const
void append(const T &value)
void setDashPattern(const QVector< qreal > &pattern)
void addPolygon(const QPolygonF &polygon)
void setOffset(double offset)
void setOutputUnit(QgsSymbolV2::OutputUnit unit) override
void setMapUnitScale(const QgsMapUnitScale &scale) override
const QgsFeature * feature() const
Current feature being rendered - may be null.
void renderPolygonOutline(const QPolygonF &points, QList< QPolygonF > *rings, QgsSymbolV2RenderContext &context) override
QgsSymbolV2::OutputUnit outputUnit() const override
static double convertToPainterUnits(const QgsRenderContext &c, double size, QgsSymbolV2::OutputUnit unit, const QgsMapUnitScale &scale=QgsMapUnitScale())
Converts a size from the specied units to painter units.
Utility class for identifying a unique vertex within a geometry.
double z() const
Returns the point's z-coordinate.
The geometries can be rendered with 'AntiAliasing' disabled because of it is '1-pixel size'...
Qt::PenJoinStyle mPenJoinStyle
static QgsSymbolLayerV2 * create(const QgsStringMap &properties=QgsStringMap())
void setPen(const QColor &color)
QgsSymbolV2::OutputUnit mWidthUnit
void setAttribute(const QString &name, const QString &value)
void setWidthMapUnitScale(const QgsMapUnitScale &scale)
QVector< qreal > mCustomDashVector
Vector with an even number of entries for the.
Point geometry type, with support for z-dimension and m-values.
#define DEFAULT_SIMPLELINE_WIDTH
static QString encodePenJoinStyle(Qt::PenJoinStyle style)
void renderPolygonOutline(const QPolygonF &points, QList< QPolygonF > *rings, QgsSymbolV2RenderContext &context) override
static QgsSymbolLayerV2 * createFromSld(QDomElement &element)
Create a new MarkerLineSymbolLayerV2 from SLD.
#define DEFAULT_SIMPLELINE_CAPSTYLE
#define DEFAULT_SIMPLELINE_JOINSTYLE
void setWidthF(qreal width)
virtual bool hasCurvedSegments() const
Returns true if the geometry contains curved segments.
static Qt::PenCapStyle decodePenCapStyle(const QString &str)
void setBrush(const QBrush &brush)
QString layerType() const override
Returns a string that represents this layer type.
double rasterScaleFactor() const
void stopRender(QgsSymbolV2RenderContext &context) override
virtual QColor color() const
The fill color.
void setOffsetAlongLineMapUnitScale(const QgsMapUnitScale &scale)
Sets the map unit scale used for calculating the offset in map units along line for markers...
virtual bool nextVertex(QgsVertexId &id, QgsPointV2 &vertex) const =0
Returns next vertex id and coordinates.
void toSld(QDomDocument &doc, QDomElement &element, const QgsStringMap &props) const override
void setOffsetAlongLineUnit(QgsSymbolV2::OutputUnit unit)
Sets the unit used for calculating the offset along line for markers.
void setColor(const QColor &color)
virtual Q_DECL_DEPRECATED void prepareExpressions(const QgsFields *fields, double scale=-1.0)
Prepares all data defined property expressions for evaluation.
double estimateMaxBleed() const override
Returns the estimated maximum distance which the layer style will bleed outside the drawn shape...
QgsSymbolV2 * subSymbol() override
void setPenCapStyle(Qt::PenCapStyle style)
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)
virtual bool hasDataDefinedProperties() const
Checks whether the layer has any associated data defined properties.
void setCustomDashVector(const QVector< qreal > &vector)
static QgsSymbolLayerV2 * create(const QgsStringMap &properties=QgsStringMap())
Create a new MarkerLineSymbolLayerV2.
static Qt::PenStyle decodePenStyle(const QString &str)
static const QString EXPR_CAPSTYLE
QgsMarkerLineSymbolLayerV2 * clone() const override
Shall be reimplemented by subclasses to create a deep copy of the instance.
QString ogrFeatureStyle(double mmScaleFactor, double mapUnitScaleFactor) const override
QDomText createTextNode(const QString &value)
double ANALYSIS_EXPORT angle(Point3D *p1, Point3D *p2, Point3D *p3, Point3D *p4)
Calculates the angle between two segments (in 2 dimension, z-values are ignored)
void setOffsetUnit(QgsSymbolV2::OutputUnit unit)
static const QString EXPR_COLOR
void setDataDefinedProperty(const QString &property, QgsDataDefined *dataDefined) override
Sets a data defined property for the layer.
static QString encodeRealVector(const QVector< qreal > &v)
QgsSymbolV2::OutputUnit outputUnit() const override
QgsSymbolV2::OutputUnit mCustomDashPatternUnit
virtual QString layerType() const =0
Returns a string that represents this layer type.
const QgsCurveV2 * interiorRing(int i) const
double symbologyScaleDenominator() const
Retrieve reference scale for output.
~QgsMarkerLineSymbolLayerV2()
virtual double vertexAngle(QgsVertexId vertex) const =0
Returns approximate angle at a vertex.
static QgsSymbolLayerV2 * createFromSld(QDomElement &element)
const T & at(int i) const
#define DEFAULT_SIMPLELINE_COLOR
const_iterator constBegin() const
Contains information about the context of a rendering operation.
QgsMapUnitScale mapUnitScale() const override
QDomNode firstChild() const
void setMapUnitScale(const QgsMapUnitScale &scale) override
void drawPath(const QPainterPath &path)
static bool createFunctionElement(QDomDocument &doc, QDomElement &element, const QString &function)
QSet< T > & unite(const QSet< T > &other)
void setPlacement(Placement p)
The placement of the markers.
Struct for storing maximum and minimum scales for measurements in map units.
Qt::PenStyle dxfPenStyle() const override
QList< QPolygonF > offsetLine(QPolygonF polyline, double dist, QGis::GeometryType geometryType)
calculate geometry shifted by a specified distance
QgsSimpleLineSymbolLayerV2(const QColor &color=DEFAULT_SIMPLELINE_COLOR, double width=DEFAULT_SIMPLELINE_WIDTH, Qt::PenStyle penStyle=DEFAULT_SIMPLELINE_PENSTYLE)
void setCustomDashPatternMapUnitScale(const QgsMapUnitScale &scale)
const QgsAbstractGeometryV2 * geometry() const
Returns pointer to the unsegmentized geometry.
void stopRender(QgsSymbolV2RenderContext &context) override
QgsRenderContext & renderContext()
void setOutputUnit(QgsSymbolV2::OutputUnit unit) override
QDomElement firstChildElement(const QString &tagName) const
QColor dxfColor(QgsSymbolV2RenderContext &context) const override
int count(const T &value) const
QgsMapUnitScale mapUnitScale() const override
void setOutputUnit(QgsSymbolV2::OutputUnit unit) override
SimplifyHints simplifyHints() const
Gets the simplification hints of the vector layer managed.
const QgsGeometry * constGeometry() const
Gets a const pointer to the geometry object associated with this feature.
void setColor(const QColor &color) override
The fill color.
const QgsMapToPixel & mapToPixel() const
const QgsFields * fields() const
Fields of the layer.
void push_back(const T &value)
void setAlphaF(qreal alpha)
double toDouble(bool *ok) const
static QColor decodeColor(const QString &str)
Curve polygon geometry type.
void restoreDataDefinedProperties(const QgsStringMap &stringMap)
Restores all data defined properties from string map.
static QgsMapUnitScale decodeMapUnitScale(const QString &str)
const_iterator constEnd() const
QDomElement createElement(const QString &tagName)
const_iterator constBegin() const
void toSld(QDomDocument &doc, QDomElement &element, const QgsStringMap &props) const override
void startRender(QgsSymbolV2RenderContext &context) override
QgsMarkerLineSymbolLayerV2(bool rotateMarker=DEFAULT_MARKERLINE_ROTATE, double interval=DEFAULT_MARKERLINE_INTERVAL)
void setOffsetMapUnitScale(const QgsMapUnitScale &scale)
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...
int compare(const QString &other) const
static const QString EXPR_LINE_STYLE
virtual bool setSubSymbol(QgsSymbolV2 *symbol)
set layer's subsymbol. takes ownership of the passed symbol
void saveDataDefinedProperties(QgsStringMap &stringMap) const
Saves all data defined properties to a string map.
static const QString EXPR_INTERVAL
void renderPolylineCentral(const QPolygonF &points, QgsSymbolV2RenderContext &context)
void setGeometry(const QgsAbstractGeometryV2 *geometry)
Sets pointer to original (unsegmentized) geometry.
virtual double width() const override
QgsSymbolV2::OutputUnit widthUnit() const
QSet< QString > usedAttributes() const override
Returns the set of attributes referenced by the layer.
Qt::PenJoinStyle penJoinStyle() const
void renderPolylineVertex(const QPolygonF &points, QgsSymbolV2RenderContext &context, Placement placement=Vertex)
void copyDataDefinedProperties(QgsSymbolLayerV2 *destLayer) const
Copies all data defined properties of this layer to another symbol layer.
Qt::PenCapStyle penCapStyle() const
const T value(const Key &key) const
static QString encodePenCapStyle(Qt::PenCapStyle style)
QgsStringMap properties() const override
Should be reimplemented by subclasses to return a string map that contains the configuration informat...
virtual Q_DECL_DEPRECATED void setDataDefinedProperty(const QString &property, const QString &expressionString)
Sets a data defined expression for a property.
virtual Q_DECL_DEPRECATED QVariant evaluateDataDefinedProperty(const QString &property, const QgsFeature *feature, const QVariant &defaultVal=QVariant(), bool *ok=nullptr) const
Evaluates the matching data defined property and returns the calculated value.