## FCurve.SetKey

### Introduced

v3.0

### Description

Sets the time (in frames) and value of the key at the specified index.
Note: If another key already exists at the new frame value then the method raises a 'Cannot set key' (E_FAIL) error.
If the index is out of range then the method raises an 'Invalid argument' (E_INVALIDARG) error.
If the fcurve is locked then the method raises an 'Access Denied' (E_ACCESSDENIED) error.

### C# Syntax

    FCurve.SetKey( Int32 in_Index, Object in_Frame, Object in_Value, Boolean in_OverrideKeyLock );

### Scripting Syntax

    FCurve.SetKey( Index, Frame, Value, [OverrideKeyLock] );

### Parameters

Parameter | Type | Description
--- | --- | ---
Index | Long | Index of the key. Must be a value between 0 and (number of keys - 1).
Frame | Variant | The new key time in frames.
Value | Variant | The new key value. Use a value type as follows: For standard and raw fcurves use a double value (VT_R8) For integer fcurves use a LONG (VT_I4) For boolean fcurves use a variant bool value (VT_BOOL,VARIANT_TRUE,VARIANT_FALSE).
OverrideKeyLock | Boolean | Override the FCurveKey.Locked value to force key to be removed. Default Value: false

### Examples

#### JScript Example

    /*

    	This JScript example illustrates how to use the FCurve.SetKey method

    	to translate keys.

    */

    // Create a null

    Application.NewScene( null, false );

    var nullobj = ActiveSceneRoot.AddNull();

    // Create an fcurve on the posx parameter from the null

    var fc = nullobj.posx.AddFCurve()

    // Create a custom property set on the null

    var cpset = nullobj.AddCustomProperty( "CustomPSet" );

    var empty;

    var x = cpset.AddParameter( "X", siDouble, empty, siAnimatable, "X", "X", empty, 5, 0, 5 );

    var y = cpset.AddParameter( "Y", siInt4, empty, siAnimatable, "Y", "Y", empty, 5, 0, 5 );

    var fc1 = x.AddFCurve();

    var fc2 = y.AddFCurve();

    // Start editing the fcurves

    fc1.BeginEdit();

    fc2.BeginEdit();

    // Add keys to the fcurves

    fc1.Resample();

    fc2.Resample();

    // Assign some values to keys

    var val, X;

    for ( i=0; i<fc1.GetNumKeys(); i++ )

    {

    	X = ( (i+1) - 10 )/10;

    	fc1.GetKeyAtIndex(i).Value = Math.atan( X / Sqr( -X * X + 1 ) );

    	// Copy the value to fc2 for comparison

    	fc2.GetKeyAtIndex(i).Value = fc1.GetKeyValue(i);

    }

    var ckeys = fc1.GetNumKeys();

    var tangents = new Array( ckeys * 4 );

    var itan = 0;

    // Save tangents

    for ( i=0; i<ckeys; i++ )

    {

    	var key = fc1.GetKeyAtIndex(i);

    	// Save the tangents

    	tangents[itan++] = key.LeftTanX;

    	tangents[itan++] = key.LeftTanY;

    	tangents[itan++] = key.RightTanX;

    	tangents[itan++] = key.RightTanY;

    }

    // Translate the keys

    for ( i=0; i<ckeys; i++ )

    {

    	frame = fc1.GetKeyFrame(i);

    	val = fc1.GetKeyValue(i);

    	key = fc1.GetKey(frame);

    	fc1.SetKey( i, frame-100, val * 1.25 );

    }

    // Reset the tangents

    fc1.SetKeyTangents(tangents);

    // End editing the fcurves

    fc1.EndEdit();

    fc2.EndEdit();

    // Utility function

    function Sqr( x )

    {

    	return x * x;

    }

### See Also

FCurveKey.Locked FCurveKey.Set FCurveKey.Time FCurveKey.Value