App: fix pending object remove on recomputing

This commit is contained in:
Zheng, Lei
2020-01-04 17:22:52 +08:00
committed by Chris Hennes
parent fa918d3f7d
commit 156b6aa359
2 changed files with 13 additions and 6 deletions

View File

@@ -127,6 +127,7 @@ recompute path. Also, it enables more complicated dependencies beyond trees.
#include "Origin.h"
#include "OriginGroupExtension.h"
#include "Link.h"
#include "DocumentObserver.h"
#include "GeoFeature.h"
FC_LOG_LEVEL_INIT("App", true, true, true)
@@ -174,6 +175,7 @@ struct DocumentP
std::unordered_map<std::string,DocumentObject*> objectMap;
std::unordered_map<long,DocumentObject*> objectIdMap;
std::unordered_map<std::string, bool> partialLoadObjects;
std::vector<DocumentObjectT> pendingRemove;
long lastObjectId;
DocumentObject* activeObject;
Transaction *activeUndoTransaction;
@@ -3558,16 +3560,22 @@ int Document::recompute(const std::vector<App::DocumentObject*> &objs, bool forc
continue;
obj->setStatus(ObjectStatus::PendingRecompute,false);
obj->setStatus(ObjectStatus::Recompute2,false);
if(obj->testStatus(ObjectStatus::PendingRemove))
obj->getDocument()->removeObject(obj->getNameInDocument());
}
signalRecomputed(*this,topoSortedObjects);
FC_TIME_LOG(t,"Recompute total");
if (d->_RecomputeLog.size())
Base::Console().Log("Recompute failed! Please check report view.\n");
if(d->_RecomputeLog.size()) {
d->pendingRemove.clear();
Base::Console().Error("Recompute failed! Please check report view.\n");
} else {
for(auto &o : d->pendingRemove) {
auto obj = o.getObject();
if(obj)
obj->getDocument()->removeObject(obj->getNameInDocument());
}
}
return objectCount;
}
@@ -4097,7 +4105,7 @@ void Document::removeObject(const char* sName)
if (pos->second->testStatus(ObjectStatus::PendingRecompute)) {
// TODO: shall we allow removal if there is active undo transaction?
FC_LOG("pending remove of " << sName << " after recomputing document " << getName());
pos->second->setStatus(ObjectStatus::PendingRemove,true);
d->pendingRemove.emplace_back(pos->second);
return;
}