0025748: Parallel version of progress indicator
[occt.git] / src / BRepToIGES / BRepToIGES_BRSolid.cxx
1 // Created on: 1995-01-30
2 // Created by: Marie Jose MARTZ
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
18 #include <BRep_Tool.hxx>
19 #include <BRepToIGES_BREntity.hxx>
20 #include <BRepToIGES_BRShell.hxx>
21 #include <BRepToIGES_BRSolid.hxx>
22 #include <BRepToIGES_BRWire.hxx>
23 #include <BRepTools.hxx>
24 #include <IGESBasic_Group.hxx>
25 #include <IGESData_HArray1OfIGESEntity.hxx>
26 #include <IGESData_IGESEntity.hxx>
27 #include <Interface_Macros.hxx>
28 #include <Message_ProgressScope.hxx>
29 #include <TColStd_HSequenceOfTransient.hxx>
30 #include <TopAbs_ShapeEnum.hxx>
31 #include <TopExp.hxx>
32 #include <TopExp_Explorer.hxx>
33 #include <TopoDS.hxx>
34 #include <TopoDS_Compound.hxx>
35 #include <TopoDS_CompSolid.hxx>
36 #include <TopoDS_Edge.hxx>
37 #include <TopoDS_Face.hxx>
38 #include <TopoDS_Shape.hxx>
39 #include <TopoDS_Shell.hxx>
40 #include <TopoDS_Solid.hxx>
41 #include <TopoDS_Vertex.hxx>
42 #include <TopoDS_Wire.hxx>
43
44 // At first only the geometry is translated (point, curve...)
45 //=============================================================================
46 // BRepToIGES_BRSolid
47 //=============================================================================
48 BRepToIGES_BRSolid::BRepToIGES_BRSolid()
49 {
50 }
51
52
53 //=============================================================================
54 // BRepToIGES_BRSolid
55 //=============================================================================
56
57 BRepToIGES_BRSolid::BRepToIGES_BRSolid
58 (const BRepToIGES_BREntity& BR)
59 : BRepToIGES_BREntity(BR)
60 {
61 }
62
63
64 //=============================================================================
65 // TransferSolid
66 //=============================================================================
67
68 Handle(IGESData_IGESEntity) BRepToIGES_BRSolid ::TransferSolid(const TopoDS_Shape& start,
69                                                                const Message_ProgressRange& theProgress)
70 {
71   Handle(IGESData_IGESEntity) res;
72
73   if (start.IsNull())  return  res;
74
75   if (start.ShapeType() == TopAbs_SOLID) {
76     TopoDS_Solid M =  TopoDS::Solid(start);
77     res = TransferSolid(M, theProgress);
78   }  
79   else if (start.ShapeType() == TopAbs_COMPSOLID) {
80     TopoDS_CompSolid C =  TopoDS::CompSolid(start);
81     res = TransferCompSolid(C, theProgress);
82   }  
83   else if (start.ShapeType() == TopAbs_COMPOUND) {
84     TopoDS_Compound C =  TopoDS::Compound(start);
85     res = TransferCompound(C, theProgress);
86   }  
87   else {
88     // error message
89   }  
90   return res;
91 }
92
93
94 //=============================================================================
95 // TransferSolid
96 // 
97 //=============================================================================
98
99 Handle(IGESData_IGESEntity) BRepToIGES_BRSolid ::TransferSolid(const TopoDS_Solid& start,
100                                                                const Message_ProgressRange& theProgress)
101 {
102   Handle(IGESData_IGESEntity) res;
103   if ( start.IsNull()) return res;
104
105   TopExp_Explorer Ex;
106   Handle(IGESData_IGESEntity) IShell;
107   BRepToIGES_BRShell BS(*this);
108   Handle(TColStd_HSequenceOfTransient) Seq = new TColStd_HSequenceOfTransient();
109
110   Standard_Integer nbshapes = 0;
111   for (Ex.Init(start, TopAbs_SHELL); Ex.More(); Ex.Next())
112     nbshapes++;
113   Message_ProgressScope aPS(theProgress, NULL, nbshapes);
114   for (Ex.Init(start,TopAbs_SHELL); Ex.More() && aPS.More(); Ex.Next())
115   {
116     Message_ProgressRange aRange = aPS.Next();
117     TopoDS_Shell S = TopoDS::Shell(Ex.Current());
118     if (S.IsNull()) {
119       AddWarning(start," an Shell is a null entity");
120     }
121     else {
122       IShell = BS.TransferShell (S, aRange);
123       if (!IShell.IsNull()) Seq->Append(IShell);
124     }
125   }
126
127
128   Standard_Integer nbshells = Seq->Length();
129   Handle(IGESData_HArray1OfIGESEntity) Tab;
130   if ( nbshells >= 1) {
131     Tab =  new IGESData_HArray1OfIGESEntity(1,nbshells);
132     for (Standard_Integer itab = 1; itab <= nbshells; itab++) {
133       Handle(IGESData_IGESEntity) item = GetCasted(IGESData_IGESEntity, Seq->Value(itab));
134       Tab->SetValue(itab,item);
135     }
136   }
137
138   if (nbshells == 1) {
139     res = IShell;
140   }
141   else {
142     Handle(IGESBasic_Group) IGroup = new IGESBasic_Group;
143     IGroup->Init(Tab);
144     res = IGroup;
145   }
146
147   SetShapeResult ( start, res );
148
149   return res;
150 }
151
152
153 //=============================================================================
154 // TransferCompSolid
155 //=============================================================================
156
157 Handle(IGESData_IGESEntity) BRepToIGES_BRSolid ::TransferCompSolid(const TopoDS_CompSolid& start,
158                                                                    const Message_ProgressRange& theProgress)
159 {
160   Handle(IGESData_IGESEntity) res;
161   if ( start.IsNull()) return res;
162
163   TopExp_Explorer Ex;
164   Handle(IGESData_IGESEntity) ISolid;
165   Handle(TColStd_HSequenceOfTransient) Seq = new TColStd_HSequenceOfTransient();
166
167   Standard_Integer nbshapes = 0;
168   for (Ex.Init(start, TopAbs_SOLID); Ex.More(); Ex.Next())
169     nbshapes++;
170   Message_ProgressScope aPS(theProgress, NULL, nbshapes);
171   for (Ex.Init(start,TopAbs_SOLID); Ex.More() && aPS.More(); Ex.Next())
172   {
173     Message_ProgressRange aRange = aPS.Next();
174     TopoDS_Solid S = TopoDS::Solid(Ex.Current());
175     if (S.IsNull()) {
176       AddWarning(start," an Solid is a null entity");
177     }
178     else {
179       ISolid = TransferSolid (S, aRange);
180       if (!ISolid.IsNull()) Seq->Append(ISolid);
181     }
182   }
183
184
185   Standard_Integer nbsolids = Seq->Length();
186   Handle(IGESData_HArray1OfIGESEntity) Tab;
187   if ( nbsolids >= 1) {
188     Tab =  new IGESData_HArray1OfIGESEntity(1,nbsolids);
189     for (Standard_Integer itab = 1; itab <= nbsolids; itab++) {
190       Handle(IGESData_IGESEntity) item = GetCasted(IGESData_IGESEntity, Seq->Value(itab));
191       Tab->SetValue(itab,item);
192     }
193   }
194
195   if (nbsolids == 1) {
196     res = ISolid;
197   }
198   else {
199     Handle(IGESBasic_Group) IGroup = new IGESBasic_Group;
200     IGroup->Init(Tab);
201     res = IGroup;
202   }
203
204   SetShapeResult ( start, res );
205
206   return res;
207 }
208
209
210 //=============================================================================
211 // TransferCompound
212 //=============================================================================
213
214 Handle(IGESData_IGESEntity) BRepToIGES_BRSolid ::TransferCompound(const TopoDS_Compound& start,
215                                                                   const Message_ProgressRange& theProgress)
216 {
217   Handle(IGESData_IGESEntity) res;
218   if ( start.IsNull()) return res;
219
220
221   TopExp_Explorer Ex;
222   Handle(IGESData_IGESEntity) IShape;
223   BRepToIGES_BRShell BS(*this);
224   BRepToIGES_BRWire BW(*this);
225   Handle(TColStd_HSequenceOfTransient) Seq = new TColStd_HSequenceOfTransient();
226
227   // count numbers of subshapes
228   Standard_Integer nbshapes = 0;
229   for (Ex.Init(start, TopAbs_SOLID); Ex.More(); Ex.Next())
230     nbshapes++;
231   for (Ex.Init(start, TopAbs_SHELL, TopAbs_SOLID); Ex.More(); Ex.Next())
232     nbshapes++;
233   for (Ex.Init(start, TopAbs_FACE, TopAbs_SHELL); Ex.More(); Ex.Next())
234     nbshapes++;
235   for (Ex.Init(start, TopAbs_WIRE, TopAbs_FACE); Ex.More(); Ex.Next())
236     nbshapes++;
237   for (Ex.Init(start, TopAbs_EDGE, TopAbs_WIRE); Ex.More(); Ex.Next())
238     nbshapes++;
239   for (Ex.Init(start, TopAbs_VERTEX, TopAbs_EDGE); Ex.More(); Ex.Next())
240     nbshapes++;
241   Message_ProgressScope aPS(theProgress, NULL, nbshapes);
242
243   // take all Solids
244   for (Ex.Init(start, TopAbs_SOLID); Ex.More() && aPS.More(); Ex.Next())
245   {
246     Message_ProgressRange aRange = aPS.Next();
247     TopoDS_Solid S = TopoDS::Solid(Ex.Current());
248     if (S.IsNull()) {
249       AddWarning(start," a Solid is a null entity");
250     }
251     else {
252       IShape = TransferSolid (S, aRange);
253       if (!IShape.IsNull()) Seq->Append(IShape);
254     }
255   }
256
257   // take all isolated Shells 
258   for (Ex.Init(start, TopAbs_SHELL, TopAbs_SOLID); Ex.More() && aPS.More(); Ex.Next())
259   {
260     Message_ProgressRange aRange = aPS.Next();
261     TopoDS_Shell S = TopoDS::Shell(Ex.Current());
262     if (S.IsNull()) {
263       AddWarning(start," a Shell is a null entity");
264     }
265     else {
266       IShape = BS.TransferShell (S, aRange);
267       if (!IShape.IsNull()) Seq->Append(IShape);
268     }
269   }
270
271
272   // take all isolated Faces 
273   for (Ex.Init(start, TopAbs_FACE, TopAbs_SHELL); Ex.More() && aPS.More(); Ex.Next())
274   {
275     Message_ProgressRange aRange = aPS.Next();
276     TopoDS_Face S = TopoDS::Face(Ex.Current());
277     if (S.IsNull()) {
278       AddWarning(start," a Face is a null entity");
279     }
280     else {
281       IShape = BS.TransferFace (S, aRange);
282       if (!IShape.IsNull()) Seq->Append(IShape);
283     }
284   }
285
286
287   // take all isolated Wires 
288   for (Ex.Init(start, TopAbs_WIRE, TopAbs_FACE); Ex.More() && aPS.More(); Ex.Next(), aPS.Next())
289   {
290     TopoDS_Wire S = TopoDS::Wire(Ex.Current());
291     if (S.IsNull()) {
292       AddWarning(start," a Wire is a null entity");
293     }
294     else {
295       IShape = BW.TransferWire(S);
296       if (!IShape.IsNull()) Seq->Append(IShape);
297     }
298   }
299
300
301   // take all isolated Edges 
302   for (Ex.Init(start, TopAbs_EDGE, TopAbs_WIRE); Ex.More() && aPS.More(); Ex.Next(), aPS.Next())
303   {
304     TopoDS_Edge S = TopoDS::Edge(Ex.Current());
305     if (S.IsNull()) {
306       AddWarning(start," an Edge is a null entity");
307     }
308     else {
309       IShape = BW.TransferEdge(S, Standard_False);
310       if (!IShape.IsNull()) Seq->Append(IShape);
311     }
312   }
313
314
315   // take all isolated Vertices 
316   for (Ex.Init(start, TopAbs_VERTEX, TopAbs_EDGE); Ex.More() && aPS.More(); Ex.Next(), aPS.Next())
317   {
318     TopoDS_Vertex S = TopoDS::Vertex(Ex.Current());
319     if (S.IsNull()) {
320       AddWarning(start," a Vertex is a null entity");
321     }
322     else {
323       IShape = BW.TransferVertex(S);
324       if (!IShape.IsNull()) Seq->Append(IShape);
325     }
326   }
327
328   // construct the group
329   nbshapes = Seq->Length();
330   Handle(IGESData_HArray1OfIGESEntity) Tab;
331   if (nbshapes >=1) {
332     Tab =  new IGESData_HArray1OfIGESEntity(1,nbshapes);
333     for (Standard_Integer itab = 1; itab <= nbshapes; itab++) {
334       Handle(IGESData_IGESEntity) item = GetCasted(IGESData_IGESEntity, Seq->Value(itab));
335       Tab->SetValue(itab,item);
336     }
337   }
338
339   if (nbshapes == 1) {
340     res = IShape;
341   }
342   else {
343     Handle(IGESBasic_Group) IGroup = new IGESBasic_Group;
344     IGroup->Init(Tab);
345     res = IGroup;
346   }
347
348   SetShapeResult ( start, res );
349
350   return res;
351 }