diff --git a/io_coat3D/coat.py b/io_coat3D/coat.py new file mode 100644 index 0000000000000000000000000000000000000000..fc3cb74785c3739dceacfd509af132117544bff1 --- /dev/null +++ b/io_coat3D/coat.py @@ -0,0 +1,626 @@ +# ***** BEGIN GPL LICENSE BLOCK ***** +# +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# ***** END GPL LICENCE BLOCK ***** + +import bpy +from bpy.props import * +from io_coat3D import tex +import os + + +bpy.coat3D = dict() +bpy.coat3D['active_coat'] = '' +bpy.coat3D['status'] = 0 +def set_exchange_folder(): + platform = os.sys.platform + coat3D = bpy.context.scene.coat3D + Blender_export = "" + + if(platform == 'win32'): + exchange = os.path.expanduser("~") + os.sep + 'Documents' + os.sep + '3D-CoatV4' + os.sep +'Exchange' + if not(os.path.isdir(exchange)): + exchange = os.path.expanduser("~") + os.sep + 'Documents' + os.sep + '3D-CoatV3' + os.sep +'Exchange' + else: + exchange = os.path.expanduser("~") + os.sep + '3D-CoatV4' + os.sep + 'Exchange' + if not(os.path.isdir(exchange)): + exchange = os.path.expanduser("~") + os.sep + '3D-CoatV3' + os.sep + 'Exchange' + if(not(os.path.isdir(exchange))): + exchange = coat3D.exchangedir + + if(os.path.isdir(exchange)): + bpy.coat3D['status'] = 1 + if(platform == 'win32'): + exchange_path = os.path.expanduser("~") + os.sep + 'Documents' + os.sep + '3DC2Blender' + os.sep + 'Exchange_folder.txt' + applink_folder = os.path.expanduser("~") + os.sep + 'Documents' + os.sep + '3DC2Blender' + if(not(os.path.isdir(applink_folder))): + os.makedirs(applink_folder) + else: + exchange_path = os.path.expanduser("~") + os.sep + 'Documents' + os.sep + '3DC2Blender' + os.sep + 'Exchange_folder.txt' + applink_folder = os.path.expanduser("~") + os.sep + 'Documents' + os.sep + '3DC2Blender' + if(not(os.path.isdir(applink_folder))): + os.makedirs(applink_folder) + file = open(exchange_path, "w") + file.write("%s"%(coat3D.exchangedir)) + file.close() + + else: + if(platform == 'win32'): + exchange_path = os.path.expanduser("~") + os.sep + 'Documents' + os.sep + '3DC2Blender' + os.sep + 'Exchange_folder.txt' + else: + exchange_path = os.path.expanduser("~") + os.sep + '3DC2Blender' + os.sep + 'Exchange_folder.txt' + if(os.path.isfile(exchange_path)): + ex_path ='' + + ex_pathh = open(exchange_path) + for line in ex_pathh: + ex_path = line + break + ex_pathh.close() + + if(os.path.isdir(ex_path) and ex_path.rfind('Exchange') >= 0): + exchange = ex_path + bpy.coat3D['status'] = 1 + else: + bpy.coat3D['status'] = 0 + else: + bpy.coat3D['status'] = 0 + if(bpy.coat3D['status'] == 1): + Blender_folder = ("%s%sBlender"%(exchange,os.sep)) + Blender_export = Blender_folder + path3b_now = exchange + path3b_now += ('last_saved_3b_file.txt') + Blender_export += ('%sexport.txt'%(os.sep)) + + if(not(os.path.isdir(Blender_folder))): + os.makedirs(Blender_folder) + Blender_folder = os.path.join(Blender_folder,"run.txt") + file = open(Blender_folder, "w") + file.close() + return exchange + +def set_working_folders(): + platform = os.sys.platform + coat3D = bpy.context.scene.coat3D + if(platform == 'win32'): + folder_objects = os.path.expanduser("~") + os.sep + 'Documents' + os.sep + '3DC2Blender' + os.sep + 'Objects' + folder_textures = os.path.expanduser("~") + os.sep + 'Documents' + os.sep + '3DC2Blender' + os.sep + 'Textures' + os.sep + if(not(os.path.isdir(folder_objects))): + os.makedirs(folder_objects) + if(not(os.path.isdir(folder_textures))): + os.makedirs(folder_textures) + else: + folder_objects = os.path.expanduser("~") + os.sep + '3DC2Blender' + os.sep + 'Objects' + folder_textures = os.path.expanduser("~") + os.sep + '3DC2Blender' + os.sep + 'Textures' + os.sep + if(not(os.path.isdir(folder_objects))): + os.makedirs(folder_objects) + if(not(os.path.isdir(folder_textures))): + os.makedirs(folder_textures) + + + return folder_objects,folder_textures + +class ObjectButtonsPanel(): + bl_space_type = 'PROPERTIES' + bl_region_type = 'WINDOW' + bl_context = "object" + +class SCENE_PT_Main(ObjectButtonsPanel,bpy.types.Panel): + bl_label = "3D-Coat Applink" + bl_space_type = "PROPERTIES" + bl_region_type = "WINDOW" + bl_context = "scene" + + def draw(self, context): + layout = self.layout + scene = context.scene + me = context.scene.objects + mat_list = [] + import_no = 0 + coat = bpy.coat3D + coat3D = bpy.context.scene.coat3D + if(bpy.context.scene.objects.active): + coa = bpy.context.scene.objects.active.coat3D + + + if(bpy.coat3D['status'] == 0 and not(os.path.isdir(coat3D.exchangedir))): + bpy.coat3D['active_coat'] = set_exchange_folder() + row = layout.row() + row.label(text="Applink didn't find your 3d-Coat/Excahnge folder.") + row = layout.row() + row.label("Please select it before using Applink.") + row = layout.row() + row.prop(coat3D,"exchangedir",text="") + + else: + + + #Here you add your GUI + row = layout.row() + row.prop(coat3D,"type",text = "") + row = layout.row() + colL = row.column() + colR = row.column() + + colR.operator("export_applink.pilgway_3d_coat", text="Transfer") + + colL.operator("import_applink.pilgway_3d_coat", text="Update") + + + + + + + + + + +class SCENE_OT_export(bpy.types.Operator): + bl_idname = "export_applink.pilgway_3d_coat" + bl_label = "Export your custom property" + bl_description = "Export your custom property" + bl_options = {'UNDO'} + + def invoke(self, context, event): + checkname = '' + coat3D = bpy.context.scene.coat3D + scene = context.scene + activeobj = bpy.context.active_object.name + obj = scene.objects[activeobj] + coa = bpy.context.scene.objects.active.coat3D + coat3D.exchangedir = set_exchange_folder() + export_ok = False + + folder_objects,folder_textures = set_working_folders() + + if(coat3D.exchange_found == False): + return {'FINISHED'} + + if(bpy.context.selected_objects == []): + return {'FINISHED'} + else: + for objec in bpy.context.selected_objects: + if objec.type == 'MESH': + export_ok = True + if(export_ok == False): + return {'FINISHED'} + + importfile = coat3D.exchangedir + texturefile = coat3D.exchangedir + importfile += ('%simport.txt'%(os.sep)) + texturefile += ('%stextures.txt'%(os.sep)) + + looking = True + object_index = 0 + if(coa.applink_name and os.path.isfile(coa.applink_name)): + checkname = coa.applink_name + + else: + while(looking == True): + checkname = folder_objects + os.sep + activeobj + checkname = ("%s%.2d.obj"%(checkname,object_index)) + if(os.path.isfile(checkname)): + object_index += 1 + else: + looking = False + coa.applink_name = checkname + + + coat3D.cursor_loc = obj.location + coat3D.cursor_orginal = bpy.context.scene.cursor_location + + + + coa.loc = obj.location + coa.rot = obj.rotation_euler + coa.sca = obj.scale + coa.dime = obj.dimensions + + obj.location = (0,0,0) + obj.rotation_euler = (0,0,0) + bpy.ops.object.transform_apply(scale=True) + + bpy.ops.export_scene.obj(filepath=coa.applink_name,use_selection=True, + use_mesh_modifiers=False,use_blen_objects=True, use_materials = True, + keep_vertex_order = True,axis_forward='-Z',axis_up='Y') + + obj.location = coa.loc + obj.rotation_euler = coa.rot + + + bpy.context.scene.cursor_location = coat3D.cursor_loc + bpy.context.scene.cursor_location = coat3D.cursor_orginal + + file = open(importfile, "w") + file.write("%s"%(checkname)) + file.write("\n%s"%(checkname)) + file.write("\n[%s]"%(coat3D.type)) + file.write("\n[TexOutput:%s]"%(folder_textures)) + file.close() + + coa.objecttime = str(os.path.getmtime(coa.applink_name)) + + + + return {'FINISHED'} + +class SCENE_OT_import(bpy.types.Operator): + bl_idname = "import_applink.pilgway_3d_coat" + bl_label = "import your custom property" + bl_description = "import your custom property" + bl_options = {'UNDO'} + + def invoke(self, context, event): + scene = context.scene + coat3D = bpy.context.scene.coat3D + coat = bpy.coat3D + test = bpy.context.selected_objects + act_first = bpy.context.scene.objects.active + bpy.context.scene.game_settings.material_mode = 'GLSL' + coat3D.exchangedir = set_exchange_folder() + + folder_objects,folder_textures = set_working_folders() + + Blender_folder = ("%s%sBlender"%(coat3D.exchangedir,os.sep)) + Blender_export = Blender_folder + path3b_now = coat3D.exchangedir + path3b_now += ('last_saved_3b_file.txt') + Blender_export += ('%sexport.txt'%(os.sep)) + new_applink_name = 'False' + new_object = False + if(os.path.isfile(Blender_export)): + obj_pathh = open(Blender_export) + new_object = True + for line in obj_pathh: + new_applink_name = line + break + obj_pathh.close() + + for scene_objects in bpy.context.scene.objects: + if(scene_objects.type == 'MESH'): + if(scene_objects.coat3D.applink_name == new_applink_name): + new_object = False + + for act_name in test: + coa = act_name.coat3D + path_object = coa.applink_name + if act_name.type == 'MESH' and os.path.isfile(path_object): + multires_on = False + activeobj = act_name.name + mat_list = [] + scene.objects[activeobj].select = True + objekti = scene.objects[activeobj] + coat3D.loca = objekti.location + coat3D.rota = objekti.rotation_euler + coat3D.dime = objekti.scale + + + + #See if there is multres modifier. + for modifiers in objekti.modifiers: + if modifiers.type == 'MULTIRES' and (modifiers.total_levels > 0): + if(not(coat3D.importlevel)): + bpy.ops.object.multires_external_pack() + multires = coat3D.exchangedir + multires += ('%stemp.btx'%(os.sep)) + bpy.ops.object.multires_external_save(filepath=multires) + #bpy.ops.object.multires_external_pack() + multires_on = True + multires_name = modifiers.name + break + + exportfile = coat3D.exchangedir + path3b_n = coat3D.exchangedir + path3b_n += ('last_saved_3b_file.txt') + exportfile += ('%sexport.txt'%(os.sep)) + if(os.path.isfile(exportfile)): + export_file = open(exportfile) + for line in export_file: + if line.rfind('.3b'): + objekti.coat3D.coatpath = line + coat['active_coat'] = line + export_file.close() + os.remove(exportfile) + + if(len(objekti.material_slots) == 0): + delete_material = False + else: + delete_material = True + + + if(not(objekti.active_material) and objekti.material_slots): + act_mat_index = objekti.active_material_index + materials_old = bpy.data.materials.keys() + bpy.ops.material.new() + materials_new = bpy.data.materials.keys() + new_ma = list(set(materials_new).difference(set(materials_old))) + new_mat = new_ma[0] + ki = bpy.data.materials[new_mat] + objekti.material_slots[act_mat_index].material = ki + + + + if(os.path.isfile(path_object) and (coa.objecttime != str(os.path.getmtime(path_object)))): + + if(objekti.material_slots): + act_mat_index = objekti.active_material_index + for obj_mat in objekti.material_slots: + mat_list.append(obj_mat.material) + + coa.dime = objekti.dimensions + coa.objecttime = str(os.path.getmtime(path_object)) + mtl = coa.applink_name + mtl = mtl.replace('.obj','.mtl') + if(os.path.isfile(mtl)): + os.remove(mtl) + + bpy.ops.import_scene.obj(filepath=path_object,axis_forward='-Z',axis_up='Y',use_image_search=False) + obj_proxy = scene.objects[0] + bpy.ops.object.select_all(action='TOGGLE') + obj_proxy.select = True + + + bpy.ops.object.transform_apply(rotation=True) + proxy_mat = obj_proxy.material_slots[0].material + if(delete_material): + while(list(obj_proxy.data.materials) != []): + proxy_mat = obj_proxy.material_slots[0].material + obj_proxy.data.materials.pop(0,1) + proxy_mat.user_clear() + bpy.data.materials.remove(proxy_mat) + bpy.ops.object.select_all(action='TOGGLE') + + if(coat3D.importlevel): + obj_proxy.select = True + obj_proxy.modifiers.new(name='temp',type='MULTIRES') + objekti.select = True + bpy.ops.object.multires_reshape(modifier=multires_name) + bpy.ops.object.select_all(action='TOGGLE') + multires_on = False + else: + + scene.objects.active = obj_proxy + + obj_data = objekti.data.id_data + objekti.data = obj_proxy.data.id_data + if(bpy.data.meshes[obj_data.name].users == 0): + objekti.data.id_data.name = obj_data.name + bpy.data.meshes.remove(obj_data) + + + obj_proxy.select = True + bpy.ops.object.delete() + objekti.select = True + objekti.scale = coat3D.dime + + bpy.context.scene.objects.active = objekti + + if(os.path.isfile(path3b_n)): + path3b_fil = open(path3b_n) + for lin in path3b_fil: + objekti.coat3D.path3b = lin + path3b_fil.close() + os.remove(path3b_n) + + if(coat3D.importmesh and not(os.path.isfile(path_object))): + coat3D.importmesh = False + + if(mat_list and coat3D.importmesh): + for mat_one in mat_list: + objekti.data.materials.append(mat_one) + objekti.active_material_index = act_mat_index + + if(mat_list): + for obj_mate in objekti.material_slots: + if(hasattr(obj_mate.material,'texture_slots')): + for tex_slot in obj_mate.material.texture_slots: + if(hasattr(tex_slot,'texture')): + if(tex_slot.texture.type == 'IMAGE'): + if tex_slot.texture.image is not None: + tex_slot.texture.image.reload() + + + if(coat3D.importtextures): + export = '' + tex.gettex(mat_list,objekti,scene,export) + + if(multires_on): + temp_file = coat3D.exchangedir + temp_file += ('%stemp2.btx'%(os.sep)) + if(objekti.modifiers[multires_name].levels == 0): + objekti.modifiers[multires_name].levels = 1 + bpy.ops.object.multires_external_save(filepath=temp_file) + objekti.modifiers[multires_name].filepath = multires + objekti.modifiers[multires_name].levels = 0 + + else: + bpy.ops.object.multires_external_save(filepath=temp_file) + objekti.modifiers[multires_name].filepath = multires + #bpy.ops.object.multires_external_pack() + bpy.ops.object.shade_smooth() + + + for act_name in test: + act_name.select = True + bpy.context.scene.objects.active = act_first + + if(new_object == True): + coat3D = bpy.context.scene.coat3D + scene = context.scene + + Blender_folder = ("%s%sBlender"%(coat3D.exchangedir,os.sep)) + Blender_export = Blender_folder + path3b_now = coat3D.exchangedir + path3b_now += ('last_saved_3b_file.txt') + Blender_export += ('%sexport.txt'%(os.sep)) + + + mat_list = [] + obj_path ='' + + + export = new_applink_name + mod_time = os.path.getmtime(new_applink_name) + mtl_list = new_applink_name.replace('.obj','.mtl') + if(os.path.isfile(mtl_list)): + os.remove(mtl_list) + + bpy.ops.import_scene.obj(filepath=new_applink_name,axis_forward='-Z',axis_up='Y') + bpy.ops.object.transform_apply(rotation=True) + new_obj = scene.objects[0] + new_obj.coat3D.applink_name = obj_path + scene.objects[0].coat3D.applink_name = export #objectdir muutettava + + os.remove(Blender_export) + + bpy.context.scene.objects.active = new_obj + + bpy.ops.object.shade_smooth() + + Blender_tex = ("%s%stextures.txt"%(coat3D.exchangedir,os.sep)) + mat_list.append(new_obj.material_slots[0].material) + tex.gettex(mat_list, new_obj, scene,export) + + return {'FINISHED'} + + + +from bpy import * +from mathutils import Vector, Matrix + +# 3D-Coat Dynamic Menu +class VIEW3D_MT_Coat_Dynamic_Menu(bpy.types.Menu): + bl_label = "3D-Coat Applink Menu" + + def draw(self, context): + layout = self.layout + settings = context.tool_settings + layout.operator_context = 'INVOKE_REGION_WIN' + coat3D = bpy.context.scene.coat3D + Blender_folder = ("%s%sBlender"%(coat3D.exchangedir,os.sep)) + Blender_export = Blender_folder + Blender_export += ('%sexport.txt'%(os.sep)) + + ob = context + if ob.mode == 'OBJECT': + if(bpy.context.selected_objects): + for ind_obj in bpy.context.selected_objects: + if(ind_obj.type == 'MESH'): + layout.active = True + break + layout.active = False + + if(layout.active == True): + + layout.operator("import_applink.pilgway_3d_coat", text="Import") + layout.separator() + + layout.operator("export_applink.pilgway_3d_coat", text="Export") + layout.separator() + + layout.menu("VIEW3D_MT_ImportMenu") + layout.separator() + + layout.menu("VIEW3D_MT_ExportMenu") + layout.separator() + + layout.menu("VIEW3D_MT_ExtraMenu") + layout.separator() + + if(len(bpy.context.selected_objects) == 1): + if(os.path.isfile(bpy.context.selected_objects[0].coat3D.path3b)): + layout.operator("import_applink.pilgway_3d_coat_3b", text="Load 3b") + layout.separator() + + if(os.path.isfile(Blender_export)): + + layout.operator("import3b_applink.pilgway_3d_coat", text="Bring from 3D-Coat") + layout.separator() + else: + if(os.path.isfile(Blender_export)): + layout.active = True + + layout.operator("import3b_applink.pilgway_3d_coat", text="Bring from 3D-Coat") + layout.separator() + else: + if(os.path.isfile(Blender_export)): + + + layout.operator("import3b_applink.pilgway_3d_coat", text="Bring from 3D-Coat") + layout.separator() + +class VIEW3D_MT_ImportMenu(bpy.types.Menu): + bl_label = "Import Settings" + + def draw(self, context): + layout = self.layout + coat3D = bpy.context.scene.coat3D + settings = context.tool_settings + layout.operator_context = 'INVOKE_REGION_WIN' + layout.prop(coat3D,"importmesh") + layout.prop(coat3D,"importmod") + layout.prop(coat3D,"smooth_on") + layout.prop(coat3D,"importtextures") + +class VIEW3D_MT_ExportMenu(bpy.types.Menu): + bl_label = "Export Settings" + + def draw(self, context): + layout = self.layout + coat3D = bpy.context.scene.coat3D + settings = context.tool_settings + layout.operator_context = 'INVOKE_REGION_WIN' + layout.prop(coat3D,"exportover") + if(coat3D.exportover): + layout.prop(coat3D,"exportmod") + +class VIEW3D_MT_ExtraMenu(bpy.types.Menu): + bl_label = "Extra" + + def draw(self, context): + layout = self.layout + coat3D = bpy.context.scene.coat3D + settings = context.tool_settings + layout.operator_context = 'INVOKE_REGION_WIN' + + layout.operator("import_applink.pilgway_3d_deltex",text="Delete all Textures") + layout.separator() + +def register(): + bpy.utils.register_module(__name__) + + kc = bpy.context.window_manager.keyconfigs.addon + if kc: + km = kc.keymaps.new(name='3D View', space_type='VIEW_3D') + kmi = km.keymap_items.new('wm.call_menu2', 'Q', 'PRESS') + kmi.properties.name = "VIEW3D_MT_Coat_Dynamic_Menu" + +def unregister(): + bpy.utils.unregister_module(__name__) + + kc = bpy.context.window_manager.keyconfigs.addon + if kc: + km = kc.keymapskeymaps['3D View'] + for kmi in km.keymap_items: + if kmi.idname == '': + if kmi.properties.name == "VIEW3D_MT_Coat_Dynamic_Menu": + km.keymap_items.remove(kmi) + break + + +if __name__ == "__main__": + register()