diff --git a/colorbleed/maya/lib.py b/colorbleed/maya/lib.py index 8d417b79ed..91ab596f5d 100644 --- a/colorbleed/maya/lib.py +++ b/colorbleed/maya/lib.py @@ -798,7 +798,7 @@ def assign_look_by_version(nodes, version_id): Args: nodes(list): nodes to assign look to - version_id (bson.ObjectId) + version_id (bson.ObjectId): database id of the version Returns: None @@ -806,23 +806,28 @@ def assign_look_by_version(nodes, version_id): # TODO: make `iter_loader` available in as a more global function from avalon.tools.cbloader import lib as loaderlib - # get representations of shader file and relationships + # Get representations of shader file and relationships look_representation = io.find_one({"type": "representation", "parent": version_id, "name": "ma"}) - connection_represenations = io.find_one({"type": "representation", - "parent": version_id, - "name": "json"}) + json_representation = io.find_one({"type": "representation", + "parent": version_id, + "name": "json"}) - # Load file - shader_filepath = api.get_representation_path(look_representation) - shader_relation = api.get_representation_path(connection_represenations) - - reference_node = get_reference_node(shader_filepath) - if reference_node is None: - log.info("Loading lookdev for the first time..") + # See if representation is already loaded, if so reuse it. + host = api.registered_host() + representation_id = str(look_representation['_id']) + for container in host.ls(): + if (container['loader'] == "LookLoader" and + container['representation'] == representation_id): + log.info("Reusing loaded look ..") + container_node = container['objectName'] + break + else: + log.info("Using look for the first time ..") + # Load file loaders = list(loaderlib.iter_loaders(look_representation["_id"])) Loader = next((i for i in loaders if i.__name__ == "LookLoader"), None) if Loader is None: @@ -830,16 +835,17 @@ def assign_look_by_version(nodes, version_id): # Reference the look file with maya.maintained_selection(): - shader_nodes = pipeline.load(Loader, look_representation) + container_node = pipeline.load(Loader, look_representation) - else: - log.info("Reusing existing lookdev '{}'".format(reference_node)) - shader_nodes = cmds.referenceQuery(reference_node, nodes=True) + # Get container members + shader_nodes = cmds.sets(container_node, query=True) - # Assign relationships + # Load relationships + shader_relation = api.get_representation_path(json_representation) with open(shader_relation, "r") as f: relationships = json.load(f) + # Assign relationships apply_shaders(relationships, shader_nodes, nodes) diff --git a/colorbleed/plugins/maya/load/load_look.py b/colorbleed/plugins/maya/load/load_look.py index 3260737349..16428ef034 100644 --- a/colorbleed/plugins/maya/load/load_look.py +++ b/colorbleed/plugins/maya/load/load_look.py @@ -25,44 +25,13 @@ class LookLoader(colorbleed.maya.plugin.ReferenceLoader): """ - import json - import os import maya.cmds as cmds from avalon import maya - import colorbleed.maya.lib as lib - # try / except here is to ensure that the get_reference_node - # does not fail when the file doesn't exist yet - reference_node = None - try: - reference_node = lib.get_reference_node(self.fname) - except: - pass - - if reference_node is None: - self.log.info("Loading lookdev for the first time ...") - with maya.maintained_selection(): - nodes = cmds.file(self.fname, - namespace=namespace, - reference=True, - returnNewNodes=True) - else: - self.log.info("Reusing existing lookdev ...") - nodes = cmds.referenceQuery(reference_node, nodes=True) - - # Assign shaders - self.fname = self.fname.rsplit(".", 1)[0] + ".json" - if not os.path.isfile(self.fname): - self.log.warning("Look development asset " - "has no relationship data.") - return nodes - - with open(self.fname) as f: - relationships = json.load(f) - - # Get all nodes which belong to a matching name space - # Currently this is the safest way to get all the nodes - # Pass empty list as nodes to assign to in order to only load - lib.apply_shaders(relationships, nodes, []) + with maya.maintained_selection(): + nodes = cmds.file(self.fname, + namespace=namespace, + reference=True, + returnNewNodes=True) self[:] = nodes