外部コマンドの実行
system コマンド
MAYA を使用しているときに、MAYA 以外の外部コマンドやユーティリティを実行したい場合があります。
そのような外部コマンドを MEL で実行する場合には system コマンドを使用します。
system コマンドの例
file テクスチャーの画像ファイルを、
画像処理ソフトを使って、
MAYA 上から開いて実行するスクリプトを作ってみましょう。
ここでは、画像処理ソフトとして Linux 上の gimp を利用します。
- 以下の MEL スクリプトを changeTexture1.mel という名前で作ります。
global proc changeTexture1()
{
string $name[] = `ls -sl -type "file"`;
string $filename = `getAttr ($name[0] + ".fileTextureName")`;
system ("gimp " + $filename + ">& /dev/null &");
}
- 適当なオブジェクトを作っておき、2D Textures の file テクスチャーをオブジェクトのシェーダーにアサインしておきます。
- file テクスチャーに適当な画像ファイルを読み込みます。
読み込む画像ファイルのフォーマットは iff 以外で SGI, TGA, BMP などの
MAYA と gimp の両方で読み込むことのできるフォーマットにしておいてください。
適当な画像ファイルを持っていない場合は、
以下のサンプル画像(SGIフォーマット)を、ダウンロードして使用してください。
サンプル画像
- の によって changeTexture1.mel を読み込みます。
- 上でアサインしてある file テクスチャーをセレクトしておきます。
HyperShade 上などでセレクトしてください。
- の下のウインドウから changeTexture1(); と打ち込んで実行します。
すると gimp が実行されて file テクスチャーに読み込んである画像ファイルが表示されます。
- gimp 上で画像ファイルに適当な変更を加えます。
- 変更を加えた画像ファイルをセーブします。
gimp で画像をセーブするにはメニューの を選ぶか、
Ctrl + s キーを押してください。
- アトリビュートエディターで file テクスチャーの Reload File Texture ボタンを押して変更した画像ファイルを再読み込みします。
スクリプトの解説
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 が代入されていたとすると、
以下のように処理が進みます。
- $filename の中身が展開されます。
system ("gimp " + "/home/ad000000/maya/projects/default/sourceimages/testpat.sgi" + ">& /dev/null &");
- 3 つの文字列が連結されます。
system ("gimp /home/ad000000/maya/projects/default/sourceimages/testpat.sgi>& /dev/null &");
- 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 の実行を中断しない
練習
- 使用例の changeTexture1.mel を参考にして、changeTexture2.mel を作り、
file ノードではなく、オブジェクトのトランスフォームノードをセレクトしておくと、
そのオブジェクトにアサインされている
file テクスチャーの画像ファイルが gimp によって開かれるようにしてください。
(使用例)
上の changeTexture1.mel の使用例において、
file ノードをセレクトする代わりに file テクスチャーの貼られているオブジェクトのトランスフォームノードをひとつだけセレクトします。
その後で、changeTexture2() を実行します。
他の使用方法は changeTexture1.mel と同じです。
(ヒント 1)
セレクトされているオブジェクトのうちから、
トランスフォームノードのみをリストアップするには、
以下のコマンドを使用します。
ls -sl -tr;
(ヒント 2)
オブジェクトにアサインされている
file ノードの名前を求めるためには以下の順序で実行してください。
(以下のコマンドの返り値はすべて、string の配列になります。
配列の 0 番目に求める名前が入っています。)
- オブジェクトのトランスフォームノードからオブジェクトのシェープノードを求めます。
listRelatives -s トランスフォームノードの名前;
- シェープノードから ShadingEngine を求めます。
listSets -type 1 -object シェープノードの名前;
- ShadingEngine からシェーダーを求ます。
listConnections (ShadingEngineの名前 + ".surfaceShader");
- シェーダーから file ノードを求ます。
listConnections (シェーダーの名前 + ".color");
- 使用例の changeTexture2.mel を参考にして、changeTexture3.mel を作り、
別々の画像ファイルをテクスチャーにしている複数のトランスフォームノードをセレクトしておくと、
それぞれのオブジェクトの file テクスチャーの画像ファイルが gimp によって開かれるようにしてください。
(使用例)
複数のトランスフォームノードをセレクトすることと、
changeTexture3() を実行すること、
および、Reload File Texture ボタンを画像ファイルごとに押すこと以外は changeTexture2.mel と同じです。
(注意)
changeTexture3.mel をテストするには、
もうひとつ適当なオブジェクトを作って、別の画像ファイルをテクスチャーにしてください。
適当な画像ファイルを持っていない場合は、
以下のサンプル画像(SGIフォーマット)を、ダウンロードして使用してください。
サンプル画像 2
別々の画像ファイルがテクスチャーになった 2 つの球
2 つの球をセレクトした後で、changeTexture3() を実行した画面
(ヒント)
複数の画像ファイルを gimp で開くには、
gimp コマンドの後にスペースで区切って画像ファイル名を並べます。
例えば、画像ファイル名が sample1.sgi と sample2.sgi ならば、
system コマンドで以下のように実行します。
system "gimp sample1.sgi sample2.sgi >& /dev/null";
注意
練習問題では、シェーダーに file テクスチャーがひとつだけアサインされているという前提でスクリプトを作っています。
もし、file テクスチャーが 2 つ以上あったり、ユーティリティーノードによって複雑なシェーダーが組まれている場合は、
スクリプトを作り直す必要があります。
また、iff など gimp などの画像処理ソフトが読み込めない画像フォーマットの場合も、
画像ファイルのフォーマットを変換する必要があります。
練習課題
参考
Prev
| Next
Home | Contents
Mail