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
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.
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.
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.
23 #include <BRepPrim_FaceBuilder.ixx>
24 #include <Precision.hxx>
26 #include <Geom2d_Line.hxx>
27 #include <TopoDS_Wire.hxx>
29 #include <Standard_OutOfRange.hxx>
31 //=======================================================================
32 //function : BRepPrim_FaceBuilder
34 //=======================================================================
36 BRepPrim_FaceBuilder::BRepPrim_FaceBuilder()
40 //=======================================================================
41 //function : BRepPrim_FaceBuilder
43 //=======================================================================
45 BRepPrim_FaceBuilder::BRepPrim_FaceBuilder(const BRep_Builder& B,
46 const Handle(Geom_Surface)& S)
52 //=======================================================================
53 //function : BRepPrim_FaceBuilder
55 //=======================================================================
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)
64 Init(B,S,UMin,UMax,VMin,VMax);
68 //=======================================================================
71 //=======================================================================
73 void BRepPrim_FaceBuilder::Init(const BRep_Builder& B,
74 const Handle(Geom_Surface)& S)
76 Standard_Real UMin,UMax,VMin,VMax;
77 S->Bounds(UMin,UMax,VMin,VMax);
78 Init(B,S,UMin,UMax,VMin,VMax);
81 //=======================================================================
84 //=======================================================================
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)
94 Standard_Real USMin,USMax,VSMin,VSMax;
95 S->Bounds(USMin,USMax,VSMin,VSMax);
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");
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());
111 B.MakeEdge(myEdges[0]);
112 B.MakeEdge(myEdges[1]);
113 B.MakeEdge(myEdges[2]);
114 B.MakeEdge(myEdges[3]);
117 B.MakeFace(myFace,S,Precision::Confusion());
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());
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);
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]);
158 // insert edges in a wire and in the face
168 // set the natural restriction flag
169 if ( UMin == USMin && UMax == USMax && VMin == VSMin && VMax == VSMax)
170 B.NaturalRestriction(myFace,Standard_True);
174 //=======================================================================
177 //=======================================================================
179 const TopoDS_Face& BRepPrim_FaceBuilder::Face()const
185 //=======================================================================
188 //=======================================================================
190 const TopoDS_Edge& BRepPrim_FaceBuilder::Edge(const Standard_Integer I)const
192 Standard_OutOfRange_Raise_if(I<1 || I >4,"BRepPrim_FaceBuilder::Edge");
197 //=======================================================================
200 //=======================================================================
202 const TopoDS_Vertex& BRepPrim_FaceBuilder::Vertex(const Standard_Integer I)const
204 Standard_OutOfRange_Raise_if(I<1 || I >4,"BRepPrim_FaceBuilder::Vertex");
205 return myVertex[I-1];
210 //=======================================================================
211 //function : operator TopoDS_Face
213 //=======================================================================
215 BRepPrim_FaceBuilder::operator TopoDS_Face()