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);
}
}
SOFTIMAGE|XSI v6.01