0025748: Parallel version of progress indicator
[occt.git] / src / BRepToIGES / BRepToIGES_BREntity.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 //szv#4 S4163
18 //eap: Tue Aug 29 11:02:56 2000: Shape Processing moved to upper levels
19
20 #include <BRep_Builder.hxx>
21 #include <BRepToIGES_BREntity.hxx>
22 #include <BRepToIGES_BRShell.hxx>
23 #include <BRepToIGES_BRSolid.hxx>
24 #include <BRepToIGES_BRWire.hxx>
25 #include <Geom_Geometry.hxx>
26 #include <gp_Trsf.hxx>
27 #include <IGESData_IGESEntity.hxx>
28 #include <IGESData_IGESModel.hxx>
29 #include <Interface_Macros.hxx>
30 #include <Interface_Static.hxx>
31 #include <Standard_Transient.hxx>
32 #include <TopLoc_Location.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 #include <Transfer_FinderProcess.hxx>
44 #include <Transfer_SimpleBinderOfTransient.hxx>
45 #include <Transfer_TransientMapper.hxx>
46 #include <TransferBRep_OrientedShapeMapper.hxx>
47 #include <TransferBRep_ShapeMapper.hxx>
48
49 //#include <ShapeCustom.hxx>
50 char Name[100];
51
52 //=======================================================================
53 //function : BRepToIGES_BREntity
54 //purpose  : 
55 //=======================================================================
56
57 BRepToIGES_BREntity::BRepToIGES_BREntity()
58 : TheUnitFactor(1.0),
59   myConvSurface(Interface_Static::IVal("write.convertsurface.mode") != 0),
60   myPCurveMode (Interface_Static::IVal("write.surfacecurve.mode")   != 0),
61   TheMap       (new Transfer_FinderProcess())
62 {
63 }
64
65 //=======================================================================
66 //function : Init
67 //purpose  : 
68 //=======================================================================
69
70 void BRepToIGES_BREntity::Init()
71 {  
72   TheMap = new Transfer_FinderProcess();
73   TheUnitFactor = 1.;
74   myConvSurface = Interface_Static::IVal("write.convertsurface.mode") != 0;
75   myPCurveMode  = Interface_Static::IVal("write.surfacecurve.mode")   != 0;
76 }
77
78 //=======================================================================
79 //function : SetModel
80 //purpose  : 
81 //=======================================================================
82 void BRepToIGES_BREntity::SetModel(const Handle(IGESData_IGESModel)& model)
83 {  
84   TheModel = model;  
85   Standard_Real unitfactor = TheModel->GlobalSection().UnitValue();
86   if (unitfactor != 1.)
87     TheUnitFactor = unitfactor;
88 }
89
90
91 //=======================================================================
92 //function : GetModel
93 //purpose  : 
94 //=======================================================================
95 Handle(IGESData_IGESModel) BRepToIGES_BREntity::GetModel() const
96 { return TheModel; }
97
98
99 //=======================================================================
100 //function : GetUnit
101 //purpose  : 
102 //=======================================================================
103 Standard_Real BRepToIGES_BREntity::GetUnit() const
104 {
105   return TheUnitFactor;
106 }  
107
108
109 //=======================================================================
110 //function : SetTransferProcess
111 //purpose  : 
112 //=======================================================================
113 void BRepToIGES_BREntity::SetTransferProcess(const Handle(Transfer_FinderProcess)& TP)
114 {  TheMap = TP;  }
115
116
117 //=======================================================================
118 //function : GetTransferProcess
119 //purpose  : 
120 //=======================================================================
121 Handle(Transfer_FinderProcess) BRepToIGES_BREntity::GetTransferProcess() const
122 { return TheMap; }
123
124
125 //=======================================================================
126 //function : TransferShape
127 //purpose  : 
128 //=======================================================================
129 Handle(IGESData_IGESEntity) BRepToIGES_BREntity::TransferShape
130 (const TopoDS_Shape& start,
131  const Message_ProgressRange& theProgress)
132 {
133   Handle(IGESData_IGESEntity) res;
134 //  TopoDS_Shape theShape;
135   //Standard_Integer Nb = 1; //szv#4:S4163:12Mar99 not needed
136
137   if (start.IsNull()) return res;
138
139   if (start.ShapeType() == TopAbs_VERTEX) {
140     TopoDS_Vertex V = TopoDS::Vertex(start);
141     BRepToIGES_BRWire BW(*this);
142     BW.SetModel(GetModel());
143     res = BW.TransferVertex(V);
144   }  
145   else if (start.ShapeType() == TopAbs_EDGE) {
146     TopoDS_Edge E =  TopoDS::Edge(start);
147     BRepToIGES_BRWire BW(*this);
148     BW.SetModel(GetModel());
149     res = BW.TransferEdge(E, Standard_False);
150   }  
151   else if (start.ShapeType() == TopAbs_WIRE) {
152     TopoDS_Wire W =  TopoDS::Wire(start);
153     BRepToIGES_BRWire BW(*this);
154     BW.SetModel(GetModel());
155     res = BW.TransferWire(W);
156   }  
157   else { 
158     //    la fonction suivante force les surfaces indirectes en
159     //    surfaces directes (obligatoire dans IGES) 
160 //    theShape = ShapeCustom::DirectFaces(start);  
161     //sprintf(Name,"res_%d",Nb++);
162     //DBRep::Set(Name,theShape);
163
164     if (start.ShapeType() == TopAbs_FACE) {
165       TopoDS_Face F =  TopoDS::Face(start);
166       BRepToIGES_BRShell BS(*this);
167       BS.SetModel(GetModel());
168       res = BS.TransferFace(F, theProgress);
169     }  
170     else if (start.ShapeType() == TopAbs_SHELL) {
171       TopoDS_Shell S =  TopoDS::Shell(start);
172       BRepToIGES_BRShell BS(*this);
173       BS.SetModel(GetModel());
174       res = BS.TransferShell(S, theProgress);
175     }  
176     else if (start.ShapeType() == TopAbs_SOLID) {
177       TopoDS_Solid M =  TopoDS::Solid(start);
178       BRepToIGES_BRSolid BS(*this);
179       BS.SetModel(GetModel());
180       res = BS.TransferSolid(M, theProgress);
181     }  
182     else if (start.ShapeType() == TopAbs_COMPSOLID) {
183       TopoDS_CompSolid C =  TopoDS::CompSolid(start);
184       BRepToIGES_BRSolid BS(*this);
185       BS.SetModel(GetModel());
186       res = BS.TransferCompSolid(C, theProgress);
187     }  
188     else if (start.ShapeType() == TopAbs_COMPOUND) {
189       TopoDS_Compound C =  TopoDS::Compound(start);
190       BRepToIGES_BRSolid BS(*this);
191       BS.SetModel(GetModel());
192       res = BS.TransferCompound(C, theProgress);
193     }  
194     else {
195       // message d`erreur
196     }  
197   }
198
199   return res;
200 }
201
202
203 //=======================================================================
204 //function : AddFail
205 //purpose  : 
206 //=======================================================================
207
208 void BRepToIGES_BREntity::AddFail 
209   (const TopoDS_Shape& start,
210    const Standard_CString amess)
211 {
212   Handle(TransferBRep_ShapeMapper) Mapper = new TransferBRep_ShapeMapper(start);
213   TheMap->AddFail(Mapper, amess);
214 }
215
216
217 //=======================================================================
218 //function : AddWarning
219 //purpose  : 
220 //=======================================================================
221
222 void BRepToIGES_BREntity::AddWarning 
223   (const TopoDS_Shape& start,
224    const Standard_CString amess)
225 {
226   Handle(TransferBRep_ShapeMapper) Mapper = new TransferBRep_ShapeMapper(start);
227   TheMap->AddWarning(Mapper, amess);
228 }
229
230
231 //=======================================================================
232 //function : AddFail
233 //purpose  : 
234 //=======================================================================
235
236 void BRepToIGES_BREntity::AddFail 
237   (const Handle(Standard_Transient)& start,
238    const Standard_CString amess)
239 {
240   Handle(Transfer_TransientMapper) Mapper = new Transfer_TransientMapper(start);
241   TheMap->AddFail(Mapper, amess);
242 }
243
244
245 //=======================================================================
246 //function : AddWarning
247 //purpose  : 
248 //=======================================================================
249
250 void BRepToIGES_BREntity::AddWarning 
251   (const Handle(Standard_Transient)& start,
252    const Standard_CString amess)
253 {
254   Handle(Transfer_TransientMapper) Mapper = new Transfer_TransientMapper(start);
255   TheMap->AddWarning(Mapper, amess);
256 }
257
258
259 //=======================================================================
260 //function : HasShapeResult
261 //purpose  : 
262 //=======================================================================
263
264 Standard_Boolean BRepToIGES_BREntity::HasShapeResult 
265   (const TopoDS_Shape& start) const
266 {
267   Handle(TransferBRep_ShapeMapper) Mapper = new TransferBRep_ShapeMapper(start);
268   DeclareAndCast(Transfer_SimpleBinderOfTransient, binder, TheMap->Find(Mapper));
269   if (binder.IsNull()) return Standard_False;
270   return binder->HasResult();
271 }
272
273
274 //=======================================================================
275 //function : GetShapeResult
276 //purpose  : 
277 //=======================================================================
278
279 Handle(Standard_Transient) BRepToIGES_BREntity::GetShapeResult 
280   (const TopoDS_Shape& start) const
281 {
282   Handle(Standard_Transient) res;
283
284   Handle(TransferBRep_ShapeMapper) Mapper = new TransferBRep_ShapeMapper(start);
285   DeclareAndCast(Transfer_SimpleBinderOfTransient, binder, TheMap->Find(Mapper));
286   if (binder.IsNull()) return res;
287   if (binder->HasResult())
288     res = binder->Result();
289   return res;
290 }
291
292
293 //=======================================================================
294 //function : SetShapeResult
295 //purpose  : 
296 //=======================================================================
297
298 void BRepToIGES_BREntity::SetShapeResult 
299   ( const TopoDS_Shape& start,
300     const Handle(Standard_Transient)& result)
301 {
302   Handle(TransferBRep_ShapeMapper) Mapper = new TransferBRep_ShapeMapper(start);
303   Handle(Transfer_SimpleBinderOfTransient) binder = new Transfer_SimpleBinderOfTransient;
304   binder->SetResult(result);
305   TheMap->Bind(Mapper,binder);
306 }
307
308 //=======================================================================
309 //function : HasShapeResult
310 //purpose  : 
311 //=======================================================================
312
313 Standard_Boolean BRepToIGES_BREntity::HasShapeResult 
314   (const Handle(Standard_Transient)& start) const
315 {
316   Handle(Transfer_TransientMapper) Mapper = new Transfer_TransientMapper(start);
317   DeclareAndCast(Transfer_SimpleBinderOfTransient, binder, TheMap->Find(Mapper));
318   if (binder.IsNull()) return Standard_False;
319   return binder->HasResult();
320 }
321
322
323 //=======================================================================
324 //function : GetShapeResult
325 //purpose  : 
326 //=======================================================================
327
328 Handle(Standard_Transient) BRepToIGES_BREntity::GetShapeResult 
329   (const Handle(Standard_Transient)& start) const
330 {
331   Handle(Standard_Transient) res;
332
333   Handle(Transfer_TransientMapper) Mapper = new Transfer_TransientMapper(start);
334   DeclareAndCast(Transfer_SimpleBinderOfTransient, binder, TheMap->Find(Mapper));
335   if (binder.IsNull()) return res;
336   if (binder->HasResult())
337     res = binder->Result();
338   return res;
339 }
340
341
342 //=======================================================================
343 //function : SetShapeResult
344 //purpose  : 
345 //=======================================================================
346
347 void BRepToIGES_BREntity::SetShapeResult 
348   ( const Handle(Standard_Transient)& start,
349     const Handle(Standard_Transient)& result)
350 {
351   Handle(Transfer_TransientMapper) Mapper = new Transfer_TransientMapper(start);
352   Handle(Transfer_SimpleBinderOfTransient) binder = new Transfer_SimpleBinderOfTransient;
353   TheMap->Bind(Mapper,binder);
354   binder->SetResult(result);
355 }
356
357 //=======================================================================
358 //function : GetConvertSurfaceMode
359 //purpose  : 
360 //=======================================================================
361
362 Standard_Boolean BRepToIGES_BREntity::GetConvertSurfaceMode () const
363 {
364   return myConvSurface;
365 }
366             
367 //=======================================================================
368 //function : GetPCurveMode
369 //purpose  : 
370 //=======================================================================
371
372 Standard_Boolean BRepToIGES_BREntity::GetPCurveMode () const
373 {
374   return myPCurveMode;
375 }
376             
377 //=======================================================================
378 //function : ~BRepToIGES_BREntity
379 //purpose  : 
380 //=======================================================================
381
382 BRepToIGES_BREntity::~BRepToIGES_BREntity() 
383 {}