0027757: Visualization - handle child objects in selection manager regardless of...
authorvpa <vpa@opencascade.com>
Mon, 8 Aug 2016 14:38:02 +0000 (17:38 +0300)
committerbugmaster <bugmaster@opencascade.com>
Thu, 11 Aug 2016 09:33:21 +0000 (12:33 +0300)
- all methods of SelectMgr_SelectionManager now processes children first, then check HasOwnPresentations() flag;
- test case for issue #27757

Small correction of test case for issue CR27757

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

index 3c9096a..38cf028 100644 (file)
@@ -5243,6 +5243,35 @@ static Standard_Integer OCC27700 (Draw_Interpretor& /*theDI*/, Standard_Integer
 }
 
 //========================================================================
+//function : OCC27757
+//purpose  : Creates a box that has a sphere as child object and displays it
+//========================================================================
+static Standard_Integer OCC27757 (Draw_Interpretor& /*theDI*/, Standard_Integer /*theArgc*/, const char** theArgv)
+{
+  const Handle(AIS_InteractiveContext)& aCtx = ViewerTest::GetAISContext();
+  if (aCtx.IsNull())
+  {
+    std::cout << "No interactive context. Use 'vinit' command before " << theArgv[0] << "\n";
+    return 1;
+  }
+
+  TopoDS_Shape aBox = BRepPrimAPI_MakeBox (20.0, 20.0, 20.0).Shape();
+  TopoDS_Shape aSphere = BRepPrimAPI_MakeSphere (10.0).Shape();
+  gp_Trsf aTrsf;
+  aTrsf.SetTranslationPart (gp_Vec (20.0, 20.0, 0.0));
+  aSphere.Located (TopLoc_Location (aTrsf));
+
+
+  Handle(AIS_Shape) aBoxObj = new AIS_Shape (aBox);
+  Handle(AIS_Shape) aSphereObj = new AIS_Shape (aSphere);
+  aBoxObj->AddChild (aSphereObj);
+  aCtx->Display (aBoxObj, 1, 0, Standard_False);
+  aCtx->UpdateCurrentViewer();
+
+  return 0;
+}
+
+//========================================================================
 //function : Commands_19
 //purpose  :
 //========================================================================
@@ -5369,5 +5398,8 @@ void QABugs::Commands_19(Draw_Interpretor& theCommands) {
   theCommands.Add ("OCC27700",
                    "OCC27700: Checks drawing text after setting interior style",
                    __FILE__, OCC27700, group);
+  theCommands.Add ("OCC27757",
+                   "OCC27757: Creates a box that has a sphere as child object and displays it",
+                   __FILE__, OCC27757, group);
   return;
 }
index 35f5451..20a10f8 100644 (file)
@@ -165,19 +165,16 @@ void SelectMgr_SelectionManager::Load (const Handle(SelectMgr_SelectableObject)&
   {
     if (!myGlobal.Contains (theObject))
     {
-      if (theObject->HasOwnPresentations())
+      for (PrsMgr_ListOfPresentableObjectsIter anChildrenIter (theObject->Children()); anChildrenIter.More(); anChildrenIter.Next())
       {
-        SelectMgr_SequenceOfSelector aSelectors;
-        aSelectors.Append (theSelector);
-        myLocal.Bind (theObject, aSelectors);
-      }
-      else
-      {
-        for (PrsMgr_ListOfPresentableObjectsIter anChildrenIter (theObject->Children()); anChildrenIter.More(); anChildrenIter.Next())
-        {
-          Load (Handle(SelectMgr_SelectableObject)::DownCast (anChildrenIter.Value()), theSelector, theMode);
-        }
+        Load (Handle(SelectMgr_SelectableObject)::DownCast (anChildrenIter.Value()), theSelector, theMode);
       }
+      if (!theObject->HasOwnPresentations())
+        return;
+
+      SelectMgr_SequenceOfSelector aSelectors;
+      aSelectors.Append (theSelector);
+      myLocal.Bind (theObject, aSelectors);
     }
   }
 }
@@ -189,6 +186,14 @@ void SelectMgr_SelectionManager::Load (const Handle(SelectMgr_SelectableObject)&
 //==================================================
 void SelectMgr_SelectionManager::Remove (const Handle(SelectMgr_SelectableObject)& theObject)
 {
+  for (PrsMgr_ListOfPresentableObjectsIter anChildrenIter (theObject->Children()); anChildrenIter.More(); anChildrenIter.Next())
+  {
+    Remove (Handle(SelectMgr_SelectableObject)::DownCast (anChildrenIter.Value()));
+  }
+
+  if (!theObject->HasOwnPresentations())
+    return;
+
   if (myGlobal.Contains (theObject))
   {
     for (TColStd_MapIteratorOfMapOfTransient aSelectorsIter (mySelectors); aSelectorsIter.More(); aSelectorsIter.Next())
@@ -228,13 +233,6 @@ void SelectMgr_SelectionManager::Remove (const Handle(SelectMgr_SelectableObject
 
     myLocal.UnBind (theObject);
   }
-  else if (!theObject->HasOwnPresentations())
-  {
-    for (PrsMgr_ListOfPresentableObjectsIter anChildrenIter (theObject->Children()); anChildrenIter.More(); anChildrenIter.Next())
-    {
-      Remove (Handle(SelectMgr_SelectableObject)::DownCast (anChildrenIter.Value()));
-    }
-  }
 
   theObject->ClearSelections();
 }
@@ -298,15 +296,13 @@ void SelectMgr_SelectionManager::Activate (const Handle(SelectMgr_SelectableObje
   if (!theSelector.IsNull() && !mySelectors.Contains (theSelector))
     return;
 
-  if (!theObject->HasOwnPresentations())
+  for (PrsMgr_ListOfPresentableObjectsIter anChildIter (theObject->Children()); anChildIter.More(); anChildIter.Next())
   {
-    for (PrsMgr_ListOfPresentableObjectsIter anChildIter (theObject->Children()); anChildIter.More(); anChildIter.Next())
-    {
-      Activate (Handle(SelectMgr_SelectableObject)::DownCast (anChildIter.Value()), theMode, theSelector);
-    }
+    Activate (Handle(SelectMgr_SelectableObject)::DownCast (anChildIter.Value()), theMode, theSelector);
+  }
 
+  if (!theObject->HasOwnPresentations())
     return;
-  }
 
   Standard_Boolean isComputed = Standard_False;
   if (theObject->HasSelection (theMode))
@@ -399,16 +395,13 @@ void SelectMgr_SelectionManager::Deactivate (const Handle(SelectMgr_SelectableOb
                                              const Standard_Integer theMode,
                                              const Handle(SelectMgr_ViewerSelector)& theSelector)
 {
-
-  if (!theObject->HasOwnPresentations())
+  for (PrsMgr_ListOfPresentableObjectsIter anChildrenIter (theObject->Children()); anChildrenIter.More(); anChildrenIter.Next())
   {
-    for (PrsMgr_ListOfPresentableObjectsIter anChildrenIter (theObject->Children()); anChildrenIter.More(); anChildrenIter.Next())
-    {
-      Deactivate (Handle(SelectMgr_SelectableObject)::DownCast (anChildrenIter.Value()), theMode, theSelector);
-    }
+    Deactivate (Handle(SelectMgr_SelectableObject)::DownCast (anChildrenIter.Value()), theMode, theSelector);
+  }
 
+  if (!theObject->HasOwnPresentations())
     return;
-  }
 
   Standard_Boolean isInGlobal = myGlobal.Contains (theObject);
   Standard_Boolean hasSelection = theMode == -1 ? Standard_True : theObject->HasSelection (theMode);
@@ -459,16 +452,14 @@ Standard_Boolean SelectMgr_SelectionManager::IsActivated (const Handle(SelectMgr
                                                           const Standard_Integer theMode,
                                                           const Handle(SelectMgr_ViewerSelector)& theSelector) const
 {
-  if (!theObject->HasOwnPresentations())
+  for (PrsMgr_ListOfPresentableObjectsIter anChildrenIter (theObject->Children()); anChildrenIter.More(); anChildrenIter.Next())
   {
-    for (PrsMgr_ListOfPresentableObjectsIter anChildrenIter (theObject->Children()); anChildrenIter.More(); anChildrenIter.Next())
-    {
-      if (IsActivated (Handle(SelectMgr_SelectableObject)::DownCast (anChildrenIter.Value()), theMode, theSelector))
-        return Standard_True;
-    }
+    if (IsActivated (Handle(SelectMgr_SelectableObject)::DownCast (anChildrenIter.Value()), theMode, theSelector))
+      return Standard_True;
+  }
 
+  if (!theObject->HasOwnPresentations())
     return Standard_False;
-  }
 
   if (!(myGlobal.Contains (theObject) || myLocal.IsBound (theObject)))
     return Standard_False;
diff --git a/tests/bugs/vis/bug27757 b/tests/bugs/vis/bug27757
new file mode 100644 (file)
index 0000000..23ce094
--- /dev/null
@@ -0,0 +1,26 @@
+puts "============"
+puts "CR27757"
+puts "Visualization - handle child objects in selection manager regardless of HasOwnPresentations() flag"
+puts "============"
+puts ""
+
+pload VISUALIZATION QAcommands
+
+vinit
+
+# create box object that has sphere as a child object
+OCC27757
+vfit
+
+# check if the sphere was activated in selection manager
+# and is selectable
+vselect 120 245
+
+if {[vnbselected] != "1"} {
+  puts "Error: no object was selected; the sphere must be selected!"
+}
+if {[vreadpixel 145 285 name] != "GRAY80 1"} {
+  puts "Error: the sphere is not highlighted with selection color!"
+}
+
+checkview -screenshot -3d -path ${imagedir}/${test_image}.png