0025748: Parallel version of progress indicator
[occt.git] / src / XSControl / XSControl_Reader.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 // pdn 26.02.99 added initializing of compound in function OneShape
15 //:   gka 14.04.99: S4136: apply scaling
16
17 #include <BRep_Builder.hxx>
18 #include <IFSelect_Functions.hxx>
19 #include <Interface_Check.hxx>
20 #include <Interface_InterfaceModel.hxx>
21 #include <Interface_ShareFlags.hxx>
22 #include <Interface_Static.hxx>
23 #include <Message.hxx>
24 #include <Message_Messenger.hxx>
25 #include <Message_ProgressScope.hxx>
26 #include <ShapeExtend_Explorer.hxx>
27 #include <Standard_Transient.hxx>
28 #include <TopoDS_Compound.hxx>
29 #include <TopoDS_Shape.hxx>
30 #include <Transfer_Binder.hxx>
31 #include <Transfer_IteratorOfProcessForTransient.hxx>
32 #include <Transfer_TransientProcess.hxx>
33 #include <XSControl_Controller.hxx>
34 #include <XSControl_Reader.hxx>
35 #include <XSControl_TransferReader.hxx>
36 #include <XSControl_WorkSession.hxx>
37
38 //#include <ShapeCustom.hxx>
39 //#include <ShapeAlgo.hxx>
40 //#include <ShapeAlgo_AlgoContainer.hxx>
41 //=======================================================================
42 //function : XSControl_Reader
43 //purpose  : 
44 //=======================================================================
45 XSControl_Reader::XSControl_Reader ()
46 {
47   SetWS (new XSControl_WorkSession);
48 }
49
50
51 //=======================================================================
52 //function : XSControl_Reader
53 //purpose  : 
54 //=======================================================================
55
56 XSControl_Reader::XSControl_Reader (const Standard_CString norm)
57 {
58   SetNorm (norm);
59 }
60
61
62 //=======================================================================
63 //function : XSControl_Reader
64 //purpose  : 
65 //=======================================================================
66
67 XSControl_Reader::XSControl_Reader(const Handle(XSControl_WorkSession)& WS,
68                                    const Standard_Boolean scratch)
69 {
70   SetWS (WS,scratch);
71 }
72
73
74 //=======================================================================
75 //function : SetNorm
76 //purpose  : 
77 //=======================================================================
78
79 Standard_Boolean  XSControl_Reader::SetNorm (const Standard_CString norm)
80 {
81   if (thesession.IsNull()) SetWS (new XSControl_WorkSession);
82   Standard_Boolean stat = thesession->SelectNorm (norm);
83   if (stat) {
84     thesession->InitTransferReader(0);
85     thesession->InitTransferReader(4);
86   }
87   return stat;
88 }
89
90
91 //=======================================================================
92 //function : SetWS
93 //purpose  : 
94 //=======================================================================
95
96 void XSControl_Reader::SetWS(const Handle(XSControl_WorkSession)& WS,
97                              const Standard_Boolean scratch)
98 {
99   therootsta = Standard_False;
100   theroots.Clear();
101   thesession = WS;
102   //  Il doit y avoir un Controller ...  Sinon onverra plus tard (apres SetNorm)
103   if (thesession->NormAdaptor().IsNull()) return;
104   Handle(Interface_InterfaceModel) model = thesession->Model ();
105   if (scratch || model.IsNull())   model = thesession->NewModel ();
106   thesession->InitTransferReader(0);
107   thesession->InitTransferReader(4);
108 }
109
110
111 //=======================================================================
112 //function : WS
113 //purpose  : 
114 //=======================================================================
115
116 Handle(XSControl_WorkSession) XSControl_Reader::WS () const
117 {
118   return thesession;
119 }
120
121
122 //=======================================================================
123 //function : ReadFile
124 //purpose  : 
125 //=======================================================================
126
127 IFSelect_ReturnStatus  XSControl_Reader::ReadFile
128   (const Standard_CString filename)
129 {
130   IFSelect_ReturnStatus stat = thesession->ReadFile(filename);
131   thesession->InitTransferReader(4);
132   return stat;
133 }
134
135
136 Handle(Interface_InterfaceModel) XSControl_Reader::Model () const
137 {
138   return thesession->Model();
139 }
140
141
142 //=======================================================================
143 //function : GiveList
144 //purpose  : 
145 //=======================================================================
146
147 Handle(TColStd_HSequenceOfTransient)  XSControl_Reader::GiveList
148        (const Standard_CString first, const Standard_CString second)
149 {
150   if (first && first[0] != '\0') {
151     return thesession->GiveList (first,second);
152   }
153
154   Handle(TColStd_HSequenceOfTransient) list = new TColStd_HSequenceOfTransient();
155   Standard_Integer i,nbr = NbRootsForTransfer();
156   for (i = 1; i <= nbr; i ++) list->Append (RootForTransfer(i));
157   return list;
158 }
159
160
161 //=======================================================================
162 //function : GiveList
163 //purpose  : 
164 //=======================================================================
165
166 Handle(TColStd_HSequenceOfTransient)  XSControl_Reader::GiveList
167        (const Standard_CString first, const Handle(Standard_Transient)& list)
168 {
169   return thesession->GiveListFromList (first,list);
170 }
171
172
173 //=======================================================================
174 //function : NbRootsForTransfer
175 //purpose  : 
176 //=======================================================================
177
178 Standard_Integer  XSControl_Reader::NbRootsForTransfer ()
179 {
180   if (therootsta) return theroots.Length();
181   therootsta = Standard_True;
182   Interface_ShareFlags sf (thesession->Graph());
183   Standard_Integer i, nbr = sf.NbRoots();
184   for (i = 1; i <= nbr; i ++) {
185     //    on filtre les racines qu on sait transferer
186     Handle(Standard_Transient) start = sf.Root(i);
187     if (thesession->TransferReader()->Recognize(start)) theroots.Append(start);
188   }
189   return theroots.Length();
190 }
191
192
193 //=======================================================================
194 //function : RootForTransfer
195 //purpose  : 
196 //=======================================================================
197
198 Handle(Standard_Transient)  XSControl_Reader::RootForTransfer
199   (const Standard_Integer num)
200 {
201   Handle(Standard_Transient) voidroot;
202   Standard_Integer nbr = NbRootsForTransfer();
203   if (num < 1 || num > nbr) return voidroot;
204   return theroots.Value(num);
205 }
206
207
208 //  ####        TRANSFERT        ####
209
210
211 //=======================================================================
212 //function : TransferOneRoot
213 //purpose  : 
214 //=======================================================================
215
216 Standard_Boolean  XSControl_Reader::TransferOneRoot(const Standard_Integer num,
217                                                     const Message_ProgressRange& theProgress)
218 {
219   return TransferEntity (RootForTransfer (num), theProgress);
220 }
221
222
223 //=======================================================================
224 //function : TransferOne
225 //purpose  : 
226 //=======================================================================
227
228 Standard_Boolean  XSControl_Reader::TransferOne(const Standard_Integer num,
229                                                 const Message_ProgressRange& theProgress)
230 {
231   return TransferEntity (thesession->StartingEntity (num), theProgress);
232 }
233
234
235 //=======================================================================
236 //function : TransferEntity
237 //purpose  : 
238 //=======================================================================
239
240 Standard_Boolean  XSControl_Reader::TransferEntity
241   (const Handle(Standard_Transient)& start, const Message_ProgressRange& theProgress)
242 {
243   if (start.IsNull()) return Standard_False;
244   const Handle(XSControl_TransferReader) &TR = thesession->TransferReader();
245   TR->BeginTransfer();
246   if (TR->TransferOne (start, Standard_True, theProgress) == 0) return Standard_False;
247   TopoDS_Shape sh = TR->ShapeResult(start);
248   //ShapeExtend_Explorer STU;
249   //SMH May 00: allow empty shapes (STEP CAX-IF, external references)
250   //if (STU.ShapeType(sh,Standard_True) == TopAbs_SHAPE) return Standard_False;  // nulle-vide 
251   theshapes.Append(sh);
252   return Standard_True;
253 }
254
255
256 //=======================================================================
257 //function : TransferList
258 //purpose  : 
259 //=======================================================================
260
261 Standard_Integer  XSControl_Reader::TransferList
262   (const Handle(TColStd_HSequenceOfTransient)& list,
263    const Message_ProgressRange& theProgress)
264 {
265   if (list.IsNull()) return 0;
266   Standard_Integer nbt = 0;
267   Standard_Integer i, nb = list->Length();
268   const Handle(XSControl_TransferReader) &TR = thesession->TransferReader();
269   TR->BeginTransfer();
270   ClearShapes();
271   ShapeExtend_Explorer STU;
272   Message_ProgressScope PS(theProgress, NULL, nb);
273   for (i = 1; i <= nb && PS.More(); i++) {
274     Handle(Standard_Transient) start = list->Value(i);
275     if (TR->TransferOne (start, Standard_True, PS.Next()) == 0) continue;
276     TopoDS_Shape sh = TR->ShapeResult(start);
277     if (STU.ShapeType(sh,Standard_True) == TopAbs_SHAPE) continue;  // nulle-vide
278     theshapes.Append(sh);
279     nbt ++;
280   }
281   return nbt;
282 }
283
284
285 //=======================================================================
286 //function : TransferRoots
287 //purpose  : 
288 //=======================================================================
289
290 Standard_Integer  XSControl_Reader::TransferRoots (const Message_ProgressRange& theProgress)
291 {
292   NbRootsForTransfer();
293   Standard_Integer nbt = 0;
294   Standard_Integer i, nb = theroots.Length();
295   const Handle(XSControl_TransferReader) &TR = thesession->TransferReader();
296    
297   TR->BeginTransfer();
298   ClearShapes();
299   ShapeExtend_Explorer STU;
300   Message_ProgressScope PS (theProgress, "Root", nb);
301   for (i = 1; i <= nb && PS.More(); i ++) {
302     Handle(Standard_Transient) start = theroots.Value(i);
303     if (TR->TransferOne (start, Standard_True, PS.Next()) == 0) continue;
304     TopoDS_Shape sh = TR->ShapeResult(start);
305     if (STU.ShapeType(sh,Standard_True) == TopAbs_SHAPE) continue;  // nulle-vide
306     theshapes.Append(sh);
307     nbt ++;
308   }
309   return nbt;
310 }
311
312
313 //=======================================================================
314 //function : ClearShapes
315 //purpose  : 
316 //=======================================================================
317
318 void  XSControl_Reader::ClearShapes ()
319 {
320   theshapes.Clear();
321 }
322
323
324 //=======================================================================
325 //function : NbShapes
326 //purpose  : 
327 //=======================================================================
328
329 Standard_Integer  XSControl_Reader::NbShapes () const
330 {
331   return theshapes.Length();
332 }
333
334
335 //=======================================================================
336 //function : Shapes
337 //purpose  : 
338 //=======================================================================
339
340 TopTools_SequenceOfShape& XSControl_Reader::Shapes()
341 {
342   return theshapes;
343 }
344
345
346 //=======================================================================
347 //function : Shape
348 //purpose  : 
349 //=======================================================================
350
351 TopoDS_Shape  XSControl_Reader::Shape (const Standard_Integer num) const
352 {
353   return theshapes.Value(num);
354 }
355
356
357 //=======================================================================
358 //function : OneShape
359 //purpose  : 
360 //=======================================================================
361
362 TopoDS_Shape  XSControl_Reader::OneShape () const
363 {
364   TopoDS_Shape sh;
365   Standard_Integer i,nb = theshapes.Length();
366   if (nb == 0) return sh;
367   if (nb == 1) return theshapes.Value(1);
368   TopoDS_Compound C;
369   BRep_Builder B;
370   //pdn 26.02.99 testing S4133
371   B.MakeCompound(C);
372   for (i = 1; i <= nb; i ++)  B.Add (C,theshapes.Value(i));
373   return C;
374 }
375
376 //=======================================================================
377 //function : PrintCheckLoad
378 //purpose  :
379 //=======================================================================
380 void  XSControl_Reader::PrintCheckLoad (Standard_OStream& theStream,
381                                         const Standard_Boolean failsonly,
382                                         const IFSelect_PrintCount mode) const
383 {
384   thesession->PrintCheckList (theStream, thesession->ModelCheckList(),failsonly, mode);
385 }
386
387 //=======================================================================
388 //function : PrintCheckLoad
389 //purpose  :
390 //=======================================================================
391 void  XSControl_Reader::PrintCheckLoad (const Standard_Boolean failsonly,
392                                         const IFSelect_PrintCount mode) const
393 {
394   Message_Messenger::StreamBuffer aBuffer = Message::SendInfo();
395   PrintCheckLoad (aBuffer, failsonly, mode);
396 }
397
398 //=======================================================================
399 //function : PrintCheckTransfer
400 //purpose  :
401 //=======================================================================
402 void XSControl_Reader::PrintCheckTransfer(Standard_OStream& theStream,
403                                           const Standard_Boolean failsonly,
404                                           const IFSelect_PrintCount mode) const
405 {
406   thesession->PrintCheckList (theStream, thesession->TransferReader()->LastCheckList(), failsonly, mode);
407 }
408
409 //=======================================================================
410 //function : PrintCheckTransfer
411 //purpose  :
412 //=======================================================================
413 void XSControl_Reader::PrintCheckTransfer(const Standard_Boolean failsonly,
414                                           const IFSelect_PrintCount mode) const
415 {
416   Message_Messenger::StreamBuffer aBuffer = Message::SendInfo();
417   PrintCheckTransfer(aBuffer, failsonly, mode);
418 }
419
420 //=======================================================================
421 //function : PrintStatsTransfer
422 //purpose  :
423 //=======================================================================
424 void XSControl_Reader::PrintStatsTransfer (Standard_OStream& theStream,
425                                            const Standard_Integer what, 
426                                            const Standard_Integer mode) const
427 {
428   thesession->TransferReader()->PrintStats (theStream, what,mode);
429 }
430
431 //=======================================================================
432 //function : PrintStatsTransfer
433 //purpose  :
434 //=======================================================================
435 void XSControl_Reader::PrintStatsTransfer (const Standard_Integer what, 
436                                            const Standard_Integer mode) const
437 {
438   Message_Messenger::StreamBuffer aBuffer = Message::SendInfo();
439   PrintStatsTransfer (aBuffer, what, mode);
440 }
441
442 //=======================================================================
443 //function : GetStatsTransfer
444 //purpose  : 
445 //=======================================================================
446
447 void XSControl_Reader::GetStatsTransfer (const Handle(TColStd_HSequenceOfTransient)& list,
448                                          Standard_Integer& nbMapped,
449                                          Standard_Integer& nbWithResult,
450                                          Standard_Integer& nbWithFail) const
451 {
452   const Handle(Transfer_TransientProcess) &TP = thesession->TransferReader()->TransientProcess();
453   Transfer_IteratorOfProcessForTransient itrp(Standard_True);
454   itrp = TP->CompleteResult(Standard_True);
455   if(!list.IsNull()) itrp.Filter (list);
456   nbMapped = nbWithFail = nbWithResult = 0;
457   
458   for (itrp.Start(); itrp.More(); itrp.Next()) {
459     Handle(Transfer_Binder) binder = itrp.Value();
460     Handle(Standard_Transient) ent = itrp.Starting();
461     nbMapped++;
462     if (binder.IsNull())  nbWithFail++;
463     else
464       if(!binder->HasResult()) nbWithFail++;
465       else
466         {
467           Interface_CheckStatus cst = binder->Check()->Status();
468           if ((cst == Interface_CheckOK)||(cst == Interface_CheckWarning))
469             nbWithResult++;
470           else
471             nbWithFail++;
472         }
473   }
474 }
475