Pycairo:将路径转换为 svg 路径语法
Pycairo: convert path to svg path syntax
我为 cairo
中的字母 T
创建了以下路径:
ctx = cairo.Context(surface)
ctx.text_path("T")
ctx.close_path()
c = ctx.copy_path()
print(c)
给我:
move_to 5.980469 -7.171875
line_to 5.980469 -6.320312
line_to 3.562500 -6.320312
line_to 3.562500 0.000000
line_to 2.578125 0.000000
line_to 2.578125 -6.320312
line_to 0.160156 -6.320312
line_to 0.160156 -7.171875
close path
move_to 6.109375 0.000000
close path
move_to 6.109375 0.000000
我想以 SVG 路径语法的形式获取它:
M216.88,153.42l-44.63.12,0-16.1,108.61-.29,0,16.1-44.83.12L236.37,284l-19.14.05Z
... 这样我就可以使用 svgpath2mpl.parse_path
.
导入它
看来您需要自己构建 SVG 路径语法。
显然,可以遍历路径并获取其元素:https://github.com/pygobject/pycairo/blob/d4639c0337073e0e725fb76509bf2c80eaadfa5f/tests/test_path.py#L60-L73
第一个数字必须来自这里并表示操作的种类:https://pycairo.readthedocs.io/en/latest/reference/enums.html#cairo.PathDataType
所以....我猜是这样的:
result = ""
for kind, points in ctx.copy_path():
points = list(points)
points = ",".join(str(i) for i in points)
if kind == cairo.PathDataType.MOVE_TO:
result += "M" + points
elif kind == cairo.PathDataType.LINE_TO:
result += "L" + points
elif kind == cairo.PathDataType.CURVE_TO:
result += "C" + points
elif kind == cairo.PathDataType.CLOSE_PATH:
result += "Z"
else:
assert(False, "Path is broken")
不知道上面是否有效,也不知道它是否生成正确的 svg 路径(我需要 upper-case 或 lower-case 字母吗?)。这应该只是说明这个想法。
我为 cairo
中的字母 T
创建了以下路径:
ctx = cairo.Context(surface)
ctx.text_path("T")
ctx.close_path()
c = ctx.copy_path()
print(c)
给我:
move_to 5.980469 -7.171875
line_to 5.980469 -6.320312
line_to 3.562500 -6.320312
line_to 3.562500 0.000000
line_to 2.578125 0.000000
line_to 2.578125 -6.320312
line_to 0.160156 -6.320312
line_to 0.160156 -7.171875
close path
move_to 6.109375 0.000000
close path
move_to 6.109375 0.000000
我想以 SVG 路径语法的形式获取它:
M216.88,153.42l-44.63.12,0-16.1,108.61-.29,0,16.1-44.83.12L236.37,284l-19.14.05Z
... 这样我就可以使用 svgpath2mpl.parse_path
.
看来您需要自己构建 SVG 路径语法。
显然,可以遍历路径并获取其元素:https://github.com/pygobject/pycairo/blob/d4639c0337073e0e725fb76509bf2c80eaadfa5f/tests/test_path.py#L60-L73
第一个数字必须来自这里并表示操作的种类:https://pycairo.readthedocs.io/en/latest/reference/enums.html#cairo.PathDataType
所以....我猜是这样的:
result = ""
for kind, points in ctx.copy_path():
points = list(points)
points = ",".join(str(i) for i in points)
if kind == cairo.PathDataType.MOVE_TO:
result += "M" + points
elif kind == cairo.PathDataType.LINE_TO:
result += "L" + points
elif kind == cairo.PathDataType.CURVE_TO:
result += "C" + points
elif kind == cairo.PathDataType.CLOSE_PATH:
result += "Z"
else:
assert(False, "Path is broken")
不知道上面是否有效,也不知道它是否生成正确的 svg 路径(我需要 upper-case 或 lower-case 字母吗?)。这应该只是说明这个想法。