Object Hierarchy | Related C++ Class: Command
Command
v2.0
Represents a Softimage command (either built-in or custom). This object encapsulates
information on a command such as the name, category, arguments, where it is implemented etc.
Custom commands behave just like built-in Softimage commands--they are logged in the
history window and can be exposed to scripting.
The XSIApplication.Commands property provides access to all the
built-in and custom commands installed in the system.
For example, to get the definition of the Translate command,
you can use 'set oCmd = Commands( "Translate" )'.
Note that the Commands property finds commands by SIObject.Name, not by
Command.ScriptingName. You can find the Name of a command by running it and then
checking the Edit menu (where the Name of the last executed command always appears after 'Repeat'
and 'Undo'). You can also iterate over the entire collection of commands (see the first example below).
To find a command by its scripting name, use XSIApplication.GetCommandByScriptingName.
You can find the ScriptingName of a command by running it and then checking the command log.
Commands are primarily called from scripts, in which case they are invoked by
calling the Command.ScriptingName with the scripting syntax
for calling a function, in effect they appear as if they are "helper functions"
available to the script writer. For example to call the custom command "Foo" from
jscript the syntax is "Foo( arg1, arg2 );"
For scripts embedded inside Netview pages this syntax
does not work, however all commands can be called as methods on the Application
object (for example oApplication.Foo( arg1, arg2 ) ;). It is also possible
to invoke a command through the Command.Execute method.
You can also place commands in toolbars (see CreateToolbarButton).
And there are two ways to place custom commands in Softimage menus. The first is through the
command category (see siCommandCategory) and the
second, more powerful approach, is through the Menu API.
The Arguments that a command accepts is part of its definition.
All commands have a fixed number of arguments, and
they are passed to the callback implementing the command in
the order that they are defined in the ArgumentCollection.
It is possible to define a default value and an ArgumentHandler
for each argument, so commands are often invoked without specifying each
argument value explicitly.
Softimage supports three possible ways to define a custom command: the embedded command,
the plug-in based command and the v1.5 command. They are all based
on the same Command object API but they have some subtle differences.
The embedded approach, which is new with v4.0, involves storing the implementation code
of the command directly inside the definition. (See Command.Code).
This approach is convenient for simple commands and is the approach demonstrated widely
in the examples under the Command and Argument objects. The command definition is
persisted in a .DSDynamicCommandMap file
and can also be transferred to other machines by packaging it inside a xsiaddon file.
Commands of this sort can be created interactively with CreateAndEditCommand.
The command definition can be changed interactively by calling EditCommand.
It can be destroyed by calling XSIApplication.RemoveCommand.
The plug-in based approach, also new with v4.0, involves implementing the definition
and implementation of the custom command inside a self-installed plug-in
(see PluginRegistrar.RegisterCommand,
the example in Command.Enabled and the SimpleCommand example that is
part of the installation). This approach is
ideal for complex scripts and supports the C++ API. Because multiple commands,
Menus, CustomProperty objects and other elements
can all be implemented inside the same Plugin module it is often possible
to write an entire sophisticated tool inside a single script file or dll.
A command defined in this fashion is not persisted inside the .DSDynamicCommandMap file,
instead its definition is regenerated by calling the Init callback each time the application is started.
To edit the command definition, change the code inside the Init callback and
reload the plug-in. To remove the custom command, remove the plug-in script or dll.
The older workflow, which was introduced in v1.5, is still fully supported. The steps to
defining a custom command with this approach are the following:
(1) Create a command object with XSIApplication.CreateCommand
(2) Define the properties of the Command object using its properties. For example,
Command.Language, Command.ReturnValue,
Command.SetFlag, etc.
(3) Add any arguments you want to specify with ArgumentCollection.Add
or ArgumentCollection.AddObjectArgument
For example, myCommand.Arguments.Add "myArgName", siArgumentInput, true, siBool.
(4) Create the script file on disk (Command.FileName) and
create a function (Command.Handler). This function takes
the same number of arguments as were specified in the ArgumentCollection
and it can return a value if Command.ReturnValue is true.
(5) Register the command in Softimage by using XSIApplication.AddCommand.
(6) The command is now available to be invoked. Softimage automatically stores the command definition
so the command remains available in future Softimage sessions.
(7) To change the definition of the command either call XSIApplication.RemoveCommand
and follow steps 2-5 again, or else call Command.Update.
(8) To remove the command from Softimage, use XSIApplication.RemoveCommand.
Note: For instructions on how to package a custom command as an add-on, see
Add-on Packages.
// JScript Custom Command overview - Embedded Approach InstallCommands(); DemoCommands() ; // Comment out this line if you want to experiment with the // commands created in this example CleanupCommands(); function InstallCommands() { // Remove any existing copies of the demo commands CleanupCommands() ; // each command needs to be defined. // (Softimage will not forget this information // until they are removed with a call to CleanupCommands() ; // // Define Command #1 : CommandHelloWorld // var cmd = Application.CreateCommand( "CommandHelloWorld" ) cmd.ScriptingName = "CommandHelloWorld" ; cmd.Language = "JScript" ; cmd.ReturnValue = false ; cmd.Handler = "HelloWorld" ; cmd.Code = HelloWorld.toString() ; // Embed the code directly in the definition Application.AddCommand( cmd ) ; // // Define Command #2 : CommandSimple // cmd = Application.CreateCommand( "CommandSimple" ) cmd.ScriptingName = "CommandSimple" ; cmd.Language = "JScript" ; cmd.ReturnValue = true ; cmd.Handler = "Simple" ; cmd.Code = Simple.toString() ; // Embed the code directly in the definition // You must mention the arguments you want. // The name is not important but must be unique cmd.Arguments.Add("a") cmd.Arguments.Add("b") Application.AddCommand( cmd ) // // Define Command #3 : CommandSimpleObjectArg // cmd = Application.CreateCommand( "CommandSimpleObjectArg" ) cmd.ScriptingName = "CommandSimpleObjectArg" ; cmd.Language = "JScript" ; cmd.ReturnValue = true ; cmd.Handler = "SimpleObjectArg" ; cmd.Code = SimpleObjectArg.toString() ; // Embed the code directly in the definition cmd.Arguments.AddObjectArgument("obj"); Application.AddCommand( cmd ) } function DemoCommands() { // It is simple to execute a custom command, especially one // like this with no return value or arguments. // Will log "Hello World" CommandHelloWorld() ; // Will log "15" logmessage( CommandSimple( 5, 10 ) ); // Will log "concat" logmessage( CommandSimple( "con","cat" ) ) ; newscene( null, false ) ; var oSphere = ActiveSceneRoot.AddGeometry("Sphere", "NurbsSurface") ; //Will log: //INFO : "Name of the input object sphere" //INFO : "grid" logmessage( CommandSimpleObjectArg( oSphere ) ) ; //Softimage can also turn an string to an object: //INFO : "Name of the input object grid" //INFO : "grid1" logmessage( CommandSimpleObjectArg( "grid" ) ) ; } function CleanupCommands() { Application.RemoveCommand( "CommandHelloWorld" ) ; Application.RemoveCommand( "CommandSimple" ) ; Application.RemoveCommand( "CommandSimpleObjectArg" ) ; } // Implementation of CommandHelloWorld // The name of this function matches the string we provided as cmd.Handler function HelloWorld() { LogMessage( "Hello World" ) ; } function Simple( in_a, in_b ) { return in_a + in_b ; } function SimpleObjectArg( in_obj ) { logmessage( "Name of the input object " + in_obj.Name ) ; // return a different object return ActiveSceneRoot.AddGeometry("Grid", "MeshSurface") ; } |
// JScript Custom Command overview - Self-Installed Approach // // This example relies on a script on disk so you need to // follow an important step first before running this example: // // SAVE the following commented out code into commandexample.js // inside your %XSI_USERHOME%\Application\Plugins directory. // // Once you have saved the file you can run the script /* // BEGINNING OF CODE TO SAVE IN FILE function XSILoadPlugin( in_reg ) { in_reg.Author = "Softimage SDK Team" ; in_reg.Name = "SDK Example - Custom Commands" ; in_reg.Major = 1 ; in_reg.Minor = 1 ; in_reg.RegisterCommand( "CommandHelloWorld", "CommandHelloWorld" ); in_reg.RegisterCommand( "CommandSimple", "CommandSimple" ); in_reg.RegisterCommand( "CommandSimpleObjectArg", "CommandSimpleObjectArg" ); return true ; } // // Define Command #1 : CommandHelloWorld // function CommandHelloWorld_Init(in_oCtxt) { var cmd = in_oCtxt.Source ; cmd.ReturnValue = false ; // We don't need to set cmd.Language, cmd.Handler, cmd.Code // or cmd.FileName because this is automatically determined. // Application.AddCommand is not called // This command takes no arguments } // // Define Command #2 : CommandSimple // function CommandSimple_Init(in_oCtxt) { var cmd = in_oCtxt.Source ; cmd.ReturnValue = true ; // You must mention the arguments you want. // The name is not important but must be unique cmd.Arguments.Add("a") cmd.Arguments.Add("b") } // // Define Command #3 : CommandSimpleObjectArg // function CommandSimpleObjectArg_Init(in_oCtxt) { var cmd = in_oCtxt.Source ; cmd.ReturnValue = true ; // You must mention the arguments you want. // The name is not important but must be unique cmd.Arguments.AddObjectArgument("obj"); } // Implementation of CommandHelloWorld function CommandHelloWorld_Execute() { LogMessage( "Hello World" ) ; } function CommandSimple_Execute( in_a, in_b ) { return in_a + in_b ; } function CommandSimpleObjectArg_Execute( in_obj ) { logmessage( "Name of the input object " + in_obj.Name ) ; // return a different object return ActiveSceneRoot.AddGeometry("Grid", "MeshSurface") ; } // END OF CODE TO SAVE IN FILE */ // This loads the newly created file, which will define the commands inside Softimage. // It is unnecessary if you restart Softimage or use the Plugin Manager view Application.LoadPlugin( Application.InstallationPath( siUserPath ) + "/Application/Plugins/commandexample.js" ) ; // Demonstrate the custom commands that are defined in the plug-in DemoCommands() ; function DemoCommands() { // It is simple to execute a custom command, especially one // like this with no return value or arguments. // Will log "Hello World" CommandHelloWorld() ; // Will log "15" logmessage( CommandSimple( 5, 10 ) ); // Will log "concat" logmessage( CommandSimple( "con","cat" ) ) ; newscene( null, false ) ; var oSphere = ActiveSceneRoot.AddGeometry("Sphere", "NurbsSurface") ; //Will log: //INFO : "Name of the input object sphere" //INFO : "grid" logmessage( CommandSimpleObjectArg( oSphere ) ) ; //Softimage can also turn an string to an object: //INFO : "Name of the input object grid" //INFO : "grid1" logmessage( CommandSimpleObjectArg( "grid" ) ) ; } |
// JScript Custom Command overview - v1.5 Approach // // This example relies on a script on disk so you need to // follow an important step first before running this example: // // SAVE the following commented out code as // %XSI_USERHOME%\Data\Scripts\commandexample.js // // Once you have saved the file you can run the script /* // BEGINNING OF CODE TO SAVE IN FILE // Implementation of CommandHelloWorld // The name of this function matches the string we provided as cmd.Handler function HelloWorld() { LogMessage( "Hello World" ) ; } function Simple( in_a, in_b ) { return in_a + in_b ; } function SimpleObjectArg( in_obj ) { logmessage( "Name of the input object " + in_obj.Name ) ; // return a different object return ActiveSceneRoot.AddGeometry("Grid", "MeshSurface") ; } // END OF CODE TO SAVE IN FILE */ InstallCommands(); DemoCommands() ; // Comment out this line if you want to experiment with the // commands created in this example CleanupCommands(); function InstallCommands() { // Remove any existing copies of the demo commands CleanupCommands() ; // each command needs to be defined. // (Softimage will not forget this information // until they are removed with a call to CleanupCommands() ; var fileNameWithPath = Application.InstallationPath( siUserPath ) + "/Data/Scripts/commandexample.js" // // Define Command #1 : CommandHelloWorld // var cmd = Application.CreateCommand( "CommandHelloWorld" ) cmd.ScriptingName = "CommandHelloWorld" ; cmd.Language = "JScript" ; cmd.ReturnValue = false ; cmd.Handler = "HelloWorld" ; cmd.FileName = fileNameWithPath; Application.AddCommand( cmd ) ; // // Define Command #2 : CommandSimple // cmd = Application.CreateCommand( "CommandSimple" ) cmd.ScriptingName = "CommandSimple" ; cmd.Language = "JScript" ; cmd.ReturnValue = true ; cmd.Handler = "Simple" ; cmd.FileName = fileNameWithPath; // You must mention the arguments you want. // The name is not important but must be unique cmd.Arguments.Add("a") cmd.Arguments.Add("b") Application.AddCommand( cmd ) // // Define Command #3 : CommandSimpleObjectArg // cmd = Application.CreateCommand( "CommandSimpleObjectArg" ) cmd.ScriptingName = "CommandSimpleObjectArg" ; cmd.Language = "JScript" ; cmd.ReturnValue = true ; cmd.Handler = "SimpleObjectArg" ; cmd.FileName = fileNameWithPath; cmd.Arguments.AddObjectArgument("obj"); Application.AddCommand( cmd ) } function DemoCommands() { // It is simple to execute a custom command, especially one // like this with no return value or arguments. // Will log "Hello World" CommandHelloWorld() ; // Will log "15" logmessage( CommandSimple( 5, 10 ) ); // Will log "concat" logmessage( CommandSimple( "con","cat" ) ) ; newscene( null, false ) ; var oSphere = ActiveSceneRoot.AddGeometry("Sphere", "NurbsSurface") ; //Will log: //INFO : "Name of the input object sphere" //INFO : "grid" logmessage( CommandSimpleObjectArg( oSphere ) ) ; //Softimage can also turn an string to an object: //INFO : "Name of the input object grid" //INFO : "grid1" logmessage( CommandSimpleObjectArg( "grid" ) ) ; } function CleanupCommands() { Application.RemoveCommand( "CommandHelloWorld" ) ; Application.RemoveCommand( "CommandSimple" ) ; Application.RemoveCommand( "CommandSimpleObjectArg" ) ; } |
' -------------------------------------------------------------- ' ' This VBScript example demonstrates how to find a built-in ' (or native) Softimage command using its scripting name. ' ' -------------------------------------------------------------- ' Loop through the Softimage command collection looking for a name match for each c in Application.Commands if c.ScriptingName = "FreezeObj" then ' At this point, you could either... ' ...get its name to use elsewhere ... sScpName = c.Name ' ...use it to create a Command object... set oCmd = c ' ...or perform whatever action you want on it, like demonstrating ' the difference between the Name and ScriptingName properties Application.LogMessage "FreezeObj info......." & vbLf _ & vbTab & "Name = " & c.Name & vbLf _ & vbTab & "ScriptingName = " & c.ScriptingName end if next ' With the new command pointer, we can access command information Application.LogMessage oCmd.Name & ": Belongs to the " & oCmd.Category & " category/menu." ' Now that we know the command's full name, we can access the command using ' the name as the key in the command collection set oCommand = Application.Commands( sScpName ) Application.LogMessage oCommand.Name & ": " & oCommand.Description ' -------------------------------------------------------------------------- ' Output of above script: 'INFO : "FreezeObj info....... ' Name = Freeze Operator Stack ' ScriptingName = FreezeObj" 'INFO : "Freeze Operator Stack: Belongs to the Edit category/menu." 'INFO : "Freeze Operator Stack: Freeze all the operators of the selected object(s)" |
/* -------------------------------------------------------------- Hello World example, based on v1.5 workflow for defining a command This JScript example creates and registers a custom command and then demonstrates how you can find it in the Softimage command collection using the Builtin property. ----------------------------------------------------------- */ // Start off with a clean slate Application.RemoveCommand("Howdy"); // Get the factory (installation) path and use it to build the filename & path var sFileName = InstallationPath( siUserPath ) + "\\Data\\Scripts\\HelloWorld.js"; // Create a standard hello world script file var fso = new ActiveXObject( "Scripting.FileSystemObject" ); var fHWFile = fso.CreateTextFile( sFileName ); fHWFile.WriteLine( "function SayHi()" ); fHWFile.WriteLine( "{" ); fHWFile.WriteLine( "\tApplication.LogMessage( \"Hello, World!\" );" ); fHWFile.WriteLine( "}" ); fHWFile.Close(); // Add it to the command map in Softimage var oCmd = Application.CreateCommand( "Howdy", siExportCategory ); oCmd.Description = "Display the traditional greeting"; oCmd.ScriptingName = "Howdy"; oCmd.Handler = "SayHi"; oCmd.FileName = sFileName; oCmd.Language = "JScript"; Application.AddCommand( oCmd ); // Run it just to make sure it's working oCmd.Execute(); // Now loop through the command collection and print the name and // scripting name of each custom command // (Tip: It is faster to use CommandCollection.Filter("Custom") to // find all custom commands) var eCmdList = new Enumerator( Application.Commands ); eCmdList.moveFirst(); var c; for (; !eCmdList.atEnd(); eCmdList.moveNext() ) { c = eCmdList.item(); if(!(c.Builtin)) { LogMessage( c.Name + "(" + c.ScriptingName + ") is a custom command." ); } } // Restore everything back to normal Application.RemoveCommand("Howdy"); fso.DeleteFile( sFileName, true ); // -------------------------------------------------------------- // Output of the above script is: // //INFO : "Hello, World!" //Howdy(); //Followed by a list of all custom commands installed, including: //INFO : "Howdy is a custom command." |