SOLVED Unique Object Identifier

Hi, I searched around for an answer on this but I haven't found anything solid on how to identify an object based on a unique ID of any kind in python. Isn't there something uniquely consistent with each object we can refer to? I need something I can write out to a file and read back later to reference a specific object.

Thank you

Hi @Motion4D,

thank you for reaching out to us. The answer to your question is C4DAtom.FindUniqueID. The topic has been discussed just yesterday here and also a couple of times in the past; you might find this thread informative. I also attached a small example, please feel free to come back with any remaining questions.

Happy holidays,
Ferdinand

import c4d

def main():
    """Entry point.
    """
    if op is None:
        raise RuntimeError("Please select an object")
    
    # Get the unique ID attached by MAxon to each node. See linked threads
    # for details.
    uuid = op.FindUniqueID(c4d.MAXON_CREATOR_ID)
    print ("node:", op)
    print ("uuid:", uuid)
    print ("raw uuid:", bytes(uuid))
    
if __name__=='__main__':
    main()
node: <c4d.BaseObject object called Cube/Cube with ID 5159 at 2488003778176>
uuid: <memory at 0x000002434A4CD198>
raw uuid: b',\xf0]w\xccG\x14\x0c\xfd\x8c\xfd.\xb8U\x00\x00'
>>> 

Hi @Motion4D,

thank you for reaching out to us. The answer to your question is C4DAtom.FindUniqueID. The topic has been discussed just yesterday here and also a couple of times in the past; you might find this thread informative. I also attached a small example, please feel free to come back with any remaining questions.

Happy holidays,
Ferdinand

import c4d

def main():
    """Entry point.
    """
    if op is None:
        raise RuntimeError("Please select an object")
    
    # Get the unique ID attached by MAxon to each node. See linked threads
    # for details.
    uuid = op.FindUniqueID(c4d.MAXON_CREATOR_ID)
    print ("node:", op)
    print ("uuid:", uuid)
    print ("raw uuid:", bytes(uuid))
    
if __name__=='__main__':
    main()
node: <c4d.BaseObject object called Cube/Cube with ID 5159 at 2488003778176>
uuid: <memory at 0x000002434A4CD198>
raw uuid: b',\xf0]w\xccG\x14\x0c\xfd\x8c\xfd.\xb8U\x00\x00'
>>> 

@zipit Hi Ferdinand, yes this is exactly what I was looking for. Sorry, I must have missed the other post. Thanks so much for clarifying with the example code:)

@zipit Hi Ferdinand, it seems I spoke too soon. At first, it seems that the ID stays consistent. But I noticed when you go into the plugin manager and reload a plugin all the IDs change again:(
It's possible this won't be an issue for users who aren't reloading plugins but there also may be other things that change the ID of all objects.
Is this a bug perhaps or is there really no guarantee that an ID can stay consistent with an object?

Thanks!

Adam

Hi @Motion4D,

indeed, Cinema does reestablish the scene graph when you hit Reload Python Plugins. However, this is more of an odd outlier, for more details, have a look at this thread I did link to in my first posting, which clarifies a bit the guarantees with which MAXON_CREATOR_ID comes. There has also been a recent thread where we did talk about the shortcomings of unique IDs in regard to caches.

Cheers,
Ferdinand

@zipit thanks for clarifying. Hopefully, there will be something more predictable for IDs in the future.

Hi @Motion4D,

I am not quite sure if there will be anything in the pipeline soon, because the limitations of IDs and markers are more of principal nature due to Cinema's heavily procedural architecture; i.e., not really something that can be "fixed". If you have any particular feature in mind, I would ask you to make a separate post with a dedicated feature request.

We however already did identify the whole "identifying and object"-thing a few weeks ago as something that is probably not explained well enough at the moment and added it to our to-do-list. There are no guarantees on when this will come though 😉

Cheers,
Ferdinand