From 4c8fadd68d889927c246eda55bd895e2d48f2d03 Mon Sep 17 00:00:00 2001 From: PaddleStroke Date: Tue, 6 May 2025 19:02:35 +0200 Subject: [PATCH] Core: restoreContent not restoring expressions (#21152) --- src/App/DocumentObject.cpp | 14 ++++++++++++++ src/App/DocumentObject.h | 2 ++ src/Mod/Sketcher/App/SketchObject.cpp | 8 +++++++- src/Mod/Sketcher/App/SketchObject.h | 1 + 4 files changed, 24 insertions(+), 1 deletion(-) diff --git a/src/App/DocumentObject.cpp b/src/App/DocumentObject.cpp index f8d1228372..daa1e4fe6c 100644 --- a/src/App/DocumentObject.cpp +++ b/src/App/DocumentObject.cpp @@ -1215,6 +1215,20 @@ void DocumentObject::onDocumentRestored() } } +void DocumentObject::restoreFinished() +{ + // some link type property cannot restore link information until other + // objects has been restored. For example, PropertyExpressionEngine and + // PropertySheet with expression containing label reference. + // So on document load they are handled in Document::afterRestore, but if the user + // use dumpContent and restoreContent then they need to be handled here. + std::vector props; + getPropertyList(props); + for (auto prop : props) { + prop->afterRestore(); + } +} + void DocumentObject::onUndoRedoFinished() {} diff --git a/src/App/DocumentObject.h b/src/App/DocumentObject.h index bd62977774..6eefea054a 100644 --- a/src/App/DocumentObject.h +++ b/src/App/DocumentObject.h @@ -752,6 +752,8 @@ protected: void onEarlyChange(const Property* prop) override; /// get called after a document has been fully restored virtual void onDocumentRestored(); + /// get called after an object finishes restoreContent. + void restoreFinished() override; /// get called after an undo/redo transaction is finished virtual void onUndoRedoFinished(); /// get called after setting the document diff --git a/src/Mod/Sketcher/App/SketchObject.cpp b/src/Mod/Sketcher/App/SketchObject.cpp index 621a48bd80..0cec70f7ff 100644 --- a/src/Mod/Sketcher/App/SketchObject.cpp +++ b/src/Mod/Sketcher/App/SketchObject.cpp @@ -10368,7 +10368,7 @@ bool SketchObject::getBlockedState(const Constraint* cstr, bool& blockedstate) c void SketchObject::onDocumentRestored() { try { - restoreFinished(); + onSketchRestore(); Part::Part2DObject::onDocumentRestored(); } catch (...) { @@ -10376,6 +10376,12 @@ void SketchObject::onDocumentRestored() } void SketchObject::restoreFinished() +{ + App::DocumentObject::restoreFinished(); + onSketchRestore(); +} + +void SketchObject::onSketchRestore() { try { migrateSketch(); diff --git a/src/Mod/Sketcher/App/SketchObject.h b/src/Mod/Sketcher/App/SketchObject.h index 2b486aaed1..7e70270427 100644 --- a/src/Mod/Sketcher/App/SketchObject.h +++ b/src/Mod/Sketcher/App/SketchObject.h @@ -917,6 +917,7 @@ protected: void onDocumentRestored() override; void restoreFinished() override; + void onSketchRestore(); std::string validateExpression(const App::ObjectIdentifier& path, std::shared_ptr expr);