2017年8月31日木曜日

配列の行と列を入れ替える

ロケータを4つほど作成し、それぞれ適当に移動させます。
そして、下のスクリプトを実行。

{
    string $lines[];
    $lines[0]="nodeName\ttranslateX\ttranslateY\ttranslateZ\tvisibility";
    
    string $lcts[]={"locator1","locator2","locator3","locator4"};
    
    for( $lct in $lcts )
    {
        float $tr[]=`getAttr ($lct+".t")`;
        string $vis=(`getAttr ($lct+".v")`) ? "on": "off";
        
        $lines[size($lines)]=($lct+"\t"+$tr[0]+"\t"+$tr[1]+"\t"+$tr[2]+"\t"+$vis);
        
    }
    
    print $lines;
    
    
}


スクリプトエディタの履歴をコピーしてエクセルへ貼り付けてみます。

エクセルはタブで区切られているとセルに分割された状態で貼り付けられます。
便利ですね。

上では、まだ列が少ないので良いのですが、アトリビュート値を大量にリスト化した場合、アトリビュートのヘッダーを列方向ではなく行方向に並べたい場合があります。
エクセルであれば、いったんセルをコピーして、ホームの「貼り付け」から「形式を選択して貼り付け」を選びます。

出てきたダイアログから「行列を入れ替える」にチェックを入れて[OK]します。

すると、行列が入れ替わった状態で貼り付けされました。

で、これを何回も行う場合、面倒なので行列の入れ替をMEL側で行いたい。
そんなスクリプトを作成。


引数に「文字配列」と「セパレータの文字」を渡すと行列を入れ替えてくれます。
冒頭のスクリプトであれば、print $lines;の下に


    print("\n-- new lines --\n");
    string $newLines[]=stringArrayTranspose( $lines,"\t");
    print $newLines;
    


を追加すれば、
うまく入れ替わってくれているようです。



2017年8月21日月曜日

日本語と英語のフォントサイズ

ツールを作る場合、ウィンドウに項目を並べたい場合があります。
サンプルスクリプトとしてはこんな感じ。

proc string _createLabelFrame(
       int $w ,                         // 幅px
    string $align,                      // 位置合わせ"left","right","center"
    string $label )                     // ラベル文字
{
    string $frame=`frameLayout -lv 0 -bv 1 -w $w -mw 6`;
        text -l $label -al $align;
        setParent ..;
    
    return $frame;
    
}


global proc labelTest()
{
    string $win="testWindow";
    
    if(`window -q -ex $win`) deleteUI $win;
    window $win;
    
        rowLayout -nc 4;
            _createLabelFrame( 46,"center","項目A" );
            _createLabelFrame( 96,"center","けっこう長い項目B" );
            _createLabelFrame( 96,"left","項目C" );
            _createLabelFrame( 96,"right","項目D" );
    
    window -e -w 342 -h 32 $win;
    
    showWindow $win;
    
}


実行するとこんな感じのウィンドウになります。


で自分は普段英語版を使うわけですが、世の中にはmaya日本版と言う物があるのです。
同じスクリプトを日本語版で実行した結果。


ギリギリを攻めていた「項目A」と「けっこう長い項目B」が枠からハミ出ています。
良く見ると高さも若干広まっていますね。

どうやら英語版と日本語版ではフォントサイズが違っているようで、レイアウトが崩れてしまう様子。
けれどもMELにはフォントサイズを変更するオプションはありませんが、フォントスタイルを、
「boldLabelFont」
「smallBoldLabelFont」
「tinyBoldLabelFont」
「plainLabelFont」
「smallPlainLabelFont」
「obliqueLabelFont」
「smallObliqueLabelFont」
「fixedWidthFont」
「smallFixedWidthFont」
から指定できるようです。

ただ、それぞれを指定して比較するのは中々面倒です。
実はmayaのインストールフォルダのresourcesに MayaStrings というファイルがあります。
そのファイルの中から s_TschemeResourcesFlatUI という単語を検索すると、

こんな感じで各言語のフォントサイズらしき物を発見できました。

で、全言語同じフォントで同じサイズの「smallFixedWidthFont」を指定します。
text -l $label -al $align -fn "smallFixedWidthFont";


編集して日本語mayaで実行した結果


英語と同じになりました。
配置に凝ったUIを組む時はFixedWidthFontくらいしか使えないので要注意です。