レガシープラグインの移行

 
 
 

Softimage はレガシー C++ コマンドも引き続きサポートしていますが、自己インストール カスタム コマンドに関連する機能が豊富になり、ワークフローが改良されたため、新しいメカニズムに移行することをお勧めします。 コードの実際の実装に関しては、それほど変更されていません。

カスタム コマンドを Softimage に移植する 1 つの方法として、SDK コマンド ウィザードを使用して新しいコマンドを作成し(詳細については、「カスタム コマンド ウィザード」を参照)、実際の実装をコピーして新しい dll に貼り付ける方法があります。 これは手動でも簡単にできます。 この例では、Foo というコマンドを使用します。

レガシー C++ コマンドを自己インストール プラグインに移植するには

  1. ソース ファイルをバックアップします。

  2. Script Editor で次のコードを実行し、Softimage で古いバージョンのコマンドが削除されたか確認します。

    // JScript
    Application.RemoveCommand( "Foo" );
    
  3. Windows では、関数の書き出しに .def ファイルを使用する代わりに、関数定義に XSIPLUGINCALLBACK マクロを追加します。

    XSIPLUGINCALLBACK CStatus XSILoadPlugin( PluginRegistrar& in_reg )
    
  4. .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;
    	}
    
    注:

    コールバックと自己インストール プラグインの詳細については、「自己インストール プラグイン」を参照してください。

  5. 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」クラスを参照してください。

    Foo_Init 関数の例を次に示します。

    	#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;
    	}
    
  6. Foo_Init 関数の記述が終了すると、古いインストール スクリプト コードを削除できます。

  7. ここで古い 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");
    		...
    	}
    
    注:

    io_retVal 引数はありません。その代わりに値が次のように戻ります。

    	CValue returnValue ;
    	//...set a value in returnValue ;
    	ctxt.PutAttribute( L"ReturnValue", returnValue );	
    
  8. コンパイル時 いくつかの新しい C++ API の include ステートメントを追加する必要があります。 たとえば以下のようになります。

    	#include <xsi_context.h>
    	#include <xsi_pluginregistrar.h>
    	#include <xsi_argument.h>
    	#include <xsi_command.h>
    
  9. dll が正しいパスにあるかどうかを確認してください(たとえば、ワークグループの「¥Application¥Plugins」ディレクトリ)。 プラグイン マネージャを使って Softimage を再起動せずに dll をロード/リロードできます(詳細については、「プラグイン マネージャを使って作業する」を参照)。

  10. Script Editor でコマンドを呼び出し、テストして終了です。

複数のコマンド

先行プロシージャは、.dll または .so の 1 つのコマンドのケースのみを扱います。 ただし、自己インストール プラグイン dll に複数のコマンドを実装することは簡単です。 XSILoadPlugin 実装にこれらを登録し、Init および Execute 関数をそれぞれ追加します。

コマンド ウィザードを使用して、コマンドをプラグインに追加できます。 Script Editor で右クリックし、[ツール](Tools)[コマンドの追加](Add Command)を選択します。