def _traverse_up_linear_tree(self, downstream_node, upstream_node, node_filter=None): node_filter = node_filter if node_filter is not None else self.node_filter all_descendants = self._traverse_down_linear_tree(upstream_node) if not str(downstream_node) in all_descendants: raise IndexError( 'Node %r is not a descendant of %s --> %s (filter=%s)' % (downstream_node, upstream_node, all_descendants, self.node_filter)) current_node = anvil.factory(downstream_node) chain_path = [current_node] while anvil.factory(current_node).get_parent(): current_node = anvil.factory(current_node.get_parent()) if any([ current_node.type() in node_filter, node_filter is None, node_filter == [] ]): chain_path.insert(0, current_node) if current_node == upstream_node: return iter(chain_path) raise IndexError('Could not find path between start(%s) --> last(%s)' % (downstream_node, upstream_node))
def _process_end_node(self, end_node_candidate, node_filter=None): """ Returns the last item found of type """ try: return anvil.factory(end_node_candidate) except (RuntimeError, IOError): return self._get_linear_end(node_filter=node_filter)
def initialize_sub_rig_attributes(self, controller=None, attr_dict=None): attr_dict = self.BUILT_IN_ATTRIBUTES if attr_dict is None else attr_dict if attr_dict: controller = self.root if controller is None else anvil.factory( controller) for attr, attr_kwargs in iteritems(attr_dict): controller.add_attr(attr, **attr_kwargs)
def _get_linear_end(self, node_filter=None): node_filter = node_filter or self.node_filter last_node = self.get_level(self.depth(), node_filter=node_filter) if last_node: return anvil.factory(list(last_node)[0]) else: raise ValueError('Could not find last node at depth %d' % self.depth())
def find_child(self, child): if isinstance(child, int): return self[child] child = anvil.factory(child) for node in self: if node == child: return node raise IndexError('Child not found in hierarchy %s' % list(self))
def _process_top_node(self, top_node, end_node, duplicate=False): if isinstance(top_node, list) and end_node is None: top_node, end_node = top_node[0], top_node[-1] elif isinstance(top_node, self.__class__): top_node, end_node = top_node.head, top_node.tail if duplicate: top_node, end_node = self.duplicate_chain(top_node, end_node=end_node) return anvil.factory(top_node), end_node
def connect_rendering_delegate(self, assignee=None): # TODO: API Attribute dependent...dangerous. assignee = anvil.factory(assignee) if assignee is not None else self.root for attr, attr_kwargs in iteritems(self.RENDERING_ATTRIBUTES): attr_name = '%s_rendering' % attr group_name = 'group_%s' % attr rendering_attribute = assignee.add_attr(attr_name, **attr_kwargs) if hasattr(self, group_name): target_group = getattr(self, group_name) target_group.overrideEnabled.set(1) rendering_attribute.connect(target_group.visibility, force=True) assignee.buffer_connect(attr_name, target_group.overrideDisplayType, -1, force=True)
def get_node_hierarchy_as_dict(node_or_nodes, tree=None, node_filter=None): nodes = to_list(node_or_nodes) if tree is None: tree = dict() for tree_child in nodes: anvil_node = anvil.factory(tree_child) try: relative_tree = tree[anvil_node] except KeyError: tree[anvil_node] = dict() relative_tree = tree[anvil_node] node_filter_kwargs = {cfg.TYPE: node_filter} if node_filter else {} children = rt.dcc.scene.list_relatives(tree_child, fullPath=True, children=True, **node_filter_kwargs) or [] if children: get_node_hierarchy_as_dict(children, relative_tree, node_filter=node_filter) return tree
def connect_rendering_delegate(self, assignee=None): # TODO: API Attribute dependent...dangerous. assignee = anvil.factory( assignee) if assignee is not None else self.root for attr, attr_kwargs in iteritems(self.RENDERING_ATTRIBUTES): attr_name = '%s_rendering' % attr group_name = 'group_%s' % attr rendering_attribute = assignee.add_attr(attr_name, **attr_kwargs) if hasattr(self, group_name): target_group = getattr(self, group_name) target_group.overrideEnabled.set(1) rendering_attribute.connect(target_group.visibility, force=True) assignee.buffer_connect(attr_name, target_group.overrideDisplayType, -1, force=True)
def node(self): return anvil.factory(self.name().split(cfg.ATTR_DELIMITER)[0])
def test_joints_mixed(self): chain = nt.LinearHierarchyNodeSet(self.joints_mixed[0]) self.assertEqual(chain.get_hierarchy(as_list=True), [anvil.factory(j) for j in self.joints_total])
def initialize_sub_rig_attributes(self, controller=None, attr_dict=None): attr_dict = self.BUILT_IN_ATTRIBUTES if attr_dict is None else attr_dict if attr_dict: controller = self.root if controller is None else anvil.factory(controller) for attr, attr_kwargs in iteritems(attr_dict): controller.add_attr(attr, **attr_kwargs)