Writing data to the .c4d file

  • @blastframe For me, it works fine this way. Did you really "close and reopen" the document? Not "save", "close", "load"? Because if you just close the document, the data from the container is gone, which leads to your error message.

    The Q regarding MyUniqueId vs. PLUGIN_ID is not relevant (probably typed in a hurry), you can use either. But the ID value should come from Maxon in the end, so you avoid collisions with existing IDs.

  • Hello,

    The function SetDocumentData can only be used to update the document settings.

    It does accept an Int as a "type" but if you put something else than DOCUMENTSETTINGS_GENERAL DOCUMENTSETTINGS_MODELING DOCUMENTSETTINGS_DOCUMENT DOCUMENTSETTINGS_ANIMATIONSYSTEM the function will simply do nothing. (and the last one is marked as private)

    BaseContainer is a tree system, you can see sub-BaseContainer just like a child object in the object manager.
    So you can have (infinite ?) BaseContainer inside BaseContainer.

    If you want to store json data, it's up to you. You can store all elements of your json data or simply store a string.

    import c4d
    PLUGIN_ID = 1234567
    MyUniqueId = 456789
    def main():
        #retrieves the document baseContainer
        docBC = doc.GetDataInstance()
        #create a sub-BaseContainer
        subBc = c4d.BaseContainer()
        subBc[1000] = "hello"
        subBc[2000] = "world!"
        # Add the container to the "main" Container
        docBC.SetContainer(MyUniqueId, subBc)
        # Updates the document container
        # Print the values stored in our container.
        for cid, value in doc.GetDataInstance().GetContainer(MyUniqueId):
            print cid, value
        # Print Hello World
        print doc[MyUniqueId][1000], doc[MyUniqueId][2000]
    if __name__=='__main__':


  • @Cairyn I'm a little embarrassed, but you're right. I wasn't saving properly (I think just saving the Script) then going to the document in Recent Files. I'll mark this solved.

    Thank you all - @Cairyn ,@zipit ,@m_magalhaes .

  • hi,

    you could use the same ID, you just have to be sure that you are the only one to use that ID to store datas.
    That's why we use plugin's ID.


  • @m_magalhaes Thanks, Manuel.

    How would I delete the data of an individual sub-BaseContainer in the case of your script?

    I've tried several methods below but the doc[MyUniqueId][1000] still shows data in the print call.

    bc = doc.GetDataInstance().GetContainer(MyUniqueId)
    print bc.RemoveData(1000)
    # True 
    print doc[MyUniqueId].RemoveData(1000)
    # True
    print doc[MyUniqueId][1000]

    I was able to delete all of the data this way, but what if I want to keep the data in subBc[2000]?


    Thank you!

  • hello,

    there's a difference between GetContainer and GetContainerInstance
    The first return a copy of the container the second the original link.
    So either you retrieve a copy and set back the container to the parent with SetData and/or SetContainer
    or you retrieve the original link and the changes are reflected immediately.

    You can also use del that is pythonic

        bc = doc.GetDataInstance().GetContainerInstance(MyUniqueId)
        #del (bc[2000])


  • @m_magalhaes said in Writing data to the .c4d file:

    You can also use del that is pythonic

        bc = doc.GetDataInstance().GetContainerInstance(MyUniqueId)
        #del (bc[2000])

    Wonderful, @m_magalhaes , thank you so much!

Log in to reply