0031939: Coding - correction of spelling errors in comments
[occt.git] / src / IGESToBRep / IGESToBRep.cxx
1 // Created on: 1994-03-22
2 // Created by: GUYOT and UNTEREINER
3 // Copyright (c) 1994-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 // 21.12.98 rln, gka S4054
18 // 06.01.99 pdn  transmission from ShapeTool_MakeWire back to BRepAPI_MakeWire
19 // 19.03.99 abv  //:q5: code improvement, unnecessary includes removed
20 //S4181 pdn 15.04.99 Recognition of elementary surfaces as basic.
21
22 #include <BRep_Builder.hxx>
23 #include <BRep_Tool.hxx>
24 #include <Geom2d_Curve.hxx>
25 #include <Geom_Curve.hxx>
26 #include <Geom_Surface.hxx>
27 #include <GeomLib.hxx>
28 #include <gp_Pnt.hxx>
29 #include <gp_Pnt2d.hxx>
30 #include <IGESBasic_SingleParent.hxx>
31 #include <IGESData_IGESEntity.hxx>
32 #include <IGESGeom_Boundary.hxx>
33 #include <IGESGeom_BoundedSurface.hxx>
34 #include <IGESGeom_BSplineCurve.hxx>
35 #include <IGESGeom_BSplineSurface.hxx>
36 #include <IGESGeom_CircularArc.hxx>
37 #include <IGESGeom_CompositeCurve.hxx>
38 #include <IGESGeom_ConicArc.hxx>
39 #include <IGESGeom_CopiousData.hxx>
40 #include <IGESGeom_CurveOnSurface.hxx>
41 #include <IGESGeom_Line.hxx>
42 #include <IGESGeom_OffsetCurve.hxx>
43 #include <IGESGeom_OffsetSurface.hxx>
44 #include <IGESGeom_Plane.hxx>
45 #include <IGESGeom_Point.hxx>
46 #include <IGESGeom_RuledSurface.hxx>
47 #include <IGESGeom_SplineCurve.hxx>
48 #include <IGESGeom_SplineSurface.hxx>
49 #include <IGESGeom_SurfaceOfRevolution.hxx>
50 #include <IGESGeom_TabulatedCylinder.hxx>
51 #include <IGESGeom_TrimmedSurface.hxx>
52 #include <IGESSolid_ConicalSurface.hxx>
53 #include <IGESSolid_CylindricalSurface.hxx>
54 #include <IGESSolid_EdgeList.hxx>
55 #include <IGESSolid_Face.hxx>
56 #include <IGESSolid_Loop.hxx>
57 #include <IGESSolid_ManifoldSolid.hxx>
58 #include <IGESSolid_PlaneSurface.hxx>
59 #include <IGESSolid_Shell.hxx>
60 #include <IGESSolid_SphericalSurface.hxx>
61 #include <IGESSolid_ToroidalSurface.hxx>
62 #include <IGESSolid_VertexList.hxx>
63 #include <IGESToBRep.hxx>
64 #include <IGESToBRep_AlgoContainer.hxx>
65 #include <Interface_Macros.hxx>
66 #include <Precision.hxx>
67 #include <Standard_ErrorHandler.hxx>
68 #include <Standard_Failure.hxx>
69 #include <Standard_Stream.hxx>
70 #include <TCollection_HAsciiString.hxx>
71 #include <TopLoc_Location.hxx>
72 #include <TopoDS.hxx>
73 #include <TopoDS_Edge.hxx>
74 #include <TopoDS_Face.hxx>
75 #include <TopoDS_Shape.hxx>
76 #include <TopoDS_Wire.hxx>
77 #include <XSAlgo.hxx>
78
79 static Handle(IGESToBRep_AlgoContainer) theContainer; 
80  
81 //=======================================================================                                                
82 //function : Init                                                                                                        
83 //purpose  :                                                                                                             
84 //=======================================================================                                                
85                                                                                                                          
86  void IGESToBRep::Init()                                                                                                   
87 {                                                                                                                        
88   static Standard_Boolean init = Standard_False;                                                                         
89   if (init) return;                                                                                                      
90   init = Standard_True;                                                                                                  
91   XSAlgo::Init();                                                                                                        
92   theContainer = new IGESToBRep_AlgoContainer;                                                                             
93 }     
94    
95 //=======================================================================                                                
96 //function : SetAlgoContainer                                                                                            
97 //purpose  :                                                                                                             
98 //=======================================================================                                                
99                                                                                                                          
100  void IGESToBRep::SetAlgoContainer(const Handle(IGESToBRep_AlgoContainer)& aContainer)                                       
101 {
102   theContainer = aContainer;                                                                                             
103 }                                                                                                                        
104                                                                                                                          
105 //=======================================================================                                                
106 //function : AlgoContainer                                                                                               
107 //purpose  :                                                                                                             
108 //=======================================================================                                                
109                                                                                                                          
110  Handle(IGESToBRep_AlgoContainer) IGESToBRep::AlgoContainer()                                                                
111 {                                                                                                                        
112   return theContainer;                                                                                                   
113 }    
114
115 //=======================================================================
116 //function : IsCurveAndSurface
117 //purpose  : Return True if the IgesEntity can be transferred
118 //           by TransferCurveAndSurface
119 //=======================================================================
120 Standard_Boolean IGESToBRep::IsCurveAndSurface(const Handle(IGESData_IGESEntity)& start)
121 {
122   //S4054
123   if (start.IsNull())              return Standard_False;
124   if (IsTopoCurve(start))          return Standard_True;
125   if (IsTopoSurface(start))        return Standard_True;
126   if (IsBRepEntity(start))         return Standard_True;
127   return Standard_False;
128 }
129
130
131 //=======================================================================
132 //function : IsBasicCurve
133 //purpose  : Return True if the IgesEntity can be transferred
134 //           by TransferBasicCurve
135 //=======================================================================
136 Standard_Boolean IGESToBRep::IsBasicCurve(const Handle(IGESData_IGESEntity)& start)
137 {
138   //S4054
139   if (start.IsNull())                                      return Standard_False;
140   if (start->IsKind(STANDARD_TYPE(IGESGeom_BSplineCurve))) return Standard_True;
141   if (start->IsKind(STANDARD_TYPE(IGESGeom_Line)))         return Standard_True;
142   if (start->IsKind(STANDARD_TYPE(IGESGeom_CircularArc)))  return Standard_True;
143   if (start->IsKind(STANDARD_TYPE(IGESGeom_ConicArc)))     return Standard_True;
144   if (start->IsKind(STANDARD_TYPE(IGESGeom_CopiousData)))  return Standard_True;
145   if (start->IsKind(STANDARD_TYPE(IGESGeom_SplineCurve)))  return Standard_True;
146   return Standard_False;
147 }
148
149
150 //=======================================================================
151 //function : IsBasicSurface
152 //purpose  : Return True if the IgesEntity can be transferred
153 //           by TransferBasicSurface
154 //=======================================================================
155 Standard_Boolean IGESToBRep::IsBasicSurface(const Handle(IGESData_IGESEntity)& start)
156 {
157   //S4054
158   if (start.IsNull())                                        return Standard_False;
159   if (start->IsKind(STANDARD_TYPE(IGESGeom_BSplineSurface))) return Standard_True;
160   if (start->IsKind(STANDARD_TYPE(IGESGeom_SplineSurface)))  return Standard_True;
161   //S4181 pdn 15.04.99 added to basic surfaces
162   if (start->IsKind(STANDARD_TYPE(IGESSolid_PlaneSurface)))       return Standard_True;
163   if (start->IsKind(STANDARD_TYPE(IGESSolid_CylindricalSurface))) return Standard_True;
164   if (start->IsKind(STANDARD_TYPE(IGESSolid_ConicalSurface)))     return Standard_True;
165   if (start->IsKind(STANDARD_TYPE(IGESSolid_SphericalSurface)))   return Standard_True;
166   if (start->IsKind(STANDARD_TYPE(IGESSolid_ToroidalSurface)))   return Standard_True;
167   
168   return Standard_False;
169 }
170
171
172 //=======================================================================
173 //function : IsTopoCurve
174 //purpose  : Return True if the IgesEntity can be transferred
175 //           by TransferTopoCurve
176 //=======================================================================
177 Standard_Boolean IGESToBRep::IsTopoCurve(const Handle(IGESData_IGESEntity)& start)
178 {
179   //S4054
180   if (start.IsNull())                                        return Standard_False;
181   if (IsBasicCurve(start))                                   return Standard_True;
182   if (start->IsKind(STANDARD_TYPE(IGESGeom_CompositeCurve))) return Standard_True;
183   if (start->IsKind(STANDARD_TYPE(IGESGeom_CurveOnSurface))) return Standard_True;
184   if (start->IsKind(STANDARD_TYPE(IGESGeom_Boundary)))       return Standard_True;
185   if (start->IsKind(STANDARD_TYPE(IGESGeom_Point)))          return Standard_True;
186   if (start->IsKind(STANDARD_TYPE(IGESGeom_OffsetCurve)))    return Standard_True;
187   return Standard_False;
188 }
189
190
191 //=======================================================================
192 //function : IsTopoSurface
193 //purpose  : Return True if the IgesEntity can be transferred
194 //           by TransferTopoSurface
195 //=======================================================================
196 Standard_Boolean IGESToBRep::IsTopoSurface(const Handle(IGESData_IGESEntity)& start)
197 {
198   //S4054
199   if (start.IsNull())                                             return Standard_False;
200   if (IsBasicSurface(start))                                      return Standard_True;
201   if (start->IsKind(STANDARD_TYPE(IGESGeom_TrimmedSurface)))      return Standard_True;
202   if (start->IsKind(STANDARD_TYPE(IGESGeom_SurfaceOfRevolution))) return Standard_True;
203   if (start->IsKind(STANDARD_TYPE(IGESGeom_TabulatedCylinder)))   return Standard_True;
204   if (start->IsKind(STANDARD_TYPE(IGESGeom_RuledSurface)))        return Standard_True;
205   if (start->IsKind(STANDARD_TYPE(IGESGeom_Plane)))               return Standard_True;
206   if (start->IsKind(STANDARD_TYPE(IGESGeom_BoundedSurface)))      return Standard_True;
207   if (start->IsKind(STANDARD_TYPE(IGESGeom_OffsetSurface)))       return Standard_True;
208   //S4181 pdn 15.04.99 removing to basic surface
209   //if (start->IsKind(STANDARD_TYPE(IGESSolid_PlaneSurface)))       return Standard_True;
210 //  SingleParent, cas particulier (Face Trouee : ne contient que des PLANE)
211   if (start->IsKind(STANDARD_TYPE(IGESBasic_SingleParent))) {
212     DeclareAndCast(IGESBasic_SingleParent,sp,start);
213     if (!sp->SingleParent()->IsKind(STANDARD_TYPE(IGESGeom_Plane))) return Standard_False;
214     Standard_Integer nb = sp->NbChildren();
215     for (Standard_Integer i = 1; i <= nb; i ++) {
216       if (!sp->Child(i)->IsKind(STANDARD_TYPE(IGESGeom_Plane))) return Standard_False;
217     }
218     return Standard_True;
219   }
220   return Standard_False;
221 }
222
223
224 //=======================================================================
225 //function : IsBRepEntity
226 //purpose  : Return True if the IgesEntity can be transferred
227 //           by TransferBRepEntity
228 //=======================================================================
229 Standard_Boolean IGESToBRep::IsBRepEntity(const Handle(IGESData_IGESEntity)& start)
230 {
231   //S4054
232   if (start.IsNull())                                         return Standard_False;
233   if (start->IsKind(STANDARD_TYPE(IGESSolid_Face)))           return Standard_True;
234   if (start->IsKind(STANDARD_TYPE(IGESSolid_Shell)))          return Standard_True;
235   if (start->IsKind(STANDARD_TYPE(IGESSolid_ManifoldSolid)))  return Standard_True;
236   if (start->IsKind(STANDARD_TYPE(IGESSolid_VertexList)))     return Standard_True;
237   if (start->IsKind(STANDARD_TYPE(IGESSolid_EdgeList)))       return Standard_True;
238   if (start->IsKind(STANDARD_TYPE(IGESSolid_Loop)))           return Standard_True;
239   return Standard_False;
240 }
241
242 //=======================================================================
243 //function : IGESCurveToSequenceOfIGESCurve
244 //purpose  : Creates a sequence of IGES curves from IGES curve:
245 //           - if curve is CompositeCurve its components are recursively added,
246 //           - if curve is ordinary IGES curve it is simply added
247 //           - otherwise (Null or not curve) it is ignored
248 //remark   : if sequence is Null it is created, otherwise it is appended
249 //returns  : number of curves in sequence
250 //example  : (A B (C (D ( E F) G) H)) -> (A B C D E F G H)
251 //=======================================================================
252
253  Standard_Integer IGESToBRep::IGESCurveToSequenceOfIGESCurve(const Handle(IGESData_IGESEntity)& curve,
254                                                              Handle(TColStd_HSequenceOfTransient)& sequence) 
255 {
256   if (sequence.IsNull()) sequence = new TColStd_HSequenceOfTransient;
257   if (!curve.IsNull()) {
258     if (curve->IsKind (STANDARD_TYPE (IGESGeom_CompositeCurve))) {
259       Handle(IGESGeom_CompositeCurve) comp = Handle(IGESGeom_CompositeCurve)::DownCast (curve);
260       for (Standard_Integer i = 1; i <= comp->NbCurves(); i++) {
261         Handle(TColStd_HSequenceOfTransient) tmpsequence;
262         IGESCurveToSequenceOfIGESCurve (comp->Curve (i), tmpsequence);
263         sequence->Append (tmpsequence);
264       }
265     }
266     else if (IGESToBRep::IsTopoCurve (curve) &&
267              ! curve->IsKind (STANDARD_TYPE (IGESGeom_Point)))
268       sequence->Append (curve);
269   }
270   return sequence->Length();
271 }
272
273 //=======================================================================
274 //function : TransferPCurve
275 //purpose  : Copies pcurve on face <face> from <fromedge> to <toedge>
276 //           If <toedge> already has pcurve on that <face>, <toedge> becomes
277 //           a seam-edge; if both pcurves are not SameRange, the SameRange is
278 //           called. Returns False if pcurves are not made SameRange
279 //           Making <toedge> SameParameter should be done outside the method (???)
280 //=======================================================================
281
282  Standard_Boolean IGESToBRep::TransferPCurve (const TopoDS_Edge& fromedge, const TopoDS_Edge& toedge, const TopoDS_Face& face)
283 {
284   Standard_Boolean result = Standard_True;
285   Standard_Real olda, oldb, a, b;
286   Handle(Geom2d_Curve) oldpcurve = BRep_Tool::CurveOnSurface (toedge,   face, olda, oldb),
287                           pcurve = BRep_Tool::CurveOnSurface (fromedge, face, a,    b   );
288   BRep_Builder B;
289   if (!oldpcurve.IsNull()) {
290     if (olda != a || oldb != b) {
291       try {
292         OCC_CATCH_SIGNALS
293         Handle(Geom2d_Curve) newpcurve;
294         GeomLib::SameRange (Precision::PConfusion(), oldpcurve, olda, oldb, a, b, newpcurve);
295         if (!newpcurve.IsNull()) {
296           olda = a; oldb = b; oldpcurve = newpcurve;
297         }
298         else {
299 #ifdef OCCT_DEBUG
300           std::cout << "Warning: IGESToBRep::TransferPCurve: pcurves are not SameRange" << std::endl;
301 #endif
302           result = Standard_False;
303         }
304       }
305       catch(Standard_Failure const& anException) {
306 #ifdef OCCT_DEBUG
307         std::cout << "\n**IGESToBRep::TransferPCurve: Exception in SameRange : "; 
308         anException.Print(std::cout);
309 #endif
310         (void)anException;
311         result = Standard_False;
312       }
313     }
314     if (toedge.Orientation() == TopAbs_FORWARD)
315       B.UpdateEdge (toedge,
316                     Handle(Geom2d_Curve)::DownCast (pcurve->Copy()), 
317                     Handle(Geom2d_Curve)::DownCast (oldpcurve->Copy()), face, 0);
318     else
319       B.UpdateEdge (toedge,
320                     Handle(Geom2d_Curve)::DownCast (oldpcurve->Copy()), 
321                     Handle(Geom2d_Curve)::DownCast (pcurve->Copy()), face, 0);
322   }
323   else {
324     olda = a; oldb = b;
325     B.UpdateEdge (toedge, Handle(Geom2d_Curve)::DownCast (pcurve->Copy()), face, 0);
326   }
327   B.Range (toedge, face, a, b);
328   Standard_Real first, last;
329   if (!BRep_Tool::Curve (toedge, first, last).IsNull() && (first != a || last != b))
330     B.SameRange (toedge, Standard_False);
331   else
332     B.SameRange (toedge, Standard_True);
333   return result;
334 }