2019年7月1日月曜日

パスの通っていない.res.melを読み込む

テストでスクリプトを組む時や、必要なスクリプトをフォルダーにまとめて配布する場合では MAYA_SCRIPT_PATH にスクリプトパスが登録されていない事があります。
そんな状況では .res.melが読み込まれていないことになってしまうので、メインのMELを source しても uiRes コマンドの部分でエラー停止してしまいます。
.res.melも source するようにすれば良いのですが、カタギさんには酷なはなしでしょう。
そんなシチュエーションを回避するためにも、メインスクリプト内に.res.melを読み込むコードを入れておくと良いかもしれません。

この記事のスクリプトのパスを調べるスクリプトを参考に、サンプルコードを書いてみます。




proc _loadUiRes(
    string $script )                    ///< スクリプト名
/**************************************************************************//**
    @protected
    @brief uiResファイルの読み込み。
 ******************************************************************************/
{
    // 自身のパスを調べる。
    string $whatIs=`whatIs $script`;
    
    // 不明の場合停止
    if("Unknown"==$whatIs) error -n ("Unknown "+$script);
    
    // 不要部分の削除
    string $path;
    $path=python("'"+$whatIs+"'.replace('Script found in: ','')");
    $path=python("'"+$path+"'.replace('Mel procedure found in: ','')");
    
    $path=("\""+dirname($path) + "/");
    
    
    //------------------------------------------------------------------------------
    // リソースファイルパスの作成
    string $dir=$path;          // 復元用
    string $ext=".res.mel\"";   // 拡張子
    
    // 言語の確認
    if(`about -uii`) /* 英語以外 */
    {
        string $lang=`about -uil`;
        $path += ($lang+"/"+$script+$ext);
        
    }
    else $path += ($script+$ext);
    
    
    //------------------------------------------------------------------------------
    // 実行
    if( catchQuiet(`evalEcho ("source "+$path)`) )
    {
        // もし日本語が無かったら英語を読み込む
        warning -n (`getLastError`);
        evalEcho("source "+$dir+$script+$ext);
        
    }
    
}


global proc uiResTestWindow()
{
    _loadUiRes("uiResTestWindow");
    
    string $window=`window`;
    
    columnLayout;
        floatSliderGrp -f 1 -l (uiRes("m_uiResTestWindow.kFloatFieldGrpLabel1"));
        floatSliderGrp -f 1 -l (uiRes("m_uiResTestWindow.kFloatFieldGrpLabel2"));
        floatSliderGrp -f 1 -l (uiRes("m_uiResTestWindow.kFloatFieldGrpLabel3"));
        floatSliderGrp -f 1 -l (uiRes("m_uiResTestWindow.kFloatFieldGrpLabel4"));
    
    showWindow $window;
    
}

.res.melファイルの中身はこんな感じ。

displayString -replace -value "test1" m_uiResTestWindow.kFloatFieldGrpLabel1;
displayString -replace -value "test2" m_uiResTestWindow.kFloatFieldGrpLabel2;
displayString -replace -value "test3" m_uiResTestWindow.kFloatFieldGrpLabel3;
displayString -replace -value "test4" m_uiResTestWindow.kFloatFieldGrpLabel4;

スクリプトはこんな風に配置しています。


スクリプトエディタでは、こんな風に実行します。

{
    source "test/uiResTestWindow.mel";
    uiResTestWindow;
    
}

すると、こんな感じのウィンドウが表示されます。



もちろん日本語版mayaで実行すれば、

問題なく日本語が表示されます。
言語用のサブフォルダを about -uil で指定しているので、有志の方がローカライズファイルを作成すれば、メインスクリプトを修正しなくても多言語対応が出来るはずです。
たぶん。

0 件のコメント:

コメントを投稿