diff --git a/pype/plugins/harmony/load/load_template.py b/pype/plugins/harmony/load/load_template.py index 0bc9706407..53e0ff1f07 100644 --- a/pype/plugins/harmony/load/load_template.py +++ b/pype/plugins/harmony/load/load_template.py @@ -14,6 +14,19 @@ class ImportTemplateLoader(api.Loader): label = "Import Template" def load(self, context, name=None, namespace=None, data=None): + # Make backdrops from metadata. + backdrops = context["representation"]["data"].get("backdrops", []) + + func = """function func(args) + { + Backdrop.addBackdrop("Top", args[0]); + } + func + """ + for backdrop in backdrops: + harmony.send({"function": func, "args": [backdrop]}) + + # Import template. temp_dir = tempfile.mkdtemp() zip_file = api.get_representation_path(context["representation"]) template_path = os.path.join(temp_dir, "temp.tpl") diff --git a/pype/plugins/harmony/publish/collect_instances.py b/pype/plugins/harmony/publish/collect_instances.py index 9626cb3693..8769ac80cc 100644 --- a/pype/plugins/harmony/publish/collect_instances.py +++ b/pype/plugins/harmony/publish/collect_instances.py @@ -18,7 +18,7 @@ class CollectInstances(pyblish.api.ContextPlugin): order = pyblish.api.CollectorOrder hosts = ["harmony"] families_mapping = { - "render": ["imagesequence", "review"], + "render": ["imagesequence", "review", "ftrack"], "harmony.template": [] } @@ -45,7 +45,6 @@ class CollectInstances(pyblish.api.ContextPlugin): {"function": "node.getEnable", "args": [node]} )["result"] instance.data["families"] = self.families_mapping[data["family"]] - instance.data["families"].append("ftrack") # Produce diagnostic message for any graphical # user interface interested in visualising it. diff --git a/pype/plugins/harmony/publish/extract_template.py b/pype/plugins/harmony/publish/extract_template.py index 78184217dc..96159ac8db 100644 --- a/pype/plugins/harmony/publish/extract_template.py +++ b/pype/plugins/harmony/publish/extract_template.py @@ -7,6 +7,7 @@ from avalon import harmony class ExtractTemplate(pype.api.Extractor): """Extract the connected nodes to the composite instance.""" + label = "Extract Template" hosts = ["harmony"] families = ["harmony.template"] @@ -14,10 +15,32 @@ class ExtractTemplate(pype.api.Extractor): def process(self, instance): staging_dir = self.staging_dir(instance) - self.log.info("Outputting template to %s" % staging_dir) + self.log.info("Outputting template to {}".format(staging_dir)) - self.dependencies = [] - self.get_dependencies(instance[0]) + dependencies = [] + self.get_dependencies(instance[0], dependencies) + + # Get backdrops. + backdrops = {} + for dependency in dependencies: + for backdrop in self.get_backdrops(dependency): + backdrops[backdrop["title"]["text"]] = backdrop + unique_backdrops = [backdrops[x] for x in set(backdrops.keys())] + + # Get non-connected nodes within backdrops. + all_nodes = harmony.send( + {"function": "node.subNodes", "args": ["Top"]} + )["result"] + for node in [x for x in all_nodes if x not in dependencies]: + within_unique_backdrops = bool( + [x for x in self.get_backdrops(node) if x in unique_backdrops] + ) + if within_unique_backdrops: + dependencies.append(node) + + # Make sure we dont export the instance node. + if instance[0] in dependencies: + dependencies.remove(instance[0]) func = """function func(args) { @@ -30,7 +53,7 @@ class ExtractTemplate(pype.api.Extractor): } func """ - harmony.send({"function": func, "args": [self.dependencies]}) + harmony.send({"function": func, "args": [dependencies]}) func = """function func(args) { copyPaste.createTemplateFromSelection(args[0], args[1]); @@ -56,10 +79,44 @@ class ExtractTemplate(pype.api.Extractor): "ext": "zip", "files": "{}.zip".format(instance.name), "stagingDir": staging_dir, + "data": {"backdrops": unique_backdrops} } instance.data["representations"] = [representation] - def get_dependencies(self, node): + def get_backdrops(self, node): + func = """function func(probe_node) + { + var backdrops = Backdrop.backdrops("Top"); + var valid_backdrops = []; + for(var i=0; i