]> OCCT Git - occt-copy.git/commitdiff
0032482: Visualization - Object owner isn't removed from picked owner when object...
authorkgv <kgv@opencascade.com>
Mon, 26 Jul 2021 14:16:13 +0000 (17:16 +0300)
committerNatalia Ermolaeva <natalia.ermolaeva@opencascade.com>
Tue, 3 Aug 2021 09:07:56 +0000 (12:07 +0300)
SelectMgr_ViewerSelector::RemoveSelectableObject() now removes object from picking results.

(cherry picked from commit be105cd4c180c87e30c5834eec903b86f747e384)

src/AIS/AIS_InteractiveContext.cxx
src/SelectMgr/SelectMgr_ViewerSelector.cxx
src/SelectMgr/SelectMgr_ViewerSelector.hxx
tests/vselect/bugs/bug32482 [new file with mode: 0644]

index ba42fb6f8a37cb3f12d6f8a98bd914437556cb67..00513734ae2f516664f7da160b286ad2f1dd34ab 100644 (file)
@@ -682,6 +682,8 @@ void AIS_InteractiveContext::Remove (const Handle(AIS_InteractiveObject)& theIOb
 //=======================================================================
 void AIS_InteractiveContext::RemoveAll (const Standard_Boolean theToUpdateViewer)
 {
+  ClearDetected();
+
   AIS_ListOfInteractive aList;
   ObjectsInside (aList);
   for (AIS_ListOfInteractive::Iterator aListIterator (aList); aListIterator.More(); aListIterator.Next())
@@ -1899,7 +1901,6 @@ void AIS_InteractiveContext::ClearGlobal (const Handle(AIS_InteractiveObject)& t
   theIObj->ErasePresentations (true); // make sure highlighting presentations are properly erased
 
   // Object removes from Detected sequence
-  Standard_DISABLE_DEPRECATION_WARNINGS
   for (Standard_Integer aDetIter = myDetectedSeq.Lower(); aDetIter <= myDetectedSeq.Upper();)
   {
     Handle(SelectMgr_EntityOwner) aPicked = myMainSel->Picked (myDetectedSeq (aDetIter));
@@ -1927,7 +1928,6 @@ void AIS_InteractiveContext::ClearGlobal (const Handle(AIS_InteractiveObject)& t
       aDetIter++;
     }
   }
-  Standard_ENABLE_DEPRECATION_WARNINGS
 
   // remove IO from the selection manager to avoid memory leaks
   const Handle(SelectMgr_SelectableObject)& anObj = theIObj; // to avoid ambiguity
index 30805b3e38375a5a359c2f6208b9946340cfbae2..73622fb812b7fe6ceae65a1ecf49430c5d79ce2c 100644 (file)
@@ -165,6 +165,7 @@ SelectMgr_ViewerSelector::SelectMgr_ViewerSelector()
   myToUpdateTolerance (Standard_True),
   myCameraScale (1.0),
   myToPrebuildBVH (Standard_False),
+  myIsSorted (Standard_False),
   myIsLeftChildQueuedFirst (Standard_False)
 {
   myEntitySetBuilder = new BVH_BinnedBuilder<Standard_Real, 3, 4> (BVH_Constants_LeafNodeSizeSingle, BVH_Constants_MaxTreeDepth, Standard_True);
@@ -232,15 +233,6 @@ void SelectMgr_ViewerSelector::Deactivate (const Handle(SelectMgr_Selection)& th
   }
 }
 
-//==================================================
-// Function: Clear
-// Purpose :
-//==================================================
-void SelectMgr_ViewerSelector::Clear()
-{
-  mystored.Clear();
-}
-
 //=======================================================================
 // function: isToScaleFrustum
 // purpose : Checks if the entity given requires to scale current selecting frustum
@@ -598,6 +590,7 @@ void SelectMgr_ViewerSelector::TraverseSensitives()
   SelectMgr_BVHThreadPool::Sentry aSentry (myBVHThreadPool);
 
   mystored.Clear();
+  myIsSorted = false;
 
   Standard_Integer aWidth;
   Standard_Integer aHeight;
@@ -743,6 +736,38 @@ void SelectMgr_ViewerSelector::TraverseSensitives()
 void SelectMgr_ViewerSelector::ClearPicked()
 {
   mystored.Clear();
+  myIsSorted = true;
+}
+
+//==================================================
+// Function: RemovePicked
+// Purpose :
+//==================================================
+bool SelectMgr_ViewerSelector::RemovePicked (const Handle(SelectMgr_SelectableObject)& theObject)
+{
+  if (mystored.IsEmpty()
+  || !mySelectableObjects.Contains (theObject))
+  {
+    return false;
+  }
+
+  bool isRemoved = false;
+  for (Standard_Integer aPickIter = 1; aPickIter <= mystored.Extent(); ++aPickIter)
+  {
+    const Handle(SelectMgr_EntityOwner)& aStoredOwner = mystored.FindKey (aPickIter);
+    if (!aStoredOwner.IsNull()
+      && aStoredOwner->IsSameSelectable (theObject))
+    {
+      mystored.RemoveFromIndex (aPickIter);
+      --aPickIter;
+      isRemoved = true;
+    }
+  }
+  if (isRemoved)
+  {
+    myIsSorted = false;
+  }
+  return isRemoved;
 }
 
 //=======================================================================
@@ -756,7 +781,12 @@ Handle(SelectMgr_EntityOwner) SelectMgr_ViewerSelector::Picked (const Standard_I
     return Handle(SelectMgr_EntityOwner)();
   }
 
-  const Standard_Integer anOwnerIdx = myIndexes->Value (theRank);
+  if (!myIsSorted)
+  {
+    SortResult();
+  }
+
+  const Standard_Integer anOwnerIdx = myIndexes.Value (theRank);
   const Handle(SelectMgr_EntityOwner)& aStoredOwner = mystored.FindKey (anOwnerIdx);
   return aStoredOwner;
 }
@@ -768,7 +798,12 @@ Handle(SelectMgr_EntityOwner) SelectMgr_ViewerSelector::Picked (const Standard_I
 const SelectMgr_SortCriterion& SelectMgr_ViewerSelector::PickedData(const Standard_Integer theRank) const
 {
   Standard_OutOfRange_Raise_if (theRank < 1 || theRank > NbPicked(), "SelectMgr_ViewerSelector::PickedData() out of range index");
-  const Standard_Integer anOwnerIdx = myIndexes->Value (theRank);
+  if (!myIsSorted)
+  {
+    SortResult();
+  }
+
+  const Standard_Integer anOwnerIdx = myIndexes.Value (theRank);
   return mystored.FindFromIndex (anOwnerIdx);
 }
 
@@ -894,25 +929,26 @@ TCollection_AsciiString SelectMgr_ViewerSelector::Status (const Handle(SelectMgr
 //function : SortResult
 //purpose  :
 //=======================================================================
-void SelectMgr_ViewerSelector::SortResult()
+void SelectMgr_ViewerSelector::SortResult() const
 {
   if (mystored.IsEmpty())
   {
+    myIsSorted = true;
     return;
   }
 
   const Standard_Integer anExtent = mystored.Extent();
-  if (myIndexes.IsNull() || anExtent != myIndexes->Length())
+  if (anExtent != myIndexes.Length())
   {
-    myIndexes = new TColStd_HArray1OfInteger (1, anExtent);
+    myIndexes.Resize (1, anExtent, false);
   }
 
-  TColStd_Array1OfInteger& anIndexArray = myIndexes->ChangeArray1();
   for (Standard_Integer anIndexIter = 1; anIndexIter <= anExtent; ++anIndexIter)
   {
-    anIndexArray.SetValue (anIndexIter, anIndexIter);
+    myIndexes.SetValue (anIndexIter, anIndexIter);
   }
-  std::sort (anIndexArray.begin(), anIndexArray.end(), CompareResults (mystored, myToPreferClosest));
+  std::sort (myIndexes.begin(), myIndexes.end(), CompareResults (mystored, myToPreferClosest));
+  myIsSorted = true;
 }
 
 //=======================================================================
@@ -966,6 +1002,7 @@ void SelectMgr_ViewerSelector::RemoveSelectableObject (const Handle(SelectMgr_Se
   Handle(SelectMgr_SelectableObject) anObj = theObject;
   if (myMapOfObjectSensitives.UnBind (theObject))
   {
+    RemovePicked (theObject);
     mySelectableObjects.Remove (theObject);
   }
 }
@@ -1110,8 +1147,7 @@ void SelectMgr_ViewerSelector::DumpJson (Standard_OStream& theOStream, Standard_
   OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &myCameraDir)
   OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myCameraScale)
 
-  if (!myIndexes.IsNull())
-    OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myIndexes->Size())
+  OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myIndexes.Size())
 
   OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myIsLeftChildQueuedFirst)
   OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myMapOfObjectSensitives.Extent())
index 01284146fa7240817683d2a379f1aa4459274054..6153833fc309b021658e0bf69ececcc6270e6a7e 100644 (file)
@@ -84,9 +84,6 @@ class SelectMgr_ViewerSelector : public Standard_Transient
   friend class SelectMgr_SelectionManager;
 public:
 
-  //! Empties all the tables, removes all selections...
-  Standard_EXPORT void Clear();
-
   //! Returns custom pixel tolerance value.
   Standard_Integer CustomPixelTolerance() const { return myTolerances.CustomTolerance(); }
 
@@ -99,8 +96,8 @@ public:
   //! Returns the largest pixel tolerance.
   Standard_Integer PixelTolerance() const { return myTolerances.Tolerance(); }
 
-  //! Sorts the detected entites by priority and distance.
-  Standard_EXPORT virtual void SortResult();
+  //! Sorts the detected entities by priority and distance.
+  Standard_EXPORT virtual void SortResult() const;
 
   //! Returns the picked element with the highest priority,
   //! and which is the closest to the last successful mouse position.
@@ -144,6 +141,9 @@ public:
   //! Clears picking results.
   Standard_EXPORT void ClearPicked();
 
+  //! Empties all the tables, removes all selections...
+  void Clear() { ClearPicked(); }
+
   //! Returns the entity Owner for the object picked at specified position.
   //! @param theRank rank of detected object within range 1...NbPicked()
   Standard_EXPORT Handle(SelectMgr_EntityOwner) Picked (const Standard_Integer theRank) const;
@@ -161,6 +161,9 @@ public:
   //! @param theRank rank of detected object within range 1...NbPicked()
   gp_Pnt PickedPoint (const Standard_Integer theRank) const { return PickedData (theRank).Point; }
 
+  //! Remove picked entities associated with specified object.
+  Standard_EXPORT Standard_Boolean RemovePicked (const Handle(SelectMgr_SelectableObject)& theObject);
+
   Standard_EXPORT Standard_Boolean Contains (const Handle(SelectMgr_SelectableObject)& theObject) const;
 
   //! Returns the default builder used to construct BVH of entity set.
@@ -343,7 +346,8 @@ protected:
   Standard_Boolean                              myToPrebuildBVH;
   Handle(SelectMgr_BVHThreadPool)               myBVHThreadPool;
 
-  Handle(TColStd_HArray1OfInteger)             myIndexes;
+  mutable TColStd_Array1OfInteger              myIndexes;
+  mutable Standard_Boolean                     myIsSorted;
   Standard_Boolean                             myIsLeftChildQueuedFirst;
   SelectMgr_MapOfObjectSensitives              myMapOfObjectSensitives;
 
diff --git a/tests/vselect/bugs/bug32482 b/tests/vselect/bugs/bug32482
new file mode 100644 (file)
index 0000000..760938b
--- /dev/null
@@ -0,0 +1,17 @@
+puts "========"
+puts "0032482: Visualization - Object owner isn't removed from picked owner when object is removed"
+puts "========"
+puts ""
+
+pload MODELING VISUALIZATION
+box b1 1 2 3
+box b2 -0.5 -0.5 -0.5 3 2 1
+vinit View1
+vdisplay -dispMode 1 b1 b2
+vfit
+vmoveto 200 200
+vstate -entities
+vremove b1
+vstate -entities
+
+vdump $imagedir/${casename}.png