minor tweak & abstract some codes into functions in rig content

This commit is contained in:
Kayla 2023-10-02 12:29:41 +08:00
parent 7967e9b0b9
commit 0ddf5ffd90
7 changed files with 136 additions and 63 deletions

View file

@ -64,7 +64,7 @@ class FBXExtractor:
"inputConnections": bool,
"upAxis": str, # x, y or z,
"triangulate": bool,
"FileVersion": str,
"fileVersion": str,
"skeletonDefinitions": bool,
"referencedAssetsContent": bool
}

View file

@ -45,7 +45,7 @@ class ExtractFBXAnimation(publish.Extractor):
# names as existing in the rig workfile
namespace, relative_out_set = out_set_name.split(":", 1)
cmds.namespace(relativeNames=True)
with namespaced(":" + namespace,new=False, relative_names=True) as namespace: # noqa
with namespaced(":" + namespace, new=False, relative_names=True) as namespace: # noqa
fbx_exporter.export(relative_out_set, path)
representations = instance.data.setdefault("representations", [])
@ -57,4 +57,4 @@ class ExtractFBXAnimation(publish.Extractor):
})
self.log.debug(
"Extracted Fbx animation to: {0}".format(path))
"Extracted FBX animation to: {0}".format(path))

View file

@ -51,4 +51,4 @@ class ExtractSkeletonMesh(publish.Extractor,
"stagingDir": staging_dir
})
self.log.debug("Extract animated FBX successful to: {0}".format(path))
self.log.debug("Extract FBX to: {0}".format(path))

View file

@ -35,26 +35,12 @@ class ValidateRigContents(pyblish.api.InstancePlugin):
# Find required sets by suffix
required, rig_sets = cls.get_nodes(instance)
missing = [
key for key in required if key not in rig_sets
]
if missing:
raise PublishValidationError(
"%s is missing sets: %s" % (instance, ", ".join(missing))
)
cls.validate_missing_objectsets(instance, required, rig_sets)
controls_set = rig_sets["controls_SET"]
out_set = rig_sets["out_SET"]
# Ensure there are at least some transforms or dag nodes
# in the rig instance
set_members = instance.data['setMembers']
if not cmds.ls(set_members, type="dagNode", long=True):
raise PublishValidationError(
"No dag nodes in the pointcache instance. "
"(Empty instance?)"
)
# Ensure contents in sets and retrieve long path for all objects
output_content = cmds.sets(out_set, query=True) or []
if not output_content:
@ -68,19 +54,8 @@ class ValidateRigContents(pyblish.api.InstancePlugin):
)
controls_content = cmds.ls(controls_content, long=True)
# Validate members are inside the hierarchy from root node
root_nodes = cmds.ls(set_members, assemblies=True, long=True)
hierarchy = cmds.listRelatives(root_nodes, allDescendents=True,
fullPath=True) + root_nodes
hierarchy = set(hierarchy)
invalid_hierarchy = []
for node in output_content:
if node not in hierarchy:
invalid_hierarchy.append(node)
for node in controls_content:
if node not in hierarchy:
invalid_hierarchy.append(node)
rig_content = output_content + controls_content
invalid_hierarchy = cls.invalid_hierarchy(instance, rig_content)
# Additional validations
invalid_geometry = cls.validate_geometry(output_content)
@ -104,6 +79,62 @@ class ValidateRigContents(pyblish.api.InstancePlugin):
error = True
return error
@classmethod
def validate_missing_objectsets(cls, instance,
required_objsets, rig_sets):
"""Validate missing objectsets in rig sets
Args:
instance (str): instance
required_objsets (list): list of objectset names
rig_sets (list): list of rig sets
Raises:
PublishValidationError: When the error is raised, it will show
which instance has the missing object sets
"""
missing = [
key for key in required_objsets if key not in rig_sets
]
if missing:
raise PublishValidationError(
"%s is missing sets: %s" % (instance, ", ".join(missing))
)
@classmethod
def invalid_hierarchy(cls, instance, content):
"""_summary_
Args:
instance (str): instance
content (list): list of content from rig sets
Raises:
PublishValidationError: It means no dag nodes in
the rig instance
Returns:
list: invalid hierarchy
"""
# Ensure there are at least some transforms or dag nodes
# in the rig instance
set_members = instance.data['setMembers']
if not cmds.ls(set_members, type="dagNode", long=True):
raise PublishValidationError(
"No dag nodes in the rig instance. "
"(Empty instance?)"
)
# Validate members are inside the hierarchy from root node
root_nodes = cmds.ls(set_members, assemblies=True, long=True)
hierarchy = cmds.listRelatives(root_nodes, allDescendents=True,
fullPath=True) + root_nodes
hierarchy = set(hierarchy)
invalid_hierarchy = []
for node in content:
if node not in hierarchy:
invalid_hierarchy.append(node)
return invalid_hierarchy
@classmethod
def validate_geometry(cls, set_members):
"""Check if the out set passes the validations
@ -130,8 +161,6 @@ class ValidateRigContents(pyblish.api.InstancePlugin):
if cmds.nodeType(shape) not in cls.accepted_output:
invalid.append(shape)
return invalid
@classmethod
def validate_controls(cls, set_members):
"""Check if the controller set passes the validations
@ -157,6 +186,14 @@ class ValidateRigContents(pyblish.api.InstancePlugin):
@classmethod
def get_nodes(cls, instance):
"""Get the target objectsets and rig sets nodes
Args:
instance (str): instance
Returns:
list: list of objectsets, list of rig sets nodes
"""
objectsets = ["controls_SET", "out_SET"]
rig_sets_nodes = instance.data.get("rig_sets", [])
return objectsets, rig_sets_nodes
@ -181,39 +218,18 @@ class ValidateSkeletonRigContents(ValidateRigContents):
@classmethod
def get_invalid(cls, instance):
objectsets, skeleton_mesh_nodes = cls.get_nodes(instance)
missing = [
key for key in objectsets if key not in instance.data["rig_sets"]
]
if missing:
cls.log.debug(
"%s is missing sets: %s" % (instance, ", ".join(missing))
)
return
cls.validate_missing_objectsets(
instance, objectsets, instance.data["rig_sets"])
# Ensure there are at least some transforms or dag nodes
# in the rig instance
set_members = instance.data['setMembers']
if not cmds.ls(set_members, type="dagNode", long=True):
raise PublishValidationError(
"No dag nodes in the pointcache instance. "
"(Empty instance?)"
)
# Ensure contents in sets and retrieve long path for all objects
output_content = instance.data.get("skeleton_mesh", [])
output_content = cmds.ls(skeleton_mesh_nodes, long=True)
# Validate members are inside the hierarchy from root node
root_nodes = cmds.ls(set_members, assemblies=True, long=True)
hierarchy = cmds.listRelatives(root_nodes, allDescendents=True,
fullPath=True) + root_nodes
hierarchy = set(hierarchy)
invalid_hierarchy = cls.invalid_hierarchy(
instance, output_content)
invalid_geometry = cls.validate_geometry(output_content)
error = False
invalid_hierarchy = []
if output_content:
for node in output_content:
if node not in hierarchy:
invalid_hierarchy.append(node)
invalid_geometry = cls.validate_geometry(output_content)
if invalid_hierarchy:
cls.log.error("Found nodes which reside outside of root group "
"while they are set up for publishing."
@ -228,6 +244,15 @@ class ValidateSkeletonRigContents(ValidateRigContents):
@classmethod
def get_nodes(cls, instance):
"""Get the target objectsets and rig sets nodes
Args:
instance (str): instance
Returns:
list: list of objectsets,
list of objects node from skeletonMesh_SET
"""
objectsets = ["skeletonMesh_SET"]
skeleton_mesh_nodes = instance.data.get("skeleton_mesh", [])
return objectsets, skeleton_mesh_nodes

View file

@ -231,6 +231,14 @@ class ValidateRigControllers(pyblish.api.InstancePlugin):
@classmethod
def get_node(cls, instance):
"""Get target object nodes from controls_SET
Args:
instance (str): instance
Returns:
list: list of object nodes from controls_SET
"""
return instance.data["rig_sets"].get("controls_SET")
@ -274,4 +282,12 @@ class ValidateSkeletonRigControllers(ValidateRigControllers):
@classmethod
def get_node(cls, instance):
return instance.data["rig_sets"].get("skeletonAnim_SET")
"""Get target object nodes from skeletonMesh_SET
Args:
instance (str): instance
Returns:
list: list of object nodes from skeletonMesh_SET
"""
return instance.data["rig_sets"].get("skeletonMesh_SET")

View file

@ -88,6 +88,14 @@ class ValidateRigOutSetNodeIds(pyblish.api.InstancePlugin):
@classmethod
def get_node(cls, instance):
"""Get target object nodes from out_SET
Args:
instance (str): instance
Returns:
list: list of object nodes from out_SET
"""
return instance.data["rig_sets"].get("out_SET")
@ -114,5 +122,13 @@ class ValidateSkeletonRigOutSetNodeIds(ValidateRigOutSetNodeIds):
@classmethod
def get_node(cls, instance):
"""Get target object nodes from skeletonMesh_SET
Args:
instance (str): instance
Returns:
list: list of object nodes from skeletonMesh_SET
"""
return instance.data["rig_sets"].get(
"skeletonMesh_SET")

View file

@ -118,6 +118,14 @@ class ValidateRigOutputIds(pyblish.api.InstancePlugin):
@classmethod
def get_node(cls, instance):
"""Get target object nodes from out_SET
Args:
instance (str): instance
Returns:
list: list of object nodes from out_SET
"""
return instance.data["rig_sets"].get("out_SET")
@ -137,4 +145,12 @@ class ValidateSkeletonRigOutputIds(ValidateRigOutputIds):
@classmethod
def get_node(cls, instance):
"""Get target object nodes from skeletonMesh_SET
Args:
instance (str): instance
Returns:
list: list of object nodes from skeletonMesh_SET
"""
return instance.data["rig_sets"].get("skeletonMesh_SET")