Custom commands can return values, such as numbers, strings, objects, or collections of objects. To return a value, a command must Command.ReturnValue or Command::EnableReturnValue in the Init callback. The Execute callback then takes care of returning the value.
If the return value is not enabled, Softimage ignores any value returned by the command. If the return value is enabled, but the command does not return a value, Softimage returns an empty Variant.
For scripted commands, the return value is whatever value the Execute callback returns.
JScript Example: Returning a collection of objects from a custom command
function MyCommand_Init( ctxt ) { var oCmd; oCmd = ctxt.Source; // This command returns a value oCmd.ReturnValue = true; var oArgs; oArgs = oCmd.Arguments; // By default, this arg will be a collection of all groups oArgs.AddWithHandler("cloObjects","Collection", "#group*" ); return true; } function MyCommand_Execute( cloObjects ) { // Return all objects in the groups return cloObjects.Expand(); }
C++ commands put their return values in the ReturnValue attribute of the callback context.
C++ Example: Returning a collection of objects from a custom command
XSIPLUGINCALLBACK CStatus MyCommand_Execute( CRef& in_ctxt ) { Context ctxt( in_ctxt ); CValueArray args = ctxt.GetAttribute(L"Arguments"); // This command uses the Collection argument handler CValueArray collection = args[0]; // An array CRefArray objects; for ( long j = 0; j < collection.GetCount(); ++j ) { CValue val = collection[j]; CRef ref( val ); if ( ref.GetClassID() == siX3DObjectID ) { objects.Add( ref ); } } // Put the CRefArray in a CValue object CValue retval( objects ); // Return the X3DObjects ctxt.PutAttribute( L"ReturnValue", retval ); // This does the same thing as above: // ctxt.PutAttribute( L"ReturnValue", objects ); return CStatus::OK; }