Integration of OCCT 6.5.0 from SVN
[occt.git] / src / XSControl / XSControl_Functions.cxx
1 #include <XSControl_Functions.ixx>
2
3 #include <XSControl.hxx>
4 #include <XSControl_Controller.hxx>
5 #include <IFSelect_Profile.hxx>
6 #include <IFSelect_Option.hxx>
7 #include <MoniTool_TypedValue.hxx>
8 #include <Interface_Static.hxx>
9 #include <TColStd_HSequenceOfAsciiString.hxx>
10
11 #include <XSControl_WorkSession.hxx>
12 #include <IFSelect_Act.hxx>
13 #include <IFSelect_SessionPilot.hxx>
14 #include <IFSelect_Functions.hxx>
15 #include <TCollection_HAsciiString.hxx>
16 #include <TColStd_HSequenceOfHAsciiString.hxx>
17
18 #include <Interface_InterfaceModel.hxx>
19 #include <Transfer_TransientProcess.hxx>
20 #include <Transfer_FinderProcess.hxx>
21 #include <Transfer_Binder.hxx>
22 #include <Interface_CheckIterator.hxx>
23 #include <IFSelect_CheckCounter.hxx>
24 #include <Transfer_TransferIterator.hxx>
25 #include <Transfer_IteratorOfProcessForTransient.hxx>
26
27 #include <Dico_IteratorOfDictionaryOfInteger.hxx>
28
29 //#include <TransferBRep_ShapeBinder.hxx>
30 //#include <TransferBRep_ShapeListBinder.hxx>
31 //#include <TransferBRep_ShapeMapper.hxx>
32 //#include <TransferBRep_OrientedShapeMapper.hxx>
33
34 #include <XSControl_TransferWriter.hxx>
35 #include <XSControl_TransferReader.hxx>
36 #include <TColStd_HSequenceOfTransient.hxx>
37 #include <Transfer_ResultFromModel.hxx>
38 #include <XSControl_SelectForTransfer.hxx>
39
40 #include <Interface_Macros.hxx>
41 #include <Message_Messenger.hxx>
42 #include <Message.hxx>
43
44 // #######################################################################
45 // ##                                                                   ##
46 // ##                                                                   ##
47 // ##                           FUNCTIONS                               ##
48 // ##                                                                   ##
49 // ##                                                                   ##
50 // #######################################################################
51
52
53 //=======================================================================
54 //function : xinit
55 //=======================================================================
56 static IFSelect_ReturnStatus XSControl_xinit(const Handle(IFSelect_SessionPilot)& pilot)
57 {
58   Standard_Integer argc = pilot->NbWords();
59   const Standard_CString arg1 = pilot->Arg(1);
60   //        ****    xinit        ****
61   if (argc > 1) return (XSControl::Session(pilot)->SelectNorm(arg1) ?
62                         IFSelect_RetDone : IFSelect_RetFail);
63   Handle(Message_Messenger) sout = Message::DefaultMessenger();
64   sout<<"Selected Norm:"<<XSControl::Session(pilot)->SelectedNorm()<<endl;
65   return IFSelect_RetVoid;
66 }
67
68
69 //=======================================================================
70 //function : xnorm
71 //=======================================================================
72 static IFSelect_ReturnStatus XSControl_xnorm(const Handle(IFSelect_SessionPilot)& pilot)
73 {
74   Standard_Integer argc = pilot->NbWords();
75   const Standard_CString arg1 = pilot->Arg(1);
76   //        ****    xnorm        ****
77   Handle(XSControl_WorkSession) WS = XSControl::Session(pilot);
78   Handle(XSControl_Controller) control = WS->NormAdaptor();
79   Handle(Message_Messenger) sout = Message::DefaultMessenger();
80   if (argc == 1)
81     sout<<"Current Norm. xnorm newnorm [profile] to change , xnorm ? for the list"<<endl;
82   else sout<<"Current Norm :"<<endl;
83   if (control.IsNull()) sout<<"no norm currently defined"<<endl;
84   else
85     sout<<"  Long  Name (complete) : "<<control->Name(Standard_False)<<endl
86       <<  "  Short name (resource) : "<<control->Name(Standard_True)<<endl;
87   if (argc == 1) return IFSelect_RetVoid;
88
89   if (arg1[0] == '?') {
90     sout<<"List of available norms"<<endl;
91     Standard_Integer i,nb;
92     Handle(TColStd_HSequenceOfHAsciiString) norms = XSControl_Controller::ListRecorded(-1);
93     nb = norms->Length();
94     sout<<"Short Proper Names (complete names) : "<<nb<<" :";
95     for (i = 1; i <= nb; i ++) sout<<"  "<<norms->Value(i)->ToCString();
96     sout<<endl;
97     norms = XSControl_Controller::ListRecorded(1);
98     nb = norms->Length();
99     sout<<"Long  Proper Names (resource names) : "<<nb<<" :";
100     for (i = 1; i <= nb; i ++) sout<<"  "<<norms->Value(i)->ToCString();
101     sout<<endl;
102     norms = XSControl_Controller::ListRecorded(0);
103     nb = norms->Length();
104     sout<<"All Norm Names (short, long and aliases) "<<nb<<" :";
105     for (i = 1; i <= nb; i ++) sout<<"  "<<norms->Value(i)->ToCString();
106     sout<<endl;
107     sout<<"To change, xnorm newnorm"<<endl;
108     return IFSelect_RetVoid;
109   }
110
111   control = XSControl_Controller::Recorded(arg1);
112   if (control.IsNull()) { sout<<" No norm named : "<<arg1<<endl; return IFSelect_RetError; }
113   else {
114     WS->SetController(control);
115     sout<<"new norm : "<<control->Name()<<endl;
116     if (argc > 2) {
117       const Standard_CString arg2 = pilot->Arg(2);
118       if (!control->Profile()->SetCurrent (arg2)) 
119         sout<<"profile could not be set to "<<arg2<<endl;
120     }
121     sout<<"current profile : "<<control->Profile()->Current()<<endl;
122
123     IFSelect_Activator::SetCurrentAlias (WS->SelectedNorm(Standard_True));
124     return IFSelect_RetDone;
125   }
126   return IFSelect_RetVoid;
127 }
128
129
130 //=======================================================================
131 //function : xprofile
132 //=======================================================================
133 static IFSelect_ReturnStatus XSControl_xprofile(const Handle(IFSelect_SessionPilot)& pilot)
134 {
135   Standard_Integer argc = pilot->NbWords();
136   const Standard_CString arg1 = pilot->Arg(1);
137   //        ****    xprofile        ****
138   Handle(XSControl_WorkSession) WS = XSControl::Session(pilot);
139   Handle(XSControl_Controller) control = WS->NormAdaptor();
140   if (control.IsNull()) return IFSelect_RetFail;
141   Handle(IFSelect_Profile) prof = control->Profile();
142   Handle(Message_Messenger) sout = Message::DefaultMessenger();
143   sout<<"Current Profile : "<<prof->Current().ToCString()<<endl;
144
145   if (argc < 2) {
146     sout<<"xprofile ?   for list of profile confs"<<endl
147       <<  "xprofile .   to apply the current profile (after editing)"<<endl
148       <<  "xprofile profname     to select one and apply it"<<endl
149       <<  "xprofile profname .   to record current profile as profname"<<endl
150       <<"  (in followings, profname may be replaced by  .  for current profile)"<<endl
151       <<  "xprofile profname ?   to list its definition"<<endl
152       <<  "xprofile profname -   to clear it completely"<<endl
153       <<  "xprofile profname optname casename to edit an option of it"<<endl
154       <<  "xprofile profname - optname  to clear an option from it"<<endl;
155     return IFSelect_RetVoid;
156   }
157
158   if (argc == 2) {
159     if (arg1[0] == '?') {
160       Handle(TColStd_HSequenceOfAsciiString) confs = prof->ConfList();
161       Standard_Integer i, nb = confs->Length();
162       sout<<"List of Available Profile Configurations : "<<nb<<" Items"<<endl;
163       for (i = 1; i <= nb; i ++) sout<<confs->Value(i).ToCString()<<endl;
164       return IFSelect_RetVoid;
165     } else if (arg1[0] == '.' && arg1[1] == '\0') {
166       if (!control->ApplyProfile(WS,".")) {
167         sout<<"Applying current profile has failed"<<endl;
168         return IFSelect_RetFail;
169       }
170       return IFSelect_RetDone;
171     } else {
172
173       //   Select a Profile
174       if (!control->ApplyProfile(WS,arg1)) {
175         sout<<"Setting "<<arg1<<" as current has failed"<<endl;
176         return IFSelect_RetFail;
177       }
178       sout<<"Setting "<<arg1<<" as current"<<endl;
179       return IFSelect_RetDone;
180     }
181   }
182
183   if (argc == 3) {
184     const Standard_CString arg2 = pilot->Arg(2);
185
186     //   List the definition of a profile
187     if (arg2[0] == '?') {
188       Handle(TColStd_HSequenceOfAsciiString) opts, cases;
189       prof->SwitchList (arg1,opts,cases);
190       Standard_Integer i,nb = opts->Length();
191       sout<<"Option  --  Case  --  ("<<nb<<" switches on configuration "<<arg1<<")"<<endl;
192       for (i = 1; i <= nb; i ++) {
193         sout<<opts->Value(i).ToCString()<<"     "<<cases->Value(i).ToCString()<<endl;
194       }
195       return IFSelect_RetVoid;
196
197       //   Clear a profile
198     } else if (arg2[0] == '-' && arg2[1] == '\0') {
199       if (!prof->ClearConf(arg1)) {
200         sout<<"Clearing profile "<<arg2<<" has failed"<<endl;
201         return IFSelect_RetFail;
202       }
203       return IFSelect_RetDone;
204
205       //    Merge Profile arg2 to arg1
206     } else {
207       if (!prof->HasConf (arg1)) prof->AddConf (arg1);
208       if (!prof->AddFromOtherConf (arg1,arg2)) {
209         sout<<"Merging profile "<<arg2<<" to "<<arg1<<" has failed"<<endl;
210         return IFSelect_RetFail;
211       }
212       return IFSelect_RetDone;
213     }
214   }
215
216   //   Editing / Adding a switch in a profile
217   if (argc == 4) {
218     const Standard_CString arg2 = pilot->Arg(2);
219     const Standard_CString arg3 = pilot->Arg(3);
220
221     //    Removing a switch
222     if (arg2[0] == '-' && arg2[1] == '\0') {
223       if (!prof->RemoveSwitch (arg1,arg3)) {
224         sout<<"Removing switch on option "<<arg3<<" in profile "<<arg1<<" has failed"<<endl;
225         return IFSelect_RetFail;
226       }
227       sout<<"Edition of profile "<<arg1<<" done. To apply it : xprofile "<<arg1<<endl;
228       return IFSelect_RetDone;
229
230       //    Setting a switch
231     } else {
232       if (!prof->AddSwitch (arg1,arg2,arg3)) {
233         sout<<"Setting profile "<<arg1<<" for option "<<arg2<<" to case "<<arg3<<" has failed"<<endl;
234         return IFSelect_RetFail;
235       }
236       sout<<"Edition of profile "<<arg1<<" done. To apply it : xprofile "<<arg1<<endl;
237       return IFSelect_RetDone;
238     }
239   }
240
241   return IFSelect_RetVoid;
242 }
243
244
245 //=======================================================================
246 //function : xoption
247 //=======================================================================
248 static IFSelect_ReturnStatus XSControl_xoption(const Handle(IFSelect_SessionPilot)& pilot)
249 {
250   Standard_Integer argc = pilot->NbWords();
251   const Standard_CString arg1 = pilot->Arg(1);
252   const Standard_CString arg2 = pilot->Arg(2);
253   const Standard_CString arg3 = pilot->Arg(3);
254   //        ****    xoption        ****
255   Handle(XSControl_WorkSession) WS = XSControl::Session(pilot);
256   Handle(XSControl_Controller) control = WS->NormAdaptor();
257   if (control.IsNull()) return IFSelect_RetFail;
258   Handle(IFSelect_Profile) prof = control->Profile();
259   Handle(Message_Messenger) sout = Message::DefaultMessenger();
260   sout<<"Current Profile : "<<prof->Current().ToCString()<<endl;
261
262   if (argc < 2) {
263     sout<<"xoption anopt  : query an option"<<endl
264       <<  "xoption anopt newcase  : switch (basic definition)"
265         <<"  (but is superseded by current configuration)"<<endl
266         <<"xoption + optname [param]  : create an option on a parameter"<<endl
267           <<"  (param absent is taken  param=optname)"
268         <<"xoption anopt + casename [value] : add a case for a parameter"<<endl
269         <<"  (value absent is taken  value=casename)"<<endl;
270
271     Handle(TColStd_HSequenceOfAsciiString) optlist = prof->OptionList();
272     Standard_Integer iopt, nbopt = optlist->Length();
273     sout<<"Total : "<<nbopt<<" Options"<<endl;
274     for (iopt = 1; iopt <= nbopt; iopt ++) {
275       TCollection_AsciiString optname = optlist->Value(iopt);
276       Handle(IFSelect_Option) opt = prof->Option (optname.ToCString());
277       sout<<optname.ToCString()<<" : "<<opt->CaseName()<<endl;
278     }
279     return IFSelect_RetVoid;
280   }
281
282   //  xoption optname : description
283
284   if (argc == 2) {
285     Handle(IFSelect_Option) opt = prof->Option (arg1);
286     if (opt.IsNull()) { sout<<"Not a recorded Option : "<<arg1<<endl; return IFSelect_RetError; }
287
288     //  On va lister les valeurs admises
289     Handle(TColStd_HSequenceOfAsciiString) caselist = opt->ItemList();
290     Standard_Integer icase, nbcase = caselist->Length();
291     Handle(MoniTool_TypedValue) tv = opt->TypedValue();
292     if (tv.IsNull()) sout<<"Option : "<<arg1<<"  Type : "<<opt->Type()->Name();
293     else sout<<"Option : "<<arg1<<"  TypedValue.  Name : "<<tv->Name()<<endl<<"  Definition : "<<tv->Definition();
294
295     sout<<endl<<"  Current Case (basic) : "<<opt->CaseName()<<"  Total : "<<nbcase<<" Cases :"<<endl;
296     for (icase = 1; icase <= nbcase; icase ++) {
297       const TCollection_AsciiString& acase = caselist->Value(icase);
298       sout<<acase.ToCString();
299
300       //  Aliases ?
301       Handle(TColStd_HSequenceOfAsciiString) aliases = opt->Aliases(acase.ToCString());
302       Standard_Integer ial, nbal = (aliases.IsNull() ? 0 : aliases->Length());
303       if (nbal > 0) sout<<"  -  Alias:";
304       for (ial = 1; ial <= nbal; ial ++)  sout<<"  "<<aliases->Value(ial);
305       if (!tv.IsNull()) {
306         //  TypedValue : on peut afficher la valeur
307         Handle(TCollection_HAsciiString) str;
308         opt->Item (acase.ToCString(),str);
309         if (!str.IsNull()) sout<<" - Value:"<<str->ToCString();
310       }
311
312       sout<<endl;
313     }
314     return IFSelect_RetVoid;
315   }
316
317   //   xoption + optname [paramname]
318   if (argc >= 3 && arg1[0] == '+' && arg1[1] == '\0') {
319     Standard_CString parname = pilot->Arg(argc-1);
320     Handle(Interface_Static) param = Interface_Static::Static(parname);
321     if (param.IsNull()) { sout<<"No static parameter is named "<<parname<<endl;
322                           return IFSelect_RetError; }
323     Handle(IFSelect_Option) opt = new IFSelect_Option(param,arg2);
324     prof->AddOption (opt);
325     return IFSelect_RetDone;
326   }
327
328   //  xoption optname + case [val]
329   if (argc >= 4 && arg2[0] == '+' && arg2[1] == '\0') {
330     Handle(IFSelect_Option) opt = prof->Option (arg1);
331     if (opt.IsNull()) { sout<<"Not a recorded Option : "<<arg1<<endl; return IFSelect_RetError; }
332     Handle(MoniTool_TypedValue) tv = opt->TypedValue();
333     if (tv.IsNull()) { sout<<"Option not for a Parameter : "<<arg1<<endl; return IFSelect_RetError; }
334     Standard_CString valname = pilot->Arg(argc-1);
335     if (!opt->AddBasic (arg3,valname)) {
336       sout<<"Option "<<arg1<<" : not an allowed value : "<<valname<<endl;
337       return IFSelect_RetError;
338     }
339     return IFSelect_RetDone;
340   }
341
342   //  xoption optname newcase : edition
343   if (argc == 3) {
344     Handle(IFSelect_Option) opt = prof->Option (arg1);
345     if (opt.IsNull()) { sout<<"Not a recorded Option : "<<arg1<<endl; return IFSelect_RetError; }
346     if (!opt->Switch (arg2)) {
347       sout<<"Option : "<<arg1<<" , Not a suitable case : "<<arg2<<endl;
348       return IFSelect_RetFail;
349     }
350     sout<<"Option : "<<arg1<<" switched to case : "<<arg2<<endl;
351     return IFSelect_RetDone;
352   }
353
354
355   return IFSelect_RetVoid;
356 }
357
358
359 //=======================================================================
360 //function : newmodel
361 //=======================================================================
362 static IFSelect_ReturnStatus XSControl_newmodel(const Handle(IFSelect_SessionPilot)& pilot)
363 {
364   //        ****    newmodel        ****
365   if (!XSControl::Session(pilot)->NewModel().IsNull()) return IFSelect_RetDone;
366   Handle(Message_Messenger) sout = Message::DefaultMessenger();
367   sout<<"No new Model produced"<<endl;
368   return IFSelect_RetFail;
369 }
370
371
372 //=======================================================================
373 //function : tpclear
374 //=======================================================================
375 static IFSelect_ReturnStatus XSControl_tpclear(const Handle(IFSelect_SessionPilot)& pilot)
376 {
377   //        ****    tpclear/twclear        ****
378   Standard_Boolean modew = Standard_False;
379   if (pilot->Word(0).Value(2) == 'w') modew = Standard_True;
380   Handle(Transfer_FinderProcess)    FP = XSControl::Session(pilot)->MapWriter();
381   Handle(Transfer_TransientProcess) TP = XSControl::Session(pilot)->MapReader();
382   Handle(Message_Messenger) sout = Message::DefaultMessenger();
383   if ( modew) { if(!FP.IsNull()) FP->Clear(); else sout<<"No Transfer Write"<<endl; }
384   else        { if(!TP.IsNull()) TP->Clear(); else sout<<"No Transfer Read"<<endl; }
385   return IFSelect_RetDone;
386 }
387
388
389 //=======================================================================
390 //function : tpstat
391 //=======================================================================
392 static IFSelect_ReturnStatus XSControl_tpstat(const Handle(IFSelect_SessionPilot)& pilot)
393 {
394   Standard_Integer argc = pilot->NbWords();
395   const Standard_CString arg1 = pilot->Arg(1);
396   //const Standard_CString arg2 = pilot->Arg(2);
397   Handle(Transfer_TransientProcess) TP= XSControl::Session(pilot)->MapReader();
398   Handle(Message_Messenger) sout = Message::DefaultMessenger();
399   if (TP.IsNull()) { sout<<"No Transfer Read"<<endl; return IFSelect_RetError;}
400   //        ****    tpstat        ****
401
402   Standard_Integer mod1 = -1;
403   Standard_Integer mod2 = 0;
404   //  g : general  c : check (compte) C (liste)   f : fails(compte)  F (liste)
405   //  resultats racines :  n : n0s entites  s : status  b : binders
406   //    t : compte par type  r : compte par resultat   l : liste(type-resultat)
407   //   *n *s *b *t *r *l : idem sur tout
408   //   ?n  etc.. : idem sur resultats anormaux
409   //   ?  tout court pour help
410   
411   if (argc > 1) {
412     char a2 = arg1[1]; if (a2 == '\0') a2 = '!';
413     switch (arg1[0]) {
414     case 'g' : mod1 = 0; break;
415     case 'c' : mod1 = 4; mod2 = 4; break;
416     case 'C' : mod1 = 4; mod2 = 2; break;
417     case 'f' : mod1 = 5; mod2 = 4; break;
418     case 'F' : mod1 = 5; mod2 = 2; break;
419     case '*' : mod1 = 2; break;
420     case '?' : mod1 = 3; break;
421     default  : mod1 = 1; if (argc > 2) mod1 = 2; a2 = arg1[0]; break;
422     }
423     if (mod1 < 1 || mod1 > 3) a2 = '!';
424     switch (a2) {
425     case 'n' : mod2 = 0; break;
426     case 's' : mod2 = 1; break;
427     case 'b' : mod2 = 2; break;
428     case 't' : mod2 = 3; break;
429     case 'r' : mod2 = 4; break;
430     case 'l' : mod2 = 5; break;
431     case 'L' : mod2 = 6; break;
432     case '!' : break;
433     case '?' : mod1 = -1; break;
434     default  : mod1 = -2; break;
435     }
436   }
437   //  A present help eventuel
438   if (mod1 < -1) sout<<"Unknown Mode"<<endl;
439   if (mod1 < 0) {
440     sout<<"Modes available :\n"
441       <<"g : general    c : checks (count)  C (list)"<<"\n"
442       <<"               f : fails  (count)  F (list)"<<"\n"
443       <<"  n : numbers of transferred entities (on TRANSFER ROOTS)"<<"\n"
444       <<"  s : their status (type entity-result , presence checks)"<<"\n"
445       <<"  b : detail of binders"<<"\n"
446       <<"  t : count per entity type    r : per type/status result"<<"\n"
447       <<"  l : count per couple  type entity/result"<<"\n"
448       <<"  L : list  per couple  type entity/result"<<"\n"
449       <<"  *n  *s  *b  *t  *r  *l  *L : idem on ALL recorded items"<<"\n"
450       <<"  ?n  ?s  ?b  ?t ... : idem on abnormal items"<<"\n"
451       <<"  n select : n applied on a selection   idem for  s b t r l"<<endl;
452     if (mod1 < -1) return IFSelect_RetError;
453     return IFSelect_RetVoid;
454   }
455
456   if (!TP.IsNull()) {
457     sout<<"TransferRead :";
458     if (TP->Model() != pilot->Session()->Model()) sout<<"Model differs from the session";
459     Handle(TColStd_HSequenceOfTransient) list =
460       IFSelect_Functions::GiveList(pilot->Session(),pilot->CommandPart(2));
461     XSControl_TransferReader::PrintStatsOnList (TP,list,mod1,mod2);
462 //    TP->PrintStats (1,sout);
463   }
464   else sout<<"TransferRead : not defined"<<endl;
465   return IFSelect_RetVoid;
466 }
467
468
469 //=======================================================================
470 //function : tpent
471 //=======================================================================
472 static IFSelect_ReturnStatus XSControl_tpent(const Handle(IFSelect_SessionPilot)& pilot)
473 {
474   Standard_Integer argc = pilot->NbWords();
475   const Standard_CString arg1 = pilot->Arg(1);
476   Handle(Transfer_TransientProcess) TP= XSControl::Session(pilot)->MapReader();
477   //        ****    tpent        ****
478   Handle(Message_Messenger) sout = Message::DefaultMessenger();
479   if (TP.IsNull()) { sout<<"No Transfer Read"<<endl; return IFSelect_RetError;}
480   Handle(Interface_InterfaceModel) model = TP->Model();
481   if (model.IsNull())  return IFSelect_RetFail;
482
483   if (argc < 2) { sout<<"Give ENTITY NUMBER (IN MODEL TransferProcess)"<<endl; return IFSelect_RetError; }
484   Standard_Integer num = atoi(arg1);
485   if (num <= 0 || num > model->NbEntities()) { sout<<"Number not in [1 - "<<model->NbEntities()<<"]"<<endl; return IFSelect_RetError; }
486   Handle(Standard_Transient) ent = model->Value(num);
487   Standard_Integer index = TP->MapIndex  (ent);
488   if (index == 0) sout<<"Entity "<<num<<"  not recorded in transfer"<<endl;
489   else XSControl::Session(pilot)->PrintTransferStatus (index,Standard_False,sout);
490   return IFSelect_RetVoid;
491 }
492
493
494 //=======================================================================
495 //function : tpitem
496 //=======================================================================
497 static IFSelect_ReturnStatus XSControl_tpitem(const Handle(IFSelect_SessionPilot)& pilot)
498 {
499   Standard_Integer argc = pilot->NbWords();
500   const Standard_CString arg1 = pilot->Arg(1);
501 //        ****    tpitem/tproot/twitem/twroot        ****
502   Handle(Message_Messenger) sout = Message::DefaultMessenger();
503   if (argc < 2) { sout<<"Give ITEM NUMBER (in TransferProcess)"<<endl; return IFSelect_RetError; }
504   Standard_Integer num = atoi(arg1);
505   if (pilot->Word(0).Value(3) == 'r') num = -num;
506   Standard_Boolean modew = Standard_False;
507   if (pilot->Word(0).Value(2) == 'w') modew = Standard_True;
508   Handle(Transfer_Binder) binder;
509   Handle(Transfer_Finder) finder;
510   Handle(Standard_Transient) ent;
511   if (!XSControl::Session(pilot)->PrintTransferStatus(num,modew,sout))
512     sout<<" - Num="<<num<<" incorrect"<<endl;
513   return IFSelect_RetVoid;
514 }
515
516
517 //=======================================================================
518 //function : tpatr
519 //=======================================================================
520 static IFSelect_ReturnStatus XSControl_tpatr(const Handle(IFSelect_SessionPilot)& /*pilot*/)
521 {
522 /*skl
523   Standard_Integer argc = pilot->NbWords();
524   const Standard_CString arg1 = pilot->Arg(1);
525   Handle(XSControl_WorkSession) WS = XSControl::Session(pilot);
526   Handle(Transfer_TransientProcess) TP = WS->MapReader();
527
528   Handle(Message_Messenger) sout = Message::DefaultMessenger();
529   //  tpatr tout court : liste tous les attributs
530   //  tpatr nomatr     : sur cet attribut, liste les valeurs par entite
531
532   if (argc < 2) {
533     Handle(Dico_DictionaryOfInteger) list = TP->Attributes();
534     for (Dico_IteratorOfDictionaryOfInteger iter(list); iter.More(); iter.Next()) {
535       TCollection_AsciiString name = iter.Name();
536       Standard_Integer nbatr = iter.Value();
537       Interface_ParamType aty = TP->AttributeType (name.ToCString());
538       sout<<"Name : "<<name<<"  Count="<<nbatr<<"  Type : ";
539       switch (aty) {
540         case Interface_ParamInteger : sout<<"Integer";  break;
541         case Interface_ParamReal    : sout<<"Real";     break;
542         case Interface_ParamIdent   : sout<<"Object";   break;
543         case Interface_ParamText    : sout<<"String";   break;
544         default : sout<<"(Mixed)";
545       }
546       sout<<endl;
547     }
548   }
549
550   else {
551
552     Standard_Integer num , nb = 0;
553     sout<<"Attribute Name : "<<arg1<<endl;
554     for (num = TP->NextItemWithAttribute(arg1,0);  num > 0;
555          num = TP->NextItemWithAttribute(arg1,num)) {
556       nb ++;
557       sout<<"Item "<<num<<" , Entity ";
558       WS->Model()->Print(TP->Mapped(num),sout);
559       Handle(Transfer_Binder) bnd = TP->MapItem (num);
560       Interface_ParamType aty = bnd->AttributeType(arg1);
561       switch (aty) {
562         case Interface_ParamInteger : sout<<"  Integer="<<bnd->IntegerAttribute(arg1); break;
563         case Interface_ParamReal    : sout<<"  Real="<<bnd->RealAttribute(arg1); break;
564         case Interface_ParamIdent   : sout<<"  Object,Type:"<<bnd->Attribute(arg1)->DynamicType()->Name(); break;
565         case Interface_ParamText    : sout<<"  String="<<bnd->StringAttribute(arg1);
566         default : sout<<"(none)"; break;
567       }
568       sout<<endl;
569     }
570     sout<<"Attribute Name : "<<arg1<<" on "<<nb<<" Items"<<endl;
571   }
572 skl*/
573
574   return IFSelect_RetVoid;
575 }
576
577
578 //=======================================================================
579 //function : trecord
580 //=======================================================================
581 static IFSelect_ReturnStatus XSControl_trecord(const Handle(IFSelect_SessionPilot)& pilot)
582 {
583   Standard_Integer argc = pilot->NbWords();
584   const Standard_CString arg1 = pilot->Arg(1);
585   Handle(Transfer_TransientProcess) TP = XSControl::Session(pilot)->MapReader();
586 //        ****    trecord : TransferReader        ****
587   Standard_Boolean tous = (argc == 1);
588   Standard_Integer num = -1;
589   Handle(Interface_InterfaceModel)  mdl = XSControl::Session(pilot)->Model();
590   Handle(XSControl_TransferReader)  TR  = XSControl::Session(pilot)->TransferReader();
591   Handle(Standard_Transient) ent;
592   Handle(Message_Messenger) sout = Message::DefaultMessenger();
593   if (mdl.IsNull() || TR.IsNull() || TP.IsNull())
594     { sout<<" init not done"<<endl; return IFSelect_RetError; }
595   if (!tous) num = atoi(arg1);
596   //    Enregistrer les racines
597   if (tous) {
598     Standard_Integer nb = TP->NbRoots();
599     sout<<" Recording "<<nb<<" Roots"<<endl;
600     for (Standard_Integer i = 1; i <= nb; i ++) {
601       ent = TP->Root(i);
602       if (TR->RecordResult (ent)) sout<<" Root n0."<<i<<endl;
603       else sout<<" Root n0."<<i<<" not recorded"<<endl;
604     }
605   } else {
606     if (num < 1 ||  num > mdl->NbEntities()) sout<<"incorrect number:"<<num<<endl;
607     else if (TR->RecordResult(mdl->Value(num))) sout<<" Entity n0."<<num<<endl;
608     else sout<<" Entity n0."<<num<<" not recorded"<<endl;
609   }
610   return IFSelect_RetDone;
611 }
612
613
614 //=======================================================================
615 //function : trstat
616 //=======================================================================
617 static IFSelect_ReturnStatus XSControl_trstat(const Handle(IFSelect_SessionPilot)& pilot)
618 {
619   Standard_Integer argc = pilot->NbWords();
620   const Standard_CString arg1 = pilot->Arg(1);
621   Handle(Message_Messenger) sout = Message::DefaultMessenger();
622 //        ****    trstat : TransferReader        ****
623   Handle(XSControl_TransferReader)  TR  = XSControl::Session(pilot)->TransferReader();
624   if (TR.IsNull()) { sout<<" init not done"<<endl; return IFSelect_RetError; }
625   Handle(Interface_InterfaceModel)  mdl = TR->Model();
626   if (mdl.IsNull()) { sout<<" No model"<<endl; return IFSelect_RetError; }
627   sout<<" Statistics : FileName : "<<TR->FileName()<<endl;
628   if (argc == 1) {
629     // stats generales
630     TR->PrintStats(10,0);
631   } else {
632     // stats unitaires
633     Standard_Integer num = atoi(arg1);
634     if (num < 1 || num > mdl->NbEntities()) { sout<<" incorrect number:"<<arg1<<endl; return IFSelect_RetError; }
635     Handle(Standard_Transient) ent = mdl->Value(num);
636     if (!TR->IsRecorded(ent)) { sout<<" Entity "<<num<<" not recorded"<<endl; return IFSelect_RetError; }
637     Handle(Transfer_ResultFromModel) RM = TR->FinalResult(ent);
638     Handle(TColStd_HSequenceOfTransient) list = TR->CheckedList(ent);
639     Standard_Integer i, nb = list->Length();
640     if (nb > 0) sout<<" Entities implied by Check/Result :"<<nb<<" i.e.:";
641     for (i = 1; i <= nb; i ++) { sout<<"  "; mdl->Print(list->Value(i),sout); }
642     sout<<endl;
643     if (RM.IsNull()) { sout<<" no other info"<<endl; return IFSelect_RetVoid; }
644     Interface_CheckIterator chl = RM->CheckList(Standard_False);
645     pilot->Session()->PrintCheckList(chl,Standard_False,IFSelect_EntitiesByItem);
646   }
647   return IFSelect_RetVoid;
648 }
649
650
651 //=======================================================================
652 //function : trbegin
653 //=======================================================================
654 static IFSelect_ReturnStatus XSControl_trbegin(const Handle(IFSelect_SessionPilot)& pilot)
655 {
656   //        ****    trbegin : TransferReader        ****
657   Handle(XSControl_TransferReader)  TR  = XSControl::Session(pilot)->TransferReader();
658   Standard_Boolean init = TR.IsNull();
659   if (pilot->NbWords() > 1) { if (pilot->Arg(1)[0] == 'i') init = Standard_True; }
660   if (init) {
661     XSControl::Session(pilot)->InitTransferReader (0);
662     TR  = XSControl::Session(pilot)->TransferReader();
663     if (TR.IsNull()) { 
664       Handle(Message_Messenger) sout = Message::DefaultMessenger();
665       sout<<" init not done or failed"<<endl; 
666       return IFSelect_RetError; 
667     }
668   }
669   TR->BeginTransfer();
670   return IFSelect_RetDone;
671 }
672
673
674 //=======================================================================
675 //function : tread
676 //=======================================================================
677 static IFSelect_ReturnStatus XSControl_tread(const Handle(IFSelect_SessionPilot)& pilot)
678 {
679   Standard_Integer argc = pilot->NbWords();
680   //const Standard_CString arg1 = pilot->Arg(1);
681   //        ****    tread : TransferReader        ****
682   Handle(Message_Messenger) sout = Message::DefaultMessenger();
683   Handle(XSControl_TransferReader)  TR  = XSControl::Session(pilot)->TransferReader();
684   if (TR.IsNull()) { sout<<" init not done"<<endl; return IFSelect_RetError; }
685   Handle(Interface_InterfaceModel)  mdl = TR->Model();
686   if (mdl.IsNull()) { sout<<" No model"<<endl; return IFSelect_RetError; }
687   if (argc < 2) {
688 //      DeclareAndCast(IFSelect_Selection,sel,pilot->Session()->NamedItem("xst-model-roots"));
689     Handle(Standard_Transient) sel = pilot->Session()->NamedItem("xst-model-roots");
690     if (sel.IsNull()) { sout<<"Select Roots absent"<<endl; return IFSelect_RetError; }
691     Handle(TColStd_HSequenceOfTransient) list = pilot->Session()->GiveList(sel);
692     sout<<" Transferring all roots i.e. : "<<TR->TransferList(list)<<endl;
693   } else {
694     Handle(TColStd_HSequenceOfTransient) list =
695       IFSelect_Functions::GiveList(pilot->Session(),pilot->CommandPart(1));
696     sout<<" Transfer of "<<list->Length()<<" entities"<<endl;
697     Standard_Integer nb = TR->TransferList(list);
698     sout<<" Gives "<<nb<<" results"<<endl;
699   }
700   return IFSelect_RetDone;
701 }
702
703
704 //=======================================================================
705 //function : trtp
706 //=======================================================================
707 static IFSelect_ReturnStatus XSControl_trtp(const Handle(IFSelect_SessionPilot)& pilot)
708 {
709   //        ****    TReader -> TProcess         ****
710   Handle(XSControl_TransferReader)  TR  = XSControl::Session(pilot)->TransferReader();
711   Handle(Message_Messenger) sout = Message::DefaultMessenger();
712   if (TR.IsNull()) sout<<" No TransferReader"<<endl;
713   else if (TR->TransientProcess().IsNull()) sout<<" Transfer Reader without Process"<<endl;
714   ////else { XSDRAW::SetTransferProcess(TR->TransientProcess()); return IFSelect_RetDone; }
715   return IFSelect_RetVoid;
716 }
717
718
719 //=======================================================================
720 //function : tptr
721 //=======================================================================
722 static IFSelect_ReturnStatus XSControl_tptr(const Handle(IFSelect_SessionPilot)& pilot)
723 {
724   //        ****    TProcess -> TReader         ****
725   XSControl::Session(pilot)->InitTransferReader (3);
726   return IFSelect_RetDone;
727 }
728
729
730 //=======================================================================
731 //function : twmode
732 //=======================================================================
733 static IFSelect_ReturnStatus XSControl_twmode(const Handle(IFSelect_SessionPilot)& pilot)
734 {
735   Standard_Integer argc = pilot->NbWords();
736   const Standard_CString arg1 = pilot->Arg(1);
737   //        ****    twmode         ****
738   Handle(XSControl_TransferWriter) TW = XSControl::Session(pilot)->TransferWriter();
739   Handle(XSControl_Controller) control = XSControl::Session(pilot)->NormAdaptor();
740   Standard_Integer modemin,modemax;
741   Handle(Message_Messenger) sout = Message::DefaultMessenger();
742   if (control->ModeWriteBounds (modemin,modemax)) {
743     sout<<"Write Mode : allowed values  "<<modemin<<" to "<<modemax<<endl;
744     for (Standard_Integer modd = modemin; modd <= modemax; modd ++) {
745       sout<<modd<<"     : "<<control->ModeWriteHelp (modd)<<endl;;
746     }
747   }
748   sout<<"Write Mode : actual = "<<TW->TransferMode()<<endl;
749   if (argc <= 1) return IFSelect_RetVoid;
750   Standard_Integer mod = atoi(arg1);
751   sout<<"New value -> "<<arg1<<endl;
752   TW->SetTransferMode(mod);
753   if (!control->IsModeWrite (mod)) sout<<"Warning : this new value is not supported"<<endl;
754   return IFSelect_RetDone;
755 }
756
757
758 //=======================================================================
759 //function : twstat
760 //=======================================================================
761 static IFSelect_ReturnStatus XSControl_twstat(const Handle(IFSelect_SessionPilot)& pilot)
762 {
763   //Standard_Integer argc = pilot->NbWords();
764   //const Standard_CString arg1 = pilot->Arg(1);
765   //const Standard_CString arg2 = pilot->Arg(2);
766   Handle(Transfer_FinderProcess)    FP = XSControl::Session(pilot)->MapWriter();
767   //        ****    twstat        ****
768   //  Pour Write
769   Handle(Message_Messenger) sout = Message::DefaultMessenger();
770   if (!FP.IsNull()) {
771     sout<<"TransferWrite:";
772     //    XSControl_TransferWriter::PrintStatsProcess (FP,mod1,mod2);
773     FP->PrintStats (1,sout);
774   }
775   else sout<<"TransferWrite: not defined"<<endl;
776   return IFSelect_RetVoid;
777 }
778
779
780 //=======================================================================
781 //function : settransfert
782 //=======================================================================
783 static IFSelect_ReturnStatus XSControl_settransfert(const Handle(IFSelect_SessionPilot)& pilot)
784 {
785   //        ****    SelectForTransfer           ****
786   return pilot->RecordItem(new XSControl_SelectForTransfer(XSControl::Session(pilot)->TransferReader()));
787 }
788
789
790
791 static int initactor = 0;
792
793 //=======================================================================
794 //function : Init
795 //purpose  : 
796 //=======================================================================
797
798 void XSControl_Functions::Init ()
799 {
800   if (initactor) return;  initactor = 1;
801   IFSelect_Act::SetGroup("DE: General");
802
803   IFSelect_Act::AddFunc ("xinit","[norm:string to change norme] reinitialises according to the norm",XSControl_xinit);
804   IFSelect_Act::AddFunc ("xnorm","displays current norm   +norm : changes it",XSControl_xnorm);
805   IFSelect_Act::AddFunc ("xprofile","displays current profile   +prof : changes it",XSControl_xprofile);
806   IFSelect_Act::AddFunc ("xoption","lists options  +opt : lists cases  +case : changes current case",XSControl_xoption);
807
808   IFSelect_Act::AddFunc ("newmodel","produces a new empty model, for the session",XSControl_newmodel);
809
810   IFSelect_Act::AddFunc ("tpclear","Clears  TransferProcess (READ)",XSControl_tpclear);
811   IFSelect_Act::AddFunc ("twclear","Clears  TransferProcess (WRITE)",XSControl_tpclear);
812
813   IFSelect_Act::AddFunc ("tpstat","Statistics on TransferProcess (READ)",XSControl_tpstat);
814
815   IFSelect_Act::AddFunc ("tpent","[num:integer] Statistics on an entity of the model (READ)",XSControl_tpent);
816
817   IFSelect_Act::AddFunc ("tpitem","[num:integer] Statistics on ITEM of transfer (READ)"    ,XSControl_tpitem);
818   IFSelect_Act::AddFunc ("tproot","[num:integer] Statistics on a ROOT of transfert (READ)" ,XSControl_tpitem);
819   IFSelect_Act::AddFunc ("twitem","[num:integer] Statistics on an ITEM of transfer (WRITE)"   ,XSControl_tpitem);
820   IFSelect_Act::AddFunc ("twroot","[num:integer] Statistics on a ROOT of transfer (WRITE)",XSControl_tpitem);
821   IFSelect_Act::AddFunc ("tpatr","[name] List all Attributes, or values for a Name",XSControl_tpatr);
822
823   IFSelect_Act::AddFunc ("trecord","record : all root results; or num : for entity n0.num",XSControl_trecord);
824   IFSelect_Act::AddFunc ("trstat","general statistics;  or num : stats on entity n0 num",XSControl_trstat);
825   IFSelect_Act::AddFunc ("trbegin","begin-transfer-reader [init]",XSControl_trbegin);
826   IFSelect_Act::AddFunc ("tread","transfers all roots, or num|sel|sel num : entity list, by transfer-reader",XSControl_tread);
827
828   IFSelect_Act::AddFunc ("trtp","feeds commands tp... with results from tr...",XSControl_trtp);
829   IFSelect_Act::AddFunc ("tptr","feeds tr... from tp... (may be incomplete)",XSControl_tptr);
830
831   IFSelect_Act::AddFunc ("twmode","displays mode transfer write, + num  changes it",XSControl_twmode);
832   IFSelect_Act::AddFunc ("twstat","Statistics on TransferProcess (WRITE)",XSControl_twstat);
833
834   IFSelect_Act::AddFSet ("selecttransfer","selection (recognize from transfer actor)",XSControl_settransfert);
835 }