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

投稿者: | 2016/02/07

MaxScriptを使っていると、たまにUndoに記録されないコマンドがあります。

例えばスキン関係の操作をするskinOpsは、多くのコマンドがUndoスタックに記録されません。(2015現在)
そこで、今回はそういったコマンドをUndoスタックに記憶させる小技を紹介します。

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)
)

bakeSelectedVertsを追加しています。実は追加するコマンドは何でもよく、コマンド自体には何の意味もありません。(名前のとおり、本来は選択頂点のウェイトを、固有の値としてベイクするコマンドです。)

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

う~ん、この・・・。

残念ながらそれでも記録されないコマンドもありますが、多くの場合はうまくいきます。この問題で頭を悩ませる事になったら、一度試してみるといいかもしれません。

コメントを残す

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