Python SVG路径解析不正确:svgpathtools、Inkscape

Python SVG路径解析不正确:svgpathtools、Inkscape,python,xml,svg,gimp,inkscape,Python,Xml,Svg,Gimp,Inkscape,我要在一条特定的路径上获得一组点(这是一个茶壶)。我创建了路径,并使用“Inkscape”和“Gimp”软件将其导出 我正在尝试使用库svgpathtools以及parse_path函数解析svg文件(本质上是一个XML文件)。parse_path的正常行为是很好地解析SVG的“d字符串”,并创建一个path对象 但是,我得到一个错误: File (...)\parser.py", line 112, in parse_path control1 = float(elements.pop()

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

我正在尝试使用库
svgpathtools
以及
parse_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" />
我担心错误可能是由于格式不正确,因为CubicBezier函数的参数
start、control1、control2、end
都是复杂的
a+bj
格式。这里的参数似乎更少!?是Inkscape/Gimp格式不好吗(我对此表示怀疑)?还是别的什么

绳子将非常感谢

找到答案了! 这里的问题是,我正在解析整个SVG文件,而不仅仅是“d字符串”部分。 要获取实际字符串,请执行以下操作:

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)
这里,Path_元素是由CubicBezier曲线定义的路径对象列表。 至于“较少”点,实际上一条贝塞尔曲线的末端是另一条贝塞尔曲线的起点,因此不需要5个参数,只需要4个参数和一个起始“M”指令点

向“迈克·波马克斯·卡默曼”呼救

找到答案了! 这里的问题是,我正在解析整个SVG文件,而不仅仅是“d字符串”部分。 要获取实际字符串,请执行以下操作:

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)
这里,Path_元素是由CubicBezier曲线定义的路径对象列表。 至于“较少”点,实际上一条贝塞尔曲线的末端是另一条贝塞尔曲线的起点,因此不需要5个参数,只需要4个参数和一个起始“M”指令点


向“迈克·波马克斯·卡默曼”呼救

如果文件长度为250行,则通过删除所有与问题无关的内容来创建一个文件,并发布该代码,然后以实际中断的形式发布。路径
d
属性不需要1000个字符长:只需删除不会触发此问题的部分,直到基本上有一个表单
仍然会触发您看到的错误。另外,您得到的错误是
无法将字符串转换为float:'s'
,因此:显示您的代码。你在112线附近干什么?“@Mike'Pomax'Kamermans,这是一个很好的观点!实际上,错误并没有告诉我错误发生在文件中的什么位置,第112行对应于库的源代码文件。。。我也很不确定我应该在这个问题上提出什么……这是python:你通常会得到一个巨大的堆栈跟踪,从库到你自己的代码,所以另一件事是“发布实际错误”,而不是试图修改它。对于您编辑的SVG:进一步编辑它。如果一个
C
上的东西坏了,那么有20个就没有什么区别了:只要有一个,然后用单个M+C指令验证东西仍然坏了。它不坏吗?很酷,那么你现在知道什么不是问题了,你可以看得更深入一些。svg文件只是有svg头标记,路径标记由所有CubicBezier“调用”和适当的点组成,例如,在除去除一条M+C指令之外的所有指令时,相同的
ValueError:无法将字符串转换为float:'s'
,我可能只需要解析
路径
标记,因为此处的“s”可能来自
关闭标记如果文件有250行长,请通过删除所有不会导致问题的内容来创建一个,然后发布该代码,并以实际中断的形式发布。路径
d
属性不需要1000个字符长:只需删除不会触发此问题的部分,直到基本上有一个表单
仍然会触发您看到的错误。另外,您得到的错误是
无法将字符串转换为float:'s'
,因此:显示您的代码。你在112线附近干什么?“@Mike'Pomax'Kamermans,这是一个很好的观点!实际上,错误并没有告诉我错误发生在文件中的什么位置,第112行对应于库的源代码文件。。。我也很不确定我应该在这个问题上提出什么……这是python:你通常会得到一个巨大的堆栈跟踪,从库到你自己的代码,所以另一件事是“发布实际错误”,而不是试图修改它。对于您编辑的SVG:进一步编辑它。如果一个
C
上的东西坏了,那么有20个就没有什么区别了:只要有一个,然后用单个M+C指令验证东西仍然坏了。它不坏吗?很酷,那么你现在知道什么不是问题了,你可以看得更深入一些。svg文件只是有svg头标记,路径标记由所有CubicBezier“调用”和适当的点组成,例如,在除去除一条M+C指令之外的所有指令时,相同的
ValueError:无法将字符串转换为float:'s'
,我可能只需要解析
路径
标记,因为这里的“s”可能来自
结束标记