From 13e56238bc33e9457542c15535800bea37ba7165 Mon Sep 17 00:00:00 2001 From: aardschok Date: Tue, 27 Jun 2017 14:31:15 +0200 Subject: [PATCH] refactored complexitt --- .../plugins/maya/publish/collect_look.py | 174 +++++++++--------- 1 file changed, 91 insertions(+), 83 deletions(-) diff --git a/colorbleed/plugins/maya/publish/collect_look.py b/colorbleed/plugins/maya/publish/collect_look.py index e72df4bd24..a51eac58a7 100644 --- a/colorbleed/plugins/maya/publish/collect_look.py +++ b/colorbleed/plugins/maya/publish/collect_look.py @@ -83,63 +83,11 @@ class CollectLook(pyblish.api.InstancePlugin): verbose = instance.data.get("verbose", False) self.log.info("Looking for look associations " - "for {0}..".format(instance.data['label'])) - - # Get view sets (so we can ignore those sets later) - model_panels = cmds.getPanel(type="modelPanel") - view_sets = set() - - for panel in model_panels: - view_set = cmds.modelEditor(panel, query=True, viewObjects=True) - if view_set: - view_sets.add(view_set) + "for %s" % instance.data['label']) # Discover related object sets self.log.info("Gathering sets..") - sets = dict() - for node in instance: - - node_sets = cmds.listSets(object=node, extendToShape=False) or [] - if verbose: - self.log.info("Found raw sets " - "{0} for {1}".format(node_sets, node)) - - if not node_sets: - continue - - # Exclude deformer sets - deformer_sets = cmds.listSets(object=node, - extendToShape=False, - type=2) or [] - deformer_sets = set(deformer_sets) # optimize lookup - node_sets = [s for s in node_sets if s not in deformer_sets] - - if verbose: - self.log.debug("After filtering deformer sets " - "{0}".format(node_sets)) - - # Ignore specifically named sets - node_sets = [s for s in node_sets if - not any(s.endswith(x) for x in self.IGNORE)] - - if verbose: - self.log.debug("After filtering ignored sets " - "{0}".format(node_sets)) - - # Ignore viewport filter view sets (from isolate select and - # viewports) - node_sets = [s for s in node_sets if s not in view_sets] - - if verbose: - self.log.debug("After filtering view sets %s" % node_sets) - - self.log.info("Found sets {0} for {1}".format(node_sets, node)) - - for objset in node_sets: - if objset not in sets: - sets[objset] = {"name": objset, - "uuid": id_utils.get_id(objset), - "members": list()} + self.gather_sets(instance) # Lookup with absolute names (from root namespace) instance_lookup = set([str(x) for x in cmds.ls(instance, @@ -147,6 +95,7 @@ class CollectLook(pyblish.api.InstancePlugin): absoluteName=True)]) self.log.info("Gathering set relations..") + sets = self.gather_sets(instance) for objset in sets: self.log.debug("From %s.." % objset) @@ -163,40 +112,15 @@ class CollectLook(pyblish.api.InstancePlugin): sets[objset]["members"].append(member_data) # Remove sets that didn't have any members assigned in the end - for objset, data in sets.items(): - if not data['members']: - self.log.debug("Removing redundant set " - "information: {0}".format(objset)) - sets.pop(objset) - + sets = self.clean_sets(sets) # Member attributes (shapes + transforms) self.log.info("Gathering attribute changes to instance members..") - attrs = [] - for node in instance: - # Collect changes to "custom" attributes - node_attrs = get_look_attrs(node) - - # Only include if there are any properties we care about - if not node_attrs: - continue - - attributes = {} - for attr in node_attrs: - attribute = "{}.{}".format(node, attr) - attributes[attr] = cmds.getAttr(attribute) - - # attributes = dict((attr, pm.getAttr("{}.{}".format(node, attr)) - # for attr in node_attrs)) - data = {"name": node, - "uuid": id_utils.get_id(node), - "attributes": attributes} - - attrs.append(data) + attributes = self.collect_attributes_changes(instance) # Store data on the instance - instance.data["lookAttributes"] = attrs + instance.data["lookAttributes"] = attributes instance.data["lookSetRelations"] = sets.values() instance.data["lookSets"] = cmds.ls(sets.keys(), absoluteName=True, @@ -204,10 +128,69 @@ class CollectLook(pyblish.api.InstancePlugin): # Log a warning when no relevant sets were retrieved for the look. if not instance.data['lookSets']: - self.log.warning("No sets found for the nodes in the instance: {0}".format(instance[:])) + self.log.warning("No sets found for the nodes in the instance: " + "%s" % instance[:]) self.log.info("Collected look for %s" % instance) + def gather_sets(self, instance): + + # Get view sets (so we can ignore those sets later) + sets = dict() + view_sets = set() + model_panels = cmds.getPanel(type="modelPanel") + for panel in model_panels: + view_set = cmds.modelEditor(panel, query=True, viewObjects=True) + if view_set: + view_sets.add(view_set) + + for node in instance: + node_sets = self.filter_sets(node, view_sets) + if not node_sets: + continue + + for objset in node_sets: + if objset in sets: + continue + sets[objset] = {"name": objset, + "uuid": id_utils.get_id(objset), + "members": list()} + return sets + + def filter_sets(self, node, view_sets): + + node_sets = cmds.listSets(object=node, extendToShape=False) or [] + if not node_sets: + return + + # Exclude deformer sets + deformer_sets = cmds.listSets(object=node, + extendToShape=False, + type=2) or [] + deformer_sets = set(deformer_sets) # optimize lookup + sets = [s for s in node_sets if s not in deformer_sets] + + # Ignore specifically named sets + sets = [s for s in sets if not any(s.endswith(x) for x in self.IGNORE)] + + # Ignore viewport filter view sets (from isolate select and + # viewports) + sets = [s for s in sets if s not in view_sets] + + self.log.info("Found sets {0} for {1}".format(node_sets, node)) + + return sets + + def clean_sets(self, sets): + + for objset, data in sets.items(): + if not data['members']: + self.log.debug("Removing redundant set " + "information: %s" % objset) + sets.pop(objset) + + return sets + def collect_member_data(self, member, objset_members, instance_members, verbose=False): """Get all information of the node @@ -243,3 +226,28 @@ class CollectLook(pyblish.api.InstancePlugin): member_data["components"] = components return member_data + + def collect_attributes_changes(self, instance): + + attributes = [] + for node in instance: + + # Collect changes to "custom" attributes + node_attrs = get_look_attrs(node) + + # Only include if there are any properties we care about + if not node_attrs: + continue + + node_attributes = {} + for attr in node_attrs: + attribute = "{}.{}".format(node, attr) + node_attributes[attr] = cmds.getAttr(attribute) + + data = {"name": node, + "uuid": id_utils.get_id(node), + "attributes": node_attributes} + + attributes.append(data) + + return attributes