0026213: Visualization - replace sequence in Select3D_SensitiveGroup
authorkgv <kgv@opencascade.com>
Mon, 10 Jul 2017 10:40:54 +0000 (13:40 +0300)
committerbugmaster <bugmaster@opencascade.com>
Thu, 13 Jul 2017 09:27:48 +0000 (12:27 +0300)
NCollection_IndexedMap is now used instead of NCollection_Sequence within Select3D_SensitiveGroup.

src/NCollection/NCollection_IndexedMap.hxx
src/Select3D/FILES
src/Select3D/Select3D_IndexedMapOfEntity.hxx [new file with mode: 0644]
src/Select3D/Select3D_SensitiveGroup.cxx
src/Select3D/Select3D_SensitiveGroup.hxx
src/StdSelect/StdSelect_BRepSelectionTool.cxx

index 8dd3a28..f9a150c 100644 (file)
@@ -415,12 +415,16 @@ public:
 
   //! Remove the given key.
   //! Caution! The index of the last key can be changed.
-  void RemoveKey(const TheKeyType& theKey1)
+  Standard_Boolean RemoveKey (const TheKeyType& theKey1)
   {
     Standard_Integer anIndToRemove = FindIndex(theKey1);
-    if (anIndToRemove > 0) {
-      RemoveFromIndex(anIndToRemove);
+    if (anIndToRemove < 1)
+    {
+      return Standard_False;
     }
+
+    RemoveFromIndex (anIndToRemove);
+    return Standard_True;
   }
 
   //! FindKey
index 43bee8b..24e8443 100755 (executable)
@@ -2,6 +2,7 @@ Select3D_BndBox3d.hxx
 Select3D_BVHBuilder3d.hxx
 Select3D_BVHIndexBuffer.hxx
 Select3D_EntitySequence.hxx
+Select3D_IndexedMapOfEntity.hxx
 Select3D_InteriorSensitivePointSet.cxx
 Select3D_InteriorSensitivePointSet.hxx
 Select3D_Pnt.hxx
diff --git a/src/Select3D/Select3D_IndexedMapOfEntity.hxx b/src/Select3D/Select3D_IndexedMapOfEntity.hxx
new file mode 100644 (file)
index 0000000..4b54dea
--- /dev/null
@@ -0,0 +1,22 @@
+// Copyright (c) 2017 OPEN CASCADE SAS
+//
+// This file is part of Open CASCADE Technology software library.
+//
+// This library is free software; you can redistribute it and/or modify it under
+// the terms of the GNU Lesser General Public License version 2.1 as published
+// by the Free Software Foundation, with special exception defined in the file
+// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
+// distribution for complete text of the license and disclaimer of any warranty.
+//
+// Alternatively, this file may be used under the terms of Open CASCADE
+// commercial license or contractual agreement.
+
+#ifndef _Select3D_IndexedMapOfEntity_Header
+#define _Select3D_IndexedMapOfEntity_Header
+
+#include <NCollection_IndexedMap.hxx>
+
+class Select3D_SensitiveEntity;
+typedef NCollection_IndexedMap<Handle(Select3D_SensitiveEntity)> Select3D_IndexedMapOfEntity;
+
+#endif // _Select3D_IndexedMapOfEntity_Header
index b4d5896..2b6aad8 100644 (file)
@@ -39,6 +39,7 @@ Select3D_SensitiveGroup::Select3D_SensitiveGroup (const Handle(SelectBasics_Enti
                                                   Select3D_EntitySequence& theEntities,
                                                   const Standard_Boolean theIsMustMatchAll)
 : Select3D_SensitiveSet (theOwnerId),
+  myEntities (Max (1, theEntities.Size())),
   myMustMatchAll (theIsMustMatchAll),
   myToCheckOverlapAll (Standard_False),
   myCenter (0.0, 0.0, 0.0)
@@ -46,13 +47,18 @@ Select3D_SensitiveGroup::Select3D_SensitiveGroup (const Handle(SelectBasics_Enti
   for (Select3D_EntitySequenceIter anIter (theEntities); anIter.More(); anIter.Next())
   {
     const Handle(Select3D_SensitiveEntity)& anEntity = anIter.Value();
-    myEntities.Append (anEntity);
+    const Standard_Integer aPrevExtent = myEntities.Extent();
+    if (myEntities.Add (anEntity) <= aPrevExtent)
+    {
+      continue;
+    }
+
     myBndBox.Combine (anEntity->BoundingBox());
-    myBVHPrimIndexes.Append (myEntities.Size());
+    myBVHPrimIndexes.Append (myEntities.Extent());
     myCenter.ChangeCoord() += anEntity->CenterOfGeometry().XYZ();
   }
 
-  myCenter.ChangeCoord().Divide (static_cast<Standard_Real> (myEntities.Size()));
+  myCenter.ChangeCoord().Divide (static_cast<Standard_Real> (myEntities.Extent()));
 
   MarkDirty();
 }
@@ -63,15 +69,27 @@ Select3D_SensitiveGroup::Select3D_SensitiveGroup (const Handle(SelectBasics_Enti
 //=======================================================================
 void Select3D_SensitiveGroup::Add (Select3D_EntitySequence& theEntities)
 {
+  if (theEntities.IsEmpty())
+  {
+    return;
+  }
+
   gp_Pnt aCent (0.0, 0.0, 0.0);
+  myEntities.ReSize (myEntities.Extent() + theEntities.Size());
   for (Select3D_EntitySequenceIter anIter (theEntities); anIter.More(); anIter.Next())
   {
-    myEntities.Append (anIter.Value());
-    myBndBox.Combine (anIter.Value()->BoundingBox());
-    myBVHPrimIndexes.Append (myEntities.Size());
-    aCent.ChangeCoord() += anIter.Value()->CenterOfGeometry().XYZ();
+    const Handle(Select3D_SensitiveEntity)& anEntity = anIter.Value();
+    const Standard_Integer aPrevExtent = myEntities.Extent();
+    if (myEntities.Add (anEntity) <= aPrevExtent)
+    {
+      continue;
+    }
+
+    myBndBox.Combine (anEntity->BoundingBox());
+    myBVHPrimIndexes.Append (myEntities.Extent());
+    aCent.ChangeCoord() += anEntity->CenterOfGeometry().XYZ();
   }
-  aCent.ChangeCoord().Divide (myEntities.Length());
+  aCent.ChangeCoord().Divide (myEntities.Extent());
   myCenter = (myCenter.XYZ() + aCent.XYZ()).Multiplied (0.5);
 }
 
@@ -81,16 +99,16 @@ void Select3D_SensitiveGroup::Add (Select3D_EntitySequence& theEntities)
 //=======================================================================
 void Select3D_SensitiveGroup::Add (const Handle(Select3D_SensitiveEntity)& theSensitive)
 {
-  for (Select3D_EntitySequenceIter anIter (myEntities); anIter.More(); anIter.Next())
+  const Standard_Integer aPrevExtent = myEntities.Extent();
+  if (myEntities.Add (theSensitive) <= aPrevExtent)
   {
-    if (anIter.Value() == theSensitive)
-      return;
+    return;
   }
-  myEntities.Append (theSensitive);
-  myBVHPrimIndexes.Append (myEntities.Size());
+
+  myBVHPrimIndexes.Append (myEntities.Extent());
   myBndBox.Combine (theSensitive->BoundingBox());
   myCenter.ChangeCoord() += theSensitive->CenterOfGeometry().XYZ();
-  if (myEntities.First() != myEntities.Last())
+  if (myEntities.Extent() >= 2)
   {
     myCenter.ChangeCoord().Multiply (0.5);
   }
@@ -102,30 +120,22 @@ void Select3D_SensitiveGroup::Add (const Handle(Select3D_SensitiveEntity)& theSe
 //=======================================================================
 void Select3D_SensitiveGroup::Remove (const Handle(Select3D_SensitiveEntity)& theSensitive)
 {
-  Standard_Boolean isSensitiveRemoved = Standard_False;
-  for (Select3D_EntitySequenceIter anIter (myEntities); anIter.More(); anIter.Next())
+  if (!myEntities.RemoveKey (theSensitive))
   {
-    if (anIter.Value() == theSensitive)
-    {
-      myEntities.Remove (anIter);
-      isSensitiveRemoved = Standard_True;
-      break;
-    }
+    return;
   }
 
-  if (isSensitiveRemoved)
+  myBndBox.Clear();
+  myCenter = gp_Pnt (0.0, 0.0, 0.0);
+  myBVHPrimIndexes.Clear();
+  for (Standard_Integer anIdx = 1; anIdx <= myEntities.Size(); ++anIdx)
   {
-    myBndBox.Clear();
-    myCenter = gp_Pnt (0.0, 0.0, 0.0);
-    myBVHPrimIndexes.Clear();
-    for (Standard_Integer anIdx = 1; anIdx <= myEntities.Size(); ++anIdx)
-    {
-      myBndBox.Combine (myEntities.Value (anIdx)->BoundingBox());
-      myCenter.ChangeCoord() += myEntities.Value (anIdx)->CenterOfGeometry().XYZ();
-      myBVHPrimIndexes.Append (anIdx);
-    }
-    myCenter.ChangeCoord().Divide (static_cast<Standard_Real> (myEntities.Size()));
+    const Handle(Select3D_SensitiveEntity)& anEntity = myEntities.FindKey (anIdx);
+    myBndBox.Combine (anEntity->BoundingBox());
+    myCenter.ChangeCoord() += anEntity->CenterOfGeometry().XYZ();
+    myBVHPrimIndexes.Append (anIdx);
   }
+  myCenter.ChangeCoord().Divide (static_cast<Standard_Real> (myEntities.Extent()));
 }
 
 //=======================================================================
@@ -134,12 +144,7 @@ void Select3D_SensitiveGroup::Remove (const Handle(Select3D_SensitiveEntity)& th
 //=======================================================================
 Standard_Boolean Select3D_SensitiveGroup::IsIn (const Handle(Select3D_SensitiveEntity)& theSensitive) const
 {
-  for(Select3D_EntitySequenceIter anIter (myEntities); anIter.More(); anIter.Next())
-  {
-    if (anIter.Value() == theSensitive)
-      return Standard_True;
-  }
-  return Standard_False;
+  return myEntities.Contains (theSensitive);
 }
 
 //=======================================================================
@@ -173,9 +178,9 @@ Handle(Select3D_SensitiveEntity) Select3D_SensitiveGroup::GetConnected()
 {
   Handle(Select3D_SensitiveGroup) aNewEntity = new Select3D_SensitiveGroup (myOwnerId, myMustMatchAll);
   Select3D_EntitySequence aConnectedEnt;
-  for (Select3D_EntitySequenceIter It (myEntities); It.More(); It.Next()) 
+  for (Select3D_IndexedMapOfEntity::Iterator anEntityIter (myEntities); anEntityIter.More(); anEntityIter.Next())
   {
-    aConnectedEnt.Append (It.Value()->GetConnected());
+    aConnectedEnt.Append (anEntityIter.Value()->GetConnected());
   }
   aNewEntity->Add (aConnectedEnt);
   return aNewEntity;
@@ -200,10 +205,10 @@ Standard_Boolean Select3D_SensitiveGroup::Matches (SelectBasics_SelectingVolumeM
   Standard_Real aDepth     = RealLast();
   Standard_Real aDistToCOG = RealLast();
   Standard_Boolean isFailed = Standard_False;
-  for (Select3D_EntitySequenceIter anIt (myEntities); anIt.More(); anIt.Next())
+  for (Select3D_IndexedMapOfEntity::Iterator anEntityIter (myEntities); anEntityIter.More(); anEntityIter.Next())
   {
     SelectBasics_PickResult aMatchResult;
-    Handle(Select3D_SensitiveEntity)& aChild = anIt.ChangeValue();
+    const Handle(Select3D_SensitiveEntity)& aChild = anEntityIter.Value();
     if (!aChild->Matches (theMgr, aMatchResult))
     {
       if (toMatchAll)
@@ -238,9 +243,10 @@ Standard_Boolean Select3D_SensitiveGroup::Matches (SelectBasics_SelectingVolumeM
 void Select3D_SensitiveGroup::Set (const Handle(SelectBasics_EntityOwner)& theOwnerId)
 { 
   Select3D_SensitiveEntity::Set (theOwnerId);
-  // set TheOwnerId for each element of sensitive group
-  for (Select3D_EntitySequenceIter anIter (myEntities); anIter.More(); anIter.Next())
-    anIter.Value()->Set (theOwnerId);
+  for (Select3D_IndexedMapOfEntity::Iterator anEntityIter (myEntities); anEntityIter.More(); anEntityIter.Next())
+  {
+    anEntityIter.Value()->Set (theOwnerId);
+  }
 }
 
 //=======================================================================
@@ -255,9 +261,9 @@ Select3D_BndBox3d Select3D_SensitiveGroup::BoundingBox()
 
   // do not apply the transformation because sensitives AABBs
   // are already transformed
-  for (Select3D_EntitySequenceIter anIter (myEntities); anIter.More(); anIter.Next())
+  for (Select3D_IndexedMapOfEntity::Iterator anEntityIter (myEntities); anEntityIter.More(); anEntityIter.Next())
   {
-    myBndBox.Combine (anIter.Value()->BoundingBox());
+    myBndBox.Combine (anEntityIter.Value()->BoundingBox());
   }
 
   return myBndBox;
@@ -280,7 +286,7 @@ gp_Pnt Select3D_SensitiveGroup::CenterOfGeometry() const
 Select3D_BndBox3d Select3D_SensitiveGroup::Box (const Standard_Integer theIdx) const
 {
   const Standard_Integer anElemIdx = myBVHPrimIndexes.Value (theIdx);
-  return myEntities.Value (anElemIdx)->BoundingBox();
+  return myEntities.FindKey (anElemIdx)->BoundingBox();
 }
 
 //=======================================================================
@@ -292,7 +298,7 @@ Standard_Real Select3D_SensitiveGroup::Center (const Standard_Integer theIdx,
                                                const Standard_Integer theAxis) const
 {
   const Standard_Integer anElemIdx = myBVHPrimIndexes.Value (theIdx);
-  const gp_Pnt aCenter = myEntities.Value (anElemIdx)->CenterOfGeometry();
+  const gp_Pnt aCenter = myEntities.FindKey (anElemIdx)->CenterOfGeometry();
   return theAxis == 0 ? aCenter.X() : (theAxis == 1 ? aCenter.Y() : aCenter.Z());
 }
 
@@ -331,7 +337,7 @@ Standard_Boolean Select3D_SensitiveGroup::overlapsElement (SelectBasics_Selectin
   theMatchDepth = RealLast();
   const Standard_Integer aSensitiveIdx = myBVHPrimIndexes.Value (theElemIdx);
   SelectBasics_PickResult aResult;
-  if (myEntities.Value (aSensitiveIdx)->Matches (theMgr, aResult))
+  if (myEntities.FindKey (aSensitiveIdx)->Matches (theMgr, aResult))
   {
     theMatchDepth = aResult.Depth();
     return Standard_True;
index 3781e2f..a7d3da9 100644 (file)
@@ -18,6 +18,7 @@
 #define _Select3D_SensitiveGroup_HeaderFile
 
 #include <Select3D_EntitySequence.hxx>
+#include <Select3D_IndexedMapOfEntity.hxx>
 #include <Select3D_SensitiveEntity.hxx>
 #include <Select3D_SensitiveSet.hxx>
 #include <SelectMgr_SelectingVolumeManager.hxx>
@@ -48,19 +49,19 @@ public:
                                            const Standard_Boolean theIsMustMatchAll = Standard_True);
 
   //! Gets group content
-  const Select3D_EntitySequence& GetEntities() const { return myEntities; }
+  const Select3D_IndexedMapOfEntity& Entities() const { return myEntities; }
 
   //! Access entity by index [1, NbSubElements()].
   const Handle(Select3D_SensitiveEntity)& SubEntity (const Standard_Integer theIndex) const
   {
-    return myEntities.Value (theIndex);
+    return myEntities.FindKey (theIndex);
   }
 
   //! Return last detected entity.
   Handle(Select3D_SensitiveEntity) LastDetectedEntity() const
   {
     const Standard_Integer anIndex = LastDetectedEntityIndex();
-    return anIndex != -1 ? myEntities.Value (anIndex) : Handle(Select3D_SensitiveEntity)();
+    return anIndex != -1 ? myEntities.FindKey (anIndex) : Handle(Select3D_SensitiveEntity)();
   }
 
   //! Return index of last detected entity.
@@ -158,7 +159,7 @@ private:
 
 private:
 
-  Select3D_EntitySequence              myEntities;           //!< Grouped sensitive entities
+  Select3D_IndexedMapOfEntity          myEntities;           //!< Grouped sensitive entities
   Standard_Boolean                     myMustMatchAll;       //!< Determines whether all entities in the group should be overlapped or not
   Standard_Boolean                     myToCheckOverlapAll;  //!< flag to check overlapping with all entities within rectangular/polygonal selection
   gp_Pnt                               myCenter;             //!< Center of geometry of the group
index c863465..d4dee25 100644 (file)
@@ -87,8 +87,7 @@ void StdSelect_BRepSelectionTool::PreBuildBVH (const Handle(SelectMgr_Selection)
     }
 
     Handle(Select3D_SensitiveGroup) aGroup = Handle(Select3D_SensitiveGroup)::DownCast (aSensitive);
-    const Select3D_EntitySequence& aSubEntities = aGroup->GetEntities();
-    for (Select3D_EntitySequenceIter aSubEntitiesIter (aSubEntities); aSubEntitiesIter.More(); aSubEntitiesIter.Next())
+    for (Select3D_IndexedMapOfEntity::Iterator aSubEntitiesIter (aGroup->Entities()); aSubEntitiesIter.More(); aSubEntitiesIter.Next())
     {
       const Handle(Select3D_SensitiveEntity)& aSubEntity = aSubEntitiesIter.Value();
       if (aSubEntity->NbSubElements() >= BVH_PRIMITIVE_LIMIT)