0023024: Update headers of OCCT files
[occt.git] / src / BOP / BOP_ShellFaceClassifier.cxx
1 // Copyright (c) 1999-2012 OPEN CASCADE SAS
2 //
3 // The content of this file is subject to the Open CASCADE Technology Public
4 // License Version 6.5 (the "License"). You may not use the content of this file
5 // except in compliance with the License. Please obtain a copy of the License
6 // at http://www.opencascade.org and read it completely before using this file.
7 //
8 // The Initial Developer of the Original Code is Open CASCADE S.A.S., having its
9 // main offices at: 1, place des Freres Montgolfier, 78280 Guyancourt, France.
10 //
11 // The Original Code and all software distributed under the License is
12 // distributed on an "AS IS" basis, without warranty of any kind, and the
13 // Initial Developer hereby disclaims all such warranties, including without
14 // limitation, any warranties of merchantability, fitness for a particular
15 // purpose or non-infringement. Please see the License for the specific terms
16 // and conditions governing the rights and limitations under the License.
17
18 #include <BOP_ShellFaceClassifier.ixx>
19
20 #include <Precision.hxx>
21 #include <TopoDS.hxx>
22 #include <TopoDS_Vertex.hxx>
23 #include <TopoDS_Face.hxx>
24 #include <TopExp_Explorer.hxx>
25 #include <BRep_Tool.hxx>
26 #include <BRepAdaptor_Surface.hxx>
27
28 // ==================================================================
29 // function: BOP_ShellFaceClassifier::BOP_ShellFaceClassifier
30 // purpose:
31 // ==================================================================
32 BOP_ShellFaceClassifier::BOP_ShellFaceClassifier
33     (const BOP_BlockBuilder& theBlockBuilder)
34 :
35   BOP_CompositeClassifier(theBlockBuilder)
36 {
37 }
38
39 // ===============================================================================================
40 // function: Clear
41 // purpose: 
42 // ===============================================================================================
43   void BOP_ShellFaceClassifier::Clear() 
44 {
45   mySolidClassifier.Clear();
46   myFaceShellMap.Clear();
47 }
48
49 // ===============================================================================================
50 // function: CompareShapes
51 // purpose: 
52 // ===============================================================================================
53   TopAbs_State BOP_ShellFaceClassifier::CompareShapes(const TopoDS_Shape& theShape1,
54                                                       const TopoDS_Shape& theShape2) 
55 {
56   ResetShape(theShape1);
57   myShell = TopoDS::Shell(theShape2);
58   mySolidClassifier.LoadShell(myShell);
59   TopAbs_State aState = State();
60   return aState;
61 }
62
63 // ===============================================================================================
64 // function: CompareElementToShape
65 // purpose: 
66 // ===============================================================================================
67   TopAbs_State BOP_ShellFaceClassifier::CompareElementToShape(const TopoDS_Shape& theElement,
68                                                               const TopoDS_Shape& theShape) 
69 {
70   ResetElement(theElement);
71   myShell = TopoDS::Shell(theShape);
72   mySolidClassifier.LoadShell(myShell);
73   TopAbs_State aState = State();
74   return aState;
75 }
76
77 // ===============================================================================================
78 // function: ResetShape
79 // purpose: 
80 // ===============================================================================================
81   void BOP_ShellFaceClassifier::ResetShape(const TopoDS_Shape& theShape) 
82 {
83   TopExp_Explorer anExp(theShape, TopAbs_FACE);
84   const TopoDS_Face& aFace = TopoDS::Face(anExp.Current());
85   ResetElement(aFace);
86 }
87
88 // ===============================================================================================
89 // function: ResetElement
90 // purpose: 
91 // ===============================================================================================
92   void BOP_ShellFaceClassifier::ResetElement(const TopoDS_Shape& theElement) 
93 {
94   const TopAbs_ShapeEnum aShapeType= theElement.ShapeType();
95
96   // initialize myPoint with first vertex of face <E>
97   myFirstCompare = Standard_True;
98   TopExp_Explorer anExp(theElement, TopAbs_VERTEX);
99
100   if(anExp.More()) {
101     const TopoDS_Vertex& aVertex = TopoDS::Vertex(anExp.Current());
102     myPoint = BRep_Tool::Pnt(aVertex);
103   }
104   else {
105
106     if(aShapeType == TopAbs_FACE) {
107       BRepAdaptor_Surface BAS(TopoDS::Face(theElement));
108       myPoint = BAS.Value((BAS.FirstUParameter()+BAS.LastUParameter()) * 0.5,
109                           (BAS.FirstVParameter()+BAS.LastVParameter()) * 0.5);
110     }
111     else {
112       myPoint.SetCoord(0., 0., 0.);
113     }
114   }
115 }
116
117 // ===============================================================================================
118 // function: CompareElement
119 // purpose: 
120 // ===============================================================================================
121   void BOP_ShellFaceClassifier::CompareElement(const TopoDS_Shape& theElement) 
122 {
123   
124   if(myFirstCompare) {
125     Standard_Boolean found = myFaceShellMap.IsBound(theElement);
126     
127     if(!found) {
128       myBuilder.MakeShell(myShell);
129       myBuilder.Add(myShell, theElement);
130       myFaceShellMap.Bind(theElement, myShell);
131     }
132     else {
133       TopoDS_Shape sbid = myFaceShellMap.Find(theElement);
134       myShell = TopoDS::Shell(sbid);
135     }
136     myFirstCompare = Standard_False;
137   }
138   else {
139     myBuilder.Add(myShell, theElement);
140   }
141 }
142
143 // ==================================================================
144 // function: State
145 // purpose: 
146 // ==================================================================
147   TopAbs_State BOP_ShellFaceClassifier::State() 
148 {
149   TopAbs_State aState = TopAbs_UNKNOWN;
150   Standard_Real aTolerance = Precision::Confusion();
151   mySolidClassifier.Classify(myShell, myPoint, aTolerance);
152   aState = mySolidClassifier.State();
153   return aState;
154 }
155