0023948: Wrong intersection between a surface of revolution and a plane.
[occt.git] / src / BOPTools / BOPTools_Set.cxx
CommitLineData
b311480e 1// Created by: Peter KURNEV
973c2be1 2// Copyright (c) 1999-2014 OPEN CASCADE SAS
b311480e 3//
973c2be1 4// This file is part of Open CASCADE Technology software library.
b311480e 5//
d5f74e42 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
973c2be1 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.
b311480e 11//
973c2be1 12// Alternatively, this file may be used under the terms of Open CASCADE
13// commercial license or contractual agreement.
7fd59977 14
4e57c75e 15#include <BOPTools_Set.ixx>
98730279 16#include <TopoDS_Shape.hxx>
17#include <TopExp_Explorer.hxx>
18#include <TopoDS_Edge.hxx>
19#include <BRep_Tool.hxx>
20#include <BOPCol_MapOfShape.hxx>
21
22static
23 Standard_Integer NormalizedIds(const Standard_Integer aId,
24 const Standard_Integer aDiv);
25
26//=======================================================================
27//function :
28//purpose :
29//=======================================================================
30BOPTools_Set::BOPTools_Set()
31:
32 myAllocator(NCollection_BaseAllocator::CommonBaseAllocator()),
33 myShapes(myAllocator)
34{
35 myNbShapes=0;
36 mySum=0;
37 myUpper=432123;
38}
39//=======================================================================
40//function :
41//purpose :
42//=======================================================================
43BOPTools_Set::BOPTools_Set
44 (const Handle(NCollection_BaseAllocator)& theAllocator)
45:
46 myAllocator(theAllocator),
47 myShapes(myAllocator)
48{
49 myNbShapes=0;
50 mySum=0;
51 myUpper=432123;
52}
53//=======================================================================
54//function :~
55//purpose :
56//=======================================================================
57BOPTools_Set::~BOPTools_Set()
58{
59 Clear();
60}
61//=======================================================================
62//function : Clear
63//purpose :
64//=======================================================================
65void BOPTools_Set::Clear()
66{
67 myNbShapes=0;
68 mySum=0;
69 myShapes.Clear();
70}
71//=======================================================================
72//function : NbShapes
73//purpose :
74//=======================================================================
75Standard_Integer BOPTools_Set::NbShapes()const
76{
77 return myNbShapes;
78}
79//=======================================================================
80//function :Assign
81//purpose :
82//=======================================================================
83BOPTools_Set& BOPTools_Set::Assign(const BOPTools_Set& theOther)
84{
85 BOPCol_ListIteratorOfListOfShape aIt;
86 //
87 myShape=theOther.myShape;
88 myNbShapes=theOther.myNbShapes;
89 mySum=theOther.mySum;
90 myUpper=theOther.myUpper;
91 myAllocator=theOther.myAllocator;
92 //
93 myShapes.Clear();
94 aIt.Initialize(theOther.myShapes);
95 for (; aIt.More(); aIt.Next()) {
96 const TopoDS_Shape& aSx=aIt.Value();
97 myShapes.Append(aSx);
98 }
99 return *this;
100}
101//=======================================================================
102//function : Shape
103//purpose :
104//=======================================================================
105const TopoDS_Shape& BOPTools_Set::Shape()const
106{
107 return myShape;
108}
109//=======================================================================
110//function : HashCode
111//purpose :
112//=======================================================================
113Standard_Integer BOPTools_Set::HashCode
114 (const Standard_Integer theUpper)const
115{
116 return ::HashCode(mySum, theUpper);
117}
118//=======================================================================
119//function : IsEqual
120//purpose :
121//=======================================================================
122Standard_Boolean BOPTools_Set::IsEqual
123 (const BOPTools_Set& theOther)const
124{
125 Standard_Boolean bRet;
126 //
127 bRet=Standard_False;
128 //
129 if (theOther.myNbShapes!=myNbShapes) {
130 return bRet;
131 }
132 //
133 BOPCol_MapOfShape aM1;
134 BOPCol_ListIteratorOfListOfShape aIt;
135 //
136 aIt.Initialize(myShapes);
137 for (; aIt.More(); aIt.Next()) {
138 const TopoDS_Shape& aSx1=aIt.Value();
139 aM1.Add(aSx1);
140 }
141 //
142 aIt.Initialize(theOther.myShapes);
143 for (; aIt.More(); aIt.Next()) {
144 const TopoDS_Shape& aSx2=aIt.Value();
145 if (!aM1.Contains(aSx2)) {
146 return bRet;
147 }
148 }
149 //
150 return !bRet;
151}
152//=======================================================================
153//function : Add
154//purpose :
155//=======================================================================
156void BOPTools_Set::Add(const TopoDS_Shape& theS,
157 const TopAbs_ShapeEnum theType)
158{
159 Standard_Integer aId, aIdN;
160 TopExp_Explorer aExp;
161 //
162 myShape=theS;
163 myShapes.Clear();
164 myNbShapes=0;
165 mySum=0;
166 //
167 aExp.Init(theS, theType);
168 for (; aExp.More(); aExp.Next()) {
169 const TopoDS_Shape& aSx=aExp.Current();
170 if (theType==TopAbs_EDGE) {
171 const TopoDS_Edge& aEx=*((TopoDS_Edge*)&aSx);
172 if (BRep_Tool::Degenerated(aEx)) {
173 continue;
174 }
175 }
176 myShapes.Append(aSx);
177 }
178 //
179 myNbShapes=myShapes.Extent();
180 if (!myNbShapes) {
181 return;
182 }
183 //
184 BOPCol_ListIteratorOfListOfShape aIt;
185 //
186 aIt.Initialize(myShapes);
187 for (; aIt.More(); aIt.Next()) {
188 const TopoDS_Shape& aSx=aIt.Value();
189 aId=aSx.HashCode(myUpper);
190 aIdN=NormalizedIds(aId, myNbShapes);
191 mySum+=aIdN;
192 }
193}
194//=======================================================================
195// function: NormalizedIds
196// purpose :
197//=======================================================================
198Standard_Integer NormalizedIds(const Standard_Integer aId,
199 const Standard_Integer aDiv)
200{
201 Standard_Integer aMax, aTresh, aIdRet;
202 //
203 aIdRet=aId;
204 aMax=::IntegerLast();
205 aTresh=aMax/aDiv;
206 if (aId>aTresh) {
207 aIdRet=aId%aTresh;
208 }
209 return aIdRet;
210}