SDK オペレータ ウィザードを使用して、カスタム オペレータを含む自己インストール プラグインのコードを作成することができます。 このウィザードでは、プラグインとオペレータのスケルトン コードを作成するだけでなく、オペレータを適用するためのコマンドを追加する場合に必要なコードも作成できます。
SDK オペレータ ウィザードでは、正しく接続できるオペレータを確立するのに十分なコードだけでなく、オペレータを適用するコマンドまで作成できます。ただし、シーンの変更を計算するコードはユーザが作成する必要があります。 このウィザードでは、オペレータのアルゴリズムが実装される場所である Update コールバックの基本的なシェル以上のものは生成しません。
SDK オペレータ ウィザードを使用してカスタム オペレータを作成するには
[ファイル](File)[プラグイン](Plug-ins)をクリックして、[プラグインマネージャ]を開きます。
[ツール開発環境]レイアウトで[プラグイン](Plug-ins)タブをクリックすると、[プラグインマネージャ]ビューに切り替えることができます。
[オペレータ名称](Operator Name)ボックスに、オペレータの名前を入力します。
デフォルトでは、プラグイン名はオペレータ名に基づいて付けられます。 プラグイン名を変更する場合は、[プラグイン名](Plug-in Name)ボックスに別の名前を入力します。
[接続]タブをクリックし、出力接続ポートと入力接続ポートを指定します。
ウィザードを使用すると、簡単に 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; }
ウィザードによって生成されたコードを真にダイナミック オペレータに変換する例は、「ウィザードを使用してダイナミック オペレータを作成する」を参照してください。
[コード](Code) タブをクリックします。 ここで、ウィザードによって生成されるコールバックを制御できます。たとえば、オペレータを適用するためのコマンドを定義するコールバックや、インスタンスごとのユーザ データを保存およびクリアするコールバックなどです。
オペレータのプロパティページにパラメータやボタンを追加する場合は、[パラメータ追加]タブの[項目の定義](Define Item)グループにあるオプションを使用して各パラメータを定義してから、ページ下部にある[項目追加](AddItem)をクリックすると、これらのオプションで定義されたパラメータをオペレータのプロパティ ページに追加することができます。
パラメータを定義したら、 [レイアウト(オプション)](Layout (Optional)) タブをクリックしてプロパティページのレイアウトを調整します。 次に、ウィザードで使用できるカスタマイズ機能の一部を示します。
ウィザードを使用すると、オペレータのプロパティページのレイアウトをカスタマイズできますが、DefineLayout を変更することによって、以下のような操作も可能になります。
追加およびカスタマイズできるコントロールの種類の詳細については、「ユーザー操作」を参照してください。
すべての接続、コード、パラメータなどの設定が完了したら、[オペレータの生成](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 など)の名前を変更する必要があります。
[接続](Connections)タブでは、オペレータの入力接続ポートと出力接続ポートを定義できます。
テキスト ボックスに名前を入力するか、ボックスの横にある[ピック](Pick)をクリックして UI から選択できます。 デフォーマ オペレータを記述している場合は、入力と出力に同じ接続ノードを使用する必要があります。 [入力/出力接続](Input/Output connection)オプションを選択すると、出力定義に基づいて入力項目が自動的に作成されます。
入力として定義できるものに関しては、いくつかの制限があります。たとえば、プリミティブ、パラメータ、プロパティ、クラスタ、グローバルまたはローカル キネマティクスなどの特定のデータを指定する必要があります。 この制限によって、[入力/出力接続](Input/Output connection)オプションを使用する場合、出力を同じノードにする必要があります。 オペレータがデフォーマでない場合は、これらの特定のデータ型のいずれかを自由に指定できます。
[入力](Inputs)グリッドには、接続先のノードのフル パスと、接続の[名前](Name)(カスタム)を指定する場所が表示されます。 ここで指定した名前は、生成される Update 関数で、inPrim、inClusterProp、inParentPos などのように意味のわかる変数名として使用されます。名前をブランクのままにすると、変数名として Input0、Input1 などが使用されます。
[コード](Code)タブでは、非常に特別なケースについて、ウィザードがどのようなコードを生成するかを指定できます。
DefineLayout コールバックで CustomOperator.AlwaysEvaluate または CustomOperator::PutAlwaysEvaluate プロパティを true または false のどちらに設定するかを指定します。
オペレータをインスタンス化し、接続するコマンドを自動的に作成するかどうかを指定します。 このオプションが選択されている場合は、 [コード](Code) タブで指定されている情報に基づいて Init コールバック関数、および Execute コールバック関数が自動的に生成されます。
Init コールバックを生成するかどうかを指定します。このコールバック内のコードは、最初は情報メッセージを記録するだけですが、このコードを使用してインスタンス データを保存することもよくあります。
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 カーブ、グリッド コントロール、ボタンではこの設定を使用できません。
パラメータの有効な値の範囲の下限を指定します(XSIFactory.CreateParamDef または Factory::CreateParamDef メソッドの Min 引数)。この設定は、数値型のパラメータでのみ使用できます。
パラメータの有効な値の範囲の上限を指定します(XSIFactory.CreateParamDef または Factory::CreateParamDef メソッドの Max 引数)。この設定は、数値型のパラメータでのみ使用できます。
プロパティ ページが表示されたときにパラメータのスライダに表示する値の範囲の下限を指定します(XSIFactory.CreateParamDef または Factory::CreateParamDef メソッドの SuggestedMin 引数)。この設定は、数値型のパラメータでのみ使用できます。
プロパティページが表示されたときにパラメータのスライダに表示する値の範囲の上限を指定します(XSIFactory.CreateParamDef または Factory::CreateParamDef メソッドの SuggestedMax 引数)。この設定は、数値型のパラメータでのみ使用できます。
このセクションでは、オペレータのプロパティ ページにパラメータがどのように表示されるかを調整します。 PPGLayout または PPGLayout オブジェクトの機能の多くはここで提供されます。
表示するパラメータを [パラメータ] ボックスから追加する
[レイアウト](Layout) ボタンコントロールを使用して、表示順序を調整する
[グループ化](Groupings) からレイアウトコントロール用の特別な括弧(タブ、グループ、列など)を追加する
このボックスは、オペレータのプロパティ ページに表示されるパラメータ セットを表します。 このリストで(そして、最終的にはプロパティ ページで)パラメータが並べられる順番は、このリストボックスの下にある[上へ](Up)および[下へ](Down)ボタンを使用して制御できます。
[レイアウト]ボックスでは、 [グループ化](Groupings) をラベル付きの括弧(ブラケット)で区切られたブロックとして表します。この括弧内にパラメータが表示されます。 これらのブロック内に表示されるパラメータは、そのコントロールに割り当てられるものとみなされます。 たとえば、以下のような[レイアウト]リストがあるとします。Param1 と Param2 は Wavy グループ内にあり、Param3 は Thick グループ内にあります。
[パラメータ]リストには、そのオペレータに定義されているすべてのパラメータが表示されます。 デフォルトでは、 [レイアウト](Layout) ボックスにパラメータを表示してそのパラメータをレイアウトに表示することを明示的に宣言するまで、すべてがプロパティ ページに表示されます。 ただし、[レイアウト]ボックスに 1 つでもパラメータが表示されている場合、[レイアウト]ボックスのパラメータのみがプロパティ ページに表示されます。
ウィザードは、レイアウト リスト内のパラメータごとに PPGLayout.AddItem または PPGLayout::AddItem 呼び出しを DefineLayout コールバックに生成します。