SVG路径解析不正确:svgpathtools、Inkscap

2024-10-01 15:48:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我要在一条特定的路径上得到一组点(这是一个茶壶)。我创建了路径并使用“Inkscape”和“Gimp”软件将其导出。你知道吗

我试图使用库svgpathtoolsparse_path函数解析svg文件(本质上是一个XML文件)。parse_path的正常行为是很好地解析SVG的“d字符串”,并创建一个Path对象。你知道吗

但是,我得到一个错误:

File (...)\parser.py", line 112, in parse_path
  control1 = float(elements.pop()) + float(elements.pop()) * 1j
  ValueError: could not convert string to float: 's'

以下是SVG文件的前几行:

  <path id="Sélection"
        fill="none" stroke="black" stroke-width="1"
        d="M 1381.00,143.00
           C 1382.71,149.01 1394.44,175.21 1397.93,180.00
             1400.62,183.69 1402.89,185.74 1405.83,189.00
             1405.83,189.00 1429.69,216.00 1429.69,216.00
             [...]
             1403.00,127.29 1381.00,143.00 1381.00,143.00 Z
           M 2296.00,978.00
           C 2296.00,978.00 2293.17,942.00 2293.17,942.00
             2293.17,942.00 2288.72,891.00 2288.72,891.00
             2288.72,891.00 2276.88,838.00 2276.88,838.00
             [...]
             2315.00,967.85 2296.00,978.00 2296.00,978.00 Z
           M 326.00,1040.00" />

这个文件有250行长。 这是我代码中有问题的部分:

path = svgpathtools.parse_path(filepath)

这里是完整的,未经修正的错误

Traceback (most recent call last):
  File "c:\Users\vikto\.vscode\extensions\ms-python.python-2019.10.44104\pythonFiles\ptvsd_launcher.py", line 43, in <module>
    main(ptvsdArgs)
  File "c:\Users\vikto\.vscode\extensions\ms-python.python-2019.10.44104\pythonFiles\lib\python\old_ptvsd\ptvsd\__main__.py", line 432, in main
    run()
  File "c:\Users\vikto\.vscode\extensions\ms-python.python-2019.10.44104\pythonFiles\lib\python\old_ptvsd\ptvsd\__main__.py", line 316, in run_file
    runpy.run_path(target, run_name='__main__')
  File "C:\Users\vikto\AppData\Local\Programs\Python\Python37-32\lib\runpy.py", line 263, in run_path
    pkg_name=pkg_name, script_name=fname)
  File "C:\Users\vikto\AppData\Local\Programs\Python\Python37-32\lib\runpy.py", line 96, in _run_module_code
    mod_name, mod_spec, pkg_name, script_name)
  File "C:\Users\vikto\AppData\Local\Programs\Python\Python37-32\lib\runpy.py", line 85, in _run_code
    exec(code, run_globals)
  File "c:\Users\vikto\Desktop\Best_Dossier_ever\Python\TeapotProj\TeapotProject.py", line 34, in <module>
    path = svgpathtools.parse_path(fpath)
  File "C:\Users\vikto\AppData\Local\Programs\Python\Python37-32\lib\site-packages\svgpathtools\parser.py", line 112, in parse_path
    control1 = float(elements.pop()) + float(elements.pop()) * 1j
ValueError: could not convert string to float: 's'

我担心错误可能是由于格式不正确,因为CubicBezier函数的参数start, control1, control2, end都是复杂的a + bj格式。这里的参数好像少了!?会不会是Inkscape/Gimp格式不好(我对此表示怀疑)?或者别的什么?你知道吗

绳子将不胜感激!!你知道吗


Tags: pathrunnameinpyparsemainlib
1条回答
网友
1楼 · 发布于 2024-10-01 15:48:25

找到答案了! 这里的问题是,我解析的是整个SVG文件,而不仅仅是“d-string”部分。 要获取实际字符串:

from xml.dom import minidom
mydoc = minidom.parse(file_path)
path_tag = mydoc.getElementsByTagName("path")
d_string = path_tag[0].attributes['d'].value
Path_elements = svgpathtools.parse_path(d_string)

这里,路径元素是由CubicBezier曲线定义的路径对象列表。 至于“较少”点,实际上一条贝塞尔曲线的末端是另一条曲线的起点,因此不需要5个参数,只需要4个参数和一个“M”起始指令点!你知道吗

向“迈克·波马克斯·卡默曼”呼救!你知道吗

相关问题 更多 >

    热门问题