0024428: Implementation of LGPL license
[occt.git] / src / BRepPrim / BRepPrim_FaceBuilder.cxx
CommitLineData
b311480e 1// Created on: 1993-06-23
2// Created by: Remi LEQUETTE
3// Copyright (c) 1993-1999 Matra Datavision
973c2be1 4// Copyright (c) 1999-2014 OPEN CASCADE SAS
b311480e 5//
973c2be1 6// This file is part of Open CASCADE Technology software library.
b311480e 7//
973c2be1 8// This library is free software; you can redistribute it and / or modify it
9// under the terms of the GNU Lesser General Public version 2.1 as published
10// by the Free Software Foundation, with special exception defined in the file
11// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
12// distribution for complete text of the license and disclaimer of any warranty.
b311480e 13//
973c2be1 14// Alternatively, this file may be used under the terms of Open CASCADE
15// commercial license or contractual agreement.
7fd59977 16
17#include <BRepPrim_FaceBuilder.ixx>
18#include <Precision.hxx>
19#include <gp_Pnt.hxx>
20#include <Geom2d_Line.hxx>
21#include <TopoDS_Wire.hxx>
22
23#include <Standard_OutOfRange.hxx>
24
25//=======================================================================
26//function : BRepPrim_FaceBuilder
27//purpose :
28//=======================================================================
29
30BRepPrim_FaceBuilder::BRepPrim_FaceBuilder()
31{
32}
33
34//=======================================================================
35//function : BRepPrim_FaceBuilder
36//purpose :
37//=======================================================================
38
39BRepPrim_FaceBuilder::BRepPrim_FaceBuilder(const BRep_Builder& B,
40 const Handle(Geom_Surface)& S)
41{
42 Init(B,S);
43}
44
45
46//=======================================================================
47//function : BRepPrim_FaceBuilder
48//purpose :
49//=======================================================================
50
51BRepPrim_FaceBuilder::BRepPrim_FaceBuilder(const BRep_Builder& B,
52 const Handle(Geom_Surface)& S,
53 const Standard_Real UMin,
54 const Standard_Real UMax,
55 const Standard_Real VMin,
56 const Standard_Real VMax)
57{
58 Init(B,S,UMin,UMax,VMin,VMax);
59}
60
61
62//=======================================================================
63//function : Init
64//purpose :
65//=======================================================================
66
67void BRepPrim_FaceBuilder::Init(const BRep_Builder& B,
68 const Handle(Geom_Surface)& S)
69{
70 Standard_Real UMin,UMax,VMin,VMax;
71 S->Bounds(UMin,UMax,VMin,VMax);
72 Init(B,S,UMin,UMax,VMin,VMax);
73}
74
75//=======================================================================
76//function : Init
77//purpose :
78//=======================================================================
79
80void BRepPrim_FaceBuilder::Init(const BRep_Builder& B,
81 const Handle(Geom_Surface)& S,
82 const Standard_Real UMin,
83 const Standard_Real UMax,
84 const Standard_Real VMin,
85 const Standard_Real VMax)
86{
87 // Check the values
88 Standard_Real USMin,USMax,VSMin,VSMax;
89 S->Bounds(USMin,USMax,VSMin,VSMax);
90
91 if (UMin >= UMax) Standard_ConstructionError::Raise("BRepPrim_FaceBuilder");
92 if (VMin >= VMax) Standard_ConstructionError::Raise("BRepPrim_FaceBuilder");
93 if (UMin < USMin) Standard_ConstructionError::Raise("BRepPrim_FaceBuilder");
94 if (UMax > USMax) Standard_ConstructionError::Raise("BRepPrim_FaceBuilder");
95 if (VMin < VSMin) Standard_ConstructionError::Raise("BRepPrim_FaceBuilder");
96 if (VMax > VSMax) Standard_ConstructionError::Raise("BRepPrim_FaceBuilder");
97
98 // Make the vertices
99 B.MakeVertex(myVertex[0],S->Value(UMin,VMin),Precision::Confusion());
100 B.MakeVertex(myVertex[1],S->Value(UMax,VMin),Precision::Confusion());
101 B.MakeVertex(myVertex[2],S->Value(UMax,VMax),Precision::Confusion());
102 B.MakeVertex(myVertex[3],S->Value(UMin,VMax),Precision::Confusion());
103
104 // Make the edges
105 B.MakeEdge(myEdges[0]);
106 B.MakeEdge(myEdges[1]);
107 B.MakeEdge(myEdges[2]);
108 B.MakeEdge(myEdges[3]);
109
110 // Make the face
111 B.MakeFace(myFace,S,Precision::Confusion());
112
113 // set the pcurves
114 Handle(Geom2d_Line) L;
115 L = new Geom2d_Line(gp_Pnt2d(UMin,VMin),gp_Dir2d(1,0));
116 B.UpdateEdge(myEdges[0],L,myFace,Precision::Confusion());
117 L = new Geom2d_Line(gp_Pnt2d(UMax,VMin),gp_Dir2d(0,1));
118 B.UpdateEdge(myEdges[1],L,myFace,Precision::Confusion());
119 L = new Geom2d_Line(gp_Pnt2d(UMax,VMax),gp_Dir2d(-1,0));
120 B.UpdateEdge(myEdges[2],L,myFace,Precision::Confusion());
121 L = new Geom2d_Line(gp_Pnt2d(UMin,VMax),gp_Dir2d(0,-1));
122 B.UpdateEdge(myEdges[3],L,myFace,Precision::Confusion());
123
124 // set the parameters
125 B.UpdateVertex(myVertex[0],0,myEdges[0],0);
126 B.UpdateVertex(myVertex[1],UMax-UMin,myEdges[0],0);
127 B.UpdateVertex(myVertex[1],0,myEdges[1],0);
128 B.UpdateVertex(myVertex[2],VMax-VMin,myEdges[1],0);
129 B.UpdateVertex(myVertex[2],0,myEdges[2],0);
130 B.UpdateVertex(myVertex[3],UMax-UMin,myEdges[2],0);
131 B.UpdateVertex(myVertex[3],0,myEdges[3],0);
132 B.UpdateVertex(myVertex[0],VMax-VMin,myEdges[3],0);
133
134 // insert vertices in edges
135 myVertex[0].Orientation(TopAbs_REVERSED);
136 B.Add(myEdges[3],myVertex[0]);
137 myVertex[0].Orientation(TopAbs_FORWARD);
138 B.Add(myEdges[0],myVertex[0]);
139 myVertex[1].Orientation(TopAbs_REVERSED);
140 B.Add(myEdges[0],myVertex[1]);
141 myVertex[1].Orientation(TopAbs_FORWARD);
142 B.Add(myEdges[1],myVertex[1]);
143 myVertex[2].Orientation(TopAbs_REVERSED);
144 B.Add(myEdges[1],myVertex[2]);
145 myVertex[2].Orientation(TopAbs_FORWARD);
146 B.Add(myEdges[2],myVertex[2]);
147 myVertex[3].Orientation(TopAbs_REVERSED);
148 B.Add(myEdges[2],myVertex[3]);
149 myVertex[3].Orientation(TopAbs_FORWARD);
150 B.Add(myEdges[3],myVertex[3]);
151
152 // insert edges in a wire and in the face
153 TopoDS_Wire W;
154 B.MakeWire(W);
155 B.Add(W,myEdges[0]);
156 B.Add(W,myEdges[1]);
157 B.Add(W,myEdges[2]);
158 B.Add(W,myEdges[3]);
159
160 B.Add(myFace,W);
161
162 // set the natural restriction flag
163 if ( UMin == USMin && UMax == USMax && VMin == VSMin && VMax == VSMax)
164 B.NaturalRestriction(myFace,Standard_True);
165}
166
167
168//=======================================================================
169//function : Face
170//purpose :
171//=======================================================================
172
173const TopoDS_Face& BRepPrim_FaceBuilder::Face()const
174{
175 return myFace;
176}
177
178
179//=======================================================================
180//function : Edge
181//purpose :
182//=======================================================================
183
184const TopoDS_Edge& BRepPrim_FaceBuilder::Edge(const Standard_Integer I)const
185{
186 Standard_OutOfRange_Raise_if(I<1 || I >4,"BRepPrim_FaceBuilder::Edge");
187 return myEdges[I-1];
188}
189
190
191//=======================================================================
192//function : Vertex
193//purpose :
194//=======================================================================
195
196const TopoDS_Vertex& BRepPrim_FaceBuilder::Vertex(const Standard_Integer I)const
197{
198 Standard_OutOfRange_Raise_if(I<1 || I >4,"BRepPrim_FaceBuilder::Vertex");
199 return myVertex[I-1];
200}
201
202
203
204//=======================================================================
205//function : operator TopoDS_Face
206//purpose :
207//=======================================================================
208
209BRepPrim_FaceBuilder::operator TopoDS_Face()
210{
211 return Face();
212}