0027523: Visualization - selection owner contains obsolete shape
authorvpa <vpa@opencascade.com>
Thu, 9 Jun 2016 16:02:49 +0000 (19:02 +0300)
committerbugmaster <bugmaster@opencascade.com>
Thu, 23 Jun 2016 15:13:57 +0000 (18:13 +0300)
- remove check for selection activation in SelectMgr_SelectionManager::RecomputeSelection;
- given selection mode is now handled properly and single selection mode can be recomputed;
- test case for issue #27523.

Small correction of test case for issue CR27523

src/QABugs/QABugs_19.cxx
src/SelectMgr/SelectMgr_SelectionManager.cxx
src/SelectMgr/SelectMgr_SelectionManager.hxx
tests/bugs/vis/bug27523 [new file with mode: 0644]

index a988e5c..4903457 100644 (file)
@@ -54,6 +54,7 @@
 #include <TopExp_Explorer.hxx>
 
 #include <SelectMgr_Filter.hxx>
+#include <StdSelect_BRepOwner.hxx>
 
 #include <Standard_Version.hxx>
 
@@ -5160,6 +5161,78 @@ static Standard_Integer OCC27318 (Draw_Interpretor& /*theDI*/, Standard_Integer
   return 0;
 }
 
+//========================================================================
+//function : OCC27523
+//purpose  : Checks recomputation of deactivated selection mode after object's redisplaying
+//========================================================================
+static Standard_Integer OCC27523 (Draw_Interpretor& theDI, Standard_Integer theArgNb, const char** theArgVec)
+{
+  if (theArgNb != 1)
+  {
+    std::cerr << "Error: wrong number of arguments! See usage:\n";
+    theDI.PrintHelp (theArgVec[0]);
+    return 1;
+  }
+
+  Handle(AIS_InteractiveContext) anAISContext = ViewerTest::GetAISContext();
+  if(anAISContext.IsNull())
+  {
+    std::cerr << "Error: no active view. Please call vinit.\n";
+    return 1;
+  }
+
+  gp_Pnt aStart (100, 100, 100);
+  gp_Pnt anEnd (300, 400, 600);
+  BRepBuilderAPI_MakeEdge anEdgeBuilder (aStart, anEnd);
+  TopoDS_Edge anEdge = anEdgeBuilder.Edge();
+  Handle(AIS_InteractiveObject) aTestAISShape = new AIS_Shape (anEdge);
+  anAISContext->Display (aTestAISShape);
+
+  // activate it in selection modes
+  TColStd_SequenceOfInteger aModes;
+  aModes.Append (AIS_Shape::SelectionMode ((TopAbs_ShapeEnum) TopAbs_VERTEX));
+
+  anAISContext->OpenLocalContext();
+  anAISContext->Deactivate (aTestAISShape);
+  anAISContext->Load (aTestAISShape, -1, true);
+  anAISContext->Activate (aTestAISShape, 0);
+  anAISContext->Deactivate (aTestAISShape, 0);
+
+  // activate in vertices mode
+  for (Standard_Integer anIt = 1; anIt <= aModes.Length(); ++anIt)
+  {
+    anAISContext->Activate (aTestAISShape, aModes (anIt));
+  }
+
+  TopoDS_Shape aVertexShape = BRepBuilderAPI_MakeVertex (gp_Pnt (75, 0, 0));
+  TopAbs_ShapeEnum aVertexShapeType = aVertexShape.ShapeType();
+  Handle(AIS_Shape)::DownCast (aTestAISShape)->Set (aVertexShape);
+  aTestAISShape->Redisplay();
+
+  anAISContext->AddOrRemoveSelected (aTestAISShape);
+
+  bool aValidShapeType = false;
+  for (anAISContext->InitSelected(); anAISContext->MoreSelected(); anAISContext->NextSelected())
+  {
+    Handle(SelectMgr_EntityOwner) anOwner = anAISContext->SelectedOwner();
+    Handle(StdSelect_BRepOwner) aBRO = Handle(StdSelect_BRepOwner)::DownCast (anOwner);
+    if (!aBRO.IsNull() && aBRO->HasShape())
+    {
+      TopoDS_Shape aShape = aBRO->Shape();
+
+      aValidShapeType = aShape.ShapeType() == aVertexShapeType;
+    }
+  }
+
+  if (!aValidShapeType)
+  {
+    std::cerr << "Error: shape type is invalid.\n";
+    return 1;
+  }
+
+  return 0;
+}
+
 void QABugs::Commands_19(Draw_Interpretor& theCommands) {
   const char *group = "QABugs";
 
@@ -5277,6 +5350,9 @@ void QABugs::Commands_19(Draw_Interpretor& theCommands) {
   theCommands.Add ("OCC27318",
                    "OCC27318: Creates a box that is not listed in map of AIS objects of ViewerTest",
                    __FILE__, OCC27318, group);
+  theCommands.Add ("OCC27523",
+                   "OCC27523: Checks recomputation of deactivated selection mode after object's redisplaying",
+                   __FILE__, OCC27523, group);
 
   return;
 }
index c24fd61..8072850 100644 (file)
@@ -649,6 +649,28 @@ void SelectMgr_SelectionManager::rebuildSelectionStructures (const Handle(Select
 }
 
 //==================================================
+// Function: recomputeSelectionMode
+// Purpose :
+//==================================================
+void SelectMgr_SelectionManager::recomputeSelectionMode (const Handle(SelectMgr_SelectableObject)& theObject,
+                                                         const Handle(SelectMgr_Selection)& theSelection,
+                                                         const Standard_Integer theMode)
+{
+  theSelection->UpdateStatus (SelectMgr_TOU_Full);
+
+  for (TColStd_MapIteratorOfMapOfTransient aSelectorIter (mySelectors); aSelectorIter.More(); aSelectorIter.Next())
+  {
+    Handle(SelectMgr_ViewerSelector) aCurSelector = Handle(SelectMgr_ViewerSelector)::DownCast (aSelectorIter.Key());
+
+    ClearSelectionStructures (theObject, theMode, aCurSelector);
+    theObject->RecomputePrimitives (theMode);
+    RestoreSelectionStructures (theObject, theMode, aCurSelector);
+    theSelection->UpdateStatus (SelectMgr_TOU_None);
+    theSelection->UpdateBVHStatus (SelectMgr_TBU_None);
+  }
+}
+
+//==================================================
 // Function: Update
 // Purpose :
 //==================================================
@@ -686,25 +708,23 @@ void SelectMgr_SelectionManager::RecomputeSelection (const Handle(SelectMgr_Sele
   if (!(myGlobal.Contains (theObject) || myLocal.IsBound (theObject)))
     return;
 
-  for(theObject->Init(); theObject->More(); theObject->Next())
+  if (theMode == -1)
   {
-    const Handle(SelectMgr_Selection)& aSelection = theObject->CurrentSelection();
-    aSelection->UpdateStatus (SelectMgr_TOU_Full);
-    Standard_Integer aSelMode = aSelection->Mode();
-
-    for (TColStd_MapIteratorOfMapOfTransient aSelectorIter (mySelectors); aSelectorIter.More(); aSelectorIter.Next())
+    for (theObject->Init(); theObject->More(); theObject->Next())
     {
-      Handle(SelectMgr_ViewerSelector) aCurSelector (Handle(SelectMgr_ViewerSelector)::DownCast (aSelectorIter.Key()));
-      if (aCurSelector->Status (aSelection) == SelectMgr_SOS_Activated)
-      {
-          ClearSelectionStructures (theObject, aSelMode, aCurSelector);
-          theObject->RecomputePrimitives(aSelMode);
-          RestoreSelectionStructures (theObject, aSelMode, aCurSelector);
-          aSelection->UpdateStatus (SelectMgr_TOU_None);
-          aSelection->UpdateBVHStatus (SelectMgr_TBU_None);
-      }
+      const Handle(SelectMgr_Selection)& aSelection = theObject->CurrentSelection();
+      Standard_Integer aSelMode = aSelection->Mode();
+      recomputeSelectionMode (theObject, aSelection, aSelMode);
     }
   }
+  else
+  {
+    if (!theObject->HasSelection (theMode))
+      return;
+
+    const Handle(SelectMgr_Selection)& aSelection = theObject->Selection (theMode);
+    recomputeSelectionMode (theObject, aSelection, theMode);
+  }
 }
 
 //=======================================================================
index cb4d5af..afdef8f 100644 (file)
@@ -129,7 +129,10 @@ public:
 
 protected:
 
-
+  //! Recomputes given selection mode and updates BVHs in all viewer selectors
+  Standard_EXPORT void recomputeSelectionMode (const Handle(SelectMgr_SelectableObject)& theObject,
+                                               const Handle(SelectMgr_Selection)& theSelection,
+                                               const Standard_Integer theMode);
 
 
 private:
diff --git a/tests/bugs/vis/bug27523 b/tests/bugs/vis/bug27523
new file mode 100644 (file)
index 0000000..3173c61
--- /dev/null
@@ -0,0 +1,15 @@
+puts "============"
+puts "OCC27523"
+puts "============"
+puts ""
+####################################################################################
+# Visualization - selection owner contains obsolete shape
+####################################################################################
+
+
+pload QAcommands VISUALIZATION
+
+vinit
+OCC27523
+
+checkview -screenshot -3d -path ${imagedir}/${casename}.png