Salome HOME
Remove unnecessary variable
[modules/shaper.git] / src / XGUI / XGUI_Displayer.cpp
index c79aeafacef1eda8f17476e08c88047584c69a7c..ef89e2bcef6ca0e804b0e0b2e8383f5400f3e689 100644 (file)
@@ -96,7 +96,7 @@ QString qIntListInfo(const QIntList& theValues, const QString& theSeparator = QS
 }
 
 XGUI_Displayer::XGUI_Displayer(XGUI_Workshop* theWorkshop)
-  : myWorkshop(theWorkshop)
+  : myWorkshop(theWorkshop), myEnableUpdateViewer(true), myNeedUpdate(false)
 {
   enableUpdateViewer(true);
   myCustomPrs = std::shared_ptr<GeomAPI_ICustomPrs>(new XGUI_CustomPrs());
@@ -111,8 +111,9 @@ bool XGUI_Displayer::isVisible(ObjectPtr theObject) const
   return myResult2AISObjectMap.contains(theObject);
 }
 
-void XGUI_Displayer::display(ObjectPtr theObject, bool theUpdateViewer)
+bool XGUI_Displayer::display(ObjectPtr theObject, bool theUpdateViewer)
 {
+  bool aDisplayed = false;
   if (isVisible(theObject)) {
 #ifdef DEBUG_COMPOSILID_DISPLAY
     ResultCompSolidPtr aCompsolidResult = std::dynamic_pointer_cast<ModelAPI_ResultCompSolid>(theObject);
@@ -127,10 +128,9 @@ void XGUI_Displayer::display(ObjectPtr theObject, bool theUpdateViewer)
     }
     else
 #endif
-      redisplay(theObject, theUpdateViewer);
+    aDisplayed = redisplay(theObject, theUpdateViewer);
   } else {
     AISObjectPtr anAIS;
-
     GeomPresentablePtr aPrs = std::dynamic_pointer_cast<GeomAPI_IPresentable>(theObject);
     bool isShading = false;
     if (aPrs.get() != NULL) {
@@ -164,8 +164,9 @@ void XGUI_Displayer::display(ObjectPtr theObject, bool theUpdateViewer)
       }
     }
     if (anAIS)
-      display(theObject, anAIS, isShading, theUpdateViewer);
+      aDisplayed = display(theObject, anAIS, isShading, theUpdateViewer);
   }
+  return aDisplayed;
 }
 
 bool canBeShaded(Handle(AIS_InteractiveObject) theAIS)
@@ -189,12 +190,14 @@ bool canBeShaded(Handle(AIS_InteractiveObject) theAIS)
   return false;
 }
 
-void XGUI_Displayer::display(ObjectPtr theObject, AISObjectPtr theAIS, 
+bool XGUI_Displayer::display(ObjectPtr theObject, AISObjectPtr theAIS, 
                              bool isShading, bool theUpdateViewer)
 {
+  bool aDisplayed = false;
+
   Handle(AIS_InteractiveContext) aContext = AISContext();
   if (aContext.IsNull())
-    return;
+    return aDisplayed;
 
   Handle(AIS_InteractiveObject) anAISIO = theAIS->impl<Handle(AIS_InteractiveObject)>();
   if (!anAISIO.IsNull()) {
@@ -207,28 +210,41 @@ void XGUI_Displayer::display(ObjectPtr theObject, AISObjectPtr theAIS,
       anAISIO->Attributes()->SetFaceBoundaryDraw( Standard_True );
     anAISIO->SetDisplayMode(aDispMode);
     aContext->Display(anAISIO, aDispMode, 0, false, true, AIS_DS_Displayed); 
+    aDisplayed = true;
 
     emit objectDisplayed(theObject, theAIS);
     activate(anAISIO, myActiveSelectionModes, theUpdateViewer);
- } 
+    // the fix from VPA for more suitable selection of sketcher lines
+    if(anAISIO->Width() > 1) {
+      for(int aModeIdx = 0; aModeIdx < myActiveSelectionModes.length(); ++aModeIdx) {
+        aContext->SetSelectionSensitivity(anAISIO,
+          myActiveSelectionModes.value(aModeIdx), anAISIO->Width() + 2);
+      }
+    }
+  } 
   if (theUpdateViewer)
     updateViewer();
+
+  return aDisplayed;
 }
 
-void XGUI_Displayer::erase(ObjectPtr theObject, const bool theUpdateViewer)
+bool XGUI_Displayer::erase(ObjectPtr theObject, const bool theUpdateViewer)
 {
+  bool aErased = false;
   if (!isVisible(theObject))
-    return;
+    return aErased;
 
   Handle(AIS_InteractiveContext) aContext = AISContext();
   if (aContext.IsNull())
-    return;
+    return aErased;
+
   AISObjectPtr anObject = myResult2AISObjectMap[theObject];
   if (anObject) {
     Handle(AIS_InteractiveObject) anAIS = anObject->impl<Handle(AIS_InteractiveObject)>();
     if (!anAIS.IsNull()) {
       emit beforeObjectErase(theObject, anObject);
       aContext->Remove(anAIS, theUpdateViewer);
+      aErased = true;
     }
   }
   myResult2AISObjectMap.remove(theObject);
@@ -239,12 +255,14 @@ void XGUI_Displayer::erase(ObjectPtr theObject, const bool theUpdateViewer)
   qDebug(QString("erase object: %1").arg(aPtrStr.str().c_str()).toStdString().c_str());
   qDebug(getResult2AISObjectMapInfo().c_str());
 #endif
+  return aErased;
 }
 
-void XGUI_Displayer::redisplay(ObjectPtr theObject, bool theUpdateViewer)
+bool XGUI_Displayer::redisplay(ObjectPtr theObject, bool theUpdateViewer)
 {
+  bool aRedisplayed = false;
   if (!isVisible(theObject))
-    return;
+    return aRedisplayed;
 
   AISObjectPtr aAISObj = getAISObject(theObject);
   Handle(AIS_InteractiveObject) aAISIO = aAISObj->impl<Handle(AIS_InteractiveObject)>();
@@ -253,8 +271,8 @@ void XGUI_Displayer::redisplay(ObjectPtr theObject, bool theUpdateViewer)
   if (aPrs) {
     AISObjectPtr aAIS_Obj = aPrs->getAISObject(aAISObj);
     if (!aAIS_Obj) {
-      erase(theObject, theUpdateViewer);
-      return;
+      aRedisplayed = erase(theObject, theUpdateViewer);
+      return aRedisplayed;
     }
     if (aAIS_Obj != aAISObj) {
       appendResultObject(theObject, aAIS_Obj);
@@ -262,14 +280,11 @@ void XGUI_Displayer::redisplay(ObjectPtr theObject, bool theUpdateViewer)
     aAISIO = aAIS_Obj->impl<Handle(AIS_InteractiveObject)>();
   }
 
-  if (!aAISIO.IsNull()) {
-    Handle(AIS_InteractiveContext) aContext = AISContext();
-    if (aContext.IsNull())
-      return;
+  Handle(AIS_InteractiveContext) aContext = AISContext();
+  if (!aContext.IsNull() && !aAISIO.IsNull()) {
     // Check that the visualized shape is the same and the redisplay is not necessary
     // Redisplay of AIS object leads to this object selection compute and the selection 
     // in the browser is lost
-
     // this check is not necessary anymore because the selection store/restore is realized
     // before and after the values modification.
     // Moreother, this check avoids customize and redisplay presentation if the presentable
@@ -295,6 +310,7 @@ void XGUI_Displayer::redisplay(ObjectPtr theObject, bool theUpdateViewer)
     #endif
     if (!isEqualShapes || isCustomized) {
       aContext->Redisplay(aAISIO, false);
+      aRedisplayed = true;
       #ifdef DEBUG_FEATURE_REDISPLAY
         qDebug("  Redisplay happens");
       #endif
@@ -302,6 +318,7 @@ void XGUI_Displayer::redisplay(ObjectPtr theObject, bool theUpdateViewer)
         updateViewer();
     }
   }
+  return aRedisplayed;
 }
 
 void XGUI_Displayer::redisplayObjects()
@@ -326,11 +343,8 @@ void XGUI_Displayer::deactivate(ObjectPtr theObject, const bool theUpdateViewer)
     arg(anInfoStr).
     toStdString().c_str());
 #endif
-  if (isVisible(theObject)) {
-    Handle(AIS_InteractiveContext) aContext = AISContext();
-    if (aContext.IsNull())
-      return;
-
+  Handle(AIS_InteractiveContext) aContext = AISContext();
+  if (!aContext.IsNull() && isVisible(theObject)) {
     AISObjectPtr anObj = myResult2AISObjectMap[theObject];
     Handle(AIS_InteractiveObject) anAIS = anObj->impl<Handle(AIS_InteractiveObject)>();
 
@@ -349,17 +363,15 @@ void XGUI_Displayer::deactivateObjects(const QObjectPtrList& theObjList,
   for (; anIt != aLast; anIt++) {
     deactivate(*anIt, false);
   }
-  if (theUpdateViewer)
-    updateViewer();
+  //VSV It seems that there is no necessity to update viewer on deactivation
+  //if (theUpdateViewer)
+  //  updateViewer();
 }
 
 void XGUI_Displayer::getModesOfActivation(ObjectPtr theObject, QIntList& theModes)
 {
-  if (!isVisible(theObject))
-    return;
-
   Handle(AIS_InteractiveContext) aContext = AISContext();
-  if (aContext.IsNull())
+  if (aContext.IsNull() || !isVisible(theObject))
     return;
 
   AISObjectPtr aAISObj = getAISObject(theObject);
@@ -409,10 +421,8 @@ void XGUI_Displayer::activateObjects(const QIntList& theModes, const QObjectPtrL
   }
   myActiveSelectionModes = aNewModes;
   Handle(AIS_InteractiveContext) aContext = AISContext();
-  if (aContext.IsNull())
-    return;
   // Open local context if there is no one
-  if (!aContext->HasOpenedContext()) 
+  if (aContext.IsNull() || !aContext->HasOpenedContext()) 
     return;
 
   //aContext->UseDisplayedObjects();
@@ -430,20 +440,21 @@ void XGUI_Displayer::activateObjects(const QIntList& theModes, const QObjectPtrL
   }
 
   AIS_ListIteratorOfListOfInteractive aLIt(aPrsList);
+  bool isActivationChanged = false;
   for(aLIt.Initialize(aPrsList); aLIt.More(); aLIt.Next()){
     anAISIO = aLIt.Value();
-    activate(anAISIO, myActiveSelectionModes, false);
+    if (activate(anAISIO, myActiveSelectionModes, false))
+      isActivationChanged = true;
   }
-  if (theUpdateViewer)
-    updateViewer();
+  // VSV It seems that there is no necessity to update viewer on activation
+  //if (theUpdateViewer && isActivationChanged)
+  //  updateViewer();
 }
 
 bool XGUI_Displayer::isActive(ObjectPtr theObject) const
 {
   Handle(AIS_InteractiveContext) aContext = AISContext();
-  if (aContext.IsNull())
-    return false;
-  if (!isVisible(theObject))
+  if (aContext.IsNull() || !isVisible(theObject))
     return false;
     
   AISObjectPtr anObj = myResult2AISObjectMap[theObject];
@@ -503,14 +514,15 @@ void XGUI_Displayer::setSelected(const  QList<ModuleBase_ViewerPrs>& theValues,
 void XGUI_Displayer::clearSelected()
 {
   Handle(AIS_InteractiveContext) aContext = AISContext();
-  if (aContext) {
+  if (!aContext.IsNull()) {
     aContext->UnhilightCurrents(false);
     aContext->ClearSelected();
   }
 }
 
-void XGUI_Displayer::eraseAll(const bool theUpdateViewer)
+bool XGUI_Displayer::eraseAll(const bool theUpdateViewer)
 {
+  bool aErased = false;
   Handle(AIS_InteractiveContext) aContext = AISContext();
   if (!aContext.IsNull()) {
     foreach (ObjectPtr aObj, myResult2AISObjectMap.keys()) {
@@ -520,6 +532,7 @@ void XGUI_Displayer::eraseAll(const bool theUpdateViewer)
       if (!anIO.IsNull()) {
         emit beforeObjectErase(aObj, aAISObj);
         aContext->Remove(anIO, false);
+        aErased = true;
       }
     }
     if (theUpdateViewer)
@@ -530,19 +543,21 @@ void XGUI_Displayer::eraseAll(const bool theUpdateViewer)
   qDebug("eraseAll");
   qDebug(getResult2AISObjectMapInfo().c_str());
 #endif
+  return aErased;
 }
 
 void XGUI_Displayer::deactivateTrihedron() const
 {
   Handle(AIS_InteractiveContext) aContext = myWorkshop->viewer()->AISContext();
-
-  AIS_ListOfInteractive aList;
-  aContext->DisplayedObjects(aList, true);
-  AIS_ListIteratorOfListOfInteractive aIt;
-  for (aIt.Initialize(aList); aIt.More(); aIt.Next()) {
-    Handle(AIS_Trihedron) aTrihedron = Handle(AIS_Trihedron)::DownCast(aIt.Value());
-    if (!aTrihedron.IsNull()) {
-      aContext->Deactivate(aTrihedron);
+  if (!aContext.IsNull()) {
+    AIS_ListOfInteractive aList;
+    aContext->DisplayedObjects(aList, true);
+    AIS_ListIteratorOfListOfInteractive aIt;
+    for (aIt.Initialize(aList); aIt.More(); aIt.Next()) {
+      Handle(AIS_Trihedron) aTrihedron = Handle(AIS_Trihedron)::DownCast(aIt.Value());
+      if (!aTrihedron.IsNull()) {
+        aContext->Deactivate(aTrihedron);
+      }
     }
   }
 }
@@ -550,10 +565,8 @@ void XGUI_Displayer::deactivateTrihedron() const
 void XGUI_Displayer::openLocalContext()
 {
   Handle(AIS_InteractiveContext) aContext = myWorkshop->viewer()->AISContext();
-  if (aContext.IsNull())
-    return;
   // Open local context if there is no one
-  if (!aContext->HasOpenedContext()) {
+  if (!aContext.IsNull() && !aContext->HasOpenedContext()) {
     // Preserve selected objects
     //AIS_ListOfInteractive aAisList;
     //for (aContext->InitCurrent(); aContext->MoreCurrent(); aContext->NextCurrent())
@@ -589,7 +602,7 @@ void XGUI_Displayer::openLocalContext()
 void XGUI_Displayer::closeLocalContexts(const bool theUpdateViewer)
 {
   Handle(AIS_InteractiveContext) aContext = AISContext();
-  if ( (!aContext.IsNull()) && (aContext->HasOpenedContext()) ) {
+  if (!aContext.IsNull() && aContext->HasOpenedContext()) {
     // Preserve selected objects
     //AIS_ListOfInteractive aAisList;
     //for (aContext->InitSelected(); aContext->MoreSelected(); aContext->NextSelected())
@@ -676,7 +689,10 @@ bool XGUI_Displayer::enableUpdateViewer(const bool isEnabled)
   bool aWasEnabled = myEnableUpdateViewer;
 
   myEnableUpdateViewer = isEnabled;
-
+  if (myNeedUpdate && myEnableUpdateViewer) {
+    updateViewer();
+    myNeedUpdate = false;
+  }
   return aWasEnabled;
 }
 
@@ -686,6 +702,8 @@ void XGUI_Displayer::updateViewer() const
   if (!aContext.IsNull() && myEnableUpdateViewer) {
     myWorkshop->viewer()->Zfitall();
     aContext->UpdateCurrentViewer();
+  } else {
+    myNeedUpdate = true;
   }
 }
 
@@ -693,34 +711,38 @@ void XGUI_Displayer::activateAIS(const Handle(AIS_InteractiveObject)& theIO,
                                  const int theMode, const bool theUpdateViewer) const
 {
   Handle(AIS_InteractiveContext) aContext = myWorkshop->viewer()->AISContext();
-  aContext->Activate(theIO, theMode, theUpdateViewer);
+  if (!aContext.IsNull()) {
+    aContext->Activate(theIO, theMode, theUpdateViewer);
 
 #ifdef DEBUG_ACTIVATE_AIS
-  ObjectPtr anObject = getObject(theIO);
-  anInfo.append(ModuleBase_Tools::objectInfo((*anIt)));
-  qDebug(QString("activateAIS: theMode = %1, object = %2").arg(theMode).arg(anInfo).toStdString().c_str());
+    ObjectPtr anObject = getObject(theIO);
+    anInfo.append(ModuleBase_Tools::objectInfo((*anIt)));
+    qDebug(QString("activateAIS: theMode = %1, object = %2").arg(theMode).arg(anInfo).toStdString().c_str());
 #endif
+  }
 }
 
 void XGUI_Displayer::deactivateAIS(const Handle(AIS_InteractiveObject)& theIO, const int theMode) const
 {
   Handle(AIS_InteractiveContext) aContext = myWorkshop->viewer()->AISContext();
-  if (theMode == -1)
-    aContext->Deactivate(theIO);
-  else
-    aContext->Deactivate(theIO, theMode);
+  if (!aContext.IsNull()) {
+    if (theMode == -1)
+      aContext->Deactivate(theIO);
+    else
+      aContext->Deactivate(theIO, theMode);
 
 #ifdef DEBUG_DEACTIVATE_AIS
-  ObjectPtr anObject = getObject(theIO);
-  anInfo.append(ModuleBase_Tools::objectInfo((*anIt)));
-  qDebug(QString("deactivateAIS: theMode = %1, object = %2").arg(theMode).arg(anInfo).toStdString().c_str());
+    ObjectPtr anObject = getObject(theIO);
+    anInfo.append(ModuleBase_Tools::objectInfo((*anIt)));
+    qDebug(QString("deactivateAIS: theMode = %1, object = %2").arg(theMode).arg(anInfo).toStdString().c_str());
 #endif
+  }
 }
 
 Handle(AIS_InteractiveContext) XGUI_Displayer::AISContext() const
 {
   Handle(AIS_InteractiveContext) aContext = myWorkshop->viewer()->AISContext();
-  if ((!aContext.IsNull()) && (!aContext->HasOpenedContext())) {
+  if (!aContext.IsNull() && !aContext->HasOpenedContext()) {
     aContext->OpenLocalContext();
     deactivateTrihedron();
     aContext->DefaultDrawer()->VIsoAspect()->SetNumber(0);
@@ -732,22 +754,22 @@ Handle(AIS_InteractiveContext) XGUI_Displayer::AISContext() const
 Handle(SelectMgr_AndFilter) XGUI_Displayer::GetFilter()
 {
   Handle(AIS_InteractiveContext) aContext = AISContext();
-  if (myAndFilter.IsNull() && !aContext.IsNull()) {
+  if (!aContext.IsNull() && myAndFilter.IsNull()) {
     myAndFilter = new SelectMgr_AndFilter();
     aContext->AddFilter(myAndFilter);
   }
   return myAndFilter;
 }
 
-void XGUI_Displayer::displayAIS(AISObjectPtr theAIS, const bool toActivateInSelectionModes,
+bool XGUI_Displayer::displayAIS(AISObjectPtr theAIS, const bool toActivateInSelectionModes,
                                 bool theUpdateViewer)
 {
+  bool aDisplayed = false;
   Handle(AIS_InteractiveContext) aContext = AISContext();
-  if (aContext.IsNull())
-    return;
   Handle(AIS_InteractiveObject) anAISIO = theAIS->impl<Handle(AIS_InteractiveObject)>();
-  if (!anAISIO.IsNull()) {
+  if (!aContext.IsNull() && !anAISIO.IsNull()) {
     aContext->Display(anAISIO, 0/*wireframe*/, 0, theUpdateViewer, true, AIS_DS_Displayed);
+    aDisplayed = true;
     aContext->Deactivate(anAISIO);
     aContext->Load(anAISIO);
     if (toActivateInSelectionModes) {
@@ -762,17 +784,21 @@ void XGUI_Displayer::displayAIS(AISObjectPtr theAIS, const bool toActivateInSele
       }
     }
   }
+  return aDisplayed;
 }
 
-void XGUI_Displayer::eraseAIS(AISObjectPtr theAIS, const bool theUpdateViewer)
+bool XGUI_Displayer::eraseAIS(AISObjectPtr theAIS, const bool theUpdateViewer)
 {
+  bool aErased = false;
   Handle(AIS_InteractiveContext) aContext = AISContext();
-  if (aContext.IsNull())
-    return;
-  Handle(AIS_InteractiveObject) anAISIO = theAIS->impl<Handle(AIS_InteractiveObject)>();
-  if (!anAISIO.IsNull() && aContext->IsDisplayed(anAISIO)) {
-    aContext->Remove(anAISIO, theUpdateViewer);
+  if (!aContext.IsNull()) {
+    Handle(AIS_InteractiveObject) anAISIO = theAIS->impl<Handle(AIS_InteractiveObject)>();
+    if (!anAISIO.IsNull() && aContext->IsDisplayed(anAISIO)) {
+      aContext->Remove(anAISIO, theUpdateViewer);
+      aErased = true;
+    }
   }
+  return aErased;
 }
 
 
@@ -813,18 +839,19 @@ XGUI_Displayer::DisplayMode XGUI_Displayer::displayMode(ObjectPtr theObject) con
 void XGUI_Displayer::deactivateSelectionFilters()
 {
   Handle(AIS_InteractiveContext) aContext = AISContext();
-  if (!myAndFilter.IsNull() && !aContext.IsNull()) {
+  if (!myAndFilter.IsNull()) {
     bool aFound = false;
-    const SelectMgr_ListOfFilter& aFilters = aContext->Filters();
-    SelectMgr_ListIteratorOfListOfFilter anIt(aFilters);
-    for (; anIt.More() && !aFound; anIt.Next()) {
-      Handle(SelectMgr_Filter) aFilter = anIt.Value();
-      aFound = aFilter == myAndFilter;
-    }
-    if (aFound) {
-      aContext->RemoveFilter(myAndFilter);
-      myAndFilter.Nullify();
+    if (!aContext.IsNull()) {
+      const SelectMgr_ListOfFilter& aFilters = aContext->Filters();
+      SelectMgr_ListIteratorOfListOfFilter anIt(aFilters);
+      for (; anIt.More() && !aFound; anIt.Next()) {
+        Handle(SelectMgr_Filter) aFilter = anIt.Value();
+        aFound = aFilter == myAndFilter;
+      }
+      if (aFound)
+        aContext->RemoveFilter(myAndFilter);
     }
+    myAndFilter.Nullify();
   }
 }
 
@@ -834,12 +861,14 @@ void XGUI_Displayer::addSelectionFilter(const Handle(SelectMgr_Filter)& theFilte
   if (aContext.IsNull() || hasSelectionFilter(theFilter))
     return;
 
-  Handle(SelectMgr_CompositionFilter) aCompFilter = GetFilter();
-  aCompFilter->Add(theFilter);
+  Handle(SelectMgr_CompositionFilter) aCompositeFilter = GetFilter();
+  if (!aCompositeFilter.IsNull()) {
+    aCompositeFilter->Add(theFilter);
 #ifdef DEBUG_SELECTION_FILTERS
-  int aCount = GetFilter()->StoredFilters().Extent();
-  qDebug(QString("addSelectionFilter: filters.count() = %1").arg(aCount).toStdString().c_str());
+    int aCount = aCompositeFilter->StoredFilters().Extent();
+    qDebug(QString("addSelectionFilter: filters.count() = %1").arg(aCount).toStdString().c_str());
 #endif
+  }
 }
 
 void XGUI_Displayer::removeSelectionFilter(const Handle(SelectMgr_Filter)& theFilter)
@@ -847,13 +876,15 @@ void XGUI_Displayer::removeSelectionFilter(const Handle(SelectMgr_Filter)& theFi
   Handle(AIS_InteractiveContext) aContext = AISContext();
   if (aContext.IsNull())
     return;
+
   Handle(SelectMgr_AndFilter) aCompositeFilter = GetFilter();
-  if (aCompositeFilter->IsIn(theFilter))
+  if (!aCompositeFilter.IsNull() && aCompositeFilter->IsIn(theFilter)) {
     aCompositeFilter->Remove(theFilter);
 #ifdef DEBUG_SELECTION_FILTERS
-  int aCount = GetFilter()->StoredFilters().Extent();
-  qDebug(QString("removeSelectionFilter: filters.count() = %1").arg(aCount).toStdString().c_str());
+    int aCount = aCompositeFilter->StoredFilters().Extent();
+    qDebug(QString("removeSelectionFilter: filters.count() = %1").arg(aCount).toStdString().c_str());
 #endif
+  }
 }
 
 bool XGUI_Displayer::hasSelectionFilter(const Handle(SelectMgr_Filter)& theFilter)
@@ -869,11 +900,13 @@ bool XGUI_Displayer::hasSelectionFilter(const Handle(SelectMgr_Filter)& theFilte
     if (theFilter.Access() == aIt.Value().Access())
       aFilterFound = true;
   }
-  Handle(SelectMgr_CompositionFilter) aCompFilter = GetFilter();
-  const SelectMgr_ListOfFilter& aStoredFilters = aCompFilter->StoredFilters();
-  for (aIt.Initialize(aStoredFilters); aIt.More() && !aFilterFound; aIt.Next()) {
-    if (theFilter.Access() == aIt.Value().Access())
-      aFilterFound = true;
+  Handle(SelectMgr_CompositionFilter) aCompositeFilter = GetFilter();
+  if (!aCompositeFilter.IsNull()) {
+    const SelectMgr_ListOfFilter& aStoredFilters = aCompositeFilter->StoredFilters();
+    for (aIt.Initialize(aStoredFilters); aIt.More() && !aFilterFound; aIt.Next()) {
+      if (theFilter.Access() == aIt.Value().Access())
+        aFilterFound = true;
+    }
   }
   return aFilterFound;
 }
@@ -883,7 +916,10 @@ void XGUI_Displayer::removeFilters()
   Handle(AIS_InteractiveContext) aContext = AISContext();
   if (aContext.IsNull())
     return;
-  GetFilter()->Clear();
+
+  Handle(SelectMgr_CompositionFilter) aCompositeFilter = GetFilter();
+  if (!aCompositeFilter.IsNull())
+    aCompositeFilter->Clear();
 }
 
 void XGUI_Displayer::showOnly(const QObjectPtrList& theList)
@@ -913,14 +949,15 @@ bool XGUI_Displayer::canBeShaded(ObjectPtr theObject) const
   return ::canBeShaded(anAIS);
 }
 
-void XGUI_Displayer::activate(const Handle(AIS_InteractiveObject)& theIO,
+bool XGUI_Displayer::activate(const Handle(AIS_InteractiveObject)& theIO,
                               const QIntList& theModes,
                               const bool theUpdateViewer) const
 {
   Handle(AIS_InteractiveContext) aContext = AISContext();
   if (aContext.IsNull() || theIO.IsNull())
-    return;
-
+    return false;
+  
+  bool isActivationChanged = false;
   // deactivate object in all modes, which are not in the list of activation
   // It seems that after the IO deactivation the selected state of the IO's owners
   // is modified in OCC(version: 6.8.0) and the selection of the object later is lost.
@@ -947,9 +984,12 @@ void XGUI_Displayer::activate(const Handle(AIS_InteractiveObject)& theIO,
   }
   if (isDeactivated) {
     // the selection from the previous activation modes should be cleared manually (#26172)
+    theIO->ClearSelected();
     aContext->LocalContext()->ClearOutdatedSelection(theIO, true);
-    if (theUpdateViewer)
-      updateViewer();
+    // For performance issues
+    //if (theUpdateViewer)
+    //  updateViewer();
+    isActivationChanged = true;
   }
 
   // loading the interactive object allowing the decomposition
@@ -971,10 +1011,12 @@ void XGUI_Displayer::activate(const Handle(AIS_InteractiveObject)& theIO,
         //aContext->Load(anAISIO, aMode, true);
         if (!aModesActivatedForIO.contains(aMode)) {
           activateAIS(theIO, aMode, theUpdateViewer);
+          isActivationChanged = true;
         }
       }
     }
   }
+  return isActivationChanged;
 }
 
 bool XGUI_Displayer::customizeObject(ObjectPtr theObject)