The problem is that inside Transaction::addObjectNew() a transaction object is deleted before removing it from the container. When deleting the corresponding transactional object (i.e. a DocumentObject or ViewProvider)
it can happen that it e.g. calls Transaction::addOrRemoveProperty() that now finds the dangling pointer in the container.
The safe way is to first remove the object from the container before deleting it.
* Part: fix Placement/Shape onChanged() handling
* App: fix property ordering problem when undo/redo
See https://tracker.freecadweb.org/view.php?id=4265#c14271
* Gui: fix undo/redo signaling
Make sure to signal after all properties has been restored
Introduce a new concept of transaction ID. Each transaction must be
unique inside the document. Multiple transactions from different
documents can be grouped together with the same transaction ID.
This makes it possible to undo/redo single operation that contains
changes from multiple documents due to external linking.
Application:
* get/set/closeActiveTransaction() is used to setup potential
transactions with a given name. The transaction is only created when
there is actual changes. If objects from multiple documents are
changed under the same active transaction, they will have the same
trasnaction ID, and can be undo/redo togtether later.
* signalUndo/signalRedo, new signals triggered once after an undo/redo
operation. Unlike signalUndo/RedoDocument, these signals will only be
triggered once even if there may be multiple documents involved during
undo/redo.
* signal(Before)CloseTransaction, new signals triggered before/after an
actual transaction is created or aborted.
AutoTransaction:
* Helper class to enable automatic management of transactions. See class
document for more details. This class will be used by Gui::Command
in later patches to allow better automation of transactions in
command.
Document:
* open/commit/abortTransaction() are now redirected to call
Application::get/set/closeActiveTransaction() instead.
* _openTransaction() is added to do the real creation of transaction.
* _checkTransaction() is modified to create transaction on actual change
of any property.
* getTransactionID() is used to find out the position of a transaction
with a given ID. When triggering undo in external document, it may be
necessary to perform multi-step undo/redo in order to match for the
transaction ID.
Transaction/TransactionObject:
* Various changes for the new transaction ID concept.
* Support undo/redo add/remove dynamic property