5aef17e6a5d1413e21809f7a8d6a6493c86bc125
[occt.git] / src / ShapeCustom / ShapeCustom_ConvertToBSpline.cxx
1 // Created on: 1999-06-17
2 // Created by: data exchange team
3 // Copyright (c) 1999-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 <ShapeCustom_ConvertToBSpline.ixx>
24 #include <Geom_RectangularTrimmedSurface.hxx>
25 #include <Geom_OffsetSurface.hxx>
26 #include <Geom_SurfaceOfLinearExtrusion.hxx>
27 #include <Geom_SurfaceOfRevolution.hxx>
28 #include <Geom_BSplineSurface.hxx>
29 #include <Geom_Plane.hxx>
30 #include <BRep_Tool.hxx>
31 #include <ShapeConstruct.hxx>
32 #include <Precision.hxx>
33 #include <BRep_TEdge.hxx>
34 #include <BRep_ListIteratorOfListOfCurveRepresentation.hxx>
35 #include <BRep_GCurve.hxx>
36 #include <BRepTools.hxx>
37
38 //=======================================================================
39 //function : ShapeCustom_ConvertToBSpline
40 //purpose  : 
41 //=======================================================================
42
43 ShapeCustom_ConvertToBSpline::ShapeCustom_ConvertToBSpline():
44        myExtrMode(Standard_True), myRevolMode(Standard_True),
45        myOffsetMode(Standard_True), myPlaneMode(Standard_False)
46 {
47 }
48
49 //=======================================================================
50 //function : IsToConvert
51 //purpose  : 
52 //=======================================================================
53
54 Standard_Boolean ShapeCustom_ConvertToBSpline::IsToConvert(const Handle(Geom_Surface) &S,
55                                                            Handle(Geom_Surface) &SS) const
56 {
57   SS = S;
58   if(S->IsKind(STANDARD_TYPE(Geom_RectangularTrimmedSurface))) {
59     Handle(Geom_RectangularTrimmedSurface) RTS = 
60       Handle(Geom_RectangularTrimmedSurface)::DownCast ( S );
61     SS = RTS->BasisSurface();
62   }
63   if(SS->IsKind(STANDARD_TYPE(Geom_OffsetSurface)))
64     if(myOffsetMode)
65       return Standard_True;
66     else {
67       Handle(Geom_OffsetSurface) OS = Handle(Geom_OffsetSurface)::DownCast ( SS );
68       Handle(Geom_Surface) basis = OS->BasisSurface();
69       Handle(Geom_Surface) tmp;
70       return IsToConvert(basis,tmp);
71     }
72   if ( SS->IsKind(STANDARD_TYPE(Geom_SurfaceOfLinearExtrusion)) )
73     return myExtrMode;
74   if ( SS->IsKind(STANDARD_TYPE(Geom_SurfaceOfRevolution)) )
75     return myRevolMode;
76   if ( SS->IsKind(STANDARD_TYPE(Geom_Plane)) )
77     return myPlaneMode;  
78   return Standard_False;
79 }
80     
81 //=======================================================================
82 //function : NewSurface
83 //purpose  : 
84 //=======================================================================
85
86 Standard_Boolean ShapeCustom_ConvertToBSpline::NewSurface (const TopoDS_Face& F,
87                                                            Handle(Geom_Surface)& S,
88                                                            TopLoc_Location& L,
89                                                            Standard_Real& Tol,
90                                                            Standard_Boolean& RevWires,
91                                                            Standard_Boolean& RevFace) 
92 {
93   S = BRep_Tool::Surface(F,L);
94   Standard_Real U1,U2,V1,V2;
95   S->Bounds(U1,U2,V1,V2);
96   Standard_Real Umin, Umax,Vmin,Vmax;
97   BRepTools::UVBounds(F,Umin, Umax, Vmin, Vmax);
98   if(Precision::IsInfinite(U1) || Precision::IsInfinite(U2)) {
99     U1 = Umin;
100     U2 = Umax;
101   }
102   if(Precision::IsInfinite(V1) || Precision::IsInfinite(V2)) {
103     V1 = Vmin;
104     V2 = Vmax;
105   }
106    
107   Handle(Geom_Surface) surf;
108   if ( ! IsToConvert ( S, surf) ) return Standard_False;
109   
110   Handle(Geom_Surface) res;
111   if(surf->IsKind(STANDARD_TYPE(Geom_OffsetSurface))&&!myOffsetMode) {
112     Handle(Geom_OffsetSurface) OS = Handle(Geom_OffsetSurface)::DownCast ( surf );
113     Handle(Geom_Surface) basis = OS->BasisSurface();
114     Standard_Real offset = OS->Offset();
115     Handle(Geom_BSplineSurface) bspl = ShapeConstruct::
116       ConvertSurfaceToBSpline(basis,U1,U2,V1,V2,Precision::Approximation(),
117                                 surf->Continuity(),10000,15);
118     Handle(Geom_OffsetSurface) nOff = new Geom_OffsetSurface(bspl,offset);
119     res = nOff;
120   }
121   else {
122     GeomAbs_Shape cnt = surf->Continuity();
123     if(surf->IsKind(STANDARD_TYPE(Geom_OffsetSurface)))
124       cnt = GeomAbs_C0; //pdn 30.06.99 because of hang-up in GeomConvert_ApproxSurface
125     res = ShapeConstruct::ConvertSurfaceToBSpline(surf,U1,U2,V1,V2,Precision::Approximation(),
126                                                   cnt,10000,15);
127   }
128   if(S->IsKind(STANDARD_TYPE(Geom_RectangularTrimmedSurface)) ) {
129     Handle(Geom_RectangularTrimmedSurface) RTS = 
130       Handle(Geom_RectangularTrimmedSurface)::DownCast ( S );
131     Standard_Real UF, UL, VF, VL;
132     RTS->Bounds ( UF, UL, VF, VL );
133     S = new Geom_RectangularTrimmedSurface ( res, UF, UL, VF, VL );
134   }
135   else 
136     S = res;
137   
138   Tol = BRep_Tool::Tolerance(F);
139   RevWires = Standard_False;
140   RevFace = Standard_False;
141   return Standard_True;
142 }
143   
144 //=======================================================================
145 //function : NewCurve
146 //purpose  : 
147 //=======================================================================
148
149 Standard_Boolean ShapeCustom_ConvertToBSpline::NewCurve (const TopoDS_Edge& E,
150                                                          Handle(Geom_Curve)& C,
151                                                          TopLoc_Location& L,
152                                                          Standard_Real& Tol) 
153 {
154   //:p5 abv 26 Feb 99: force copying of edge if any its pcurve will be replaced
155   Handle(BRep_TEdge)& TE = *((Handle(BRep_TEdge)*)&E.TShape());
156
157   // iterate on pcurves
158   BRep_ListIteratorOfListOfCurveRepresentation itcr(TE->Curves());
159   for ( ; itcr.More(); itcr.Next() ) {
160     Handle(BRep_GCurve) GC = Handle(BRep_GCurve)::DownCast(itcr.Value());
161     if ( GC.IsNull() || ! GC->IsCurveOnSurface() ) continue;
162     Handle(Geom_Surface) S = GC->Surface();
163     Handle(Geom_Surface) ES;
164     if ( ! IsToConvert ( S, ES ) ) continue;
165     Standard_Real f, l;
166     C = BRep_Tool::Curve ( E, L, f, l );
167     if ( ! C.IsNull() ) C = Handle(Geom_Curve)::DownCast ( C->Copy() );
168     Tol = BRep_Tool::Tolerance ( E );
169     return Standard_True;
170   } 
171   return Standard_False;
172 }
173
174 //=======================================================================
175 //function : NewPoint
176 //purpose  : 
177 //=======================================================================
178
179 Standard_Boolean ShapeCustom_ConvertToBSpline::NewPoint (const TopoDS_Vertex& /*V*/,
180                                                          gp_Pnt& /*P*/, Standard_Real& /*Tol*/)
181 {
182   return Standard_False;
183 }
184
185 //=======================================================================
186 //function : NewCurve2d
187 //purpose  : 
188 //=======================================================================
189
190 Standard_Boolean ShapeCustom_ConvertToBSpline::NewCurve2d (const TopoDS_Edge& E,
191                                                            const TopoDS_Face& F,
192                                                            const TopoDS_Edge& NewE,
193                                                            const TopoDS_Face& /*NewF*/,
194                                                            Handle(Geom2d_Curve)& C,
195                                                            Standard_Real& Tol) 
196 {
197   TopLoc_Location L;
198   Handle(Geom_Surface) S = BRep_Tool::Surface(F,L);
199   Handle(Geom_Surface) ES;
200   
201   // just copy pcurve if either its surface is changing or edge was copied
202   if ( ! IsToConvert ( S, ES ) && E.IsSame ( NewE ) ) return Standard_False;
203   
204   Standard_Real f, l;
205   C = BRep_Tool::CurveOnSurface(E,F,f,l);
206   if ( ! C.IsNull() ) 
207     C = Handle(Geom2d_Curve)::DownCast ( C->Copy() );
208   
209   Tol = BRep_Tool::Tolerance ( E );
210   return Standard_True;
211 }
212
213 //=======================================================================
214 //function : NewParameter
215 //purpose  : 
216 //=======================================================================
217
218 Standard_Boolean ShapeCustom_ConvertToBSpline::NewParameter (const TopoDS_Vertex& /*V*/,
219                                                              const TopoDS_Edge& /*E*/,
220                                                              Standard_Real& /*P*/,
221                                                              Standard_Real& /*Tol*/)
222 {
223   return Standard_False;
224 }
225
226 //=======================================================================
227 //function : Continuity
228 //purpose  : 
229 //=======================================================================
230
231 GeomAbs_Shape ShapeCustom_ConvertToBSpline::Continuity (const TopoDS_Edge& E,
232                                                         const TopoDS_Face& F1,
233                                                         const TopoDS_Face& F2,
234                                                         const TopoDS_Edge& /*NewE*/,
235                                                         const TopoDS_Face& /*NewF1*/,
236                                                         const TopoDS_Face& /*NewF2*/)
237 {
238   return BRep_Tool::Continuity(E,F1,F2);
239 }
240
241 void ShapeCustom_ConvertToBSpline::SetExtrusionMode(const Standard_Boolean extrMode)
242 {
243   myExtrMode = extrMode;
244 }
245
246 void ShapeCustom_ConvertToBSpline::SetRevolutionMode(const Standard_Boolean revolMode)
247 {
248   myRevolMode = revolMode;
249 }
250
251 void ShapeCustom_ConvertToBSpline::SetOffsetMode(const Standard_Boolean offsetMode)
252 {
253   myOffsetMode = offsetMode;
254 }
255
256 void ShapeCustom_ConvertToBSpline::SetPlaneMode(const Standard_Boolean planeMode)
257 {
258   myPlaneMode = planeMode;
259 }