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コンテキストに含めてしまえば、何故か両方記録されるようになるのです。
う~ん、この・・・。
残念ながらそれでも記録されないコマンドもありますが、多くの場合はうまくいきます。この問題で頭を悩ませる事になったら、一度試してみるといいかもしれません。