0026377: Passing Handle objects as arguments to functions as non-const reference...
[occt.git] / src / IGESToBRep / IGESToBRep_BRepEntity.cxx
1 // Copyright (c) 1999-2014 OPEN CASCADE SAS
2 //
3 // This file is part of Open CASCADE Technology software library.
4 //
5 // This library is free software; you can redistribute it and/or modify it under
6 // the terms of the GNU Lesser General Public License version 2.1 as published
7 // by the Free Software Foundation, with special exception defined in the file
8 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
9 // distribution for complete text of the license and disclaimer of any warranty.
10 //
11 // Alternatively, this file may be used under the terms of Open CASCADE
12 // commercial license or contractual agreement.
13
14 //=======================================================================
15 //purpose  : Members to transfert any BRepEntity into TopoDS_Shape
16 //=======================================================================
17 // 21.12.98 rln, gka S4054
18 //#62 rln 10.01.99 PRO17015
19 //:q5 abv 19.03.99 unnecessary includes removed
20 //pdn 12.03.99 S4135 Constructing vertex with minimal tolerance
21 //:r1 abv 25.03.99 CTS21655.igs, CTS18545.igs: apply FixOrientation to whole face
22 //S4181 pdn 20.04.99 implementing of reading IGES elementary surfaces.
23 //pdn 20.04.99 CTS22655 avoid of exceptions in case of empty loops
24
25 #include <BRep_Builder.hxx>
26 #include <BRep_Tool.hxx>
27 #include <BRepTools.hxx>
28 #include <Geom_Curve.hxx>
29 #include <Geom_TrimmedCurve.hxx>
30 #include <gp.hxx>
31 #include <gp_Pnt.hxx>
32 #include <gp_Trsf2d.hxx>
33 #include <gp_Vec2d.hxx>
34 #include <IGESBasic_SingleParent.hxx>
35 #include <IGESData_HArray1OfIGESEntity.hxx>
36 #include <IGESData_IGESEntity.hxx>
37 #include <IGESData_IGESModel.hxx>
38 #include <IGESData_ToolLocation.hxx>
39 #include <IGESGeom_Boundary.hxx>
40 #include <IGESGeom_BoundedSurface.hxx>
41 #include <IGESGeom_CurveOnSurface.hxx>
42 #include <IGESGeom_Plane.hxx>
43 #include <IGESGeom_TrimmedSurface.hxx>
44 #include <IGESSolid_EdgeList.hxx>
45 #include <IGESSolid_Face.hxx>
46 #include <IGESSolid_Loop.hxx>
47 #include <IGESSolid_ManifoldSolid.hxx>
48 #include <IGESSolid_Shell.hxx>
49 #include <IGESSolid_VertexList.hxx>
50 #include <IGESToBRep.hxx>
51 #include <IGESToBRep_AlgoContainer.hxx>
52 #include <IGESToBRep_BasicCurve.hxx>
53 #include <IGESToBRep_BasicSurface.hxx>
54 #include <IGESToBRep_BRepEntity.hxx>
55 #include <IGESToBRep_CurveAndSurface.hxx>
56 #include <IGESToBRep_IGESBoundary.hxx>
57 #include <IGESToBRep_ToolContainer.hxx>
58 #include <IGESToBRep_TopoCurve.hxx>
59 #include <IGESToBRep_TopoSurface.hxx>
60 #include <Interface_Macros.hxx>
61 #include <Message_Msg.hxx>
62 #include <Message_ProgressSentry.hxx>
63 #include <Precision.hxx>
64 #include <ShapeBuild_Edge.hxx>
65 #include <ShapeExtend_WireData.hxx>
66 #include <Standard_ErrorHandler.hxx>
67 #include <TCollection_HAsciiString.hxx>
68 #include <TopAbs_ShapeEnum.hxx>
69 #include <TopExp.hxx>
70 #include <TopLoc_Location.hxx>
71 #include <TopoDS.hxx>
72 #include <TopoDS_Edge.hxx>
73 #include <TopoDS_Face.hxx>
74 #include <TopoDS_Iterator.hxx>
75 #include <TopoDS_Shape.hxx>
76 #include <TopoDS_Shell.hxx>
77 #include <TopoDS_Solid.hxx>
78 #include <TopoDS_Vertex.hxx>
79 #include <TopoDS_Wire.hxx>
80 #include <Transfer_TransientProcess.hxx>
81
82 #include <stdio.h>
83 //rln
84 //#include <ShapeFix_Face.hxx>
85 //=======================================================================
86 //function : IGESToBRep_BRepEntity
87 //purpose  : 
88 //=======================================================================
89 IGESToBRep_BRepEntity::IGESToBRep_BRepEntity()
90      :IGESToBRep_CurveAndSurface()
91 {
92   SetModeTransfer(Standard_False);
93   SetContinuity(0);
94 }
95
96
97 //=======================================================================
98 //function : IGESToBRep_BRepEntity
99 //purpose  : 
100 //=======================================================================
101 IGESToBRep_BRepEntity::IGESToBRep_BRepEntity
102   (const IGESToBRep_CurveAndSurface& CS)
103      :IGESToBRep_CurveAndSurface(CS)
104 {
105   SetContinuity(0);
106 }
107
108
109 //=======================================================================
110 //function : IGESToBRep_BRepEntity
111 //purpose  : 
112 //=======================================================================
113 IGESToBRep_BRepEntity::IGESToBRep_BRepEntity
114   (const Standard_Real    eps,
115    const Standard_Real    epsCoeff,
116    const Standard_Real    epsGeom,
117    const Standard_Boolean mode,
118    const Standard_Boolean modeapprox,
119    const Standard_Boolean optimized)
120      :IGESToBRep_CurveAndSurface(eps, epsCoeff, epsGeom, mode, modeapprox,
121                                  optimized)
122 {  
123   SetContinuity(0);
124 }
125
126
127 //=======================================================================
128 //function : TransferBRepEntity
129 //purpose  : 
130 //=======================================================================
131 TopoDS_Shape IGESToBRep_BRepEntity::TransferBRepEntity
132   (const Handle(IGESData_IGESEntity)& start)
133 {
134   TopoDS_Shape res;
135
136   if (start->IsKind(STANDARD_TYPE(IGESSolid_Face))) {
137     DeclareAndCast(IGESSolid_Face, st510, start);
138     res = TransferFace(st510);
139   }
140   else if (start->IsKind(STANDARD_TYPE(IGESSolid_Shell))) {
141     DeclareAndCast(IGESSolid_Shell, st514, start);
142     res = TransferShell(st514);
143   }
144   else if (start->IsKind(STANDARD_TYPE(IGESSolid_ManifoldSolid))) {
145     DeclareAndCast(IGESSolid_ManifoldSolid, st186, start);
146     res = TransferManifoldSolid(st186);
147   }
148   else {
149     Message_Msg Msg1005("IGES_1005");
150     SendFail(start,Msg1005);
151   }
152   return res;
153 }
154
155
156 //=======================================================================
157 //function : TransferVertex
158 //purpose  : 
159 //=======================================================================
160 TopoDS_Vertex IGESToBRep_BRepEntity::TransferVertex
161   (const Handle(IGESSolid_VertexList)& start,
162    const Standard_Integer index)
163 {
164   TopoDS_Vertex res;
165
166   Standard_Integer nbshapes = NbShapeResult(start);
167   if (nbshapes == 0 ) {
168     BRep_Builder B;
169     for (Standard_Integer inum = 1; inum <= start->NbVertices(); inum++) {
170       gp_Pnt point = start-> Vertex(inum);
171       point.Scale(gp_Pnt(0,0,0),GetUnitFactor());
172       TopoDS_Vertex V;
173       //pdn 12.03.99 S4135 Constructing vertex with minimal tolerance
174       B.MakeVertex(V, point, Precision::Confusion());
175       AddShapeResult(start,V);
176     }
177   }
178   
179   TopoDS_Shape Sh = GetShapeResult(start,index);
180   if ( Sh.IsNull()) { 
181     Message_Msg Msg1156("IGES_1156"); //"the Vertex number %d is a null object." FAIL!!!
182     Handle(TCollection_HAsciiString) label = GetModel()->StringLabel(start);
183     Msg1156.Arg("vertex %d");
184     Msg1156.Arg(index);
185     Msg1156.Arg(label);
186     SendWarning(start,Msg1156);
187   }
188   res = TopoDS::Vertex(Sh);
189   return res;
190 }
191
192
193 //=======================================================================
194 //function : TransferEdge
195 //purpose  : 
196 //=======================================================================
197 TopoDS_Shape IGESToBRep_BRepEntity::TransferEdge
198   (const Handle(IGESSolid_EdgeList)& start,
199    const Standard_Integer index)
200 {
201   TopoDS_Shape res;
202   BRep_Builder B;
203   
204   Standard_Integer nbshapes = NbShapeResult(start);
205   if (nbshapes == 0) {
206     IGESToBRep_TopoCurve  TC(*this);
207     for (Standard_Integer inum = 1; inum <= start->NbEdges(); inum++) {
208       
209       // Vertices
210       // --------
211       Handle(IGESSolid_VertexList) thestartlist = start->StartVertexList(inum);
212       Standard_Integer thestartindex = start->StartVertexIndex(inum);
213       TopoDS_Vertex V1 = TransferVertex(thestartlist,thestartindex);
214       
215       Handle(IGESSolid_VertexList) theendlist = start->EndVertexList(inum);
216       Standard_Integer theendindex = start->EndVertexIndex(inum);
217       TopoDS_Vertex V2 = TransferVertex(theendlist,theendindex);
218       
219       // Curve
220       // -----
221       
222       Handle(IGESData_IGESEntity)  thecurve = start->Curve(inum);
223       if (thecurve.IsNull() ||
224           !IGESToBRep::IsTopoCurve(thecurve)  || 
225           thecurve->IsKind(STANDARD_TYPE(IGESGeom_CurveOnSurface)) ||
226           thecurve->IsKind(STANDARD_TYPE(IGESGeom_Boundary))           ) {
227         Message_Msg Msg1306("IGES_1306");//one underlying curve is a Null object.
228         Msg1306.Arg(inum);
229         SendWarning(start,Msg1306);
230         TopoDS_Edge Sh;
231         AddShapeResult(start,Sh);
232       }
233       else {
234         TopoDS_Shape Sh = TC.TransferTopoCurve(thecurve);
235         if (!Sh.IsNull()) {
236           if (Sh.ShapeType() == TopAbs_EDGE) {
237             TopoDS_Edge edge = TopoDS::Edge(Sh);
238             TopoDS_Vertex Vf,Vl;
239             TopExp::Vertices (edge, Vf, Vl);
240             TopoDS_Edge E;
241             B.MakeEdge(E);
242             TopLoc_Location    loc;
243             Standard_Real      first, last;
244             Handle(Geom_Curve) Crv  = BRep_Tool::Curve(edge, loc, first, last);
245             Handle(Geom_Curve) newC3d;
246             // dams le cas d`une conique, il faut reverser
247             // sens de parcours IGES inverse sens de parcours CASCADE.
248             if (Crv->IsKind(STANDARD_TYPE(Geom_TrimmedCurve))) {
249               DeclareAndCast(Geom_TrimmedCurve, acurve, Crv);
250               newC3d = acurve->BasisCurve();
251             }
252             else {
253               newC3d = Crv;
254             }
255             B.UpdateEdge(E,newC3d,loc,0.);//S4054:GetEpsGeom()*GetUnitFactor()
256             gp_Pnt p1 = BRep_Tool::Pnt ( V1 ); 
257             gp_Pnt p2 = BRep_Tool::Pnt ( V2 ); 
258             gp_Pnt pf = BRep_Tool::Pnt ( Vf ); 
259             gp_Pnt pl = BRep_Tool::Pnt ( Vl ); 
260             Standard_Real dist1f = p1.Distance ( pf );
261             Standard_Real dist2f = p2.Distance ( pf );
262             Standard_Real dist1l = p1.Distance ( pl );
263             Standard_Real dist2l = p2.Distance ( pl );
264             if ( V1.IsSame(V2) || dist1f + dist2l <= dist1l + dist2f + Precision::Confusion() ) {
265               //:77 if (BRepTools::Compare(V1, Vf)) //the part 'else' only if, in fact, edge should be reversed
266               V1.Orientation(TopAbs_FORWARD);
267               B.Add(E,V1);
268               V2.Orientation(TopAbs_REVERSED);
269               B.Add(E,V2);
270               B.UpdateVertex(V1, first, E, 0.);//S4054 1.001 * dist1f //:77 GetEpsGeom()*GetUnitFactor();
271               B.UpdateVertex(V2, last,  E, 0.);//S4054 1.001 * dist2l //:77 GetEpsGeom()*GetUnitFactor();
272               B.Range (E, first, last);
273             }
274             // modif mjm du 13/10/97 : Reverse de l`edge ?
275             else {
276               E.Reverse();
277               V1.Orientation(TopAbs_FORWARD);
278               B.Add(E,V1);
279               V2.Orientation(TopAbs_REVERSED);
280               B.Add(E,V2);
281               B.UpdateVertex(V1, last,  E, 0.);//S4054 1.001 * dist1l //:77 GetEpsGeom()*GetUnitFactor();
282               B.UpdateVertex(V2, first, E, 0.);//S4054 1.001 * dist2f //:77 GetEpsGeom()*GetUnitFactor();
283               B.Range (E, first, last);
284             }
285             AddShapeResult(start,E);
286           }
287           else if (Sh.ShapeType() == TopAbs_WIRE) {
288             // pas traite 
289             Message_Msg Msg1325("IGES_1325"); //"Edge : result of TransferTopoCurve is WIRE"
290             Msg1325.Arg(inum);
291             SendWarning(start,Msg1325);
292             //AddWarning(start,"Edge : result of TransferTopoCurve is WIRE");
293           }
294         }
295         else {
296           Message_Msg Msg1156("IGES_1156");
297           Handle(TCollection_HAsciiString) label = GetModel()->StringLabel(thecurve);
298           Msg1156.Arg("underlying curve");
299           Msg1156.Arg(label);
300           SendWarning(start,Msg1156);       
301         }
302       }
303     }
304   }
305   
306   TopoDS_Shape Sh = GetShapeResult(start,index);
307   if ( Sh.IsNull()) {
308     Message_Msg Msg1156("IGES_1156"); 
309     Handle(TCollection_HAsciiString) label = GetModel()->StringLabel(start);
310     Msg1156.Arg("edge %d");
311     Msg1156.Arg(index);
312     Msg1156.Arg(label);
313     SendWarning(start,Msg1156);
314   }
315   return Sh;
316 }
317
318
319 //=======================================================================
320 //function : TransferLoop
321 //purpose  : 
322 //=======================================================================
323 TopoDS_Shape IGESToBRep_BRepEntity::TransferLoop(const Handle(IGESSolid_Loop)& start,
324                                                  const TopoDS_Face& face,
325                                                  const gp_Trsf2d& trans,
326                                                  const Standard_Real uFact) 
327 {
328   TopoDS_Shape res;
329   
330   if (!HasShapeResult(start)) {
331     TopoDS_Wire mywire;
332     Standard_Boolean okCurve = Standard_True, okCurve3d = Standard_True, okCurve2d = Standard_True;
333     Handle(ShapeExtend_WireData) sewd;
334     Standard_Integer filepreference = 3;//3D is preferred by default
335     Standard_Boolean Result = Standard_True;
336
337     Handle(IGESToBRep_IGESBoundary) IB = IGESToBRep::AlgoContainer()->ToolContainer()->IGESBoundary();
338     IB->Init (*this, start, face, trans, uFact, filepreference);
339     BRep_Builder B;
340     ShapeBuild_Edge sbe;
341     
342     for ( Standard_Integer iedge = 1; iedge <= start->NbEdges(); iedge++ ) {
343       Standard_Integer itype = start->EdgeType(iedge);
344       Handle(IGESData_IGESEntity)  theedge = start->Edge(iedge);
345       Standard_Integer indexlist = start->ListIndex(iedge);
346       Standard_Boolean orientation = start->Orientation(iedge);
347       Standard_Integer nbparam = start->NbParameterCurves(iedge);
348       if (theedge.IsNull()) {
349          Message_Msg Msg1365("IGES_1365"); //"Loop : one edge is null" 
350          Msg1365.Arg(iedge);
351          SendWarning(start,Msg1365);
352         //      AddWarning (start,"Loop : one edge is null");
353       }
354       else {
355         //  edge
356         //  ----
357         Handle(ShapeExtend_WireData) curve3d = new ShapeExtend_WireData;
358
359         if (( itype == 1) && (theedge ->IsKind(STANDARD_TYPE(IGESSolid_VertexList)))) {
360           DeclareAndCast(IGESSolid_VertexList,thelist,theedge);
361           TopoDS_Vertex V1 = TransferVertex(thelist,indexlist);
362           TopoDS_Edge  E;
363           B.MakeEdge(E);
364           //szv#4:S4163:12Mar99 SGI warns
365           TopoDS_Shape sh = V1.Oriented(TopAbs_FORWARD);
366           B.Add(E, TopoDS::Vertex(sh));
367           sh = V1.Oriented(TopAbs_REVERSED);
368           B.Add(E, TopoDS::Vertex(sh));
369           B.Degenerated(E, Standard_True);
370           curve3d->Add (E);
371         }
372         else if (( itype == 0) && (theedge ->IsKind(STANDARD_TYPE(IGESSolid_EdgeList)))) {
373           DeclareAndCast(IGESSolid_EdgeList,thelist,theedge);
374           TopoDS_Shape Sh = TransferEdge(thelist,indexlist);
375           curve3d->Add (Sh);
376         }
377         else { 
378           Message_Msg Msg1365("IGES_1365"); //"Improper type for the edge"
379           Handle(TCollection_HAsciiString) label = GetModel()->StringLabel(start);
380           Msg1365.Arg(iedge);
381           SendWarning(start,Msg1365);
382           //AddWarning (start, "Improper type for the edge");   
383           continue;
384         }
385         if (!orientation) curve3d->Reverse();
386         
387         //  traitement des courbes 2d.
388         //  -------------------------
389         Handle(IGESData_HArray1OfIGESEntity) Curves2d;
390         
391         //Current limitation:
392         //2D representation is not translated if:
393         //- 3D curve was translated into wire (i.e. if it is 102)
394         //- more than 1 2D curve,
395         //- 2D curve is 102
396         Handle(TColStd_HSequenceOfTransient) seq2d;
397         if (curve3d->NbEdges() == 1 && nbparam == 1 &&
398             IGESToBRep::IGESCurveToSequenceOfIGESCurve (start->ParametricCurve(iedge, 1), seq2d) == 1) {
399           Curves2d = new IGESData_HArray1OfIGESEntity (1, nbparam);
400           for (Standard_Integer i = 1; i <= nbparam; i++)
401             Curves2d->SetValue (i, start->ParametricCurve(iedge,i));
402         }
403         Handle(ShapeExtend_WireData) lsewd;//result of translation of current edge
404         Result = Result & IB->Transfer (okCurve, okCurve3d, okCurve2d,
405                                         curve3d, Curves2d, !orientation,
406                                         iedge, lsewd);
407         if (iedge == 1) sewd = IB->WireData();//initialization
408         if (curve3d->NbEdges() == 1 && lsewd->NbEdges() == 1) {//the condition corresponds to limitation above
409           //to keep sharing of edges all geometric representations should be put
410           //into the edge from EdgeList
411           TopoDS_Edge fromedge = lsewd->Edge(1), toedge = curve3d->Edge(1);
412           if (!fromedge.IsSame (toedge)) {
413             sbe.RemoveCurve3d (toedge);
414             IGESToBRep::TransferPCurve (fromedge, toedge, face);
415             sewd->Set (toedge, sewd->Index (fromedge));
416           }
417         }
418       }
419     }
420     //IB->Check(Result, Standard_True);
421     //pdn 20.04.99 CTS22655 avoid of exceptions in case of empty loops
422     if(!sewd.IsNull()) {
423       //IB.Fix (sewd, Standard_False, Standard_True, Standard_True, Standard_True, Standard_True);
424       mywire = sewd->Wire();
425     }
426     SetShapeResult(start, mywire);
427   }
428   
429   TopoDS_Shape Sh = GetShapeResult(start);
430   if ( Sh.IsNull()) {
431     Message_Msg Msg1156("IGES_1156"); //The Loop is null
432     Handle(TCollection_HAsciiString) label = GetModel()->StringLabel(start);
433     Msg1156.Arg("loop");
434     Msg1156.Arg(label);
435     SendWarning(start,Msg1156);
436   }
437   return Sh;
438 }
439
440 //=======================================================================
441 //function : TransferFace
442 //purpose  : 
443 //=======================================================================
444 TopoDS_Shape IGESToBRep_BRepEntity::TransferFace
445   (const Handle(IGESSolid_Face)& start)
446 {
447   TopoDS_Shape res;
448
449   if (!HasShapeResult(start)) {
450     BRep_Builder B;
451     TopoDS_Face F;
452     Handle(IGESData_IGESEntity) surf         = start->Surface();
453     Standard_Integer            nbloops      = start->NbLoops();
454     IGESToBRep_TopoSurface TS(*this);
455
456     // surface
457     // -------
458     if (surf.IsNull() || 
459         !IGESToBRep::IsTopoSurface(surf) ||
460         surf->IsKind(STANDARD_TYPE(IGESGeom_Plane)) ||
461         surf->IsKind(STANDARD_TYPE(IGESGeom_BoundedSurface)) ||
462         surf->IsKind(STANDARD_TYPE(IGESGeom_TrimmedSurface)) ||
463         surf->IsKind(STANDARD_TYPE(IGESBasic_SingleParent)) ){
464       Message_Msg Msg196("XSTEP_196"); //"pas de surface de base pour creer la face"
465       SendWarning(start,Msg196);
466       // AddWarning(start, "pas de surface de base pour creer la face");
467       TopoDS_Shape Sh;
468       SetShapeResult(start,Sh);
469     }
470     else {
471       // si la surface IGES est une surface de revolution , il faudra
472       // inverser les courbes 2d (u,v) pour etre en accord avec le parametrage
473       // BRep.
474       gp_Trsf2d trans;
475       Standard_Real uFact;
476       TopoDS_Shape myshape = TS.ParamSurface(surf, trans, uFact);
477       
478       if (!myshape.IsNull()) {
479         if (myshape.ShapeType() == TopAbs_FACE) {
480           //#62 rln 10.01.99 PRO17015 (reading back IGES written in 'BRep' mode) face #65
481           F = TopoDS::Face (myshape);
482           F.EmptyCopy();
483           if (nbloops == 0) B.NaturalRestriction (F,Standard_True);
484           
485           // Loops
486           // -----
487           for (Standard_Integer iloop = 1; iloop <= nbloops; iloop++){
488             Handle(IGESSolid_Loop) loop = start->Loop(iloop);
489             TopoDS_Shape Shape = TransferLoop (loop, F, trans, uFact);
490             //pdn 20.04.99 CTS22655 avoid of exceptions in case of empty loops
491             if(!Shape.IsNull())
492               B.Add(F,Shape);
493           }
494
495           // update the face
496           BRepTools::Update (F);
497           F.Orientable(Standard_True);
498           SetShapeResult(start,F);
499         }
500       }
501       else {
502         Message_Msg Msg1156("IGES_1156"); //Face : result of TransferTopoSurface is Null
503         Handle(TCollection_HAsciiString) label = GetModel()->StringLabel(surf);
504         Msg1156.Arg("surface");
505         Msg1156.Arg(label);
506         SendFail(start,Msg1156);
507         //  AddWarning(start,"Face : result of TransferTopoSurface is Null");
508         TopoDS_Shape Sh;
509         SetShapeResult(start,Sh);
510       }
511     }
512   }
513   
514   
515   TopoDS_Shape Sh = GetShapeResult(start);
516   if ( Sh.IsNull()) {
517     Message_Msg Msg1156("IGES_1156"); //the Face is a Null object.
518     Handle(TCollection_HAsciiString) label = GetModel()->StringLabel(start);
519     Msg1156.Arg("face");
520     Msg1156.Arg(label);
521     SendFail(start,Msg1156);     
522     //    AddWarning (start, "the Face is a Null object.");
523   }
524   return Sh;
525 }
526
527
528 //=======================================================================
529 //function : TransferShell
530 //purpose  : 
531 //=======================================================================
532 TopoDS_Shape IGESToBRep_BRepEntity::TransferShell
533   (const Handle(IGESSolid_Shell)& start)
534 {
535   TopoDS_Shape res;
536
537   if (!HasShapeResult(start)) {
538     TopoDS_Shell S;
539     BRep_Builder B;
540     B.MakeShell(S);
541     Standard_Integer nbfaces = start->NbFaces();
542     if (nbfaces != 0) {
543       Standard_Boolean closed = Standard_True; //:39
544       Handle(Message_ProgressIndicator) progress = GetTransferProcess()->GetProgress();
545       if ( ! progress.IsNull() ) progress->SetScale ( "Face", 0, nbfaces, 1 );
546       for (Standard_Integer iface = 1; iface <= nbfaces; iface++) {
547         if ( ! progress.IsNull() ) { 
548           progress->Increment(); 
549           if ( progress->UserBreak() ) break; 
550         }
551         Handle(IGESSolid_Face) face = start->Face(iface);
552         Standard_Boolean orientation = start->Orientation(iface);
553         TopoDS_Shape Sh = TransferFace(face);
554         if ( Sh.IsNull() ) { //:39 by abv 15.12.97
555           
556           closed = Standard_False;
557           continue;
558         }
559         if (!orientation) Sh.Reverse();
560         B.Add(S,Sh);
561       }
562       if ( ! closed ) {
563         Message_Msg Msg1360("IGES_1360");
564         SendFail(start,Msg1360);
565         
566       }
567         //AddWarning ( start, "Shell is not closed" ); //:39
568       S.Closed ( closed ); //:39
569       S.Orientable(Standard_True);
570       SetShapeResult(start,S);
571     }
572     else {
573       Message_Msg Msg200("XSTEP_200"); //Number of Faces = 0
574       SendFail(start,Msg200);
575     }
576   }
577   
578   TopoDS_Shape Sh = GetShapeResult(start);
579   if ( Sh.IsNull()) {
580     Message_Msg Msg1156("IGES_1156"); //the Shell is a null object
581     Handle(TCollection_HAsciiString) label = GetModel()->StringLabel(start);
582     Msg1156.Arg("shell");
583     Msg1156.Arg(label);
584     SendFail(start,Msg1156); 
585   }
586     //AddWarning (start, "the Shell is a null object.");
587   res = Sh;
588   return res;
589 }
590
591
592 //=======================================================================
593 //function : TransferManifoldSolid
594 //purpose  : 
595 //=======================================================================
596 TopoDS_Shape IGESToBRep_BRepEntity::TransferManifoldSolid
597   (const Handle(IGESSolid_ManifoldSolid)& start)
598 {
599   TopoDS_Shape res;
600
601   if (!HasShapeResult(start)) {
602     TopoDS_Solid S;
603     BRep_Builder B;
604     B.MakeSolid(S);
605     Handle(IGESSolid_Shell) shell = start->Shell();
606     Standard_Boolean isoriented   = start->OrientationFlag();
607     Standard_Integer nbshell      = start->NbVoidShells();
608     TopoDS_Shape Sh = TransferShell(shell);
609     if (!Sh.IsNull()) {
610       if (Sh.ShapeType() == TopAbs_SHELL) {
611         TopoDS_Shell Shell = TopoDS::Shell(Sh);
612         if (!isoriented) Shell.Reverse();
613         B.Add(S,Shell);
614       }
615
616       if (nbshell != 0) {
617         // progress scope without name, since usually we have single shell in solid
618         Message_ProgressSentry PS ( GetTransferProcess()->GetProgress(), 0, 0, nbshell, 1 );
619         for (Standard_Integer ishell=1; ishell<= nbshell && PS.More(); ishell++, PS.Next()) {
620           Handle(IGESSolid_Shell) voidshell= start->VoidShell(ishell);
621 //        Standard_Boolean orientation = start->VoidOrientationFlag(ishell);
622           TopoDS_Shape aSh = TransferShell(voidshell);
623           if (!aSh.IsNull()) {
624             if (aSh.ShapeType() == TopAbs_SHELL) {
625               TopoDS_Shell Shell = TopoDS::Shell(aSh);
626               if (!isoriented) Shell.Reverse();
627               B.Add(S,Shell);
628             }
629           }
630           else {
631           //  AddWarning(start,"ManifoldSolid : one VoidShell is Null");
632             TopoDS_Shell Shell;
633             B.Add(S,Shell);
634           }
635         }    
636       }
637     }
638     SetShapeResult(start,S);
639   }
640
641   TopoDS_Shape Sh = GetShapeResult(start);
642   if ( Sh.IsNull()) {
643     Message_Msg Msg1156("IGES_1156"); //the ManifoldSolid is a null object.
644     Handle(TCollection_HAsciiString) label = GetModel()->StringLabel(start);
645     Msg1156.Arg("solid");
646     Msg1156.Arg(label);
647     SendFail(start,Msg1156);  
648   }
649  //   AddWarning (start, "the ManifoldSolid is a null object.");
650   res = Sh;
651   return res;
652 }