diff --git a/src/App/Document.cpp b/src/App/Document.cpp index b5764ec372..527382ce90 100644 --- a/src/App/Document.cpp +++ b/src/App/Document.cpp @@ -2867,6 +2867,9 @@ void Document::_removeObject(DocumentObject* pcObject) void Document::breakDependency(DocumentObject* pcObject, bool clear) { // Nullify all dependent objects + std::vector docObjs; + pcObject->ExpressionEngine.getDocumentObjectDeps(docObjs); + for (std::map::iterator it = d->objectMap.begin(); it != d->objectMap.end(); ++it) { std::map Map; it->second->getPropertyMap(Map); @@ -2929,6 +2932,14 @@ void Document::breakDependency(DocumentObject* pcObject, bool clear) } } } + + if (std::find(docObjs.begin(), docObjs.end(), it->second) != docObjs.end()) { + std::vector paths; + pcObject->ExpressionEngine.getPathsToDocumentObject(it->second, paths); + for (std::vector::iterator jt = paths.begin(); jt != paths.end(); ++jt) { + pcObject->ExpressionEngine.setValue(*jt, nullptr); + } + } } } diff --git a/src/App/PropertyExpressionEngine.cpp b/src/App/PropertyExpressionEngine.cpp index 573cf9a5b3..13013f3691 100644 --- a/src/App/PropertyExpressionEngine.cpp +++ b/src/App/PropertyExpressionEngine.cpp @@ -680,6 +680,44 @@ void PropertyExpressionEngine::getDocumentObjectDeps(std::vector & paths) const +{ + DocumentObject * owner = freecad_dynamic_cast(getContainer()); + + if (owner == 0) + return; + + ExpressionMap::const_iterator i = expressions.begin(); + + while (i != expressions.end()) { + std::set deps; + + i->second.expression->getDeps(deps); + + std::set::const_iterator j = deps.begin(); + + while (j != deps.end()) { + const ObjectIdentifier & p = *j; + DocumentObject* docObj = p.getDocumentObject(); + + if (docObj == obj && docObj != owner) { + paths.push_back(i->first); + break; + } + + ++j; + } + ++i; + } +} + /** * @brief Determine whether any dependencies of any of the registered expressions have been touched. * @return True if at least on dependency has been touched. diff --git a/src/App/PropertyExpressionEngine.h b/src/App/PropertyExpressionEngine.h index ee9dbe7406..c07dbf1752 100644 --- a/src/App/PropertyExpressionEngine.h +++ b/src/App/PropertyExpressionEngine.h @@ -101,6 +101,8 @@ public: void getDocumentObjectDeps(std::vector & docObjs) const; + void getPathsToDocumentObject(DocumentObject*, std::vector & paths) const; + bool depsAreTouched() const; boost::unordered_map getExpressions() const;