2019年7月1日月曜日

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

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

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




uiResTestWindow.mel
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
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ファイルの中身はこんな感じ。

uiResTestWindow.res.mel
1
2
3
4
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 件のコメント:

コメントを投稿