Software:
3ds max 2019
Iterating through a list of all of an object’s hierarchy or all of the objects in the scene is a very common requirement for scripted tools and utilities in 3D animation software.
Coming from a MaxScript background, I was used to just have to write the word ‘objects‘ to reference a list of all of the objects in the scene.
Unless I’m missing something obvious,
There isn’t a shortcut like this available in the 3ds max Python API.
In order to list all the objects in the scene you need to use a recursive function that will return a list of all of a node’s children, and children’s children, etc.
In the following example, the function ‘list_children()’ will return a list all of the objects in the supplied node’s hierarchy, and when given the scene’s root node via MaxPlus.Core.GetRootNode() it will return a list of all the objects in the scene.
Wrapping ‘list_children()’ within the ‘scene_objects()’ function, provides a convenient way get a list of all the objects in the scene just by calling ‘scene_objects()’.
def scene_objects(): def list_children(node): list = [] for c in node.Children: list.append(c) list = list + list_children(c) return list return list_children(MaxPlus.Core.GetRootNode()) for o in scene_objects(): print o.Name
* note that when copying and pasting a script from this example, the indentation may not be pasted correctly.
Related:
https://odederell3d.blog/2020/02/11/python-for-3ds-max-select-objects-of-type/