X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FModel%2FModel_Objects.cpp;h=b30356fffe7c4449f063a15733bfd1930b54c124;hb=dc19b4c930a9c2cf5db509fc81586deab00e7417;hp=71f28a123d01ec6dfdb7bf9e01d58f71b17d32a4;hpb=d19a991cefc08d756ffc2edb03085e0329e333ae;p=modules%2Fshaper.git diff --git a/src/Model/Model_Objects.cpp b/src/Model/Model_Objects.cpp index 71f28a123..b30356fff 100644 --- a/src/Model/Model_Objects.cpp +++ b/src/Model/Model_Objects.cpp @@ -63,16 +63,23 @@ Model_Objects::~Model_Objects() // delete all features of this document Events_Loop* aLoop = Events_Loop::loop(); // erase one by one to avoid access from the feature destructor itself from he map + // blocks the flush signals to avoid the temporary objects visualization in the viewer + // they should not be shown in order to do not lose highlight by erasing them + bool isActive = aLoop->activateFlushes(false); + while(!myFeatures.IsEmpty()) { NCollection_DataMap::Iterator aFeaturesIter(myFeatures); FeaturePtr aFeature = aFeaturesIter.Value(); static Events_ID EVENT_DISP = aLoop->eventByName(EVENT_OBJECT_TO_REDISPLAY); ModelAPI_EventCreator::get()->sendDeleted(myDoc, ModelAPI_Feature::group()); ModelAPI_EventCreator::get()->sendUpdated(aFeature, EVENT_DISP); - aFeature->eraseResults(); + aFeature->removeResults(0, false); + //aFeature->eraseResults(); aFeature->erase(); myFeatures.UnBind(aFeaturesIter.Key()); } + aLoop->activateFlushes(isActive); + aLoop->flush(Events_Loop::eventByName(EVENT_OBJECT_UPDATED)); aLoop->flush(Events_Loop::eventByName(EVENT_OBJECT_DELETED)); aLoop->flush(Events_Loop::eventByName(EVENT_OBJECT_TO_REDISPLAY)); @@ -178,14 +185,14 @@ void Model_Objects::refsToFeature(FeaturePtr theFeature, // check the feature: it must have no depended objects on it // the dependencies can be in the feature results std::list::const_iterator aResIter = theFeature->results().cbegin(); - for(; aResIter != theFeature->results().cend(); aResIter++) { + for (; aResIter != theFeature->results().cend(); aResIter++) { ResultPtr aResult = (*aResIter); std::shared_ptr aData = - std::dynamic_pointer_cast(aResult->data()); + std::dynamic_pointer_cast(aResult->data()); if (aData.get() != NULL) { const std::set& aRefs = aData->refsToMe(); std::set::const_iterator aRefIt = aRefs.begin(), aRefLast = aRefs.end(); - for(; aRefIt != aRefLast; aRefIt++) { + for (; aRefIt != aRefLast; aRefIt++) { FeaturePtr aFeature = std::dynamic_pointer_cast((*aRefIt)->owner()); if (aFeature.get() != NULL) theRefs.insert(aFeature); @@ -198,7 +205,7 @@ void Model_Objects::refsToFeature(FeaturePtr theFeature, if (aData && !aData->refsToMe().empty()) { const std::set& aRefs = aData->refsToMe(); std::set::const_iterator aRefIt = aRefs.begin(), aRefLast = aRefs.end(); - for(; aRefIt != aRefLast; aRefIt++) { + for (; aRefIt != aRefLast; aRefIt++) { FeaturePtr aFeature = std::dynamic_pointer_cast((*aRefIt)->owner()); if (aFeature.get() != NULL) theRefs.insert(aFeature); @@ -297,8 +304,11 @@ void Model_Objects::moveFeature(FeaturePtr theMoved, FeaturePtr theAfterThis) aRefs->SetInternalArray(aNewArray); // update the feature and the history clearHistory(theMoved); + // make sure all (selection) attributes of moved feature will be updated + theMoved->data()->setUpdateID(0); static Events_ID EVENT_UPD = Events_Loop::loop()->eventByName(EVENT_OBJECT_UPDATED); ModelAPI_EventCreator::get()->sendUpdated(theMoved, EVENT_UPD); + ModelAPI_EventCreator::get()->sendReordered(theMoved->document(), theMoved->groupName()); } void Model_Objects::clearHistory(ObjectPtr theObj) @@ -475,9 +485,10 @@ void Model_Objects::allResults(const std::string& theGroupID, std::listgroupName() != theGroupID) break; // feature have only same group results - if (aRes->isInHistory() && !aRes->isConcealed()) { + // iterate also concealed: ALL RESULTS (for translation parts undo/redo management) + //if (aRes->isInHistory() && !aRes->isConcealed()) { theResults.push_back(*aRIter); - } + //} } } } @@ -601,6 +612,16 @@ void Model_Objects::synchronizeFeatures( aKeptFeatures.insert(aFeature); if (anUpdatedMap.Contains(aFeatureLabel)) { ModelAPI_EventCreator::get()->sendUpdated(aFeature, anUpdateEvent); + if (aFeature->getKind() == "Parameter") { // if parameters are changed, update the results (issue 937) + const std::list >& aResults = aFeature->results(); + std::list >::const_iterator aRIter = aResults.begin(); + for (; aRIter != aResults.cend(); aRIter++) { + std::shared_ptr aRes = *aRIter; + if (aRes->data()->isValid() && !aRes->isDisabled()) { + ModelAPI_EventCreator::get()->sendUpdated(aRes, anUpdateEvent); + } + } + } } } } @@ -777,7 +798,8 @@ void Model_Objects::storeResult(std::shared_ptr theFeatureData, if (theResult->data()->name().empty()) { // if was not initialized, generate event and set a name std::stringstream aNewName; aNewName<name(); - if (theResultIndex > 0) // if there are several results, add unique prefix starting from second + // if there are several results (issue #899: any number of result), add unique prefix starting from second + if (theResultIndex > 0 || theResult->groupName() == ModelAPI_ResultBody::group()) aNewName<<"_"<data()->setName(aNewName.str()); } @@ -931,7 +953,8 @@ void Model_Objects::updateResults(FeaturePtr theFeature) while(aResIter != theFeature->results().cend()) { ResultPtr aBody = std::dynamic_pointer_cast(*aResIter); if (aBody.get()) { - if (!aBody->data()->isValid()) { + std::shared_ptr aData = std::dynamic_pointer_cast(aBody->data()); + if (!aData.get() || !aData->isValid() || (!aBody->isDisabled() && aData->isDeleted())) { // found a disappeared result => remove it theFeature->eraseResultFromList(aBody); // start iterate from beginning because iterator is corrupted by removing @@ -977,7 +1000,7 @@ void Model_Objects::updateResults(FeaturePtr theFeature) TCollection_AsciiString(aGroup->Get()).ToCString()); } } - if (aNewBody) { + if (aNewBody && !aNewBody->data()->isDeleted()) { theFeature->setResult(aNewBody, aResIndex); } }