0024002: Overall code and build procedure refactoring -- automatic
[occt.git] / src / BOPTools / BOPTools_Set.cxx
1 // Created by: Peter KURNEV
2 // Copyright (c) 1999-2014 OPEN CASCADE SAS
3 //
4 // This file is part of Open CASCADE Technology software library.
5 //
6 // This library is free software; you can redistribute it and/or modify it under
7 // the terms of the GNU Lesser General Public License version 2.1 as published
8 // by the Free Software Foundation, with special exception defined in the file
9 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
10 // distribution for complete text of the license and disclaimer of any warranty.
11 //
12 // Alternatively, this file may be used under the terms of Open CASCADE
13 // commercial license or contractual agreement.
14
15
16 #include <BOPCol_MapOfShape.hxx>
17 #include <BOPTools_Set.hxx>
18 #include <BRep_Tool.hxx>
19 #include <TopExp_Explorer.hxx>
20 #include <TopoDS_Edge.hxx>
21 #include <TopoDS_Shape.hxx>
22
23 static 
24   Standard_Integer NormalizedIds(const Standard_Integer aId,
25                                  const Standard_Integer aDiv);
26
27 //=======================================================================
28 //function : 
29 //purpose  : 
30 //=======================================================================
31 BOPTools_Set::BOPTools_Set() 
32 :
33   myAllocator(NCollection_BaseAllocator::CommonBaseAllocator()),
34   myShapes(myAllocator)
35 {
36   myNbShapes=0;
37   mySum=0;
38   myUpper=432123;
39 }
40 //=======================================================================
41 //function : 
42 //purpose  : 
43 //=======================================================================
44 BOPTools_Set::BOPTools_Set
45   (const Handle(NCollection_BaseAllocator)& theAllocator) 
46 :
47   myAllocator(theAllocator),
48   myShapes(myAllocator)
49
50   myNbShapes=0;
51   mySum=0;  
52   myUpper=432123;
53 }
54 //=======================================================================
55 //function :~ 
56 //purpose  : 
57 //=======================================================================
58 BOPTools_Set::~BOPTools_Set()
59 {
60   Clear();
61 }
62 //=======================================================================
63 //function : Clear
64 //purpose  : 
65 //=======================================================================
66 void BOPTools_Set::Clear()
67
68   myNbShapes=0;
69   mySum=0;
70   myShapes.Clear();
71 }
72 //=======================================================================
73 //function : NbShapes
74 //purpose  : 
75 //=======================================================================
76 Standard_Integer BOPTools_Set::NbShapes()const
77 {
78   return myNbShapes;
79 }
80 //=======================================================================
81 //function :Assign
82 //purpose  : 
83 //=======================================================================
84 BOPTools_Set& BOPTools_Set::Assign(const BOPTools_Set& theOther)
85
86   BOPCol_ListIteratorOfListOfShape aIt;
87   //
88   myShape=theOther.myShape;
89   myNbShapes=theOther.myNbShapes;
90   mySum=theOther.mySum;
91   myUpper=theOther.myUpper;
92   myAllocator=theOther.myAllocator;
93   //
94   myShapes.Clear();
95   aIt.Initialize(theOther.myShapes);
96   for (; aIt.More(); aIt.Next()) {
97     const TopoDS_Shape& aSx=aIt.Value();
98     myShapes.Append(aSx);
99   }
100   return *this;
101 }
102 //=======================================================================
103 //function : Shape
104 //purpose  : 
105 //=======================================================================
106 const TopoDS_Shape& BOPTools_Set::Shape()const
107 {
108   return myShape;
109 }
110 //=======================================================================
111 //function : HashCode
112 //purpose  : 
113 //=======================================================================
114 Standard_Integer BOPTools_Set::HashCode
115   (const Standard_Integer theUpper)const
116 {
117   return ::HashCode(mySum, theUpper);
118 }
119 //=======================================================================
120 //function : IsEqual
121 //purpose  : 
122 //=======================================================================
123 Standard_Boolean BOPTools_Set::IsEqual
124   (const BOPTools_Set& theOther)const
125 {
126   Standard_Boolean bRet;
127   //
128   bRet=Standard_False;
129   //
130   if (theOther.myNbShapes!=myNbShapes) {
131     return bRet;
132   }
133   //
134   BOPCol_MapOfShape aM1;
135   BOPCol_ListIteratorOfListOfShape aIt;
136   //
137   aIt.Initialize(myShapes);
138   for (; aIt.More(); aIt.Next()) {
139     const TopoDS_Shape& aSx1=aIt.Value();
140     aM1.Add(aSx1);
141   }
142   //
143   aIt.Initialize(theOther.myShapes);
144   for (; aIt.More(); aIt.Next()) {
145     const TopoDS_Shape& aSx2=aIt.Value();
146     if (!aM1.Contains(aSx2)) {
147       return bRet;
148     }
149   }
150   //
151   return !bRet;
152 }
153 //=======================================================================
154 //function : Add
155 //purpose  : 
156 //=======================================================================
157 void BOPTools_Set::Add(const TopoDS_Shape& theS,
158                        const TopAbs_ShapeEnum theType)
159 {
160   Standard_Integer aId, aIdN;
161   TopAbs_Orientation aOr;
162   TopExp_Explorer aExp;
163   //
164   myShape=theS;
165   myShapes.Clear();
166   myNbShapes=0;
167   mySum=0;
168   //
169   aExp.Init(theS, theType);
170   for (; aExp.More(); aExp.Next()) {
171     const TopoDS_Shape& aSx=aExp.Current();
172     if (theType==TopAbs_EDGE) {
173       const TopoDS_Edge& aEx=*((TopoDS_Edge*)&aSx);
174       if (BRep_Tool::Degenerated(aEx)) {
175         continue;
176       }
177     }
178     //
179     aOr=aSx.Orientation();
180     if (aOr==TopAbs_INTERNAL) {
181       TopoDS_Shape aSy;
182       //
183       aSy=aSx;
184       //
185       aSy.Orientation(TopAbs_FORWARD);
186       myShapes.Append(aSy);
187       //
188       aSy.Orientation(TopAbs_REVERSED);
189       myShapes.Append(aSy);
190     }
191     else {
192       myShapes.Append(aSx);
193     }
194   }
195   //
196   myNbShapes=myShapes.Extent();
197   if (!myNbShapes) {
198     return;
199   }
200   // 
201   BOPCol_ListIteratorOfListOfShape aIt;
202   //
203   aIt.Initialize(myShapes);
204   for (; aIt.More(); aIt.Next()) {
205     const TopoDS_Shape& aSx=aIt.Value();
206     aId=aSx.HashCode(myUpper);
207     aIdN=NormalizedIds(aId, myNbShapes);
208     mySum+=aIdN;
209   }
210 }
211 //=======================================================================
212 // function: NormalizedIds
213 // purpose : 
214 //=======================================================================
215 Standard_Integer NormalizedIds(const Standard_Integer aId,
216                                const Standard_Integer aDiv)
217 {
218   Standard_Integer aMax, aTresh, aIdRet;
219   //
220   aIdRet=aId;
221   aMax=::IntegerLast();
222   aTresh=aMax/aDiv;
223   if (aId>aTresh) {
224     aIdRet=aId%aTresh;
225   }
226   return aIdRet;
227 }