@ceen Hi, The Summary row mey only a UI aggregate; it is not a single CTrack that can be switched directly.
To reproduce its Animation switch, collect the real CTrack objects and set their c4d.ID_CTRACK_ANIMOFF value:
# True = animation enabled, False = animation disabled
track[c4d.ID_CTRACK_ANIMOFF] = False
This does not delete keyframes and does not hide Timeline rows. Do not use NBIT_TLx_HIDE for this, because those flags only hide rows in the Timeline.
A complete document-wide solution must also traverse Motion Sources in doc.GetNLARoot() . Add Motion Source moves/copies animation into that separate NLA hierarchy, so iterating only normal scene objects and tags will miss tracks such as Time and 2D Tracks.
It should be noted that doc.GetNLARoot() is marked as Private in the SDK, and I'm not sure whether it should be used.
"""Toggle the Summary Animation switch for all collected CTracks."""
import c4d
def iter_nodes(node):
while node:
yield node
yield from iter_nodes(node.GetDown())
node = node.GetNext()
def main():
doc = c4d.documents.GetActiveDocument()
tracks, seen = [], set()
def add_tracks(owner):
for track in (owner.GetCTracks() or []) if owner else []:
if id(track) not in seen:
seen.add(id(track))
tracks.append(track)
def add_tree(root, include_tags=False):
for node in iter_nodes(root):
add_tracks(node)
if include_tags:
for tag in node.GetTags() or []:
add_tracks(tag)
add_tracks(doc)
add_tree(doc.GetFirstObject(), include_tags=True)
material = doc.GetFirstMaterial()
while material:
add_tracks(material)
add_tree(material.GetFirstShader())
material = material.GetNext()
render_data = doc.GetFirstRenderData()
while render_data:
add_tracks(render_data)
video_post = render_data.GetFirstVideoPost()
while video_post:
add_tracks(video_post)
video_post = video_post.GetNext()
render_data = render_data.GetNext()
layer_root = doc.GetLayerObjectRoot()
add_tree(layer_root.GetDown() if layer_root else None)
# Private API, but required for Add Motion Source tracks in C4D 2026.
add_tree(doc.GetNLARoot().GetDown(), include_tags=True)
enabled = any(track[c4d.ID_CTRACK_ANIMOFF] for track in tracks)
for track in tracks:
track[c4d.ID_CTRACK_ANIMOFF] = not enabled
c4d.EventAdd()
if __name__ == "__main__":
main()
Cheers,
Anlv