X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FFeaturesPlugin%2FFeaturesPlugin_Recover.cpp;h=4bbfd76e858d294d47999b3f45cff366337897a5;hb=fa16bd63a969591127eea4d3959ca738d56d2e0f;hp=e521c3a296f4fb00d9a6fc1817c385df66313446;hpb=6aad2cb97127ef5663ff507d8e84b1c277c05a16;p=modules%2Fshaper.git diff --git a/src/FeaturesPlugin/FeaturesPlugin_Recover.cpp b/src/FeaturesPlugin/FeaturesPlugin_Recover.cpp index e521c3a29..4bbfd76e8 100644 --- a/src/FeaturesPlugin/FeaturesPlugin_Recover.cpp +++ b/src/FeaturesPlugin/FeaturesPlugin_Recover.cpp @@ -15,6 +15,7 @@ #include #include #include +#include FeaturesPlugin_Recover::FeaturesPlugin_Recover() { @@ -24,105 +25,54 @@ void FeaturesPlugin_Recover::initAttributes() { data()->addAttribute(BASE_FEATURE(), ModelAPI_AttributeReference::typeId()); data()->addAttribute(RECOVERED_ENTITIES(), ModelAPI_AttributeRefList::typeId()); - data()->addAttribute(PERSISTENT(), ModelAPI_AttributeBoolean::typeId()); - myPersistent = boolean(PERSISTENT())->value(); - synchronizeRegistered(); } void FeaturesPlugin_Recover::execute() { - synchronizeRegistered(); -} - -void FeaturesPlugin_Recover::attributeChanged(const std::string& theID) -{ - synchronizeRegistered(); -} - -void FeaturesPlugin_Recover::synchronizeRegistered() -{ - FeaturePtr aBase = baseFeature(); - bool aNewPersistent = boolean(PERSISTENT())->value(); - if (aNewPersistent != myPersistent || myCurrentBase != aBase) - clearRegistered(); + int aResultIndex = 0; + AttributeRefListPtr aRecovered = reflist(RECOVERED_ENTITIES()); + for(int anIndex = aRecovered->size() - 1; anIndex >= 0; anIndex--) { + ObjectPtr anObj = aRecovered->object(anIndex); + if (!anObj.get()) + continue; + ResultPtr aResult = std::dynamic_pointer_cast(anObj); + if (!aResult.get()) + continue; + GeomShapePtr aShape = aResult->shape(); + if (!aShape.get()) + continue; - std::set aRecoveredInList; - // add unconcealed which are not in the myRegistered map - if (isStable() && !isDisabled()) { // if unstable, clear any unconcealment effect - AttributeRefListPtr aRecovered = reflist(RECOVERED_ENTITIES()); - for(int anIndex = aRecovered->size() - 1; anIndex >= 0; anIndex--) { - ObjectPtr anObj = aRecovered->object(anIndex); - aRecoveredInList.insert(anObj); - if (myRegistered.find(anObj) == myRegistered.end()) { - // not found, so register a new - ResultPtr aRes = std::dynamic_pointer_cast(anObj); - if (aRes.get()) { // this may be on first update after "open" - ModelAPI_Session::get()->validators()->registerUnconcealment( - aRes, aNewPersistent ? FeaturePtr() : aBase); - myRegistered.insert(anObj); - } - } + // Copy shape. + GeomAlgoAPI_Copy aCopyAlgo(aShape); + // Check that algo is done. + if(!aCopyAlgo.isDone()) { + setError("Error: recover algorithm failed."); + return; } - } - // remove unconcealed which are not in the stored list, but in the map - std::set >::iterator aMyReg = myRegistered.begin(); - while(aMyReg != myRegistered.end()) { - if (aRecoveredInList.find(*aMyReg) == aRecoveredInList.end()) { - ResultPtr aRes = std::dynamic_pointer_cast(*aMyReg); - ModelAPI_Session::get()->validators()->disableUnconcealment( - aRes, aNewPersistent ? FeaturePtr() : myCurrentBase); - myRegistered.erase(aMyReg); - aMyReg = myRegistered.begin(); // restart iteration because after erase iterator may be bad - } else { - aMyReg++; + // Check if shape is not null. + if(!aCopyAlgo.shape().get() || aCopyAlgo.shape()->isNull()) { + setError("Error: resulting shape is null."); + return; + } + // Check that resulting shape is valid. + if(!aCopyAlgo.isValid()) { + setError("Error: resulting shape is not valid."); + return; } - } - myCurrentBase = aBase; - myPersistent = aNewPersistent; -} - -void FeaturesPlugin_Recover::erase() -{ - // clears myRegistered before all information is destroyed - clearRegistered(); - ModelAPI_Feature::erase(); -} - -bool FeaturesPlugin_Recover::setStable(const bool theFlag) -{ - bool aRes = ModelAPI_Feature::setStable(theFlag); - synchronizeRegistered(); - return aRes; -} - -bool FeaturesPlugin_Recover::setDisabled(const bool theFlag) -{ - bool aRes = ModelAPI_Feature::setDisabled(theFlag); - synchronizeRegistered(); - return aRes; -} -FeaturePtr FeaturesPlugin_Recover::baseFeature() -{ - // for the current moment it can be result of feature of feature: GUI is not debugged - ObjectPtr aBaseObj = reference(BASE_FEATURE())->value(); - FeaturePtr aResult; - if (aBaseObj.get() == NULL) - return aResult; - aResult = std::dynamic_pointer_cast(aBaseObj); - if (aResult.get() == NULL) - aResult = aBaseObj->document()->feature(std::dynamic_pointer_cast(aBaseObj)); - return aResult; -} + // Store result. + ResultBodyPtr aResultBody = document()->createBody(data(), aResultIndex); + aResultBody->store(aCopyAlgo.shape());//, aCopyAlgo.shape()); + std::shared_ptr aSubShapes = aCopyAlgo.mapOfSubShapes(); + // like in import: forget any history + int aTag(1); + std::string aNameMS = "Shape"; + aResultBody->loadFirstLevel(aCopyAlgo.shape(), aNameMS, aTag); -void FeaturesPlugin_Recover::clearRegistered() -{ - std::set >::iterator aMyReg = myRegistered.begin(); - for(; aMyReg != myRegistered.end(); aMyReg++) { - ResultPtr aRes = std::dynamic_pointer_cast(*aMyReg); - ModelAPI_Session::get()->validators()->disableUnconcealment( - aRes, myPersistent ? FeaturePtr() : myCurrentBase); + setResult(aResultBody, aResultIndex); + ++aResultIndex; } - myRegistered.clear(); + + removeResults(aResultIndex); }