From f77134753c8d228adad0180f21a32e5f22d0bd44 Mon Sep 17 00:00:00 2001 From: Campbell Barton <ideasman42@gmail.com> Date: Tue, 1 Feb 2011 04:26:26 +0000 Subject: [PATCH] use bytes rather then unicode for importing OBJ's --- io_scene_obj/import_obj.py | 170 +++++++++++++++++++------------------ 1 file changed, 86 insertions(+), 84 deletions(-) diff --git a/io_scene_obj/import_obj.py b/io_scene_obj/import_obj.py index 27b0e8b13..ccf1a4a7a 100644 --- a/io_scene_obj/import_obj.py +++ b/io_scene_obj/import_obj.py @@ -236,12 +236,12 @@ def line_value(line_split): return line_split[1] elif length > 2: - return ' '.join(line_split[1:]) + return b' '.join(line_split[1:]) def obj_image_load(imagepath, DIR, IMAGE_SEARCH): - if '_' in imagepath: - image = load_image(imagepath.replace('_', ' '), DIR) + if b'_' in imagepath: + image = load_image(imagepath.replace(b'_', b' '), DIR) if image: return image @@ -351,12 +351,12 @@ def create_materials(filepath, material_libs, unique_materials, unique_material_ mtex.texture = texture mtex.texture_coords = 'UV' mtex.use_map_reflect = True - + else: - raise Exception("invalid type '%s'" % type) + raise Exception("invalid type %r" % type) # Add an MTL with the same name as the obj if no MTLs are spesified. - temp_mtl = os.path.splitext((os.path.basename(filepath)))[0] + '.mtl' + temp_mtl = os.path.splitext((os.path.basename(filepath)))[0] + b'.mtl' if os.path.exists(os.path.join(DIR, temp_mtl)) and temp_mtl not in material_libs: material_libs.append(temp_mtl) @@ -365,22 +365,23 @@ def create_materials(filepath, material_libs, unique_materials, unique_material_ #Create new materials for name in unique_materials: # .keys() if name != None: - unique_materials[name] = bpy.data.materials.new(name) + unique_materials[name] = bpy.data.materials.new(name.decode('utf-8', "surrogateescape")) unique_material_images[name] = None, False # assign None to all material images to start with, add to later. unique_materials[None] = None unique_material_images[None] = None, False for libname in material_libs: + # print(libname) mtlpath = os.path.join(DIR, libname) if not os.path.exists(mtlpath): - print ("\tError Missing MTL: '%s'" % mtlpath) + print ("\tError Missing MTL: %r" % mtlpath) else: - #print '\t\tloading mtl: "%s"' % mtlpath + #print('\t\tloading mtl: %e' % mtlpath) context_material = None - mtl = open(mtlpath, 'rU') + mtl = open(mtlpath, 'rb') for line in mtl: # .readlines(): - if line.startswith('newmtl'): + if line.startswith(b'newmtl'): context_material_name = line_value(line.split()) if context_material_name in unique_materials: context_material = unique_materials[context_material_name] @@ -391,42 +392,42 @@ def create_materials(filepath, material_libs, unique_materials, unique_material_ # we need to make a material to assign properties to it. line_split = line.split() line_lower = line.lower().lstrip() - if line_lower.startswith('ka'): + if line_lower.startswith(b'ka'): context_material.mirror_color = float(line_split[1]), float(line_split[2]), float(line_split[3]) - elif line_lower.startswith('kd'): + elif line_lower.startswith(b'kd'): context_material.diffuse_color = float(line_split[1]), float(line_split[2]), float(line_split[3]) - elif line_lower.startswith('ks'): + elif line_lower.startswith(b'ks'): context_material.specular_color = float(line_split[1]), float(line_split[2]), float(line_split[3]) - elif line_lower.startswith('ns'): + elif line_lower.startswith(b'ns'): context_material.specular_hardness = int((float(line_split[1]) * 0.51)) - elif line_lower.startswith('ni'): # Refraction index + elif line_lower.startswith(b'ni'): # Refraction index context_material.raytrace_transparency.ior = max(1, min(float(line_split[1]), 3)) # between 1 and 3 - elif line_lower.startswith('d') or line_lower.startswith('tr'): + elif line_lower.startswith(b'd') or line_lower.startswith(b'tr'): context_material.alpha = float(line_split[1]) context_material.use_transparency = True context_material.transparency_method = 'Z_TRANSPARENCY' - elif line_lower.startswith('map_ka'): + elif line_lower.startswith(b'map_ka'): img_filepath = line_value(line.split()) if img_filepath: load_material_image(context_material, context_material_name, img_filepath, 'Ka') - elif line_lower.startswith('map_ks'): + elif line_lower.startswith(b'map_ks'): img_filepath = line_value(line.split()) if img_filepath: load_material_image(context_material, context_material_name, img_filepath, 'Ks') - elif line_lower.startswith('map_kd'): + elif line_lower.startswith(b'map_kd'): img_filepath = line_value(line.split()) if img_filepath: load_material_image(context_material, context_material_name, img_filepath, 'Kd') - elif line_lower.startswith('map_bump') or line_lower.startswith('bump'): # 'bump' is incorrect but some files use it. + elif line_lower.startswith(b'map_bump') or line_lower.startswith(b'bump'): # 'bump' is incorrect but some files use it. img_filepath = line_value(line.split()) if img_filepath: load_material_image(context_material, context_material_name, img_filepath, 'Bump') - elif line_lower.startswith('map_d') or line_lower.startswith('map_tr'): # Alpha map - Dissolve + elif line_lower.startswith(b'map_d') or line_lower.startswith(b'map_tr'): # Alpha map - Dissolve img_filepath = line_value(line.split()) if img_filepath: load_material_image(context_material, context_material_name, img_filepath, 'D') - elif line_lower.startswith('refl'): # reflectionmap + elif line_lower.startswith(b'refl'): # reflectionmap img_filepath = line_value(line.split()) if img_filepath: load_material_image(context_material, context_material_name, img_filepath, 'refl') @@ -608,7 +609,7 @@ def create_mesh(new_objects, has_ngons, CREATE_FGONS, CREATE_EDGES, verts_loc, v for name, index in list(material_mapping.items()): materials[index] = unique_materials[name] - me = bpy.data.meshes.new(dataname) + me = bpy.data.meshes.new(dataname.decode('utf-8', "surrogateescape")) # make sure the list isnt too big for material in materials: @@ -757,18 +758,18 @@ def create_nurbs(context_nurbs, vert_loc, new_objects): ''' Add nurbs object to blender, only support one type at the moment ''' - deg = context_nurbs.get('deg', (3,)) - curv_range = context_nurbs.get('curv_range') - curv_idx = context_nurbs.get('curv_idx', []) - parm_u = context_nurbs.get('parm_u', []) - parm_v = context_nurbs.get('parm_v', []) - name = context_nurbs.get('name', 'ObjNurb') - cstype = context_nurbs.get('cstype') + deg = context_nurbs.get(b'deg', (3,)) + curv_range = context_nurbs.get(b'curv_range') + curv_idx = context_nurbs.get(b'curv_idx', []) + parm_u = context_nurbs.get(b'parm_u', []) + parm_v = context_nurbs.get(b'parm_v', []) + name = context_nurbs.get(b'name', b'ObjNurb') + cstype = context_nurbs.get(b'cstype') if cstype is None: print('\tWarning, cstype not found') return - if cstype != 'bspline': + if cstype != b'bspline': print('\tWarning, cstype is not supported (only bspline)') return if not curv_idx: @@ -778,7 +779,7 @@ def create_nurbs(context_nurbs, vert_loc, new_objects): print('\tWarning, surfaces not supported') return - cu = bpy.data.curves.new(name, 'CURVE') + cu = bpy.data.curves.new(name.decode('utf-8', "surrogateescape"), 'CURVE') cu.dimensions = '3D' nu = cu.splines.new('NURBS') @@ -821,13 +822,13 @@ def create_nurbs(context_nurbs, vert_loc, new_objects): nu.use_cyclic_u = True ''' - ob = bpy.data.objects.new("Nurb", cu) + ob = bpy.data.objects.new(name.decode('utf-8', "surrogateescape"), cu) new_objects.append(ob) def strip_slash(line_split): - if line_split[-1][-1] == "\\": + if line_split[-1][-1] == 92: # '\' char if len(line_split[-1]) == 1: line_split.pop() # remove the \ item else: @@ -841,13 +842,13 @@ def get_float_func(filepath): find the float function for this obj file - whether to replace commas or not ''' - file = open(filepath, 'rU') + file = open(filepath, 'rb') for line in file: # .readlines(): line = line.lstrip() - if line.startswith('v'): # vn vt v - if ',' in line: - return lambda f: float(f.replace(',', '.')) - elif '.' in line: + if line.startswith(b'v'): # vn vt v + if b',' in line: + return lambda f: float(f.replace(b',', b'.')) + elif b'.' in line: return float # incase all vert values were ints @@ -872,6 +873,8 @@ def load(operator, context, filepath, ''' print('\nimporting obj %r' % filepath) + filepath = filepath.encode() + if SPLIT_OBJECTS or SPLIT_GROUPS: POLYGROUPS = False @@ -895,7 +898,7 @@ def load(operator, context, filepath, # Nurbs context_nurbs = {} nurbs = [] - context_parm = '' # used by nurbs too but could be used elsewhere + context_parm = b'' # used by nurbs too but could be used elsewhere has_ngons = False # has_smoothgroups= False - is explicit with len(unique_smooth_groups) being > 0 @@ -910,31 +913,31 @@ def load(operator, context, filepath, # it means they are multiline- # since we use xreadline we cant skip to the next line # so we need to know whether - context_multi_line = "" + context_multi_line = b'' print("\tparsing obj file...") time_sub = time.time() # time_sub= sys.time() - file = open(filepath, 'rU') + file = open(filepath, 'rb') for line in file: # .readlines(): line = line.lstrip() # rare cases there is white space at the start of the line - if line.startswith("v "): + if line.startswith(b"v "): line_split = line.split() # rotate X90: (x,-z,y) verts_loc.append((float_func(line_split[1]), -float_func(line_split[3]), float_func(line_split[2]))) - elif line.startswith("vn "): + elif line.startswith(b"vn "): pass - elif line.startswith("vt "): + elif line.startswith(b"vt "): line_split = line.split() verts_tex.append((float_func(line_split[1]), float_func(line_split[2]))) # Handel faces lines (as faces) and the second+ lines of fa multiline face here # use 'f' not 'f ' because some objs (very rare have 'fo ' for faces) - elif line.startswith('f') or context_multi_line == 'f': + elif line.startswith(b'f') or context_multi_line == b'f': if context_multi_line: # use face_vert_loc_indices and face_vert_tex_indices previously defined and used the obj_face @@ -955,17 +958,16 @@ def load(operator, context, filepath, )) if strip_slash(line_split): - context_multi_line = 'f' + context_multi_line = b'f' else: - context_multi_line = '' + context_multi_line = b'' for v in line_split: - obj_vert = v.split('/') - + obj_vert = v.split(b'/') vert_loc_index = int(obj_vert[0]) - 1 # Add the vertex to the current group # *warning*, this wont work for files that have groups defined around verts - if POLYGROUPS and context_vgroup: + if POLYGROUPS and context_vgroup: vertex_groups[context_vgroup].append(vert_loc_index) # Make relative negative vert indices absolute @@ -991,7 +993,7 @@ def load(operator, context, filepath, if len(face_vert_loc_indices) > 4: has_ngons = True - elif CREATE_EDGES and (line.startswith('l ') or context_multi_line == 'l'): + elif CREATE_EDGES and (line.startswith(b'l ') or context_multi_line == b'l'): # very similar to the face load function above with some parts removed if context_multi_line: @@ -1013,11 +1015,11 @@ def load(operator, context, filepath, )) if strip_slash(line_split): - context_multi_line = 'l' + context_multi_line = b'l' else: - context_multi_line = '' + context_multi_line = b'' - isline = line.startswith('l') + isline = line.startswith(b'l') for v in line_split: vert_loc_index = int(v) - 1 @@ -1028,53 +1030,53 @@ def load(operator, context, filepath, face_vert_loc_indices.append(vert_loc_index) - elif line.startswith('s'): + elif line.startswith(b's'): if CREATE_SMOOTH_GROUPS: context_smooth_group = line_value(line.split()) - if context_smooth_group == 'off': + if context_smooth_group == b'off': context_smooth_group = None elif context_smooth_group: # is not None unique_smooth_groups[context_smooth_group] = None - elif line.startswith('o'): + elif line.startswith(b'o'): if SPLIT_OBJECTS: context_object = line_value(line.split()) # unique_obects[context_object]= None - elif line.startswith('g'): + elif line.startswith(b'g'): if SPLIT_GROUPS: context_object = line_value(line.split()) # print 'context_object', context_object # unique_obects[context_object]= None elif POLYGROUPS: context_vgroup = line_value(line.split()) - if context_vgroup and context_vgroup != '(null)': + if context_vgroup and context_vgroup != b'(null)': vertex_groups.setdefault(context_vgroup, []) else: context_vgroup = None # dont assign a vgroup - elif line.startswith('usemtl'): + elif line.startswith(b'usemtl'): context_material = line_value(line.split()) unique_materials[context_material] = None - elif line.startswith('mtllib'): # usemap or usemat + elif line.startswith(b'mtllib'): # usemap or usemat material_libs = list(set(material_libs) | set(line.split()[1:])) # can have multiple mtllib filenames per line, mtllib can appear more than once, so make sure only occurance of material exists # Nurbs support - elif line.startswith('cstype '): - context_nurbs['cstype'] = line_value(line.split()) # 'rat bspline' / 'bspline' - elif line.startswith('curv ') or context_multi_line == 'curv': + elif line.startswith(b'cstype '): + context_nurbs[b'cstype'] = line_value(line.split()) # 'rat bspline' / 'bspline' + elif line.startswith(b'curv ') or context_multi_line == b'curv': line_split = line.split() - curv_idx = context_nurbs['curv_idx'] = context_nurbs.get('curv_idx', []) # incase were multiline + curv_idx = context_nurbs[b'curv_idx'] = context_nurbs.get(b'curv_idx', []) # incase were multiline if not context_multi_line: - context_nurbs['curv_range'] = float_func(line_split[1]), float_func(line_split[2]) + context_nurbs[b'curv_range'] = float_func(line_split[1]), float_func(line_split[2]) line_split[0:3] = [] # remove first 3 items if strip_slash(line_split): - context_multi_line = 'curv' + context_multi_line = b'curv' else: - context_multi_line = '' + context_multi_line = b'' for i in line_split: vert_loc_index = int(i) - 1 @@ -1084,38 +1086,38 @@ def load(operator, context, filepath, curv_idx.append(vert_loc_index) - elif line.startswith('parm') or context_multi_line == 'parm': + elif line.startswith(b'parm') or context_multi_line == b'parm': line_split = line.split() if context_multi_line: - context_multi_line = '' + context_multi_line = b'' else: context_parm = line_split[1] line_split[0:2] = [] # remove first 2 if strip_slash(line_split): - context_multi_line = 'parm' + context_multi_line = b'parm' else: - context_multi_line = '' + context_multi_line = b'' - if context_parm.lower() == 'u': - context_nurbs.setdefault('parm_u', []).extend([float_func(f) for f in line_split]) - elif context_parm.lower() == 'v': # surfaces not suported yet - context_nurbs.setdefault('parm_v', []).extend([float_func(f) for f in line_split]) + if context_parm.lower() == b'u': + context_nurbs.setdefault(b'parm_u', []).extend([float_func(f) for f in line_split]) + elif context_parm.lower() == b'v': # surfaces not suported yet + context_nurbs.setdefault(b'parm_v', []).extend([float_func(f) for f in line_split]) # else: # may want to support other parm's ? - elif line.startswith('deg '): - context_nurbs['deg'] = [int(i) for i in line.split()[1:]] - elif line.startswith('end'): + elif line.startswith(b'deg '): + context_nurbs[b'deg'] = [int(i) for i in line.split()[1:]] + elif line.startswith(b'end'): # Add the nurbs curve if context_object: - context_nurbs['name'] = context_object + context_nurbs[b'name'] = context_object nurbs.append(context_nurbs) context_nurbs = {} - context_parm = '' + context_parm = b'' ''' # How to use usemap? depricated? - elif line.startswith('usema'): # usemap or usemat + elif line.startswith(b'usema'): # usemap or usemat context_image= line_value(line.split()) ''' -- GitLab