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

Reply via email to