void QgsMarkerLineSymbolLayerV2::renderPolyline( const QPolygonF& points, QgsSymbolV2RenderContext& context ) { double offset = mOffset; QgsExpression* offsetExpression = expression( "offset" ); if ( offsetExpression ) { offset = offsetExpression->evaluate( const_cast<QgsFeature*>( context.feature() ) ).toDouble(); } Placement placement = mPlacement; QgsExpression* placementExpression = expression( "placement" ); if ( placementExpression ) { QString placementString = placementExpression->evaluate( const_cast<QgsFeature*>( context.feature() ) ).toString(); if ( placementString.compare( "vertex", Qt::CaseInsensitive ) == 0 ) { placement = Vertex; } else if ( placementString.compare( "lastvertex", Qt::CaseInsensitive ) == 0 ) { placement = LastVertex; } else if ( placementString.compare( "firstvertex", Qt::CaseInsensitive ) == 0 ) { placement = FirstVertex; } else if ( placementString.compare( "centerpoint", Qt::CaseInsensitive ) == 0 ) { placement = CentralPoint; } else { placement = Interval; } } if ( offset == 0 ) { if ( placement == Interval ) renderPolylineInterval( points, context ); else if ( placement == CentralPoint ) renderPolylineCentral( points, context ); else renderPolylineVertex( points, context, placement ); } else { QPolygonF points2 = ::offsetLine( points, offset * QgsSymbolLayerV2Utils::lineWidthScaleFactor( context.renderContext(), mOffsetUnit ) ); if ( placement == Interval ) renderPolylineInterval( points2, context ); else if ( placement == CentralPoint ) renderPolylineCentral( points2, context ); else renderPolylineVertex( points2, context, placement ); } }
void QgsMarkerLineSymbolLayerV2::renderPolyline( const QPolygonF& points, QgsSymbolV2RenderContext& context ) { if ( mOffset == 0 ) { if ( mPlacement == Interval ) renderPolylineInterval( points, context ); else if ( mPlacement == CentralPoint ) renderPolylineCentral( points, context ); else renderPolylineVertex( points, context ); } else { QPolygonF points2 = ::offsetLine( points, context.outputLineWidth( mOffset ) ); if ( mPlacement == Interval ) renderPolylineInterval( points2, context ); else if ( mPlacement == CentralPoint ) renderPolylineCentral( points2, context ); else renderPolylineVertex( points2, context ); } }
void QgsMarkerLineSymbolLayerV2::renderPolyline( const QPolygonF& points, QgsSymbolV2RenderContext& context ) { double offset = mOffset; if ( hasDataDefinedProperty( QgsSymbolLayerV2::EXPR_OFFSET ) ) { context.setOriginalValueVariable( mOffset ); offset = evaluateDataDefinedProperty( QgsSymbolLayerV2::EXPR_OFFSET, context, mOffset ).toDouble(); } Placement placement = mPlacement; bool ok; if ( hasDataDefinedProperty( QgsSymbolLayerV2::EXPR_PLACEMENT ) ) { QString placementString = evaluateDataDefinedProperty( QgsSymbolLayerV2::EXPR_PLACEMENT, context, QVariant(), &ok ).toString(); if ( ok ) { if ( placementString.compare( "vertex", Qt::CaseInsensitive ) == 0 ) { placement = Vertex; } else if ( placementString.compare( "lastvertex", Qt::CaseInsensitive ) == 0 ) { placement = LastVertex; } else if ( placementString.compare( "firstvertex", Qt::CaseInsensitive ) == 0 ) { placement = FirstVertex; } else if ( placementString.compare( "centerpoint", Qt::CaseInsensitive ) == 0 ) { placement = CentralPoint; } else if ( placementString.compare( "curvepoint", Qt::CaseInsensitive ) == 0 ) { placement = CurvePoint; } else { placement = Interval; } } } if ( offset == 0 ) { if ( placement == Interval ) renderPolylineInterval( points, context ); else if ( placement == CentralPoint ) renderPolylineCentral( points, context ); else renderPolylineVertex( points, context, placement ); } else { context.renderContext().setGeometry( 0 ); //always use segmented geometry with offset QList<QPolygonF> mline = ::offsetLine( points, QgsSymbolLayerV2Utils::convertToPainterUnits( context.renderContext(), offset, mOffsetUnit, mOffsetMapUnitScale ), context.feature() ? context.feature()->constGeometry()->type() : QGis::Line ); for ( int part = 0; part < mline.count(); ++part ) { const QPolygonF &points2 = mline[ part ]; if ( placement == Interval ) renderPolylineInterval( points2, context ); else if ( placement == CentralPoint ) renderPolylineCentral( points2, context ); else renderPolylineVertex( points2, context, placement ); } } }