Fix for T87654: SVG import parse error

Fix for SVG data when there is no space between some arguments in the arc command.
See T87654 for example files.

See https://www.w3.org/TR/SVG2/paths.html#TheDProperty for arguments to the elliptical arc curve commands.

Maniphest Tasks: T87654

Differential Revision: https://developer.blender.org/D11027
This commit is contained in:
Erik Abrahamsson 2021-04-22 12:42:23 +02:00 committed by Sergey Sharybin
parent 30012da835
commit 4cb833e84a
Notes: blender-bot 2023-02-13 18:54:45 +01:00
Referenced by issue blender/blender#87654, SVG import parse error
1 changed files with 18 additions and 3 deletions

View File

@ -173,7 +173,7 @@ def SVGParseTransform(transform):
"""
m = Matrix()
r = re.compile('\s*([A-z]+)\s*\((.*?)\)')
r = re.compile(r'\s*([A-z]+)\s*\((.*?)\)')
for match in r.finditer(transform):
func = match.group(1)
@ -195,7 +195,7 @@ def SVGGetMaterial(color, context):
"""
materials = context['materials']
rgb_re = re.compile('^\s*rgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,(\d+)\s*\)\s*$')
rgb_re = re.compile(r'^\s*rgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,(\d+)\s*\)\s*$')
if color in materials:
return materials[color]
@ -405,6 +405,7 @@ class SVGPathData:
spaces = ' ,\t'
commands = {'m', 'l', 'h', 'v', 'c', 's', 'q', '', 't', 'a', 'z'}
current_command = ''
tokens = []
i = 0
@ -416,8 +417,22 @@ class SVGPathData:
pass
elif c.lower() in commands:
tokens.append(c)
current_command = c
arg_index = 1
elif c in ['-', '.'] or c.isdigit():
token, last_char = read_float(d, i)
# Special case for 'a/A' commands.
# Arguments 4 and 5 are either 0 or 1 and might not
# be separated from the next argument with space or comma.
if current_command.lower() == 'a':
if arg_index % 7 in [4,5]:
token = d[i]
last_char = i + 1
else:
token, last_char = read_float(d, i)
else:
token, last_char = read_float(d, i)
arg_index += 1
tokens.append(token)
# in most cases len(token) and (last_char - i) are the same