Recording keyframes from Python plugin

On 25/08/2014 at 19:57, xxxxxxxx wrote:


I have a plugin that tells objects to change a parameter. For example, a 'while' loop that changes a cubes length from 0 to 100. I want to be able to press play and automatic key framing and have it store frames of the cubes length as it changes. How would I do this?

Would it need to record a frame each time the value changes? What's a way to add this to the code?

Thanks for the help,

On 26/08/2014 at 12:39, xxxxxxxx wrote:


What kind of plugin do you have? Depending on the plugin type there may be different ways to do what you want.

To add keyframs from Python you need Ctracks, Curves and Ckeys:

        # define some value for the key  
      someValue = random.random() * 200;  
      #define the time  
      keyTime = c4d.BaseTime(1)  
      # get the active object to add some keys  
      activeObject = doc.GetActiveObject()  
      if activeObject != None:  
          # look if there is already a track  
          track = activeObject.FindCTrack(c4d.ID_BASEOBJECT_REL_POSITION)  
          # if not create the track  
          if track == None:  
              track=c4d.CTrack(activeObject, c4d.DescID(c4d.DescLevel(c4d.ID_BASEOBJECT_REL_POSITION, c4d.DTYPE_VECTOR, 0), c4d.DescLevel(c4d.VECTOR_X, c4d.DTYPE_REAL, 0)))  
          # now get the track's curve  
          curve = track.GetCurve()  
          # and add a key at the specified time  
          added = curve.AddKey(keyTime)  
          if added != None:  
              # now define the actual value of the key  
              key = added["key"]  

First you check if the track already exist. If not you can create the track yourself. When you have the track, you access it's curve and add the key. Finally you can set the key's value.

Best wishes,

On 26/08/2014 at 17:59, xxxxxxxx wrote:

Thanks for the reply. This gets me in the right direction.

Now, I want to be able to click play, and have it store a keyframe whenever it is changed.

To give you insight as to what I'm doing.... I have external software that sends data to cinema at any given time. I want to take what it sends, and write a key frame for the object that changes (example: a cubes length). So for your method to work, it would have to know which keyframe is active in order to know which to write to.. keyTime = c4d.BaseTime(1) wouldn't necessarily work for this..

Any other ideas?


On 27/08/2014 at 12:06, xxxxxxxx wrote:


to create a key for the current frame you can simply get the current time by accessing the document:

keyTime = doc.GetTime()

You may also want to check if for the current frame a key already exits:

# check if key already exists  
keyDict = curve.FindKey(keyTime);  
if keyDict == None:  
  # and add a key at the specified time  
  keyDict = curve.AddKey(keyTime)  
# now define the actual value of the key  
key = keyDict["key"]  

best wishes,