Skip to content

Commit 586d59a

Browse files
committed
[FEATURE] Add option to map unit scaling for limiting size in mm
Previously only the option to limit the scale range of the scaling was available. Now you can also choose to limit the corresponding rendered size in mm.
1 parent b693020 commit 586d59a

18 files changed

Lines changed: 832 additions & 162 deletions

python/core/qgsmapunitscale.sip

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,15 @@ class QgsMapUnitScale
2525
/** The maximum scale, or 0.0 if unset */
2626
double maxScale;
2727

28+
/** Whether the minimum size in mm should be respected */
29+
bool minSizeMMEnabled;
30+
/** The minimum size in millimeters, or 0.0 if unset */
31+
double minSizeMM;
32+
/** Whether the maximum size in mm should be respected */
33+
bool maxSizeMMEnabled;
34+
/** The maximum size in millimeters, or 0.0 if unset */
35+
double maxSizeMM;
36+
2837
/** Computes a map units per pixel scaling factor, respecting the minimum and maximum scales
2938
* set for the object.
3039
* @param c render context

python/core/symbology-ng/qgssymbollayerv2utils.sip

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -311,8 +311,27 @@ class QgsSymbolLayerV2Utils
311311
*/
312312
static QColor parseColorWithAlpha( const QString colorStr, bool &containsAlpha, bool strictEval = false );
313313

314-
/** Returns the line width scale factor depending on the unit and the paint device*/
314+
/** Returns the line width scale factor depending on the unit and the paint device.
315+
* Consider using convertToPainterUnits() instead, as convertToPainterUnits() respects the size limits specified by the scale
316+
* parameter.
317+
* @param c render context
318+
* @param u units to convert from
319+
* @param scale map unit scale, specifying limits for the map units to convert from
320+
* @see convertToPainterUnits()
321+
*/
315322
static double lineWidthScaleFactor( const QgsRenderContext& c, QgsSymbolV2::OutputUnit u, const QgsMapUnitScale& scale = QgsMapUnitScale() );
323+
324+
/** Converts a size from the specied units to painter units. The conversion respects the limits
325+
* specified by the optional scale parameter.
326+
* @param c render context
327+
* @param size size to convert
328+
* @param unit units for specified size
329+
* @param scale map unit scale
330+
* @note added in QGIS 2.12
331+
* @see lineWidthScaleFactor
332+
*/
333+
static double convertToPainterUnits( const QgsRenderContext&c, double size, QgsSymbolV2::OutputUnit unit, const QgsMapUnitScale& scale = QgsMapUnitScale() );
334+
316335
/** Returns scale factor painter units -> pixel dimensions*/
317336
static double pixelSizeScaleFactor( const QgsRenderContext& c, QgsSymbolV2::OutputUnit u, const QgsMapUnitScale& scale = QgsMapUnitScale() );
318337
/** Returns scale factor painter units -> map units*/

src/core/layertree/qgslayertreemodellegendnode.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -321,7 +321,7 @@ QSizeF QgsSymbolV2LegendNode::drawSymbol( const QgsLegendSettings& settings, Ite
321321
if ( QgsMarkerSymbolV2* markerSymbol = dynamic_cast<QgsMarkerSymbolV2*>( s ) )
322322
{
323323
// allow marker symbol to occupy bigger area if necessary
324-
size = markerSymbol->size() * QgsSymbolLayerV2Utils::lineWidthScaleFactor( context, s->outputUnit(), s->mapUnitScale() ) / context.scaleFactor();
324+
size = QgsSymbolLayerV2Utils::convertToPainterUnits( context, markerSymbol->size(), s->outputUnit(), s->mapUnitScale() ) / context.scaleFactor();
325325
height = size;
326326
width = size;
327327
if ( width < settings.symbolSize().width() )

src/core/qgsmapunitscale.h

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,13 +38,29 @@ class CORE_EXPORT QgsMapUnitScale
3838
* @param minScale minimum allowed scale, or 0.0 if no minimum scale set
3939
* @param maxScale maximum allowed scale, or 0.0 if no maximum scale set
4040
*/
41-
QgsMapUnitScale( double minScale = 0.0, double maxScale = 0.0 ) : minScale( minScale ), maxScale( maxScale ) {}
41+
QgsMapUnitScale( double minScale = 0.0, double maxScale = 0.0 )
42+
: minScale( minScale )
43+
, maxScale( maxScale )
44+
, minSizeMMEnabled( false )
45+
, minSizeMM( 0.0 )
46+
, maxSizeMMEnabled( false )
47+
, maxSizeMM( 0.0 )
48+
{}
4249

4350
/** The minimum scale, or 0.0 if unset */
4451
double minScale;
4552
/** The maximum scale, or 0.0 if unset */
4653
double maxScale;
4754

55+
/** Whether the minimum size in mm should be respected */
56+
bool minSizeMMEnabled;
57+
/** The minimum size in millimeters, or 0.0 if unset */
58+
double minSizeMM;
59+
/** Whether the maximum size in mm should be respected */
60+
bool maxSizeMMEnabled;
61+
/** The maximum size in millimeters, or 0.0 if unset */
62+
double maxSizeMM;
63+
4864
/** Computes a map units per pixel scaling factor, respecting the minimum and maximum scales
4965
* set for the object.
5066
* @param c render context
@@ -67,12 +83,16 @@ class CORE_EXPORT QgsMapUnitScale
6783

6884
bool operator==( const QgsMapUnitScale& other ) const
6985
{
70-
return minScale == other.minScale && maxScale == other.maxScale;
86+
return minScale == other.minScale && maxScale == other.maxScale
87+
&& minSizeMMEnabled == other.minSizeMMEnabled
88+
&& minSizeMM == other.minSizeMM
89+
&& maxSizeMMEnabled == other.maxSizeMMEnabled
90+
&& maxSizeMM == other.maxSizeMM;
7191
}
7292

7393
bool operator!=( const QgsMapUnitScale& other ) const
7494
{
75-
return minScale != other.minScale || maxScale != other.maxScale;
95+
return !operator==( other );
7696
}
7797
};
7898

src/core/symbology-ng/qgsellipsesymbollayerv2.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -208,7 +208,7 @@ void QgsEllipseSymbolLayerV2::renderPoint( const QPointF& point, QgsSymbolV2Rend
208208
if ( hasDataDefinedProperty( QgsSymbolLayerV2::EXPR_OUTLINE_WIDTH ) )
209209
{
210210
double width = evaluateDataDefinedProperty( QgsSymbolLayerV2::EXPR_OUTLINE_WIDTH, context, mOutlineWidth ).toDouble();
211-
width *= QgsSymbolLayerV2Utils::lineWidthScaleFactor( context.renderContext(), mOutlineWidthUnit, mOutlineWidthMapUnitScale );
211+
width = QgsSymbolLayerV2Utils::convertToPainterUnits( context.renderContext(), width, mOutlineWidthUnit, mOutlineWidthMapUnitScale );
212212
mPen.setWidthF( width );
213213
}
214214
if ( hasDataDefinedProperty( QgsSymbolLayerV2::EXPR_OUTLINE_STYLE ) )
@@ -295,7 +295,7 @@ void QgsEllipseSymbolLayerV2::startRender( QgsSymbolV2RenderContext& context )
295295
}
296296
mPen.setColor( mOutlineColor );
297297
mPen.setStyle( mOutlineStyle );
298-
mPen.setWidthF( mOutlineWidth * QgsSymbolLayerV2Utils::lineWidthScaleFactor( context.renderContext(), mOutlineWidthUnit, mOutlineWidthMapUnitScale ) );
298+
mPen.setWidthF( QgsSymbolLayerV2Utils::convertToPainterUnits( context.renderContext(), mOutlineWidth, mOutlineWidthUnit, mOutlineWidthMapUnitScale ) );
299299
mBrush.setColor( mFillColor );
300300
prepareExpressions( context );
301301
}
@@ -476,7 +476,7 @@ void QgsEllipseSymbolLayerV2::preparePath( const QString& symbolName, QgsSymbolV
476476
{
477477
*scaledWidth = width;
478478
}
479-
width *= QgsSymbolLayerV2Utils::lineWidthScaleFactor( ct, mSymbolWidthUnit, mSymbolHeightMapUnitScale );
479+
width = QgsSymbolLayerV2Utils::convertToPainterUnits( ct, width, mSymbolWidthUnit, mSymbolHeightMapUnitScale );
480480

481481
double height = 0;
482482
if ( hasDataDefinedProperty( QgsSymbolLayerV2::EXPR_HEIGHT ) ) //1. priority: data defined setting on symbol layer level
@@ -495,7 +495,7 @@ void QgsEllipseSymbolLayerV2::preparePath( const QString& symbolName, QgsSymbolV
495495
{
496496
*scaledHeight = height;
497497
}
498-
height *= QgsSymbolLayerV2Utils::lineWidthScaleFactor( ct, mSymbolHeightUnit, mSymbolHeightMapUnitScale );
498+
height = QgsSymbolLayerV2Utils::convertToPainterUnits( ct, height, mSymbolHeightUnit, mSymbolHeightMapUnitScale );
499499

500500
if ( symbolName == "circle" )
501501
{

src/core/symbology-ng/qgsfillsymbollayerv2.cpp

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ void QgsSimpleFillSymbolLayerV2::applyDataDefinedSymbology( QgsSymbolV2RenderCon
103103
if ( hasDataDefinedProperty( QgsSymbolLayerV2::EXPR_WIDTH_BORDER ) )
104104
{
105105
double width = evaluateDataDefinedProperty( QgsSymbolLayerV2::EXPR_WIDTH_BORDER, context, mBorderWidth ).toDouble();
106-
width *= QgsSymbolLayerV2Utils::lineWidthScaleFactor( context.renderContext(), mBorderWidthUnit, mBorderWidthMapUnitScale );
106+
width = QgsSymbolLayerV2Utils::convertToPainterUnits( context.renderContext(), width, mBorderWidthUnit, mBorderWidthMapUnitScale );
107107
pen.setWidthF( width );
108108
selPen.setWidthF( width );
109109
}
@@ -247,7 +247,7 @@ void QgsSimpleFillSymbolLayerV2::startRender( QgsSymbolV2RenderContext& context
247247
mPen = QPen( borderColor );
248248
mSelPen = QPen( selPenColor );
249249
mPen.setStyle( mBorderStyle );
250-
mPen.setWidthF( mBorderWidth * QgsSymbolLayerV2Utils::lineWidthScaleFactor( context.renderContext(), mBorderWidthUnit, mBorderWidthMapUnitScale ) );
250+
mPen.setWidthF( QgsSymbolLayerV2Utils::convertToPainterUnits( context.renderContext(), mBorderWidth, mBorderWidthUnit, mBorderWidthMapUnitScale ) );
251251
mPen.setJoinStyle( mPenJoinStyle );
252252
prepareExpressions( context );
253253
}
@@ -273,8 +273,8 @@ void QgsSimpleFillSymbolLayerV2::renderPolygon( const QPolygonF& points, QList<Q
273273
QPointF offset;
274274
if ( !mOffset.isNull() )
275275
{
276-
offset.setX( mOffset.x() * QgsSymbolLayerV2Utils::lineWidthScaleFactor( context.renderContext(), mOffsetUnit, mOffsetMapUnitScale ) );
277-
offset.setY( mOffset.y() * QgsSymbolLayerV2Utils::lineWidthScaleFactor( context.renderContext(), mOffsetUnit, mOffsetMapUnitScale ) );
276+
offset.setX( QgsSymbolLayerV2Utils::convertToPainterUnits( context.renderContext(), mOffset.x(), mOffsetUnit, mOffsetMapUnitScale ) );
277+
offset.setY( QgsSymbolLayerV2Utils::convertToPainterUnits( context.renderContext(), mOffset.y(), mOffsetUnit, mOffsetMapUnitScale ) );
278278
p->translate( offset );
279279
}
280280

@@ -831,8 +831,8 @@ void QgsGradientFillSymbolLayerV2::renderPolygon( const QPolygonF& points, QList
831831
QPointF offset;
832832
if ( !mOffset.isNull() )
833833
{
834-
offset.setX( mOffset.x() * QgsSymbolLayerV2Utils::lineWidthScaleFactor( context.renderContext(), mOffsetUnit, mOffsetMapUnitScale ) );
835-
offset.setY( mOffset.y() * QgsSymbolLayerV2Utils::lineWidthScaleFactor( context.renderContext(), mOffsetUnit, mOffsetMapUnitScale ) );
834+
offset.setX( QgsSymbolLayerV2Utils::convertToPainterUnits( context.renderContext(), mOffset.x(), mOffsetUnit, mOffsetMapUnitScale ) );
835+
offset.setY( QgsSymbolLayerV2Utils::convertToPainterUnits( context.renderContext(), mOffset.y(), mOffsetUnit, mOffsetMapUnitScale ) );
836836
p->translate( offset );
837837
}
838838

@@ -1118,8 +1118,8 @@ void QgsShapeburstFillSymbolLayerV2::renderPolygon( const QPolygonF& points, QLi
11181118
QPointF offset;
11191119
if ( !mOffset.isNull() )
11201120
{
1121-
offset.setX( mOffset.x() * QgsSymbolLayerV2Utils::lineWidthScaleFactor( context.renderContext(), mOffsetUnit, mOffsetMapUnitScale ) );
1122-
offset.setY( mOffset.y() * QgsSymbolLayerV2Utils::lineWidthScaleFactor( context.renderContext(), mOffsetUnit, mOffsetMapUnitScale ) );
1121+
offset.setX( QgsSymbolLayerV2Utils::convertToPainterUnits( context.renderContext(), mOffset.x(), mOffsetUnit, mOffsetMapUnitScale ) );
1122+
offset.setY( QgsSymbolLayerV2Utils::convertToPainterUnits( context.renderContext(), mOffset.y(), mOffsetUnit, mOffsetMapUnitScale ) );
11231123
p->translate( offset );
11241124
}
11251125
_renderPolygon( p, points, rings, context );
@@ -1238,8 +1238,8 @@ void QgsShapeburstFillSymbolLayerV2::renderPolygon( const QPolygonF& points, QLi
12381238
QPointF offset;
12391239
if ( !mOffset.isNull() )
12401240
{
1241-
offset.setX( mOffset.x() * QgsSymbolLayerV2Utils::lineWidthScaleFactor( context.renderContext(), mOffsetUnit, mOffsetMapUnitScale ) );
1242-
offset.setY( mOffset.y() * QgsSymbolLayerV2Utils::lineWidthScaleFactor( context.renderContext(), mOffsetUnit, mOffsetMapUnitScale ) );
1241+
offset.setX( QgsSymbolLayerV2Utils::convertToPainterUnits( context.renderContext(), mOffset.x(), mOffsetUnit, mOffsetMapUnitScale ) );
1242+
offset.setY( QgsSymbolLayerV2Utils::convertToPainterUnits( context.renderContext(), mOffset.y(), mOffsetUnit, mOffsetMapUnitScale ) );
12431243
p->translate( offset );
12441244
}
12451245

@@ -1888,7 +1888,7 @@ void QgsSVGFillSymbolLayer::applyPattern( QBrush& brush, const QString& svgFileP
18881888
else
18891889
{
18901890
bool fitsInCache = true;
1891-
double outlineWidth = svgOutlineWidth * QgsSymbolLayerV2Utils::lineWidthScaleFactor( context.renderContext(), svgOutlineWidthUnit, svgOutlineWidthMapUnitScale );
1891+
double outlineWidth = QgsSymbolLayerV2Utils::convertToPainterUnits( context.renderContext(), svgOutlineWidth, svgOutlineWidthUnit, svgOutlineWidthMapUnitScale );
18921892
const QImage& patternImage = QgsSvgCache::instance()->svgAsImage( svgFilePath, size, svgFillColor, svgOutlineColor, outlineWidth,
18931893
context.renderContext().scaleFactor(), context.renderContext().rasterScaleFactor(), fitsInCache );
18941894
if ( !fitsInCache )
@@ -3561,8 +3561,8 @@ void QgsRasterFillSymbolLayer::renderPolygon( const QPolygonF &points, QList<QPo
35613561
QPointF offset;
35623562
if ( !mOffset.isNull() )
35633563
{
3564-
offset.setX( mOffset.x() * QgsSymbolLayerV2Utils::lineWidthScaleFactor( context.renderContext(), mOffsetUnit, mOffsetMapUnitScale ) );
3565-
offset.setY( mOffset.y() * QgsSymbolLayerV2Utils::lineWidthScaleFactor( context.renderContext(), mOffsetUnit, mOffsetMapUnitScale ) );
3564+
offset.setX( QgsSymbolLayerV2Utils::convertToPainterUnits( context.renderContext(), mOffset.x(), mOffsetUnit, mOffsetMapUnitScale ) );
3565+
offset.setY( QgsSymbolLayerV2Utils::convertToPainterUnits( context.renderContext(), mOffset.y(), mOffsetUnit, mOffsetMapUnitScale ) );
35663566
p->translate( offset );
35673567
}
35683568
if ( mCoordinateMode == Feature )

src/core/symbology-ng/qgslinesymbollayerv2.cpp

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -190,7 +190,7 @@ void QgsSimpleLineSymbolLayerV2::startRender( QgsSymbolV2RenderContext& context
190190
QColor penColor = mColor;
191191
penColor.setAlphaF( mColor.alphaF() * context.alpha() );
192192
mPen.setColor( penColor );
193-
double scaledWidth = mWidth * QgsSymbolLayerV2Utils::lineWidthScaleFactor( context.renderContext(), mWidthUnit, mWidthMapUnitScale );
193+
double scaledWidth = QgsSymbolLayerV2Utils::convertToPainterUnits( context.renderContext(), mWidth, mWidthUnit, mWidthMapUnitScale );
194194
mPen.setWidthF( scaledWidth );
195195
if ( mUseCustomDashPattern && scaledWidth != 0 )
196196
{
@@ -211,7 +211,7 @@ void QgsSimpleLineSymbolLayerV2::startRender( QgsSymbolV2RenderContext& context
211211
for ( ; it != mCustomDashVector.constEnd(); ++it )
212212
{
213213
//the dash is specified in terms of pen widths, therefore the division
214-
scaledVector << ( *it ) * QgsSymbolLayerV2Utils::lineWidthScaleFactor( context.renderContext(), mCustomDashPatternUnit, mCustomDashPatternMapUnitScale ) / dashWidthDiv;
214+
scaledVector << QgsSymbolLayerV2Utils::convertToPainterUnits( context.renderContext(), ( *it ), mCustomDashPatternUnit, mCustomDashPatternMapUnitScale ) / dashWidthDiv;
215215
}
216216
mPen.setDashPattern( scaledVector );
217217
}
@@ -321,7 +321,7 @@ void QgsSimpleLineSymbolLayerV2::renderPolyline( const QPolygonF& points, QgsSym
321321
}
322322
else
323323
{
324-
double scaledOffset = offset * QgsSymbolLayerV2Utils::lineWidthScaleFactor( context.renderContext(), mOffsetUnit, mOffsetMapUnitScale );
324+
double scaledOffset = QgsSymbolLayerV2Utils::convertToPainterUnits( context.renderContext(), offset, mOffsetUnit, mOffsetMapUnitScale );
325325
QList<QPolygonF> mline = ::offsetLine( points, scaledOffset, context.feature() ? context.feature()->constGeometry()->type() : QGis::Line );
326326
for ( int part = 0; part < mline.count(); ++part )
327327
p->drawPolyline( mline[ part ] );
@@ -457,7 +457,7 @@ QgsSymbolLayerV2* QgsSimpleLineSymbolLayerV2::createFromSld( QDomElement &elemen
457457

458458
void QgsSimpleLineSymbolLayerV2::applySizeScale( QgsSymbolV2RenderContext& context, QPen& pen, QPen& selPen )
459459
{
460-
double scaledWidth = mWidth * QgsSymbolLayerV2Utils::lineWidthScaleFactor( context.renderContext(), mWidthUnit, mWidthMapUnitScale );
460+
double scaledWidth = QgsSymbolLayerV2Utils::convertToPainterUnits( context.renderContext(), mWidth, mWidthUnit, mWidthMapUnitScale );
461461
pen.setWidthF( scaledWidth );
462462
selPen.setWidthF( scaledWidth );
463463
}
@@ -471,8 +471,9 @@ void QgsSimpleLineSymbolLayerV2::applyDataDefinedSymbology( QgsSymbolV2RenderCon
471471
bool hasStrokeWidthExpression = false;
472472
if ( hasDataDefinedProperty( QgsSymbolLayerV2::EXPR_WIDTH ) )
473473
{
474-
double scaledWidth = evaluateDataDefinedProperty( QgsSymbolLayerV2::EXPR_WIDTH, context, mWidth ).toDouble()
475-
* QgsSymbolLayerV2Utils::lineWidthScaleFactor( context.renderContext(), mWidthUnit, mWidthMapUnitScale );
474+
double scaledWidth = QgsSymbolLayerV2Utils::convertToPainterUnits( context.renderContext(),
475+
evaluateDataDefinedProperty( QgsSymbolLayerV2::EXPR_WIDTH, context, mWidth ).toDouble(),
476+
mWidthUnit, mWidthMapUnitScale );
476477
pen.setWidthF( scaledWidth );
477478
selPen.setWidthF( scaledWidth );
478479
hasStrokeWidthExpression = true;
@@ -496,7 +497,7 @@ void QgsSimpleLineSymbolLayerV2::applyDataDefinedSymbology( QgsSymbolV2RenderCon
496497
//dash dot vector
497498
if ( hasDataDefinedProperty( QgsSymbolLayerV2::EXPR_CUSTOMDASH ) )
498499
{
499-
double scaledWidth = mWidth * QgsSymbolLayerV2Utils::lineWidthScaleFactor( context.renderContext(), mWidthUnit, mWidthMapUnitScale );
500+
double scaledWidth = QgsSymbolLayerV2Utils::convertToPainterUnits( context.renderContext(), mWidth, mWidthUnit, mWidthMapUnitScale );
500501
double dashWidthDiv = mPen.widthF();
501502

502503
if ( hasStrokeWidthExpression )
@@ -521,7 +522,7 @@ void QgsSimpleLineSymbolLayerV2::applyDataDefinedSymbology( QgsSymbolV2RenderCon
521522
QStringList::const_iterator dashIt = dashList.constBegin();
522523
for ( ; dashIt != dashList.constEnd(); ++dashIt )
523524
{
524-
dashVector.push_back( dashIt->toDouble() * QgsSymbolLayerV2Utils::lineWidthScaleFactor( context.renderContext(), mCustomDashPatternUnit, mCustomDashPatternMapUnitScale ) / dashWidthDiv );
525+
dashVector.push_back( QgsSymbolLayerV2Utils::convertToPainterUnits( context.renderContext(), dashIt->toDouble(), mCustomDashPatternUnit, mCustomDashPatternMapUnitScale ) / dashWidthDiv );
525526
}
526527
pen.setDashPattern( dashVector );
527528
}
@@ -586,7 +587,7 @@ double QgsSimpleLineSymbolLayerV2::dxfWidth( const QgsDxfExport& e, const QgsSym
586587
}
587588
else if ( context.renderHints() & QgsSymbolV2::DataDefinedSizeScale )
588589
{
589-
width = mWidth * QgsSymbolLayerV2Utils::lineWidthScaleFactor( context.renderContext(), mWidthUnit, mWidthMapUnitScale );
590+
width = QgsSymbolLayerV2Utils::convertToPainterUnits( context.renderContext(), mWidth, mWidthUnit, mWidthMapUnitScale );
590591
}
591592

592593
return width * e.mapUnitScaleFactor( e.symbologyScaleDenominator(), widthUnit(), e.mapUnits() );
@@ -854,7 +855,7 @@ void QgsMarkerLineSymbolLayerV2::renderPolyline( const QPolygonF& points, QgsSym
854855
else
855856
{
856857
context.renderContext().setGeometry( 0 ); //always use segmented geometry with offset
857-
QList<QPolygonF> mline = ::offsetLine( points, offset * QgsSymbolLayerV2Utils::lineWidthScaleFactor( context.renderContext(), mOffsetUnit, mOffsetMapUnitScale ), context.feature() ? context.feature()->constGeometry()->type() : QGis::Line );
858+
QList<QPolygonF> mline = ::offsetLine( points, QgsSymbolLayerV2Utils::convertToPainterUnits( context.renderContext(), offset, mOffsetUnit, mOffsetMapUnitScale ), context.feature() ? context.feature()->constGeometry()->type() : QGis::Line );
858859

859860
for ( int part = 0; part < mline.count(); ++part )
860861
{
@@ -920,8 +921,8 @@ void QgsMarkerLineSymbolLayerV2::renderPolylineInterval( const QPolygonF& points
920921
offsetAlongLine = evaluateDataDefinedProperty( QgsSymbolLayerV2::EXPR_OFFSET_ALONG_LINE, context, mOffsetAlongLine ).toDouble();
921922
}
922923

923-
double painterUnitInterval = interval * QgsSymbolLayerV2Utils::lineWidthScaleFactor( rc, mIntervalUnit, mIntervalMapUnitScale );
924-
lengthLeft = painterUnitInterval - offsetAlongLine * QgsSymbolLayerV2Utils::lineWidthScaleFactor( rc, mIntervalUnit, mIntervalMapUnitScale );
924+
double painterUnitInterval = QgsSymbolLayerV2Utils::convertToPainterUnits( rc, interval, mIntervalUnit, mIntervalMapUnitScale );
925+
lengthLeft = painterUnitInterval - QgsSymbolLayerV2Utils::convertToPainterUnits( rc, offsetAlongLine, mIntervalUnit, mIntervalMapUnitScale );
925926

926927
for ( int i = 1; i < points.count(); ++i )
927928
{
@@ -996,7 +997,7 @@ void QgsMarkerLineSymbolLayerV2::renderPolylineVertex( const QPolygonF& points,
996997
if ( offsetAlongLine != 0 )
997998
{
998999
//scale offset along line
999-
offsetAlongLine *= QgsSymbolLayerV2Utils::lineWidthScaleFactor( rc, mOffsetAlongLineUnit, mOffsetAlongLineMapUnitScale );
1000+
offsetAlongLine = QgsSymbolLayerV2Utils::convertToPainterUnits( rc, offsetAlongLine, mOffsetAlongLineUnit, mOffsetAlongLineMapUnitScale );
10001001
}
10011002

10021003
if ( offsetAlongLine == 0 && context.renderContext().geometry()

0 commit comments

Comments
 (0)