For scripted commands, the Execute callback takes the same arguments as the command. The order in which you add the arguments determines how Softimage passes data into the Execute callback.
// [ JScript ]
function MyCommand_Init( ctxt )
{
// Get the Command object from the callback context
var oCmd;
oCmd = ctxt.Source;
// Get the ArgumentCollection
var oArgs;
oArgs = oCmd.Arguments;
oArgs.AddWithHandler("Arg0","Collection");
oArgs.Add( "Arg1", siArgumentInput, false );
return true;
}
function MyCommand_Execute( Arg0, Arg1 )
{
...
}A C++ command gets a Context object that contains the command arguments in its Arguments attribute:
// C++
XSIPLUGINCALLBACK CStatus MyCommand_Execute( CRef& in_ctxt )
{
Context ctxt( in_ctxt );
CValueArray args = ctxt.GetAttribute(L"Arguments");
CValue objects = args[0];
CValue flag = args[1];
#ifdef _DEBUG
Application app;
for (long i=0; i<args.GetCount(); i++)
{
app.LogMessage( L"Arg" + CValue(i).GetAsText() + L" : "
+ L"DataType = " + CValue( (long)args[i].m_t ).GetAsText() );
}
#endif
...
return CStatus::OK;
}The Arguments attribute is a CValueArray. Each element of this array is a CValue object that stores an argument, which could be a boolean, numeric, or string value, a single Softimage object, or a collection of objects. For example, if you add an argument using the Collection argument handler:
oArgs.AddWithHandler( L"objects", L"Collection" );
then in the CValueArray of arguments, there will be a CValue element that stores a collection of objects:
XSIPLUGINCALLBACK CStatus MyCommand_Execute( CRef& in_ctxt )
{
Context ctxt( in_ctxt );
CValueArray args = ctxt.GetAttribute(L"Arguments");
// CValue::operator CValueArray() automatically converts
// args[0], which is a CValue, to a CValueArray
CValueArray objects = args[0];
for (long i=0; i<objects.GetCount(); i++)
{
// objects[i] is a CValue object that holds a CRef to an object
CRef ref = objects[i]; // CValue::operator CRef() does the conversion for us
if ( ref.GetClassID() == siX3DObjectID )
{
// Construct an X3DObject from the CRef
X3DObject obj( ref );
...
}
}
...
}Note that if you use the SDK Command Wizard to generate your C++ command, the wizard always assigns the arguments to CValue objects like this:
CValue Arg0 = args[0]; CValue Arg1 = args[1];
However, args[i] is a CValue, and the CValue class provides a set of conversion operators that allow you to do this instead:
CValueArray objects = args[0]; // arg that uses the Collection arg handler CRef obj_ref = args[1];// arg that uses the SingleObj arg handler bool flag = args[1];// boolean arg CString name = args[2];// string arg