Commands can be invoked in C# using the XSIApplication.ExecuteCommand method. For more information, see the following sections:
Input arguments are packed into an array of System.Object objects (the C# version of the Variant type):
// Use XSIUtils.BuildPath to create the string path to the preset CXSIUtilsClass utils = new CXSIUtilsClass(); string presetfile = utils.BuildPath( app.get_InstallationPath(siInstallationPath.siUserPath), "Data", "DSPresets", "Properties", "Example.Preset", "", "", "" ); // Notice how you don't have to explicitly cast these strings into objects // in order to pack them into the array of objects object[] args = new object[2] { presetfile, "MyPSet" }; app.ExecuteCommand("SILoadPreset", args);
C# Example: Calling a Command with Optional Arguments
All arguments need to be explicitly passed to command arguments. However, in some cases you can invoke the default value by passing in a null value. This is similar to JScript, but whereas JScript lets you omit any trailing optional arguments, you must still pass them in C#:
using XSIOM; CXSIApplicationClass app = new CXSIApplicationClass(); // Notice that passing null triggers the default value app.ExecuteCommand("NewScene", null); Model root = app.ActiveSceneRoot; X3DObject sph = root.AddGeometry("Cube", "MeshSurface", "MyCube"); // The JScript version can simply ignore the final argument and it // will default to false, but C# needs to explicitly pass null object[] args = new object[3] { sph.Name + ".kine.local.posx", "-10 + T * 3", null }; app.ExecuteCommand("AddExpr", args); // JScript version would look like this: NewScene( null, false ); var root = Application.ActiveSceneRoot; var sph = root.AddGeometry("Cube", "MeshSurface", "MyCube"); // Here the final argument is missing AddExpr( sph.Name + ".kine.local.posx", "-10 + T * 3" );
C# Example: Calling a Command with No Arguments
If the command takes no arguments you can specify a null:
app.ExecuteCommand("LastFrame", null);
![]()
|
If you try to pass only the name of the command, you will get a compiler error telling you are trying to specify the wrong number of arguments for the XSIApplication.ExecuteCommand method. |
XSIApplication.ExecuteCommand always returns a Variant object which maps to a System.Object object in C#. You can check the command reference documentation to figure out what is contained in the returned array.
C# Example: Calling a Command with a Return Value
This example explicitly casts the returned C# Object to the ActionSource interface:
using XSIOM; CXSIApplicationClass app = new CXSIApplicationClass(); // Setup the scene Model root = app.ActiveSceneRoot; X3DObject sph = root.AddGeometry("Cube", "MeshSurface", "MyCube"); // Build the arguments list for the StoreAction command object[] args = new object[11]; args[0] = sph.Name; args[1] = "MyCube.kine.local.posx,MyCube.kine.local.posy,MyCube.kine.local.posz"; args[2] = 1; args[3] = "StoredStaticPose"; args[4] = true; args[5] = 1.0; args[6] = 5.0; args[7] = false; args[8] = false; args[9] = false; args[10] = -1.0; ActionSource src = (ActionSource)app.ExecuteCommand("StoreAction", args); app.LogMessage("Created new source: " + src.FullName, siSeverity.siInfo); // Sources.Scene_Root.StoredStaticPose
C# Example: Calling a Command with Output Arguments
The XSIApplication.ExecuteCommand returns a Variant object containing an array of the output arguments which you can test and cast to the correct data type or interface.
![]()
|
Some commands both return a value and use output arguments. For those commands only the return value is accessible. The only possible workaround in this case is to implement a VBScript custom command to return all elements in an array or XSICollection. Check the C# and Scripting Reference for return value and output parameter information on each command you need to call. |
object[] args = new object[7] { StringModule.siGenericObjectFilter, null, null, null, null, null, null };
Array rtn = (Array)app.ExecuteCommand("PickElement", args);
foreach (object obj in rtn)
{
if (obj.GetType() == System.Int32)
{
int val = (int)obj;
Log(val.ToString());
}
else
{
CollectionItem itm = (CollectionItem)obj;
Log(itm.Name);
}
}Autodesk Softimage v7.5