- // after all updates, sends a message that groups of features were created or updated
- boost::static_pointer_cast<Model_PluginManager>(Model_PluginManager::get())->
- setCheckTransactions(false);
- Events_Loop::loop()->flush(Events_Loop::eventByName(EVENT_OBJECT_CREATED));
- if (theMarkUpdated)
- Events_Loop::loop()->flush(Events_Loop::eventByName(EVENT_OBJECT_UPDATED));
- Events_Loop::loop()->flush(Events_Loop::eventByName(EVENT_OBJECT_DELETED));
- boost::static_pointer_cast<Model_PluginManager>(Model_PluginManager::get())->
- setCheckTransactions(true);
+ // execute new features to restore results: after features creation to make all references valid
+ /*std::set<FeaturePtr>::iterator aNewIter = aNewFeatures.begin();
+ for(; aNewIter != aNewFeatures.end(); aNewIter++) {
+ (*aNewIter)->execute();
+ }*/
+ // check all features are checked: if not => it was removed
+ NCollection_DataMap<TDF_Label, FeaturePtr>::Iterator aFIter(myObjs);
+ while (aFIter.More()) {
+ if (aKeptFeatures.find(aFIter.Value()) == aKeptFeatures.end()
+ && aNewFeatures.find(aFIter.Value()) == aNewFeatures.end()) {
+ FeaturePtr aFeature = aFIter.Value();
+ // event: model is updated
+ //if (aFeature->isInHistory()) {
+ ModelAPI_EventCreator::get()->sendDeleted(aThis, ModelAPI_Feature::group());
+ //}
+ // results of this feature must be redisplayed (hided)
+ static Events_ID EVENT_DISP = aLoop->eventByName(EVENT_OBJECT_TO_REDISPLAY);
+ const std::list<boost::shared_ptr<ModelAPI_Result> >& aResults = aFeature->results();
+ std::list<boost::shared_ptr<ModelAPI_Result> >::const_iterator aRIter = aResults.begin();
+ /*
+ for (; aRIter != aResults.cend(); aRIter++) {
+ boost::shared_ptr<ModelAPI_Result> aRes = *aRIter;
+ //aRes->setData(boost::shared_ptr<ModelAPI_Data>()); // deleted flag
+ ModelAPI_EventCreator::get()->sendUpdated(aRes, EVENT_DISP);
+ ModelAPI_EventCreator::get()->sendDeleted(aThis, aRes->groupName());
+ }
+ */
+ // redisplay also removed feature (used for sketch and AISObject)
+ ModelAPI_EventCreator::get()->sendUpdated(aFeature, EVENT_DISP);
+ aFeature->erase();
+ // unbind after the "erase" call: on abort sketch is removes sub-objects that corrupts aFIter
+ TDF_Label aLab = aFIter.Key();
+ aFIter.Next();
+ myObjs.UnBind(aLab);
+ } else
+ aFIter.Next();
+ }
+
+ myExecuteFeatures = false;
+ aLoop->activateFlushes(true);
+
+ aLoop->flush(Events_Loop::eventByName(EVENT_OBJECT_CREATED));
+ aLoop->flush(Events_Loop::eventByName(EVENT_OBJECT_DELETED));
+ if (theMarkUpdated) {
+ aLoop->flush(Events_Loop::eventByName(EVENT_OBJECT_UPDATED));
+ }
+ aLoop->flush(Events_Loop::eventByName(EVENT_OBJECT_TO_REDISPLAY));
+ boost::static_pointer_cast<Model_Session>(Model_Session::get())
+ ->setCheckTransactions(true);
+ myExecuteFeatures = true;
+}
+
+TDF_Label Model_Document::resultLabel(
+ const boost::shared_ptr<ModelAPI_Data>& theFeatureData, const int theResultIndex)
+{
+ const boost::shared_ptr<Model_Data>& aData =
+ boost::dynamic_pointer_cast<Model_Data>(theFeatureData);
+ return aData->label().Father().FindChild(TAG_FEATURE_RESULTS).FindChild(theResultIndex + 1);