Publish apex animation - #376
Conversation
| @classmethod | ||
| def get_invalid(cls, instance): | ||
| node, _ = cls.get_invalid_with_message(instance) | ||
| return [node] |
There was a problem hiding this comment.
EDIT: ignore me my previous comment. Maybe it is more explicit to use tuple instead of list like (node, error) instead of [node, error]?
There was a problem hiding this comment.
Tbh, I don't know I just followed what we already have in
| """ | ||
|
|
||
| output_node = instance.data.get("output_node") | ||
| if cls.get_invalid(instance) != [output_node]: |
There was a problem hiding this comment.
I believe it does the same thing?
| if cls.get_invalid(instance) != [output_node]: | |
| if output_node not in cls.get_invalid(instance): |
There was a problem hiding this comment.
It does the same thing I believe.
I picked this way, because this is always a list with one item.
Also, it's the same as here
…er-directly' into enhancement/365-aypn-publish-apex-animation
moonyuet
left a comment
There was a problem hiding this comment.
I published animation successfully. Enclosed with the publish report.
publish-report-260417-17-10.json
Maybe for separate issue. When I tested with the validator(by bypassing the packed folder), it blocks the validation for sure with the sop_node validator. But if I hit select invalid It would give the error below
Action: SelectInvalidAction (094d16b0-5f55-4fff-88bf-a9ff5018a32b)
Error: Action failed.
Traceback (most recent call last):
File "D:\ayon-addon_template\ayon-houdini\client\ayon_houdini\plugins\publish\validate_sop_output_node.py", line 80, in get_invalid
output_node.cook()
File "C:\PROGRA~1/SIDEEF~1/HOUDIN~1.512/houdini/python3.11libs\hou.py", line 19175, in cook
return _hou.OpNode_cook(self, *args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
hou.OperationFailed: The attempted operation failed.
Error while cooking.
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "C:\Users\Kayla\AppData\Local\Ynput\AYON\dependency_packages\ayon_2603121036_windows.zip\dependencies\pyblish\plugin.py", line 528, in __explicit_process
runner(*args)
File "D:\ayon-addon_template\ayon-houdini\client\ayon_houdini\api\action.py", line 30, in process
invalid_nodes = plugin.get_invalid(instance)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "D:\ayon-addon_template\ayon-houdini\client\ayon_houdini\plugins\publish\validate_sop_output_node.py", line 82, in get_invalid
raise PublishValidationError(
ayon_core.pipeline.publish.publish_plugins.PublishValidationError: Failed to cook node: /obj/apex_rig/turret_asset.
Changelog Description
This PR is for publishing animation data from packed APEX assets. it was built on top of #371
A word on APEX Animation
Typically, this PR allows publishing the animation data only so that we can apply them later in different scenes instead of republishing the whole rig asset again OR publishing baked animation.
As long as artists are using
APEX Scene Copy Animationnode, then everything will be cool.However, when they add a scene animate node, as soon as they go through animation mode in the scene view, the node will stash the animation data. which means the

copy animationnodes can be removed and the animation will just be persistent. this is a result of Houdini using stashing. and, in this sense, I'm afraid loading different animations won't have any effect. and it can be confusing for artists. and this is something not related to AYON/saving animation data as Bgeo.Additional review information
I made this PR while exploring APEX and AYON, mainly in #366 .
Then to make things cleaner, any needed fixes for publishing APEX were moved to #371 as well as the original requirement for AYON APEX Rigging USD workflow while moving the animation part to this PR.
Demo
Turret Example AYON APEX Workflow.zip
2026-03-04.14-03-56.mp4
Testing notes:
Resolve #365