Skip to content

Commit d43b7fb

Browse files
authored
Merge pull request #169 from MIERUNE/fix/hairline
Handle hairline
2 parents eeac579 + bbc23ff commit d43b7fb

File tree

4 files changed

+37
-13
lines changed

4 files changed

+37
-13
lines changed

translator/vector/symbol/fill.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
from qgis.core import QgsSymbolLayer
2-
from plugx_utils import convert_to_point
32
from PyQt5.QtCore import Qt
4-
from translator.vector.symbol.utils import to_rgba
3+
from translator.vector.symbol.utils import to_rgba, get_stroke_width_pt
54
from translator.vector.symbol.penstyle import get_penstyle_from
65

76

@@ -37,7 +36,7 @@ def get_polygon_symbol_data(
3736
"color": to_rgba(symbol_layer.fillColor()),
3837
"brushstyle": _get_brushstyle_from(symbol_layer.brushStyle()),
3938
"outline_color": to_rgba(symbol_layer.strokeColor()),
40-
"outline_width": convert_to_point(
39+
"outline_width": get_stroke_width_pt(
4140
symbol_layer.strokeWidth(), symbol_layer.strokeWidthUnit()
4241
),
4342
"outline_penstyle": get_penstyle_from(symbol_layer),
@@ -84,7 +83,7 @@ def get_polygon_symbol_data(
8483
"type": "svg",
8584
"color": to_rgba(symbol_layer.color()),
8685
"outline_color": to_rgba(symbol_layer.svgStrokeColor()),
87-
"outline_width": convert_to_point(
86+
"outline_width": get_stroke_width_pt(
8887
symbol_layer.svgStrokeWidth(), symbol_layer.svgStrokeWidthUnit()
8988
),
9089
"level": symbol_layer.renderingPass(),

translator/vector/symbol/line.py

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
from plugx_utils import convert_to_point
33

44
from .marker import get_point_symbol_data
5-
from translator.vector.symbol.utils import to_rgba
5+
from translator.vector.symbol.utils import to_rgba, get_stroke_width_pt
66
from translator.vector.symbol.penstyle import get_penstyle_from
77

88

@@ -12,7 +12,9 @@ def get_line_symbol_data(symbol_layer: QgsSymbolLayer, symbol_opacity: float) ->
1212
"type": "simple",
1313
"color": to_rgba(symbol_layer.color()),
1414
"penstyle": get_penstyle_from(symbol_layer),
15-
"width": convert_to_point(symbol_layer.width(), symbol_layer.widthUnit()),
15+
"width": get_stroke_width_pt(
16+
symbol_layer.width(), symbol_layer.widthUnit()
17+
),
1618
"level": symbol_layer.renderingPass(),
1719
"opacity": symbol_opacity,
1820
}
@@ -22,7 +24,9 @@ def get_line_symbol_data(symbol_layer: QgsSymbolLayer, symbol_opacity: float) ->
2224
symbol_layer_dict = {
2325
"type": "interpolated",
2426
"color": to_rgba(symbol_layer.color()),
25-
"width": convert_to_point(symbol_layer.width(), symbol_layer.widthUnit()),
27+
"width": get_stroke_width_pt(
28+
symbol_layer.width(), symbol_layer.widthUnit()
29+
),
2630
"level": symbol_layer.renderingPass(),
2731
"opacity": symbol_opacity,
2832
}
@@ -50,23 +54,29 @@ def get_line_symbol_data(symbol_layer: QgsSymbolLayer, symbol_opacity: float) ->
5054
# TODO: implement
5155
symbol_layer_dict = {
5256
"type": "raster",
53-
"width": convert_to_point(symbol_layer.width(), symbol_layer.widthUnit()),
57+
"width": get_stroke_width_pt(
58+
symbol_layer.width(), symbol_layer.widthUnit()
59+
),
5460
"level": symbol_layer.renderingPass(),
5561
"opacity": symbol_opacity,
5662
}
5763
elif symbol_layer.layerType() == "Lineburst":
5864
# TODO: implement
5965
symbol_layer_dict = {
6066
"type": "lineburst",
61-
"width": convert_to_point(symbol_layer.width(), symbol_layer.widthUnit()),
67+
"width": get_stroke_width_pt(
68+
symbol_layer.width(), symbol_layer.widthUnit()
69+
),
6270
"level": symbol_layer.renderingPass(),
6371
"opacity": symbol_opacity,
6472
}
6573
elif symbol_layer.layerType() == "ArrowLine":
6674
# TODO: implement
6775
symbol_layer_dict = {
6876
"type": "arrow",
69-
"width": convert_to_point(symbol_layer.width(), symbol_layer.widthUnit()),
77+
"width": get_stroke_width_pt(
78+
symbol_layer.width(), symbol_layer.widthUnit()
79+
),
7080
"level": symbol_layer.renderingPass(),
7181
"opacity": symbol_opacity,
7282
}

translator/vector/symbol/marker.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
from typing import Union, Tuple
1010

1111
from plugx_utils import convert_to_point
12-
from translator.vector.symbol.utils import get_asset_name, to_rgba
12+
from translator.vector.symbol.utils import get_asset_name, to_rgba, get_stroke_width_pt
1313
from translator.vector.symbol.penstyle import get_penstyle_from
1414

1515

@@ -174,7 +174,7 @@ def get_point_symbol_data(
174174
"size": convert_to_point(symbol_layer.size(), symbol_layer.sizeUnit()),
175175
"color": to_rgba(symbol_layer.color()),
176176
"outline_color": to_rgba(symbol_layer.strokeColor()),
177-
"outline_width": convert_to_point(
177+
"outline_width": get_stroke_width_pt(
178178
symbol_layer.strokeWidth(), symbol_layer.strokeWidthUnit()
179179
),
180180
"outline_penstyle": get_penstyle_from(symbol_layer),

translator/vector/symbol/utils.py

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
import os
22

3-
from qgis.core import QgsSymbolLayer
3+
from qgis.core import QgsSymbolLayer, QgsUnitTypes
44
from PyQt5.QtGui import QColor
5+
from plugx_utils import convert_to_point
56

67

78
def get_asset_dir(output_dir: str):
@@ -19,3 +20,17 @@ def to_rgba(color: QColor):
1920
alpha = hex(int(color.alphaF() * 255))[2:].zfill(2)
2021

2122
return f"{color.name()}{alpha}"
23+
24+
25+
def get_stroke_width_pt(defined_width: float, unit: QgsUnitTypes.RenderUnit) -> float:
26+
"""get line width in points, considering hairline or not
27+
symbol layer stroke width is set as 0 when hairline
28+
to be render as 0.5px (0.375pt) as defined in QGIS code
29+
https://github.com/qgis/QGIS/blob/e7f5b6f286b6cbaeaad5e73d69fad1448018c7e0/
30+
tests/src/python/test_qgssymbollayer_createsld.py#L234
31+
"""
32+
if defined_width == 0:
33+
hairline_px_size = 0.5
34+
return convert_to_point(hairline_px_size, QgsUnitTypes.RenderPixels)
35+
else:
36+
return convert_to_point(defined_width, unit)

0 commit comments

Comments
 (0)