X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FModel%2FModel_Objects.cpp;h=54033a49b0e8c519d48f41d548692550fe8c5934;hb=refs%2Ftags%2FV_1.2.1;hp=6bab4002bb9c3049dc51a0e44afffadb4413fe85;hpb=7609663e2c64c56d63a327159033778ba24778e5;p=modules%2Fshaper.git diff --git a/src/Model/Model_Objects.cpp b/src/Model/Model_Objects.cpp index 6bab4002b..54033a49b 100644 --- a/src/Model/Model_Objects.cpp +++ b/src/Model/Model_Objects.cpp @@ -128,6 +128,7 @@ void Model_Objects::addFeature(FeaturePtr theFeature, const FeaturePtr theAfterT updateHistory(ModelAPI_Feature::group()); } else { // make feature has not-null data anyway theFeature->setData(Model_Data::invalidData()); + theFeature->setDoc(myDoc); } } @@ -217,6 +218,10 @@ void Model_Objects::removeFeature(FeaturePtr theFeature) aComposite->removeFeature(theFeature); } } + // this must be before erase since theFeature erasing removes all information about + // the feature results and groups of results + // To reproduce: create sketch, extrusion, remove sketch => constructions tree is not updated + clearHistory(theFeature); // erase fields theFeature->erase(); @@ -224,8 +229,6 @@ void Model_Objects::removeFeature(FeaturePtr theFeature) if (myFeatures.IsBound(aFeatureLabel)) myFeatures.UnBind(aFeatureLabel); - clearHistory(theFeature); - static Events_ID EVENT_DISP = Events_Loop::loop()->eventByName(EVENT_OBJECT_TO_REDISPLAY); ModelAPI_EventCreator::get()->sendUpdated(theFeature, EVENT_DISP); // erase all attributes under the label of feature @@ -249,8 +252,13 @@ void Model_Objects::clearHistory(ObjectPtr theObj) myHistory.erase(aHIter); // erase from map => this means that it is not synchronized if (theObj->groupName() == ModelAPI_Feature::group()) { // clear results group of the feature FeaturePtr aFeature = std::dynamic_pointer_cast(theObj); - if (aFeature->firstResult().get()) - clearHistory(aFeature->firstResult()); + std::string aResultGroup = featureResultGroup(aFeature); + if (!aResultGroup.empty()) { + std::map >::iterator aHIter = + myHistory.find(aResultGroup); + if (aHIter != myHistory.end()) + myHistory.erase(aHIter); // erase from map => this means that it is not synchronized + } } } } @@ -332,6 +340,9 @@ ObjectPtr Model_Objects::object(TDF_Label theLabel) ObjectPtr Model_Objects::object(const std::string& theGroupID, const int theIndex) { createHistory(theGroupID); + //TODO: mpv stabilization hotfix + if (myHistory[theGroupID].size() <= theIndex) + return ObjectPtr(); return myHistory[theGroupID][theIndex]; } @@ -753,6 +764,22 @@ std::shared_ptr Model_Objects::feature( return FeaturePtr(); } +std::string Model_Objects::featureResultGroup(FeaturePtr theFeature) +{ + if (theFeature->data()->isValid()) { + TDF_ChildIterator aLabIter(resultLabel(theFeature->data(), 0).Father()); + if (aLabIter.More()) { + TDF_Label anArgLab = aLabIter.Value(); + Handle(TDataStd_Comment) aGroup; + if (aLabIter.Value().FindAttribute(TDataStd_Comment::GetID(), aGroup)) { + return TCollection_AsciiString(aGroup->Get()).ToCString(); + } + } + } + static std::string anEmpty; + return anEmpty; // not found +} + void Model_Objects::updateResults(FeaturePtr theFeature) { // for not persistent is will be done by parametric updater automatically