Calling Commands from C#


Commands can be invoked in C# using the XSIApplication.ExecuteCommand method. For more information, see the following sections:

How to Pass in Arguments

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(
    "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.

Dealing with Return Values

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

Getting Output Arguments

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 Commands 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;
		CollectionItem itm = (CollectionItem)obj;

Creative Commons License Except where otherwise noted, this work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License