104 lines
3.1 KiB
Python
104 lines
3.1 KiB
Python
from pathlib import Path
|
|
import shutil
|
|
from bioxelnodes.utils import get_all_bioxels_objs, get_bioxels_obj
|
|
import bpy
|
|
|
|
|
|
class SaveBioxels(bpy.types.Operator):
|
|
bl_idname = "bioxelnodes.save_bioxels"
|
|
bl_label = "Save Bioxels"
|
|
bl_description = "Save Bioxels to Directory."
|
|
bl_options = {'UNDO'}
|
|
|
|
@classmethod
|
|
def poll(cls, context):
|
|
bioxels_obj = None
|
|
for obj in bpy.context.selected_objects:
|
|
bioxels_obj = get_bioxels_obj(obj)
|
|
break
|
|
|
|
return True if bioxels_obj else False
|
|
|
|
def execute(self, context):
|
|
bioxels_objs = []
|
|
|
|
for obj in bpy.context.selected_objects:
|
|
bioxels_obj = get_bioxels_obj(obj)
|
|
if bioxels_obj:
|
|
bioxels_objs.append(bioxels_obj)
|
|
|
|
if len(bioxels_objs) == 0:
|
|
self.report({"WARNING"}, "Cannot find any bioxels.")
|
|
return {'FINISHED'}
|
|
|
|
for bioxels_obj in bioxels_objs:
|
|
name = bioxels_obj.parent.name
|
|
|
|
# "//"
|
|
bioxels_dir = bpy.path.abspath(context.scene.bioxels_dir)
|
|
source_dir = bpy.path.abspath(bioxels_obj.data.filepath)
|
|
|
|
output_path: Path = Path(bioxels_dir, f"{name}.vdb").resolve()
|
|
source_path: Path = Path(source_dir).resolve()
|
|
|
|
if output_path != source_path:
|
|
shutil.copy(source_path, output_path)
|
|
|
|
blend_path = Path(bpy.path.abspath("//")).resolve()
|
|
bioxels_obj.data.filepath = bpy.path.relpath(
|
|
str(output_path), start=str(blend_path))
|
|
|
|
self.report({"INFO"}, f"Successfully saved bioxels")
|
|
|
|
return {'FINISHED'}
|
|
|
|
|
|
class SaveAllBioxels(bpy.types.Operator):
|
|
bl_idname = "bioxelnodes.save_all_bioxels"
|
|
bl_label = "Save All Bioxels"
|
|
bl_description = "Save All Bioxels to Directory."
|
|
bl_options = {'UNDO'}
|
|
|
|
def execute(self, context):
|
|
|
|
bioxels_objs = get_all_bioxels_objs()
|
|
|
|
if len(bioxels_objs) == 0:
|
|
self.report({"WARNING"}, "Cannot find any bioxels.")
|
|
return {'FINISHED'}
|
|
|
|
for bioxels_obj in bioxels_objs:
|
|
name = bioxels_obj.parent.name
|
|
|
|
# "//"
|
|
bioxels_dir = bpy.path.abspath(context.scene.bioxels_dir)
|
|
source_dir = bpy.path.abspath(bioxels_obj.data.filepath)
|
|
|
|
output_path: Path = Path(bioxels_dir, f"{name}.vdb").resolve()
|
|
source_path: Path = Path(source_dir).resolve()
|
|
|
|
if output_path != source_path:
|
|
shutil.copy(source_path, output_path)
|
|
|
|
blend_path = Path(bpy.path.abspath("//")).resolve()
|
|
bioxels_obj.data.filepath = bpy.path.relpath(
|
|
str(output_path), start=str(blend_path))
|
|
|
|
self.report({"INFO"}, f"Successfully saved bioxels")
|
|
|
|
return {'FINISHED'}
|
|
|
|
|
|
class BIOXELNODES_PT_Bioxels(bpy.types.Panel):
|
|
bl_idname = "BIOXELNODES_PT_Bioxels"
|
|
bl_label = "Bioxels"
|
|
bl_space_type = "PROPERTIES"
|
|
bl_region_type = "WINDOW"
|
|
bl_context = "scene"
|
|
|
|
def draw(self, context):
|
|
layout = self.layout
|
|
scene = context.scene
|
|
layout.prop(scene, 'bioxels_dir')
|
|
layout.operator(SaveAllBioxels.bl_idname)
|