« 新プリミティブ降臨。 | トップページ | 悲しみの対称複製そしてリネーム。 »

2012年1月18日 (水)

キーフレーム殲滅でポン。

昼間っから唐突に降ってくるスクリプト。

実は昨日の深夜に1時間くらいで書いて、さっき30分くらい手直し。 きっと俺の作業にも役立つ。



すいません、まだ解説無し。
いずれ。

動きますかね初夏さん。



JScript
-------------------------------------------------------

var oPC = Dictionary.GetObject( "PlayControl" );

DefMode = GetGlobal( "KeyFrameFucker_Mode" );
DefStart = GetGlobal( "KeyFrameFucker_StartFrame" );
DefEnd = GetGlobal( "KeyFrameFucker_EndFrame" );
DefLock = GetGlobal( "KeyFrameFucker_Lock" );

if ( DefMode == null )
{
    DefMode = 0;
    DefStart = oPC.In.value;
    DefEnd = oPC.Out.value;
    DefLock = false;
}

var oP = XSIFactory.CreateObject( "CustomProperty" );
oP.name = "キーフレーム殲滅でポン。";
oP.AddParameter2( "iMode", siInt4, DefMode );
oP.AddParameter2( "iStartFrame", siInt4, DefStart );
oP.AddParameter2( "iEndFrame", siInt4, DefEnd );
oP.AddParameter2( "bOverrideLock", siBool, DefLock );

var oL, oItem;
oL = oP.PPGLayout;
oL.AddRow();
    oL.AddGroup( "", false, 23 );
        oItem = oL.AddButton( "DeleteKey", "∀゜)⊃" );
        oItem.SetAttribute( siUICX, 0 );
        oItem.SetAttribute( siUICY, 110 );
    oL.EndGroup();
    oL.AddGroup( "", true, 54);
        oItem = oL.AddEnumControl( "iMode", Array( "Keep this Range", 0, "Fuck this Range", 1 ), "Mode", siControlCombo);
        oItem.SetAttribute( siUINoLabel, true );
        oItem = oL.AddItem( "iStartFrame", "Start" );
        oItem = oL.AddItem( "iEndFrame", "End" );
        oItem = oL.AddItem( "bOverrideLock", "Fuck Key Lock" );
    oL.EndGroup();
    oL.AddGroup( "", false, 23 );
        oItem = oL.AddButton( "DeleteKey", "⊂(゜∀゜" );
        oItem.SetAttribute( siUICX, 0 );
        oItem.SetAttribute( siUICY, 110 );
    oL.EndGroup();
oL.EndRow();

oL.Language = "JScript";
oL.Logic = DeleteKey_OnClicked.toString();

function DeleteKey_OnClicked()
{
    var oCol = XSIFactory.CreateObject( 'XSI.Collection' );
    oCol.items = Selection;
    var oExpanded = oCol.expand( );

    var oAllFuckinAnimatedParametersGodDamnItYouMotherFuckerEatThisShitSonOfABitch = XSIFactory.CreateObject( 'XSI.Collection' );
    for ( var i=0; i<oExpanded.count; i++ )
    {
        oAllFuckinAnimatedParametersGodDamnItYouMotherFuckerEatThisShitSonOfABitch.AddItems( oExpanded(i).NodeAnimatedParameters( siFCurveSource ) );
    }

    Mode = PPG.iMode.value;
    FrameStart = PPG.iStartFrame.value;
    FrameEnd = PPG.iEndFrame.value;
    LockOverride = PPG.bOverrideLock.value;   

    for ( var i=0; i<oAllFuckinAnimatedParametersGodDamnItYouMotherFuckerEatThisShitSonOfABitch.count; i++ )
    {
        var oFcurve = oAllFuckinAnimatedParametersGodDamnItYouMotherFuckerEatThisShitSonOfABitch(i).Source;
        if ( Mode == 0 )
        {
            oFcurve.BeginEdit();
                oFcurve.RemoveKeys( FrameStart - 9999999, FrameStart - 0.01, LockOverride );
                oFcurve.RemoveKeys( FrameEnd + 0.01, FrameEnd + 9999999, LockOverride );       
            oFcurve.EndEdit();
        }
        else
        {
            oFcurve.BeginEdit();
                oFcurve.RemoveKeys( FrameStart - 0.01, FrameEnd + 0.01, LockOverride );
            oFcurve.EndEdit();
        }
    }

    SetGlobal( "KeyFrameFucker_Mode", Mode );
    SetGlobal( "KeyFrameFucker_StartFrame", FrameStart );
    SetGlobal( "KeyFrameFucker_EndFrame", FrameEnd );
    SetGlobal( "KeyFrameFucker_Lock", LockOverride );

    Logmessage( "|∀゜)⊃ 終わりますた ⊂(゜∀゜|" );


    // 以下の1行追記。表示を強制アップデート。 2011までは多分必要。Thanks to 網ー誤マーティン
    SelectObj( oCol );
}

InspectObj( oP, null, null, siLock );

-------------------------------------------------------



Keyframefucker


Keep モードで、そのフレーム範囲内にあるキーフレームを保持しそれ以外を殲滅。 つまり指定したフレーム範囲より前にあるキーフレームと後にあるキーフレームが殲滅されます。 頭とケツ削除。

Fuck モードで、そのフレーム範囲内にあるキーフレームを殲滅。

Fuck Key Lock は、ロックされてるキーフレームでも強引に犯っちまうかどうか。

ボタンは左右同じです。どっち押してもいいです。

複数オブジェクト可。 オブジェクトをブランチ選択してればその子供も含まれる。 Group を選択していればその Group 内の全てのオブジェクトが対称。 つまり Expand の魔法




解説はまた後ほど。たぶん。



ごきげんよう。


------------------------------------------
追記:

コメント欄にありますが、ヤラたんからのタレコミで、2011 まではどうやら表示のアップデートに問題があったようでした。 キーフレーム削除後、表示が更新されないという。 実際はちゃんと削除されているんだけど、画面上即座にそれが確認できないという状態ですね。

俺はもともと 2012 でこのスクリプトを書いたのですが、2012 ではその問題が出なかったんですよ。 でも 2011 SAP SP1 で試してみたら、まさに同じ問題に出くわしました。

他のお方はどうですか? 同じ問題が出るお方はいますか? バージョンは?

とりあえず、ヤラたんの実験結果に従い、上のコードの赤字の部分、1行追加しました。 おそらくこれで、キーフレーム削除後に表示が強制アップデートされると思います。 2012 よりも以前のバージョンでは必要と思われます。 2012 以降のバージョンでも、まあ害にはならないので、この1行があって良いでしょう。

マーティンヤラたんありがとう (゜∀゜

------------------------------------------

.

|

« 新プリミティブ降臨。 | トップページ | 悲しみの対称複製そしてリネーム。 »

コメント

早速今日の作業に使わせて頂きました。
ありがとうございます。

タイムラインに変化がなく消されたキーフレームが消えていないというのはやっぱりXSIバグなんでしょうね。
function DeleteKey_OnClicked() の 最後に
selectobj(oCol)
を入れるとちゃんとキーフレームが消えます。

ていうか、変数名長過ぎないですか?

投稿: myara | 2012年1月18日 (水) 17時33分

Hola Martin,

え?  ボタン押しても、キーフレームが消えないということですかね?  つまり、カレントフレームを進めるなどして「刺激」を与えるとちゃんとキーフレームが消えた状態にアップデートされるという意味ですか?  そして、SelectObj を入れるとそれが「刺激」になり、カレントフレームに変化がなくてもちゃんとアップデートされるという意味でしょうかね?


俺のところでは、このままで、ちゃんとキーフレーム消えてくれるんですよ。XSI の下の方にあるタイムラインに表示される赤いキーフレームマークを見ながらやってますし、Fカーブエディタを開いてキーが見える状態でもやってますが、ボタン押したらちゃんとキーが消えてくれるのを確認できています。カレントフレームを変える必要もないし、SelectObj の必要もないように思えます。 さっき試しに SelectObj を入れてみましたが、はい、もちろんこれでもいいですけど、無くても挙動同じです。


でもそちらでは、そうではないのですね?  XSI のバージョンの違いとか、あるのかな?
うちは 2012SP1 です。




リフレッシュの問題はよくあるので、Refreshだか、SceneRefresh だかを入れてやらねばならないことはよくありますね。 SelectObj でも刺激になるというのは知りませんでしたが。

オブジェクトモデルだけだと刺激にならずにリフレッシュの問題があり、コマンドを入れるとそこが刺激になってちゃんとリフレッシュされるという挙動を見たこともありますので、その意味では SelectObj するのは正解かもしれないですね。



変数名は、多少長くなっても、意味・内容がちゃんとわかる名前になるよう、気をつけています。

投稿: junki | 2012年1月18日 (水) 22時36分

Hola!

なるほどですね。2012の方はもう直ってるってことかな。

残念ながらまだ2012を触っていません。今2つのプロジェクトでXSI7.01とSI2011SP2を使っています。

試してみたところで 7 にも 2011SP2 にもタイムラインの表示が更新されませんでした。
RefreshやSceneRefreshやDesktop.RedrawUIも駄目だったので、全部選択し直してみたらちゃんとキーフレームマークが消えました。

投稿: myara | 2012年1月19日 (木) 12時57分

ああっっ ほんとだっ

今ね、2011 SAP SP1 で試してみたら・・・・ おっしゃる通りですわ。再現しますた。
Fカーブエディタも、タイムラインの赤いマークも、表示が更新されません。
カーソルキーとかでカレントフレーム行ったり来たりした程度の刺激だと、やはり更新されませんね。
SelectObj で選択し直す1行を入れたら、ちゃんと更新されますた。



2011 までの不具合で、2012 から直っているということなんでしょうかね? オブジェクトモデルによるFカーブの操作がリフレッシュされない問題があった、ということなのかな? 

しかし、2012 で直っていますってのもなんだか XSI らしくないけどなあ。こういうの、3バージョンも4バージョンも放置されて、っていうか永遠に放置されて、今回の SelectObj みたいにユーザの工夫でどうにかなっているってのがこの馬鹿たれソフトウェアのパターンですからね。



ともかく、すんげえ有益な情報ありがとう。記事に追記しておきますね。
無茶っす暮らし明日網ー誤!


投稿: junki | 2012年1月19日 (木) 13時21分

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/217974/53765295

この記事へのトラックバック一覧です: キーフレーム殲滅でポン。:

« 新プリミティブ降臨。 | トップページ | 悲しみの対称複製そしてリネーム。 »