Solved Beginner:How can i set a key-frame and value to a cube by python?

Hi~As a crazy beginner.
what puzzled me recently is how I can set a Key-frame and value to a cube
my question is so simple while the existed codes are not so friendly to a beginner due to the no explanation
(BTW, the systematic python-C4D video tutorial is so rare :sweat_smile: )

Python question:
**I want to set cube Y position in 0cm in 1st key-frame and 100cm in 10th key-frame, BTW, let them ease in and out **

未命名图片11.png

import c4d



input = c4d.BaseObject(5159)
#????????????????
#how to set key-frame?

doc.InsertObject(input)

c4d.EventAdd()


How to do it ?
Thanks if you can help me ,i know my question is simple,but i am in the way to be professional.:blush:

Hello,

I've marked your thread as a question, feel free to mark it as solved when you think it is, see this thread for information : Q&A New Functionality.

I have to make things clear here. Your screenshot show you are using a generator while you code add object to the document. You can't modify the scene in a generator. It's forbidden. For this kind of scenario, (add object to a scene and tracks and keys) it's better to use a script.

a few links to have information, even if they are about c++ there are lot of information there.

You have to create a track for each vector (position, rotation, scale) and for each vector's component (X,Y,Z)
I've create a script example for only the position X parameter. Feel free to create a function for that and add other track (Y, Z and rotation, scale etc)

import c4d

# Welcome to the world of Python



# Main function
def main():
    # Creates the object in memory
    obj = c4d.BaseObject(c4d.Ocube)
    
    # Creates the track in memory. Defined by it's DESCID    
    trY = c4d.CTrack(obj, c4d.DescID(c4d.DescLevel(c4d.ID_BASEOBJECT_POSITION, c4d.DTYPE_VECTOR, 0), c4d.DescLevel(c4d.VECTOR_Y, c4d.DTYPE_REAL, 0)))
    
    # Gets Curves for the track
    curveY = trY.GetCurve()
    
    # Retrieves the current time
    keyTime = c4d.BaseTime(0)
    

    # Adds the keys
    added = curveY.AddKey(keyTime)
    
    # Checks for error
    if added is None:
        raise TypeError("cannont create a key")
    
    # Retrieves the inserted key
    firstKey = added["key"]
    kIndex = added["nidx"]
    
    # Sets the value of the key
    firstKey.SetValue(curveY, 0)
    
    # Changes it's interpolation
    firstKey.SetInterpolation(curveY,c4d.CINTERPOLATION_SPLINE)
    
    # Sets the key to default status AutoTangent etc...
    curveY.SetKeyDefault(doc,kIndex)

    # Adds another key
    keyTime = c4d.BaseTime(10, doc.GetFps())
    added = curveY.AddKey(keyTime)
    if added is None:
        raise TypeError("cannont create a key")
    secondKey = added["key"]
    kIndex = added["nidx"]
    secondKey.SetValue(curveY, 100)
    secondKey.SetInterpolation(curveY, c4d.CINTERPOLATION_SPLINE)
    curveY.SetKeyDefault(doc, kIndex)
    

    # Inserts track to the object
    obj.InsertTrackSorted(trY)

    # Inserts the object in document
    doc.InsertObject(obj)
    
   
    
    # Pushes an update event to Cinema 4D
    c4d.EventAdd()    



# Execute main()
if __name__=='__main__':
    main()

Cheers
Manuel

MAXON SDK Specialist

MAXON Registered Developer

@m_magalhaes
Thanks !!!! You certainly help me a lot!!!:grin:
I spend around half an hour to deeply understand code with the reference of the official document!
so excited that I figure out this problem!

Btw, what if I want to add the key to 'Size Y'to this cube,? I should replace

..........
c4d.DescLevel(c4d.ID_BASEOBJECT_POSITION, c4d.DTYPE_VECTOR, 0)
.........

with

..........
c4d.DescLevel(c4d.PRIM_CUBE_LEN, c4d.DTYPE_VECTOR_Y, 0)
...........

right?

@m_magalhaes Thanks ! You certainly help me a lot!

hello,
thanks @tummosoft, it's nice to see it's helpful :D

@ilad
By the way instead of ID_BASEOBJECT_POSITION you could have use ID_BASEOBJECT_REL_POSITION. Both Ids are the same.

If you want to know how to get those ids you can use the python console and drag and drop parameters, more information on this page

In this case the DescID is composed of two DescLevel. The first define the Vector type, the second de Float type for X, Y and Z.

(DescID can have less or more levels)

To change the Size.Y of the cube, the descID will be :

c4d.DescID(c4d.DescLevel(c4d.PRIM_CUBE_LEN, c4d.DTYPE_VECTOR, 0), c4d.DescLevel(c4d.VECTOR_Y, c4d.DTYPE_REAL, 0)))

To change the scale of the object the descID will be :

c4d.DescID(c4d.DescLevel(c4d.ID_BASEOBJECT_REL_SCALE, c4d.DTYPE_VECTOR, 0), c4d.DescLevel(c4d.VECTOR_Y, c4d.DTYPE_REAL, 0)))

Cheers
Manuel

MAXON SDK Specialist

MAXON Registered Developer