0022707: Invalid shape translating a SAT file
[occt.git] / src / StepToTopoDS / StepToTopoDS_TranslateShell.cxx
1 // File:        StepToTopoDS_TranslateShell.cxx
2 // Created:     Tue Jan  3 14:01:53 1995
3 // Author:      Frederic MAUPAS
4 //              <fma@stylox>
5 //:   gka 09.04.99: S4136: improving tolerance management
6
7 #include <StepToTopoDS_TranslateShell.ixx>
8
9 #include <StepToTopoDS_TranslateFace.hxx>
10
11 #include <StepShape_FaceSurface.hxx>
12
13 #include <BRep_Builder.hxx>
14 #include <TopoDS.hxx>
15 #include <TopoDS_Shell.hxx>
16 #include <TopoDS_Face.hxx>
17 #include <Transfer_TransientProcess.hxx>
18
19 #include <Message_ProgressIndicator.hxx>
20 #include <Message_ProgressSentry.hxx>
21
22 // ============================================================================
23 // Method  : StepToTopoDS_TranslateShell::StepToTopoDS_TranslateShell
24 // Purpose : Empty Constructor
25 // ============================================================================
26
27 StepToTopoDS_TranslateShell::StepToTopoDS_TranslateShell()
28 {
29   done = Standard_False;
30 }
31
32 // ============================================================================
33 // Method  : StepToTopoDS_TranslateShell::StepToTopoDS_TranslateShell()
34 // Purpose : Constructor with a ConnectedFaceSet and a Tool
35 // ============================================================================
36
37 StepToTopoDS_TranslateShell::StepToTopoDS_TranslateShell
38 (const Handle(StepShape_ConnectedFaceSet)& CFS, StepToTopoDS_Tool& T, StepToTopoDS_NMTool& NMTool)
39 {
40   Init(CFS, T, NMTool);
41 }
42
43 // ============================================================================
44 // Method  : Init
45 // Purpose : Init with a ConnectedFaceSet and a Tool
46 // ============================================================================
47
48 void StepToTopoDS_TranslateShell::Init
49 (const Handle(StepShape_ConnectedFaceSet)& CFS, StepToTopoDS_Tool& aTool, StepToTopoDS_NMTool& NMTool)
50 {
51
52   if (!aTool.IsBound(CFS)) {
53
54     BRep_Builder B;
55     Handle(Transfer_TransientProcess) TP = aTool.TransientProcess();
56
57     Standard_Integer NbFc = CFS->NbCfsFaces();
58     TopoDS_Shell Sh;
59     B.MakeShell(Sh);
60     TopoDS_Face F;
61     TopoDS_Shape S;
62     Handle(StepShape_Face) StepFace;
63
64     StepToTopoDS_TranslateFace myTranFace;
65     myTranFace.SetPrecision(Precision()); //gka
66     myTranFace.SetMaxTol(MaxTol());
67
68     Message_ProgressSentry PS ( TP->GetProgress(), "Face", 0, NbFc, 1 );
69     for (Standard_Integer i=1; i<=NbFc && PS.More(); i++, PS.Next()) {
70 #ifdef DEBUG
71       cout << "Processing Face : " << i << endl;
72 #endif
73       StepFace = CFS->CfsFacesValue(i);
74       Handle(StepShape_FaceSurface) theFS = 
75         Handle(StepShape_FaceSurface)::DownCast(StepFace);
76       if (!theFS.IsNull()) {
77         myTranFace.Init(theFS, aTool, NMTool);
78         if (myTranFace.IsDone()) {
79           S = myTranFace.Value();
80           F = TopoDS::Face(S);
81           B.Add(Sh, F);
82         }
83         else { // Warning only + add FaceSurface file Identifier
84           TP->AddWarning(theFS," a Face from Shell not mapped to TopoDS");
85         }
86       }
87       else { // Warning : ajouter identifier
88         TP->AddWarning(StepFace," Face is not of FaceSurface Type; not mapped to TopoDS");
89       }
90     }
91     myResult = Sh;
92     aTool.Bind(CFS, myResult);
93     myError  = StepToTopoDS_TranslateShellDone;
94     done     = Standard_True;
95   }
96   else {
97     myResult = TopoDS::Shell(aTool.Find(CFS));
98     myError  = StepToTopoDS_TranslateShellDone;
99     done     = Standard_True;
100   }
101 }
102
103 // ============================================================================
104 // Method  : Value
105 // Purpose : Return the mapped Shape
106 // ============================================================================
107
108 const TopoDS_Shape& StepToTopoDS_TranslateShell::Value() const 
109 {
110   StdFail_NotDone_Raise_if(!done,"");
111   return myResult;
112 }
113
114 // ============================================================================
115 // Method  : Error
116 // Purpose : Return the TranslateShell Error code
117 // ============================================================================
118
119 StepToTopoDS_TranslateShellError StepToTopoDS_TranslateShell::Error() const
120 {
121   return myError;
122 }