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;
    


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



0 件のコメント:

コメントを投稿