0028427: Data Exchange - Update Reference Manual for STEP format
[occt.git] / src / StepToTopoDS / StepToTopoDS_Builder.cxx
1 // Created on: 1995-01-03
2 // Created by: Frederic MAUPAS
3 // Copyright (c) 1995-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 //:i6 abv 17 Sep 98: ProSTEP TR9 r0601-ct.stp: to be able read GeometricSet
18 //gka 11.01.99 file PRO7755.stp #2018: work-around error in BRepLib_MakeFace
19 //:n4 abv 12.02.99: S4132: treatment of GEOMETRIC_SETs implemented
20 //:o7 abv 18.02.99: bm1_sy_fuel.stp #1427(items 1,2) protection against null entity
21 //abv,gka 05.04.99 S4136: parameter names changed; avoid extra call to FixSameParameter
22
23 #include <BRep_Builder.hxx>
24 #include <BRepBuilderAPI_MakeEdge.hxx>
25 #include <BRepBuilderAPI_MakeFace.hxx>
26 #include <BRepBuilderAPI_MakeVertex.hxx>
27 #include <BRepLib.hxx>
28 #include <Geom_BoundedSurface.hxx>
29 #include <Geom_CartesianPoint.hxx>
30 #include <Geom_Curve.hxx>
31 #include <Geom_RectangularTrimmedSurface.hxx>
32 #include <Geom_Surface.hxx>
33 #include <Interface_Static.hxx>
34 #include <Message_Messenger.hxx>
35 #include <Message_ProgressSentry.hxx>
36 #include <Precision.hxx>
37 #include <ShapeFix_ShapeTolerance.hxx>
38 #include <Standard_ErrorHandler.hxx>
39 #include <Standard_Failure.hxx>
40 #include <StdFail_NotDone.hxx>
41 #include <STEPControl_ActorRead.hxx>
42 #include <StepGeom_CartesianPoint.hxx>
43 #include <StepGeom_CompositeCurve.hxx>
44 #include <StepGeom_Curve.hxx>
45 #include <StepGeom_CurveBoundedSurface.hxx>
46 #include <StepGeom_GeometricRepresentationItem.hxx>
47 #include <StepGeom_RectangularCompositeSurface.hxx>
48 #include <StepGeom_Surface.hxx>
49 #include <StepGeom_SurfacePatch.hxx>
50 #include <StepShape_BrepWithVoids.hxx>
51 #include <StepShape_ClosedShell.hxx>
52 #include <StepShape_ConnectedEdgeSet.hxx>
53 #include <StepShape_EdgeBasedWireframeModel.hxx>
54 #include <StepShape_FaceBasedSurfaceModel.hxx>
55 #include <StepShape_FaceSurface.hxx>
56 #include <StepShape_FacetedBrep.hxx>
57 #include <StepShape_FacetedBrepAndBrepWithVoids.hxx>
58 #include <StepShape_GeometricSet.hxx>
59 #include <StepShape_GeometricSetSelect.hxx>
60 #include <StepShape_HArray1OfConnectedEdgeSet.hxx>
61 #include <StepShape_HArray1OfConnectedFaceSet.hxx>
62 #include <StepShape_HArray1OfEdge.hxx>
63 #include <StepShape_HArray1OfFace.hxx>
64 #include <StepShape_ManifoldSolidBrep.hxx>
65 #include <StepShape_OpenShell.hxx>
66 #include <StepShape_OrientedClosedShell.hxx>
67 #include <StepShape_Shell.hxx>
68 #include <StepShape_ShellBasedSurfaceModel.hxx>
69 #include <StepToGeom.hxx>
70 #include <StepToTopoDS_Builder.hxx>
71 #include <StepToTopoDS_DataMapOfTRI.hxx>
72 #include <StepToTopoDS_NMTool.hxx>
73 #include <StepToTopoDS_Tool.hxx>
74 #include <StepToTopoDS_TranslateCompositeCurve.hxx>
75 #include <StepToTopoDS_TranslateCurveBoundedSurface.hxx>
76 #include <StepToTopoDS_TranslateEdge.hxx>
77 #include <StepToTopoDS_TranslateFace.hxx>
78 #include <StepToTopoDS_TranslateShell.hxx>
79 #include <TopExp_Explorer.hxx>
80 #include <TopoDS.hxx>
81 #include <TopoDS_Compound.hxx>
82 #include <TopoDS_Edge.hxx>
83 #include <TopoDS_Face.hxx>
84 #include <TopoDS_Shape.hxx>
85 #include <TopoDS_Shell.hxx>
86 #include <TopoDS_Solid.hxx>
87 #include <Transfer_ActorOfTransientProcess.hxx>
88 #include <Transfer_TransientProcess.hxx>
89 #include <TransferBRep.hxx>
90
91 #include <stdio.h>
92 static void ResetPreci (const TopoDS_Shape& S, Standard_Real maxtol)
93 {
94   //:S4136
95   Standard_Integer modetol = Interface_Static::IVal("read.maxprecision.mode");
96   if (modetol) {
97     ShapeFix_ShapeTolerance STU;
98     STU.LimitTolerance (S,Precision::Confusion(),maxtol);
99   }
100 }
101
102 // ============================================================================
103 // Method  : StepToTopoDS_Builder::StepToTopoDS_Builder
104 // Purpose : Empty constructor
105 // ============================================================================
106
107 StepToTopoDS_Builder::StepToTopoDS_Builder()
108 {
109   done = Standard_False;
110 }
111
112 // ============================================================================
113 // Method  : StepToTopoDS_Builder::StepToTopoDS_Builder
114 // Purpose : Constructor with a ManifoldSolidBrep
115 // ============================================================================
116
117 StepToTopoDS_Builder::StepToTopoDS_Builder
118 (const Handle(StepShape_ManifoldSolidBrep)& aManifoldSolid, 
119  const Handle(Transfer_TransientProcess)& TP)
120 {
121   Init(aManifoldSolid, TP);
122 }
123
124 // ============================================================================
125 // Method  : StepToTopoDS_Builder::StepToTopoDS_Builder
126 // Purpose : Constructor woth a BrepWithVoids
127 // ============================================================================
128
129 StepToTopoDS_Builder::StepToTopoDS_Builder
130 (const Handle(StepShape_BrepWithVoids)& aBRepWithVoids,
131  const Handle(Transfer_TransientProcess)& TP)
132 {
133   Init(aBRepWithVoids, TP);
134 }
135
136 // ============================================================================
137 // Method  : StepToTopoDS_Builder::StepToTopoDS_Builder
138 // Purpose : Constructor with a FacetedBrep
139 // ============================================================================
140
141 StepToTopoDS_Builder::StepToTopoDS_Builder
142 (const Handle(StepShape_FacetedBrep)& aFB,
143  const Handle(Transfer_TransientProcess)& TP)
144 {
145   Init(aFB, TP);
146 }
147
148 // ============================================================================
149 // Method  : StepToTopoDS_Builder::StepToTopoDS_Builder
150 // Purpose : Constructor with a FacetedBrepAndBrepWithVoids
151 // ============================================================================
152
153 StepToTopoDS_Builder::StepToTopoDS_Builder
154 (const Handle(StepShape_FacetedBrepAndBrepWithVoids)& aFBABWV,
155  const Handle(Transfer_TransientProcess)& TP)
156 {
157   Init(aFBABWV, TP);
158 }
159
160 // ============================================================================
161 // Method  : StepToTopoDS_Builder::StepToTopoDS_Builder
162 // Purpose : Constructor with a ShellBasedSurfaceModel
163 // ============================================================================
164
165 StepToTopoDS_Builder::StepToTopoDS_Builder
166 (const Handle(StepShape_ShellBasedSurfaceModel)& aSBSM,
167  const Handle(Transfer_TransientProcess)& TP,
168  StepToTopoDS_NMTool& NMTool)
169 {
170   Init(aSBSM, TP, NMTool);
171 }
172
173 // ============================================================================
174 // Method  : Init
175 // Purpose : Init with a ManifoldSolidBrep
176 // ============================================================================
177
178 void StepToTopoDS_Builder::Init
179 (const Handle(StepShape_ManifoldSolidBrep)& aManifoldSolid,
180  const Handle(Transfer_TransientProcess)& TP)
181 {
182   Handle(Message_Messenger) sout = TP->Messenger();
183   // Initialisation of the Tool
184
185   StepToTopoDS_Tool         myTool;
186   StepToTopoDS_DataMapOfTRI aMap;
187
188   myTool.Init(aMap, TP);
189
190   // Start Mapping
191
192   Handle(StepShape_ConnectedFaceSet) aShell;
193   aShell = aManifoldSolid->Outer();
194
195   StepToTopoDS_TranslateShell myTranShell;
196   myTranShell.SetPrecision(Precision());
197   myTranShell.SetMaxTol(MaxTol());
198   // Non-manifold topology is not referenced by ManifoldSolidBrep (ssv; 14.11.2010)
199   StepToTopoDS_NMTool dummyNMTool;
200   myTranShell.Init(aShell, myTool, dummyNMTool);
201
202   if (myTranShell.IsDone()) {
203     TopoDS_Shape Sh = myTranShell.Value();
204     Sh.Closed(Standard_True);
205     //BRepLib::SameParameter(Sh);
206     TopoDS_Solid S;
207     BRep_Builder B;
208     B.MakeSolid(S);
209     B.Add(S,Sh);
210     myResult = S;
211     myError  = StepToTopoDS_BuilderDone;
212     done     = Standard_True;
213
214     // Get Statistics :
215
216     if ( TP->TraceLevel() > 2 )
217     {
218       sout << "Geometric Statitics : " << endl;
219       sout << "   Surface Continuity : - C0 : " << myTool.C0Surf() << endl;
220       sout << "                        - C1 : " << myTool.C1Surf() << endl;
221       sout << "                        - C2 : " << myTool.C2Surf() << endl;
222       sout << "   Curve Continuity :   - C0 : " << myTool.C0Cur3() << endl;
223       sout << "                        - C1 : " << myTool.C1Cur3() << endl;
224       sout << "                        - C2 : " << myTool.C2Cur3() << endl;
225       sout << "   PCurve Continuity :  - C0 : " << myTool.C0Cur2() << endl;
226       sout << "                        - C1 : " << myTool.C1Cur2() << endl;
227       sout << "                        - C2 : " << myTool.C2Cur2() << endl;
228     }
229
230 //:S4136    ShapeFix::SameParameter (S,Standard_False);
231     ResetPreci (S, MaxTol());
232   }
233   else {
234     TP->AddWarning(aShell," OuterShell from ManifoldSolidBrep not mapped to TopoDS");
235     myError  = StepToTopoDS_BuilderOther;
236     done     = Standard_False;
237   }
238 }
239
240 // ============================================================================
241 // Method  : Init
242 // Purpose : Init with a BrepWithVoids
243 // ============================================================================
244
245 void StepToTopoDS_Builder::Init
246 (const Handle(StepShape_BrepWithVoids)& aBRepWithVoids,
247  const Handle(Transfer_TransientProcess)& TP)
248 {
249   Handle(Message_Messenger) sout = TP->Messenger();
250  // Initialisation of the Tool
251   StepToTopoDS_Tool         myTool;
252   StepToTopoDS_DataMapOfTRI aMap;
253
254   myTool.Init(aMap, TP);
255
256   // Start Mapping
257
258   Standard_Integer Nb = aBRepWithVoids->NbVoids();
259   Handle(StepShape_ClosedShell) aCShell;
260   TopoDS_Solid S;
261   TopoDS_Shape Sh;
262   BRep_Builder B;
263   B.MakeSolid(S);
264   
265   Message_ProgressSentry PS ( TP->GetProgress(), "Shell", 0, Nb+1, 1 );
266
267   StepToTopoDS_TranslateShell myTranShell;
268
269   myTranShell.SetPrecision(Precision());//gka
270   myTranShell.SetMaxTol(MaxTol());
271   // OuterBound
272
273   aCShell = Handle(StepShape_ClosedShell)::DownCast(aBRepWithVoids->Outer());
274   // Non-manifold topology is not referenced by BrepWithVoids (ssv; 14.11.2010)
275   StepToTopoDS_NMTool dummyNMTool;
276   myTranShell.Init(aCShell, myTool, dummyNMTool);
277   
278   PS.Next();
279
280   if (myTranShell.IsDone()) {
281     Sh = myTranShell.Value();
282     Sh.Closed(Standard_True);
283     //BRepLib::SameParameter(Sh);
284     B.MakeSolid(S);
285     B.Add(S,Sh);
286     myResult = S;
287     myError  = StepToTopoDS_BuilderDone;
288     done     = Standard_True;
289   }
290   else {
291     TP->AddWarning(aCShell," OuterShell from BrepWithVoids not mapped to TopoDS");
292     myError  = StepToTopoDS_BuilderOther;
293     done     = Standard_False;
294     return;
295   }
296
297   // Voids
298
299   for (Standard_Integer i=1; i<=Nb && PS.More(); i++, PS.Next()) {
300
301     aCShell = aBRepWithVoids->VoidsValue(i);
302     myTranShell.Init(aCShell, myTool, dummyNMTool);
303     if (myTranShell.IsDone()) {
304       Sh = myTranShell.Value();
305       Sh.Closed(Standard_True);
306
307       //:e0 abv 25 Mar 98: void should be an OrientedShell 
308       Handle(StepShape_OrientedClosedShell) aOCShell = aBRepWithVoids->VoidsValue(i);
309       if ( ! aOCShell.IsNull() && ! aOCShell->Orientation() ) Sh.Reverse();
310       
311       //BRepLib::SameParameter(Sh);
312       B.Add(S,Sh);
313     }
314     else {
315       TP->AddWarning
316         (aCShell," A Void from BrepWithVoids not mapped to TopoDS");
317     }
318   }
319   myResult = S;
320
321
322   // Get Statistics :
323   
324   if ( TP->TraceLevel() > 2 )
325   {
326     sout << "Geometric Statitics : " << endl;
327     sout << "   Surface Continuity : - C0 : " << myTool.C0Surf() << endl;
328     sout << "                        - C1 : " << myTool.C1Surf() << endl;
329     sout << "                        - C2 : " << myTool.C2Surf() << endl;
330     sout << "   Curve Continuity :   - C0 : " << myTool.C0Cur3() << endl;
331     sout << "                        - C1 : " << myTool.C1Cur3() << endl;
332     sout << "                        - C2 : " << myTool.C2Cur3() << endl;
333     sout << "   PCurve Continuity :  - C0 : " << myTool.C0Cur2() << endl;
334     sout << "                        - C1 : " << myTool.C1Cur2() << endl;
335     sout << "                        - C2 : " << myTool.C2Cur2() << endl;
336   }
337
338 //:S4136  ShapeFix::SameParameter (S,Standard_False);
339   ResetPreci (S, MaxTol());
340 }
341
342 // ============================================================================
343 // Method  : Init
344 // Purpose : Init with a FacetedBrep
345 // ============================================================================
346
347 void StepToTopoDS_Builder::Init(const Handle(StepShape_FacetedBrep)& aFB,
348                                const Handle(Transfer_TransientProcess)& TP)
349 {
350   // Initialisation of the Tool
351
352   StepToTopoDS_Tool         myTool;
353   StepToTopoDS_DataMapOfTRI aMap;
354
355   myTool.Init(aMap, TP);
356
357   // Start Mapping
358
359   Handle(StepShape_ClosedShell) aCShell;
360   aCShell = Handle(StepShape_ClosedShell)::DownCast(aFB->Outer());
361   TopoDS_Shape Sh;
362
363   StepToTopoDS_TranslateShell myTranShell; 
364   myTranShell.SetPrecision(Precision()); //gka
365   myTranShell.SetMaxTol(MaxTol());  
366   // Non-manifold topology is not referenced by FacetedBrep (ss; 14.11.2010)
367   StepToTopoDS_NMTool dummyNMTool;
368   myTranShell.Init(aCShell, myTool, dummyNMTool);
369
370   if (myTranShell.IsDone()) {
371     Sh = myTranShell.Value();
372     Sh.Closed(Standard_True);
373     //BRepLib::SameParameter(Sh);
374     myTool.ClearEdgeMap();
375     myTool.ClearVertexMap();
376     TopoDS_Solid S;
377     BRep_Builder B;
378     B.MakeSolid(S);
379     B.Add(S,Sh);
380     myResult = S;
381     myError  = StepToTopoDS_BuilderDone;
382     done     = Standard_True;
383   }
384   else {
385     TP->AddWarning
386       (aCShell," OuterShell from FacetedBrep not mapped to TopoDS");
387     myError  = StepToTopoDS_BuilderOther;
388     done     = Standard_True;
389   }
390 }
391
392 // ============================================================================
393 // Method  : Init
394 // Purpose : Init with a FacetedBrepAndBrepWithVoids
395 // ============================================================================
396
397 void StepToTopoDS_Builder::Init
398 (const Handle(StepShape_FacetedBrepAndBrepWithVoids)& aFBABWV,
399  const Handle(Transfer_TransientProcess)& TP)
400 {
401   // Initialisation of the Tool
402
403   StepToTopoDS_Tool         myTool;
404   StepToTopoDS_DataMapOfTRI aMap;
405
406   myTool.Init(aMap, TP);
407
408   // Start Mapping
409
410   Handle(StepShape_ClosedShell) aCShell;
411   aCShell = Handle(StepShape_ClosedShell)::DownCast(aFBABWV->Outer());
412   TopoDS_Shape Sh;
413
414   StepToTopoDS_TranslateShell myTranShell;
415   myTranShell.SetPrecision(Precision()); //gka
416   myTranShell.SetMaxTol(MaxTol());
417   // Non-manifold topology is not referenced by FacetedBrepAndBrepWithVoids (ss; 14.11.2010)
418   StepToTopoDS_NMTool dummyNMTool;
419   myTranShell.Init(aCShell, myTool, dummyNMTool);
420
421   if (myTranShell.IsDone()) {
422     Sh = myTranShell.Value();
423     Sh.Closed(Standard_True);
424     //BRepLib::SameParameter(Sh);
425     TopoDS_Solid S;
426     BRep_Builder B;
427     B.MakeSolid(S);
428     B.Add(S,Sh);
429     Standard_Integer Nb, i;
430     Nb = aFBABWV->NbVoids();
431     for ( i=1; i<=Nb; i++ ) {
432       aCShell = aFBABWV->VoidsValue(i);
433       myTranShell.Init(aCShell, myTool, dummyNMTool);
434       if (myTranShell.IsDone()) {
435         Sh = myTranShell.Value();
436         Sh.Closed(Standard_True);
437         //BRepLib::SameParameter(Sh);
438         B.Add(S, Sh);
439       }
440       else {
441         TP->AddWarning
442           (aCShell," A Void from FacetedBrepAndBrepWithVoids not mapped to TopoDS");
443       }
444     }
445     myResult = S;
446     myError  = StepToTopoDS_BuilderDone;
447     done     = Standard_True;
448   }
449   else {
450     TP->AddWarning
451       (aCShell," OuterShell from FacetedBrepAndBrepWithVoids not mapped to TopoDS");
452     done    = Standard_False;
453     myError = StepToTopoDS_BuilderOther;
454   }
455 }
456
457 // ============================================================================
458 // Method  : Init
459 // Purpose : Init with a ShellBasedSurfaceModel
460 // ============================================================================
461
462 void StepToTopoDS_Builder::Init
463 (const Handle(StepShape_ShellBasedSurfaceModel)& aSBSM,
464  const Handle(Transfer_TransientProcess)& TP,
465  StepToTopoDS_NMTool& NMTool)
466 {
467   Handle(Message_Messenger) sout = TP->Messenger();
468   // Initialisation of the Tool
469
470   StepToTopoDS_Tool         myTool;
471   StepToTopoDS_DataMapOfTRI aMap;
472
473   myTool.Init(aMap, TP);
474
475   // Start Mapping
476
477   Standard_Integer Nb = aSBSM->NbSbsmBoundary();
478   StepShape_Shell aShell;
479   //Handle(StepShape_VertexShell) aVertexShell;
480   Handle(StepShape_OpenShell)   aOpenShell;
481   Handle(StepShape_ClosedShell) aClosedShell;
482   TopoDS_Compound S;
483   //TopoDS_Shape Sh;
484   TopoDS_Shape Shl;
485   BRep_Builder B;
486   B.MakeCompound(S);
487   StepToTopoDS_TranslateShell myTranShell;
488   
489   myTranShell.SetPrecision(Precision());
490   myTranShell.SetMaxTol(MaxTol());
491
492   Message_ProgressSentry PS ( TP->GetProgress(), "Shell", 0, Nb, 1 );
493   for (Standard_Integer i = 1; i <= Nb && PS.More(); i++, PS.Next()) {
494     aShell = aSBSM->SbsmBoundaryValue(i);
495     aOpenShell = aShell.OpenShell();
496     aClosedShell = aShell.ClosedShell();
497     if (!aOpenShell.IsNull()) {
498       myTranShell.Init(aOpenShell, myTool, NMTool);
499       if (myTranShell.IsDone()) {
500         Shl = TopoDS::Shell(myTranShell.Value());
501         Shl.Closed(Standard_False);
502         B.Add(S, Shl);
503       }
504       else {
505         TP->AddWarning
506           (aOpenShell, " OpenShell from ShellBasedSurfaceModel not mapped to TopoDS");
507       }
508     }
509     else if (!aClosedShell.IsNull()) {
510       myTranShell.Init(aClosedShell, myTool, NMTool);
511       if (myTranShell.IsDone()) {
512         Shl = TopoDS::Shell(myTranShell.Value());
513         Shl.Closed(Standard_True);
514         B.Add(S, Shl);
515       }
516       else {
517         TP->AddWarning
518           (aClosedShell, " ClosedShell from ShellBasedSurfaceModel not mapped to TopoDS");
519       }
520     }
521   }
522   if(Nb>1)
523     myResult = S;
524   else
525     myResult = Shl;
526   myError  = StepToTopoDS_BuilderDone;
527   done     = Standard_True;
528
529   // Get Statistics :
530   
531   if ( TP->TraceLevel() > 2 )
532   {
533     sout << "Geometric Statitics : " << endl;
534     sout << "   Surface Continuity : - C0 : " << myTool.C0Surf() << endl;
535     sout << "                        - C1 : " << myTool.C1Surf() << endl;
536     sout << "                        - C2 : " << myTool.C2Surf() << endl;
537     sout << "   Curve Continuity :   - C0 : " << myTool.C0Cur3() << endl;
538     sout << "                        - C1 : " << myTool.C1Cur3() << endl;
539     sout << "                        - C2 : " << myTool.C2Cur3() << endl;
540     sout << "   PCurve Continuity :  - C0 : " << myTool.C0Cur2() << endl;
541     sout << "                        - C1 : " << myTool.C1Cur2() << endl;
542     sout << "                        - C2 : " << myTool.C2Cur2() << endl;
543   }
544
545 //:S4136  ShapeFix::SameParameter (S,Standard_False);
546   ResetPreci (S, MaxTol());
547   ResetPreci (Shl, MaxTol()); //skl
548 }
549
550 // ============================================================================
551 // Method  : Init
552 // Purpose : Init with a EdgeBasedWireframeModel
553 // ============================================================================
554
555 void StepToTopoDS_Builder::Init (const Handle(StepShape_EdgeBasedWireframeModel)& aEBWM,
556                                  const Handle(Transfer_TransientProcess)& TP)
557 {
558   myResult.Nullify();
559   
560   Handle(StepShape_HArray1OfConnectedEdgeSet) boundary = aEBWM->EbwmBoundary();
561   if ( boundary.IsNull() || boundary->Length() <1 ) {
562     TP->AddWarning ( aEBWM, "List of boundaries is empty" );
563     return;
564   }
565
566   StepToTopoDS_Tool myTool;
567   StepToTopoDS_DataMapOfTRI aMap;
568   myTool.Init(aMap, TP);
569
570   StepToTopoDS_TranslateEdge myTranEdge;
571   myTranEdge.SetPrecision(Precision());
572   myTranEdge.SetMaxTol(MaxTol());
573   
574   TopoDS_Compound C;
575   BRep_Builder B;
576   B.MakeCompound ( C );
577
578   StepToTopoDS_NMTool dummyNMTool;
579   
580   for ( Standard_Integer i=1; i <= boundary->Length(); i++ ) {
581     Handle(StepShape_ConnectedEdgeSet) ces = boundary->Value(i);
582     if ( ces.IsNull() ) continue;
583     Handle(StepShape_HArray1OfEdge) edges = ces->CesEdges();
584     if ( edges.IsNull() || edges->Length() <1 ) {
585       TP->AddWarning ( ces, "No edges in connected_edge_set" );
586       continue;
587     }
588     TopoDS_Wire W;
589     for ( Standard_Integer j=1; j <= edges->Length(); j++ ) {
590       myTranEdge.Init (edges->Value(j), myTool, dummyNMTool);
591       if ( ! myTranEdge.IsDone() ) continue;
592       TopoDS_Edge E = TopoDS::Edge(myTranEdge.Value());
593       if (E.IsNull()) continue;  // NULL, on saute
594       if ( W.IsNull() ) B.MakeWire ( W );
595       B.Add ( W, E );
596     }
597     if ( W.IsNull() ) continue;
598     W.Closed (BRep_Tool::IsClosed (W));
599     B.Add ( C, W );
600     if ( myResult.IsNull() ) myResult = W;
601     else myResult = C;
602   }
603   
604   myError  = ( myResult.IsNull() ? StepToTopoDS_BuilderDone : StepToTopoDS_BuilderOther );
605   done     = ! myResult.IsNull();
606
607   ResetPreci (myResult, MaxTol());
608 }
609
610 // ============================================================================
611 // Method  : Init
612 // Purpose : Init with a FaceBasedSurfaceModel
613 // ============================================================================
614
615 void StepToTopoDS_Builder::Init (const Handle(StepShape_FaceBasedSurfaceModel)& aFBSM,
616                                  const Handle(Transfer_TransientProcess)& TP)
617 {
618   myResult.Nullify();
619   
620   Handle(StepShape_HArray1OfConnectedFaceSet) boundary = aFBSM->FbsmFaces();
621   if ( boundary.IsNull() || boundary->Length() <1 ) {
622     TP->AddWarning ( aFBSM, "List of faces is empty" );
623     return;
624   }
625
626   StepToTopoDS_Tool myTool;
627   StepToTopoDS_DataMapOfTRI aMap;
628   myTool.Init(aMap, TP);
629
630   StepToTopoDS_TranslateFace myTranFace;
631   myTranFace.SetPrecision(Precision());
632   myTranFace.SetMaxTol(MaxTol());
633   
634   TopoDS_Compound C;
635   BRep_Builder B;
636   B.MakeCompound ( C );
637
638   // Non-manifold topology is not mapped via FaceBasedSurfaceModel (ssv; 14.11.2010)
639   StepToTopoDS_NMTool dummyNMTool;
640   
641   for ( Standard_Integer i=1; i <= boundary->Length(); i++ ) {
642     Handle(StepShape_ConnectedFaceSet) cfs = boundary->Value(i);
643     if ( cfs.IsNull() ) continue;
644     Handle(StepShape_HArray1OfFace) faces = cfs->CfsFaces();
645     if ( faces.IsNull() || faces->Length() <1 ) {
646       TP->AddWarning ( cfs, "No faces in connected_face_set" );
647       continue;
648     }
649     TopoDS_Shell S;
650     for ( Standard_Integer j=1; j <= faces->Length(); j++ ) {
651       Handle(StepShape_FaceSurface) fs = Handle(StepShape_FaceSurface)::DownCast ( faces->Value(j) );
652       myTranFace.Init(fs, myTool, dummyNMTool);
653       if ( ! myTranFace.IsDone() ) continue;
654       TopoDS_Face F = TopoDS::Face(myTranFace.Value());
655       if (F.IsNull()) continue;  // NULL, on saute
656       if ( S.IsNull() ) B.MakeShell ( S );
657       B.Add ( S, F );
658     }
659     if ( S.IsNull() ) continue;
660     S.Closed (BRep_Tool::IsClosed (S));
661     B.Add ( C, S );
662     if ( myResult.IsNull() ) myResult = S;
663     else myResult = C;
664   }
665   
666   myError  = ( myResult.IsNull() ? StepToTopoDS_BuilderDone : StepToTopoDS_BuilderOther );
667   done     = ! myResult.IsNull();
668
669   ResetPreci (myResult, MaxTol());
670 }
671
672
673 // ***start DTH Apr/6
674 // ============================================================================
675 // Method  : Init
676 // Purpose : Init with a GeometricCurveSet
677 // ============================================================================
678 //:i6 abv 17 Sep 98: ProSTEP TR9 r0601-ct.stp: to be able read GS: GeometricCurveSet -> GeometricSet
679
680 static TopoDS_Face TranslateBoundedSurf (const Handle(StepGeom_Surface) &surf,
681                                          const Standard_Real TolDegen)
682 {
683   TopoDS_Face res;
684
685   Handle(Geom_Surface) theSurf = StepToGeom::MakeSurface (surf);
686   if (theSurf.IsNull() || //:i6: protection
687       !theSurf->IsKind(STANDARD_TYPE(Geom_BoundedSurface))) return res;
688
689   BRepBuilderAPI_MakeFace myMkFace;
690   Handle(Geom_RectangularTrimmedSurface) RS = 
691                     Handle(Geom_RectangularTrimmedSurface)::DownCast(theSurf);
692
693   if (!RS.IsNull())
694   {
695     Standard_Real umin, umax, vmin, vmax;
696     theSurf->Bounds(umin, umax, vmin, vmax);
697
698     myMkFace.Init(RS->BasisSurface(), umin, umax, vmin, vmax, TolDegen);
699   }
700   else
701   {
702     myMkFace.Init(theSurf, Standard_True, TolDegen);
703   }
704
705   return myMkFace.Face();
706 }
707
708 void StepToTopoDS_Builder::Init
709 (const Handle(StepShape_GeometricSet)& GCS,
710  const Handle(Transfer_TransientProcess)& TP,
711  const Handle(Transfer_ActorOfTransientProcess)& RA,
712  const Standard_Boolean isManifold)
713 {
714   // Start Mapping
715   TopoDS_Compound S;
716   BRep_Builder B;
717   B.MakeCompound(S);
718   TopoDS_Edge theEdge;
719   Standard_Integer i;
720   Standard_Real preci = Precision();   //gka
721   Standard_Real maxtol = MaxTol();
722   Standard_Integer nbElem = GCS->NbElements();
723   for (i = 1; i <= nbElem ; i++) {
724     StepShape_GeometricSetSelect aGSS = GCS->ElementsValue(i);
725     Handle(Standard_Transient) ent = aGSS.Value();
726
727     TopoDS_Shape res = TransferBRep::ShapeResult ( TP, ent );
728     if ( ! res.IsNull() ) { // already translated
729       B.Add ( S, res );
730       continue;
731     }
732     //:o7 abv 18 Feb 99: bm1_sy_fuel.stp #1427(1,2) protection against null entity
733     if ( ent.IsNull() ) {
734       char buff[100];
735       sprintf ( buff, "Entity %d is a Null entity", i );
736       TP->AddWarning (GCS,buff);
737       continue;
738     } 
739     // try curve
740     else if ( ent->IsKind(STANDARD_TYPE(StepGeom_Curve)) ) {
741       Handle(StepGeom_Curve) aCrv = Handle(StepGeom_Curve)::DownCast ( ent );
742
743       // try composite_curve
744       Handle(StepGeom_CompositeCurve) CC = Handle(StepGeom_CompositeCurve)::DownCast(aCrv);
745       if (!CC.IsNull()) {
746         StepToTopoDS_TranslateCompositeCurve TrCC;
747         TrCC.SetPrecision(preci);
748         TrCC.SetMaxTol(maxtol);
749         TrCC.Init(CC, TP);
750         if (TrCC.IsDone())
751         {
752           if (TrCC.IsInfiniteSegment())
753           {
754             BRep_Builder aB;
755             TopoDS_Compound aComp;
756             aB.MakeCompound(aComp);
757             TopExp_Explorer anExp;
758             for (anExp.Init(TrCC.Value(), TopAbs_EDGE); anExp.More(); anExp.Next())
759               aB.Add(aComp, anExp.Current());
760             res = aComp;
761           }
762           else
763             res = TrCC.Value();
764         }
765       }
766       else { // try other curves
767         Handle(Geom_Curve) aGeomCrv;
768         try {
769           OCC_CATCH_SIGNALS
770             aGeomCrv = StepToGeom::MakeCurve(aCrv);
771         }
772         catch (Standard_Failure const& anException) {
773           Handle(Message_Messenger) sout = TP->Messenger();
774           sout << "StepToTopoDS, GeometricSet, elem " << i << " of " << nbElem << ": exception ";
775           sout << anException.GetMessageString() << endl;
776         }
777         if (!aGeomCrv.IsNull()) {
778           BRepBuilderAPI_MakeEdge anEdge(aGeomCrv, aGeomCrv->FirstParameter(), aGeomCrv->LastParameter());
779           if (anEdge.IsDone()) res = anEdge.Edge();
780         }
781       }
782     }
783     // try point
784     else if ( ent->IsKind(STANDARD_TYPE(StepGeom_CartesianPoint)) ) {
785       Handle(StepGeom_CartesianPoint) aPnt = Handle(StepGeom_CartesianPoint)::DownCast ( ent );
786       Handle(Geom_CartesianPoint) thePnt = StepToGeom::MakeCartesianPoint (aPnt);
787       if (! thePnt.IsNull()) {
788         BRepBuilderAPI_MakeVertex myMkVtx(thePnt->Pnt());
789         if ( myMkVtx.IsDone() ) res = myMkVtx.Vertex();
790       }
791     }
792     // Element should finally be a Surface
793     else if (ent->IsKind(STANDARD_TYPE(StepGeom_Surface))) {
794       Handle(StepGeom_Surface) aSurf =
795         Handle(StepGeom_Surface)::DownCast(ent);
796
797       // try curve_bounded_surf
798       if (ent->IsKind(STANDARD_TYPE(StepGeom_CurveBoundedSurface))) {
799         Handle(StepGeom_CurveBoundedSurface) CBS =
800           Handle(StepGeom_CurveBoundedSurface)::DownCast(aSurf);
801         StepToTopoDS_TranslateCurveBoundedSurface TrCBS;
802         TrCBS.SetPrecision(preci);
803         TrCBS.SetMaxTol(maxtol);
804
805         TrCBS.Init(CBS, TP);
806         if (TrCBS.IsDone()) res = TrCBS.Value();
807       }
808       // try RectangularCompositeSurface
809       else if (ent->IsKind(STANDARD_TYPE(StepGeom_RectangularCompositeSurface))) {
810         Handle(StepGeom_RectangularCompositeSurface) RCS =
811           Handle(StepGeom_RectangularCompositeSurface)::DownCast(aSurf);
812         Standard_Integer nbi = RCS->NbSegmentsI();
813         Standard_Integer nbj = RCS->NbSegmentsJ();
814         TopoDS_Compound C;
815         B.MakeCompound(C);
816         for (Standard_Integer ii = 1; ii <= nbi; ii++)
817           for (Standard_Integer j = 1; j <= nbj; j++) {
818             Handle(StepGeom_SurfacePatch) patch = RCS->SegmentsValue(ii, j);
819             TopoDS_Face f = TranslateBoundedSurf(patch->ParentSurface(), preci);
820             if (!f.IsNull()) B.Add(C, f);
821           }
822         res = C;
823       }
824       // try other surfs
825       else res = TranslateBoundedSurf(aSurf, preci);
826     }
827     else if ( ent->IsKind(STANDARD_TYPE(StepGeom_GeometricRepresentationItem)) )
828     {
829       Handle(StepGeom_GeometricRepresentationItem) GRI = 
830         Handle(StepGeom_GeometricRepresentationItem)::DownCast(ent);
831       if (!RA.IsNull())
832       {
833         Handle(STEPControl_ActorRead) anActor = Handle(STEPControl_ActorRead)::DownCast(RA);
834         Handle(Transfer_Binder) binder;
835         if( !anActor.IsNull())
836           binder = anActor->TransferShape(GRI, TP, isManifold);
837         if (!binder.IsNull())
838         {
839           res = TransferBRep::ShapeResult(binder);
840         }
841       }
842     }
843     else TP->AddWarning (ent," Entity is not a Curve, Point, Surface or GeometricRepresentationItem");
844     if ( ! res.IsNull() ) {
845       B.Add(S, res);
846       TransferBRep::SetShapeResult ( TP, ent, res );
847     }
848     else TP->AddWarning (ent," Entity not mapped to TopoDS");
849   }
850   myResult = S;
851   myError  = StepToTopoDS_BuilderDone;
852   done     = Standard_True;
853 }
854 // ***end DTH Apr/6 
855
856
857 // ============================================================================
858 // Method  : Value
859 // Purpose : Returns the result of the mapping
860 // ============================================================================
861
862 const TopoDS_Shape& StepToTopoDS_Builder::Value() const 
863 {
864   StdFail_NotDone_Raise_if(!done,"");
865   return myResult;
866 }
867
868 // ============================================================================
869 // Method  : Error
870 // Purpose : Returns the Builder Error code
871 // ============================================================================
872
873 StepToTopoDS_BuilderError StepToTopoDS_Builder::Error() const 
874 {
875   return myError;
876 }
877