From 23e56fee4cad8ecb28da43d63c1b5cee07c3a3f3 Mon Sep 17 00:00:00 2001 From: Roy Nieterau Date: Tue, 12 Dec 2017 18:14:13 +0100 Subject: [PATCH] Fix "sharedReferenceNode" being used from avalon container --- colorbleed/maya/plugin.py | 45 ++++++++++++++++++++++++++++++++------- 1 file changed, 37 insertions(+), 8 deletions(-) diff --git a/colorbleed/maya/plugin.py b/colorbleed/maya/plugin.py index 6b8653e95e..89d6306813 100644 --- a/colorbleed/maya/plugin.py +++ b/colorbleed/maya/plugin.py @@ -47,6 +47,40 @@ class ReferenceLoader(api.Loader): """To be implemented by subclass""" raise NotImplementedError("Must be implemented by subclass") + def _get_reference_node(self, members): + """Get the reference node from the container members + + Returns: + str: Reference node name. + + """ + + from maya import cmds + + # Collect the references without .placeHolderList[] attributes as + # unique entries (objects only) and skipping the sharedReferenceNode. + matched = set() + references = list() + for ref in cmds.ls(members, exactType="reference", objectsOnly=True): + + # Ensure unique entries + if ref in matched: + continue + + # Ignore `sharedReferenceNode` + if ref == "sharedReferenceNode": + continue + + references.append(ref) + matched.add(ref) + + assert references, "No reference node found in container" + if len(set(references)) > 1: + self.log.warning("More than one reference node found in " + "container - using first one: %s", references) + reference_node = references[0] + return reference_node + def update(self, container, representation): import os @@ -58,12 +92,7 @@ class ReferenceLoader(api.Loader): # Get reference node from container members members = cmds.sets(node, query=True, nodesOnly=True) - references = cmds.ls(members, exactType="reference", objectsOnly=True) - assert references, "No reference node found in container" - if len(set(references)) > 1: - self.log.warning("More than one reference node found in " - "container - using first one: %s", references) - reference_node = references[0] + reference_node = self._get_reference_node(members) file_type = { "ma": "mayaAscii", @@ -116,8 +145,8 @@ class ReferenceLoader(api.Loader): node = container["objectName"] # Assume asset has been referenced - reference_node = next((node for node in cmds.sets(node, query=True) - if cmds.nodeType(node) == "reference"), None) + members = cmds.sets(node, query=True) + reference_node = self._get_reference_node(members) assert reference_node, ("Imported container not supported; " "container must be referenced.")