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()が本体。



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

2016年4月21日木曜日

frameLayoutのオプション

frameLayout を使おうと思いヘルプを見てみたら、-borderStyle がサポートされなくなったらしい。

フラットデザインが流行ってるからか?
それとも、4Kでは数ピクセルは認識できないからか?

ま、使えない物は仕方がない。


更新情報に削除項目は見つからなかったが、かわりに -backgroundShade というのが追加されたというのを発見。

さっそくサンプルコードを書いて実行してみたところ・・・
なにも変化がない。


何か他のフラグも必要なのかと思い、いろいろ試してみた結果、
-labelVisible true の時にしか反応しないらしい。


左が -bgs false、右が -bgs true

最初、-borderVisible true の状態で見ていたので変化が分からなかったらしい。
Photoshop で色情報を調べたところ #444444 が #494949 に変化していました。

微妙すぎて分からんわ!


ちなみに、4月7日に更新された Extension 3 には -highlightColor というのも追加され、
これの使い方が全く不明・・・。

Extension 3 もパッチだと思ってインストールしたら 2016.5 と別バージョンだったという罠。

2016年4月19日火曜日

内分点の計算

骨にロール用のジョイントを追加したい場合に使用する公式、内分点について。

直線ABをm:nに分けると云うやつですね。


公式は、こんなんだけれど、どうスクリプトに起こすのか?
m:nっていうのが難所。

とりあえず図解。


これをm:nを使わずに表現したい。

計算する場合、たいていaとbは設定できます。
そのa-b間の特定の座標が知りたいわけなので、
こんな感じの図になりました。

コレを使って内分点の式を書き換えると、


これでスクリプトにする事ができそうな気がします。

引数は
  • 開始位置
  • 終了位置
  • 割合
の3つ。

global proc vector calcDividingPoint(
    vector $sp,                         // 開始位置
    vector $ep,                         // 終了位置
     float $rate )                      // 割合
{
    float $length=mag( $sp-$ep );
    float $m=$length * $rate;

    return ( ( ($length-$m) * $sp + $m * $ep ) / $length );

}


ま、ここで終わっても使えないことは無いのですが、よく見ると $length を掛けたり
割ったりしまくっています。

$rate そもそも百分率なので、$length でなく 1.0 とすれば良いわけです。
なので、

global proc vector calcDividingPoint(
    vector $sp,                         // 開始位置
    vector $ep,                         // 終了位置
     float $rate )                      // 割合
{
    return ( (1.0-$rate) * $sp + $rate * $ep );

}


これで十分。

ちなみに $rate に1以上を設定すると外分点になります。


2016年4月4日月曜日

バックアップ用バッチ

スクリプトフォルダをバックアップするバッチファイル。

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: mayaのスクリプトをバックアップする。
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

@echo off
set YYYYMMDD=%DATE:/=%
set HHMMSS=%TIME:~0,-3%
set HHMMSS=%HHMMSS::=%
set HHMMSS=%HHMMSS: =0%


set SOURCE=D:\maya
set BACKUP=D:\_backUpFolder


XCOPY "%SOURCE%\scripts" "%BACKUP%\scripts\%YYYYMMDD%_scripts" /S /I /Y


pause


12行目に scripts フォルダの「親」のパス。
13行目にコピー先のパス。

6~9行目は日付と時間を8桁の文字列にする部分。
これはよく使います。定型分みたいな感じ。


差分とか手軽に調べるならサブバージョンの方が良いかもなぁ・・・。