Undoに記録出来ないコマンドを記録する

投稿者: | 2016/02/07

MaxScriptを使っていると、たまにUndoに記録されないコマンドがある事に気づくと思います。
例えばスキン関係の操作をするskinOpsは多くのコマンドがUndoスタックに記録されません。(3dsMax2015現在)
そこで今回はそういったUndoに記録されないコマンドを無理やり記録する方法を紹介します。
とは言っても、100%常に記録出来るわけではありませんが・・・。

undo "SetWeight" on
(
    theSkin = $.modifiers[#skin]
    skinOps.ReplaceVertexWeights theSkin 1 #(1) #(1.0)
)

この場合、ReplaceVertexWeightsはUndoスタックには記録されず、ユーザーは「戻る」操作を使えないので非常に不便です。

しかし以下のようにすると、何故かReplaceVertexWeightsもUndoに含まれるようになります。

undo "SetWeight" on 
(
    theSkin = $.modifiers[#skin]
    skinOps.bakeSelectedVerts theSkin
    skinOps.ReplaceVertexWeights theSkin 1 #(1) #(1.0)
)

つまるところ、Undoに記録される他のコマンドと、記録されないコマンドを同一のundo onコンテキストに含めてしまえば、何故か両方記録されるようになるのです。

う~ん、この・・・。

残念ながら100%全てのコマンドが記録されるようになるわけではありませんが、多くの場合記録されるようになるので、是非試してみる価値はあります。

ちなみに今回はUndo記録用にbakeSelectedVertsを使っていますが、これはUndoに記録されるskinOps内のコマンドで最も高速に動作するという理由からです。

自分もこの問題でかなり悩まされたので、誰かの参考になればいいなと。

コメントを残す

メールアドレスが公開されることはありません。