Softimage はレガシー C++ コマンドも引き続きサポートしていますが、自己インストール カスタム コマンドに関連する機能が豊富になり、ワークフローが改良されたため、新しいメカニズムに移行することをお勧めします。 コードの実際の実装に関しては、それほど変更されていません。
カスタム コマンドを Softimage に移植する方法の 1 つとして、SDK コマンド ウィザード(詳細については、「カスタム コマンド ウィザード」を参照)を使用して新しいコマンドを作成し、実装をコピーして新しい dll に貼り付ける方法があります。これは手動でも簡単にできます。 この例では、Foo というコマンドを使用します。
Script Editor で次のコードを実行し、Softimage で古いバージョンのコマンドが削除されたか確認します。
// JScript Application.RemoveCommand( "Foo" );
Windows では、関数の書き出しに .def ファイルを使用する代わりに、関数定義に XSIPLUGINCALLBACK マクロを追加します。
XSIPLUGINCALLBACK CStatus XSILoadPlugin( PluginRegistrar& in_reg )
.cpp ファイルに類似した XSILoadPlugin コールバック関数を追加します。
#ifdef unix extern "C" #endif XSIPLUGINCALLBACK CStatus XSILoadPlugin( PluginRegistrar& in_reg ) { in_reg.PutAuthor(L"My Name"); in_reg.PutName(L"foo Plug-in"); in_reg.PutVersion(1,0); in_reg.RegisterCommand(L"Foo",L"Foo"); return CStatus::OK; }
コールバックと自己インストール プラグインの詳細については、「自己インストール プラグイン」を参照してください。
Foo_Init という別のコールバック関数を追加します。 この関数は、次のように古いインストール スクリプトを置換します。
'OBSOLETE: SUB InstallFooDemo( dllDir, ext ) Module="Foo" filename = dllDir & "/" & Module & ext Application.RemoveCommand "Foo" SET oCmd = Application.CreateCommand("Foo",siNoCategory) oCmd.ScriptingName = "Foo" oCmd.FileName = filename oCmd.Language = "CPP" oCmd.arguments.add "Arg0", siArgumentInput oCmd.arguments.addObjectArgument "Arg1" ' Add the new command Application.AddCommand oCmd END SUB
新しい Foo_Init 関数は、引数とコマンドに対するフラグを定義する場所に置きます。 コマンドを定義する C++ API は、インストール スクリプトで使用されるオブジェクト モデル API に似ています。このためコードは簡単に移植できます。 詳細については、Argument および Command クラスを参照してください。
#ifdef unix extern "C" #endif XSIPLUGINCALLBACK CStatus Foo_Init( CRef& in_ctxt ) { Context ctxt( in_ctxt ); Command oCmd; oCmd = ctxt.GetSource(); oCmd.PutDescription(L"Foo does important stuff"); oCmd.EnableReturnValue(true); ArgumentArray oArgs; oArgs = oCmd.GetArguments(); oArgs.Add(L"Arg0"); oArgs.AddObjectArgument(L"Arg1"); return CStatus::OK; }
ここで古い XSIOnCommandCPP コールバックを新しい Foo_Execute コールバック関数に置換する必要があります。 古いコードを次に示します。
#ifdef unix extern "C" #endif XSI::CStatus XSIOnCommandCPP ( const XSI::CString& in_strCmdName, // name of the command XSI::CValueArray& args, // array of arguments XSI::CValue& io_retVal // return value ) { ... }
#ifdef unix extern "C" #endif XSIPLUGINCALLBACK CStatus foo_Execute( CRef& in_ctxt ) { Context ctxt( in_ctxt ); CValueArray args = ctxt.GetAttribute(L"Arguments"); ... }
CValue returnValue ; //...set a value in returnValue ; ctxt.PutAttribute( L"ReturnValue", returnValue );
コンパイル時 いくつかの新しい C++ API の include ステートメントを追加する必要があります。 たとえば以下のようになります。
#include <xsi_context.h> #include <xsi_pluginregistrar.h> #include <xsi_argument.h> #include <xsi_command.h>
dll が正しいパスにあるかどうかを確認してください(たとえば、ワークグループの「¥Application¥Plugins」ディレクトリ)。 プラグイン マネージャを使用して、Softimage を再起動せずに dll をロードまたは再ロードできます(詳細については、「プラグイン マネージャを使用して作業する」を参照)。