Merge pull request #36 from aardschok/PLN-0033

Resolves PLN-33
* Check for loaded look based on container's representation ID
* Let the loader take care of containerize etc
This commit is contained in:
Wijnand Koreman 2017-10-30 17:29:32 +01:00 committed by GitHub
commit 7c9276b699
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 28 additions and 53 deletions

View file

@ -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)

View file

@ -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