0027680: Visualization - AIS_InteractiveContext::Remove() should remove all presentat...
authorisk <isk@opencascade.com>
Mon, 1 Aug 2016 12:30:40 +0000 (15:30 +0300)
committerbugmaster <bugmaster@opencascade.com>
Thu, 4 Aug 2016 09:01:14 +0000 (12:01 +0300)
src/AIS/AIS_InteractiveContext.cxx
src/AIS/AIS_LocalContext.cxx
src/PrsMgr/PrsMgr_PresentationManager.cxx
src/PrsMgr/PrsMgr_PresentationManager.hxx

index 0a84023..d77c18d 100644 (file)
@@ -2484,17 +2484,8 @@ void AIS_InteractiveContext::ClearGlobal (const Handle(AIS_InteractiveObject)& t
 
   Handle(AIS_GlobalStatus) aStatus = myObjects (theIObj);
   unhighlightOwners (theIObj);
-  for (TColStd_ListIteratorOfListOfInteger aDispModeIter (aStatus->DisplayedModes()); aDispModeIter.More(); aDispModeIter.Next())
-  {
-    myMainPM->Erase (theIObj, aDispModeIter.Value());
-    myMainPM->Clear (theIObj, aDispModeIter.Value());
-  }
 
-  if (aStatus->IsHilighted()
-   && theIObj->HasHilightMode())
-  {
-    myMainPM->Unhighlight (theIObj, theIObj->HilightMode());
-  }
+  myMainPM->Erase (theIObj, -1);
 
   // Object removes from Detected sequence
   for(Standard_Integer aDetIter = 1; aDetIter < myAISDetectedSeq.Length(); ++aDetIter)
@@ -2555,7 +2546,6 @@ void AIS_InteractiveContext::ClearGlobalPrs (const Handle(AIS_InteractiveObject)
     }
 
     myMainPM->Erase (theIObj, theMode);
-    myMainPM->Clear (theIObj, theMode);
   }
 
   if (aStatus->GraphicStatus() == AIS_DS_Displayed
index 4481c93..d5eb765 100644 (file)
@@ -453,7 +453,6 @@ Standard_Boolean AIS_LocalContext::Remove(const Handle(AIS_InteractiveObject)& a
     }
 
     myMainPM->Erase (aSelectable, Att->DisplayMode());
-    myMainPM->Clear (aSelectable, Att->DisplayMode());
     if (myMainPM->IsDisplayed (aSelectable, Att->HilightMode()))
     {
       myMainPM->Erase (aSelectable, Att->HilightMode());
index 234049e..9511ad2 100644 (file)
@@ -89,19 +89,31 @@ void PrsMgr_PresentationManager::Erase (const Handle(PrsMgr_PresentableObject)&
   }
 
   PrsMgr_Presentations& aPrsList = thePrsObj->Presentations();
-  for (Standard_Integer aPrsIter = 1; aPrsIter <= aPrsList.Length(); ++aPrsIter)
+  for (PrsMgr_Presentations::Iterator anIt (aPrsList); anIt.More();)
   {
-    const PrsMgr_ModedPresentation&           aModedPrs = aPrsList.Value (aPrsIter);
-    const Handle(PrsMgr_PresentationManager)& aPrsMgr   = aModedPrs.Presentation()->PresentationManager();
-    if (theMode == aPrsList (aPrsIter).Mode()
-     && this    == aPrsMgr)
+    const PrsMgr_ModedPresentation& aModedPrs = anIt.Value();
+    if (aModedPrs.Presentation().IsNull())
+    {
+      anIt.Next();
+      continue;
+    }
+
+    const Handle(PrsMgr_PresentationManager)& aPrsMgr = aModedPrs.Presentation()->PresentationManager();
+    if ((theMode == aModedPrs.Mode() || theMode == -1)
+     && (this == aPrsMgr))
     {
-      if (!aModedPrs.Presentation().IsNull())
+      aModedPrs.Presentation()->Erase();
+
+      aPrsList.Remove (anIt);
+
+      if (theMode != -1)
       {
-        aModedPrs.Presentation()->Erase();
+        return;
       }
-      aPrsList.Remove (aPrsIter);
-      return;
+    }
+    else
+    {
+      anIt.Next();
     }
   }
 }
index 7f61219..86a2ccb 100644 (file)
@@ -59,6 +59,7 @@ public:
   
   //! erases the presentation of the object in the given
   //! Presentation manager with the given mode.
+  //! If @theMode is -1, then erases all presentations of the object.
   Standard_EXPORT void Erase (const Handle(PrsMgr_PresentableObject)& thePrsObject, const Standard_Integer theMode = 0);