4c5738c1031e99a72a24fa51ba07a5e1b7e4f649
[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   myObjects.Append (theObject);
38   myObjectIdxs.Append (myObjects.Size());
39
40   MarkDirty();
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   for (Standard_Integer anObjectIdx = 1; anObjectIdx <= myObjects.Size(); ++anObjectIdx)
51   {
52     if (myObjects.Value (anObjectIdx) == theObject)
53     {
54       myObjects.Remove (anObjectIdx);
55       myObjectIdxs.Clear();
56       for (Standard_Integer anObjIdxsIter = 1; anObjIdxsIter <= myObjects.Size(); ++anObjIdxsIter)
57       {
58         myObjectIdxs.Append (anObjIdxsIter);
59       }
60       MarkDirty();
61       break;
62     }
63   }
64 }
65
66 //=======================================================================
67 // function : Box
68 // purpose  : Returns bounding box of object with index theIndex
69 //=======================================================================
70 Select3D_BndBox3d SelectMgr_SelectableObjectSet::Box (const Standard_Integer theIndex) const
71 {
72   const Handle(SelectMgr_SelectableObject)& anObject = GetObjectById (theIndex);
73   Bnd_Box aBox;
74   anObject->BoundingBox (aBox);
75   if (aBox.IsVoid())
76     return Select3D_BndBox3d();
77
78   return Select3D_BndBox3d (SelectMgr_Vec3 (aBox.CornerMin().X(), aBox.CornerMin().Y(), aBox.CornerMin().Z()),
79                             SelectMgr_Vec3 (aBox.CornerMax().X(), aBox.CornerMax().Y(), aBox.CornerMax().Z()));
80 }
81
82 //=======================================================================
83 // function : Center
84 // purpose  : Returns center of object with index theIndex in the set
85 //            along the given axis theAxis
86 //=======================================================================
87 Standard_Real SelectMgr_SelectableObjectSet::Center (const Standard_Integer theIndex,
88                                                      const Standard_Integer theAxis) const
89 {
90   Select3D_BndBox3d aBndBox = Box (theIndex);
91   Standard_Real aCenter = theAxis == 0 ? (aBndBox.CornerMin().x() + aBndBox.CornerMax().x()) * 0.5 :
92     (theAxis == 1 ? (aBndBox.CornerMin().y() + aBndBox.CornerMax().y()) * 0.5 :
93                     (aBndBox.CornerMin().z() + aBndBox.CornerMax().z()) * 0.5);
94
95   return aCenter;
96 }
97
98 //=======================================================================
99 // function : Swap
100 // purpose  : Swaps items with indexes theIndex1 and theIndex2 in the set
101 //=======================================================================
102 void SelectMgr_SelectableObjectSet::Swap (const Standard_Integer theIndex1,
103                                           const Standard_Integer theIndex2)
104 {
105   Standard_Integer anObjectIdx1 = myObjectIdxs.Value (theIndex1 + 1);
106   Standard_Integer anObjectIdx2 = myObjectIdxs.Value (theIndex2 + 1);
107   myObjectIdxs.ChangeValue (theIndex1 + 1) = anObjectIdx2;
108   myObjectIdxs.ChangeValue (theIndex2 + 1) = anObjectIdx1;
109 }
110
111 //=======================================================================
112 // function : Size
113 // purpose  : Returns size of objects set
114 //=======================================================================
115 Standard_Integer SelectMgr_SelectableObjectSet::Size() const
116 {
117   return myObjectIdxs.Size();
118 }
119
120 //=======================================================================
121 // function : GetObjectById
122 // purpose  : Returns object from set by theIndex given
123 //=======================================================================
124 const Handle(SelectMgr_SelectableObject)& SelectMgr_SelectableObjectSet::GetObjectById
125                                                                          (const Standard_Integer theIndex) const
126 {
127   Standard_Integer anIdx = myObjectIdxs.Value (theIndex + 1);
128   return myObjects.Value (anIdx);
129 }
130
131 //=======================================================================
132 // function : Contains
133 // purpose  : Returns true if this objects set contains theObject given
134 //=======================================================================
135 Standard_Boolean SelectMgr_SelectableObjectSet::Contains (const Handle(SelectMgr_SelectableObject)& theObject) const
136 {
137   for (Standard_Integer anObjectIdx = 1; anObjectIdx <= myObjects.Size(); ++anObjectIdx)
138   {
139     if (myObjects.Value (anObjectIdx) == theObject)
140       return Standard_True;
141   }
142
143   return Standard_False;
144 }