Untitled
unknown
plain_text
a year ago
2.2 kB
15
Indexable
import bpy
from ayon_core.pipeline import publish
from ayon_blender.api import plugin
from pathlib import Path
class ExtractLook(plugin.BlenderExtractor, publish.OptionalPyblishPluginMixin):
"""Extract Look from Ayon-tracked objects and publish them as LookFiles."""
label = "Extract Look File"
hosts = ["blender"]
families = ["look"]
optional = True
def process(self, instance):
"""Extracts materials and saves them into a dedicated .blend file."""
if not self.is_active(instance.data):
return
# Define extract output file path using Ayon's staging directory
stagingdir = Path(self.staging_dir(instance))
folder_name = instance.data.get("folderEntity", {}).get("name", "UnknownFolder")
product_name = instance.data.get("productName", "UnknownProduct")
instance_name = f"{folder_name}_{product_name}"
filename = f"{instance_name}.blend"
export_path = stagingdir / filename
# Ensure the export directory exists
stagingdir.mkdir(parents=True, exist_ok=True)
# Save the current Blender file to the export path
bpy.ops.wm.save_as_mainfile(filepath=str(export_path))
# Store extraction data for Ayon
instance.data["representations"] = [{
"name": "look",
"ext": "blend",
"files": filename,
"stagingDir": str(stagingdir),
}]
self.log.info(f"Extracted materials to {export_path}")
def get_ayon_materials(self, instance):
"""Finds all materials linked to objects with Ayon metadata."""
ayon_materials = []
for mat in bpy.data.materials:
if "avalon" in mat and mat["avalon"].get("productType") == "look":
ayon_materials.append(mat)
return ayon_materials
def clean_scene(self):
"""Removes all objects, meshes, and collections except materials."""
bpy.ops.object.select_all(action='SELECT')
bpy.ops.object.delete(use_global=False)
bpy.ops.outliner.orphans_purge()
self.log.info("Scene cleaned, only materials remain.")
Editor is loading...
Leave a Comment