From 05dc8caa35da9914a0c0da61bb0dd49aa292e9ce Mon Sep 17 00:00:00 2001 From: Bastien Montagne <montagne29@wanadoo.fr> Date: Mon, 22 Jul 2019 18:36:55 +0200 Subject: [PATCH] Fix T67266: .obj import error with mtllib name in quotes - regression from 2.79b. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit While this is not officialy part of OBJ format, some softwares 'solve' the spaces-in-filenames issue by delimiting those with quotes. Since this is not too much a hassle, let's add back support for this. Based on work from Robert Guetzkow (@rjg), thanks. Note: not sure whether this should be ported to 2.80 release, while this change should be reasonably safe, it's not an obvious one-liner either, and the issue is not really critical (don’t think any major software uses that trick?)... --- io_scene_obj/__init__.py | 2 +- io_scene_obj/import_obj.py | 22 ++++++++++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/io_scene_obj/__init__.py b/io_scene_obj/__init__.py index ae3780bdf..fdcb30217 100644 --- a/io_scene_obj/__init__.py +++ b/io_scene_obj/__init__.py @@ -21,7 +21,7 @@ bl_info = { "name": "Wavefront OBJ format", "author": "Campbell Barton, Bastien Montagne", - "version": (3, 5, 9), + "version": (3, 5, 10), "blender": (2, 80, 0), "location": "File > Import-Export", "description": "Import-Export OBJ, Import OBJ mesh, UV's, materials and textures", diff --git a/io_scene_obj/import_obj.py b/io_scene_obj/import_obj.py index c565bd050..78d808728 100644 --- a/io_scene_obj/import_obj.py +++ b/io_scene_obj/import_obj.py @@ -62,7 +62,21 @@ def filenames_group_by_ext(line, ext): """ Splits material libraries supporting spaces, so: b'foo bar.mtl baz spam.MTL' -> (b'foo bar.mtl', b'baz spam.MTL') + Also handle " chars (some softwares use those to protect filenames with spaces, see T67266... sic). """ + # Note that we assume that if there are some " in that line, + # then all filenames are properly enclosed within those... + start = line.find(b'"') + 1 + if start != 0: + while start != 0: + end = line.find(b'"', start) + if end != -1: + yield line[start:end] + start = line.find(b'"', end + 1) + 1 + else: + break + return + line_lower = line.lower() i_prev = 0 while i_prev != -1 and i_prev < len(line): @@ -79,8 +93,16 @@ def obj_image_load(context_imagepath_map, line, DIR, recursive, relpath): But we try all space-separated items from current line when file is not found with last one (users keep generating/using image files with spaces in a format that does not support them, sigh...) Also tries to replace '_' with ' ' for Max's exporter replaces spaces with underscores. + Also handle " chars (some softwares use those to protect filenames with spaces, see T67266... sic). """ filepath_parts = line.split(b' ') + + start = line.find(b'"') + 1 + if start != 0: + end = line.find(b'"', start) + if end != 0: + filepath_parts = (line[start:end],) + image = None for i in range(-1, -len(filepath_parts), -1): imagepath = os.fsdecode(b" ".join(filepath_parts[i:])) -- GitLab