外部コマンドの実行

system コマンド

MAYA を使用しているときに、MAYA 以外の外部コマンドやユーティリティを実行したい場合があります。
そのような外部コマンドを MEL で実行する場合には system コマンドを使用します。

system コマンドの例

file テクスチャーの画像ファイルを、 画像処理ソフトを使って、 MAYA 上から開いて実行するスクリプトを作ってみましょう。
ここでは、画像処理ソフトとして Linux 上の gimp を利用します。

  1. 以下の MEL スクリプトを changeTexture1.mel という名前で作ります。
    global proc changeTexture1()
    {
    	string $name[] = `ls -sl -type "file"`;
    	string $filename = `getAttr ($name[0] + ".fileTextureName")`;
    	system ("gimp " + $filename + ">& /dev/null &");
    }
    
  2. 適当なオブジェクトを作っておき、2D Textures の file テクスチャーをオブジェクトのシェーダーにアサインしておきます。
    [NURBS の球] [lambert1 にアサインされた file テクスチャー]
  3. file テクスチャーに適当な画像ファイルを読み込みます。
    読み込む画像ファイルのフォーマットは iff 以外で SGI, TGA, BMP などの MAYA と gimp の両方で読み込むことのできるフォーマットにしておいてください。
    適当な画像ファイルを持っていない場合は、 以下のサンプル画像(SGIフォーマット)を、ダウンロードして使用してください。
    [サンプル画像] サンプル画像
    [サンプル画像が貼られた球] [画像を読み込んだ HyperShade の図]
  4. Script EditorFile → Source Script によって changeTexture1.mel を読み込みます。
  5. 上でアサインしてある file テクスチャーをセレクトしておきます。
    HyperShade 上などでセレクトしてください。
  6. Script Editor の下のウインドウから changeTexture1(); と打ち込んで実行します。
    すると gimp が実行されて file テクスチャーに読み込んである画像ファイルが表示されます。
    [gimp の図]
  7. gimp 上で画像ファイルに適当な変更を加えます。
    [変更後の gimp の図]
  8. 変更を加えた画像ファイルをセーブします。
    gimp で画像をセーブするにはメニューの File → 保存 を選ぶか、 Ctrl + s キーを押してください。
  9. アトリビュートエディターで file テクスチャーの Reload File Texture ボタンを押して変更した画像ファイルを再読み込みします。
    [アトリビュートエディター] [画像変更後の球] [画像変更後の HyperShade]

スクリプトの解説

global proc changeTexture1()
changeTexture1 という名前のプロシージャーの宣言です。
string $name[] = `ls -sl -type "file"`;
セレクトされているノードの中で、 file ノードの名前だけを配列 $name に代入します。
-sl
セレクトされているノードをリストアップします。
-type "file"
指定したタイプのノードのみをリストアップします。
この場合は、画像ファイルをテクスチャーにする file ノードのみをリストアップします。
タイプの種類は -showType フラグで調べることができます。
string $filename = `getAttr ($name[0] + ".fileTextureName")`;
ls コマンドによって得られた file ノードの fileTextureName アトリビュートの値を変数 $filename に代入します。
fileTextureName アトリビュートにはテクスチャーとして読み込まれている画像ファイル名が入っています。
system ("gimp " + $filename + ">& /dev/null &");
gimp によって画像ファイルを開きます。
文字列の連結によって gimp コマンド名と、画像ファイル名をひとつの文字列にして system コマンドによって実行しています。
たとえば、$filename に画像ファイル名として /home/ad000000/maya/projects/default/sourceimages/testpat.sgi が代入されていたとすると、 以下のように処理が進みます。
  1. $filename の中身が展開されます。
    system ("gimp " + "/home/ad000000/maya/projects/default/sourceimages/testpat.sgi" + ">& /dev/null &");
  2. 3 つの文字列が連結されます。
    system ("gimp /home/ad000000/maya/projects/default/sourceimages/testpat.sgi>& /dev/null &");
  3. system コマンドによって以下のコマンドが OS 上で実行されます。
    gimp /home/ad000000/maya/projects/default/sourceimages/testpat.sgi>& /dev/null &
なお、3 つ目の文字列 ">& /dev/null &" は gimp を実行しても MAYA の実行が停止しないようにする Linux 上の工夫です。

Tips (Windows で PhotoShop を実行)

Windows において、gimp の代わりに PhotoShop を使用して画像ファイルを表示するには changeTexture1.mel の
system ("gimp " + $filename + ">& /dev/null &");
の行を以下のコマンドに置き換えます。

	chdir "c:/Program files/Adobe/Photoshop 6.0"; // PhotoShop の実行ファイルがあるホルダーへ移動
	$filename = `substituteAllString $filename "/" "\\\\"`; // 画像ファイルのパス中の / を \ に書き換え
	system ("start photoshp " + $filename); // start コマンドによって MAYA の実行を中断しない

練習

注意

練習問題では、シェーダーに file テクスチャーがひとつだけアサインされているという前提でスクリプトを作っています。 もし、file テクスチャーが 2 つ以上あったり、ユーティリティーノードによって複雑なシェーダーが組まれている場合は、 スクリプトを作り直す必要があります。
また、iff など gimp などの画像処理ソフトが読み込めない画像フォーマットの場合も、 画像ファイルのフォーマットを変換する必要があります。

練習課題

参考


Prev | Next
Home | Contents
Mail