From 59fe720e8c2ab8467202e145164b74fd3d47bb25 Mon Sep 17 00:00:00 2001 From: wikoreman Date: Wed, 18 Jul 2018 11:10:39 +0200 Subject: [PATCH] updated plugins --- .../houdini/create/create_pointcache.py | 3 ++ .../houdini/publish/collect_instances.py | 43 +++++++++++++++++-- .../houdini/publish/extract_alembic.py | 35 +++++++++++++++ 3 files changed, 77 insertions(+), 4 deletions(-) diff --git a/colorbleed/plugins/houdini/create/create_pointcache.py b/colorbleed/plugins/houdini/create/create_pointcache.py index b94e7575ff..93cd83a6b3 100644 --- a/colorbleed/plugins/houdini/create/create_pointcache.py +++ b/colorbleed/plugins/houdini/create/create_pointcache.py @@ -19,6 +19,9 @@ class CreatePointCache(houdini.Creator): # create an ordered dict with the existing data first data = OrderedDict(**self.data) + # Set node type to create for output + data["node_type"] = "alembic" + # Collect animation data for point cache exporting start, end = hou.playbar.timelineRange() data["startFrame"] = start diff --git a/colorbleed/plugins/houdini/publish/collect_instances.py b/colorbleed/plugins/houdini/publish/collect_instances.py index 8912611005..2a9edb5667 100644 --- a/colorbleed/plugins/houdini/publish/collect_instances.py +++ b/colorbleed/plugins/houdini/publish/collect_instances.py @@ -6,6 +6,23 @@ from avalon.houdini import lib class CollectInstances(pyblish.api.ContextPlugin): + """Gather instances by all node in out graph and pre-defined attributes + + This collector takes into account assets that are associated with + an specific node and marked with a unique identifier; + + Identifier: + id (str): "pyblish.avalon.instance + + Specific node: + The specific node is important because it dictates in which way the subset + is being exported. + + alembic: will export Alembic file which supports cascading attributes + like 'cbId' and 'path' + geometry: Can export a wide range of file types, default out + + """ label = "Collect Instances" order = pyblish.api.CollectorOrder @@ -14,21 +31,39 @@ class CollectInstances(pyblish.api.ContextPlugin): def process(self, context): instances = [] + keys = ["active", "id", "family", "asset", "subset"] nodes = hou.node("/out").children() for node in nodes: - if node.parm("id"): + + if not node.parm("id"): continue - if not node.parm("id") != "pyblish.avalon.instance": + if node.parm("id").eval() != "pyblish.avalon.instance": continue - has_family = node.parm("family") + has_family = node.parm("family").eval() assert has_family, "'%s' is missing 'family'" % node.name() - # TODO: Ensure not all data passes through! data = lib.read(node) + + # temporarily translation of `active` to `publish` till issue has + # been resolved, https://github.com/pyblish/pyblish-base/issues/307 + if "active" in data: + data["publish"] = data["active"] + instance = context.create_instance(data.get("name", node.name())) + instance[:] = [node] + instance.data.update(data) + instances.append(instance) + def sort_by_family(instance): + """Sort by family""" + return instance.data.get("families", instance.data.get("family")) + + # Sort/grouped by family (preserving local index) + context[:] = sorted(context, key=sort_by_family) + + return context diff --git a/colorbleed/plugins/houdini/publish/extract_alembic.py b/colorbleed/plugins/houdini/publish/extract_alembic.py index e69de29bb2..d427a747fb 100644 --- a/colorbleed/plugins/houdini/publish/extract_alembic.py +++ b/colorbleed/plugins/houdini/publish/extract_alembic.py @@ -0,0 +1,35 @@ +import os + +import hou + +import pyblish.api +import colorbleed.api +from colorbleed.houdini import lib + + +class ExtractAlembic(colorbleed.api.Extractor): + + order = pyblish.api.ExtractorOrder + label = "Extract Pointcache (Alembic)" + hosts = ["houdini"] + families = ["colorbleed.pointcache"] + + def process(self, instance): + + staging_dir = self.staging_dir(instance) + + file_name = "{}.abc".format(instance.data["subset"]) + tmp_filepath = os.path.join(staging_dir, file_name) + + ropnode = instance[0] + attributes = {"trange": 1, + "f1": instance.data["startFrame"], + "f2": instance.data["endFrame"]} + + with lib.attribute_values(ropnode, attributes): + ropnode.execute() + + if "files" not in instance.data: + instance.data["files"] = [] + + instance.data["files"].append(tmp_filepath)