ffd330b862c2b06898376bbc7aa40ce1b2885484
[occt.git] / src / SelectMgr / SelectMgr_SelectableObjectSet.cxx
1 // Created on: 2014-08-15
2 // Created by: Varvara POSKONINA
3 // Copyright (c) 2005-2014 OPEN CASCADE SAS
4 //
5 // This file is part of Open CASCADE Technology software library.
6 //
7 // This library is free software; you can redistribute it and/or modify it under
8 // the terms of the GNU Lesser General Public License version 2.1 as published
9 // by the Free Software Foundation, with special exception defined in the file
10 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
11 // distribution for complete text of the license and disclaimer of any warranty.
12 //
13 // Alternatively, this file may be used under the terms of Open CASCADE
14 // commercial license or contractual agreement.
15
16 #include <Bnd_Box.hxx>
17 #include <BVH_BinnedBuilder.hxx>
18
19 #include <SelectMgr_SelectableObjectSet.hxx>
20
21 //=======================================================================
22 // function : SelectMgr_SelectableObjectSet
23 // purpose  : Creates new empty objects set and initializes BVH tree
24 //            builder to Binned builder with 1 element per list
25 //=======================================================================
26 SelectMgr_SelectableObjectSet::SelectMgr_SelectableObjectSet()
27 {
28   myBuilder = new BVH_BinnedBuilder<Standard_Real, 3, 32> (1, 32, Standard_False);
29 }
30
31 //=======================================================================
32 // function : Append
33 // purpose  : Adds new object to the set and marks BVH tree for rebuild
34 //=======================================================================
35 void SelectMgr_SelectableObjectSet::Append (const Handle(SelectMgr_SelectableObject)& theObject)
36 {
37   if (Size() < myObjects.Add (theObject))
38   {
39     MarkDirty();
40   }
41 }
42
43 //=======================================================================
44 // function : Remove
45 // purpose  : Removes object theObject from set and marks BVH tree for
46 //            rebuild
47 //=======================================================================
48 void SelectMgr_SelectableObjectSet::Remove (const Handle(SelectMgr_SelectableObject)& theObject)
49 {
50   const Standard_Integer anIndex = myObjects.FindIndex (theObject);
51
52   if (anIndex != 0)
53   {
54     Swap (anIndex - 1, Size() - 1);
55
56     myObjects.RemoveLast();
57
58     MarkDirty();
59   }
60 }
61
62 //=======================================================================
63 // function : Box
64 // purpose  : Returns bounding box of object with index theIndex
65 //=======================================================================
66 Select3D_BndBox3d SelectMgr_SelectableObjectSet::Box (const Standard_Integer theIndex) const
67 {
68   const Handle(SelectMgr_SelectableObject)& anObject = GetObjectById (theIndex);
69   Bnd_Box aBox;
70   anObject->BoundingBox (aBox);
71   if (aBox.IsVoid())
72     return Select3D_BndBox3d();
73
74   return Select3D_BndBox3d (SelectMgr_Vec3 (aBox.CornerMin().X(), aBox.CornerMin().Y(), aBox.CornerMin().Z()),
75                             SelectMgr_Vec3 (aBox.CornerMax().X(), aBox.CornerMax().Y(), aBox.CornerMax().Z()));
76 }
77
78 //=======================================================================
79 // function : Center
80 // purpose  : Returns center of object with index theIndex in the set
81 //            along the given axis theAxis
82 //=======================================================================
83 Standard_Real SelectMgr_SelectableObjectSet::Center (const Standard_Integer theIndex,
84                                                      const Standard_Integer theAxis) const
85 {
86   Select3D_BndBox3d aBndBox = Box (theIndex);
87
88   return (aBndBox.CornerMin()[theAxis] +
89           aBndBox.CornerMax()[theAxis]) * 0.5;
90 }
91
92 //=======================================================================
93 // function : Swap
94 // purpose  : Swaps items with indexes theIndex1 and theIndex2 in the set
95 //=======================================================================
96 void SelectMgr_SelectableObjectSet::Swap (const Standard_Integer theIndex1,
97                                           const Standard_Integer theIndex2)
98 {
99   const Standard_Integer aIndex1 = theIndex1 + 1;
100   const Standard_Integer aIndex2 = theIndex2 + 1;
101
102   Handle(SelectMgr_SelectableObject) anObject1 = myObjects.FindKey (aIndex1);
103   Handle(SelectMgr_SelectableObject) anObject2 = myObjects.FindKey (aIndex2);
104
105   myObjects.Substitute (aIndex1, EMPTY_OBJ);
106   myObjects.Substitute (aIndex2, anObject1);
107   myObjects.Substitute (aIndex1, anObject2);
108 }
109
110 //=======================================================================
111 // function : Size
112 // purpose  : Returns size of objects set
113 //=======================================================================
114 Standard_Integer SelectMgr_SelectableObjectSet::Size() const
115 {
116   return myObjects.Size();
117 }
118
119 //=======================================================================
120 // function : GetObjectById
121 // purpose  : Returns object from set by theIndex given
122 //=======================================================================
123 const Handle(SelectMgr_SelectableObject)& SelectMgr_SelectableObjectSet::GetObjectById (const Standard_Integer theIndex) const
124 {
125   return myObjects.FindKey (theIndex + 1);
126 }
127
128 //=======================================================================
129 // function : Contains
130 // purpose  : Returns true if this objects set contains theObject given
131 //=======================================================================
132 Standard_Boolean SelectMgr_SelectableObjectSet::Contains (const Handle(SelectMgr_SelectableObject)& theObject) const
133 {
134   return myObjects.Contains (theObject);
135 }