2013 SP1 has a bug (regression) where it takes forever and a day to write data
onto FCurves using scripting. Therefore I am writing a self installing command
in C++ to work around that bug. The command needs to accept 7 values.
The command's argument list looks something like this:
// Arguments
ArgumentArray oArguments = oCommand.GetArguments();
oArguments.AddWithHandler( L"Parameter", L"SingleObj" );
oArguments.Add( L"FCurveType", siStandardFCurve ); // FCurve key
value type (float, int, boolean, ...)
oArguments.Add( L"Interpolation" ); // FCurve
interpolation
oArguments.Add( L"Extrapolation" ); // FCurve
extrapolation
oArguments.Add( L"SI3DStyleFlag", false ); // FCurve curve
type (Cubic vs. SI3D)
oArguments.Add( L"FrameOffset", 0 ); // offset for key
time(s) to adjust for pasting.
oArguments.Add( L"aFKeyTimes" ); // 1D array of:
FCurve key times
oArguments.Add( L"aFKeyValues" ); // 1D array of:
FCurve key values
oArguments.Add( L"aFKeyTangentsLeftX" ); // 1D array of:
FCurve key tangent
oArguments.Add( L"aFKeyTangentsLeftY" );
oArguments.Add( L"aFKeyTangentsRightX" );
oArguments.Add( L"aFKeyTangentsRightY" );
oArguments.Add( L"aFKeyInterpolations" ); // 1D array of:
FCurveKey Interpolations
//======================================================================================
// _Execute()
//
//======================================================================================
SICALLBACK ML_FCurveWrite_Execute( CRef& in_ctxt )
{
Application oApplication;
Context oContext( in_ctxt );
LONG n = 0;
CValueArray aArguments = oContext.GetAttribute( L"Arguments" );
Parameter oParameter = aArguments[n++];
CValueArray aFKeyTimes = aArguments[n++];
CValueArray aFKeyValues = aArguments[n++];
CValueArray aFKeyTangentsLeftX = aArguments[n++];
CValueArray aFKeyTangentsLeftY = aArguments[n++];
CValueArray aFKeyTangentsRightX = aArguments[n++];
CValueArray aFKeyTangentsRightY = aArguments[n++];
CValueArray aFKeyInterpolations = aArguments[n++];
But in order to apply the incoming data onto an FCurve, the 7 CValueArray
arrays must be converted to specific data types to satisfy FCurve.SetKeys()
like this:
LONG NbKeys = aFCurveTimes.GetCount();
CTimeArray aFKeyTimes;
CDoubleArray aFKeyValues;
CTimeArray aFKeyTangentsLeftX;
CDoubleArray aFKeyTangentsLeftY;
CTimeArray aFKeyTangentsRightX;
CDoubleArray aFKeyTangentsRightY;
CLongArray aFKeyInterpolations;
for ( LONG i = 0; i < NbKeys; i++ ) {
aFKeyTimes[i] = (CTime)aFCurveTimes[i];
aFKeyValues[i] = (double)aFCurveValues[i];
aFKeyTangentsLeftX[i] = (CTime)aFCurveTangentsLeftX[i];
aFKeyTangentsLeftY[i] = (double)aFCurveTangentsLeftY[i];
aFKeyTangentsRightX[i] = (CTime)aFCurveTangentsRightX[i];
aFKeyTangentsRightY[i] = (double)aFCurveTangentsRightY[i];
aFKeyInterpolations[i] = (LONG)aFCurveInterpolations[i];
}
// Apply the FKeys onto the FCurve
oFCurve.BeginEdit();
oFCurve.SetKeys(
aFKeyTimes,
aFKeyValues,
aFKeyInterpolations,
aFKeyTangentsLeftX,
aFKeyTangentsLeftY,
aFKeyTangentsRightX,
aFKeyTangentsRightY,
true
);
oFCurve.EndEdit();
Anybody know of a typecast that can be performed on the entire array upon
extracting from the command's argument list so I don't have to iterate and
convert each array?
Matt