どのように AEnewNonNumericMulti.mel をカスタマイズすればボタンを無効化できますか?

以下のように AEnewNonNumericMulti.mel をカスタマイズして「Add New Item」などのボタンを無効化することができます。

方法 1:

runTime/scripts/AETemplates AEnewNonNumericMulti.mel を変更して $nodeName のタイプを確認します。たとえば、該当するノードが「fooType」のときはフィールドを無効にする場合、以下の 2 つの文のうち 1 つを使用します。

int $showField = nodeType( $nodeName ) != "fooType";
int $showField = !`objectType -isa "fooType" $nodeName`;

フラグ「-m $showField」を適切な UI コントロールに追加してフィールドの表示、非表示を切り替えることにより、各フィールドを管理された状態に設定します(ボタン、テキスト、rowLayout など)。AEreplaceNonNumericMulti でも同じようにし、そのテンプレートを使用して新しいノードをロードしたときに同じフィールドの有効無効を切り替える必要があります。

方法 2:

  1. AEnewNonNumericMulti.meloriginalAEnewNonNumericMulti.mel にコピーします。すべての関数のメタ構文変数名を originalFoo に変更します。
  2. 独自バージョンの AEnewNonNumericMulti.mel を作成して myAEnewNonNumericMulti.mel という名前を付けます。すべての関数のメタ構文変数名を myFoo に変更します。
  3. オリジナルの AEnewNonNumericMulti.mel を変更し、ノード タイプ(AEremoveMultiElement のような指定したプラグのノード タイプ)に応じて各関数が originalFoo または myFoo をコールするようにします。
  4. ここでも、AEreplaceNonNumericMulti と同じようにし、テンプレートを使用して新しいノードのロードを処理します。
危険:

プロシージャの実行中(AEnewNonNumericMulti へのコールがトリガされた場合など)は、プロシージャの定義が変更されるようなプロシージャのスクリプトをソースにしないようにしてください。エラーが生じます。

ヒント:

finalGatherMergeFileUtils.mel などスクリプトによっては明示的に AEnewNonNumericMulti.mel をソースにし、容易にユーザ独自のバージョンをソースにして AEnewNonNumericMulti の定義をオーバーライドできないようにしてください。プロシージャがどこで定義されているかを確認するには、whatIs を使用します。

たとえば、独自のバージョンの AEnewNonNumericMulti.mel ソースにしている場合、以下を入力します。

whatIs “AEnewNonNumericMulti”;

Maya はたとえば // 結果: Mel プロシージャが <somePath>/myAEnewNonNumericMulti.mel // で見つかりました(// Result: Mel procedure found in <somePath>/myAEnewNonNumericMulti.mel //)という行を返します。

ただし、レンダー設定(Render Settings) ウィンドウを開いている場合に間接ライティング(Indirect Lighting)タブを選択すると、オリジナルの AEnewNonNumericMulti.mel ファイルがソースになってプロシージャの定義が変更されます。ここで

whatIs “AEnewNonNumericMulti”; と入力すると、

Maya はたとえば // 結果: Mel プロシージャが <somePath>/runTime/scripts/AETemplates/AEnewNonNumericMulti.mel で見つかりました(//// Result: Mel procedure found in <somePath>/runTime/scripts/AETemplates/AEnewNonNumericMulti.mel //)という行を返します。

後者の場合、プロシージャがユーザ独自のバージョンではなく既定のスクリプト ファイルをソースとしていることを確認します。