2016年5月30日月曜日

アニメカーブからタイムレンジを復元させる

中間ファイル、ま、FBXの事なんですけど、アニメの入っているファイルをインポートしても
タイムレンジがプリファレンスのまま変化しない。
そもそも、アニメーションを中間ファイルで管理しようとするのが問題なんですけど・・・。

地味に面倒です。


そこで、アニメーションカーブを調べて、タイムレンジを復元するスクリプトを作成してみました。


global proc string tryRestoreTimeRange()
{
    float $min;
    float $max;
    
    string $aniCrvs[]=`ls -typ "animCurve"`;
    if(!`size $aniCrvs`) return "";
    
    int $isFirst=1;
    for( $aniCrv in $aniCrvs )
    {
        int $kc=`keyframe -q -kc $aniCrv`;
        
        float $tmpMin[]=`keyframe -in 0 -q $aniCrv`;
        float $tmpMax[]=`keyframe -in ($kc-1) -q $aniCrv`;
        
        if( $isFirst )
        {
            $isFirst=0;
            $min=$tmpMin[0];
            $max=$tmpMax[0];
            
        }
        
        
        if( $tmpMin[0]<$min ) $min=$tmpMin[0];
        if( $max<$tmpMax[0] ) $max=$tmpMax[0];
        
    }
    
    eval("playbackOptions -min "+$min+" -max "+$max+" -ast "+$min+" -aet "+$max);
    
    return ($min+":"+$max);
    
}



アニメカーブノードをリストアップしてキーフレームの先頭と末尾の最小、最大を取るだけ。

もう少し賢くしたい感じはする。


2016年5月24日火曜日

window作成のための雛形

ツール用のウィンドウを作成する時の雛形。

毎回似た感じになるのに、_buildWindow()の引数やdeleteUIの位置とかで悩むため、
汎用性のこともちょっとを考えて作成。

proc _setupMainLayout(
    string $parent )
{
    setParent $parent;
    
    //------------------------------------------------------------------------------
    // コントローラの追加・編集はここから
    columnLayout;
        button;
        button;
        button;
    
}


proc _setupWindow(
    string $window )
{
    if(`window -q -mb $window`)
    {
        string $menu0=`menu -l "File"`;
        string $menu1=`menu -l "Edit"`;
        string $help =`menu -l "Help" -hm true`;
        
    }
    
    int $w=320;
    int $h=160;
    //------------------------------------------------------------------------------
    string $mainForm=`formLayout`;
        string $mainLayout=`scrollLayout -w $w -h $h`;/** 希望のlayoutに変更 **/
    
    formLayout -e
        -af $mainLayout "top" 0
        -af $mainLayout "left" 0
        -af $mainLayout "right" 0
        -af $mainLayout "bottom" 0
        $mainForm;
    
    //------------------------------------------------------------------------------
    _setupMainLayout( $mainLayout );
    
    //------------------------------------------------------------------------------
    window -e -w $w -h $h $window;
    
}


proc _createWindow(
    string $toolName,
    string $window )
{
    string $title=`interToUI $toolName`;
    
    window
        -title $title
        //-toolbox true
        //-menuBar true
        //-sizeable false
        $window;
    
}


proc _buildToolWindow(
    string $toolName,
    string $window )
{
    if(`window -ex $window`)
    {
        deleteUI $window;/** for debug. **/
        //return;
        
    }
    
    _createWindow( $toolName,$window );
    _setupWindow( $window );
    
    //------------------------------------------------------------------------------
    // 必要ならジョブの追加
    //scriptJob -e "event" "script" -p $window;
    
}


global proc sampleUI()
{
    string $toolName="sampleUI";/** スクリプト名推奨 **/
    string $window=($toolName+"Window");
    
    _buildToolWindow( $toolName,$window );
    
    showWindow $window;
    
}



まず、88行目で$toolNameをスクリプト名に変更。


71行目はデバッグ中スクリプトがエラー停止し、次回実行時に

    Object's name 'sampleUIWindow' is not unique.

みたいなのを出さないようにするためのもの。
リリースする時はコメントアウトして、return;だけに変更。


81行目にwindowにアタッチしたいジョブを追加。
コレの位置が92行に追加するか迷う部分。
main procedureを簡素にするため_buildToolWindow()の中へ追加していくことに。


55行目からのwindowコマンドは使うオプションのみコメント外して使う。
-toolbox,-menuBar,-sizeable だいたいこの3つしか使っていない気がする。


window に menu を追加した場合、20行目のブロック内に menuItem を追加するプロシージャ追加。

31行目の layout の子にUIを追加していく。
buttonだけとかなら、ここで指定したwidth,height以下に window は小さくならないはず。


で、_setupMainLayout()が本体。



結構いじる場所が分散してしまった。