自分でMELで何かツールを作ったとき、いろんな人に使ってもらえるようにhelpとかも作ると思います。
helpの開き方は
launch -web helpのパス;
でhtmlファイルを開くことができます。
ただ、このhelpのパスをどうやって取得するかって結構悩みます。まぁ、絶対パスで入れておいてもいいんですが、環境が変わったりしたら、いちいちスクリプトを書き直さなきゃいけないので面倒です。
できれば、環境の変化に対応できるようにパスを取得したいところです。
そこで環境変数からhelpのパスを取得する方法を思いついたので紹介します。
おそらく、自分のスクリプトが入れてあるフォルダの下にhelp用のフォルダを作ると思うので、そういう想定をした上でのスクリプトです。
とりあえず、以下がソースコードです。
global proc string getHelpPath(string $helpDirName){
string $buf = `getenv MAYA_SCRIPT_PATH`;
string $scriptPaths[];
string $scriptPath = ($helpDirName+" directory dosen't exist!");
tokenize $buf ";" $scriptPaths;
for($path in $scriptPaths){
$buf = ($path+"/"+$helpDirName);
if(`chdir $buf` == 0) $scriptPath = $buf;
}
return $scriptPath;
}
スクリプトの説明をします。
string $buf = `getenv MAYA_SCRIPT_PATH`;
getenvで環境変数の値を取得することができます。ここではMAYA_SCRIPT_PATHの値を取得します。
MAYA_SCRIPT_PATHはMayaがスクリプトを読み込む全てのディレクトリのパスが格納されています。
それぞれのパスはセミコロンで区切られて、一つの文字列として格納されています。
C:/maya/script;C:/maya/originalScript;...
こんな感じでたくさんのパスが入っています。
まずはこれを分割して、別々に格納したいところです。
そこで次のコードを使用します。
tokenize $buf ";" $scriptPaths;
tokenizeはある文字で一つだった文字列を分断して、配列に別々に格納していくコマンドです。
ここではgetenvで取得したMAYA_SCRIPT_PATHをセミコロンで区切って文字列の配列である$scriptPathsに格納しています。
これで$scriptPathsには複数のパスが別個に格納されました。
次にこれらのパスの中からhelp用のディレクトリを含んでいるパスを見つけます。それが次のコードです。
for($path in $scriptPaths){
$buf = ($path+"/"+$helpDirName);
if(`chdir $buf` == 0) $scriptPath = $buf;
}
forで回して、全てのスクリプトパスを見ていきます。
forの中身では
$buf = ($path+"/"+$helpDirName);
というコードがあります。ここでは先ほど取得したパスに無理やりhelp用のディレクトリのパスを追加した文字列を$bufに代入しています。
C:/maya/script/help
みたいな感じですね。もちろん、このパスが存在しない可能性もあるわけです。
それを確かめるために次のコードを用います。
if(`chdir $buf` == 0) $scriptPath = $buf;
ここで`chdir $buf`とは何をしているのでしょうか。これはSystemのディレクトリを移動するコマンドです。
つまり、$bufというディレクトリに移動しろという命令です。
しかし、$bufが存在しないパスだったらどうなるでしょうか?
chdirではパスが存在しなかった場合、-1を返します。
存在していた場合、0を返します。
つまり、helpのディレクトリが存在した場合のみ、0が返ってくるということです。
それが探していたスクリプトパスになります。
あとはそのパスを返すだけです。
この方法なら環境が変わってもscriptの入ってるディレクトリ下にhelpのディレクトリがありさえすれば、ソースコードをいじらなくても対応できるので非常に便利です。
この方法は他にもパスを探したいときは使えると思うので是非お試しください。
helpの開き方は
launch -web helpのパス;
でhtmlファイルを開くことができます。
ただ、このhelpのパスをどうやって取得するかって結構悩みます。まぁ、絶対パスで入れておいてもいいんですが、環境が変わったりしたら、いちいちスクリプトを書き直さなきゃいけないので面倒です。
できれば、環境の変化に対応できるようにパスを取得したいところです。
そこで環境変数からhelpのパスを取得する方法を思いついたので紹介します。
おそらく、自分のスクリプトが入れてあるフォルダの下にhelp用のフォルダを作ると思うので、そういう想定をした上でのスクリプトです。
とりあえず、以下がソースコードです。
global proc string getHelpPath(string $helpDirName){
string $buf = `getenv MAYA_SCRIPT_PATH`;
string $scriptPaths[];
string $scriptPath = ($helpDirName+" directory dosen't exist!");
tokenize $buf ";" $scriptPaths;
for($path in $scriptPaths){
$buf = ($path+"/"+$helpDirName);
if(`chdir $buf` == 0) $scriptPath = $buf;
}
return $scriptPath;
}
スクリプトの説明をします。
string $buf = `getenv MAYA_SCRIPT_PATH`;
getenvで環境変数の値を取得することができます。ここではMAYA_SCRIPT_PATHの値を取得します。
MAYA_SCRIPT_PATHはMayaがスクリプトを読み込む全てのディレクトリのパスが格納されています。
それぞれのパスはセミコロンで区切られて、一つの文字列として格納されています。
C:/maya/script;C:/maya/originalScript;...
こんな感じでたくさんのパスが入っています。
まずはこれを分割して、別々に格納したいところです。
そこで次のコードを使用します。
tokenize $buf ";" $scriptPaths;
tokenizeはある文字で一つだった文字列を分断して、配列に別々に格納していくコマンドです。
ここではgetenvで取得したMAYA_SCRIPT_PATHをセミコロンで区切って文字列の配列である$scriptPathsに格納しています。
これで$scriptPathsには複数のパスが別個に格納されました。
次にこれらのパスの中からhelp用のディレクトリを含んでいるパスを見つけます。それが次のコードです。
for($path in $scriptPaths){
$buf = ($path+"/"+$helpDirName);
if(`chdir $buf` == 0) $scriptPath = $buf;
}
forで回して、全てのスクリプトパスを見ていきます。
forの中身では
$buf = ($path+"/"+$helpDirName);
というコードがあります。ここでは先ほど取得したパスに無理やりhelp用のディレクトリのパスを追加した文字列を$bufに代入しています。
C:/maya/script/help
みたいな感じですね。もちろん、このパスが存在しない可能性もあるわけです。
それを確かめるために次のコードを用います。
if(`chdir $buf` == 0) $scriptPath = $buf;
ここで`chdir $buf`とは何をしているのでしょうか。これはSystemのディレクトリを移動するコマンドです。
つまり、$bufというディレクトリに移動しろという命令です。
しかし、$bufが存在しないパスだったらどうなるでしょうか?
chdirではパスが存在しなかった場合、-1を返します。
存在していた場合、0を返します。
つまり、helpのディレクトリが存在した場合のみ、0が返ってくるということです。
それが探していたスクリプトパスになります。
あとはそのパスを返すだけです。
この方法なら環境が変わってもscriptの入ってるディレクトリ下にhelpのディレクトリがありさえすれば、ソースコードをいじらなくても対応できるので非常に便利です。
この方法は他にもパスを探したいときは使えると思うので是非お試しください。