diff options
author | Campbell Barton <ideasman42@gmail.com> | 2018-08-07 03:10:31 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2018-08-07 03:10:35 +0300 |
commit | 6c3a46dc113de870a03191e4c0685238b0823acd (patch) | |
tree | 7c0647e5934152ce3bedeca320a776495716b342 /io_coat3D | |
parent | c24fa9fdf27ab6e4409d7ea2d6136c63c556dc22 (diff) |
Revert "updating the script to work the latest 2.8"
This reverts commit c87ee4d46f16d60a2e1db7514c8d5ab42c5d93df.
Use 'blender2.8' branch for this.
Diffstat (limited to 'io_coat3D')
-rw-r--r-- | io_coat3D/__init__.py | 1068 | ||||
-rw-r--r-- | io_coat3D/coat.py | 626 | ||||
-rw-r--r-- | io_coat3D/tex.py | 142 |
3 files changed, 859 insertions, 977 deletions
diff --git a/io_coat3D/__init__.py b/io_coat3D/__init__.py index a55d8a17..b5539ede 100644 --- a/io_coat3D/__init__.py +++ b/io_coat3D/__init__.py @@ -20,7 +20,7 @@ bl_info = { "name": "3D-Coat Applink", "author": "Kalle-Samuli Riihikoski (haikalle)", "version": (3, 5, 22), - "blender": (2, 80, 0), + "blender": (2, 59, 0), "location": "Scene > 3D-Coat Applink", "description": "Transfer data between 3D-Coat/Blender", "warning": "", @@ -35,14 +35,9 @@ if "bpy" in locals(): importlib.reload(coat) importlib.reload(tex) else: + from . import coat from . import tex -from io_coat3D import tex -import os -import ntpath -import re - -import time import bpy from bpy.types import PropertyGroup from bpy.props import ( @@ -54,849 +49,244 @@ from bpy.props import ( ) -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'): - if(bpy.data.filepath == ''): - 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 - else: - folder_objects = os.path.dirname(bpy.data.filepath) + os.sep + '3DCApplink' + os.sep + 'Objects' - folder_textures = os.path.dirname(bpy.data.filepath) + os.sep + '3DCApplink' + os.sep + 'Textures' + os.sep - print('mitas sanoo', folder_objects) - 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.active_object): - coa = bpy.context.active_object.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 - coa = bpy.context.active_object.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_address and os.path.isfile(coa.applink_address)): - checkname = coa.applink_address - - else: - while(looking == True): - checkname = folder_objects + os.sep + activeobj - checkname = ("%s%.2d.dae"%(checkname,object_index)) - if(os.path.isfile(checkname)): - object_index += 1 - else: - looking = False - coa.applink_name = ("%s%.2d"%(activeobj,object_index)) - coa.applink_address = checkname - for objekti in bpy.context.selected_objects: - if(objekti.material_slots.keys() == []): - bpy.ops.material.new() - objekti.data.materials.append(bpy.data.materials[-1]) - - bpy.ops.object.origin_set(type='ORIGIN_GEOMETRY') - #bpy.ops.object.transforms_to_deltas(mode='ROT') - - bpy.ops.wm.collada_export(filepath=coa.applink_address, selected=True, - apply_modifiers=False, triangulate=False) - - 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() - group_index = -1.0 - - for objekti in bpy.context.selected_objects: - nimi = '' - for koko in bpy.context.selected_objects: - nimi += koko.name + ':::' - objekti.coat3D.applink_group = nimi - objekti.coat3D.applink_address = coa.applink_address - objekti.coat3D.applink_name = coa.applink_name - objekti.coat3D.applink_firsttime = True - - #coa.objecttime = str(os.path.getmtime(coa.applink_address)) - - - 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): - - coat3D = bpy.context.scene.coat3D - coat = bpy.coat3D - 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_address = '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_address = line - break - obj_pathh.close() - - for scene_objects in bpy.context.scene.objects: - if(scene_objects.type == 'MESH'): - if(scene_objects.coat3D.applink_address == new_applink_address): - new_object = False - - if(new_object == False): - - #Blender -> 3DC -> Blender workflow - - for objekti in bpy.context.scene.objects: - obj_coat = objekti.coat3D - - if(obj_coat.applink_address != '' and os.path.isfile(obj_coat.applink_address) and obj_coat.applink_skip == 'False'): - obj_coat.applink_skip = 'True' - objekti.select_set('SELECT') - 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) - - - obj_names = objekti.coat3D.applink_group - print('obj_names:',obj_names) - obj_list = obj_names.split(':::') - print('obj_list:',obj_list) - applinks = [] - mat_list = [] - for app_obj in obj_list: - print('sisalla app_obj') - pnimi = app_obj.lstrip() - print('pnimi', pnimi) - listed = re.split(r'[:::]', pnimi) - print('listed: ',listed) - for tobj in bpy.context.scene.collection.all_objects: - if(tobj.name == app_obj): - print('tobj:',tobj) - applinks.append(tobj) - if(obj_coat.objecttime != str(os.path.getmtime(obj_coat.applink_address))): - materials_old = bpy.data.materials.keys() - obj_coat.dime = objekti.dimensions - obj_coat.objecttime = str(os.path.getmtime(obj_coat.applink_address)) - bpy.ops.wm.collada_import(filepath=obj_coat.applink_address) - bpy.ops.object.select_all(action='DESELECT') - - - materials_new = bpy.data.materials.keys() - new_ma = list(set(materials_new).difference(set(materials_old))) - proxy_index = -1 - #bpy.data.materials.remove(bpy.data.materials[-1]) - counter = 1 - del_list = [] - print('applinkki lista:', applinks) - - for obe in applinks: - print('kuka etsii:', obe) - counter += 1 - obe.coat3D.applink_skip = 'True' - if(obe.coat3D.applink_address == objekti.coat3D.applink_address and obe.type == 'MESH'): - use_smooth = obe.data.polygons[0].use_smooth - - if(obe.material_slots): - act_mat = obe.active_material - for obj_mat in obe.material_slots: - mat_list.append(obj_mat.material) - - #finds a object that was imported - if(obe.coat3D.applink_export == False): - find_name = obe.name + '-mesh' - find_name = find_name.replace('.', '_') - else: - find_name = obe.name + '.001' - for allobjekti in bpy.context.scene.collection.all_objects: - print('allobject', allobjekti) - print('find_name', find_name) - counter = 0 - - if(allobjekti.name == find_name): - print('löyty:',allobjekti) - obj_proxy = allobjekti - del_list.append(allobjekti) - break - - bpy.ops.object.select_all(action='DESELECT') - print('ja mitahan tassa', obj_proxy) - obj_proxy.select_set('SELECT') - - bpy.ops.object.select_all(action='TOGGLE') - - if(coat3D.importlevel): - obj_proxy.select = True - obj_proxy.modifiers.new(name='temp',type='MULTIRES') - obe.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 HACKKI - obj_proxy.select_set('SELECT') - - obj_data = obe.data.id_data - obe.data = obj_proxy.data.id_data - if(bpy.data.meshes[obj_data.name].users == 0): - obe.data.id_data.name = obj_data.name - bpy.data.meshes.remove(obj_data) - - - objekti.select_set('SELECT') - if (obe.coat3D.applink_firsttime == True): - print('ensimmainen', obe) - obe.scale = (1, 1, 1) - obe.rotation_euler = (0,0,0) - obe.coat3D.applink_firsttime = False - print('toimiiko', objekti) - bpy.ops.object.origin_set(type='GEOMETRY_ORIGIN') - proxy_index -= 1 - obe.material_slots[0].material = act_mat - - if (use_smooth): - for data_mesh in obe.data.polygons: - data_mesh.use_smooth = True - - bpy.ops.object.select_all(action='DESELECT') - - print('tuholista', del_list) - for deleting in del_list: - print('tuhotaan: ', deleting) - deleting.select_set(action='SELECT') - bpy.ops.object.delete() - mat_index = 0 - for obe in applinks: - bpy.data.materials.remove(bpy.data.materials[new_ma[mat_index]]) - mat_index +=1 - - 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(objekti.coat3D.applink_address))): - coat3D.importmesh = False - - for obe in applinks: - obe.select_set('SELECT') - if(coat3D.importtextures): - is_new = False - tex.matlab(mat_list,obe,bpy.context.scene,is_new) - obe.select_set('DESELECT') - - for objekti in bpy.context.scene.objects: - objekti.coat3D.applink_skip = 'False' - - for material in bpy.data.materials: - if material.use_nodes == True: - for node in material.node_tree.nodes: - if (node.name).startswith('3DC'): - node.location = node.location - - else: - - # 3DC -> Blender workflow - - 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 = [] - - bpy.ops.wm.collada_import(filepath=new_applink_address) - - new_obj = bpy.context.collection.objects[-1] - new_obj.coat3D.applink_address = new_applink_address - print('addressi on:', new_applink_address) - splittext = ntpath.basename(new_applink_address) - new_obj.coat3D.applink_name = splittext.split('.')[0] - new_obj.coat3D.applink_group = new_obj.name - new_obj.coat3D.applink_export = True - print('nimi on:', new_obj.coat3D.applink_name) - - os.remove(Blender_export) - new_obj.select_set('SELECT') - bpy.ops.object.origin_set(type='GEOMETRY_ORIGIN') - #bpy.ops.object.transforms_to_deltas(mode='ROT') - new_obj.rotation_euler = (0, 0, 0) - - mat_list.append(new_obj.material_slots[0].material) - is_new = True - tex.matlab(mat_list, new_obj, bpy.context.scene,is_new) - - for material in bpy.data.materials: - if material.use_nodes == True: - for node in material.node_tree.nodes: - if (node.name).startswith('3DC'): - node.location = node.location - - - 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() - -class ObjectCoat3D(PropertyGroup): - objpath: StringProperty( - name="Object_Path" - ) - applink_address: StringProperty( - name="Object_Applink_address" - ) - applink_name: StringProperty( - name="Applink object name" - ) - applink_group: StringProperty( - name="Applink group" - ) - applink_skip: StringProperty( - name="Object_Applink_Update", - default="False" - ) - applink_firsttime: BoolProperty( - name="FirstTime", - description="FirstTime", - default=True - ) - applink_export: BoolProperty( - name="FirstTime", - description="Object is from 3d-ocat", - default=False - ) - coatpath: StringProperty( - name="Coat_Path" - ) - objectdir: StringProperty( - name="ObjectPath", - subtype="FILE_PATH" - ) - objecttime: StringProperty( - name="ObjectTime", - subtype="FILE_PATH" - ) - texturefolder: StringProperty( - name="Texture folder:", - subtype="DIR_PATH" - ) - path3b: StringProperty( - name="3B Path", - subtype="FILE_PATH" - ) - export_on: BoolProperty( - name="Export_On", - description="Add Modifiers and export", - default=False - ) - dime: FloatVectorProperty( - name="dime", - description="Dimension" - ) - loc: FloatVectorProperty( - name="Location", - description="Location" - ) - rot: FloatVectorProperty( - name="Rotation", - description="Rotation", - subtype='EULER' - ) - sca: FloatVectorProperty( - name="Scale", - description="Scale" - ) - - -class SceneCoat3D(PropertyGroup): - defaultfolder: StringProperty( - name="FilePath", - subtype="DIR_PATH", - ) - cursor_loc: FloatVectorProperty( - name="Cursor_loc", - description="location" - ) - exchangedir: StringProperty( - name="FilePath", - subtype="DIR_PATH" - ) - exchangefolder: StringProperty( - name="FilePath", - subtype="DIR_PATH" - ) - wasactive: StringProperty( - name="Pass active object", - ) - import_box: BoolProperty( - name="Import window", - description="Allows to skip import dialog", - default=True - ) - exchange_found: BoolProperty( - name="Exchange Found", - description="Alert if Exchange folder is not found", - default=True - ) - export_box: BoolProperty( - name="Export window", - description="Allows to skip export dialog", - default=True - ) - export_color: BoolProperty( - name="Export color", - description="Export color texture", - default=True - ) - export_spec: BoolProperty( - name="Export specular", - description="Export specular texture", - default=True - ) - export_normal: BoolProperty( - name="Export Normal", - description="Export normal texture", - default=True - ) - export_disp: BoolProperty( - name="Export Displacement", - description="Export displacement texture", - default=True - ) - export_position: BoolProperty( - name="Export Source Position", - description="Export source position", - default=True - ) - export_zero_layer: BoolProperty( - name="Export from Layer 0", - description="Export mesh from Layer 0", - default=True - ) - export_coarse: BoolProperty( - name="Export Coarse", - description="Export Coarse", - default=True - ) - exportfile: BoolProperty( - name="No Import File", - description="Add Modifiers and export", - default=False - ) - importmod: BoolProperty( - name="Remove Modifiers", - description="Import and add modifiers", - default=False - ) - exportmod: BoolProperty( - name="Modifiers", - description="Export modifiers", - default=False - ) - export_pos: BoolProperty( - name="Remember Position", - description="Remember position", - default=True - ) - importtextures: BoolProperty( - name="Bring Textures", - description="Import Textures", - default=True - ) - importlevel: BoolProperty( - name="Multires. Level", - description="Bring Specific Multires Level", - default=False - ) - exportover: BoolProperty( - name="Export Obj", - description="Import Textures", - default=False - ) - importmesh: BoolProperty( - name="Mesh", - description="Import Mesh", - default=True - ) - - # copy location - - loca: FloatVectorProperty( - name="location", - description="Location", - subtype="XYZ", - default=(0.0, 0.0, 0.0) - ) - rota: FloatVectorProperty( - name="location", - description="Location", - subtype="EULER", - default=(0.0, 0.0, 0.0) - ) - scal: FloatVectorProperty( - name="location", - description="Location", - subtype="XYZ", - default=(0.0, 0.0, 0.0) - ) - dime: FloatVectorProperty( - name="dimension", - description="Dimension", - subtype="XYZ", - default=(0.0, 0.0, 0.0) - ) - type: EnumProperty( - name="Export Type", - description="Different Export Types", - items=(("ppp", "Per-Pixel Painting", ""), - ("mv", "Microvertex Painting", ""), - ("ptex", "Ptex Painting", ""), - ("uv", "UV-Mapping", ""), - ("ref", "Reference Mesh", ""), - ("retopo", "Retopo mesh as new layer", ""), - ("vox", "Mesh As Voxel Object", ""), - ("alpha", "Mesh As New Pen Alpha", ""), - ("prim", "Mesh As Voxel Primitive", ""), - ("curv", "Mesh As a Curve Profile", ""), - ("autopo", "Mesh For Auto-retopology", ""), - ), - default="ppp" - ) - - -classes = ( - #ObjectButtonsPanel, - SCENE_PT_Main, - SCENE_OT_export, - SCENE_OT_import, - VIEW3D_MT_Coat_Dynamic_Menu, - VIEW3D_MT_ImportMenu, - VIEW3D_MT_ExportMenu, - VIEW3D_MT_ExtraMenu, - ObjectCoat3D, - SceneCoat3D, - ) - def register(): bpy.coat3D = dict() bpy.coat3D['active_coat'] = '' bpy.coat3D['status'] = 0 bpy.coat3D['kuva'] = 1 - from bpy.utils import register_class - for cls in classes: - register_class(cls) - - bpy.types.Object.coat3D = PointerProperty(type=ObjectCoat3D) - bpy.types.Scene.coat3D = PointerProperty(type=SceneCoat3D) - - 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" - ''' + class ObjectCoat3D(PropertyGroup): + objpath = StringProperty( + name="Object_Path" + ) + applink_name = StringProperty( + name="Object_Applink_name" + ) + coatpath = StringProperty( + name="Coat_Path" + ) + objectdir = StringProperty( + name="ObjectPath", + subtype="FILE_PATH" + ) + objecttime = StringProperty( + name="ObjectTime", + subtype="FILE_PATH" + ) + texturefolder = StringProperty( + name="Texture folder:", + subtype="DIR_PATH" + ) + path3b = StringProperty( + name="3B Path", + subtype="FILE_PATH" + ) + export_on = BoolProperty( + name="Export_On", + description="Add Modifiers and export", + default=False + ) + dime = FloatVectorProperty( + name="dime", + description="Dimension" + ) + loc = FloatVectorProperty( + name="Location", + description="Location" + ) + rot = FloatVectorProperty( + name="Rotation", + description="Rotation", + subtype='EULER' + ) + sca = FloatVectorProperty( + name="Scale", + description="Scale" + ) + + class SceneCoat3D(PropertyGroup): + defaultfolder = StringProperty( + name="FilePath", + subtype="DIR_PATH", + ) + cursor_loc = FloatVectorProperty( + name="Cursor_loc", + description="location" + ) + exchangedir = StringProperty( + name="FilePath", + subtype="DIR_PATH" + ) + exchangefolder = StringProperty( + name="FilePath", + subtype="DIR_PATH" + ) + wasactive = StringProperty( + name="Pass active object", + ) + import_box = BoolProperty( + name="Import window", + description="Allows to skip import dialog", + default=True + ) + exchange_found = BoolProperty( + name="Exchange Found", + description="Alert if Exchange folder is not found", + default=True + ) + export_box = BoolProperty( + name="Export window", + description="Allows to skip export dialog", + default=True + ) + export_color = BoolProperty( + name="Export color", + description="Export color texture", + default=True + ) + export_spec = BoolProperty( + name="Export specular", + description="Export specular texture", + default=True + ) + export_normal = BoolProperty( + name="Export Normal", + description="Export normal texture", + default=True + ) + export_disp = BoolProperty( + name="Export Displacement", + description="Export displacement texture", + default=True + ) + export_position = BoolProperty( + name="Export Source Position", + description="Export source position", + default=True + ) + export_zero_layer = BoolProperty( + name="Export from Layer 0", + description="Export mesh from Layer 0", + default=True + ) + export_coarse = BoolProperty( + name="Export Coarse", + description="Export Coarse", + default=True + ) + exportfile = BoolProperty( + name="No Import File", + description="Add Modifiers and export", + default=False + ) + importmod = BoolProperty( + name="Remove Modifiers", + description="Import and add modifiers", + default=False + ) + exportmod = BoolProperty( + name="Modifiers", + description="Export modifiers", + default=False + ) + export_pos = BoolProperty( + name="Remember Position", + description="Remember position", + default=True + ) + importtextures = BoolProperty( + name="Bring Textures", + description="Import Textures", + default=True + ) + importlevel = BoolProperty( + name="Multires. Level", + description="Bring Specific Multires Level", + default=False + ) + exportover = BoolProperty( + name="Export Obj", + description="Import Textures", + default=False + ) + importmesh = BoolProperty( + name="Mesh", + description="Import Mesh", + default=True + ) + + # copy location + cursor = FloatVectorProperty( + name="Cursor", + description="Location", + subtype="XYZ", + default=(0.0, 0.0, 0.0) + ) + loca = FloatVectorProperty( + name="location", + description="Location", + subtype="XYZ", + default=(0.0, 0.0, 0.0) + ) + rota = FloatVectorProperty( + name="location", + description="Location", + subtype="EULER", + default=(0.0, 0.0, 0.0) + ) + scal = FloatVectorProperty( + name="location", + description="Location", + subtype="XYZ", + default=(0.0, 0.0, 0.0) + ) + dime = FloatVectorProperty( + name="dimension", + description="Dimension", + subtype="XYZ", + default=(0.0, 0.0, 0.0) + ) + type = EnumProperty( + name="Export Type", + description="Different Export Types", + items=(("ppp", "Per-Pixel Painting", ""), + ("mv", "Microvertex Painting", ""), + ("ptex", "Ptex Painting", ""), + ("uv", "UV-Mapping", ""), + ("ref", "Reference Mesh", ""), + ("retopo", "Retopo mesh as new layer", ""), + ("vox", "Mesh As Voxel Object", ""), + ("alpha", "Mesh As New Pen Alpha", ""), + ("prim", "Mesh As Voxel Primitive", ""), + ("curv", "Mesh As a Curve Profile", ""), + ("autopo", "Mesh For Auto-retopology", ""), + ), + default="ppp" + ) + + bpy.utils.register_module(__name__) + + bpy.types.Object.coat3D = PointerProperty( + name="Applink Variables", + type=ObjectCoat3D, + description="Applink variables" + ) + bpy.types.Scene.coat3D = PointerProperty( + name="Applink Variables", + type=SceneCoat3D, + description="Applink variables" + ) def unregister(): - import bpy - from bpy.utils import unregister_class del bpy.types.Object.coat3D del bpy.types.Scene.coat3D del bpy.coat3D - ''' - 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 - ''' - for cls in reversed(classes): - unregister_class(cls) + + bpy.utils.unregister_module(__name__) + + +if __name__ == "__main__": + register() diff --git a/io_coat3D/coat.py b/io_coat3D/coat.py new file mode 100644 index 00000000..fc3cb747 --- /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() diff --git a/io_coat3D/tex.py b/io_coat3D/tex.py index 4c516def..f532177c 100644 --- a/io_coat3D/tex.py +++ b/io_coat3D/tex.py @@ -19,9 +19,8 @@ import bpy import os -import re -def find_index(objekti): +def find_index(objekti): luku = 0 for tex in objekti.active_material.texture_slots: if(not(hasattr(tex,'texture'))): @@ -29,143 +28,10 @@ def find_index(objekti): luku = luku +1 return luku -def readtexturefolder(objekti,is_new): #read textures from texture file - - coat3D = bpy.context.scene.coat3D - obj_coat = objekti.coat3D - - texcoat = {} - texcoat['color'] = [] - texcoat['metalness'] = [] - texcoat['rough'] = [] - texcoat['nmap'] = [] - texcoat['disp'] = [] - - if(is_new == True): - files_dir = os.path.dirname(os.path.abspath(objekti.coat3D.applink_address)) - else: - if(bpy.data.filepath == ''): - files_dir = os.path.dirname(os.path.abspath(objekti.coat3D.applink_address)) - files_dir = files_dir.replace('3DC2Blender' + os.sep + 'Objects','3DC2Blender' + os.sep + 'Textures') - else: - files_dir = os.path.dirname(bpy.data.filepath) + os.sep + '3DCApplink' + os.sep + 'Textures' - files = os.listdir(files_dir) - materiaali_muutos = objekti.active_material.name - uusin_mat = materiaali_muutos.replace('Material.','Material_') - for i in files: - if(i.startswith(obj_coat.applink_name + '_' + uusin_mat)): - koko_osoite = files_dir + os.sep + i - listed = re.split(r'[_.]', i) - tex_name = listed[-2] - texcoat[tex_name].append(koko_osoite) - - - createnodes(objekti, texcoat) - -def checkmaterial(mat_list, objekti): #check how many materials object has - mat_list = [] - - for obj_mate in objekti.material_slots: - if(obj_mate.material.use_nodes == False): - obj_mate.material.use_nodes = True - -def createnodes(objekti,texcoat): #luo nodes palikat ja linkittaa tekstuurit niihin - bring_color = True #naiden tarkoitus on tsekata onko tarvetta luoda uusi node vai riittaako paivitys - bring_metalness = True - bring_roughness = True - bring_normal = True - bring_disp = True - - act_material = objekti.active_material - if(objekti.active_material.use_nodes == False): - objekti.active_material.use_nodes = True - - #ensimmaiseksi kaydaan kaikki image nodet lapi ja tarkistetaan onko nimi 3DC alkunen jos on niin reload - - for node in act_material.node_tree.nodes: - if(node.type == 'TEX_IMAGE'): - if(node.name == '3DC_color'): - bring_color = False - node.image.reload() - elif(node.name == '3DC_metalness'): - bring_metalness = False - node.image.reload() - elif(node.name == '3DC_roughness'): - bring_roughness = False - node.image.reload() - elif(node.name == '3DC_normal'): - bring_normal = False - node.image.reload() - - #seuraavaksi lahdemme rakentamaan node tree. Lahdetaan Material Outputista rakentaa - - main_mat = act_material.node_tree.nodes['Material Output'] - if(main_mat.inputs['Surface'].is_linked == True): - glue_mat = main_mat.inputs['Surface'].links[0].from_node - - #Color - if(bring_color == True and glue_mat.inputs.find('Base Color') != -1 and texcoat['color'] != []): - node = act_material.node_tree.nodes.new('ShaderNodeTexImage') - node.location = -400,400 - node.name='3DC_color' - if(texcoat['color']): - node.image = bpy.data.images.load(texcoat['color'][0]) - input_color = glue_mat.inputs.find('Base Color') - act_material.node_tree.links.new(node.outputs[0], glue_mat.inputs[input_color]) - - #Metalness - if(bring_metalness == True and glue_mat.inputs.find('Metallic') != -1 and texcoat['metalness'] != []): - node = act_material.node_tree.nodes.new('ShaderNodeTexImage') - node.location = -600,200 - node.name='3DC_metalness' - if(texcoat['metalness']): - node.image = bpy.data.images.load(texcoat['metalness'][0]) - node.color_space = 'NONE' - input_color = glue_mat.inputs.find('Metallic') - act_material.node_tree.links.new(node.outputs[0], glue_mat.inputs[input_color]) - - #Roughness - if(bring_roughness == True and glue_mat.inputs.find('Roughness') != -1 and texcoat['rough'] != []): - node = act_material.node_tree.nodes.new('ShaderNodeTexImage') - node.location = -550,0 - node.name='3DC_roughness' - if(texcoat['rough']): - node.image = bpy.data.images.load(texcoat['rough'][0]) - node.color_space = 'NONE' - input_color = glue_mat.inputs.find('Roughness') - act_material.node_tree.links.new(node.outputs[0], glue_mat.inputs[input_color]) - - #Normal map - if(bring_normal == True and glue_mat.inputs.find('Normal') != -1 and texcoat['nmap'] != []): - node = act_material.node_tree.nodes.new('ShaderNodeTexImage') - normal_node = act_material.node_tree.nodes.new('ShaderNodeNormalMap') - node.location = -600,-270 - normal_node.location = -300,-170 - node.name='3DC_normal' - if(texcoat['nmap']): - node.image = bpy.data.images.load(texcoat['nmap'][0]) - node.color_space = 'NONE' - input_color = glue_mat.inputs.find('Normal') - act_material.node_tree.links.new(node.outputs[0], normal_node.inputs[1]) - act_material.node_tree.links.new(normal_node.outputs[0], glue_mat.inputs[input_color]) - - bpy.ops.object.editmode_toggle() #HACKKI joka saa tekstuurit nakymaan heti - bpy.ops.object.editmode_toggle() - - - -def matlab(mat_list, objekti, scene,is_new): - #checkmaterial(mat_list, objekti) - readtexturefolder(objekti,is_new) - - - """ - print('tassa tietoo') - print(mat_list,objekti,scene,export) +def gettex(mat_list, objekti, scene,export): coat3D = bpy.context.scene.coat3D coa = objekti.coat3D - print(coat3D,coa) if(bpy.context.scene.render.engine == 'VRAY_RENDER' or bpy.context.scene.render.engine == 'VRAY_RENDER_PREVIEW'): vray = True @@ -181,7 +47,7 @@ def matlab(mat_list, objekti, scene,is_new): bring_spec = 1 bring_normal = 1 bring_disp = 1 - + texcoat = {} texcoat['color'] = [] texcoat['specular'] = [] @@ -465,5 +331,5 @@ def matlab(mat_list, objekti, scene,is_new): if(objekti.data.uv_textures.active): objekti.modifiers['Displace'].texture_coords = 'UV' objekti.modifiers['Displace'].uv_layer = objekti.data.uv_textures.active.name - """ + return('FINISHED') |