0031501: Foundation Classes, Message_Printer - remove theToPutEndl argument -- prepar...
[occt.git] / src / XSControl / XSControl_TransferReader.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 //:   abv 09.04.99: S4136: remove parameter lastpreci
15 // szv#11:CASCADE30:01Feb00 BRepBuilderAPI::Precision(p) removed
16
17 #include <BRepBuilderAPI.hxx>
18 #include <BRepLib.hxx>
19 #include <IFSelect_CheckCounter.hxx>
20 #include <IFSelect_SignatureList.hxx>
21 #include <Interface_Check.hxx>
22 #include <Interface_CheckIterator.hxx>
23 #include <Interface_EntityIterator.hxx>
24 #include <Interface_Graph.hxx>
25 #include <Interface_HGraph.hxx>
26 #include <Interface_InterfaceModel.hxx>
27 #include <Interface_Macros.hxx>
28 #include <Interface_MSG.hxx>
29 #include <Interface_SignLabel.hxx>
30 #include <Interface_Static.hxx>
31 #include <Message_Messenger.hxx>
32 #include <ShapeFix.hxx>
33 #include <Standard_ErrorHandler.hxx>
34 #include <Standard_Failure.hxx>
35 #include <Standard_Transient.hxx>
36 #include <Standard_Type.hxx>
37 #include <TCollection_HAsciiString.hxx>
38 #include <TColStd_HSequenceOfTransient.hxx>
39 #include <TopoDS_HShape.hxx>
40 #include <TopoDS_Shape.hxx>
41 #include <TopTools_MapOfShape.hxx>
42 #include <Transfer_ActorOfTransientProcess.hxx>
43 #include <Transfer_IteratorOfProcessForTransient.hxx>
44 #include <Transfer_ResultFromModel.hxx>
45 #include <Transfer_ResultFromTransient.hxx>
46 #include <Transfer_SimpleBinderOfTransient.hxx>
47 #include <Transfer_TransferOutput.hxx>
48 #include <Transfer_TransientProcess.hxx>
49 #include <TransferBRep.hxx>
50 #include <TransferBRep_BinderOfShape.hxx>
51 #include <TransferBRep_ShapeBinder.hxx>
52 #include <XSControl_Controller.hxx>
53 #include <XSControl_TransferReader.hxx>
54 #include <XSControl_Utils.hxx>
55 #include <Message.hxx>
56
57 #include <stdio.h>
58 IMPLEMENT_STANDARD_RTTIEXT(XSControl_TransferReader,Standard_Transient)
59
60 //=======================================================================
61 //function : SetController
62 //purpose  : 
63 //=======================================================================
64
65 void XSControl_TransferReader::SetController(const Handle(XSControl_Controller)& control)
66 {
67   myController = control;
68   myActor.Nullify();
69   Clear(-1);
70 }
71
72
73 //=======================================================================
74 //function : Actor
75 //purpose  : 
76 //=======================================================================
77
78 Handle(Transfer_ActorOfTransientProcess) XSControl_TransferReader::Actor ()
79 {
80   if ( myActor.IsNull() && !myController.IsNull() && !myModel.IsNull())
81     myActor = myController->ActorRead(myModel);
82   return myActor;
83 }
84
85
86 //=======================================================================
87 //function : SetModel
88 //purpose  : 
89 //=======================================================================
90
91 void XSControl_TransferReader::SetModel(const Handle(Interface_InterfaceModel)& model)
92 {
93   myModel = model;
94   if (!myTP.IsNull()) myTP->SetModel(model);
95 }
96
97
98 //=======================================================================
99 //function : SetGraph
100 //purpose  : 
101 //=======================================================================
102
103 void XSControl_TransferReader::SetGraph(const Handle(Interface_HGraph)& graph)
104 {
105   if (graph.IsNull())
106   {
107     myModel.Nullify();
108   }
109   else
110     myModel = graph->Graph().Model();
111
112   myGraph = graph;
113   
114   if (!myTP.IsNull()) myTP->SetGraph(graph);
115 }
116
117
118 //=======================================================================
119 //function : SetContext
120 //purpose  : 
121 //=======================================================================
122
123 void XSControl_TransferReader::SetContext(const Standard_CString name,
124                                           const Handle(Standard_Transient)& ctx)
125 {
126   myContext.Bind(name,ctx);
127 }
128
129
130 //=======================================================================
131 //function : GetContext
132 //purpose  : 
133 //=======================================================================
134
135 Standard_Boolean XSControl_TransferReader::GetContext
136   (const Standard_CString name, const Handle(Standard_Type)& type,
137    Handle(Standard_Transient)& ctx) const
138 {
139   if (myContext.IsEmpty()) return Standard_False;
140   if (!myContext.Find(name, ctx))
141     ctx.Nullify();
142   if (ctx.IsNull()) return Standard_False;
143   if (type.IsNull()) return Standard_True;
144   if (!ctx->IsKind(type)) ctx.Nullify();
145   return !ctx.IsNull();
146 }
147
148
149 //=======================================================================
150 //function : Clear
151 //purpose  : 
152 //=======================================================================
153
154 void XSControl_TransferReader::Clear (const Standard_Integer mode)
155 {
156   if (mode & 1) {
157     myResults.Clear();
158     myShapeResult.Nullify();
159   }
160   if (mode & 2) {
161     myModel.Nullify();
162     myGraph.Nullify();
163     myTP.Nullify();
164     myActor.Nullify();
165     myFileName.Clear();
166   }  
167 }
168
169
170 //  ########################################################
171 //  ###########            RESULTATS            ############
172
173
174 //=======================================================================
175 //function : RecordResult
176 //purpose  : 
177 //=======================================================================
178
179 Standard_Boolean XSControl_TransferReader::RecordResult
180   (const Handle(Standard_Transient)& ent)
181 {
182   if (myModel.IsNull() || myTP.IsNull()) return Standard_False;
183   Standard_Integer num = myModel->Number(ent);
184   if (num == 0) return Standard_False;
185   Handle(TCollection_HAsciiString) lab = myModel->StringLabel(ent);
186
187   Handle(Transfer_ResultFromModel) res = new Transfer_ResultFromModel;
188   res->Fill (myTP,ent);
189
190   //   Cas du resultat Shape : pour resultat principal, faire HShape ...
191   Handle(Transfer_Binder) binder = res->MainResult()->Binder();
192   DeclareAndCast(TransferBRep_ShapeBinder,shb,binder);
193   if (!shb.IsNull()) {
194     Handle(Transfer_SimpleBinderOfTransient) trb = new Transfer_SimpleBinderOfTransient;
195     trb->SetResult ( new TopoDS_HShape(shb->Result()) );
196     trb->Merge(binder);
197     res->MainResult()->SetBinder (trb);
198   }
199
200   res->SetFileName(myFileName.ToCString());
201   myResults.Bind(num,res);
202   return Standard_True;
203 }
204
205
206 //=======================================================================
207 //function : IsRecorded
208 //purpose  : 
209 //=======================================================================
210
211 Standard_Boolean XSControl_TransferReader::IsRecorded
212   (const Handle(Standard_Transient)& ent) const
213 {
214   if (myModel.IsNull()) return Standard_False;
215   Standard_Integer num = myModel->Number(ent);
216   if (num == 0) return Standard_False;
217   if(!myResults.IsBound(num)) return Standard_False;
218   return (myResults.Find(num)->DynamicType() == STANDARD_TYPE(Transfer_ResultFromModel) );
219 }
220
221
222 //=======================================================================
223 //function : HasResult
224 //purpose  : 
225 //=======================================================================
226
227 Standard_Boolean  XSControl_TransferReader::HasResult
228   (const Handle(Standard_Transient)& ent) const
229 {
230   if (myModel.IsNull()) return Standard_False;
231   Standard_Integer num = myModel->Number(ent);
232   if (num == 0) return Standard_False;
233   if(!myResults.IsBound(num)) return Standard_False;
234   DeclareAndCast(Transfer_ResultFromModel,fr,myResults.Find(num));
235   if (fr.IsNull()) return Standard_False;
236   return fr->HasResult();
237 }
238
239
240 //=======================================================================
241 //function : RecordedList
242 //purpose  : 
243 //=======================================================================
244
245 Handle(TColStd_HSequenceOfTransient) XSControl_TransferReader::RecordedList () const
246 {
247   Handle(TColStd_HSequenceOfTransient) li = new TColStd_HSequenceOfTransient();
248   if (myModel.IsNull())   return li;
249   Standard_Integer i, nb = myModel->NbEntities();
250   for (i = 1; i <= nb; i ++) {
251     if(myResults.IsBound(i))
252       if(!myResults.Find(i).IsNull()) li->Append (myModel->Value(i));
253   }
254   return li;
255 }
256
257
258 //=======================================================================
259 //function : Skip
260 //purpose  : 
261 //=======================================================================
262
263 Standard_Boolean XSControl_TransferReader::Skip(const Handle(Standard_Transient)& ent)
264 {
265   if (myModel.IsNull() || myTP.IsNull()) return Standard_False;
266   Standard_Integer num = myModel->Number(ent);
267   if (num == 0) return Standard_False;
268   myResults.Bind(num,ent);
269   return Standard_True;
270 }
271
272
273 //=======================================================================
274 //function : IsSkipped
275 //purpose  : 
276 //=======================================================================
277
278 Standard_Boolean XSControl_TransferReader::IsSkipped
279   (const Handle(Standard_Transient)& ent) const
280 {
281   if (myModel.IsNull()) return Standard_False;
282   Standard_Integer num = myModel->Number(ent);
283   if (num == 0) return Standard_False;
284   if(!myResults.IsBound(num)) return Standard_False;
285   return (myResults.Find(num)->DynamicType() != STANDARD_TYPE(Transfer_ResultFromModel) );
286 }
287
288
289 //=======================================================================
290 //function : IsMarked
291 //purpose  : 
292 //=======================================================================
293
294 Standard_Boolean XSControl_TransferReader::IsMarked
295   (const Handle(Standard_Transient)& ent) const
296 {
297   if (myModel.IsNull()) return Standard_False;
298   Standard_Integer num = myModel->Number(ent);
299   if (num == 0) return Standard_False;
300   if(!myResults.IsBound(num)) return Standard_False;
301   if (myResults.Find(num).IsNull()) return Standard_False;
302   return Standard_True;
303 }
304
305
306 //  #########    ACCES UN PEU PLUS FIN    #########
307
308
309 //=======================================================================
310 //function : FinalResult
311 //purpose  : 
312 //=======================================================================
313
314 Handle(Transfer_ResultFromModel) XSControl_TransferReader::FinalResult
315        (const Handle(Standard_Transient)& ent) const
316 {
317   Handle(Transfer_ResultFromModel) res;
318   if (myModel.IsNull())   return res;
319   Standard_Integer num = myModel->Number(ent);
320   if (num == 0) return res;
321   if(!myResults.IsBound(num)) return res;
322   res = GetCasted(Transfer_ResultFromModel,myResults.Find(num));
323   return res;
324 }
325
326
327 //=======================================================================
328 //function : FinalEntityLabel
329 //purpose  : 
330 //=======================================================================
331
332 Standard_CString XSControl_TransferReader::FinalEntityLabel
333   (const Handle(Standard_Transient)& ent) const
334 {
335   Handle(Transfer_ResultFromModel) resu = FinalResult (ent);
336   if (resu.IsNull()) return "";
337   return resu->MainLabel();
338 }
339
340
341 //=======================================================================
342 //function : FinalEntityNumber
343 //purpose  : 
344 //=======================================================================
345
346 Standard_Integer XSControl_TransferReader::FinalEntityNumber
347   (const Handle(Standard_Transient)& ent) const
348 {
349   Handle(Transfer_ResultFromModel) resu = FinalResult (ent);
350   if (resu.IsNull()) return 0;
351   return resu->MainNumber();
352 }
353
354
355 //=======================================================================
356 //function : ResultFromNumber
357 //purpose  : 
358 //=======================================================================
359
360 Handle(Transfer_ResultFromModel) XSControl_TransferReader::ResultFromNumber
361   (const Standard_Integer num) const
362 {
363   Handle(Transfer_ResultFromModel) res;
364   if ( num<1 || num>myModel->NbEntities() ) return res;
365   if(!myResults.IsBound(num)) return res;
366   res = GetCasted(Transfer_ResultFromModel,myResults.Find(num));
367   return res;
368 }
369
370
371 //=======================================================================
372 //function : TransientResult
373 //purpose  : 
374 //=======================================================================
375
376 Handle(Standard_Transient) XSControl_TransferReader::TransientResult
377        (const Handle(Standard_Transient)& ent) const
378 {
379   Handle(Standard_Transient) tres;
380   Handle(Transfer_ResultFromModel) res = FinalResult(ent);
381   if (res.IsNull()) return tres;
382   Handle(Transfer_ResultFromTransient) mres = res->MainResult();
383   if (mres.IsNull()) return tres;
384   DeclareAndCast(Transfer_SimpleBinderOfTransient,bnd,mres->Binder());
385   if (bnd.IsNull()) return tres;
386   if (!bnd->HasResult()) return tres;
387   return bnd->Result();
388 }
389
390
391 //=======================================================================
392 //function : ShapeResult
393 //purpose  : 
394 //=======================================================================
395
396 TopoDS_Shape XSControl_TransferReader::ShapeResult
397   (const Handle(Standard_Transient)& ent) const
398 {
399   TopoDS_Shape tres;    // DOIT RESTER NULL
400   Handle(Transfer_ResultFromModel) res = FinalResult(ent);
401   if (res.IsNull()) return tres;
402   Handle(Transfer_ResultFromTransient) mres = res->MainResult();
403   if (mres.IsNull()) return tres;
404   XSControl_Utils xu;
405   TopoDS_Shape sh = xu.BinderShape (mres->Binder());
406
407 //   Ouh la vilaine verrue
408   Standard_Real tolang = Interface_Static::RVal("read.encoderegularity.angle");
409   if (tolang <= 0 || sh.IsNull()) return sh;
410   ShapeFix::EncodeRegularity (sh,tolang);
411   return sh;
412 }
413
414
415 //=======================================================================
416 //function : ClearResult
417 //purpose  : 
418 //=======================================================================
419
420 Standard_Boolean XSControl_TransferReader::ClearResult
421   (const Handle(Standard_Transient)& ent, const Standard_Integer mode)
422 {
423   if (myModel.IsNull()) return Standard_False;
424   Standard_Integer num = myModel->Number(ent);
425   if (num == 0) return Standard_False;
426   if(!myResults.IsBound(num)) return Standard_False;
427   if (mode < 0)
428     myResults.ChangeFind(num).Nullify();
429   else {
430     DeclareAndCast(Transfer_ResultFromModel,resu,myResults.Find(num));
431     if (resu.IsNull()) return Standard_False;
432     resu->Strip (mode);
433   }
434   return Standard_True;
435 }
436
437
438 //  <<<< >>>>  ATTENTION, pas terrible : mieux vaudrait
439 //             faire une map inverse et la consulter
440 //             ou muscler ResultFromModel ...
441
442
443 //=======================================================================
444 //function : EntityFromResult
445 //purpose  : 
446 //=======================================================================
447
448 Handle(Standard_Transient) XSControl_TransferReader::EntityFromResult
449        (const Handle(Standard_Transient)& res, const Standard_Integer mode) const
450 {
451   Handle(Standard_Transient) nulh;
452   //  cas de la shape
453   XSControl_Utils xu;
454   TopoDS_Shape sh = xu.BinderShape (res);
455   if (!sh.IsNull()) return EntityFromShapeResult (sh,mode);
456
457   Handle(Transfer_Binder) abinder;
458   DeclareAndCast(Transfer_Binder,binder,res);
459   Standard_Integer i,j,nb;
460
461   if (mode == 0 || mode == 1) {
462     //  on regarde dans le TransientProcess (Roots ou tous Mappeds)
463     if (!myTP.IsNull()) {
464       nb = (mode == 0 ? myTP->NbRoots() : myTP->NbMapped());
465       for (j = 1; j <= nb; j ++) {
466         i = (mode == 0 ? myModel->Number (myTP->Root(j)) : j);
467         if (i == 0) continue;
468         abinder = myTP->MapItem(i);
469         if (abinder.IsNull()) continue;
470         if (!binder.IsNull()) {
471           if (binder == abinder) return myTP->Mapped(i);
472           continue;
473         }
474         DeclareAndCast(Transfer_SimpleBinderOfTransient,trb,abinder);
475         if (trb.IsNull()) continue;
476         if (trb->Result() == res) return myTP->Mapped(i);
477       }
478     }
479     return nulh;  // Null
480   }
481
482   //   Recherche dans myResults (racines)
483   //     2 : Main only  3 : Main + one sub;  4 : all
484   if (mode >= 2) {
485     nb = myModel->NbEntities();
486     for (i = 1; i <= nb; i ++) {
487       Handle(Transfer_ResultFromModel) rec = ResultFromNumber (i);
488       if (rec.IsNull()) return nulh;
489       Handle(TColStd_HSequenceOfTransient) list = rec->Results (mode-2);
490       Standard_Integer ir,nr = list->Length();
491       for (ir = 1; ir <= nr; ir ++) {
492         DeclareAndCast(Transfer_ResultFromTransient,rft,list->Value(ir));
493         if (rft.IsNull()) continue;
494         if (rft->Binder() == binder) return rft->Start();
495       }
496       
497     }
498   }
499
500   //  autres cas non encore implementes
501   return nulh;
502 }
503
504
505 //  <<<< >>>>  ATTENTION, encore moins bien que le precedent
506
507
508 //=======================================================================
509 //function : EntityFromShapeResult
510 //purpose  : 
511 //=======================================================================
512
513 Handle(Standard_Transient) XSControl_TransferReader::EntityFromShapeResult
514   (const TopoDS_Shape& res, const Standard_Integer mode) const
515 {
516   Handle(Standard_Transient) nulh, samesh, partner;
517   if (res.IsNull()) return nulh;
518   Standard_Integer i,j,nb;
519
520   XSControl_Utils xu;
521   if (mode == 0 || mode == 1 || mode == -1) {
522     //  on regarde dans le TransientProcess
523     if (!myTP.IsNull()) {
524       nb = (mode == 0 ? myTP->NbRoots() : myTP->NbMapped());
525       for (j = 1; j <= nb; j ++) {
526         i = (mode == 0 ? myModel->Number (myTP->Root(j)) : j);
527         if (i == 0) continue;
528         Handle(Standard_Transient) ent = myTP->Mapped(i);
529         TopoDS_Shape sh = TransferBRep::ShapeResult (myTP,ent);
530         if (!sh.IsNull()) {
531           if (sh == res) return ent;
532           // priorites moindre : Same (tjrs) ou Partner (mode < 0)
533           if (sh.IsSame(res)) samesh = ent;
534           if (mode == -1 && sh.IsPartner(res)) partner= ent;
535         }
536       }
537     }
538     //    Ici, pas trouve de vraie egalite. Priorites moindres : Same puis Partner
539     if (!samesh.IsNull())  return samesh;
540     if (!partner.IsNull()) return partner;  // calcule si mode = -1
541     return nulh;
542   }
543
544   //   Recherche dans myResults (racines)
545   //     2 : Main only  3 : Main + one sub;  4 : all
546   if (mode >= 2) {
547     nb = myModel->NbEntities();
548     for (i = 1; i <= nb; i ++) {
549       Handle(Transfer_ResultFromModel) rec = ResultFromNumber (i);
550       if (rec.IsNull()) continue;
551       
552       Handle(TColStd_HSequenceOfTransient) list = rec->Results (mode-2);
553       Standard_Integer ir,nr = list->Length();
554       for (ir = 1; ir <= nr; ir ++) {
555         DeclareAndCast(Transfer_ResultFromTransient,rft,list->Value(ir));
556         if (rft.IsNull()) continue;
557         TopoDS_Shape sh = xu.BinderShape (rft->Binder());
558         if (!sh.IsNull() && sh == res) return rft->Start();
559       }
560       
561     }
562   }
563
564   return nulh;
565 }
566
567
568 //=======================================================================
569 //function : EntitiesFromShapeList
570 //purpose  : 
571 //=======================================================================
572
573 Handle(TColStd_HSequenceOfTransient) XSControl_TransferReader::EntitiesFromShapeList
574        (const Handle(TopTools_HSequenceOfShape)& res,
575         const Standard_Integer mode) const
576 {
577   Handle(TColStd_HSequenceOfTransient) lt = new TColStd_HSequenceOfTransient();
578   if (res.IsNull()) return lt;
579   TopTools_MapOfShape shapes;
580
581   //  On convertit res en une map, pour test de presence rapide
582   Standard_Integer i, j, nb = res->Length();
583   if (nb == 0) return lt;
584   for (i = 1; i <= nb; i ++)  shapes.Add (res->Value(i));
585
586   //  A present, recherche et enregistrement
587
588   XSControl_Utils xu;
589   if (mode == 0 || mode == 1) {
590     //  on regarde dans le TransientProcess
591     if (!myTP.IsNull()) {
592       nb = (mode == 0 ? myTP->NbRoots() : myTP->NbMapped());
593       for (j = 1; j <= nb; j ++) {
594         i = (mode == 0 ? myModel->Number (myTP->Root(j)) : j);
595         if (i == 0) continue;
596         TopoDS_Shape sh = xu.BinderShape (myTP->MapItem(i));
597         if (!sh.IsNull() && shapes.Contains(sh)) {
598           lt->Append (myTP->Mapped(i));
599           j=nb; //skl (for looking for entities in checkbrep)
600         }
601       }
602     }
603   }
604
605   //   Recherche dans myResults (racines)
606   //     2 : Main only  3 : Main + one sub;  4 : all
607   if (mode >= 2) {
608     nb = myModel->NbEntities();
609     for (i = 1; i <= nb; i ++) {
610       Handle(Transfer_ResultFromModel) rec = ResultFromNumber (i);
611       if (rec.IsNull()) continue;
612       
613       Handle(TColStd_HSequenceOfTransient) list = rec->Results (mode-2);
614       Standard_Integer ir,nr = list->Length();
615       for (ir = 1; ir <= nr; ir ++) {
616         DeclareAndCast(Transfer_ResultFromTransient,rft,list->Value(i));
617         if (rft.IsNull()) continue;
618         TopoDS_Shape sh = xu.BinderShape (rft->Binder());
619         if (!sh.IsNull() && shapes.Contains(sh)) lt->Append (rft->Start());
620       }
621       
622     }
623   }
624
625   return lt;
626 }
627
628
629 //  <<<< >>>>  ATTENTION, level pas traite (utile ?) -> ResultFromModel
630
631
632 //=======================================================================
633 //function : CheckList
634 //purpose  : 
635 //=======================================================================
636
637 Interface_CheckIterator XSControl_TransferReader::CheckList
638   (const Handle(Standard_Transient)& ent, const Standard_Integer level) const
639 {
640   Interface_CheckIterator chl;
641   if (myModel.IsNull() || ent.IsNull()) return chl;
642   //  Check-List COMPLETE ... tout le Modele
643   if (ent == myModel) {
644     Standard_Integer i,nb = myModel->NbEntities();
645     for (i = 1; i <= nb; i ++) {
646       Handle(Transfer_ResultFromModel) rec = ResultFromNumber (i);
647       if (!rec.IsNull()) {
648         Interface_CheckIterator chiter  = rec->CheckList (Standard_False,2);
649         chl.Merge (chiter);
650       }
651     }
652   }
653   //  Check-List sur une LISTE ...
654   else if (ent->IsKind(STANDARD_TYPE(TColStd_HSequenceOfTransient))) {
655     DeclareAndCast(TColStd_HSequenceOfTransient,list,ent);
656     Standard_Integer i,nb = list->Length();
657     for (i = 1; i <= nb; i ++) {
658       Handle(Transfer_ResultFromModel) rec = FinalResult (list->Value(i));
659       if (!rec.IsNull()) {
660         Interface_CheckIterator chiter = rec->CheckList (Standard_False,level);
661         chl.Merge (chiter);
662       }
663     }
664   }
665
666   //  sinon, Check-List sur une entite : Last ou FinalResult
667   else if (level < 0) {
668     if (myTP.IsNull()) return chl;
669     chl.Add (myTP->Check(ent),myModel->Number(ent));
670   } else {
671     Handle(Transfer_ResultFromModel) rec = FinalResult (ent);
672     if (rec.IsNull()) return chl;
673     chl = rec->CheckList(Standard_False,level);  // manque level ...
674   }
675   if (ent == myModel) chl.SetName ("XSControl : CheckList complete Model");
676   else if (level <  0) chl.SetName ("XSControl : CheckList Last");
677   else if (level == 0) chl.SetName ("XSControl : CheckList Final Main");
678   else if (level == 1) chl.SetName ("XSControl : CheckList Final Main+Subs");
679   else if (level >= 2) chl.SetName ("XSControl : CheckList Final Complete");
680   return chl;
681 }
682
683
684 //=======================================================================
685 //function : HasChecks
686 //purpose  : 
687 //=======================================================================
688
689 Standard_Boolean XSControl_TransferReader::HasChecks
690   (const Handle(Standard_Transient)& ent, const Standard_Boolean failsonly) const
691 {
692   Handle(Transfer_ResultFromModel) resu = FinalResult (ent);
693   if (resu.IsNull()) return Standard_False;
694   Standard_Integer stat = resu->ComputeCheckStatus (Standard_False);
695   if (stat == 0) return Standard_False;
696   if (stat >  1) return Standard_True;
697   return (!failsonly);
698 }
699
700
701 //=======================================================================
702 //function : CheckedList
703 //purpose  : 
704 //=======================================================================
705
706 Handle(TColStd_HSequenceOfTransient)  XSControl_TransferReader::CheckedList
707        (const Handle(Standard_Transient)& ent,
708         const Interface_CheckStatus withcheck, const Standard_Boolean level) const
709 {
710   Handle(TColStd_HSequenceOfTransient) res = new TColStd_HSequenceOfTransient();
711   if (ent.IsNull()) return res;
712
713   if (ent == myModel) {
714     Standard_Integer i,nb = myModel->NbEntities();
715     for (i = 1; i <= nb; i ++) {
716       Handle(Transfer_ResultFromModel) rec = ResultFromNumber (i);
717       if (!rec.IsNull()) res->Append (rec->CheckedList(withcheck,level));
718     }
719   } else if (ent->IsKind(STANDARD_TYPE(TColStd_HSequenceOfTransient))) {
720     DeclareAndCast(TColStd_HSequenceOfTransient,list,ent);
721     Standard_Integer i,nb = list->Length();
722     for (i = 1; i <= nb; i ++) {
723       Handle(Transfer_ResultFromModel) rec = FinalResult (list->Value(i));
724       if (!rec.IsNull()) res->Append (rec->CheckedList(withcheck,level));
725     }
726   } else {
727     Handle(Transfer_ResultFromModel) rec = FinalResult (ent);
728     if (!rec.IsNull()) res = rec->CheckedList(withcheck,level);
729   }
730   return res;
731 }
732
733
734 //  ########################################################
735 //  ###########            TRANSFERT            ############
736 //  ########################################################
737
738
739 //=======================================================================
740 //function : BeginTransfer
741 //purpose  : 
742 //=======================================================================
743
744 Standard_Boolean XSControl_TransferReader::BeginTransfer ()
745 {
746   if (myModel.IsNull()) return Standard_False;
747   if (Actor().IsNull())  return Standard_False;
748   myShapeResult.Nullify();
749
750   if (myTP.IsNull()) myTP = new Transfer_TransientProcess
751     (myModel->NbEntities());
752
753   Handle(Transfer_ActorOfTransientProcess) actor;
754   myTP->SetActor (actor);        // -> RAZ
755   actor = Actor();
756   myTP->SetActor (actor);        // Set proprement dit
757   myTP->SetErrorHandle (Standard_True);
758   NCollection_DataMap<TCollection_AsciiString, Handle(Standard_Transient)>& aTPContext = myTP->Context();
759   aTPContext = myContext;
760   return Standard_True;
761 }
762
763
764 //=======================================================================
765 //function : Recognize
766 //purpose  : 
767 //=======================================================================
768
769 Standard_Boolean XSControl_TransferReader::Recognize
770   (const Handle(Standard_Transient)& ent)
771 {
772   if (myActor.IsNull()) return Standard_False;
773   return myActor->Recognize (ent);
774 }
775
776
777 //=======================================================================
778 //function : TransferOne
779 //purpose  : 
780 //=======================================================================
781
782 Standard_Integer XSControl_TransferReader::TransferOne
783   (const Handle(Standard_Transient)& ent, const Standard_Boolean rec)
784 {
785   if (myActor.IsNull() || myModel.IsNull()) return 0;
786
787   if (myTP.IsNull())  {  if (!BeginTransfer()) return 0;  }
788
789   Message_Messenger::StreamBuffer sout = myTP->Messenger()->SendInfo();
790   Standard_Integer level = myTP->TraceLevel();
791   
792
793   Transfer_TransferOutput TP (myTP,myModel);
794   if (myGraph.IsNull()) myTP->SetModel(myModel);
795   else                  myTP->SetGraph(myGraph);
796
797   //  pour le log-file
798   if (level > 1) {
799     Standard_Integer num = myModel->Number(ent);
800     Handle(TCollection_HAsciiString) lab = myModel->StringLabel(ent);
801     sout<<"\n*******************************************************************\n";
802     sout << "******           Transferring one Entity                     ******"<<std::endl;
803     if (!lab.IsNull())
804       sout<<"******    N0 in file : "<<Interface_MSG::Blanks(num,5)<<num
805           <<"      Ident : "<<lab->ToCString()
806           <<  Interface_MSG::Blanks(14 - lab->Length())<<"******\n";
807     sout << "******    Type : "<<myModel->TypeName(ent,Standard_False)
808         <<  Interface_MSG::Blanks((Standard_Integer) (44 - strlen(myModel->TypeName(ent,Standard_False))))
809         <<  "******";
810     sout<<"\n*******************************************************************\n";
811   }
812
813   //  seule difference entre TransferRoots et TransferOne
814   Standard_Integer res = 0;
815   Handle(Standard_Transient) obj = ent;
816   TP.Transfer (obj);
817   myTP->SetRoot (obj);
818
819   //  Resultat ...
820   Handle(Transfer_Binder) binder = myTP->Find (obj);
821   if (binder.IsNull()) return res;
822   if (rec) RecordResult (obj);
823
824   if (!binder->HasResult()) return res;
825   res ++;
826
827   return res;
828 }
829
830
831 //=======================================================================
832 //function : TransferList
833 //purpose  : 
834 //=======================================================================
835
836 Standard_Integer XSControl_TransferReader::TransferList
837   (const Handle(TColStd_HSequenceOfTransient)& list, const Standard_Boolean rec)
838 {
839   if (myActor.IsNull() || myModel.IsNull()) return 0;
840
841   if (myTP.IsNull())  {  if (!BeginTransfer()) return 0;  }
842
843   Standard_Integer level = myTP->TraceLevel();
844
845   Transfer_TransferOutput TP (myTP,myModel);
846   if (myGraph.IsNull()) myTP->SetModel(myModel);
847   else                  myTP->SetGraph(myGraph);
848
849   Standard_Integer i,nb = list->Length();
850
851   //   Pour le log-file
852   if (level > 0) {
853     Message_Messenger::StreamBuffer sout = myTP->Messenger()->SendInfo();
854     sout<<"\n*******************************************************************\n";
855     sout << "******           Transferring a list of "<<Interface_MSG::Blanks(nb,5)<<" Entities       ******"<<std::endl;
856     sout<<"\n*******************************************************************\n";
857
858     Handle(IFSelect_SignatureList) sl = new IFSelect_SignatureList;
859     for (i = 1; i <= nb; i ++)
860       sl->Add (list->Value(i), myModel->TypeName(list->Value(i),Standard_False));
861     sl->SetName ("Entities to Transfer");
862     sl->PrintCount (sout);
863     sout<<"\n*******************************************************************\n";
864   }
865
866   //  seule difference entre TransferRoots et TransferOne
867   Standard_Integer res = 0;
868   nb = list->Length();
869   Handle(Standard_Transient) obj;
870
871   for (i = 1; i <= nb; i ++) {
872     obj = list->Value(i);
873     TP.Transfer (obj);
874     myTP->SetRoot (obj);
875
876     //  Resultat ...
877     Handle(Transfer_Binder) binder = myTP->Find (obj);
878     if (binder.IsNull()) continue;
879     if (rec) RecordResult (obj);
880
881     if (!binder->HasResult()) continue;
882     res ++;
883   }
884   return res;
885 }
886
887
888 //  <<<< >>>>  passage Graph : judicieux ?
889
890
891 //=======================================================================
892 //function : TransferRoots
893 //purpose  : 
894 //=======================================================================
895
896 Standard_Integer XSControl_TransferReader::TransferRoots(const Interface_Graph& G)
897 {
898   if (myModel != G.Model()) return -1;
899   if (!BeginTransfer()) return -1;
900   Standard_Integer level = myTP->TraceLevel();
901
902   Transfer_TransferOutput TP (myTP,myModel);
903   if (myGraph.IsNull()) myTP->SetModel(myModel);
904   else                  myTP->SetGraph(myGraph);
905
906   //   Pour le log-file
907   if (level > 0) {
908     Interface_EntityIterator roots = G.RootEntities();
909     Standard_Integer nb = roots.NbEntities();
910     Message_Messenger::StreamBuffer sout = myTP->Messenger()->SendInfo();
911     sout<<"\n*******************************************************************\n";
912     sout << "******           Transferring the "<<Interface_MSG::Blanks(nb,5)<<" Root Entities        ******"<<std::endl;
913     sout<<"\n*******************************************************************\n";
914     Handle(IFSelect_SignatureList) sl = new IFSelect_SignatureList;
915     for (roots.Start(); roots.More(); roots.Next())
916       sl->Add (roots.Value(),myModel->TypeName(roots.Value(),Standard_False));
917     sl->SetName ("Entities to Transfer");
918     sl->PrintCount (sout);
919     sout<<"\n*******************************************************************\n";
920   }
921
922   TP.TransferRoots (G);
923
924   //  Les entites transferees sont notees "asmain"
925   Standard_Integer i,n = myTP->NbMapped();
926   for (i = 1; i <= n; i ++) {
927     Handle(Standard_Transient) ent = myTP->Mapped(i);
928     Handle(Transfer_Binder)    bnd = myTP->MapItem(i);
929     if (bnd.IsNull()) continue;
930     if (!bnd->HasResult()) continue;
931     RecordResult (ent);
932   }
933
934   //  Resultat ... on note soigneuseument les Shapes
935   myShapeResult = TransferBRep::Shapes (myTP,Standard_True);
936   // ????  Et ici, il faut alimenter Imagine ...
937   return myShapeResult->Length();
938 }
939
940
941 //=======================================================================
942 //function : TransferClear
943 //purpose  : 
944 //=======================================================================
945
946 void XSControl_TransferReader::TransferClear(const Handle(Standard_Transient)& ent,
947                                              const Standard_Integer level)
948 {
949   if (myTP.IsNull()) return;
950   if (ent == myModel) {  myTP->Clear();  return;  }
951
952   myTP->RemoveResult (ent,level);
953   ClearResult (ent,-1);
954  
955 }
956
957
958 //=======================================================================
959 //function : PrintStats
960 //purpose  : 
961 //=======================================================================
962
963 void XSControl_TransferReader::PrintStats (Standard_OStream& sout, 
964                                            const Standard_Integer what,
965                                            const Standard_Integer mode) const
966 {
967   //  A ameliorer ... !
968   sout<<"\n*******************************************************************\n";
969   sout << "******        Statistics on Transfer (Read)                  ******"<<std::endl;
970   sout<<"\n*******************************************************************\n";
971   if (what > 10)  {  sout<<" ***  Not yet implemented"<<std::endl;  return;  }
972   if (what < 10)  {
973     sout << "******        Data recorded on Last Transfer                 ******"<<std::endl;
974     PrintStatsProcess (myTP,what,mode);
975   }
976   //  reste  what = 10 : on liste les racines des final results
977   sout << "******        Final Results                                  ******"<<std::endl;
978   if (myModel.IsNull())  {  sout<<"****    Model unknown"<<std::endl;  return;  }
979   Handle(TColStd_HSequenceOfTransient) list = RecordedList();
980   Standard_Integer i, nb = list->Length();
981   Handle(IFSelect_SignatureList) counter;
982   if (mode > 2) counter = new IFSelect_SignatureList (mode == 6);
983   IFSelect_PrintCount pcm = IFSelect_CountByItem;
984   if (mode == 6) pcm = IFSelect_ListByItem;
985
986   sout<<"****    Nb Recorded : "<<nb<<" : entities n0s : ";
987   for (i = 1; i <= nb; i ++) {
988     Handle(Standard_Transient) ent = list->Value(i);
989     if (mode == 0)  {  sout<<"  "<<myModel->Number(ent); continue;  }
990     if (mode == 1 || mode == 2) {
991       sout<<"[ "<<Interface_MSG::Blanks (i,6)<<" ]:";
992       myModel->Print (ent, sout);
993       sout<<"  Type:"<<myModel->TypeName(ent,Standard_False);
994     }
995     if (mode >= 3 && mode <= 6) {
996       counter->Add (ent,myModel->TypeName(ent,Standard_False));
997     }
998   }
999   if (!counter.IsNull()) counter->PrintList (sout, myModel, pcm);
1000
1001   sout<<std::endl;
1002 }
1003
1004
1005 //  ########################################################
1006 //  ###########            TRANSFERT            ############
1007
1008
1009 //=======================================================================
1010 //function : LastCheckList
1011 //purpose  : 
1012 //=======================================================================
1013
1014 Interface_CheckIterator  XSControl_TransferReader::LastCheckList () const
1015 {
1016   Interface_CheckIterator chl;
1017   if (!myTP.IsNull()) chl = myTP->CheckList (Standard_False);
1018   return chl;
1019 }
1020
1021
1022 //=======================================================================
1023 //function : LastTransferList
1024 //purpose  : 
1025 //=======================================================================
1026
1027 Handle(TColStd_HSequenceOfTransient) XSControl_TransferReader::LastTransferList
1028        (const Standard_Boolean roots) const
1029 {
1030   Handle(TColStd_HSequenceOfTransient) li = new TColStd_HSequenceOfTransient();
1031   if (myTP.IsNull()) return li;
1032   Standard_Integer i,j,nb =
1033     (roots ? myTP->NbRoots() : myTP->NbMapped());
1034   for (j = 1; j <= nb; j ++) {
1035     i = (roots ? myModel->Number (myTP->Root(j)) : j);
1036     Handle(Transfer_Binder) bnd = myTP->MapItem(i);
1037     if (bnd.IsNull()) continue;
1038     if (!bnd->HasResult()) continue;
1039     li->Append (myTP->Mapped(i));
1040   }
1041   return li;
1042 }
1043
1044
1045 //=======================================================================
1046 //function : ShapeResultList
1047 //purpose  : 
1048 //=======================================================================
1049
1050 const Handle(TopTools_HSequenceOfShape) & XSControl_TransferReader::ShapeResultList
1051   (const Standard_Boolean rec)
1052 {
1053   if (!rec) {
1054     if (myShapeResult.IsNull()) myShapeResult = TransferBRep::Shapes (myTP,Standard_True);
1055     if (myShapeResult.IsNull()) myShapeResult = new TopTools_HSequenceOfShape();
1056   } else {
1057     if (myShapeResult.IsNull()) myShapeResult = new TopTools_HSequenceOfShape();
1058     if (myModel.IsNull()) return myShapeResult;
1059     Handle(TColStd_HSequenceOfTransient) li = RecordedList();
1060     myShapeResult = new TopTools_HSequenceOfShape();
1061     Standard_Integer i, nb = myModel->NbEntities();
1062     TopoDS_Shape sh;
1063     for (i = 1; i <= nb; i ++) {
1064       sh = ShapeResult (myModel->Value(i));
1065       if (!sh.IsNull()) myShapeResult->Append(sh);
1066     }
1067   }
1068   return myShapeResult;
1069 }
1070
1071
1072 //  ****    UTILITAIRE DE STATISTIQUES GENERALES
1073
1074 // BinderStatus retourne une valeur :
1075 // 0 Binder Null.   1 void  2 Warning seul  3 Fail seul
1076 // 11 Resultat OK. 12 Resultat+Warning. 13 Resultat+Fail
1077
1078 //=======================================================================
1079 //function : 
1080 //purpose  : 
1081 //=======================================================================
1082 static Standard_Integer BinderStatus (const Handle(Transfer_Binder)& binder, char* mess)
1083 {
1084   Standard_Integer stat = 0;
1085   mess[0] = '\0';
1086   if (binder.IsNull())  {  sprintf (mess,"(no data recorded)");  return 0;  }
1087   Interface_CheckStatus cst = binder->Check()->Status();
1088   if (cst == Interface_CheckOK) {
1089     stat = 11;
1090     if (binder->HasResult()) sprintf(mess,"%s",binder->ResultTypeName());
1091     else { sprintf(mess,"(no result)"); stat = 1; }
1092   } else if (cst == Interface_CheckWarning) {
1093     stat = 12;
1094     if (binder->HasResult()) sprintf(mess,"%s  (+ warning)",binder->ResultTypeName());
1095     else { sprintf(mess,"(warning)"); stat = 2; }
1096   } else if (cst == Interface_CheckFail) {
1097     stat = 13;
1098     if (binder->HasResult()) sprintf(mess,"%s  (+ FAIL)",binder->ResultTypeName());
1099     else { sprintf(mess,"(FAIL)"); stat = 3; }
1100   }
1101   return stat;
1102 }
1103
1104
1105 //=======================================================================
1106 //function : 
1107 //purpose  : 
1108 //=======================================================================
1109 static void PrintPercent(const Handle(Message_Messenger)& sout, const Standard_CString mess,
1110                          const Standard_Integer nb, const Standard_Integer nl)
1111 {
1112   if (nb <= 0 || nl == 0) return;
1113   Message_Messenger::StreamBuffer aSender = sout->SendInfo();
1114   aSender<<"******      "<<mess<<": ";
1115   if      (nb == nl)       aSender<<"100 %"<<std::endl;
1116   else if (nb*100/nl == 0) aSender<<"< 1 %"<<std::endl;
1117   else            aSender<<(nb*100/nl < 10 ? "  " : " ")<<nb*100/nl<<" %"<<std::endl;
1118 }
1119
1120
1121 //=======================================================================
1122 //function : PrintStatsProcess
1123 //purpose  : 
1124 //=======================================================================
1125
1126 void XSControl_TransferReader::PrintStatsProcess(const Handle(Transfer_TransientProcess)& TP,
1127                                                  const Standard_Integer what,
1128                                                  const Standard_Integer mode)
1129 {
1130   Handle(TColStd_HSequenceOfTransient) list;  // null
1131   XSControl_TransferReader::PrintStatsOnList (TP,list,what,mode);
1132 }
1133
1134
1135 //=======================================================================
1136 //function : PrintStatsOnList
1137 //purpose  : 
1138 //=======================================================================
1139
1140 void XSControl_TransferReader::PrintStatsOnList(const Handle(Transfer_TransientProcess)& TP,
1141                                                 const Handle(TColStd_HSequenceOfTransient)& list,
1142                                                 const Standard_Integer what,
1143                                                 const Standard_Integer mode)
1144 {
1145   Message_Messenger::StreamBuffer sout = TP->Messenger()->SendInfo();
1146
1147   char mess[250];
1148   if (TP.IsNull()) return;
1149   if (what == 0) {  TP->PrintStats(0,sout);  return;  }
1150
1151   sout<<"\n*******************************************************************\n";
1152   sout << "******        Statistics on Transfer Process (Read)          ******"<<std::endl;
1153   if (what == 1) sout << "******        Individual Transfers  (Roots)                  ******\n";
1154   if (what == 2) sout << "******        All recorded data about Transfer               ******\n";
1155   if (what == 3) sout << "******        Abnormal records                               ******\n";
1156   if (what == 1 || what == 2 || what == 3) {
1157     if (mode == 0) sout<<"******        (n0s of recorded entities)                     ******\n";
1158     if (mode == 1) sout<<"******        (per entity : type + result)                   ******\n";
1159     if (mode == 2) sout<<"******        (per entity : type + result/status)            ******\n";
1160     if (mode == 3) sout<<"******        (count per type of entity)                     ******\n";
1161     if (mode == 4) sout<<"******        (count per type of result)                     ******\n";
1162     if (mode == 5) sout<<"******   (count per couple entity-type / result-type/status) ******\n";
1163     if (mode == 6) sout<<"******   (list per couple entity-type / result-type/status)  ******\n";
1164   }
1165   if (what == 4) sout << "******        Check messages                                 ******\n";
1166   if (what == 5) sout << "******        Fail  messages                                 ******\n";
1167   sout<<"*******************************************************************\n";
1168
1169   //  Cas what = 1,2,3 : contenu du TP (binders)
1170
1171   Standard_Boolean nolist = list.IsNull();
1172   Handle(Interface_InterfaceModel) model = TP->Model();
1173   if (what >= 1 && what <= 3) {
1174
1175     Standard_Integer stat;
1176     Standard_Integer nbv = 0, nbw = 0, nbf = 0, nbr = 0, nbrw = 0, nbrf = 0, nbnr = 0, nbi = 0;
1177     Transfer_IteratorOfProcessForTransient itrp(Standard_True);
1178     if (what == 1) itrp = TP->RootResult(Standard_True);
1179     if (what == 2) itrp = TP->CompleteResult(Standard_True);
1180     if (what == 3) itrp = TP->AbnormalResult();
1181     Standard_Integer i = 0, nb = itrp.Number();
1182     if (!nolist) itrp.Filter (list);
1183     Standard_Integer nl = itrp.Number();    // apres filtrage
1184     Handle(IFSelect_SignatureList) counter;
1185     if (mode > 2) counter = new IFSelect_SignatureList (mode == 6);
1186     Standard_Boolean notrec = (!nolist && mode > 2);  // noter les "no record"
1187     IFSelect_PrintCount pcm = IFSelect_CountByItem;
1188     if (mode == 6) pcm = IFSelect_ListByItem;
1189
1190     sout  <<"****        Entities in Model   : "<<model->NbEntities()<<std::endl;
1191     sout  <<"****        Nb Items (Transfer) : "<<nb<<std::endl;
1192     if (!nolist)
1193       sout<<"****        Nb Items (Listed)   : "<<nl<<std::endl;
1194
1195     for (itrp.Start(); itrp.More(); itrp.Next()) {
1196       nbi ++;
1197       Handle(Transfer_Binder) binder = itrp.Value();
1198       Handle(Standard_Transient) ent = itrp.Starting();
1199       if (binder.IsNull())  {
1200         nbnr ++;
1201         if (notrec) counter->Add(ent,"(not recorded)");
1202         else if (mode == 1 || mode == 2) {
1203           sout<<"["<<Interface_MSG::Blanks (nbi,4)<<nbi<<" ]:";
1204           model->Print (ent, sout);
1205           sout<<"   "<<model->TypeName(ent,Standard_False)<<"  (not recorded)"<<std::endl;
1206           continue;
1207         }
1208       }
1209       if (mode == 0)  {  sout<<"  "<<model->Number(ent); continue;  }
1210       if (mode != 3) {
1211         stat = BinderStatus(binder,mess);
1212         // 0 Binder Null.   1 void  2 Warning seul  3 Fail seul
1213         // 11 Resultat OK. 12 Resultat+Warning. 13 Resultat+Fail
1214         if (stat ==  0 || stat == 1) nbv ++;
1215         if (stat ==  2) nbw ++;
1216         if (stat ==  3) nbf ++;
1217         if (stat == 11) nbr ++;
1218         if (stat == 12) nbrw ++;
1219         if (stat == 13) nbrf ++;
1220       }
1221
1222       //  mode : 0 list num;  1 : num+label + type + result (abrege);  2 : complet
1223       if (mode == 1 || mode == 2) {
1224         sout<<"["<<Interface_MSG::Blanks (i,4)<<i<<" ]:";
1225         model->Print (ent, sout);
1226         sout<<"   "<<model->TypeName(ent,Standard_False);
1227         sout<<" Result:"<<mess<<std::endl;
1228         if (mode == 1) continue;
1229
1230         const Handle(Interface_Check)& ch = binder->Check();
1231         Standard_Integer newi,newnbw = ch->NbWarnings(), newnbf = ch->NbFails();
1232
1233         if (newnbw > 0) {
1234           sout<<" - Warnings : "<<newnbw<<":\n";
1235           for (newi = 1; newi <= newnbw; newi ++) sout<<ch->CWarning(newi)<<std::endl;
1236         }
1237         if (newnbf > 0) {
1238           sout<<" - Fails : "<<newnbf<<":\n";
1239           for (newi = 1; newi <= newnbf; newi ++) sout<<ch->CFail(newi)<<std::endl;
1240         }
1241         continue;
1242       }
1243
1244       //  mode : 3, counts per type of starting entity (class type)
1245       //         4 : counts per result type and/or status
1246       //         5 : counts per couple (starting type / result type/status)
1247       //         6 : idem plus gives for each item, the list of numbers of
1248       //                  entities in the starting model
1249       if (mode >= 3 && mode <= 6) {
1250         //IFSelect_PrintCount newpcm = IFSelect_CountByItem;
1251         //if (mode == 6) newpcm = IFSelect_ListByItem;
1252         if (mode == 3) counter->Add (ent,model->TypeName(ent,Standard_False));
1253         if (mode == 4) counter->Add (ent,mess);
1254         if (mode >= 5) {
1255           TCollection_AsciiString mest (model->TypeName(ent,Standard_False));
1256           mest.AssignCat("      -> ");
1257           mest.AssignCat(mess);
1258           //sprintf(mest,"%s    -> %s",model->TypeName(ent,Standard_False),mess);
1259           counter->Add (ent,mest.ToCString());
1260         }
1261       }
1262
1263       //    Fin de l iteration
1264     }
1265     if (!counter.IsNull()) counter->PrintList (sout, model, pcm);
1266     else sout<<std::endl;
1267     //    Pourcentages
1268     if (mode != 3 && nbi > 0) {
1269       sout << "******        Percentages according Transfer Status          ******"<<std::endl;
1270       PrintPercent (TP->Messenger(),"Result          ",nbr+nbrw,nl);
1271       PrintPercent (TP->Messenger(),"Result + FAIL   ",nbrf,nl);
1272       PrintPercent (TP->Messenger(),"FAIL, no Result ",nbf,nl);
1273       PrintPercent (TP->Messenger(),"Just Warning    ",nbw,nl);
1274       PrintPercent (TP->Messenger(),"Nothing Recorded",nbnr,nl);
1275 /*      if (nbr+nbrw > 0)
1276         sout<<"******      Result          : "<< (nbr+nbrw)*100/nl<<" %"<<std::endl;
1277       if (nbrf > 0)
1278         sout<<"******      Result + FAIL   : "<< (nbrf)*100/nl<<" %"<<std::endl;
1279       if (nbf > 0)
1280         sout<<"******      FAIL, no Result : "<< (nbf)*100/nl<<" %"<<std::endl;
1281       if (nbw > 0)
1282         sout<<"******      Just Warning    : "<< (nbw)*100/nl<<" %"<<std::endl;
1283       if (nbnr > 0)
1284         sout<<"******      Nothing Recorded: "<< (nbnr)*100/nl<<" %"<<std::endl; */
1285     }
1286     return;
1287   }
1288
1289   //  Cas  what = 4,5 : check-list
1290
1291   if (what == 4 || what == 5) {
1292
1293     Interface_CheckIterator chl = TP->CheckList(Standard_False);
1294     chl.SetName("** TRANSFER READ CHECK **");
1295     if (mode == 0)
1296     {
1297       chl.Print (sout, model, (what == 5));
1298     }
1299     else {
1300       IFSelect_PrintCount pcm = IFSelect_CountByItem;
1301       if (mode == 2) pcm = IFSelect_ListByItem;
1302       Handle(IFSelect_CheckCounter) counter = new IFSelect_CheckCounter(Standard_True);
1303       counter->Analyse   (chl,model,Standard_True,(what == 5));
1304       counter->PrintList (sout, model, pcm);
1305     }
1306   }
1307
1308 }