Get all descendents in collector.

- refactor common code to lib.
This commit is contained in:
Toke Stuart Jepsen 2023-03-01 12:21:07 +00:00
parent 484a14ce86
commit d770547c29
5 changed files with 48 additions and 52 deletions

View file

@ -4,7 +4,6 @@ import os
import sys
import platform
import uuid
import math
import re
import json
@ -3562,3 +3561,43 @@ def get_color_management_output_transform():
if preferences["output_transform_enabled"]:
colorspace = preferences["output_transform"]
return colorspace
def get_all_children(nodes):
"""Return all children of `nodes` including each instanced child.
Using maya.cmds.listRelatives(allDescendents=True) includes only the first
instance. As such, this function acts as an optimal replacement with a
focus on a fast query.
"""
sel = OpenMaya.MSelectionList()
traversed = set()
iterator = OpenMaya.MItDag(OpenMaya.MItDag.kDepthFirst)
for node in nodes:
if node in traversed:
# Ignore if already processed as a child
# before
continue
sel.clear()
sel.add(node)
dag = sel.getDagPath(0)
iterator.reset(dag)
# ignore self
iterator.next() # noqa: B305
while not iterator.isDone():
path = iterator.fullPathName()
if path in traversed:
iterator.prune()
iterator.next() # noqa: B305
continue
traversed.add(path)
iterator.next() # noqa: B305
return list(traversed)

View file

@ -1,6 +1,7 @@
from maya import cmds
import pyblish.api
from openpype.hosts.maya.api.lib import get_all_children
class CollectArnoldSceneSource(pyblish.api.InstancePlugin):
@ -21,11 +22,13 @@ class CollectArnoldSceneSource(pyblish.api.InstancePlugin):
self.log.warning("Skipped empty instance: \"%s\" " % objset)
continue
if objset.endswith("content_SET"):
instance.data["setMembers"] = cmds.ls(members, long=True)
self.log.debug("content members: {}".format(members))
set_members = get_all_children(cmds.ls(members, long=True))
instance.data["setMembers"] = set_members
self.log.debug("content members: {}".format(set_members))
elif objset.endswith("proxy_SET"):
instance.data["proxy"] = cmds.ls(members, long=True)
self.log.debug("proxy members: {}".format(members))
set_members = get_all_children(cmds.ls(members, long=True))
instance.data["proxy"] = set_members
self.log.debug("proxy members: {}".format(set_members))
# Use camera in object set if present else default to render globals
# camera.

View file

@ -1,48 +1,8 @@
from maya import cmds
import maya.api.OpenMaya as om
import pyblish.api
import json
def get_all_children(nodes):
"""Return all children of `nodes` including each instanced child.
Using maya.cmds.listRelatives(allDescendents=True) includes only the first
instance. As such, this function acts as an optimal replacement with a
focus on a fast query.
"""
sel = om.MSelectionList()
traversed = set()
iterator = om.MItDag(om.MItDag.kDepthFirst)
for node in nodes:
if node in traversed:
# Ignore if already processed as a child
# before
continue
sel.clear()
sel.add(node)
dag = sel.getDagPath(0)
iterator.reset(dag)
# ignore self
iterator.next() # noqa: B305
while not iterator.isDone():
path = iterator.fullPathName()
if path in traversed:
iterator.prune()
iterator.next() # noqa: B305
continue
traversed.add(path)
iterator.next() # noqa: B305
return list(traversed)
from openpype.hosts.maya.api.lib import get_all_children
class CollectInstances(pyblish.api.ContextPlugin):

View file

@ -36,9 +36,6 @@ class ValidateArnoldSceneSource(pyblish.api.InstancePlugin):
parents.append(parent)
nodes_by_name[node_split[-1].split(":")[-1]] = node
for shape in cmds.listRelatives(node, shapes=True):
basename = shape.split("|")[-1].split(":")[-1]
nodes_by_name[basename] = node + "|" + shape
return ungrouped_nodes, nodes_by_name, parents

View file

@ -24,9 +24,6 @@ class ValidateArnoldSceneSourceCbid(pyblish.api.InstancePlugin):
for node in nodes:
node_split = node.split("|")
nodes_by_name[node_split[-1].split(":")[-1]] = node
for shape in cmds.listRelatives(node, shapes=True):
basename = shape.split("|")[-1].split(":")[-1]
nodes_by_name[basename] = node + "|" + shape
return nodes_by_name