Python を使ってアクションスタックを確認するには hou.undos モジュールが使えます。
できる機能は非常に最小限ですが、Python を使っての Undo と Redo のほか、Python から追加したアクションにタグを付けて 1つのグループにすることもできます。
areEnabled() → bool
undos が現在有効になっていれば、True を返します。
通常では有効のままのため True を返しますが、undoctrl などで無効化されていれば False を返します。
disabler() → hou.UndosDisabler
コンテキストマネージャを返します。この範囲内の Houdini への変更は、undo スタックに追加されません。
下図は obj 下のノードすべてを左に動かす関数ですが、どれだけ実行しても Undo History に履歴が残ることはありません。
下図は obj 下のノードすべてを左に動かす関数ですが、どれだけ実行しても Undo History に履歴が残ることはありません。
group(label) → hou.UndosGroup
コンテキストマネージャを返します。この範囲内の Houdini への変更は、undo スタックの単一アクションとして記録されます。
このメソッドを使ったアクションは履歴が残ります。 Undo History で確認する場合 label で定義した文字列が表示されます。
このメソッドを使ったアクションは履歴が残ります。 Undo History で確認する場合 label で定義した文字列が表示されます。
clear()
すべての undo と redo の情報をクリアします。
Python から追加したアクションかどうかに関わらずすべてを削除します。
Python から追加したアクションかどうかに関わらずすべてを削除します。
add(undo, label, tag=None)
Undo History に undo 操作を追加します。 undoには、undo() や redo() のメソッドを持ったオブジェクトを指定してください。 操作が Undo された時に undo() メソッドが実行され、操作が Redo されたときに redo() メソッドが実行されます。
たとえば以下のようにクラスを定義しそのクラスオブジェクト foo を引数にして add() を呼び出します。すると Undo History に一つ追加されその名前は label で指定した文字列と同じになります。
この My Undo を選択した状態で Undo History 下部の Undo Selected を選択すると Redos に移動し、先ほど定義した MyUndoClass.undo() メソッドが実行されます。
同様に Redo すると MyUndoClass.redo() メソッドが実行されます。
後述の removeUndos() で使う用に、オプションで文字列タグを設定することができます。指定しなければタグは無しで生成されます。
removeUndos(tag)
tag のタグが付いたすべての undo を無効化して削除します。
たとえば前述の add() を使って タグありとタグなしの Undo を作り、
mytag をタグに持つ Undo を削除するとその Undo だけが削除されます。
memoryUsage() → int
undo で使われている現在のメモリ(バイト単位)。
memoryUsageLimit() → int
undo の最大許容メモリ使用サイズ(バイト単位)。
100,000 kB に相当します。
performUndo()
最後のアクションを undo します。
たとえば下図のように Undo History が構成されている場合、アクションは一番下が古く一番上が最新としてスタックされるため、performUndo() を呼び出すと My Undo 9 が Undo されます。
実際に performUndo() を実行すると My Undo 9 が Redos に移りました。
MyUndoClass.undo() が呼び出され(MyUndoClass.undo is called を出力)、メソッドが正常に実行されたため True を返しています。Undo History が空の状態で呼び出すと False を返します。
performRedo()
最後に undo したアクションを redo します。
処理は performUndo() と同じです。
undoLabels()
現在の undo オペレーションのタプルをスタックに用意します。最初のアイテム(つまり、undoLabels()[0])は、undo される次のオペレーションであることに注意してください。
redoLabels()
現在の redo オペレーションのタプルをスタックに用意します。最初のアイテム(つまり、redoLabels()[0])は、redo される次のオペレーションであることに注意してください。
処理は undoLabels() を同じです。
C++ バックエンドは UT_UndoManager です。 UTgetUndoManager() 関数を使用して、singleton undo manager オブジェクトを取得できます。