]> OCCT Git - occt.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)
committerbugmaster <bugmaster@opencascade.com>
Sat, 31 Jul 2021 10:11:27 +0000 (13:11 +0300)
SelectMgr_ViewerSelector::RemoveSelectableObject() now removes object from picking results.

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 3566fcab4e9881088224add888a3cdf8484dd8e6..fee11abb9f38211a3723a90fee460617791468e9 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 1ebf8c16045a1ed51c4413b5305132585c0543ea..d1e646928e95ada38f3559479c83fc935b8ec34a 100644 (file)
@@ -165,6 +165,7 @@ SelectMgr_ViewerSelector::SelectMgr_ViewerSelector()
   myToPreferClosest (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);
@@ -228,15 +229,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
@@ -612,6 +604,7 @@ void SelectMgr_ViewerSelector::TraverseSensitives()
   SelectMgr_BVHThreadPool::Sentry aSentry (myBVHThreadPool);
 
   mystored.Clear();
+  myIsSorted = false;
 
   Graphic3d_Vec2i aWinSize;
   mySelectingVolumeMgr.WindowSize (aWinSize.x(), aWinSize.y());
@@ -760,6 +753,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;
 }
 
 //=======================================================================
@@ -773,7 +798,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;
 }
@@ -785,7 +815,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);
 }
 
@@ -911,25 +946,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;
 }
 
 //=======================================================================
@@ -983,6 +1019,7 @@ void SelectMgr_ViewerSelector::RemoveSelectableObject (const Handle(SelectMgr_Se
   Handle(SelectMgr_SelectableObject) anObj = theObject;
   if (myMapOfObjectSensitives.UnBind (theObject))
   {
+    RemovePicked (theObject);
     mySelectableObjects.Remove (theObject);
   }
 }
@@ -1118,8 +1155,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 fc8ea81b8f5adc53f26df68141e99909c50d094a..ef5b6276c8dde3152914e64aa721ca1e0ec242c4 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.
@@ -341,7 +344,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