Maxon Developers Maxon Developers
    • Documentation
      • Cinema 4D Python API
      • Cinema 4D C++ API
      • Cineware API
      • ZBrush Python API
      • ZBrush GoZ API
      • Code Examples on Github
    • Forum
    • Downloads
    • Support
      • Support Procedures
      • Registered Developer Program
      • Plugin IDs
      • Contact Us
    • Categories
      • Overview
      • News & Information
      • Cinema 4D SDK Support
      • Cineware SDK Support
      • ZBrush 4D SDK Support
      • Bugs
      • General Talk
    • Recent
    • Tags
    • Users
    • Register
    • Login

    GetEffectiveRenderData does not return per-take overrides for RDATA_FRAMEFROM / RDATA_FRAMETO

    Scheduled Pinned Locked Moved Cinema 4D SDK
    20252026linux
    2 Posts 2 Posters 38 Views 1 Watching
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • V Offline
      vaishhg
      last edited by ferdinand

      Dear community,

      I'm facing an issue reading per-take frame range overrides via the Python API. When takes override the frame range on the render data, all methods I've tried return the Main take's frame range instead of the overridden values.

      Environment:

      • Cinema 4D Version: 2025, 2026
      • Operating System: macOS
      • Python Version: 3.11 (Cinema 4D native)

      Issue Description:
      When multiple takes each override the render data's frame range (e.g., Main: 0-6, V: 0-9, E: 0-23, R: 0-13, A: 0-17), reading RDATA_FRAMEFROM/RDATA_FRAMETO always returns the Main take's values (0-6) for every take.

      Steps to Reproduce:

      1. Create a Cinema 4D scene with a Main take (frame range 0-6)
      2. Create child takes (V, E, R, A) and override the render data's frame range on each (e.g., V: 0-9, E: 0-23, R: 0-13, A: 0-17)
      3. Run the following script:
      import c4d
      
      def main():
          doc = c4d.documents.GetActiveDocument()
          take_data = doc.GetTakeData()
          main_take = take_data.GetMainTake()
          fps = doc.GetFps()
      
          takes = [main_take] + main_take.GetChildren()
          for take in takes:
              rd, _ = take.GetEffectiveRenderData(take_data)
              frame_from = rd[c4d.RDATA_FRAMEFROM].GetFrame(fps)
              frame_to = rd[c4d.RDATA_FRAMETO].GetFrame(fps)
              print(f"Take '{take.GetName()}': FRAMEFROM={frame_from}, FRAMETO={frame_to}")
      
      if __name__ == '__main__':
          main()
      
      1. Observe that all takes print FRAMEFROM=0, FRAMETO=6

      Expected Behavior:
      Each take should report its own overridden frame range.

      Actual Behavior:
      All takes return FRAMEFROM=0, FRAMETO=6 (the Main take's range).

      What I've Tried:

      1. take.GetEffectiveRenderData(take_data) — returns 0-6 for all takes
      2. take_data.SetCurrentTake(take) then reading from doc.GetActiveRenderData() — returns 0-6 for all takes
      3. take_data.TakeToDocument(take) then reading from the isolated document's active render data — returns 0-6 for all takes

      Questions:

      1. Is this a bug in the Python API, or is there a different method we should be using to read per-take frame range overrides (RDATA_FRAMEFROM/RDATA_FRAMETO)?
      2. Are there any known workarounds to get the fully resolved render data with all take overrides applied?

      Any guidance would be greatly appreciated. Thank you!

      ferdinandF 1 Reply Last reply Reply Quote 0
      • ferdinandF Offline
        ferdinand @vaishhg
        last edited by ferdinand

        Hello @vaishhg,

        Thank you for reaching out to us and your comprehensive yet sparse problem description, this really makes things easier for us.

        The problem is a bit that you somewhat forgot a crucial part: The scene data :). You provided this:

        Create a Cinema 4D scene with a Main take (frame range 0-6)
        Create child takes (V, E, R, A) and override the render data's frame range on each (e.g., V: 0-9, E: 0-23, R: 0-13, A: 0-17)

        But I cannot recreate a scene with these instructions, unless you meant the second step in a rather metaphorical way (switching the render data itself via takes). I also talked with some of our support specialists, and the consensus seems to be that what you claim to be the case - a scene with take overwritten FROM/TO values - is not possible. What you can do, is create multiple render settings and then activate them via takes.

        But Takes are a tricky subject, and I would not rule out that you somehow found a way to create take overrides for parameters of a render data instance. If so, please share the scene. Find also a scene attached which demonstrates what I discussed above: A scene that switches the active render data based on takes. It will print this with your script:

        Take 'Main': FRAMEFROM=0, FRAMETO=90
        Take '0_45': FRAMEFROM=0, FRAMETO=45
        Take '0_90': FRAMEFROM=0, FRAMETO=90
        

        take_renderdata.c4d

        So, to formally answer your main question: When my assumptions above are true, your scene is printing the same values because each take does have the same values, as these two parameters are not directly overridable.

        Cheers,
        Ferdinand

        MAXON SDK Specialist
        developers.maxon.net

        1 Reply Last reply Reply Quote 0
        • First post
          Last post