From 4c8bfbe850a67d8b99f090950bd3af54e1eae42e Mon Sep 17 00:00:00 2001
From: Campbell Barton <ideasman42@gmail.com>
Date: Wed, 10 Apr 2013 12:17:02 +0000
Subject: [PATCH] add option to copy textures on export.

---
 object_print3d_utils/__init__.py |  5 +++++
 object_print3d_utils/export.py   | 34 ++++++++++++++++++++++++++++++++
 object_print3d_utils/ui.py       |  6 ++++--
 3 files changed, 43 insertions(+), 2 deletions(-)

diff --git a/object_print3d_utils/__init__.py b/object_print3d_utils/__init__.py
index f638d598d..ad080d1ee 100644
--- a/object_print3d_utils/__init__.py
+++ b/object_print3d_utils/__init__.py
@@ -66,6 +66,11 @@ class Print3DSettings(PropertyGroup):
                    ('OBJ', "OBJ", "")),
             default='STL',
             )
+    use_export_texture = BoolProperty(
+            name="Copy Textures",
+            description="Copies textures on export to the output path",
+            default=False,
+            )
     export_path = StringProperty(
             name="Export Directory",
             description="Path to directory where the files are created",
diff --git a/object_print3d_utils/export.py b/object_print3d_utils/export.py
index 3a2b6677e..4c582f8a1 100644
--- a/object_print3d_utils/export.py
+++ b/object_print3d_utils/export.py
@@ -24,6 +24,31 @@ import bpy
 import os
 
 
+def image_copy_guess(filepath, objects):
+    # 'filepath' is the path we are writing to.
+    import shutil
+    from bpy_extras import object_utils
+    image = None
+    for obj in objects:
+        image = object_utils.object_image_guess(obj)
+        if image is not None:
+            break
+
+    if image is not None:
+        imagepath = bpy.path.abspath(image.filepath, library=image.library)
+        if os.path.exists(imagepath):
+            filepath_noext = os.path.splitext(filepath)[0]
+            ext = os.path.splitext(imagepath)[1]
+
+            imagepath_dst = filepath_noext + ext
+            print("copying texture: %r -> %r" % (imagepath, imagepath_dst))
+            try:
+                shutil.copy(imagepath, imagepath_dst)
+            except:
+                import traceback
+                traceback.print_exc()
+
+
 def write_mesh(context, info, report_cb):
     scene = context.scene
     print_3d = scene.print_3d
@@ -32,6 +57,7 @@ def write_mesh(context, info, report_cb):
     obj = obj_base.object
 
     export_format = print_3d.export_format
+    path_mode  = 'COPY' if print_3d.use_export_texture else 'AUTO'
 
     context_override = context.copy()
 
@@ -111,6 +137,7 @@ def write_mesh(context, info, report_cb):
                 filepath=filepath,
                 use_mesh_modifiers=True,
                 use_selection=True,
+                path_mode=path_mode,
                 )
     elif export_format == 'WRL':
         addon_ensure("io_scene_vrml2")
@@ -120,6 +147,7 @@ def write_mesh(context, info, report_cb):
                 filepath=filepath,
                 use_mesh_modifiers=True,
                 use_selection=True,
+                path_mode=path_mode,
                 )
     elif export_format == 'OBJ':
         addon_ensure("io_scene_obj")
@@ -129,10 +157,16 @@ def write_mesh(context, info, report_cb):
                 filepath=filepath,
                 use_mesh_modifiers=True,
                 use_selection=True,
+                path_mode=path_mode,
                 )
     else:
         assert(0)
 
+    # for formats that don't support images
+    if export_format in {'STL', 'PLY'}:
+        if path_mode == 'COPY':
+            image_copy_guess(filepath, context_override["selected_objects"])
+
     if obj_base_tmp is not None:
         obj = obj_base_tmp.object
         mesh = obj.data
diff --git a/object_print3d_utils/ui.py b/object_print3d_utils/ui.py
index d8da96639..25a72c937 100644
--- a/object_print3d_utils/ui.py
+++ b/object_print3d_utils/ui.py
@@ -110,11 +110,13 @@ class Print3DToolBar:
 
         col = layout.column()
         col.label("Export Directory:")
-        col.prop(print_3d, "export_path", text="")
+        rowsub = col.row()
+        rowsub.prop(print_3d, "export_path", text="")
+        rowsub.prop(print_3d, "use_export_texture", text="", icon='FILE_IMAGE')
 
         rowsub = col.row(align=True)
         rowsub.prop(print_3d, "export_format", text="")
-        rowsub.operator("mesh.print3d_export", text="", icon='EXPORT')
+        rowsub.operator("mesh.print3d_export", text="Export", icon='EXPORT')
 
         Print3DToolBar.draw_report(layout, context)
 
-- 
GitLab