0024750: Replace instantiations of TCollection generic classes by NCollection templat...
[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-2014 OPEN CASCADE SAS
5 //
6 // This file is part of Open CASCADE Technology software library.
7 //
8 // This library is free software; you can redistribute it and/or modify it under
9 // the terms of the GNU Lesser General Public License 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.
13 //
14 // Alternatively, this file may be used under the terms of Open CASCADE
15 // commercial license or contractual agreement.
16
17 #include <ShapeCustom_ConvertToBSpline.ixx>
18 #include <Geom_RectangularTrimmedSurface.hxx>
19 #include <Geom_OffsetSurface.hxx>
20 #include <Geom_SurfaceOfLinearExtrusion.hxx>
21 #include <Geom_SurfaceOfRevolution.hxx>
22 #include <Geom_BSplineSurface.hxx>
23 #include <Geom_Plane.hxx>
24 #include <BRep_Tool.hxx>
25 #include <ShapeConstruct.hxx>
26 #include <Precision.hxx>
27 #include <BRep_TEdge.hxx>
28 #include <BRep_ListIteratorOfListOfCurveRepresentation.hxx>
29 #include <BRep_GCurve.hxx>
30 #include <BRepTools.hxx>
31 #include <Message_Msg.hxx>
32 #include <Geom_Curve.hxx>
33 #include <Geom2d_Curve.hxx>
34
35 //=======================================================================
36 //function : ShapeCustom_ConvertToBSpline
37 //purpose  : 
38 //=======================================================================
39
40 ShapeCustom_ConvertToBSpline::ShapeCustom_ConvertToBSpline():
41        myExtrMode(Standard_True), myRevolMode(Standard_True),
42        myOffsetMode(Standard_True), myPlaneMode(Standard_False)
43 {
44 }
45
46 //=======================================================================
47 //function : IsToConvert
48 //purpose  : 
49 //=======================================================================
50
51 Standard_Boolean ShapeCustom_ConvertToBSpline::IsToConvert(const Handle(Geom_Surface) &S,
52                                                            Handle(Geom_Surface) &SS) const
53 {
54   SS = S;
55   if(S->IsKind(STANDARD_TYPE(Geom_RectangularTrimmedSurface))) {
56     Handle(Geom_RectangularTrimmedSurface) RTS = 
57       Handle(Geom_RectangularTrimmedSurface)::DownCast ( S );
58     SS = RTS->BasisSurface();
59   }
60   if(SS->IsKind(STANDARD_TYPE(Geom_OffsetSurface))) {
61     if(myOffsetMode)
62       return Standard_True;
63     else {
64       Handle(Geom_OffsetSurface) OS = Handle(Geom_OffsetSurface)::DownCast ( SS );
65       Handle(Geom_Surface) basis = OS->BasisSurface();
66       Handle(Geom_Surface) tmp;
67       return IsToConvert(basis,tmp);
68     }
69   }
70   if ( SS->IsKind(STANDARD_TYPE(Geom_SurfaceOfLinearExtrusion)) )
71     return myExtrMode;
72   if ( SS->IsKind(STANDARD_TYPE(Geom_SurfaceOfRevolution)) )
73     return myRevolMode;
74   if ( SS->IsKind(STANDARD_TYPE(Geom_Plane)) )
75     return myPlaneMode;  
76   return Standard_False;
77 }
78     
79 //=======================================================================
80 //function : NewSurface
81 //purpose  : 
82 //=======================================================================
83
84 Standard_Boolean ShapeCustom_ConvertToBSpline::NewSurface (const TopoDS_Face& F,
85                                                            Handle(Geom_Surface)& S,
86                                                            TopLoc_Location& L,
87                                                            Standard_Real& Tol,
88                                                            Standard_Boolean& RevWires,
89                                                            Standard_Boolean& RevFace) 
90 {
91   S = BRep_Tool::Surface(F,L);
92   Standard_Real U1,U2,V1,V2;
93   S->Bounds(U1,U2,V1,V2);
94   Standard_Real Umin, Umax,Vmin,Vmax;
95   BRepTools::UVBounds(F,Umin, Umax, Vmin, Vmax);
96   if(Precision::IsInfinite(U1) || Precision::IsInfinite(U2)) {
97     U1 = Umin;
98     U2 = Umax;
99   }
100   if(Precision::IsInfinite(V1) || Precision::IsInfinite(V2)) {
101     V1 = Vmin;
102     V2 = Vmax;
103   }
104    
105   Handle(Geom_Surface) surf;
106   if ( ! IsToConvert ( S, surf) ) return Standard_False;
107   
108   Handle(Geom_Surface) res;
109   if(surf->IsKind(STANDARD_TYPE(Geom_OffsetSurface))&&!myOffsetMode) {
110     Handle(Geom_OffsetSurface) OS = Handle(Geom_OffsetSurface)::DownCast ( surf );
111     Handle(Geom_Surface) basis = OS->BasisSurface();
112     Standard_Real offset = OS->Offset();
113     Handle(Geom_BSplineSurface) bspl = ShapeConstruct::
114       ConvertSurfaceToBSpline(basis,U1,U2,V1,V2,Precision::Approximation(),
115                                 surf->Continuity(),10000,15);
116     Handle(Geom_OffsetSurface) nOff = new Geom_OffsetSurface(bspl,offset);
117     res = nOff;
118   }
119   else {
120     GeomAbs_Shape cnt = surf->Continuity();
121     if(surf->IsKind(STANDARD_TYPE(Geom_OffsetSurface)))
122       cnt = GeomAbs_C0; //pdn 30.06.99 because of hang-up in GeomConvert_ApproxSurface
123     res = ShapeConstruct::ConvertSurfaceToBSpline(surf,U1,U2,V1,V2,Precision::Approximation(),
124                                                   cnt,10000,15);
125   }
126   if(S->IsKind(STANDARD_TYPE(Geom_RectangularTrimmedSurface)) ) {
127     Handle(Geom_RectangularTrimmedSurface) RTS = 
128       Handle(Geom_RectangularTrimmedSurface)::DownCast ( S );
129     Standard_Real UF, UL, VF, VL;
130     RTS->Bounds ( UF, UL, VF, VL );
131     S = new Geom_RectangularTrimmedSurface ( res, UF, UL, VF, VL );
132   }
133   else 
134     S = res;
135   
136   SendMsg( F, Message_Msg("ConvertToBSpline.NewSurface.MSG0"));
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     SendMsg( E, Message_Msg("ConvertToBSpline.NewCurve.MSG0"));
170     return Standard_True;
171   } 
172   return Standard_False;
173 }
174
175 //=======================================================================
176 //function : NewPoint
177 //purpose  : 
178 //=======================================================================
179
180 Standard_Boolean ShapeCustom_ConvertToBSpline::NewPoint (const TopoDS_Vertex& /*V*/,
181                                                          gp_Pnt& /*P*/, Standard_Real& /*Tol*/)
182 {
183   return Standard_False;
184 }
185
186 //=======================================================================
187 //function : NewCurve2d
188 //purpose  : 
189 //=======================================================================
190
191 Standard_Boolean ShapeCustom_ConvertToBSpline::NewCurve2d (const TopoDS_Edge& E,
192                                                            const TopoDS_Face& F,
193                                                            const TopoDS_Edge& NewE,
194                                                            const TopoDS_Face& /*NewF*/,
195                                                            Handle(Geom2d_Curve)& C,
196                                                            Standard_Real& Tol) 
197 {
198   TopLoc_Location L;
199   Handle(Geom_Surface) S = BRep_Tool::Surface(F,L);
200   Handle(Geom_Surface) ES;
201   
202   // just copy pcurve if either its surface is changing or edge was copied
203   if ( ! IsToConvert ( S, ES ) && E.IsSame ( NewE ) ) return Standard_False;
204   
205   Standard_Real f, l;
206   C = BRep_Tool::CurveOnSurface(E,F,f,l);
207   if ( ! C.IsNull() ) 
208     C = Handle(Geom2d_Curve)::DownCast ( C->Copy() );
209   
210   Tol = BRep_Tool::Tolerance ( E );
211   return Standard_True;
212 }
213
214 //=======================================================================
215 //function : NewParameter
216 //purpose  : 
217 //=======================================================================
218
219 Standard_Boolean ShapeCustom_ConvertToBSpline::NewParameter (const TopoDS_Vertex& /*V*/,
220                                                              const TopoDS_Edge& /*E*/,
221                                                              Standard_Real& /*P*/,
222                                                              Standard_Real& /*Tol*/)
223 {
224   return Standard_False;
225 }
226
227 //=======================================================================
228 //function : Continuity
229 //purpose  : 
230 //=======================================================================
231
232 GeomAbs_Shape ShapeCustom_ConvertToBSpline::Continuity (const TopoDS_Edge& E,
233                                                         const TopoDS_Face& F1,
234                                                         const TopoDS_Face& F2,
235                                                         const TopoDS_Edge& /*NewE*/,
236                                                         const TopoDS_Face& /*NewF1*/,
237                                                         const TopoDS_Face& /*NewF2*/)
238 {
239   return BRep_Tool::Continuity(E,F1,F2);
240 }
241
242 void ShapeCustom_ConvertToBSpline::SetExtrusionMode(const Standard_Boolean extrMode)
243 {
244   myExtrMode = extrMode;
245 }
246
247 void ShapeCustom_ConvertToBSpline::SetRevolutionMode(const Standard_Boolean revolMode)
248 {
249   myRevolMode = revolMode;
250 }
251
252 void ShapeCustom_ConvertToBSpline::SetOffsetMode(const Standard_Boolean offsetMode)
253 {
254   myOffsetMode = offsetMode;
255 }
256
257 void ShapeCustom_ConvertToBSpline::SetPlaneMode(const Standard_Boolean planeMode)
258 {
259   myPlaneMode = planeMode;
260 }