Integration of OCCT 6.5.0 from SVN
[occt.git] / src / BRepPrim / BRepPrim_FaceBuilder.cxx
CommitLineData
7fd59977 1// File: BRepPrim_FaceBuilder.cxx
2// Created: Wed Jun 23 15:26:39 1993
3// Author: Remi LEQUETTE
4// <rle@phylox>
5
6
7#include <BRepPrim_FaceBuilder.ixx>
8#include <Precision.hxx>
9#include <gp_Pnt.hxx>
10#include <Geom2d_Line.hxx>
11#include <TopoDS_Wire.hxx>
12
13#include <Standard_OutOfRange.hxx>
14
15//=======================================================================
16//function : BRepPrim_FaceBuilder
17//purpose :
18//=======================================================================
19
20BRepPrim_FaceBuilder::BRepPrim_FaceBuilder()
21{
22}
23
24//=======================================================================
25//function : BRepPrim_FaceBuilder
26//purpose :
27//=======================================================================
28
29BRepPrim_FaceBuilder::BRepPrim_FaceBuilder(const BRep_Builder& B,
30 const Handle(Geom_Surface)& S)
31{
32 Init(B,S);
33}
34
35
36//=======================================================================
37//function : BRepPrim_FaceBuilder
38//purpose :
39//=======================================================================
40
41BRepPrim_FaceBuilder::BRepPrim_FaceBuilder(const BRep_Builder& B,
42 const Handle(Geom_Surface)& S,
43 const Standard_Real UMin,
44 const Standard_Real UMax,
45 const Standard_Real VMin,
46 const Standard_Real VMax)
47{
48 Init(B,S,UMin,UMax,VMin,VMax);
49}
50
51
52//=======================================================================
53//function : Init
54//purpose :
55//=======================================================================
56
57void BRepPrim_FaceBuilder::Init(const BRep_Builder& B,
58 const Handle(Geom_Surface)& S)
59{
60 Standard_Real UMin,UMax,VMin,VMax;
61 S->Bounds(UMin,UMax,VMin,VMax);
62 Init(B,S,UMin,UMax,VMin,VMax);
63}
64
65//=======================================================================
66//function : Init
67//purpose :
68//=======================================================================
69
70void BRepPrim_FaceBuilder::Init(const BRep_Builder& B,
71 const Handle(Geom_Surface)& S,
72 const Standard_Real UMin,
73 const Standard_Real UMax,
74 const Standard_Real VMin,
75 const Standard_Real VMax)
76{
77 // Check the values
78 Standard_Real USMin,USMax,VSMin,VSMax;
79 S->Bounds(USMin,USMax,VSMin,VSMax);
80
81 if (UMin >= UMax) Standard_ConstructionError::Raise("BRepPrim_FaceBuilder");
82 if (VMin >= VMax) Standard_ConstructionError::Raise("BRepPrim_FaceBuilder");
83 if (UMin < USMin) Standard_ConstructionError::Raise("BRepPrim_FaceBuilder");
84 if (UMax > USMax) Standard_ConstructionError::Raise("BRepPrim_FaceBuilder");
85 if (VMin < VSMin) Standard_ConstructionError::Raise("BRepPrim_FaceBuilder");
86 if (VMax > VSMax) Standard_ConstructionError::Raise("BRepPrim_FaceBuilder");
87
88 // Make the vertices
89 B.MakeVertex(myVertex[0],S->Value(UMin,VMin),Precision::Confusion());
90 B.MakeVertex(myVertex[1],S->Value(UMax,VMin),Precision::Confusion());
91 B.MakeVertex(myVertex[2],S->Value(UMax,VMax),Precision::Confusion());
92 B.MakeVertex(myVertex[3],S->Value(UMin,VMax),Precision::Confusion());
93
94 // Make the edges
95 B.MakeEdge(myEdges[0]);
96 B.MakeEdge(myEdges[1]);
97 B.MakeEdge(myEdges[2]);
98 B.MakeEdge(myEdges[3]);
99
100 // Make the face
101 B.MakeFace(myFace,S,Precision::Confusion());
102
103 // set the pcurves
104 Handle(Geom2d_Line) L;
105 L = new Geom2d_Line(gp_Pnt2d(UMin,VMin),gp_Dir2d(1,0));
106 B.UpdateEdge(myEdges[0],L,myFace,Precision::Confusion());
107 L = new Geom2d_Line(gp_Pnt2d(UMax,VMin),gp_Dir2d(0,1));
108 B.UpdateEdge(myEdges[1],L,myFace,Precision::Confusion());
109 L = new Geom2d_Line(gp_Pnt2d(UMax,VMax),gp_Dir2d(-1,0));
110 B.UpdateEdge(myEdges[2],L,myFace,Precision::Confusion());
111 L = new Geom2d_Line(gp_Pnt2d(UMin,VMax),gp_Dir2d(0,-1));
112 B.UpdateEdge(myEdges[3],L,myFace,Precision::Confusion());
113
114 // set the parameters
115 B.UpdateVertex(myVertex[0],0,myEdges[0],0);
116 B.UpdateVertex(myVertex[1],UMax-UMin,myEdges[0],0);
117 B.UpdateVertex(myVertex[1],0,myEdges[1],0);
118 B.UpdateVertex(myVertex[2],VMax-VMin,myEdges[1],0);
119 B.UpdateVertex(myVertex[2],0,myEdges[2],0);
120 B.UpdateVertex(myVertex[3],UMax-UMin,myEdges[2],0);
121 B.UpdateVertex(myVertex[3],0,myEdges[3],0);
122 B.UpdateVertex(myVertex[0],VMax-VMin,myEdges[3],0);
123
124 // insert vertices in edges
125 myVertex[0].Orientation(TopAbs_REVERSED);
126 B.Add(myEdges[3],myVertex[0]);
127 myVertex[0].Orientation(TopAbs_FORWARD);
128 B.Add(myEdges[0],myVertex[0]);
129 myVertex[1].Orientation(TopAbs_REVERSED);
130 B.Add(myEdges[0],myVertex[1]);
131 myVertex[1].Orientation(TopAbs_FORWARD);
132 B.Add(myEdges[1],myVertex[1]);
133 myVertex[2].Orientation(TopAbs_REVERSED);
134 B.Add(myEdges[1],myVertex[2]);
135 myVertex[2].Orientation(TopAbs_FORWARD);
136 B.Add(myEdges[2],myVertex[2]);
137 myVertex[3].Orientation(TopAbs_REVERSED);
138 B.Add(myEdges[2],myVertex[3]);
139 myVertex[3].Orientation(TopAbs_FORWARD);
140 B.Add(myEdges[3],myVertex[3]);
141
142 // insert edges in a wire and in the face
143 TopoDS_Wire W;
144 B.MakeWire(W);
145 B.Add(W,myEdges[0]);
146 B.Add(W,myEdges[1]);
147 B.Add(W,myEdges[2]);
148 B.Add(W,myEdges[3]);
149
150 B.Add(myFace,W);
151
152 // set the natural restriction flag
153 if ( UMin == USMin && UMax == USMax && VMin == VSMin && VMax == VSMax)
154 B.NaturalRestriction(myFace,Standard_True);
155}
156
157
158//=======================================================================
159//function : Face
160//purpose :
161//=======================================================================
162
163const TopoDS_Face& BRepPrim_FaceBuilder::Face()const
164{
165 return myFace;
166}
167
168
169//=======================================================================
170//function : Edge
171//purpose :
172//=======================================================================
173
174const TopoDS_Edge& BRepPrim_FaceBuilder::Edge(const Standard_Integer I)const
175{
176 Standard_OutOfRange_Raise_if(I<1 || I >4,"BRepPrim_FaceBuilder::Edge");
177 return myEdges[I-1];
178}
179
180
181//=======================================================================
182//function : Vertex
183//purpose :
184//=======================================================================
185
186const TopoDS_Vertex& BRepPrim_FaceBuilder::Vertex(const Standard_Integer I)const
187{
188 Standard_OutOfRange_Raise_if(I<1 || I >4,"BRepPrim_FaceBuilder::Vertex");
189 return myVertex[I-1];
190}
191
192
193
194//=======================================================================
195//function : operator TopoDS_Face
196//purpose :
197//=======================================================================
198
199BRepPrim_FaceBuilder::operator TopoDS_Face()
200{
201 return Face();
202}