0025748: Parallel version of progress indicator
[occt.git] / src / TopoDSToStep / TopoDSToStep_MakeBrepWithVoids.cxx
1 // Created on: 1993-07-23
2 // Created by: Martine LANGLOIS
3 // Copyright (c) 1993-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
18 #include <BRepClass3d.hxx>
19 #include <Message_ProgressScope.hxx>
20 #include <MoniTool_DataMapOfShapeTransient.hxx>
21 #include <StdFail_NotDone.hxx>
22 #include <StepShape_BrepWithVoids.hxx>
23 #include <StepShape_ClosedShell.hxx>
24 #include <StepShape_HArray1OfOrientedClosedShell.hxx>
25 #include <StepShape_OpenShell.hxx>
26 #include <StepShape_OrientedClosedShell.hxx>
27 #include <StepShape_TopologicalRepresentationItem.hxx>
28 #include <TCollection_HAsciiString.hxx>
29 #include <TColStd_SequenceOfTransient.hxx>
30 #include <TopoDS.hxx>
31 #include <TopoDS_Iterator.hxx>
32 #include <TopoDS_Shell.hxx>
33 #include <TopoDS_Solid.hxx>
34 #include <TopoDSToStep.hxx>
35 #include <TopoDSToStep_Builder.hxx>
36 #include <TopoDSToStep_MakeBrepWithVoids.hxx>
37 #include <TopoDSToStep_Tool.hxx>
38 #include <Transfer_FinderProcess.hxx>
39 #include <TransferBRep_ShapeMapper.hxx>
40
41 //:d7
42 #ifdef OCCT_DEBUG
43 #define DEBUG
44 #endif
45
46 //=============================================================================
47 // Create a BrepWithVoids of StepShape from a Solid of TopoDS containing
48 // more than one closed shell 
49 //=============================================================================
50
51 TopoDSToStep_MakeBrepWithVoids::
52   TopoDSToStep_MakeBrepWithVoids(const TopoDS_Solid& aSolid,
53                                  const Handle(Transfer_FinderProcess)& FP,
54                                  const Message_ProgressRange& theProgress)
55 {
56   done = Standard_False ;
57   TopoDS_Iterator              It;
58   MoniTool_DataMapOfShapeTransient   aMap;
59   TColStd_SequenceOfTransient  S;
60   TopoDS_Shell                 aOutShell;
61
62   Handle(StepShape_TopologicalRepresentationItem) aItem;
63   Handle(StepShape_ClosedShell)                   aOuter, aCShell;
64   Handle(StepShape_OrientedClosedShell)           aOCShell;
65   Handle(StepShape_HArray1OfOrientedClosedShell)  aVoids;
66
67   aOutShell = BRepClass3d::OuterShell(aSolid);
68
69   TopoDSToStep_Builder StepB;
70   TopoDSToStep_Tool    aTool;
71   
72   if (!aOutShell.IsNull()) {
73     Standard_Integer nbshapes = 0;
74     for (It.Initialize(aSolid); It.More(); It.Next())
75       if (It.Value().ShapeType() == TopAbs_SHELL)
76         nbshapes++;
77     Message_ProgressScope aPS(theProgress, NULL, nbshapes);
78     for (It.Initialize(aSolid); It.More() && aPS.More(); It.Next())
79     {
80       if (It.Value().ShapeType() == TopAbs_SHELL) {
81         TopoDS_Shell CurrentShell = TopoDS::Shell(It.Value());
82         if ( ! aOutShell.IsEqual(CurrentShell) ) //:e0 abv 25 Mar 98: voids should be reversed according to EXPRESS for ABSR
83           CurrentShell.Reverse(); 
84         //:d7 abv 16 Mar 98: try to treat 'open' shells as closed since flag 
85         // IsClosed() is often incorrect (taken from MakeManifoldSolid(Solid))
86         aTool.Init(aMap, Standard_False);
87         StepB.Init(CurrentShell, aTool, FP, aPS.Next());
88         TopoDSToStep::AddResult ( FP, aTool );
89         if (StepB.IsDone()) {
90           aCShell = Handle(StepShape_ClosedShell)::DownCast(StepB.Value());
91           // si OPEN on le force a CLOSED mais que c est une honte !
92           if (aCShell.IsNull()) {
93             Handle(StepShape_OpenShell) aOShell = Handle(StepShape_OpenShell)::DownCast(StepB.Value());
94             if (!aOShell.IsNull()) {
95               aCShell = new StepShape_ClosedShell;
96               aCShell->Init (aOShell->Name(),aOShell->CfsFaces());
97 #ifdef OCCT_DEBUG
98               std::cout<<"Warning: MakeBRepWithVoids: Open shell in the solid; treated as closed"<<std::endl;
99 #endif
100             }
101           }
102           if ( ! aCShell.IsNull() ) {
103             if ( aOutShell.IsEqual(It.Value()) ) 
104               aOuter = aCShell;
105             else 
106               S.Append(aCShell);
107           }
108 #ifdef OCCT_DEBUG
109           else std::cout<<"*** MakeBRepWithVoids : Shell not mapped"<<std::endl;
110 #endif
111         }
112 #ifdef OCCT_DEBUG
113         else std::cout << "Shell not mapped" << std::endl;
114 #endif
115 /* //:d7 
116         if (It.Value().Closed()) {
117           aTool.Init(aMap, Standard_False);
118           StepB.Init(CurrentShell, aTool, FP);
119           TopoDSToStep::AddResult ( FP, aTool );
120           if (StepB.IsDone()) {
121             aCShell = Handle(StepShape_ClosedShell)::DownCast(StepB.Value());
122             if ( aOutShell.IsEqual(It.Value()) ) 
123               aOuter = aCShell;
124             else 
125               S.Append(aCShell);
126           }
127           else {
128 #ifdef OCCT_DEBUG
129             std::cout << "Shell not mapped" << std::endl;
130 #endif
131             done = Standard_False;
132           }
133         }
134         else {
135           // Error Handling : the Shape is not closed
136           done = Standard_False;
137         }
138 */      
139       }
140     }
141     if (!aPS.More())
142       return;
143
144     Standard_Integer N = S.Length();
145     if ( N>=1 ) {
146       Handle(TCollection_HAsciiString) aName = 
147         new TCollection_HAsciiString("");
148       aVoids = new StepShape_HArray1OfOrientedClosedShell(1,N);
149       for ( Standard_Integer i=1; i<=N; i++ ) {
150         aOCShell = new StepShape_OrientedClosedShell;
151         // Warning : the Oriented Shell Orientation is not always
152         //           TRUE.
153         //           Shall check the TopoDS_Shell orientation.
154         // => if the Shell is reversed, shall create an OrientedShell.
155         aOCShell -> Init(aName,Handle(StepShape_ClosedShell)::DownCast(S.Value(i)),
156                          Standard_False); //:e0
157 //:e0                    Standard_True);
158         aVoids->SetValue(i, aOCShell);
159       }
160       theBrepWithVoids = new StepShape_BrepWithVoids();
161       theBrepWithVoids->Init(aName, aOuter, aVoids);
162       done = Standard_True;
163     }
164     else done = Standard_False;
165   }
166 }
167
168 //=============================================================================
169 // renvoi des valeurs
170 //=============================================================================
171
172 const Handle(StepShape_BrepWithVoids) &
173       TopoDSToStep_MakeBrepWithVoids::Value() const
174 {
175   StdFail_NotDone_Raise_if (!done, "TopoDSToStep_MakeBrepWithVoids::Value() - no result");
176   return theBrepWithVoids;
177 }