import os from maya import cmds import avalon.maya import pype.api from pype.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))