From: kgv Date: Mon, 10 Jul 2017 10:40:54 +0000 (+0300) Subject: 0026213: Visualization - replace sequence in Select3D_SensitiveGroup X-Git-Tag: V7_2_0_beta~48 X-Git-Url: http://git.dev.opencascade.org/gitweb/?p=occt.git;a=commitdiff_plain;h=7f5945d6883af573b8ff0f1bbad42c72c1f4ea72 0026213: Visualization - replace sequence in Select3D_SensitiveGroup NCollection_IndexedMap is now used instead of NCollection_Sequence within Select3D_SensitiveGroup. --- diff --git a/src/NCollection/NCollection_IndexedMap.hxx b/src/NCollection/NCollection_IndexedMap.hxx index 8dd3a28895..f9a150c06e 100644 --- a/src/NCollection/NCollection_IndexedMap.hxx +++ b/src/NCollection/NCollection_IndexedMap.hxx @@ -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 diff --git a/src/Select3D/FILES b/src/Select3D/FILES index 43bee8b6ca..24e8443be9 100755 --- a/src/Select3D/FILES +++ b/src/Select3D/FILES @@ -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 index 0000000000..4b54dea0c7 --- /dev/null +++ b/src/Select3D/Select3D_IndexedMapOfEntity.hxx @@ -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 + +class Select3D_SensitiveEntity; +typedef NCollection_IndexedMap Select3D_IndexedMapOfEntity; + +#endif // _Select3D_IndexedMapOfEntity_Header diff --git a/src/Select3D/Select3D_SensitiveGroup.cxx b/src/Select3D/Select3D_SensitiveGroup.cxx index b4d5896293..2b6aad8861 100644 --- a/src/Select3D/Select3D_SensitiveGroup.cxx +++ b/src/Select3D/Select3D_SensitiveGroup.cxx @@ -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 (myEntities.Size())); + myCenter.ChangeCoord().Divide (static_cast (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 (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 (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; diff --git a/src/Select3D/Select3D_SensitiveGroup.hxx b/src/Select3D/Select3D_SensitiveGroup.hxx index 3781e2f59c..a7d3da932a 100644 --- a/src/Select3D/Select3D_SensitiveGroup.hxx +++ b/src/Select3D/Select3D_SensitiveGroup.hxx @@ -18,6 +18,7 @@ #define _Select3D_SensitiveGroup_HeaderFile #include +#include #include #include #include @@ -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 diff --git a/src/StdSelect/StdSelect_BRepSelectionTool.cxx b/src/StdSelect/StdSelect_BRepSelectionTool.cxx index c8634654b1..d4dee25c7d 100644 --- a/src/StdSelect/StdSelect_BRepSelectionTool.cxx +++ b/src/StdSelect/StdSelect_BRepSelectionTool.cxx @@ -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)