The undo / redo system is managed by a global instance of the Hold
class called theHold
. To use the undo / redo system the developer must derive a class from RestoreObj
and register an instance with the theHold
using the method theHold::Put()
. The class derived from RestoreObj
saves the data needed to undo and redo the operation of the plug-in and to implement several methods required by 3ds Max.
Any operation that modifies the scene state should check to see if theHold
is 'holding'. This means the 3ds Max undo system has had the Begin()
method called. If theHold
is not 'holding' and the code is UI code, the developer should call theHold
. Begin(). This signals the start of a potential undo operation. Otherwise, non-UI code does not need to check to see if theHold
is holding before calling theHold
. Begin(). The hold system knows how to deal with nested Begin/Accept calls.
Methods exposed using the function publishing system should not call theHold
. Begin(). Otherwise, if the caller has not called theHold
. Begin(), each call to the method would create an undo entry, but other operations being done by the caller would not.
If theHold
is holding, any operation that modifies the scene state must register a restore object with the system before it modifies the scene state.
Note that you should check to make sure you are holding before creating a RestoreObj and Putting it to the hold system. Otherwise, you may try to do a Put when not holding, causing a memory violation.
For the difference between a set of nested Begin/Accepts and a SuperBegin/Begin/Accept/SuperAccept consider the following pseudo-code examples:
Begin
Put( a )
Begin
Put( b )
Cancel
Put( c )
Accept
and
SuperBegin
Put ( a )
Begin
Put ( b )
Cancel
Put ( c )
SuperAccept
In the first example, the Cancel
call deletes both RestoreObjs
A and B. In the second, only RestoreObj
B is deleted. The only time you need to use SuperBegin
is when you have a multistage operation, and individual stages of the operation may be cancelled without cancelling the entire operation.