Skip to content

Commit

Permalink
Merge pull request #38815 from elpaso/bugfix-gh38716-marker-line-dd-a…
Browse files Browse the repository at this point in the history
…ngle

Set the line angle instead of the symbol angle
  • Loading branch information
elpaso committed Sep 17, 2020
2 parents d03e172 + 247a399 commit 8ed98f6
Show file tree
Hide file tree
Showing 4 changed files with 61 additions and 5 deletions.
10 changes: 6 additions & 4 deletions src/core/symbology/qgslinesymbollayer.cpp
Expand Up @@ -2056,12 +2056,14 @@ void QgsTemplatedLineSymbolLayerBase::renderPolylineCentral( const QPolygonF &po
}

// draw the marker
double origAngle = symbolAngle();
// rotate marker (if desired)
if ( rotateSymbols() )
setSymbolAngle( origAngle + thisSymbolAngle * 180 / M_PI );
{
setSymbolLineAngle( thisSymbolAngle * 180 / M_PI );
}

renderSymbol( pt, context.feature(), context.renderContext(), -1, context.selected() );
if ( rotateSymbols() )
setSymbolAngle( origAngle );

}
}

Expand Down
4 changes: 3 additions & 1 deletion src/core/symbology/qgsmarkersymbollayer.cpp
Expand Up @@ -246,7 +246,9 @@ void QgsSimpleMarkerSymbolLayerBase::renderPoint( QPointF point, QgsSymbolRender
}

if ( !qgsDoubleNear( angle, 0.0 ) && ( hasDataDefinedRotation || createdNewPath ) )
{
transform.rotate( angle );
}

//need to pass: symbol, polygon, path

Expand Down Expand Up @@ -666,7 +668,7 @@ void QgsSimpleMarkerSymbolLayerBase::calculateOffsetAndRotation( QgsSymbolRender
if ( mDataDefinedProperties.isActive( QgsSymbolLayer::PropertyAngle ) )
{
context.setOriginalValueVariable( angle );
angle = mDataDefinedProperties.valueAsDouble( QgsSymbolLayer::PropertyAngle, context.renderContext().expressionContext(), mAngle, &ok ) + mLineAngle;
angle = mDataDefinedProperties.valueAsDouble( QgsSymbolLayer::PropertyAngle, context.renderContext().expressionContext(), 0, &ok ) + mLineAngle;

// If the expression evaluation was not successful, fallback to static value
if ( !ok )
Expand Down
52 changes: 52 additions & 0 deletions tests/src/python/test_qgsmarkerlinesymbollayer.py
Expand Up @@ -340,6 +340,58 @@ def testCenterSegment(self):
rendered_image = self.renderGeometry(s, g)
assert self.imageCheck('markerline_segmentcenter', 'markerline_segmentcenter', rendered_image)

def testMarkerAngleDD(self):
"""Test issue https://github.com/qgis/QGIS/issues/38716"""

s = QgsLineSymbol()
s.deleteSymbolLayer(0)

marker_line = QgsMarkerLineSymbolLayer(True)
marker_line.setRotateSymbols(True)
marker_line.setPlacement(QgsTemplatedLineSymbolLayerBase.CentralPoint)
marker = QgsSimpleMarkerSymbolLayer(QgsSimpleMarkerSymbolLayer.Arrow, 10)
marker.setAngle(90)
marker.setColor(QColor(255, 0, 0))
marker.setStrokeStyle(Qt.NoPen)
marker_symbol = QgsMarkerSymbol()
marker_symbol.changeSymbolLayer(0, marker)
marker_line.setSubSymbol(marker_symbol)
line_symbol = QgsLineSymbol()
line_symbol.changeSymbolLayer(0, marker_line)

s.appendSymbolLayer(marker_line.clone())

g = QgsGeometry.fromWkt('LineString(0 0, 10 10, 20 20)')
rendered_image = self.renderGeometry(s, g)
assert self.imageCheck('markerline_center_angle_dd', 'markerline_center_angle_dd', rendered_image)

# Now with DD

s = QgsLineSymbol()
s.deleteSymbolLayer(0)

marker_line = QgsMarkerLineSymbolLayer(True)
marker_line.setRotateSymbols(True)
marker_line.setPlacement(QgsTemplatedLineSymbolLayerBase.CentralPoint)
marker = QgsSimpleMarkerSymbolLayer(QgsSimpleMarkerSymbolLayer.Arrow, 10)
# Note: set this to a different value than the reference test (90)
marker.setAngle(30)
marker.setColor(QColor(255, 0, 0))
marker.setStrokeStyle(Qt.NoPen)
marker_symbol = QgsMarkerSymbol()
marker_symbol.changeSymbolLayer(0, marker)
# This is the same value of the reference test
marker_symbol.setDataDefinedAngle(QgsProperty.fromExpression('90'))
marker_line.setSubSymbol(marker_symbol)
line_symbol = QgsLineSymbol()
line_symbol.changeSymbolLayer(0, marker_line)

s.appendSymbolLayer(marker_line.clone())

g = QgsGeometry.fromWkt('LineString(0 0, 10 10, 20 20)')
rendered_image = self.renderGeometry(s, g)
assert self.imageCheck('markerline_center_angle_dd', 'markerline_center_angle_dd', rendered_image)

def renderGeometry(self, symbol, geom, buffer=20):
f = QgsFeature()
f.setGeometry(geom)
Expand Down
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.

0 comments on commit 8ed98f6

Please sign in to comment.