From bf90970eca5471b86d900daffb2f8eebdf85a673 Mon Sep 17 00:00:00 2001 From: Arystanbek Dyussenov Date: Wed, 5 Aug 2009 09:49:59 +0000 Subject: [PATCH] - OBJ exporter now copies images - added OBJ, FBX scripts to File -> Export, File -> Import menus --- release/io/export_fbx.py | 33 ++++++++++---------- release/io/export_obj.py | 65 ++++++++++++++++++++++++---------------- release/ui/space_info.py | 3 ++ 3 files changed, 58 insertions(+), 43 deletions(-) diff --git a/release/io/export_fbx.py b/release/io/export_fbx.py index c50b60fd97e..ad9b3caa13a 100644 --- a/release/io/export_fbx.py +++ b/release/io/export_fbx.py @@ -1323,6 +1323,19 @@ def write(filename, batch_objects = None, \ file.write('\n\t\t}') file.write('\n\t}') + def copy_image(image): + + rel = image.get_export_path(basepath, True) + base = os.path.basename(fname_rel) + + if EXP_IMAGE_COPY: + src = bpy.sys.expandpath(image.filename) + absp = image.get_export_path(basepath, False) + if not os.path.exists(absp): + shutil.copy(src, absp) + + return (rel, base) + # tex is an Image (Arystan) def write_video(texname, tex): # Same as texture really! @@ -1336,15 +1349,7 @@ def write(filename, batch_objects = None, \ Property: "Width", "int", "",0 Property: "Height", "int", "",0''') if tex: - src = bpy.sys.expandpath(tex.filename) - fname_rel = tex.get_export_path(basepath, True) - fname_abs = tex.get_export_path(basepath, False) - fname_strip = os.path.basename(fname_rel) - - if EXP_IMAGE_COPY: - if !os.path.exists(fname_abs): - shutil.copy(src, fname_abs) - + fname_rel, fname_strip = copy_image(tex) # fname, fname_strip, fname_rel = derived_paths(tex.filename, basepath, EXP_IMAGE_COPY) else: fname = fname_strip = fname_rel = '' @@ -1409,15 +1414,7 @@ def write(filename, batch_objects = None, \ file.write('\n\t\tMedia: "Video::%s"' % texname) if tex: - src = bpy.sys.expandpath(tex.filename) - fname_rel = tex.get_export_path(basepath, True) - fname_abs = tex.get_export_path(basepath, False) - fname_strip = os.path.basename(fname_rel) - - if EXP_IMAGE_COPY: - if !os.path.exists(fname_abs): - shutil.copy(src, fname_abs) - + fname_rel, fname_strip = copy_image(tex) # fname, fname_strip, fname_rel = derived_paths(tex.filename, basepath, EXP_IMAGE_COPY) else: fname = fname_strip = fname_rel = '' diff --git a/release/io/export_obj.py b/release/io/export_obj.py index 4d67903c343..1209e10afe3 100644 --- a/release/io/export_obj.py +++ b/release/io/export_obj.py @@ -47,7 +47,7 @@ will be exported as mesh data. # import math and other in functions that use them for the sake of fast Blender startup # import math -import os # os.sep +import os import bpy import Mathutils @@ -83,13 +83,26 @@ def BPySys_cleanName(name): # A Dict of Materials # (material.name, image.name):matname_imagename # matname_imagename has gaps removed. -MTL_DICT = {} +MTL_DICT = {} -def write_mtl(scene, filename): +def write_mtl(scene, filename, copy_images): world = scene.world worldAmb = world.ambient_color + dest_dir = os.path.dirname(filename) + + def copy_image(image): + rel = image.get_export_path(dest_dir, True) + + if copy_images: + abspath = image.get_export_path(dest_dir, False) + if not os.path.exists(abs_path): + shutil.copy(bpy.sys.expandpath(image.filename), abs_path) + + return rel + + file = open(filename, "w") # XXX # file.write('# Blender3D MTL File: %s\n' % Blender.Get('filename').split('\\')[-1].split('/')[-1]) @@ -129,13 +142,17 @@ def write_mtl(scene, filename): # Write images! if img: # We have an image on the face! - file.write('map_Kd %s\n' % img.filename.split('\\')[-1].split('/')[-1]) # Diffuse mapping image + # write relative image path + rel = copy_image(img) + file.write('map_Kd %s\n' % rel) # Diffuse mapping image +# file.write('map_Kd %s\n' % img.filename.split('\\')[-1].split('/')[-1]) # Diffuse mapping image elif mat: # No face image. if we havea material search for MTex image. for mtex in mat.textures: if mtex and mtex.texure.type == 'IMAGE': try: - filename = mtex.texture.image.filename.split('\\')[-1].split('/')[-1] + filename = copy_image(mtex.texture.image) +# filename = mtex.texture.image.filename.split('\\')[-1].split('/')[-1] file.write('map_Kd %s\n' % filename) # Diffuse mapping image break except: @@ -146,6 +163,7 @@ def write_mtl(scene, filename): file.close() +# XXX not used def copy_file(source, dest): file = open(source, 'rb') data = file.read() @@ -156,6 +174,7 @@ def copy_file(source, dest): file.close() +# XXX not used def copy_images(dest_dir): if dest_dir[-1] != os.sep: dest_dir += os.sep @@ -181,7 +200,7 @@ def copy_images(dest_dir): pass # Now copy images -# copyCount = 0 + copyCount = 0 # for bImage in uniqueImages.values(): # image_path = bpy.sys.expandpath(bImage.filename) @@ -193,7 +212,7 @@ def copy_images(dest_dir): # copy_file(image_path, dest_image_path) # copyCount+=1 - paths= bpy.util.copy_images(uniqueImages.values(), dest_dir) +# paths= bpy.util.copy_images(uniqueImages.values(), dest_dir) print('\tCopied %d images' % copyCount) # print('\tCopied %d images' % copyCount) @@ -412,16 +431,11 @@ def write(filename, objects, scene, if ob.type != 'MESH': continue - if EXPORT_APPLY_MODIFIERS: - me = ob.create_mesh('PREVIEW') - else: - me = ob.data.create_copy() + me = ob.create_mesh(EXPORT_APPLY_MODIFIERS, 'PREVIEW') if EXPORT_ROTX90: - print(ob_mat * mat_xrot90) me.transform(ob_mat * mat_xrot90) else: - print(ob_mat) me.transform(ob_mat) # # Will work for non meshes now! :) @@ -597,7 +611,7 @@ def write(filename, objects, scene, # file.write('vt %.6f %.6f\n' % tuple(uv)) uv_unique_count = len(uv_dict) - del uv, uvkey, uv_dict, f_index, uv_index +# del uv, uvkey, uv_dict, f_index, uv_index # Only need uv_unique_count and uv_face_mapping # NORMAL, Smooth/Non smoothed. @@ -783,16 +797,17 @@ def write(filename, objects, scene, # Now we have all our materials, save them if EXPORT_MTL: - write_mtl(scene, mtlfilename) - if EXPORT_COPY_IMAGES: - dest_dir = filename - # Remove chars until we are just the path. - while dest_dir and dest_dir[-1] not in '\\/': - dest_dir = dest_dir[:-1] - if dest_dir: - copy_images(dest_dir) - else: - print('\tError: "%s" could not be used as a base for an image path.' % filename) + write_mtl(scene, mtlfilename, EXPORT_COPY_IMAGES) +# if EXPORT_COPY_IMAGES: +# dest_dir = os.path.basename(filename) +# # dest_dir = filename +# # # Remove chars until we are just the path. +# # while dest_dir and dest_dir[-1] not in '\\/': +# # dest_dir = dest_dir[:-1] +# if dest_dir: +# copy_images(dest_dir) +# else: +# print('\tError: "%s" could not be used as a base for an image path.' % filename) print("OBJ Export time: %.2f" % (bpy.sys.time() - time1)) # print "OBJ Export time: %.2f" % (sys.time() - time1) @@ -898,7 +913,7 @@ class EXPORT_OT_obj(bpy.types.Operator): bpy.props.StringProperty(attr="filename", name="File Name", description="File name used for exporting the PLY file", maxlen= 1024, default= ""), # context group - bpy.props.BoolProperty(attr="use_selection", name="Selection Only", description="", default= True), + bpy.props.BoolProperty(attr="use_selection", name="Selection Only", description="", default= False), bpy.props.BoolProperty(attr="use_all_scenes", name="All Scenes", description="", default= False), bpy.props.BoolProperty(attr="use_animation", name="All Animation", description="", default= False), diff --git a/release/ui/space_info.py b/release/ui/space_info.py index 855ce0b4f8f..3ec3bce3d91 100644 --- a/release/ui/space_info.py +++ b/release/ui/space_info.py @@ -74,6 +74,7 @@ class INFO_MT_file_import(bpy.types.Menu): def draw(self, context): layout = self.layout + layout.itemO("import.obj", text="OBJ") class INFO_MT_file_export(bpy.types.Menu): __space_type__ = "USER_PREFERENCES" @@ -82,6 +83,8 @@ class INFO_MT_file_export(bpy.types.Menu): def draw(self, context): layout = self.layout + layout.itemO("export.fbx", text="FBX") + layout.itemO("export.obj", text="OBJ") layout.itemO("export.ply", text="PLY") class INFO_MT_file_external_data(bpy.types.Menu):