From 3446cb8660c15c5d12444cbafe9877c5bc9a6bdb Mon Sep 17 00:00:00 2001 From: Pieter Hijma Date: Fri, 8 Aug 2025 15:00:43 +0200 Subject: [PATCH] Core: Add logic for updating exprs on prop rename --- src/App/DocumentObject.cpp | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/src/App/DocumentObject.cpp b/src/App/DocumentObject.cpp index b21509cbe0..cf572492fb 100644 --- a/src/App/DocumentObject.cpp +++ b/src/App/DocumentObject.cpp @@ -32,16 +32,17 @@ #include #endif -#include #include #include #include #include +#include "Expression.h" #include "Application.h" #include "ElementNamingUtils.h" #include "Document.h" #include "DocumentObject.h" +#include "DocumentObjectPy.h" #include "DocumentObjectExtension.h" #include "DocumentObjectGroup.h" #include "GeoFeatureGroupExtension.h" @@ -715,10 +716,33 @@ bool DocumentObject::removeDynamicProperty(const char* name) bool DocumentObject::renameDynamicProperty(Property* prop, const char* name) { std::string oldName = prop->getName(); + + auto expressions = ExpressionEngine.getExpressions(); + std::vector> expressionsToMove; + std::vector idsWithExprsToRemove; + + for (const auto& [id, expr] : expressions) { + if (id.getProperty() == prop) { + idsWithExprsToRemove.push_back(id); + expressionsToMove.emplace_back(expr->copy()); + } + } + + for (const auto& it : idsWithExprsToRemove) { + ExpressionEngine.setValue(it, std::shared_ptr()); + } + bool renamed = TransactionalObject::renameDynamicProperty(prop, name); if (renamed && _pDoc) { _pDoc->renamePropertyOfObject(this, prop, oldName.c_str()); } + + + App::ObjectIdentifier idNewProp(prop->getContainer(), std::string(name)); + for (auto& exprToMove : expressionsToMove) { + ExpressionEngine.setValue(idNewProp, exprToMove); + } + return renamed; }