From: mpv Date: Wed, 20 May 2015 07:24:58 +0000 (+0300) Subject: Update mechanism for the current and old features X-Git-Tag: V_1.2.0~141 X-Git-Url: http://git.salome-platform.org/gitweb/?a=commitdiff_plain;h=7f8253a796c0b4085b8011f64f24d398d158e9c4;p=modules%2Fshaper.git Update mechanism for the current and old features --- diff --git a/src/Model/Model_ResultBody.cpp b/src/Model/Model_ResultBody.cpp index 9b639f9a7..00a3871e0 100644 --- a/src/Model/Model_ResultBody.cpp +++ b/src/Model/Model_ResultBody.cpp @@ -58,6 +58,45 @@ void Model_ResultBody::colorConfigInfo(std::string& theSection, std::string& the theDefault = DEFAULT_COLOR(); } +// Converts evolution of naming shape to selection evelution and back to avoid +// naming support on the disabled results. Deeply in the labels tree, recursively. +static void EvolutionToSelection(TDF_Label theLab, const bool theFlag) { + std::list > aShapePairs; // to store old and new shapes + Handle(TNaming_NamedShape) aName; + int anEvolution = -1; + if (theLab.FindAttribute(TNaming_NamedShape::GetID(), aName)) { + anEvolution = (int)(aName->Evolution()); + for(TNaming_Iterator anIter(aName); anIter.More(); anIter.Next()) { + aShapePairs.push_back(std::pair + (anIter.OldShape(), anIter.NewShape())); + } + } + // remove old + theLab.ForgetAttribute(TNaming_NamedShape::GetID()); + // create new + TNaming_Builder aBuilder(theLab); + TNaming_Evolution anEvol = (TNaming_Evolution)(anEvolution); + std::list >::iterator aPairsIter = aShapePairs.begin(); + for(; aPairsIter != aShapePairs.end(); aPairsIter++) { + if (theFlag) { // disabled => make selection + aBuilder.Select(aPairsIter->first, aPairsIter->second); + } else if (anEvol == TNaming_GENERATED) { + aBuilder.Generated(aPairsIter->first, aPairsIter->second); + } else if (anEvol == TNaming_MODIFY) { + aBuilder.Modify(aPairsIter->first, aPairsIter->second); + } else if (anEvol == TNaming_DELETE) { + aBuilder.Delete(aPairsIter->first); + } else if (anEvol == TNaming_PRIMITIVE) { + aBuilder.Generated(aPairsIter->first, aPairsIter->second); + } + } + // recursive call for all sub-labels + TDF_ChildIterator anIter(theLab, Standard_False); + for(; anIter.More(); anIter.Next()) { + EvolutionToSelection(anIter.Value(), theFlag); + } +} + bool Model_ResultBody::setDisabled(std::shared_ptr theThis, const bool theFlag) { bool aChanged = ModelAPI_ResultBody::setDisabled(theThis, theFlag); @@ -66,32 +105,7 @@ bool Model_ResultBody::setDisabled(std::shared_ptr theThis, con if (!aData) // unknown case return aChanged; TDF_Label& aShapeLab = aData->shapeLab(); - - std::list > aShapePairs; // to store old and new shapes - Handle(TNaming_NamedShape) aName; - int anEvolution = -1; - if (aShapeLab.FindAttribute(TNaming_NamedShape::GetID(), aName)) { - anEvolution = (int)(aName->Evolution()); - for(TNaming_Iterator anIter(aName); anIter.More(); anIter.Next()) { - aShapePairs.push_back(std::pair - (anIter.OldShape(), anIter.NewShape())); - } - } - // remove old - aShapeLab.ForgetAttribute(TNaming_NamedShape::GetID()); - // create new - TNaming_Builder aBuilder(aShapeLab); - TNaming_Evolution anEvol = (TNaming_Evolution)(anEvolution); - std::list >::iterator aPairsIter = aShapePairs.begin(); - for(; aPairsIter != aShapePairs.end(); aPairsIter++) { - if (theFlag) { // disabled => make selection - aBuilder.Select(aPairsIter->first, aPairsIter->second); - } else if (anEvol == TNaming_GENERATED) { - aBuilder.Generated(aPairsIter->first, aPairsIter->second); - } else if (anEvol == TNaming_MODIFY) { - aBuilder.Modify(aPairsIter->first, aPairsIter->second); - } - } + EvolutionToSelection(aShapeLab, theFlag); } return aChanged; } diff --git a/src/Model/Model_Update.cpp b/src/Model/Model_Update.cpp index c560fa4ba..30abf9ddf 100644 --- a/src/Model/Model_Update.cpp +++ b/src/Model/Model_Update.cpp @@ -362,6 +362,8 @@ void Model_Update::updateFeature(FeaturePtr theFeature) if (aFactory->validate(theFeature)) { if (myIsAutomatic || (myJustCreated.find(theFeature) != myJustCreated.end() || + (myJustUpdated.find(theFeature) != myJustUpdated.end() && + theFeature == theFeature->document()->currentFeature(false)) || // currently edited !theFeature->isPersistentResult() /* execute quick, not persistent results */)) { if (aState == ModelAPI_StateDone || aState == ModelAPI_StateMustBeUpdated) {