X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FModel%2FModel_Objects.cpp;h=b30356fffe7c4449f063a15733bfd1930b54c124;hb=dc19b4c930a9c2cf5db509fc81586deab00e7417;hp=49e922a804d8cb4a2cab873bcdf69955d2e01b77;hpb=b14d19b6b3653386e498f107e76ee37784fb4d94;p=modules%2Fshaper.git diff --git a/src/Model/Model_Objects.cpp b/src/Model/Model_Objects.cpp index 49e922a80..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); + } + } + } } } } @@ -664,6 +685,8 @@ void Model_Objects::synchronizeFeatures( aLoop->flush(aCreateEvent); aLoop->flush(aDeleteEvent); aLoop->flush(anUpdateEvent); + aLoop->flush(aCreateEvent); // after update of features, there could be results created + aLoop->flush(aDeleteEvent); // or deleted aLoop->flush(aRedispEvent); aLoop->flush(aToHideEvent); } @@ -688,10 +711,24 @@ void Model_Objects::synchronizeBackRefs() for (; aRIter != aResults.cend(); aRIter++) { std::shared_ptr aResData = std::dynamic_pointer_cast((*aRIter)->data()); - if (aResData) { + if (aResData.get()) { aConcealed.push_back(std::pair(*aRIter, (*aRIter)->isConcealed())); aResData->eraseBackReferences(); } + // iterate sub-bodies of compsolid + ResultCompSolidPtr aComp = std::dynamic_pointer_cast(*aRIter); + if (aComp.get()) { + int aNumSub = aComp->numberOfSubs(); + for(int a = 0; a < aNumSub; a++) { + ResultPtr aSub = aComp->subResult(a); + std::shared_ptr aResData = + std::dynamic_pointer_cast(aSub->data()); + if (aResData.get()) { + aConcealed.push_back(std::pair(aSub, aSub->isConcealed())); + aResData->eraseBackReferences(); + } + } + } } } @@ -761,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()); } @@ -915,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 @@ -961,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); } } @@ -997,7 +1036,8 @@ FeaturePtr Model_Objects::nextFeature(FeaturePtr theCurrent, const bool theRever Handle(TDataStd_ReferenceArray) aRefs; if (featuresLabel().FindAttribute(TDataStd_ReferenceArray::GetID(), aRefs)) { for(int a = aRefs->Lower(); a <= aRefs->Upper(); a++) { // iterate all existing features - if (aRefs->Value(a).IsEqual(aFeatureLabel)) { + TDF_Label aCurLab = aRefs->Value(a); + if (aCurLab.IsEqual(aFeatureLabel)) { a += theReverse ? -1 : 1; if (a >= aRefs->Lower() && a <= aRefs->Upper()) return feature(aRefs->Value(a)); @@ -1027,6 +1067,31 @@ FeaturePtr Model_Objects::lastFeature() return FeaturePtr(); // no features at all } +bool Model_Objects::isLater(FeaturePtr theLater, FeaturePtr theCurrent) const +{ + std::shared_ptr aLaterD = std::static_pointer_cast(theLater->data()); + std::shared_ptr aCurrentD = std::static_pointer_cast(theCurrent->data()); + if (aLaterD && aLaterD->isValid() && aCurrentD && aCurrentD->isValid()) { + TDF_Label aLaterL = aLaterD->label().Father(); + TDF_Label aCurrentL = aCurrentD->label().Father(); + int aLaterI = -1, aCurentI = -1; // not found yet state + Handle(TDataStd_ReferenceArray) aRefs; + if (featuresLabel().FindAttribute(TDataStd_ReferenceArray::GetID(), aRefs)) { + for(int a = aRefs->Lower(); a <= aRefs->Upper(); a++) { // iterate all existing features + TDF_Label aCurLab = aRefs->Value(a); + if (aCurLab.IsEqual(aLaterL)) { + aLaterI = a; + } else if (aCurLab.IsEqual(aCurrentL)) { + aCurentI = a; + } else continue; + if (aLaterI != -1 && aCurentI != -1) // both are found + return aLaterI > aCurentI; + } + } + } + return false; // not found, or something is wrong +} + std::list > Model_Objects::allFeatures() { std::list > aResult;