mirror of
https://github.com/ynput/ayon-core.git
synced 2025-12-26 13:52:15 +01:00
89 lines
2.9 KiB
Python
89 lines
2.9 KiB
Python
import os
|
|
|
|
from maya import cmds
|
|
|
|
import avalon.maya
|
|
import pype.api
|
|
from pype.hosts.maya.lib import extract_alembic
|
|
|
|
|
|
class ExtractAlembic(pype.api.Extractor):
|
|
"""Produce an alembic of just point positions and normals.
|
|
|
|
Positions and normals, uvs, creases are preserved, but nothing more,
|
|
for plain and predictable point caches.
|
|
|
|
"""
|
|
|
|
label = "Extract Pointcache (Alembic)"
|
|
hosts = ["maya"]
|
|
families = ["pointcache",
|
|
"model"]
|
|
|
|
def process(self, instance):
|
|
|
|
nodes = instance[:]
|
|
|
|
# Collect the start and end including handles
|
|
start = float(instance.data.get("frameStartHandle", 1))
|
|
end = float(instance.data.get("frameEndHandle", 1))
|
|
|
|
attrs = instance.data.get("attr", "").split(";")
|
|
attrs = [value for value in attrs if value.strip()]
|
|
attrs += ["cbId"]
|
|
|
|
attr_prefixes = instance.data.get("attrPrefix", "").split(";")
|
|
attr_prefixes = [value for value in attr_prefixes if value.strip()]
|
|
|
|
# Get extra export arguments
|
|
writeColorSets = instance.data.get("writeColorSets", False)
|
|
|
|
self.log.info("Extracting pointcache..")
|
|
dirname = self.staging_dir(instance)
|
|
|
|
parent_dir = self.staging_dir(instance)
|
|
filename = "{name}.abc".format(**instance.data)
|
|
path = os.path.join(parent_dir, filename)
|
|
|
|
options = {
|
|
"step": instance.data.get("step", 1.0),
|
|
"attr": attrs,
|
|
"attrPrefix": attr_prefixes,
|
|
"writeVisibility": True,
|
|
"writeCreases": True,
|
|
"writeColorSets": writeColorSets,
|
|
"uvWrite": True,
|
|
"selection": True,
|
|
"worldSpace": instance.data.get("worldSpace", True)
|
|
}
|
|
|
|
if not instance.data.get("includeParentHierarchy", True):
|
|
# Set the root nodes if we don't want to include parents
|
|
# The roots are to be considered the ones that are the actual
|
|
# direct members of the set
|
|
options["root"] = instance.data.get("setMembers")
|
|
|
|
if int(cmds.about(version=True)) >= 2017:
|
|
# Since Maya 2017 alembic supports multiple uv sets - write them.
|
|
options["writeUVSets"] = True
|
|
|
|
with avalon.maya.suspended_refresh():
|
|
with avalon.maya.maintained_selection():
|
|
cmds.select(nodes, noExpand=True)
|
|
extract_alembic(file=path,
|
|
startFrame=start,
|
|
endFrame=end,
|
|
**options)
|
|
|
|
if "representations" not in instance.data:
|
|
instance.data["representations"] = []
|
|
|
|
representation = {
|
|
'name': 'abc',
|
|
'ext': 'abc',
|
|
'files': filename,
|
|
"stagingDir": dirname
|
|
}
|
|
instance.data["representations"].append(representation)
|
|
|
|
self.log.info("Extracted {} to {}".format(instance, dirname))
|