0023024: Update headers of OCCT files
[occt.git] / src / BRepPrim / BRepPrim_FaceBuilder.cxx
1 // Created on: 1993-06-23
2 // Created by: Remi LEQUETTE
3 // Copyright (c) 1993-1999 Matra Datavision
4 // Copyright (c) 1999-2012 OPEN CASCADE SAS
5 //
6 // The content of this file is subject to the Open CASCADE Technology Public
7 // License Version 6.5 (the "License"). You may not use the content of this file
8 // except in compliance with the License. Please obtain a copy of the License
9 // at http://www.opencascade.org and read it completely before using this file.
10 //
11 // The Initial Developer of the Original Code is Open CASCADE S.A.S., having its
12 // main offices at: 1, place des Freres Montgolfier, 78280 Guyancourt, France.
13 //
14 // The Original Code and all software distributed under the License is
15 // distributed on an "AS IS" basis, without warranty of any kind, and the
16 // Initial Developer hereby disclaims all such warranties, including without
17 // limitation, any warranties of merchantability, fitness for a particular
18 // purpose or non-infringement. Please see the License for the specific terms
19 // and conditions governing the rights and limitations under the License.
20
21
22
23 #include <BRepPrim_FaceBuilder.ixx>
24 #include <Precision.hxx>
25 #include <gp_Pnt.hxx>
26 #include <Geom2d_Line.hxx>
27 #include <TopoDS_Wire.hxx>
28
29 #include <Standard_OutOfRange.hxx>
30
31 //=======================================================================
32 //function : BRepPrim_FaceBuilder
33 //purpose  : 
34 //=======================================================================
35
36 BRepPrim_FaceBuilder::BRepPrim_FaceBuilder()
37 {
38 }
39
40 //=======================================================================
41 //function : BRepPrim_FaceBuilder
42 //purpose  : 
43 //=======================================================================
44
45 BRepPrim_FaceBuilder::BRepPrim_FaceBuilder(const BRep_Builder& B, 
46                                            const Handle(Geom_Surface)& S) 
47 {
48   Init(B,S);
49 }
50
51
52 //=======================================================================
53 //function : BRepPrim_FaceBuilder
54 //purpose  : 
55 //=======================================================================
56
57 BRepPrim_FaceBuilder::BRepPrim_FaceBuilder(const BRep_Builder& B,
58                                            const Handle(Geom_Surface)& S, 
59                                            const Standard_Real UMin, 
60                                            const Standard_Real UMax, 
61                                            const Standard_Real VMin,
62                                            const Standard_Real VMax) 
63 {
64   Init(B,S,UMin,UMax,VMin,VMax);
65 }
66
67
68 //=======================================================================
69 //function : Init
70 //purpose  : 
71 //=======================================================================
72
73 void BRepPrim_FaceBuilder::Init(const BRep_Builder& B,
74                                 const Handle(Geom_Surface)& S)
75
76   Standard_Real UMin,UMax,VMin,VMax;
77   S->Bounds(UMin,UMax,VMin,VMax);
78   Init(B,S,UMin,UMax,VMin,VMax);
79 }
80
81 //=======================================================================
82 //function : Init
83 //purpose  : 
84 //=======================================================================
85
86 void BRepPrim_FaceBuilder::Init(const BRep_Builder& B,
87                                 const Handle(Geom_Surface)& S, 
88                                 const Standard_Real UMin, 
89                                 const Standard_Real UMax, 
90                                 const Standard_Real VMin,
91                                 const Standard_Real VMax) 
92 {
93   // Check the values
94   Standard_Real USMin,USMax,VSMin,VSMax;
95   S->Bounds(USMin,USMax,VSMin,VSMax);
96   
97   if (UMin >= UMax) Standard_ConstructionError::Raise("BRepPrim_FaceBuilder");
98   if (VMin >= VMax) Standard_ConstructionError::Raise("BRepPrim_FaceBuilder");
99   if (UMin < USMin) Standard_ConstructionError::Raise("BRepPrim_FaceBuilder");
100   if (UMax > USMax) Standard_ConstructionError::Raise("BRepPrim_FaceBuilder");
101   if (VMin < VSMin) Standard_ConstructionError::Raise("BRepPrim_FaceBuilder");
102   if (VMax > VSMax) Standard_ConstructionError::Raise("BRepPrim_FaceBuilder");
103
104   // Make the vertices
105   B.MakeVertex(myVertex[0],S->Value(UMin,VMin),Precision::Confusion());
106   B.MakeVertex(myVertex[1],S->Value(UMax,VMin),Precision::Confusion());
107   B.MakeVertex(myVertex[2],S->Value(UMax,VMax),Precision::Confusion());
108   B.MakeVertex(myVertex[3],S->Value(UMin,VMax),Precision::Confusion());
109   
110   // Make the edges
111   B.MakeEdge(myEdges[0]);
112   B.MakeEdge(myEdges[1]);
113   B.MakeEdge(myEdges[2]);
114   B.MakeEdge(myEdges[3]);
115
116   // Make the face
117   B.MakeFace(myFace,S,Precision::Confusion());
118
119   // set the pcurves
120   Handle(Geom2d_Line) L;
121   L = new Geom2d_Line(gp_Pnt2d(UMin,VMin),gp_Dir2d(1,0));
122   B.UpdateEdge(myEdges[0],L,myFace,Precision::Confusion());
123   L = new Geom2d_Line(gp_Pnt2d(UMax,VMin),gp_Dir2d(0,1));
124   B.UpdateEdge(myEdges[1],L,myFace,Precision::Confusion());
125   L = new Geom2d_Line(gp_Pnt2d(UMax,VMax),gp_Dir2d(-1,0));
126   B.UpdateEdge(myEdges[2],L,myFace,Precision::Confusion());
127   L = new Geom2d_Line(gp_Pnt2d(UMin,VMax),gp_Dir2d(0,-1));
128   B.UpdateEdge(myEdges[3],L,myFace,Precision::Confusion());
129
130   // set the parameters
131   B.UpdateVertex(myVertex[0],0,myEdges[0],0);
132   B.UpdateVertex(myVertex[1],UMax-UMin,myEdges[0],0);
133   B.UpdateVertex(myVertex[1],0,myEdges[1],0);
134   B.UpdateVertex(myVertex[2],VMax-VMin,myEdges[1],0);
135   B.UpdateVertex(myVertex[2],0,myEdges[2],0);
136   B.UpdateVertex(myVertex[3],UMax-UMin,myEdges[2],0);
137   B.UpdateVertex(myVertex[3],0,myEdges[3],0);
138   B.UpdateVertex(myVertex[0],VMax-VMin,myEdges[3],0);
139
140   // insert vertices in edges
141   myVertex[0].Orientation(TopAbs_REVERSED);
142   B.Add(myEdges[3],myVertex[0]);
143   myVertex[0].Orientation(TopAbs_FORWARD);
144   B.Add(myEdges[0],myVertex[0]);
145   myVertex[1].Orientation(TopAbs_REVERSED);
146   B.Add(myEdges[0],myVertex[1]);
147   myVertex[1].Orientation(TopAbs_FORWARD);
148   B.Add(myEdges[1],myVertex[1]);
149   myVertex[2].Orientation(TopAbs_REVERSED);
150   B.Add(myEdges[1],myVertex[2]);
151   myVertex[2].Orientation(TopAbs_FORWARD);
152   B.Add(myEdges[2],myVertex[2]);
153   myVertex[3].Orientation(TopAbs_REVERSED);
154   B.Add(myEdges[2],myVertex[3]);
155   myVertex[3].Orientation(TopAbs_FORWARD);
156   B.Add(myEdges[3],myVertex[3]);
157
158   // insert edges in a wire and in the face
159   TopoDS_Wire W;
160   B.MakeWire(W);
161   B.Add(W,myEdges[0]);
162   B.Add(W,myEdges[1]);
163   B.Add(W,myEdges[2]);
164   B.Add(W,myEdges[3]);
165
166   B.Add(myFace,W);
167
168   // set the natural restriction flag
169   if ( UMin == USMin && UMax == USMax && VMin == VSMin && VMax == VSMax)
170     B.NaturalRestriction(myFace,Standard_True);
171 }
172
173
174 //=======================================================================
175 //function : Face
176 //purpose  : 
177 //=======================================================================
178
179 const TopoDS_Face&  BRepPrim_FaceBuilder::Face()const 
180 {
181   return myFace;
182 }
183
184
185 //=======================================================================
186 //function : Edge
187 //purpose  : 
188 //=======================================================================
189
190 const TopoDS_Edge&  BRepPrim_FaceBuilder::Edge(const Standard_Integer I)const 
191 {
192   Standard_OutOfRange_Raise_if(I<1 || I >4,"BRepPrim_FaceBuilder::Edge");
193   return myEdges[I-1];
194 }
195
196
197 //=======================================================================
198 //function : Vertex
199 //purpose  : 
200 //=======================================================================
201
202 const TopoDS_Vertex&  BRepPrim_FaceBuilder::Vertex(const Standard_Integer I)const 
203 {
204   Standard_OutOfRange_Raise_if(I<1 || I >4,"BRepPrim_FaceBuilder::Vertex");
205   return myVertex[I-1];
206 }
207
208
209
210 //=======================================================================
211 //function : operator TopoDS_Face
212 //purpose  : 
213 //=======================================================================
214
215 BRepPrim_FaceBuilder::operator TopoDS_Face()
216 {
217   return Face();
218 }