日本でハリウッドVFXを制作! 「経産省アイディアボックス」 結果:  
●まとめエントリはこちら ●FAQ ●お問い合わせは左のメールフォームから

2009年12月18日金曜日

プロシージャの保存場所

(2009年12月18日改訂:Maya.envの具体的なステップの検証を追加。また一部の文章を修正しました。)


前回のエントリ、「「グローバル・プロシージャ」と「ローカルプロシージャ」の違い」に引き続きプロシージャ関連の話。


プロシージャはスクリプト・ファイルとして保存しておく。
慣例的にそうなっているといえるが、その理由を考えてみると、もうすこしその重要性がわかるのではないかと思う。


まず、自分で考えてみると、ひとつにはプロシージャをファイル毎にわけて保存しておけば整理がしやすいということは想像が付く。

一つのファイルを開けてデバッグや機能拡張/変更をしているときに、ひとつのプロシージャに集中できる。

これはソフトウエアの開発手法が進化してオブジェクト指向へと変わってきた経緯に見られる。
複雑な物を簡単に扱えるようにする工夫の一つだ。
プログラムの開発が、より複雑な物へ進化していく過程で、それは必然的に発生してきた流れだろう。

ITproにある「オブジェクト指向を正しく理解する」で「オブジェクト指向が登場した背景」にそのことが書かれている。
「以前のソフトウエア開発では,毎回ほとんどゼロからプログラムを作り直していました。
しかしそうした方法では,品質の高いソフトウエアを短期間で作ることは困難なため,既存の部品を再利用することが重要になってきました。

また,いったん作ったソフトウエアに修正を加えて長く使い続けるケースも増えてきました。
ソフトウエアを保守しやすくするには,個々の部品の独立性を高くして,全体の見通しを良くし,修正の影響範囲を局所化する必要があります。
こうしたニーズからオブジェクト指向が注目されるようになりました。」


このようにプログラム自体を部品化することは、既存の部品の再利用において非常に利便性が高いことがわかる。

そしてファイルとして分けて保存しているということは、その独立性を確固たる物とし、プログラマがそれを認識する際にも明確にわけて認識できる。


----------------------------------------
さて、プロシージャを独立したファイルとして保存するということはわかったが、ではそれをどこへ保存すべきか?

どこへ保存しても使えるべきなのだが、Mayaが自動的にそのファイルをプロシージャとして認識できるようにするには一手間必要となる。

どこへ保存してもMayaが自動的に見つけてくれるならいいのだが、それにはすべてのHDDをスキャンする必要があり、該当のファイルを見つけるには時間がかかりすぎて現実的ではない。

そのためには決まった場所へ保存しておくほうがよい。
そしてそれをMayaに指示して、その場所をいつも探すようにすれば簡単だ。


----------------------------------------
まず、プロシージャを任意のフォルダへ保存した場合どのようにそれをMayaに読み込むかを調べてみたい。

これはDigitalMatrixの「プロシージャの作り方と実行例 」にて説明されている。

テキストエディタで作成したファイルを「.mel」の拡張子にして保存する。

そして利用するときに、スクリプトエディターにて
1)File -->Source Scriptにて該当ファイルを読み込む。
どこに保存していようとこのステップでユーザーがそれを任意に指定できる。
2)プロシージャ名をコマンドとして実行できる。

以上はユーザーがファイルの保存場所をマニュアルで指定する方法。
これは、毎回ユーザーが指定する必要があり、手間がかかる。


----------------------------------------
ユーザーが何もしなくても、自動的にパスが認識されプロシージャをいつでもどこでも、コマンドとして実行できる方法は別にある。

それはDigitalMatrixの以下の項目で紹介されている。
スクリプトパスによる方法だ。

参照:「MEL スクリプト(プロシージャ)の自動読み込み (DigitalMatrix)」

オンラインヘルプには以下のように説明されている。
「Maya が必ずスクリプトを検索する、ユーザ ディレクトリがあります。
このディレクトリにスクリプトをインストールすると、Maya のスクリプトパスを変更せずに、Maya にスクリプトを見つけさせることができます。
このディレクトリのロケーションはシステムによって異なります。」


実はこの方法には三つ制限がある。
1)保存する場所は、あらかじめ指定された場所のみ。
2)スクリプトファイルがMayaの起動前にその場所へ保存されている必要がある。
3)「ファイル名.mel」のファイル名部分とプロシージャ名が一致している必要がある。

Mayaがすでに起動している状態でスクリプトファイルを追加、変更したときは、
「Source Script」で読み込む。もしくは、Mayaを再起動する必要がある。


まず保存先だが、これは
internalVar -usd
コマンドで調べることができる。



internalVar」コマンド:内部変数の値を返すコマンドでその変数の変更はできない。
-userScriptDir(-usd)」フラグ:ユーザー・スクリプト・ディレクトリへのパスを返します。

これを実行すると
// Result: C:/Documents and Settings/userName/My Documents/maya/8.5/scripts/ //

という風に値を返してくる(Windowsの場合)。


この「scripts」フォルダ内へ保存してやればMayaを起動するときに自動的にそのプロシージャが使えるようになる。

Mayaは起動時にこのパスを一度だけ、スキャンしキャッシュする。

そのため、新しくファイルを追加しても、再度スキャンしなくては自動的に読み込まれることはない。


----------------------------------------
このあたりのことを昨日のプロシージャでテストしてみる。
まず、
1)スクリプトファイルを作成
global proc createSphere()
{
polySphere;
}
という内容で「createSphere.mel」というスクリプトファイルを作成。


2)スクリプトファイルを以下のスクリプトパスへ保存。
C:/Documents and Settings/userName/My Documents/maya/8.5/scripts/

3)スクリプト・エディタから「createSphere」と入力後Enterキーを押してプロシージャを実行。
// Error: Cannot find procedure "createSphere". //
となる。

4)Mayaを再起動して再度同じ手順を実行(createSphereを実行)
今度はきちんとポリゴン・スフィアが作成された。


----------------------------------------
新しいスクリプト・ファイルを追加する度にMayaを再起動していては結構手間である。
実は、Mayaを起動したままで再度スクリプト・パスをスキャンするために「rehash」コマンド
がMayaには用意されている。


次に、それを試してみたい。
1)新しいスクリプト・ファイル「createNsphere.mel」を作成。
global proc createNsphere()
{sphere;
}

2)「createNsphere」と入力後Enterキーを押してプロシージャを実行。当然エラーがでる。
// Error: Cannot find procedure "createNsphere". //

3)rehashを実行

4)createNsphereを再度実行。
Nurbsスフィアが作成された。


----------------------------------------
ファイルの保存場所が、スクリプト・パスに固定されてしまうのであれば、
複数のMayaを使用するプロダクションの環境では、自社開発のプラグインを更新する度に各ローカルHDDへコピーする必要がでてくる。

これでは手間がかかるし、一部でアップデート忘れが発生したりする可能性もある。

それを未然に防ぐには、みなが共有できるフォルダにスクリプトを保存し、それをすべてのMayaが参照することが必要となる。

そのためにはスクリプトパスを自由に設定できることが望ましい。



先ほど、「internalVar -usd」コマンドによって表示された
C:/Documents and Settings/userName/My Documents/maya/8.5/scripts/
は、Maya が必ずスクリプトを検索する、ユーザ ディレクトリである。



このディレクトリは、Mayaが起動するときにある特殊な変数に代入されている。
その特殊な変数は「環境変数」と呼ばれる。

そしてスクリプトパスが保存される環境変数は「MAYA_SCRIPT_PATH」という名前である。

Mayaの環境変数の例が、DigitalMatrixの「Mayaの環境変数」に掲載されている。


さて、「環境変数」という言葉はマイコンピュータのプロパティーから「詳細設定」タブになる「環境変数」ボタンをクリックして表示される物がおなじみだ。
OSやいろいろなソフトに重要な情報がここにある。
(参照:「環境変数」についてIT用語辞典)


ちなみに現在の自分のマシンのMAYA_SCRIPT_PATHの環境変数を調べてみるには「getenv」コマンドを使用する。

getenv MAYA_SCRIPT_PATH;

自分のマシンで表示されたのは以下の通り。
// Result:
C:/Documents and Settings/userName/My Documents/maya/projects/default/mel;
C:/Documents and Settings/userName/My Documents/maya/8.5/scripts;
C:/Documents and Settings/userName/My Documents/maya/scripts;
C:/Documents and Settings/userName/My Documents/maya/8.5/presets;
C:/Documents and Settings/userName/My Documents/maya/8.5/prefs/shelves;
C:/Documents and Settings/userName/My Documents/maya/8.5/prefs/markingMenus;
C:/Documents and Settings/userName/My Documents/maya/8.5/prefs/scripts;
C:/Program Files/Autodesk/Maya8.5/scripts;
C:/Program Files/Autodesk/Maya8.5/scripts/startup;
C:/Program Files/Autodesk/Maya8.5/scripts/others;
C:/Program Files/Autodesk/Maya8.5/scripts/AETemplates;
C:/Program Files/Autodesk/Maya8.5/scripts/unsupported;
C:/Program Files/Autodesk/Maya8.5/scripts/paintEffects;
C:/Program Files/Autodesk/Maya8.5/scripts/fluidEffects;
C:/Program Files/Autodesk/Maya8.5/scripts/hair;
C:/Program Files/Autodesk/Maya8.5/scripts/cloth;
C:/Program Files/Autodesk/Maya8.5/scripts/live;
C:/Program Files/Autodesk/Maya8.5/scripts/fur;
C:/Program Files/Autodesk/MayaBonusTools8.5//scripts;
C:/Program Files/BlastCode1.5/scripts;
C:/Program Files/Havok/HavokMayaModules/8.5/scripts //

思った以上にいろいろなパスが環境変数に代入されている。
しかしながらこの環境変数のパスはどれ一つとしてマイコンピュータのプロパティーから表示できる「環境変数」には記述されていない。

環境変数によっては、異なる方法、異なる場所から読み込まれているのである。

環境変数はレジストリでも設定されるらしいので、上記のパスがレジストリに見つかるかと思いレジストリエディタを開いてみたが、どこにあるのか見つけることはできなかった。
なので、今回しらべたMAYA_SCRIPT_PATHの内容の出所は確認がとれなかった。

しかし
1)環境変数にパスが保存されていること。
2)マイコンピュータのプロパティーから表示できる「環境変数」以外にもそれらの値を設定する方法がある。
ということがわかれば良いと思う。

環境変数については以下のHPも参考になるだろう。
参照1:おしえてHOME`sくん「環境変数の表示について
参照2:環境変数の設定



----------------------------------------

ここでMAYA_SCRIPT_PATHに代入されていたパスであればどこでもスクリプトを保存できるのか? という疑問が出てきた。

これを試すために以下の手順を行った。

1)先ほど表示されていたパスの一つ
C:\Documents and Settings\userName\My Documents\maya\scripts
へ以下のプロシージャを書いた「pass.mel」というファイルを作成した。
global proc pass()
{
print "passTest1";
}

2)rehashを実行し再度スクリプト・パスをスキャン

3)「pass」と入力後Enterキーを押してプロシージャを実行。
無事、passTest1と表示された。

答えとしてはMAYA_SCRIPT_PATHに代入されていたパスであればどこでもスクリプトを保存できる。ことがわかった。


リストされた環境変数を見るとshelves, startup, hairなど特定の目的と見られるフォルダもある。
ここにスクリプト・ファイルを保存した際、どういったことがおこるのか一つ一つチェックしていく時間はないのでここでは省略する。
しかしながら、scriptsと書かれたフォルダ以外には問題をさけるためにもスクリプト・ファイルを保存しないほうがいいだろう。


----------------------------------------
ここまでで環境変数がどのように機能しているかが、すこしわかってきたように思う。

簡単に言えば環境変数の「MAYA_SCRIPT_PATH」に、フォルダへのパスが代入されていれば、Mayaが自動的に読み込んでくれるということになる。

そこへ任意のフォルダパスを代入できれば、自分の好きなフォルダをスクリプト・パスとして利用できる。


ではその設定方法だが、
オンラインヘルプ「MEL を使用してユーザ スクリプトの位置を変更する」には以下のように書かれている。
「検索パスは環境変数 called MAYA_SCRIPT_PATH に格納されます。この環境変数は、プリファレンス(Preferences)が格納されている Maya.env ファイルに設定することができます。」

また「Maya.env を使用して環境変数を設定する」にも書いてあるようにこの方法は安全である。
「Maya.env ファイルを使用すると、標準的な環境設定と Maya 固有の変数が混同されないので、こちらの方法をお薦めします。
また、複数のマシンで共有するローミング(移動)プロファイルとして Maya.env を設定することもできます。」

DigitalMatrix「MEL スクリプトを任意のディレクトリから自動的に読み込む方法 」にも同様の手段が書かれている。


blog「目指せCREATIVE ART!!」のエントリ「MEL 環境変数MAYA_SCRIPT_PATHへのパス追加方法」には具体例が書かれている。


以上を参考にすれば
C:\Documents and Settings\userName\My Documents\maya\8.5
フォルダ内にあるMaya.env にパスを書き込んで保存すればよいと言うことがわかる。


----------------------------------------
ではその具体的ステップを検証してみる。

1)Cドライブ直下に以下のフォルダを作成。
C:\scriptTest

2)そこへ以下の内容で「test.mel」というスクリプトファイルを保存。
global proc test()
{
sphere;
}

3)C:\Documents and Settings\userName\My Documents\maya\8.5
にある「Maya.env」をテキストエディタで開く。

4)MAYA_SCRIPT_PATH=C:\scriptTest
と記述しファイルを上書き保存。

5)Mayaを起動。(すでに起動している場合は再起動)

6)スクリプト・エディタからにて「test」と入力後Enterキーを押してプロシージャを実行。

無事、Nurbsスフィアが作成された

Mayaをすでに起動している場合は再起動が必要だが、一度起動してしまえば問題ない。



ここで、Melを保存する場所が複数ある場合のパスの追加も試してみた。

自分の自宅環境では、ネットワークドライブは存在しないので、USBドライブを使うことにした。
このUSBドライブは常にマシンに接続した状態で、ドライブレターは固定で使っている。


1)外付けのUSBドライブに「MelOnUSB」という名前のフォルダを作成。

2)そこへ以下の内容で「testPoly.mel」というスクリプトファイルを保存。
global proc testPoly()
{
polySphere;
}

3)C:\Documents and Settings\userName\My Documents\maya\8.5
にある「Maya.env」をテキストエディタで開く。

4)先ほどの記述に、「;M:\MelOnUSB」と追加して上書き保存。
ドライブレターの前にセミコロンがあることに注意。
MAYA_SCRIPT_PATH=C:\scriptTest;M:\MelOnUSB

これはオンラインヘルプに下記のように述べられている通りでOSによって異なるらしい。。
「複数のパスを区切るには、Windows ではセミコロン(;)を、Linux と Mac OS X ではコロン(:)を使用します。」

5)Mayaを起動。(すでに起動している場合は再起動)

6)スクリプト・エディタからにて「testPoly」と入力後Enterキーを押してプロシージャを実行。

無事、ポリゴン・スフィアが作成された


----------------------------------------
ばからしいことだが、なんでも試してみないと気が済まないので、
プロシージャ名とスクリプトファイルの名前が一致しない場合に何がおこるかをついでに検証してみた。

1)先ほどの「M:\MelOnUSB」に保存してあるスクリプト・ファイル「testPoly.mel」の名称を「unKnown.mel」と変更。

2)Mayaを再起動。

3)スクリプト・エディタからにて「testPoly」と入力後Enterキーを押してプロシージャを実行
// Error: Cannot find procedure "testPoly". //

4)念のため、ファイル名である「unKnown」をプロシージャとして実行してみる。
// Error: Cannot find procedure "unKnown". //

「プロシージャ名とスクリプトファイルの名前は一致していなくてはならない。」という原則は絶対であり例外はないことがわかった。

ちなみに「unKnown.mel」ファイルをSource Scriptで読み込んだ場合は、「testPoly」をプロシージャとして実行してちゃんとした結果が得られる。



----------------------------------------
***注意:以降に書いてあることは、情報が曖昧な上、深刻な問題をもたらすものも含まれるため利用しないことを強くおすすめします。***
----------------------------------------
ややこしくなってくるので省略するが、ネットワーク上からこれらの設定を参照するように設定することも当然できる。
Maya.envをすべてのマシンにおいて変更することも可能だろう。

DigitalMatrix「環境変数の設定方法(Maya.env ファイルに設定) 」にも書かれているがこのMaya.env自体の保存場所を変えて、そこを指定することも出来る。
その際にはMAYA_APP_DIR を利用する。

またmemlogさんのほうで、パイソンの例だが、MAYA_APP_DIRの活用について触れている。

ただし、ネットワーク系の知識がないのでこのあたりのことは、今は深入りしないでおく。
----------------------------------------

さてMaya.env以外の方法で、環境変数へパスを代入する方法がある。
(最後に述べるように深刻な問題が発生するので、おすすめはしない)

オンラインヘルプの「MEL を使用してユーザ スクリプトの位置を変更する」に書かれている
putenv」コマンドを使う方法だ。

putenv」コマンド
使用例:putenv "MAYA_SCRIPT_PATH" "";


これによりMayaから指定した環境変数へ値(パス)を代入できる。

これは、新しくフォルダを作り、今回に限りそのパスを利用したいというときなどに便利だ。

簡単にするために以下の手順を試してみた。

1)先ほど作成した、Cドライブ直下の下記フォルダを利用する。
C:\scriptTest

2)そこへ以下の内容で「test2.mel」というスクリプトファイルを保存。
global proc test2()
{
print "test2 putenv test";
}

3)スクリプト・エディタで以下を実行
putenv "MAYA_SCRIPT_PATH" ""C:/scriptTest";
// Result: 0 // と表示された。

4)test2」と入力後Enterキーを押してプロシージャを実行。
無事「test2 putenv test」と表示された。


実はこのputenvが最初うまくいかなかった。

最初、ステップ3では、パスをエクスプローラからコピペして
putenv "MAYA_SCRIPT_PATH" "C:\scriptTest";
と入力していた。
これは英語環境のMayaのスクリプト・エディタでは
¥マークがバックスラッシュに変わって表示される。
このまま実行すると、エラーはなく設定はされるのだが、
ステップ4を実行しても
// Error: Cannot find procedure "test2". //
となってしまう。


getenv MAYA_SCRIPT_PATH;で確認すると
// Result: C:scriptTest // となっている。

コロンのあとのバックスラッシュがきえている。

Maya起動直後にgetenv MAYA_SCRIPT_PATH;を実行して表示されるパスを見ると
C:/Documents and Settings/と
最初のドライブレターに続くコロンの後ろにはスラッシュ「/」が入っている。

そこで以下のようにスラッシュ
「/」に変えて実行したところ
putenv "MAYA_SCRIPT_PATH" "C:/scriptTest";

ちゃんと動作するようになった。

これについてはMayaのオンラインヘルプには、以下のように書いてあるのだが...。
「ディレクトリのパスについては、Windows ではバックスラッシュ(\)を、Linux および Mac OS X ではスラッシュ(/)を使用します。」


もう一つ気になるのは、「putenv」を実行した後、
getenv MAYA_SCRIPT_PATH;で表示されるパスが
「// Result: C:/scriptTest // 」の一つになってしまった。

この環境変数にあった、他のパスは上書きされて消えてしまうらしく当然ながら他のプロシージャは一切無効。
Mayaのメニュー、アイコン等をクリックして実行されるのはプロシージャのため、一切使えなくなった。

これがバグなのかどうかわからないが、
原因と解決策が明確でない場合は、putenvの使用は控えたほうが良いと思われる。

 

0 件のコメント:

コメントを投稿