カスタム オペレータ ウィザード

 
 
 

SDK オペレータ ウィザードを使用して、カスタム オペレータを含む自己インストール プラグインのコードを作成することができます。 このウィザードでは、プラグインとオペレータのスケルトン コードを作成するだけでなく、オペレータを適用するためのコマンドを追加する場合に必要なコードも作成できます。

注:

SDK オペレータ ウィザードでは、正しく接続できるオペレータを確立するのに十分なコードだけでなく、オペレータを適用するコマンドまで作成できます。ただし、シーンの変更を計算するコードはユーザが作成する必要があります。 このウィザードでは、オペレータのアルゴリズムが実装される場所である Update コールバックの基本的なシェル以上のものは生成しません。

重要:

ウィザードを使用する場合、ウィザードでコードの再生成を指定すると、手動でコードに加えた変更はすべて上書きされてしまいます。このため、[オペレータの生成](Generate Operator)をクリックする前に、コード記述開始の準備が完全に整っていることを確認することをお勧めします。

SDK オペレータ ウィザードを使用してカスタム オペレータを作成するには

  1. [ファイル](File)[プラグイン](Plug-ins)をクリックして、[プラグインマネージャ]を開きます。

    [ツール開発環境]レイアウトで[プラグイン](Plug-ins)タブをクリックすると、[プラグインマネージャ]ビューに切り替えることができます。

  2. 次のいずれかの操作を実行します。

    • ユーザ ロケーションでオペレータを作成するには、[ファイル](File)[新規作成](New)[オペレータ](Operator)をクリックします。

    • 別の場所(たとえば、Add-on ディレクトリ)でオペレータを作成するには、プラグイン ツリーで場所を展開し、[プラグイン](Plugins)フォルダを右クリックして、[新規作成](New)[オペレータ](Operator)をクリックします。

    オペレータ ウィザードが表示されます。

  3. [オペレータ名称](Operator Name)ボックスに、オペレータの名前を入力します。

    オペレータ名の先頭文字には英字を使用します。 以降に続く文字には、英字、数字、アンダースコア(_)を使用できます。

    スペースは、ウィザードによって自動的にアンダースコアに置き換えられます。

  4. デフォルトでは、プラグイン名はオペレータ名に基づいて付けられます。 プラグイン名を変更する場合は、[プラグイン名](Plug-in Name)ボックスに別の名前を入力します。

    後からオペレータ名を変更すると、ウィザードはデフォルトで作成される名前でプラグイン名を上書きします。

  5. [言語](Language)リストで、生成する言語をクリックします。

  6. [接続](Connections)タブをクリックし、出力接続ポートと入力接続ポートを指定します。

    ウィザードを使用すると、簡単に UI を介して接続を設定してから、コードの生成後に必要に応じて接続を修正することができます。 たとえば、他の 2 つのウェイト マップをブレンドしてウェイト マップ ジェネレータ オペレータを作成したい場合は、以下のように操作します。

    • 出力としてウェイト マップ ノードを選択します。

    • 入力としてブレンドされる 2 つのウェイト マップを選択します。 また、Update 関数で入力ポートに使用する変数 [Name] を指定することもできます。

      ウィザードによって、以下のようなコードが生成されます。 [接続](Connection)タブでセットアップするこれらの接続は、実際に、オペレータを適用するコマンドのコールバックと、オペレータの Update コールバックに表示されます。

      function ApplyMyWtMapOp_Execute(  )
      {
      
      	// ...
      	var newOp = XSIFactory.CreateObject("MyWtMapOp");
      	newOp.AddOutputPort("torus.polymsh.cls.Point.Weight_Map");
      	newOp.AddInputPort("torus.polymsh.cls.Point.Weight_Map1");
      	newOp.AddInputPort("torus.polymsh.cls.Point.Weight_Map2");
      	newOp.Connect();
      	return newOp;
      }
      
      function MyWtMapOp_Update( ctxt )
      {
      	var inWM1 = ctxt.GetInputValue(0);
      	var inWM2 = ctxt.GetInputValue(1);
      
      	// ...
      	output = ctxt.OutputTarget;
      	return true;
      }
      
    • オペレータを他のコンテキストでも再使用できるように、ポート接続を汎用的にすることをお勧めします。 たとえば、選択されているオブジェクト、または選択セッションを開始するオブジェクトに応じて、接続の確立を試みることができます。

      function ApplyMyOp_Execute(  )
      {
      	// ...
      	var newOp = XSIFactory.CreateObject("MyOp");
      
      	// Launch a picking session to get the connections
      	var btn, outWMap;
      	var collWMaps = new ActiveXObject("XSI.Collection");
      	do {
      		var rtn = PickObject( "Pick the weight map to write to", "Pick the weight maps to blend" );
      		btn = rtn.Value("ButtonPressed");
      		switch (btn) {
      			case 1 :
      				outWMap = rtn.Value("PickedElement");
      				break;
      			case 2 :
      				collWMaps.Add( rtn.Value("PickedElement") );
      				break;
      			default :
      		}
      	} while (btn)
      	
      	// Extract the input weight maps from the XSICollection
      	var inWMap1 = collWMaps(0);
      	var inWMap2 = collWMaps(1);
      	
      	// Test what we was picked & if it's ok hook up the ports. 
      	if ( 
      			outWMap.IsClassOf(siClusterPropertyID) && 
      			inWMap1.IsClassOf(siClusterPropertyID) && 
      			inWMap2.IsClassOf(siClusterPropertyID) ) 
      	{
      	} else {
      		Application.LogMessage( "Could not connect all ports (one or more specified "
      			+ "objects were invalid connections for this operator). Please try again." );
      		return false;
      	}
      	
      	newOp.AddOutputPort(outWMap.Kinematics.Global);
      	newOp.AddInputPort(inWMap1.Kinematics.Global);
      	newOp.AddInputPort(inWMap2.Kinematics.Global);
      	newOp.Connect();
      	return newOp;
      }
      
      ヒント:

      ウィザードによって生成されたコードを真にダイナミック オペレータに変換する例は、「ウィザードを使用してダイナミック オペレータを作成する」を参照してください。

  7. [コード](Code) タブをクリックします。 ここで、ウィザードによって生成されるコールバックを制御できます。たとえば、オペレータを適用するためのコマンドを定義するコールバックや、インスタンスごとのユーザ データを保存およびクリアするコールバックなどです。

  8. オペレータのプロパティページにパラメータやボタンを追加する場合は、[パラメータ追加]タブの[項目の定義](Define Item)グループにあるオプションを使用して各パラメータを定義してから、ページ下部にある[項目追加](AddItem)をクリックすると、これらのオプションで定義されたパラメータをオペレータのプロパティ ページに追加することができます。

    ヒント:

    パラメータを削除するには、行のハンドル(左端のグレーの列)をクリックしてから、[選択の削除](Delete Selected)をクリックします。

  9. パラメータを定義したら、 [レイアウト(オプション)](Layout (Optional)) タブをクリックしてプロパティページのレイアウトを調整します。 次に、ウィザードで使用できるカスタマイズ機能の一部を示します。

    • プロパティ ページにパラメータが表示されないようにする。

    • プロパティ ページのタブにパラメータを割り当てる。

    • プロパティ ページのグループにパラメータを割り当てる。

    • プロパティ ページの行にパラメータを割り当てる。

    • プロパティ ページでのパラメータの表示順序を調整する。

    注:

    ウィザードを使用すると、オペレータのプロパティページのレイアウトをカスタマイズできますが、DefineLayout を変更することによって、以下のような操作も可能になります。

    • ドロップ ダウン リストの作成

    • アニメーション アイコンの非表示

    • コントロールのサイズの変更

    • 特別なウィジットの作成(ファイル ブラウザなど)

    • ロジック ルーチンやイベント ルーチンなど

    追加およびカスタマイズできるコントロールの種類の詳細については、「ユーザー操作」を参照してください。

  10. すべての接続、コード、パラメータなどの設定が完了したら、[オペレータの生成](Generate Operator)をクリックしてカスタム オペレータを生成します。

    作成されたプラグインは自動的にロードされて実行され、コードは Script Editor にロードされます。

    重要:

    ウィザードでコードの再生成を指定すると、手動でコードに加えた変更はすべて上書きされてしまいます。このため、[オペレータの生成](Generate Operator)をクリックする前に、コード記述開始の準備が完全に整っていることを確認することをお勧めします。

注:

  • 既存のプラグインでオペレータのデバッグをオンにすることができます。 Text Editor または Script Editor でプラグインを開き、編集ペインを右クリックします。続けて、[ツール](Tools)をポイントしてから[オペレータのデバッギングを有効](Enable Operator Debugging)をクリックします。 追加のオペレータ情報が履歴に記録されます。

  • 頻繁に作成するオペレータ タイプのウィザード プリセットを保存することができます。

  • ウィザードは [SDK_Wizards] という名前のモデルを作成し、そのモデル下に、作成した各オペレータのカスタム プロパティを保存します。 対応するカスタム プロパティをダブルクリックすると、オペレータのウィザードを開くことができます。

プラグイン情報

[プラグイン情報](Plug-in Info)タブでは、XSILoadPlugin 関数を作成するために必要な情報を入力します。XSILoadPlugin 関数は、オペレータやコマンドなどのプラグイン項目を Softimage に登録します。

オペレータ名称

オペレータの名前を指定します。 コマンド名の先頭文字には英字を使用します。 以降に続く文字には、英字、数字、アンダースコア(_)を使用できます。

オペレータ名は、作成されたコールバック関数に名前を付けるためにも使用されます。 初回のコード生成後にオペレータ名を変更した場合は、生成された XSILoadPlugin 関数で、PluginRegistrar.RegisterOperator または PluginRegistrar::RegisterOperator への呼び出しを編集する必要があります。オペレータ名(PluginRegistrar.RegisterOperator または PluginRegistrar::RegisterOperator への最初の引数)を変更した場合は、オペレータ コールバック関数(Update および Init など)の名前を変更する必要があります。

作成者

カスタム オペレータの作成者を識別します(作成者の氏名や組織名などを入力します)。 プラグイン マネージャでは、この情報をプラグインごとに表示します。

言語

作成するコードのタイプ(C++、C#、JScript、VBScript、Python)を指定します。

出力ディレクトリ

作成したファイルの格納場所を指定します。

接続

[接続](Connections)タブでは、オペレータの入力接続ポートと出力接続ポートを定義できます。

注:

オブジェクト レベルで接続を指定することはできません。以下のような特定のデータに接続する必要があります。

  • プリミティブ ノード

  • パラメータ ノード

  • プロパティ ノード

  • クラスタ ノード

  • グローバル キネマティクス

  • ローカル キネマティクス

出力

テキスト ボックスに名前を入力するか、ボックスの横にある[ピック](Pick)をクリックして UI から選択できます。 デフォーマ オペレータを記述している場合は、入力と出力に同じ接続ノードを使用する必要があります。 [入力/出力接続](Input/Output connection)オプションを選択すると、出力定義に基づいて入力項目が自動的に作成されます。

入力として定義できるものに関しては、いくつかの制限があります。たとえば、プリミティブ、パラメータ、プロパティ、クラスタ、グローバルまたはローカル キネマティクスなどの特定のデータを指定する必要があります。 この制限によって、[入力/出力接続](Input/Output connection)オプションを使用する場合、出力を同じノードにする必要があります。 オペレータがデフォーマでない場合は、これらの特定のデータ型のいずれかを自由に指定できます。

入力

入力接続を指定するには、3 つの方法があります。

  • [ピック](Pick)をクリックして UI からノードを選択する方法

  • [選択](Selection)をクリックして、現在選択されているノードを使用する方法

  • [マニュアル](Manual)をクリックして、接続ターゲットの完全な名前を入力するテキスト ボックスを開く方法

ヒント:

[入力](Inputs)グリッドには、接続先のノードのフル パスと、接続の[名前](Name)(カスタム)を指定する場所が表示されます。 ここで指定した名前は、生成される Update 関数で、inPrim、inClusterProp、inParentPos などのように意味のわかる変数名として使用されます。名前をブランクのままにすると、変数名として Input0、Input1 などが使用されます。

コード

[コード](Code)タブでは、非常に特別なケースについて、ウィザードがどのようなコードを生成するかを指定できます。

常に実行

DefineLayout コールバックで CustomOperator.AlwaysEvaluate または CustomOperator::PutAlwaysEvaluate プロパティを true または false のどちらに設定するかを指定します。

オペレータを適用するコマンドの生成

オペレータをインスタンス化し、接続するコマンドを自動的に作成するかどうかを指定します。 このオプションが選択されている場合は、 [コード](Code) タブで指定されている情報に基づいて Init コールバック関数、および Execute コールバック関数が自動的に生成されます。

Initコールバックの生成

Init コールバックを生成するかどうかを指定します。このコールバック内のコードは、最初は情報メッセージを記録するだけですが、このコードを使用してインスタンス データを保存することもよくあります。

Term コールバックの生成

Term コールバックを生成するかどうかを指定します。このコールバック内のコードは、最初は情報メッセージを記録するだけですが、このコードを使用してクリーン アップすることもよくあります。

パラメータ追加

このセクションでは、オペレータのカスタム パラメータを定義できます。 これらの設定で、コードの生成方法と生成するコードをウィザードに指定します。 ここから、さらにコードをカスタマイズし、必要に応じて機能を追加できます。 これらの設定は、基本的には、生成されたコードが XSIFactory.CreateParamDef または Factory::CreateParamDef メソッドを呼び出す方法に対応します。

パラメータタイプ

パラメータのデータ型(XSIFactory.CreateParamDef または Factory::CreateParamDef メソッドの Type 引数)を指定します。これらの型の大部分は、実際のデータ型(整数、テキスト、ブールなど)に対応しています。ただし、[ボタン](Button)オプションは、単純にボタンを追加するだけです(パラメータ タイプではありません)。

選択する値に応じて、以降の設定の一部を使用できない場合があります。 たとえば、数値のデータ型を持つパラメータのみが、値の範囲を設定することができます(最小、最大など)。 ボタンについては、[名前/ラベル]設定と[コールバック]設定のみを使用できます。

名前/ラベル

パラメータの名前を指定します(XSIFactory.CreateParamDef または Factory::CreateParamDef メソッドの ScriptName 引数)。これは、デフォルトでプロパティ ページに表示されるラベルでもあります。ただし、別のラベルを使用したい場合は、コードを手動で変更できます(CreateParamDef のName 引数で、わかりやすい文字列を指定します)。

読取専用

ユーザがパラメータに書き込みできるかどうかを指定します。 これは、Capabilities 引数の siReadOnly 値(XSIFactory.CreateParamDef または Factory::CreateParamDef メソッド)に対応します。

アニメート可能

パラメータがアニメート可能かどうかを指定します。 これは、siCapabilities の siAnimatable 値(XSIFactory.CreateParamDef または Factory::CreateParamDef メソッドの Capabilities 引数)に対応します。

コールバック

ウィザードが、パラメータまたはボタンのイベント コールバック関数を生成する必要があるかどうかを指定します。 コールバックのタイプは、パラメータのタイプ(または、ボタンであるかどうか)によって異なります。 たとえば、C# または C++ 言語で実装されたオペレータの場合、全パラメータに対してウィザードにより OnClicked コールバックが生成されます。スクリプト言語で実装されたオペレータの場合は、パラメータには OnChanged コールバック、ボタンには OnClicked コールバックが生成されます。

デフォルト

パラメータに使用する既定値を指定します(XSIFactory.CreateParamDef または Factory::CreateParamDef メソッドの DefaultValue 引数)。この設定は、テキスト(文字列)型ではテキスト ボックス、ブール型ではチェックボックス、数値型ではスライダ、カラー型ではカラー ボックスとして表示されます。 F カーブ、グリッド コントロール、ボタンではこの設定を使用できません。

Min

パラメータの有効な値の範囲の下限を指定します(XSIFactory.CreateParamDef または Factory::CreateParamDef メソッドの Min 引数)。この設定は、数値型のパラメータでのみ使用できます。

Max

パラメータの有効な値の範囲の上限を指定します(XSIFactory.CreateParamDef または Factory::CreateParamDef メソッドの Max 引数)。この設定は、数値型のパラメータでのみ使用できます。

UI 範囲

数値スライダの表示可能範囲を定義するための[UI 最小値]/[UI 最大値]コントロール設定のオン/オフ状態を切り替えます。 このオプションは、数値型のパラメータでのみ使用できます。

UI 最小値

プロパティ ページが表示されたときにパラメータのスライダに表示する値の範囲の下限を指定します(XSIFactory.CreateParamDef または Factory::CreateParamDef メソッドの SuggestedMin 引数)。この設定は、数値型のパラメータでのみ使用できます。

UI 最大値

プロパティ ページが表示されたときにパラメータのスライダに表示する値の範囲の上限を指定します(XSIFactory.CreateParamDef または Factory::CreateParamDef メソッドの SuggestedMax 引数)。この設定は、数値型のパラメータでのみ使用できます。

項目の追加

[項目の定義](Define Item)エリアの設定に基づいて、[パラメータ](Parameters)テーブルにパラメータを追加できます。

選択の削除

[パラメータ](Parameters)テーブルからパラメータを削除できます。 まず、行のハンドル(左端のグレーの列)をクリックして削除するパラメータを含む行を選択してから、[選択の削除](Delete Selected)をクリックします。

レイアウト(オプション)

このセクションでは、オペレータのプロパティ ページにパラメータがどのように表示されるかを調整します。 PPGLayout または PPGLayout オブジェクトの機能の多くはここで提供されます。

一般的なワークフローは、以下のとおりです。

  • 表示するパラメータを [パラメータ] ボックスから追加する

  • [レイアウト](Layout) ボタンコントロールを使用して、表示順序を調整する

  • [グループ化](Groupings) からレイアウトコントロール用の特別な括弧(タブ、グループ、列など)を追加する

  • これらのコントロール用の括弧の中や外にパラメータを移動することによって、パラメータを割り当てる

レイアウト

このボックスは、オペレータのプロパティ ページに表示されるパラメータ セットを表します。 このリストで(そして、最終的にはプロパティ ページで)パラメータが並べられる順番は、このリストボックスの下にある[上へ](Up)および[下へ](Down)ボタンを使用して制御できます。

[レイアウト]ボックスでは、 [グループ化](Groupings) をラベル付きの括弧(ブラケット)で区切られたブロックとして表します。この括弧内にパラメータが表示されます。 これらのブロック内に表示されるパラメータは、そのコントロールに割り当てられるものとみなされます。 たとえば、以下のような[レイアウト]リストがあるとします。Param1Param2Wavy グループ内にあり、Param3Thick グループ内にあります。

[削除](Remove)ボタンを使用すると、グループ化コントロールまたはパラメータをリストから削除できます。

[レイアウト]リストからパラメータを削除するには

  1. [レイアウト]リストで、削除するパラメータをクリックします。

  2. [削除](Remove)をクリックします。 [レイアウト]リストからパラメータが消えます(ただし、[パラメータ]リストには残っています)。

[レイアウト]リストからグループ化コントロールを削除するには

  1. 削除するコントロールの括弧のどちらかをクリックします。

  2. [削除](Remove)をクリックします。 [レイアウト]リストから、グループ化コントロール用の括弧が消えますが、パラメータはそのままです。 パラメータは、次に高いレベルにあるコントロールにネストするようになります。

    たとえば、パラメータがタブの行の内部でネストしている場合に、行を削除すると、パラメータはタブ内に直接表示されるようになります。

パラメータ

[パラメータ]リストには、そのオペレータに定義されているすべてのパラメータが表示されます。 デフォルトでは、 [レイアウト](Layout) ボックスにパラメータを表示してそのパラメータをレイアウトに表示することを明示的に宣言するまで、すべてがプロパティ ページに表示されます。 ただし、[レイアウト]ボックスに 1 つでもパラメータが表示されている場合、[レイアウト]ボックスのパラメータのみがプロパティ ページに表示されます。

[レイアウト]リストにパラメータを追加するには

  1. [パラメータ]リストでパラメータの名前をクリックします。

  2. [パラメータ]リストの下にある[追加](Add)をクリックします。

    [レイアウト]リストにパラメータを追加しても、[パラメータ]リストから削除されることはありません。

ウィザードは、レイアウト リスト内のパラメータごとに PPGLayout.AddItem または PPGLayout::AddItem 呼び出しを DefineLayout コールバックに生成します。

グループ化

[グループ化]セクションでは、タブ、グループ、行といった特別なコントロールをプロパティ ページに追加することができます。 タブやグループを識別できるように、ラベルを[名前](Name)テキスト ボックスで指定します。 続けて、コントロールのタイプに応じたボタン([タブの追加](AddTab)、[グループの追加](AddGroup)、[列の追加](AddRow))をクリックすると、[レイアウト]ボックスにコントロールの括弧が表示されます。

Tab "Wavy" {
	Param1
	Param2
}
Tab "Thick" {
	Param3
}