diff --git a/io_scene_obj/__init__.py b/io_scene_obj/__init__.py index ae3780bdfd826e76ac2bc1cbb3129316d06afe83..fdcb30217d4f7a4c4ce9b895a1781c01797b73b5 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 c565bd0505ffd440b9386902f6d66b4dbb79b962..78d80872878b24af44d34060027ae9ac3a88e41e 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:]))