0024757: DRAW: Move commands fixshape, tolerance, and similar to MODELING
[occt.git] / src / IFSelect / IFSelect_Functions.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 //#58 rln 28.12.98 Versioning
15
16 #include <IFSelect_Functions.ixx>
17 #include <IFSelect_Act.hxx>
18 #include <IFSelect_SessionPilot.hxx>
19
20 #include <TCollection_AsciiString.hxx>
21 #include <TCollection_HAsciiString.hxx>
22 #include <IFSelect_SignType.hxx>
23 #include <IFSelect_SignatureList.hxx>
24 #include <IFSelect_IntParam.hxx>
25 #include <TColStd_HSequenceOfAsciiString.hxx>
26 #include <TColStd_HSequenceOfHAsciiString.hxx>
27 #include <TColStd_HSequenceOfTransient.hxx>
28 #include <TColStd_MapOfInteger.hxx>
29 #include <Interface_Static.hxx>
30 #include <Interface_EntityIterator.hxx>
31
32 #include <IFSelect_WorkSession.hxx>
33 #include <IFSelect_GeneralModifier.hxx>
34 #include <IFSelect_Modifier.hxx>
35 #include <IFSelect_WorkLibrary.hxx>
36 #include <Interface_InterfaceModel.hxx>
37 #include <IFSelect_SessionFile.hxx>
38 #include <Message_Messenger.hxx>
39 #include <Message.hxx>
40
41 #include <Interface_Category.hxx>
42 #include <Interface_CheckIterator.hxx>
43 #include <IFSelect_CheckCounter.hxx>
44 #include <IFSelect_SignCounter.hxx>
45 #include <IFSelect_GraphCounter.hxx>
46
47 #include <IFSelect_Dispatch.hxx>
48 #include <IFSelect_DispGlobal.hxx>
49 #include <IFSelect_DispPerOne.hxx>
50 #include <IFSelect_DispPerCount.hxx>
51 #include <IFSelect_DispPerFiles.hxx>
52 #include <IFSelect_DispPerSignature.hxx>
53 #include <IFSelect_Selection.hxx>
54 #include <IFSelect_SelectDeduct.hxx>
55 #include <IFSelect_SelectModelEntities.hxx>
56 #include <IFSelect_SelectModelRoots.hxx>
57 #include <IFSelect_SelectEntityNumber.hxx>
58 #include <IFSelect_SelectRoots.hxx>
59 #include <IFSelect_SelectDiff.hxx>
60 #include <IFSelect_SelectUnion.hxx>
61 #include <IFSelect_SelectIntersection.hxx>
62 #include <IFSelect_SelectShared.hxx>
63 #include <IFSelect_SelectRange.hxx>
64 #include <IFSelect_Signature.hxx>
65 #include <IFSelect_SelectSignature.hxx>
66 #include <IFSelect_SelectErrorEntities.hxx>
67 #include <IFSelect_SelectUnknownEntities.hxx>
68 #include <IFSelect_SelectIncorrectEntities.hxx>
69 #include <IFSelect_SelectSharing.hxx>
70 #include <IFSelect_SelectPointed.hxx>
71 #include <IFSelect_SelectSuite.hxx>
72 #include <IFSelect_ModifReorder.hxx>
73 #include <IFSelect_Editor.hxx>
74 #include <IFSelect_EditForm.hxx>
75 #include <IFSelect_ListEditor.hxx>
76
77 #include <Interface_Macros.hxx>
78 #include <Interface_Version.hxx>
79 #include <Interface_MSG.hxx>
80 #include <stdio.h>
81
82
83 //  Decomposition of a file name in its parts : prefix, root, suffix
84
85 static void SplitFileName
86   (const Standard_CString filename,
87    TCollection_AsciiString& prefix,
88    TCollection_AsciiString& fileroot,
89    TCollection_AsciiString& suffix)
90 {
91   Standard_Integer nomdeb, nomfin, nomlon;
92   TCollection_AsciiString resfile (filename);
93   nomlon = resfile.Length();
94   nomdeb = resfile.SearchFromEnd ("/");
95   if (nomdeb <= 0) nomdeb = resfile.SearchFromEnd("\\");  // pour NT
96   if (nomdeb <  0) nomdeb = 0;
97   nomfin = resfile.SearchFromEnd (".");
98   if (nomfin < nomdeb) nomfin = nomlon + 1;
99
100   if (nomdeb > 0) prefix = resfile.SubString (1,nomdeb);
101   fileroot = resfile.SubString(nomdeb+1,nomfin-1);
102   if (nomfin <= nomlon) suffix = resfile.SubString (nomfin,nomlon);
103 }
104
105
106
107 //  Functions definit un certain nombre de commandes
108 //  enregistrees dans le Dictionnaire de Activator (par des Act unitaires)
109 //  Les actions elles-memes sont regroupees en fin de fichier
110
111 //  Les definitions
112
113 static IFSelect_ReturnStatus funstatus
114   (const Handle(IFSelect_SessionPilot)& )
115 {
116 //        ****    Version & cie     ****
117   //#58 rln
118   Handle(Message_Messenger) sout = Message::DefaultMessenger();
119   sout<<"Processor Version : "<<XSTEP_PROCESSOR_VERSION<<endl;
120   sout<<"OL Version        : "<<XSTEP_SYSTEM_VERSION<<endl;
121   sout<<"Configuration     : "<<XSTEP_Config<<endl;
122   sout<<"UL Names          : "<<XSTEP_ULNames<<endl;
123   return IFSelect_RetVoid;
124 }
125
126 static IFSelect_ReturnStatus fun1
127   (const Handle(IFSelect_SessionPilot)& pilot)
128 {
129   Handle(IFSelect_WorkSession) WS = pilot->Session();
130 //        ****    ToggleHandler     ****
131   int hand = !WS->ErrorHandle();
132   Handle(Message_Messenger) sout = Message::DefaultMessenger();
133   if (hand) sout << " --  Mode Catch Error now Active"   <<endl;
134   else      sout << " --  Mode Catch Error now Inactive" <<endl;
135   WS->SetErrorHandle(hand);
136   return IFSelect_RetDone;
137 }
138
139 static IFSelect_ReturnStatus fun3
140   (const Handle(IFSelect_SessionPilot)& pilot)
141 {
142   Handle(IFSelect_WorkSession) WS = pilot->Session();
143   Standard_Integer argc = pilot->NbWords();
144   const Standard_CString arg1 = pilot->Arg(1);
145 //        ****    XRead / Load         ****
146   Handle(Message_Messenger) sout = Message::DefaultMessenger();
147   if (argc < 2) { sout<<"Read/Load : give file name !"<<endl; return IFSelect_RetError; }
148   if (WS->Protocol().IsNull()) { sout<<"Protocol not defined"<<endl; return IFSelect_RetError; }
149   if (WS->WorkLibrary().IsNull()) { sout<<"WorkLibrary not defined"<<endl; return IFSelect_RetError; }
150
151   IFSelect_ReturnStatus status = WS->ReadFile (arg1);
152 // status : 0 OK, 1 erreur lecture, 2 Fail(try/catch),
153 //          -1 fichier non trouve, -2 lecture faite mais resultat vide
154   switch (status) {
155     case IFSelect_RetVoid  : sout<<"file:"<<arg1<<" gives empty result"<<endl; break;
156     case IFSelect_RetError : sout<<"file:"<<arg1<<" could not be opened"<<endl; break;
157     case IFSelect_RetDone  : sout<<"file:"<<arg1<<" read"<<endl; break;
158     case IFSelect_RetFail  : sout<<"file:"<<arg1<<" : error while reading"<<endl; break;
159     case IFSelect_RetStop  : sout<<"file:"<<arg1<<" : EXCEPTION while reading"<<endl; break;
160     default : sout<<"file:"<<arg1<<" could not be read"<<endl; break;
161   }
162   if (status != IFSelect_RetDone) return status;
163 //      sout<<" - clearing list of already written files"<<endl;
164   WS->BeginSentFiles(Standard_True);
165   return status;
166 }
167
168 static IFSelect_ReturnStatus fun_whatfile
169   (const Handle(IFSelect_SessionPilot)& pilot)
170 {
171   TCollection_AsciiString whatcom = IFSelect_Activator::Alias ("whatfile");
172   if (whatcom.Length() > 0) return pilot->ExecuteAlias (whatcom);
173   Handle(Message_Messenger) sout = Message::DefaultMessenger();
174   sout<<"Load File : "<<pilot->Session()->LoadedFile()<<endl;
175   sout<<"No specific whatfile available"<<endl;
176   return IFSelect_RetVoid;
177 }
178
179 static IFSelect_ReturnStatus fun4
180   (const Handle(IFSelect_SessionPilot)& pilot)
181 {
182   Handle(IFSelect_WorkSession) WS = pilot->Session();
183   Standard_Integer argc = pilot->NbWords();
184   const Standard_CString arg1 = pilot->Arg(1);
185 //        ****    Write All         ****
186   Handle(Message_Messenger) sout = Message::DefaultMessenger();
187   if (argc < 2) { sout<<"Write All : give file name !"<<endl; return IFSelect_RetError; }
188   return WS->SendAll (arg1);
189 }
190
191 static IFSelect_ReturnStatus fun5
192   (const Handle(IFSelect_SessionPilot)& pilot)
193 {
194   Handle(IFSelect_WorkSession) WS = pilot->Session();
195   Standard_Integer argc = pilot->NbWords();
196   const Standard_CString arg1 = pilot->Arg(1);
197 //  const Standard_CString arg2 = pilot->Arg(2);
198 //        ****    Write Selected         ****
199   Handle(Message_Messenger) sout = Message::DefaultMessenger();
200   if (argc < 3) { sout<<"Write Selected : give file name + givelist !"<<endl; return IFSelect_RetError; }
201   Handle(TColStd_HSequenceOfTransient) result =
202     IFSelect_Functions::GiveList (WS,pilot->CommandPart( 2));
203   if (result.IsNull()) { sout<<"No entity selected"<<endl; return IFSelect_RetError; }
204   else sout<<"Nb Entities selected : "<<result->Length()<<endl;
205   Handle(IFSelect_SelectPointed) sp = new IFSelect_SelectPointed;
206   sp->SetList (result);
207   return WS->SendSelected (arg1,sp);
208 }
209
210 static IFSelect_ReturnStatus fun6
211   (const Handle(IFSelect_SessionPilot)& pilot)
212 {
213   Handle(IFSelect_WorkSession) WS = pilot->Session();
214   Standard_Integer argc = pilot->NbWords();
215   const Standard_CString arg1 = pilot->Arg(1);
216 //        ****    Write Entite(s)         ****
217   Handle(Message_Messenger) sout = Message::DefaultMessenger();
218   if (argc < 3) { sout<<"Write Entitie(s) : give file name + n0s entitie(s)!"<<endl; return IFSelect_RetError; }
219   int ko = 0;
220   Handle(IFSelect_SelectPointed) sp = new IFSelect_SelectPointed;
221   for (Standard_Integer ia = 2; ia < argc ; ia ++) {
222     Standard_Integer id = pilot->Number(pilot->Arg(ia));
223     if (id > 0) {
224       Handle(Standard_Transient) item = WS->StartingEntity(id);
225       if (sp->Add(item)) sout<<"Added:no."<<id<<endl;
226       else { sout<<" Fail Add n0."<<id<<endl; ko ++; }
227     }
228     else { sout<<"Not an entity number:"<<pilot->Arg(ia)<<endl; ko ++; }
229   }
230   if (ko > 0) { sout<<ko<<" bad arguments, abandon"<<endl; return IFSelect_RetError; }
231   return WS->SendSelected (arg1,sp);
232 }
233
234 static IFSelect_ReturnStatus fun7
235   (const Handle(IFSelect_SessionPilot)& pilot)
236 {
237   Handle(IFSelect_WorkSession) WS = pilot->Session();
238   Standard_Integer argc = pilot->NbWords();
239   const Standard_CString arg1 = pilot->Arg(1);
240 //        ****    Entity Label       ****
241   Handle(Message_Messenger) sout = Message::DefaultMessenger();
242   if (argc < 2) { sout<<"Give entity number"<<endl; return IFSelect_RetError; }
243   if (!WS->HasModel()) { sout<<"No loaded model, abandon"<<endl; return IFSelect_RetError; }
244   Standard_Integer nument = WS->NumberFromLabel (arg1);
245   if (nument <= 0 || nument > WS->NbStartingEntities())
246     { sout<<"Not a suitable number: "<<arg1<<endl;  return IFSelect_RetError; }
247   sout<<"N0."<<nument<<" ->Label in Model : ";
248   WS->Model()->PrintLabel(WS->StartingEntity(nument),sout);  
249   sout<<endl;
250   return IFSelect_RetVoid;
251 }
252
253 static IFSelect_ReturnStatus fun8
254   (const Handle(IFSelect_SessionPilot)& pilot)
255 {
256   Handle(IFSelect_WorkSession) WS = pilot->Session();
257   Standard_Integer argc = pilot->NbWords();
258   const Standard_CString arg1 = pilot->Arg(1);
259 //        ****    Entity Number      ****
260   Handle(Message_Messenger) sout = Message::DefaultMessenger();
261   if (argc < 2) { sout<<"Give label to search"<<endl; return IFSelect_RetError; }
262   if (!WS->HasModel()) { sout<<"No loaded model, abandon"<<endl; return IFSelect_RetError; }
263   Handle(Interface_InterfaceModel) model = WS->Model();
264   Standard_Integer i, cnt = 0;
265   Standard_Boolean exact = Standard_False;
266   sout<<" **  Search Entity Number for Label : "<<arg1<<endl;
267   for (i = model->NextNumberForLabel (arg1, 0, exact)  ; i != 0;
268        i = model->NextNumberForLabel (arg1, i, exact)) {
269     cnt ++;
270     sout<<" **  Found n0/id:"; model->Print (model->Value(i),sout); sout<<endl;
271   }
272   
273   if (cnt == 0) sout<<" **  No Match"<<endl;
274   else if (cnt == 1) sout<<" **  1 Match"<<endl;
275   else sout<<cnt<<" Matches"<<endl;
276   return IFSelect_RetVoid;
277 }
278
279 static IFSelect_ReturnStatus fun9
280   (const Handle(IFSelect_SessionPilot)& pilot)
281 {
282 //        ****    List Types         ****
283   Handle(IFSelect_WorkSession) WS = pilot->Session();
284   Handle(IFSelect_Signature) signtype = WS->SignType();
285   if (signtype.IsNull()) signtype = new IFSelect_SignType;
286   Handle(IFSelect_SignCounter) counter =
287     new IFSelect_SignCounter(signtype,Standard_False);
288   return pilot->ExecuteCounter (counter,1);
289 }
290
291 static IFSelect_ReturnStatus funcount
292   (const Handle(IFSelect_SessionPilot)& pilot)
293 {
294   Handle(IFSelect_WorkSession) WS = pilot->Session();
295   Standard_Integer argc = pilot->NbWords();
296   const Standard_CString arg0 = pilot->Arg(0);
297   const Standard_CString arg1 = pilot->Arg(1);
298   Standard_Boolean listmode = (arg0[0] == 'l');
299 //        ****    List Counter         ****
300
301   Handle(Message_Messenger) sout = Message::DefaultMessenger();
302   if (argc < 2) {
303     sout<<"Designer signature ou compteur, + facultatif selection + facultatif entite"<<endl;
304     sout<<" signature/compteur seul -> tout le modele"<<endl
305       <<  " sign/compteur + selection -> cette selection, evaluation normale"<<endl
306         <<" sign/compteur + sel + num -> cette selection evaluee sur entite n0 num"<<endl;
307     return IFSelect_RetError;
308   }
309   DeclareAndCast(IFSelect_SignCounter,counter,WS->NamedItem(arg1));
310   if (counter.IsNull()) {
311     DeclareAndCast(IFSelect_Signature,signa,WS->NamedItem(arg1));
312     if (!signa.IsNull()) counter = new IFSelect_SignCounter(signa,Standard_False,listmode);
313   }
314 //  Handle(IFSelect_Selection) sel;
315 //  Standard_Integer n3 = 0;  if (argc > 3) n3 = WS->NumberFromLabel(arg3);
316 //  if (argc > 2) sel = GetCasted(IFSelect_Selection,WS->NamedItem(arg2));
317 //  if (counter.IsNull() || (argc > 2 && n3 <= 0 && sel.IsNull()) ) {
318 //    sout<<"Nom:"<<arg1; if (argc > 2) sout<<" et/ou "<<arg2;
319 //    sout<<" incorrect (demande: compteur ou signature [selection])"<<endl;
320 //    return IFSelect_RetError;
321 //  }
322
323 //  Ajout : si Selection, on applique un GraphCounter
324 //   Et en ce cas, on peut en avoir plusieurs : la limite est le mot-cle "on"
325   Standard_Integer onflag = 0;
326   Standard_Integer i; // svv Jan11 2000 : porting on DEC
327   for (i = 2; i < argc; i ++) {
328     if (!strcmp (pilot->Arg(i),"on")) { onflag = i; break; }
329   }
330
331   Handle(IFSelect_Selection) sel = WS->GiveSelection(arg1);
332   DeclareAndCast(IFSelect_SelectDeduct,seld,sel);
333   if (!seld.IsNull()) {
334 //  Si onflag, faire une SelectSuite
335     if (onflag > 2) {
336       Handle(IFSelect_SelectSuite) suite = new IFSelect_SelectSuite;
337       for (i = 1; i < onflag; i ++) {
338         sel = WS->GiveSelection(pilot->Arg(i));
339         if (!suite->AddInput(sel)) {
340           sout<<"Incorrect definition for applied selection"<<endl;
341           return IFSelect_RetError;
342         }
343       }
344       seld = suite;
345     }
346
347     Handle(IFSelect_GraphCounter) gc = new IFSelect_GraphCounter(Standard_False,listmode);
348     gc->SetApplied (seld);
349     counter = gc;
350   }
351
352   if (counter.IsNull()) {
353     sout<<"Neither Counter nor Signature : "<<arg1<<endl;
354     return IFSelect_RetError;
355   }
356
357   if (onflag == 0) onflag = 1;
358   IFSelect_PrintCount pcm = IFSelect_ListByItem;
359   if (arg0[0] == 'c') pcm = IFSelect_CountByItem;
360   if (arg0[0] == 's') pcm = IFSelect_CountSummary;
361   return pilot->ExecuteCounter (counter,onflag+1, pcm);
362 }
363
364 static IFSelect_ReturnStatus funsigntype
365   (const Handle(IFSelect_SessionPilot)& pilot)
366 {
367   Handle(IFSelect_WorkSession) WS = pilot->Session();
368   Standard_Integer argc = pilot->NbWords();
369   const Standard_CString arg1 = pilot->Arg(1);
370 //        ****    Sign Type              ****
371   Handle(IFSelect_Signature) signtype = WS->SignType();
372   Handle(Message_Messenger) sout = Message::DefaultMessenger();
373   if (signtype.IsNull()) sout<<"signtype actually undefined"<<endl;
374   else {
375     Handle(TCollection_HAsciiString) str = WS->Name (signtype);
376     Standard_Integer id = WS->ItemIdent (signtype);
377     sout<<signtype->Label()<<endl;
378     if (str.IsNull()) {
379       if (id > 0) sout<<"signtype : item n0 "<<id<<endl;
380     } else {
381       sout<<"signtype : also named as "<<str->ToCString()<<endl;
382     }
383   }
384   if (argc < 2) sout<<"signtype newitem  to change, signtype . to clear"<<endl;
385   else {
386     if (arg1[0] == '.' && arg1[1] == '\0') {
387       signtype.Nullify();
388       sout<<"signtype now cleared"<<endl;
389     } else {
390       signtype = GetCasted(IFSelect_Signature,WS->NamedItem(arg1));
391       if (signtype.IsNull()) { sout<<"Not a Signature : "<<arg1<<endl; return IFSelect_RetError; }
392       else sout<<"signtype now set to "<<arg1<<endl;
393     }
394     WS->SetSignType(signtype);
395     return IFSelect_RetDone;
396   }
397   return IFSelect_RetVoid;
398 }
399
400 static IFSelect_ReturnStatus funsigncase
401   (const Handle(IFSelect_SessionPilot)& pilot)
402 {
403   Handle(IFSelect_WorkSession) WS = pilot->Session();
404   const Standard_CString arg1 = pilot->Arg(1);
405 //        ****    Sign Case              ****
406   Handle(IFSelect_Signature) signcase = GetCasted(IFSelect_Signature,WS->NamedItem(arg1));
407   Handle(Message_Messenger) sout = Message::DefaultMessenger();
408   if (signcase.IsNull()) sout<<"Not a Signature : "<<arg1<<endl;
409   else {
410     Standard_Boolean hasmin,hasmax;  Standard_Integer valmin,valmax;
411     if (signcase->IsIntCase(hasmin,valmin,hasmax,valmax)) {
412       sout<<"Signature "<<arg1<<" : Integer Case";
413       if (hasmin) sout<<" - Mini:"<<valmin;
414       if (hasmax) sout<<" - Maxi:"<<valmax;
415       sout<<endl;
416     }
417     Handle(TColStd_HSequenceOfAsciiString) caselist = signcase->CaseList();
418     if (caselist.IsNull()) sout<<"Signature "<<arg1<<" : no predefined case, see command  count "<<arg1<<endl;
419     else {
420       Standard_Integer i, nb = caselist->Length();
421       sout<<"Signature "<<arg1<<" : "<<nb<<" basic cases :"<<endl;
422       for (i = 1; i <= nb; i ++) sout<<"  "<<caselist->Value(i);
423       sout<<endl;
424     }
425   }
426   return IFSelect_RetVoid;
427 }
428
429
430 static IFSelect_ReturnStatus fun10
431   (const Handle(IFSelect_SessionPilot)& pilot)
432 {
433   Handle(IFSelect_WorkSession) WS = pilot->Session();
434   Standard_Integer argc = pilot->NbWords();
435   const Standard_CString arg1 = pilot->Arg(1);
436 //        ****    Entity Status          ****
437   Standard_Integer i,nb;
438   Handle(Message_Messenger) sout = Message::DefaultMessenger();
439   if (argc < 2) {
440     nb = Interface_Category::NbCategories();
441     sout<<" Categories defined :"<<nb<<" i.e. :\n";
442     for (i = 0; i <= nb; i ++)
443       sout<<"Cat."<<i<<"  : "<<Interface_Category::Name(i)<<"\n";
444     sout<<" On a given entity : give its number"<<endl;
445     return IFSelect_RetVoid;
446   }
447   Standard_Integer num = pilot->Number(arg1);
448   if (num <= 0 || num > WS->NbStartingEntities())
449     { sout<<"Not a suitable entity number : "<<arg1<<endl; return IFSelect_RetError; }
450   Handle(Standard_Transient) ent = WS->StartingEntity(num);
451   WS->PrintEntityStatus(ent,sout);
452   return IFSelect_RetVoid;
453 }
454
455 static IFSelect_ReturnStatus fun11
456   (const Handle(IFSelect_SessionPilot)& pilot)
457 {
458   Handle(IFSelect_WorkSession) WS = pilot->Session();
459 //  Standard_Integer argc = pilot->NbWords();
460   const Standard_CString arg1 = pilot->Arg(1);
461 //        ****    DumpModel (Data)  ****
462   Standard_Integer niv = 0;
463 //  char arg10 = arg1[0];
464 //  if (argc < 2) arg10 = '?';
465   Handle(Message_Messenger) sout = Message::DefaultMessenger();
466   switch (arg1[0]) {
467     case '?' :
468      sout<<"? for this help, else give a listing mode (first letter suffices) :\n"
469         <<" general    General Statistics\n roots    Roots\n"
470         <<" entities   All Entities\n"
471         <<" listfails  CheckList (fails)    per entity\n"
472         <<" messages   CheckList (complete) per entity\n"
473         <<" fails      CheckList (fails)    per message (counting)\n"
474         <<" check      CheckList (complete) per message (counting)\n"
475         <<" totalcheck CheckList (complete) per message (listing n0 ents)\n"
476         <<" FAILS      CheckList (fails)    per message (listing complete)\n"
477         <<" TOTALCHECK CheckList (complete) per message (listing complete)"<<endl;
478      return IFSelect_RetVoid;
479     case 'g' : niv = 0; break;
480     case 'r' : niv = 1; break;
481     case 'e' : niv = 2; break;
482     case 'l' : niv = 3; break;
483     case 'm' : niv = 4; break;
484     case 'c' : niv = 5; break;
485     case 't' : niv = 6; break;
486     case 'T' : niv = 7; break;
487     case 'f' : niv = 8; break;
488     case 'F' : niv =10; break;
489     default  : sout<<"Unknown Mode .  data tout court pour help"<<endl; return IFSelect_RetError;
490   }
491   WS->TraceDumpModel(niv);
492   return IFSelect_RetVoid;
493 }
494
495 static IFSelect_ReturnStatus fundumpent
496   (const Handle(IFSelect_SessionPilot)& pilot)
497 {
498   Handle(IFSelect_WorkSession) WS = pilot->Session();
499   Standard_Integer argc = pilot->NbWords();
500   Handle(IFSelect_WorkLibrary) WL = WS->WorkLibrary();
501   Standard_Integer levdef=0,levmax=10,level;
502   WL->DumpLevels (levdef,levmax);
503   Handle(Message_Messenger) sout = Message::DefaultMessenger();
504   if (argc < 2 || (argc == 2 && levmax < 0)) {
505     sout<<"Give n0 or id of entity";
506     if (levmax < 0) sout<<"  and dump level"<<endl;
507     else sout<<"  + optinal, dump level in [0 - "<<levmax<<"] , default = "<<levdef<<endl;
508     for (level = 0; level <= levmax; level ++) {
509       Standard_CString help = WL->DumpHelp (level);
510       if (help[0] != '\0') sout<<level<<" : "<<help<<endl;
511     }
512     return IFSelect_RetError;
513   }
514
515   const Standard_CString arg1 = pilot->Arg(1);
516   const Standard_CString arg2 = pilot->Arg(2);
517   Standard_Integer num = pilot->Number(arg1);
518   if (num == 0) return IFSelect_RetError;
519   level = levdef;
520   if (argc > 2) level = atoi(arg2);
521   Handle(Standard_Transient) ent = WS->StartingEntity(num);
522   if ( ent.IsNull() ) {
523     sout << "No entity with given id " << arg1 << " (" << num << ") is found in the current model" << endl;
524   }
525   else {
526     sout << "  --   DUMP  Entity n0 " << num << "  level " << level << endl;
527     WL->DumpEntity (WS->Model(),WS->Protocol(),ent,sout,level);
528
529     Interface_CheckIterator chl = WS->CheckOne (ent);
530     if (!chl.IsEmpty(Standard_False)) chl.Print(sout,WS->Model(),Standard_False);
531   }
532 //  sout << flush;
533
534   return IFSelect_RetVoid;
535 }
536
537 static IFSelect_ReturnStatus funsign
538   (const Handle(IFSelect_SessionPilot)& pilot)
539 {
540   Handle(IFSelect_WorkSession) WS = pilot->Session();
541   Standard_Integer argc = pilot->NbWords();
542   const Standard_CString arg1 = pilot->Arg(1);
543   const Standard_CString arg2 = pilot->Arg(2);
544   Handle(Message_Messenger) sout = Message::DefaultMessenger();
545   if (argc < 3) { sout<<" Give signature name + n0 or id of entity"<<endl; return IFSelect_RetError; }
546   DeclareAndCast(IFSelect_Signature,sign,WS->NamedItem(arg1));
547   if (sign.IsNull()) { sout<<"Not a signature : "<<arg1<<endl; return IFSelect_RetError; }
548   Standard_Integer num = pilot->Number(arg2);
549   Handle(Standard_Transient) ent = WS->StartingEntity (num);
550   if (num == 0) return IFSelect_RetError;
551   sout<<"Entity n0 "<<num<<" : "<<WS->SignValue(sign,ent)<<endl;
552   return IFSelect_RetVoid;
553 }
554
555 static IFSelect_ReturnStatus funqp
556   (const Handle(IFSelect_SessionPilot)& pilot)
557 {
558   Handle(IFSelect_WorkSession) WS = pilot->Session();
559   Standard_Integer argc = pilot->NbWords();
560   const Standard_CString arg1 = pilot->Arg(1);
561   const Standard_CString arg2 = pilot->Arg(2);
562   Handle(Message_Messenger) sout = Message::DefaultMessenger();
563   if (argc < 3) { sout<<" Give 2 numeros or labels : dad son"<<endl; return IFSelect_RetError; }
564   Standard_Integer n1 = WS->NumberFromLabel(arg1);
565   Standard_Integer n2 = WS->NumberFromLabel(arg2);
566   sout<<"QueryParent for dad:"<<arg1<<":"<<n1<<" and son:"<<arg2<<":"<<n2<<endl;
567   Standard_Integer qp = WS->QueryParent(WS->StartingEntity(n1),WS->StartingEntity(n2));
568   if (qp < 0) sout<<arg1<<" is not super-entity of "<<arg2<<endl;
569   else if (qp == 0) sout<<arg1<<" is same as "<<arg2<<endl;
570   else sout<<arg1<<" is super-entity of "<<arg2<<" , max level found="<<qp<<endl;
571 //  sout<<" Trouve "<<qp<<endl;
572   return IFSelect_RetVoid;
573 }
574   
575
576 static IFSelect_ReturnStatus fun12
577   (const Handle(IFSelect_SessionPilot)& pilot)
578 {
579   Handle(IFSelect_WorkSession) WS = pilot->Session();
580 //        ****    DumpShare         ****
581   WS->DumpShare();  return IFSelect_RetVoid;
582 }
583
584 static IFSelect_ReturnStatus fun13
585   (const Handle(IFSelect_SessionPilot)& pilot)
586 {
587   Handle(IFSelect_WorkSession) WS = pilot->Session();
588 //        ****    ListItems         ****
589   WS->ListItems(pilot->Arg(1));  return IFSelect_RetVoid;
590 }
591
592 static IFSelect_ReturnStatus fun14
593   (const Handle(IFSelect_SessionPilot)& pilot)
594 {
595   Handle(IFSelect_WorkSession) WS = pilot->Session();
596   Standard_Integer argc = pilot->NbWords();
597   const Standard_CString arg1 = pilot->Arg(1);
598 //        ****    NewInt            ****
599   Handle(Message_Messenger) sout = Message::DefaultMessenger();
600   if (argc < 1) { sout<<"Donner la valeur entiere pour IntParam"<<endl; return IFSelect_RetError; }
601   Handle(IFSelect_IntParam) intpar = new IFSelect_IntParam;
602   if (argc >= 1)       intpar->SetValue(atoi(arg1));
603   return pilot->RecordItem (intpar);
604 }
605
606 static IFSelect_ReturnStatus fun15
607   (const Handle(IFSelect_SessionPilot)& pilot)
608 {
609   Handle(IFSelect_WorkSession) WS = pilot->Session();
610   Standard_Integer argc = pilot->NbWords();
611   const Standard_CString arg1 = pilot->Arg(1);
612   const Standard_CString arg2 = pilot->Arg(2);
613 //        ****    SetInt            ****
614   Handle(Message_Messenger) sout = Message::DefaultMessenger();
615   if (argc < 3)
616     { sout<<"Donner 2 arguments : nom Parametre et Valeur"<<endl; return IFSelect_RetError; }
617   Standard_Integer val = atoi(arg2);
618   DeclareAndCast(IFSelect_IntParam,par,WS->NamedItem(arg1));
619   if (!WS->SetIntValue(par,val)) return IFSelect_RetFail;
620   return IFSelect_RetDone;
621 }
622
623 static IFSelect_ReturnStatus fun16
624   (const Handle(IFSelect_SessionPilot)& pilot)
625 {
626   Handle(IFSelect_WorkSession) WS = pilot->Session();
627   Standard_Integer argc = pilot->NbWords();
628   const Standard_CString arg1 = pilot->Arg(1);
629 //        ****    NewText           ****
630   Handle(Message_Messenger) sout = Message::DefaultMessenger();
631   if (argc < 1) { sout<<"Donner la valeur texte pour TextParam"<<endl; return IFSelect_RetError; }
632   Handle(TCollection_HAsciiString) textpar = new TCollection_HAsciiString();
633   if (argc >= 1) textpar->AssignCat(arg1);
634   return pilot->RecordItem (textpar);
635 }
636
637 static IFSelect_ReturnStatus fun17
638   (const Handle(IFSelect_SessionPilot)& pilot)
639 {
640   Handle(IFSelect_WorkSession) WS = pilot->Session();
641   Standard_Integer argc = pilot->NbWords();
642   const Standard_CString arg1 = pilot->Arg(1);
643   const Standard_CString arg2 = pilot->Arg(2);
644 //        ****    SetText           ****
645   Handle(Message_Messenger) sout = Message::DefaultMessenger();
646   if (argc < 3)
647     { sout<<"Donner 2 arguments : nom Parametre et Valeur"<<endl; return IFSelect_RetError; }
648   DeclareAndCast(TCollection_HAsciiString,par,WS->NamedItem(arg1));
649   if (!WS->SetTextValue(par,arg2)) return IFSelect_RetFail;
650   return IFSelect_RetDone;
651 }
652
653 static IFSelect_ReturnStatus fun19
654   (const Handle(IFSelect_SessionPilot)& pilot)
655 {
656   Handle(IFSelect_WorkSession) WS = pilot->Session();
657   Standard_Integer argc = pilot->NbWords();
658   const Standard_CString arg1 = pilot->Arg(1);
659 //        ****    DumpSel           ****
660   Handle(Message_Messenger) sout = Message::DefaultMessenger();
661   if (argc < 2) { sout<<"Give 1 argument : Selection Name"<<endl; return IFSelect_RetError; }
662   WS->DumpSelection (GetCasted(IFSelect_Selection,WS->NamedItem(arg1)));
663   return IFSelect_RetVoid;
664 }
665
666 static IFSelect_ReturnStatus fun20
667   (const Handle(IFSelect_SessionPilot)& pilot)
668 {
669   Handle(IFSelect_WorkSession) WS = pilot->Session();
670   Standard_Integer argc = pilot->NbWords();
671 //        ****    EvalSel           ****
672 //        ****    GiveList          ****
673 //        ****    GiveShort GivePointed  ****
674 //        ****    MakeList          ****
675   char mode = pilot->Arg(0)[0];  // givelist/makelist
676   if (mode == 'g') mode = pilot->Arg(0)[4];  // l list  s short  p pointed
677   Handle(Message_Messenger) sout = Message::DefaultMessenger();
678   if (argc < 2) { sout<<"Give Entity ID, or Selection Name [+ optional other selection or entity]"<<endl; return IFSelect_RetError; }
679
680 //    MakeList : sur Pointed existante ou a creer
681   Handle(IFSelect_SelectPointed) pnt;
682   if (mode == 'm') {
683     const Standard_CString arg1 = pilot->Arg(1);
684     Handle(Standard_Transient) item = WS->NamedItem (arg1);
685     pnt = GetCasted(IFSelect_SelectPointed,item);
686     if (!pnt.IsNull()) {
687       sout<<arg1<<":Already existing Selection for List, cleared then filled"<<endl;
688       pnt->Clear();
689     } else if (!item.IsNull()) {
690       sout<<arg1<<":Already existing Item not for a List, command ignored"<<endl;
691       return IFSelect_RetFail;
692     } else {
693       pnt = new IFSelect_SelectPointed;
694       WS->AddNamedItem (arg1,pnt);
695     }
696   }
697
698   Handle(TColStd_HSequenceOfTransient) result =
699     IFSelect_Functions::GiveList (WS,pilot->CommandPart( (mode == 'm' ? 2 : 1) ));
700   if (result.IsNull()) return IFSelect_RetError;
701   Interface_EntityIterator iter (result);
702   sout<<pilot->CommandPart( (mode == 'm' ? 2 : 1) )<<" : ";
703   if      (mode == 'l')   WS->ListEntities (iter,0);
704   else if (mode == 's' || mode == 'm') WS->ListEntities (iter,2);
705   else if (mode == 'p') {
706     sout<<iter.NbEntities()<<" Entities : ";
707     for (iter.Start(); iter.More(); iter.Next())
708       sout<<" +"<<WS->StartingNumber (iter.Value());
709     sout<<endl;
710   }
711
712   if (!pnt.IsNull()) {
713     pnt->SetList (result);
714     sout<<"List set to a SelectPointed : "<<pilot->Arg(1)<<endl;
715     sout<<"Later editable by command setlist"<<endl;
716   }
717
718   return IFSelect_RetVoid;
719 }
720
721 static IFSelect_ReturnStatus fun20c
722   (const Handle(IFSelect_SessionPilot)& pilot)
723 {
724   Handle(IFSelect_WorkSession) WS = pilot->Session();
725   Standard_Integer argc = pilot->NbWords();
726 //        ****    GiveCount         ****
727   Handle(Message_Messenger) sout = Message::DefaultMessenger();
728   if (argc < 2) { sout<<"Give Entity ID, or Selection Name [+ optional other selection or entity]"<<endl; return IFSelect_RetError; }
729 //  WS->EvaluateSelection(GetCasted(IFSelect_Selection,WS->NamedItem(arg1)));
730   Handle(TColStd_HSequenceOfTransient) result =
731     IFSelect_Functions::GiveList (WS,pilot->CommandPart(1));
732   if (result.IsNull()) return IFSelect_RetError;
733   sout<<pilot->CommandPart(1)<<" : List of "<<result->Length()<<" Entities"<<endl;
734   return IFSelect_RetVoid;
735 }
736
737 static IFSelect_ReturnStatus funselsuite
738   (const Handle(IFSelect_SessionPilot)& pilot)
739 {
740   Handle(IFSelect_WorkSession) WS = pilot->Session();
741   Standard_Integer argc = pilot->NbWords();
742 //        ****    SelSuite         ****
743   Handle(Message_Messenger) sout = Message::DefaultMessenger();
744   if (argc < 2) { sout<<"Give Entity ID, or Selection Name [+ optional other selection or entity]"<<endl; return IFSelect_RetError; }
745 //  WS->EvaluateSelection(GetCasted(IFSelect_Selection,WS->NamedItem(arg1)));
746   Handle(IFSelect_SelectSuite) selsuite = new IFSelect_SelectSuite;
747
748   for (Standard_Integer i = 1; i < argc; i ++) {
749     Handle(IFSelect_Selection) sel = WS->GiveSelection(pilot->Arg(i));
750     if (!selsuite->AddInput(sel)) {
751       sout<<pilot->Arg(i-1)<<" : not a SelectDeduct, no more can be added. Abandon"<<endl;
752       return IFSelect_RetError;
753     }
754   }
755   selsuite->SetLabel (pilot->CommandPart(1));
756   return pilot->RecordItem (selsuite);
757 }
758
759
760 static IFSelect_ReturnStatus fun21
761   (const Handle(IFSelect_SessionPilot)& pilot)
762 {
763   Handle(IFSelect_WorkSession) WS = pilot->Session();
764 //        ****    ClearItems           ****
765   WS->ClearItems();  WS->ClearFinalModifiers();  WS->ClearShareOut(Standard_False);
766   return IFSelect_RetDone;
767 }
768
769 static IFSelect_ReturnStatus fun22
770   (const Handle(IFSelect_SessionPilot)& pilot)
771 {
772   Handle(IFSelect_WorkSession) WS = pilot->Session();
773   Standard_Integer argc = pilot->NbWords();
774   const Standard_CString arg1 = pilot->Arg(1);
775 //        ****    ClearData           ****
776   Standard_Integer mode = -1;
777   if (argc >= 2) {
778     if (arg1[0] == 'a') mode = 1;
779     if (arg1[0] == 'g') mode = 2;
780     if (arg1[0] == 'c') mode = 3;
781     if (arg1[0] == 'p') mode = 4;
782     if (arg1[0] == '?') mode = -1;
783   }
784   else mode = 0;
785   Handle(Message_Messenger) sout = Message::DefaultMessenger();
786   if (mode <= 0) {
787     if (mode < 0) sout<<"Give a suitable mode";
788     sout<<"  Available Modes :\n"
789       <<" a : all data    g : graph+check  c : check  p : selectpointed"<<endl;
790     return (mode < 0 ? IFSelect_RetError : IFSelect_RetVoid);
791   }
792   WS->ClearData (mode);
793   return IFSelect_RetDone;
794 }
795
796 static IFSelect_ReturnStatus fun24
797   (const Handle(IFSelect_SessionPilot)& pilot)
798 {
799   Handle(IFSelect_WorkSession) WS = pilot->Session();
800   Standard_Integer argc = pilot->NbWords();
801 //        ****    Item Label         ****
802   Handle(Message_Messenger) sout = Message::DefaultMessenger();
803   TCollection_AsciiString label;
804   if (argc < 2) { sout<<" Give  label to search"<<endl;  return IFSelect_RetError;  }
805   for (int i = 1; i < argc; i ++) {
806     label.AssignCat(pilot->Arg(i));
807     if (i < argc-1) label.AssignCat(" ");
808   }
809   for (int mode = 0; mode <= 2; mode ++) {
810     int nbitems = 0;  int id;
811     sout<<"Searching label : "<<label<<". in mode ";
812     if (mode == 0) sout <<" exact" << endl;
813     if (mode == 1) sout <<" same head" << endl;
814     if (mode == 2) sout <<" search if present" << endl;
815     for (id = WS->NextIdentForLabel(label.ToCString(), 0,mode)  ; id != 0;
816          id = WS->NextIdentForLabel(label.ToCString(),id,mode)) {
817       sout<<" "<<id;  nbitems ++;
818     }
819     sout<<" -- giving " << nbitems << " found" << endl;
820   }
821   return IFSelect_RetVoid;
822 }
823
824 static IFSelect_ReturnStatus fun25
825   (const Handle(IFSelect_SessionPilot)& pilot)
826 {
827   Handle(IFSelect_WorkSession) WS = pilot->Session();
828   Standard_Integer argc = pilot->NbWords();
829   const Standard_CString arg1 = pilot->Arg(1);
830 //        ****    Save (Dump)       ****
831   Handle(Message_Messenger) sout = Message::DefaultMessenger();
832   if (argc < 2) { sout<<"Donner nom du Fichier"<<endl; return IFSelect_RetError; }
833   IFSelect_SessionFile dumper(WS,arg1);
834   if (!dumper.IsDone()) return IFSelect_RetFail;
835   return IFSelect_RetDone;
836 }
837
838 static IFSelect_ReturnStatus fun26
839   (const Handle(IFSelect_SessionPilot)& pilot)
840 {
841   Handle(IFSelect_WorkSession) WS = pilot->Session();
842   Standard_Integer argc = pilot->NbWords();
843   const Standard_CString arg1 = pilot->Arg(1);
844 //        ****    Restore (Dump)    ****
845   Handle(Message_Messenger) sout = Message::DefaultMessenger();
846   if (argc < 2) { sout<<"Donner nom du Fichier"<<endl; return IFSelect_RetError; }
847   IFSelect_SessionFile dumper(WS);
848   Standard_Integer readstat = dumper.Read(arg1);
849   if      (readstat == 0) return IFSelect_RetDone;
850   else if (readstat >  0) sout << "-- Erreur Lecture Fichier "<<arg1<<endl;
851   else                    sout << "-- Pas pu ouvrir Fichier "<<arg1<<endl;
852   return IFSelect_RetDone;
853 }
854
855 static IFSelect_ReturnStatus fun27
856   (const Handle(IFSelect_SessionPilot)& pilot)
857 {
858   Standard_Integer argc = pilot->NbWords();
859   Handle(IFSelect_WorkSession) WS = pilot->Session();
860   const Standard_CString arg1 = pilot->Arg(1);
861   const Standard_CString arg2 = pilot->Arg(2);
862 //        ****    Param(Value)         ****
863   Handle(Message_Messenger) sout = Message::DefaultMessenger();
864   if (argc < 2) {
865     Handle(TColStd_HSequenceOfHAsciiString) li = Interface_Static::Items();
866     Standard_Integer i,nb = li->Length();
867     sout<<" List of parameters : "<<nb<<" items : "<<endl;
868     for (i = 1; i <= nb; i ++) {
869       sout<<li->Value(i);
870       sout<<" : "<<Interface_Static::CVal(li->Value(i)->ToCString())<<endl;
871     }
872     return IFSelect_RetVoid;
873   } else if (atoi(arg1) > 0) {
874     Standard_Integer use = atoi (arg1);
875     WS->TraceStatics (use);
876   } else {
877     if (argc > 2) sout<<"     FORMER STATUS of Static Parameter "<<arg1<<endl;
878     else          sout<<"     ACTUAL STATUS of Static Parameter "<<arg1<<endl;
879     if (!Interface_Static::IsPresent(arg1)) { sout<<" Parameter "<<arg1<<" undefined"<<endl; return IFSelect_RetError; }
880     if (!Interface_Static::IsSet(arg1)) sout<<" Parameter "<<arg1<<" not valued"<<endl;
881     else if (argc == 2) Interface_Static::Static (arg1) -> Print(sout);
882     else sout<<" Value : "<<Interface_Static::CVal(arg1)<<endl;
883
884     if (argc == 2) sout<<"To modify, param name_param new_val"<<endl;
885     else {
886       sout<<" New demanded value : "<<arg2;
887       if (Interface_Static::SetCVal (arg1,arg2))
888         {  sout<<"   OK"<<endl;  return IFSelect_RetDone;  }
889       else  {  sout <<" , refused"<<endl;  return IFSelect_RetError;  }
890     }
891   }
892   return IFSelect_RetVoid;
893 }
894
895 static IFSelect_ReturnStatus fun28
896   (const Handle(IFSelect_SessionPilot)& pilot)
897 {
898   Standard_Integer argc = pilot->NbWords();
899   const Standard_CString arg1 = pilot->Arg(1);
900   const Standard_CString arg2 = pilot->Arg(2);
901   const Standard_CString arg3 = pilot->Arg(3);
902 //        ****    DefParam         ****
903   Handle(Message_Messenger) sout = Message::DefaultMessenger();
904   if (argc < 2) {
905     Handle(TColStd_HSequenceOfHAsciiString) li = Interface_Static::Items();
906     Standard_Integer i,nb = li->Length();
907     sout<<" List of parameters : "<<nb<<" items :"<<endl;
908     for (i = 1; i <= nb; i ++) sout<<"  "<<li->Value(i)->ToCString();
909     sout<<endl<<"  defparam name_param  to known more about one"<<endl;
910     sout<<"  defparam nom_param e options  to edit a definition"<<endl;
911
912   } else if (argc == 2) {
913     sout<<" Definition of Parameter : "<<arg1<<endl;
914     Handle(Interface_Static) unst = Interface_Static::Static (arg1);
915     if (unst.IsNull()) sout<<"  undefined"<<endl;
916     else unst->Print(sout);
917     return IFSelect_RetVoid;
918
919   } else if (arg2[0] == 'i') {
920 //  initialisation : arg1=nompar  a2='i'  a3=family  a4=type  [a5=val]
921     if (argc < 5) { sout<<" name init family type [valinit]"<<endl; return IFSelect_RetVoid; }
922     char typ = (pilot->Arg(4))[0];
923     Standard_Boolean ok= (argc==5 ? Interface_Static::Init(arg3,arg1,typ) :
924                           Interface_Static::Init(arg3,arg1,typ,pilot->Arg(5)));
925     return (ok ? IFSelect_RetDone : IFSelect_RetFail);
926
927   } else if (arg2[0] == 'e') {
928 //  edition : arg1=nompar  arg2='e' arg3=option  arg4...=parametres option
929     char comm[100];
930     if (argc < 4) {
931       sout<<" give name and options !  Options (according type), 1 a time\n"
932           <<" imin ival / imax ival / rmin rval / rmax rval /\n"
933           <<" enum stnum / enum stnum match / eval e1 e2 e3 ... (maxi 10)\n"
934           <<endl;
935       return IFSelect_RetVoid;
936     }
937     if (argc > 4) sout<<"Only the command and ONE more arg are considered"<<endl;
938     sprintf(comm,"%s %s",pilot->Arg(3),pilot->Arg(4));
939     sout<<"Editing parameter : "<<arg1<<" , by command : "<<comm<<endl;
940
941     Handle(Interface_Static) unst = Interface_Static::Static (arg1);
942     if (unst.IsNull()) { sout<<arg1<<"  undefined"<<endl; return IFSelect_RetError; }
943     if (Interface_Static::Init(unst->Family(),arg1,'&',comm))
944       {  sout<<"Editing done"<<endl;  return IFSelect_RetDone;  }
945     else  {  sout<<"Command not processed : "<<comm<<endl; return IFSelect_RetFail;  }
946   }
947   sout<<"Unknown Option : "<<arg2<<endl;
948   return IFSelect_RetVoid;
949 }
950
951 static IFSelect_ReturnStatus fun29
952   (const Handle(IFSelect_SessionPilot)& pilot)
953 {
954   Handle(IFSelect_WorkSession) WS = pilot->Session();
955 //        ****    SentFiles         ****
956   Handle(TColStd_HSequenceOfHAsciiString) list = WS->SentFiles();
957   Handle(Message_Messenger) sout = Message::DefaultMessenger();
958   if (list.IsNull())
959     { sout<<"List of Sent Files not enabled"<<endl; return IFSelect_RetVoid; }
960   Standard_Integer i, nb = list->Length();
961   sout<<"  Sent Files : "<<nb<<" : "<<endl;
962   for (i = 1; i <= nb; i ++)
963     sout<<list->Value(i)->ToCString()<<endl; 
964   return IFSelect_RetVoid;
965 }
966
967 static IFSelect_ReturnStatus fun30
968   (const Handle(IFSelect_SessionPilot)& pilot)
969 {
970   Handle(IFSelect_WorkSession) WS = pilot->Session();
971   Standard_Integer argc = pilot->NbWords();
972   const Standard_CString arg1 = pilot->Arg(1);
973 //        ****    FilePrefix        ****
974   Handle(Message_Messenger) sout = Message::DefaultMessenger();
975   if (argc < 2) {
976     if (WS->FilePrefix().IsNull()) sout<<"Pas de prefixe defini"<<endl;
977     else sout<<"Prefixe : "<<WS->FilePrefix()->ToCString()<<endl;
978     sout<<"Pour changer :  filepref newprefix"<<endl;
979     return IFSelect_RetVoid;
980   }
981   WS->SetFilePrefix(arg1);
982   return IFSelect_RetDone;
983 }
984
985 static IFSelect_ReturnStatus fun31
986   (const Handle(IFSelect_SessionPilot)& pilot)
987 {
988   Handle(IFSelect_WorkSession) WS = pilot->Session();
989   Standard_Integer argc = pilot->NbWords();
990   const Standard_CString arg1 = pilot->Arg(1);
991 //        ****    FileExtension     ****
992   Handle(Message_Messenger) sout = Message::DefaultMessenger();
993   if (argc < 2) {
994     if (WS->FileExtension().IsNull()) sout<<"Pas d extension definie"<<endl;
995     else sout<<"Extension : "<<WS->FileExtension()->ToCString()<<endl;
996     sout<<"Pour changer :  fileext newext"<<endl;
997     return IFSelect_RetVoid;
998   }
999   WS->SetFileExtension(arg1);
1000   return IFSelect_RetDone;
1001 }
1002
1003 static IFSelect_ReturnStatus fun32
1004   (const Handle(IFSelect_SessionPilot)& pilot)
1005 {
1006   Handle(IFSelect_WorkSession) WS = pilot->Session();
1007   Standard_Integer argc = pilot->NbWords();
1008   const Standard_CString arg1 = pilot->Arg(1);
1009   const Standard_CString arg2 = pilot->Arg(2);
1010 //        ****    FileRoot          ****
1011   Handle(Message_Messenger) sout = Message::DefaultMessenger();
1012   if (argc < 2) { sout<<"Donner Dispatch et nom de Root"<<endl; return IFSelect_RetError; }
1013   DeclareAndCast(IFSelect_Dispatch,disp,WS->NamedItem(arg1));
1014   if (argc < 3) {
1015     if (WS->FileRoot(disp).IsNull()) sout<<"Pas de racine definie pour "<<arg1<<endl;
1016     else sout<<"Racine pour "<<arg1<<" : "<<WS->FileRoot(disp)->ToCString()<<endl;
1017     sout<<"Pour changer :  fileroot nomdisp newroot"<<endl;
1018     return IFSelect_RetVoid;
1019   }
1020   if (!WS->SetFileRoot(disp,arg2)) return IFSelect_RetFail;
1021   return IFSelect_RetDone;
1022 }
1023
1024 static IFSelect_ReturnStatus fun33
1025   (const Handle(IFSelect_SessionPilot)& pilot)
1026 {
1027   Handle(IFSelect_WorkSession) WS = pilot->Session();
1028   Standard_Integer argc = pilot->NbWords();
1029   const Standard_CString arg1 = pilot->Arg(1);
1030 //        ****    Default File Root     ****
1031   Handle(Message_Messenger) sout = Message::DefaultMessenger();
1032   if (argc < 2) {
1033     if (WS->DefaultFileRoot().IsNull()) sout<<"Pas de racine par defaut definie"<<endl;
1034     else sout<<"Racine par defaut : "<<WS->DefaultFileRoot()->ToCString()<<endl;
1035     sout<<"Pour changer :  filedef newdef"<<endl;
1036     return IFSelect_RetVoid;
1037   }
1038   WS->SetDefaultFileRoot(arg1);
1039   return IFSelect_RetDone;
1040 }
1041
1042 static IFSelect_ReturnStatus fun34
1043   (const Handle(IFSelect_SessionPilot)& pilot)
1044 {
1045   Handle(IFSelect_WorkSession) WS = pilot->Session();
1046 //        ****    EvalFile          ****
1047   Handle(Message_Messenger) sout = Message::DefaultMessenger();
1048   if (!WS->HasModel()) 
1049     {  sout<<"Pas de Modele charge, abandon"<<endl;  return IFSelect_RetFail; }
1050
1051   sout<<"Evaluation avec Memorisation des resultats"<<endl;
1052   WS->EvaluateFile();
1053   Standard_Integer nbf = WS->NbFiles();
1054   for (Standard_Integer i = 1; i <= nbf; i ++) {
1055     Handle(Interface_InterfaceModel) mod = WS->FileModel(i);
1056     if (mod.IsNull())
1057       {  sout<<"Modele "<<i<<" Model non genere ..."<<endl; continue;  }
1058     TCollection_AsciiString name = WS->FileName(i);
1059     sout<<"Fichier n0 "<<i<<" Nb Entites : "<<mod->NbEntities()<<"  Nom: ";
1060     sout<<name<<endl;
1061   }
1062   return IFSelect_RetDone;
1063 }
1064
1065 static IFSelect_ReturnStatus fun35
1066   (const Handle(IFSelect_SessionPilot)& pilot)
1067 {
1068   Handle(IFSelect_WorkSession) WS = pilot->Session();
1069 //        ****    ClearFile          ****
1070   WS->ClearFile();  return IFSelect_RetDone;
1071 }
1072
1073 static IFSelect_ReturnStatus fun36
1074   (const Handle(IFSelect_SessionPilot)& pilot)
1075 {
1076   Handle(IFSelect_WorkSession) WS = pilot->Session();
1077   Standard_Integer argc = pilot->NbWords();
1078 //        ****    Split              ****
1079   Handle(Message_Messenger) sout = Message::DefaultMessenger();
1080   IFSelect_ReturnStatus stat = IFSelect_RetVoid;
1081   if (argc < 2) sout<<"Split : derniere liste de dispatches definie"<<endl;
1082   else {
1083     WS->ClearShareOut(Standard_True);
1084     for (Standard_Integer i = 1; i < argc; i ++) {
1085       DeclareAndCast(IFSelect_Dispatch,disp,WS->NamedItem(pilot->Arg(i)));
1086       if (disp.IsNull()) {
1087         sout<<"Pas un dispatch:"<<pilot->Arg(i)<<", Splitt abandonne"<<endl;
1088         stat = IFSelect_RetError;
1089       }
1090       else WS->SetActive(disp,Standard_True);
1091     }
1092   }
1093   if (stat ==  IFSelect_RetError) return stat;
1094   WS->BeginSentFiles(Standard_True);
1095   if (!WS->SendSplit()) return IFSelect_RetFail;
1096   return IFSelect_RetDone;
1097 }
1098
1099 static IFSelect_ReturnStatus fun37
1100   (const Handle(IFSelect_SessionPilot)& pilot)
1101 {
1102   Handle(IFSelect_WorkSession) WS = pilot->Session();
1103   Standard_Integer argc = pilot->NbWords();
1104   const Standard_CString arg1 = pilot->Arg(1);
1105 //        ****    Remaining Data     ****
1106   char mode = '?';  IFSelect_RemainMode numod = IFSelect_RemainDisplay;
1107   if (argc >= 2) mode = arg1[0];
1108   if      (mode == 'u') numod = IFSelect_RemainUndo;
1109   else if (mode == 'l') numod = IFSelect_RemainDisplay;
1110   else if (mode == 'c') numod = IFSelect_RemainCompute;
1111   else if (mode == 'f') numod = IFSelect_RemainForget;
1112   else {
1113     Handle(Message_Messenger) sout = Message::DefaultMessenger();
1114     if (argc<2) sout<<"Donner un Mode - ";
1115     sout<<"Modes possibles : l  list, c compute, u undo, f forget"<<endl;
1116     if (mode == '?') return IFSelect_RetDone;   else return IFSelect_RetError;
1117   }
1118   if (!WS->SetRemaining(numod)) return IFSelect_RetVoid;
1119   return IFSelect_RetDone;
1120 }
1121
1122 static IFSelect_ReturnStatus fun38
1123   (const Handle(IFSelect_SessionPilot)& pilot)
1124 {
1125   Handle(IFSelect_WorkSession) WS = pilot->Session();
1126   Standard_Integer argc = pilot->NbWords();
1127   const Standard_CString arg1 = pilot->Arg(1);
1128   const Standard_CString arg2 = pilot->Arg(2);
1129 //        ****    SetModelContent    ****
1130   Handle(Message_Messenger) sout = Message::DefaultMessenger();
1131   if (argc < 3) { sout<<"Donner nom selection et mode (k=keep,r=remove)"<<endl;  return IFSelect_RetError; }
1132   Standard_Boolean keepmode;
1133   DeclareAndCast(IFSelect_Selection,sel,WS->NamedItem(arg1));
1134   if (sel.IsNull())
1135     { sout<<"Pas de Selection de Nom : "<<arg1<<endl; return IFSelect_RetError; }
1136   if      (arg2[0] == 'k') {  sout<<" -- SetContent keep ..."; keepmode = Standard_True; }
1137   else if (arg2[0] == 'r') {  sout<<" -- SetContent remove ..."; keepmode = Standard_False; }
1138   else { sout<<"Donner nom selection et mode (k=keep,r=remove)"<<endl;  return IFSelect_RetError; }
1139   
1140   if (WS->SetModelContent(sel,keepmode)) sout<<" Done"<<endl;
1141   else sout<<" Result empty, ignored"<<endl;
1142   return IFSelect_RetDone;
1143 }
1144
1145 static IFSelect_ReturnStatus fun40
1146   (const Handle(IFSelect_SessionPilot)& pilot)
1147 {
1148   Handle(IFSelect_WorkSession) WS = pilot->Session();
1149 //        ****    ListModif          ****
1150   WS->ListFinalModifiers(Standard_True);
1151   WS->ListFinalModifiers(Standard_False);  return IFSelect_RetVoid;
1152 }
1153
1154 static IFSelect_ReturnStatus fun41
1155   (const Handle(IFSelect_SessionPilot)& pilot)
1156 {
1157   Handle(IFSelect_WorkSession) WS = pilot->Session();
1158   Standard_Integer argc = pilot->NbWords();
1159   const Standard_CString arg1 = pilot->Arg(1);
1160 //        ****    Modifier           ****
1161   Handle(Message_Messenger) sout = Message::DefaultMessenger();
1162   if (argc < 2) { sout<<"Donner Nom du Modifier"<<endl;  return IFSelect_RetError; }
1163   DeclareAndCast(IFSelect_GeneralModifier,modif,WS->NamedItem(arg1));
1164   if (modif.IsNull())
1165     { sout<<"Pas de Modifier de Nom : "<<arg1<<endl; return IFSelect_RetVoid; }
1166   Handle(IFSelect_IntParam) low,up;
1167
1168   Handle(IFSelect_Dispatch) disp = modif->Dispatch();
1169   sout<<"Modifier : "<<arg1<<" Label : "<<modif->Label()<<endl;
1170   Standard_Integer rank = WS->ModifierRank(modif);
1171   if (modif->IsKind(STANDARD_TYPE(IFSelect_Modifier)))
1172     sout<< "Model Modifier n0." << rank;
1173   else sout<< "File Modifier n0." << rank;
1174   if (disp.IsNull()) sout<<"  Applique a tous les Dispatchs" << endl;
1175   else {
1176     sout << "  Dispatch : "<<disp->Label();
1177     if (WS->HasName(disp)) sout << " - Nom:"<<WS->Name(disp)->ToCString();
1178     sout<<endl;
1179   }
1180
1181   Handle(IFSelect_Selection) sel = modif->Selection();
1182   if (!sel.IsNull()) sout<<"  Selection : "<< sel->Label();
1183   if (WS->HasName(sel)) sout<<" - Nom:"<< WS->Name(sel)->ToCString();
1184   sout<<endl;
1185   return IFSelect_RetVoid;
1186 }
1187
1188 static IFSelect_ReturnStatus fun42
1189   (const Handle(IFSelect_SessionPilot)& pilot)
1190 {
1191   Handle(IFSelect_WorkSession) WS = pilot->Session();
1192   Standard_Integer argc = pilot->NbWords();
1193   const Standard_CString arg1 = pilot->Arg(1);
1194   const Standard_CString arg2 = pilot->Arg(2);
1195 //        ****    ModifSel           ****
1196   Handle(Message_Messenger) sout = Message::DefaultMessenger();
1197   if (argc < 2) { sout<<"Donner Nom Modifier; + Nom Selection optionnel\n"
1198                       <<"Selection pour Mettre une Selection, sinon Annule"<<endl; return IFSelect_RetError; }
1199   DeclareAndCast(IFSelect_GeneralModifier,modif,WS->NamedItem(arg1));
1200   if (modif.IsNull())
1201     { sout<<"Pas un nom de Modifier : "<<arg1<<endl; return IFSelect_RetError;  }
1202   Handle(IFSelect_Selection) sel;
1203   if (arg2[0] != '\0') {
1204     sel = GetCasted(IFSelect_Selection,WS->NamedItem(arg2));
1205     if (sel.IsNull())
1206       { sout<<"Pas un nom de Selection : "<<arg2<<endl;  return IFSelect_RetError;  }
1207   }
1208   if (!WS->SetItemSelection(modif,sel)) return IFSelect_RetFail;
1209   return IFSelect_RetDone;
1210 }
1211
1212 static IFSelect_ReturnStatus fun43
1213   (const Handle(IFSelect_SessionPilot)& pilot)
1214 {
1215   Handle(IFSelect_WorkSession) WS = pilot->Session();
1216   Standard_Integer argc = pilot->NbWords();
1217   const Standard_CString arg1 = pilot->Arg(1);
1218   const Standard_CString arg2 = pilot->Arg(2);
1219 //        ****    SetAppliedModifier           ****
1220   Handle(Message_Messenger) sout = Message::DefaultMessenger();
1221   if (argc < 2) { sout<<"Donner Nom Modifier; + Nom Dispatch ou Transformer optionnel :\n"
1222                       <<" - rien : tous Dispatches\n - Dispatch : ce Dispatch seul\n"
1223                       <<" - Transformer : pas un Dispatch mais un Transformer"<<endl;
1224                   return IFSelect_RetError;  }
1225   DeclareAndCast(IFSelect_GeneralModifier,modif,WS->NamedItem(arg1));
1226   if (modif.IsNull())
1227     { sout<<"Pas un nom de Modifier : "<<arg1<<endl;  return IFSelect_RetError;  }
1228   Handle(Standard_Transient) item;
1229   if (arg2[0] != '\0') {
1230     item = WS->NamedItem(arg2);
1231     if (item.IsNull())
1232       { sout<<"Pas un nom connu : "<<arg2<<endl;  return IFSelect_RetError;  }
1233   }
1234   else item = WS->ShareOut();
1235   if (!WS->SetAppliedModifier(modif,item)) return IFSelect_RetFail;
1236   return IFSelect_RetDone;
1237 }
1238
1239 static IFSelect_ReturnStatus fun44
1240   (const Handle(IFSelect_SessionPilot)& pilot)
1241 {
1242   Handle(IFSelect_WorkSession) WS = pilot->Session();
1243   Standard_Integer argc = pilot->NbWords();
1244   const Standard_CString arg1 = pilot->Arg(1);
1245 //        ****    ResetApplied (modifier)    ****
1246   Handle(Message_Messenger) sout = Message::DefaultMessenger();
1247   if (argc < 2) { sout<<"Designer un modifier"<<endl; return IFSelect_RetError; }
1248   DeclareAndCast(IFSelect_GeneralModifier,modif,WS->NamedItem(arg1));
1249   if (modif.IsNull())
1250     { sout<<"Pas un nom de Modifier : "<<arg1<<endl;  return IFSelect_RetError;  }
1251   if (!WS->ResetAppliedModifier(modif)) return IFSelect_RetFail;
1252   return IFSelect_RetDone;
1253 }
1254
1255 static IFSelect_ReturnStatus fun45
1256   (const Handle(IFSelect_SessionPilot)& pilot)
1257 {
1258   Handle(IFSelect_WorkSession) WS = pilot->Session();
1259   Standard_Integer argc = pilot->NbWords();
1260   const Standard_CString arg1 = pilot->Arg(1);
1261   const Standard_CString arg2 = pilot->Arg(2);
1262   const Standard_CString arg3 = pilot->Arg(3);
1263 //        ****    ModifMove         ****
1264   Handle(Message_Messenger) sout = Message::DefaultMessenger();
1265   if (argc < 4) { sout<<"modifmove MF rang1 rang2, M pour Model F pour File"<<endl; return IFSelect_RetError; }
1266   Standard_Boolean formodel;
1267   if      (arg1[0] == 'm' || arg1[0] == 'M') formodel = Standard_True;
1268   else if (arg1[0] == 'f' || arg1[0] == 'F') formodel = Standard_False;
1269   else { sout<<"preciser M pour Model, F pour File"<<endl; return IFSelect_RetError; }
1270   Standard_Integer before = atoi(arg2);
1271   Standard_Integer after  = atoi(arg3);
1272   if (before == 0 || after == 0) { sout<<"Donner 2 Entiers Positifs"<<endl; return IFSelect_RetError; }
1273   if (!WS->ChangeModifierRank(formodel,before,after)) return IFSelect_RetFail;
1274   return IFSelect_RetDone;
1275 }
1276
1277 static IFSelect_ReturnStatus fun51
1278   (const Handle(IFSelect_SessionPilot)& pilot)
1279 {
1280   Handle(IFSelect_WorkSession) WS = pilot->Session();
1281   Standard_Integer argc = pilot->NbWords();
1282   const Standard_CString arg1 = pilot->Arg(1);
1283   const Standard_CString arg2 = pilot->Arg(2);
1284 //        ****    DispSel           ****
1285   Handle(Message_Messenger) sout = Message::DefaultMessenger();
1286   if (argc < 3) { sout<<"Donner Noms Dispatch et Selection Finale"<<endl; return IFSelect_RetError; }
1287   DeclareAndCast(IFSelect_Dispatch,disp,WS->NamedItem(arg1));
1288   if (disp.IsNull())
1289     { sout<<"Pas un nom de Dispatch : "<<arg1<<endl;  return IFSelect_RetError;  }
1290   DeclareAndCast(IFSelect_Selection,sel,WS->NamedItem(arg2));
1291   if (sel.IsNull())
1292     { sout<<"Pas un nom de Selection : "<<arg2<<endl;  return IFSelect_RetError;  }
1293   if (!WS->SetItemSelection(disp,sel)) return IFSelect_RetFail;
1294   return IFSelect_RetDone;
1295 }
1296
1297 static IFSelect_ReturnStatus fun_dispone
1298   (const Handle(IFSelect_SessionPilot)& pilot)
1299 {
1300   Handle(IFSelect_WorkSession) WS = pilot->Session();
1301 //        ****    DispOne           ****
1302   Handle(IFSelect_DispPerOne) disp = new IFSelect_DispPerOne;
1303   return pilot->RecordItem(disp);
1304 }
1305
1306 static IFSelect_ReturnStatus fun_dispglob
1307   (const Handle(IFSelect_SessionPilot)& pilot)
1308 {
1309   Handle(IFSelect_WorkSession) WS = pilot->Session();
1310 //        ****    DispGlob          ****
1311   Handle(IFSelect_DispGlobal) disp = new IFSelect_DispGlobal;
1312   return pilot->RecordItem(disp);
1313 }
1314
1315 static IFSelect_ReturnStatus fun_dispcount
1316   (const Handle(IFSelect_SessionPilot)& pilot)
1317 {
1318   Handle(IFSelect_WorkSession) WS = pilot->Session();
1319   Standard_Integer argc = pilot->NbWords();
1320   const Standard_CString arg1 = pilot->Arg(1);
1321 //        ****    DispCount         ****
1322   Handle(Message_Messenger) sout = Message::DefaultMessenger();
1323   if (argc < 2) { sout<<"Donner Nom IntParam pour Count"<<endl;  return IFSelect_RetError; }
1324   DeclareAndCast(IFSelect_IntParam,par,WS->NamedItem(arg1));
1325   if (par.IsNull())
1326     { sout<<"Pas un nom de IntParam : "<<arg1<<endl;  return IFSelect_RetError;  }
1327   Handle(IFSelect_DispPerCount) disp = new IFSelect_DispPerCount;
1328   disp->SetCount (par);
1329   return pilot->RecordItem(disp);
1330 }
1331
1332 static IFSelect_ReturnStatus fun_dispfiles
1333   (const Handle(IFSelect_SessionPilot)& pilot)
1334 {
1335   Handle(IFSelect_WorkSession) WS = pilot->Session();
1336   Standard_Integer argc = pilot->NbWords();
1337   const Standard_CString arg1 = pilot->Arg(1);
1338 //        ****    DispFiles         ****
1339   Handle(Message_Messenger) sout = Message::DefaultMessenger();
1340   if (argc < 2) { sout<<"Donner Nom IntParam pour NbFiles"<<endl;  return IFSelect_RetError; }
1341   DeclareAndCast(IFSelect_IntParam,par,WS->NamedItem(arg1));
1342   if (par.IsNull())
1343     { sout<<"Pas un nom de IntParam : "<<arg1<<endl;  return IFSelect_RetError;  }
1344   Handle(IFSelect_DispPerFiles) disp = new IFSelect_DispPerFiles;
1345   disp->SetCount (par);
1346   return pilot->RecordItem(disp);
1347 }
1348
1349
1350 static IFSelect_ReturnStatus fun_dispsign
1351   (const Handle(IFSelect_SessionPilot)& pilot)
1352 {
1353   Handle(IFSelect_WorkSession) WS = pilot->Session();
1354   Standard_Integer argc = pilot->NbWords();
1355   const Standard_CString arg1 = pilot->Arg(1);
1356 //        ****    DispFiles         ****
1357   Handle(Message_Messenger) sout = Message::DefaultMessenger();
1358   if (argc < 2) { sout<<"Donner Nom Signature"<<endl;  return IFSelect_RetError; }
1359   DeclareAndCast(IFSelect_Signature,sig,WS->NamedItem(arg1));
1360   if (sig.IsNull())
1361     { sout<<"Pas un nom de Signature : "<<arg1<<endl;  return IFSelect_RetError;  }
1362   Handle(IFSelect_DispPerSignature) disp = new IFSelect_DispPerSignature;
1363   disp->SetSignCounter (new IFSelect_SignCounter(sig));
1364   return pilot->RecordItem(disp);
1365 }
1366
1367
1368 static IFSelect_ReturnStatus fun56
1369   (const Handle(IFSelect_SessionPilot)& pilot)
1370 {
1371   Handle(IFSelect_WorkSession) WS = pilot->Session();
1372   Standard_Integer argc = pilot->NbWords();
1373   const Standard_CString arg1 = pilot->Arg(1);
1374 //        ****    Dispatch           ****
1375   Handle(Message_Messenger) sout = Message::DefaultMessenger();
1376   if (argc < 2) { sout<<"Donner Nom du Dispatch"<<endl;  return IFSelect_RetError; }
1377   DeclareAndCast(IFSelect_Dispatch,disp,WS->NamedItem(arg1));
1378   if (disp.IsNull()) { sout<<"Pas un dispatch : "<<arg1<<endl; return IFSelect_RetError;  }
1379   Standard_Integer num = WS->DispatchRank(disp);
1380   sout<<"Dispatch de Nom : "<<arg1<<" , en ShareOut, Numero "<<num<<" : ";
1381   Handle(IFSelect_Selection) sel = WS->ItemSelection(disp);
1382   Handle(TCollection_HAsciiString) selname = WS->Name(sel);
1383   if (sel.IsNull())  sout<<"Pas de Selection Finale"<<endl;
1384   else if (selname.IsNull()) sout<<"Selection Finale : #"<<WS->ItemIdent(sel)<<endl;
1385   else sout<<"Selection Finale : "<<selname->ToCString()<<endl;
1386   if (disp->HasRootName()) sout<<"-- Racine nom de fichier : "
1387     <<disp->RootName()->ToCString()<<endl;
1388   return IFSelect_RetVoid;
1389 }
1390
1391 static IFSelect_ReturnStatus fun57
1392   (const Handle(IFSelect_SessionPilot)& pilot)
1393 {
1394   Handle(IFSelect_WorkSession) WS = pilot->Session();
1395   Standard_Integer argc = pilot->NbWords();
1396   const Standard_CString arg1 = pilot->Arg(1);
1397 //        ****    Remove           ****
1398   Handle(Message_Messenger) sout = Message::DefaultMessenger();
1399   if (argc < 2) { sout<<"Give Name to Remove !"<<endl;  return IFSelect_RetError; }
1400   if (!WS->RemoveNamedItem(arg1)) return IFSelect_RetFail;
1401   return IFSelect_RetDone;
1402 }
1403
1404 static IFSelect_ReturnStatus fun58
1405   (const Handle(IFSelect_SessionPilot)& pilot)
1406 {
1407   Handle(IFSelect_WorkSession) WS = pilot->Session();
1408   Standard_Integer argc = pilot->NbWords();
1409   const Standard_CString arg1 = pilot->Arg(1);
1410 //        ****    EvalDisp          ****
1411   Handle(Message_Messenger) sout = Message::DefaultMessenger();
1412   if (argc < 3) { sout<<"evaldisp mode disp [disp ...] :  Mode + Name(s) of Dispatch(es). Mode:\n"
1413                     <<"  0 brief  1 +forgotten ents  2 +duplicata  3 1+2"<<endl
1414                     <<"See also : evaladisp  writedisp  xsplit"<<endl;
1415                   return IFSelect_RetVoid;  }
1416   Standard_Boolean OK = Standard_True;
1417   Standard_Integer i , mode = atoi(arg1);  sout<<" Mode "<<mode<<"\n";
1418   for (i = 2; i < argc; i ++) {
1419     DeclareAndCast(IFSelect_Dispatch,disp,WS->NamedItem(pilot->Arg(i)));
1420     if (disp.IsNull())
1421       { sout<<"Not a dispatch:"<<pilot->Arg(i)<<endl; OK = Standard_False; }
1422   }
1423   if (!OK) {
1424     sout<<"Some of the parameters are not correct"<<endl;
1425     return IFSelect_RetError;
1426   }
1427
1428   WS->ClearShareOut(Standard_True);
1429   for (i = 2; i < argc; i ++) {
1430     DeclareAndCast(IFSelect_Dispatch,disp,WS->NamedItem(pilot->Arg(i)));
1431     WS->SetActive(disp,Standard_True);
1432   }
1433 //      WS->EvaluateDispatch(disp,mode);
1434   WS->EvaluateComplete(mode);
1435   return IFSelect_RetVoid;
1436 }
1437
1438
1439 static IFSelect_ReturnStatus fun_evaladisp
1440   (const Handle(IFSelect_SessionPilot)& pilot)
1441 {
1442   Handle(IFSelect_WorkSession) WS = pilot->Session();
1443   Standard_Integer argc = pilot->NbWords();
1444   const Standard_CString arg1 = pilot->Arg(1);
1445 //        ****    EvalADisp [GiveList]         ****
1446   Handle(Message_Messenger) sout = Message::DefaultMessenger();
1447   if (argc < 3) { sout<<"evaladisp mode(=0-1-2-3) disp [givelist] :  Mode + Dispatch [+ GiveList]\n  If GiveList not given, computed from Selection of the Dispatch. Mode:\n"
1448                     <<"  0 brief  1 +forgotten ents  2 +duplicata  3 1+2"<<endl
1449                     <<"See also : writedisp"<<endl;
1450                   return IFSelect_RetVoid;  }
1451   if (arg1[1] != '\0') { sout<<"first parameter : mode, must be a number between 0 and 3"<<endl; return IFSelect_RetError; }
1452   Standard_Integer mode = atoi(arg1);  sout<<" Mode "<<mode<<"\n";
1453 //  DeclareAndCast(IFSelect_Dispatch,disp,WS->NamedItem(pilot->Arg(2)));
1454   Handle(IFSelect_Dispatch) disp = IFSelect_Functions::GiveDispatch (WS,pilot->Arg(2),Standard_True);
1455   if (disp.IsNull())
1456     { sout<<"Not a dispatch:"<<pilot->Arg(2)<<endl; return IFSelect_RetError; }
1457   Handle(IFSelect_Selection) selsav = disp->FinalSelection();
1458   Handle(IFSelect_Selection) sel;
1459   if (argc > 3) {
1460     Handle(IFSelect_SelectPointed) sp = new IFSelect_SelectPointed;
1461     Handle(TColStd_HSequenceOfTransient) list = IFSelect_Functions::GiveList
1462       (pilot->Session(),pilot->CommandPart(3));
1463     Standard_Integer nb = (list.IsNull() ? 0 : list->Length());
1464     if (nb > 0)  {  sp->AddList (list);  sel = sp;  }
1465   }
1466
1467   if (sel.IsNull() && selsav.IsNull())
1468     { sout<<"No Selection nor GiveList defined"<<endl; return IFSelect_RetError; }
1469   if (sel.IsNull() && !selsav.IsNull()) {
1470     if (argc > 3) sout<<"GiveList is empty, hence computed from the Selection of the Dispatch"<<endl;
1471     sel = selsav;
1472   }
1473   disp->SetFinalSelection(sel);
1474 //  WS->ClearShareOut(Standard_True);
1475 //  WS->SetActive(disp,Standard_True);
1476   WS->EvaluateDispatch(disp,mode);
1477   disp->SetFinalSelection(selsav);
1478
1479   return IFSelect_RetVoid;
1480 }
1481
1482 static IFSelect_ReturnStatus fun_writedisp
1483   (const Handle(IFSelect_SessionPilot)& pilot)
1484 {
1485   Handle(IFSelect_WorkSession) WS = pilot->Session();
1486   Standard_Integer argc = pilot->NbWords();
1487   const Standard_CString arg1 = pilot->Arg(1);
1488 //        ****    EvalADisp [GiveList]         ****
1489   Handle(Message_Messenger) sout = Message::DefaultMessenger();
1490   if (argc < 3) { sout<<"writedisp filename disp [givelist] :  FileName + Dispatch [+ GiveList]\n  If GiveList not given, computed from Selection of the Dispatch.\n"
1491                     <<"FileName : rootname.ext will gives rootname_1.ext etc...\n"
1492                     <<"  path/rootname.ext gives  path/rootname_1.ext etc...\n"
1493                     <<"See also : evaladisp"<<endl;
1494                   return IFSelect_RetVoid;  }
1495   TCollection_AsciiString prefix,rootname,suffix;
1496   SplitFileName (arg1,prefix,rootname,suffix);
1497   if (rootname.Length() == 0 || suffix.Length() == 0) {
1498     sout<<"Empty Root Name or Extension"<<endl;
1499     return IFSelect_RetError;
1500   }
1501
1502 //  DeclareAndCast(IFSelect_Dispatch,disp,WS->NamedItem(pilot->Arg(2)));
1503   Handle(IFSelect_Dispatch) disp = IFSelect_Functions::GiveDispatch (WS,pilot->Arg(2),Standard_True);
1504   if (disp.IsNull())
1505     { sout<<"Not a dispatch:"<<pilot->Arg(2)<<endl; return IFSelect_RetError; }
1506   Handle(IFSelect_Selection) selsav = disp->FinalSelection();
1507   Handle(IFSelect_Selection) sel;
1508   if (argc > 3) {
1509     Handle(IFSelect_SelectPointed) sp = new IFSelect_SelectPointed;
1510     Handle(TColStd_HSequenceOfTransient) list = IFSelect_Functions::GiveList
1511       (pilot->Session(),pilot->CommandPart(3));
1512     Standard_Integer nb = (list.IsNull() ? 0 : list->Length());
1513     if (nb > 0)  {  sp->AddList (list);  sel = sp;  }
1514   }
1515
1516   if (sel.IsNull() && selsav.IsNull())
1517     { sout<<"No Selection nor GiveList defined"<<endl; return IFSelect_RetError; }
1518   if (sel.IsNull() && !selsav.IsNull()) {
1519     if (argc > 3) sout<<"GiveList is empty, hence computed from the Selection of the Dispatch"<<endl;
1520     sel = selsav;
1521   }
1522
1523   WS->ClearShareOut(Standard_True);
1524   disp->SetFinalSelection(sel);
1525   WS->SetActive(disp,Standard_True);
1526   WS->BeginSentFiles(Standard_True);
1527
1528   WS->SetFilePrefix    (prefix.ToCString());
1529   WS->SetFileExtension (suffix.ToCString());
1530   WS->SetFileRoot(disp,rootname.ToCString());
1531
1532   Standard_Boolean OK = WS->SendSplit();
1533   disp->SetFinalSelection(selsav);
1534   return (OK ? IFSelect_RetDone : IFSelect_RetFail);
1535 }
1536
1537
1538 static IFSelect_ReturnStatus fun59
1539   (const Handle(IFSelect_SessionPilot)& pilot)
1540 {
1541   Handle(IFSelect_WorkSession) WS = pilot->Session();
1542   Standard_Integer argc = pilot->NbWords();
1543   const Standard_CString arg1 = pilot->Arg(1);
1544 //        ****    EvalComplete      ****
1545   Standard_Integer mode = 0;
1546   Handle(Message_Messenger) sout = Message::DefaultMessenger();
1547   if (argc < 2) sout << " -- mode par defaut 0\n";
1548   else { mode = atoi(arg1); sout << " -- mode : " << mode << endl;  }
1549   WS->EvaluateComplete(mode);  return IFSelect_RetVoid;
1550 }
1551
1552 static IFSelect_ReturnStatus fun60
1553   (const Handle(IFSelect_SessionPilot)& pilot)
1554 {
1555   Handle(IFSelect_WorkSession) WS = pilot->Session();
1556 //        ****    LastRunCheckList    ****
1557   Interface_CheckIterator chlist = WS->LastRunCheckList();
1558   Handle(IFSelect_CheckCounter) counter = new IFSelect_CheckCounter(0);
1559   counter->Analyse(chlist,WS->Model(),Standard_False);
1560   counter->PrintCount (Message::DefaultMessenger());
1561   return IFSelect_RetVoid;
1562 }
1563
1564 static IFSelect_ReturnStatus fun61
1565   (const Handle(IFSelect_SessionPilot)& pilot)
1566 {
1567   Handle(IFSelect_WorkSession) WS = pilot->Session();
1568   Standard_Integer argc = pilot->NbWords();
1569   const Standard_CString arg1 = pilot->Arg(1);
1570 //        ****    RunTransformer    ****
1571   Handle(Message_Messenger) sout = Message::DefaultMessenger();
1572   if (argc < 2) { sout<<"Donner Nom de Transformer"<<endl; return IFSelect_RetError;  }
1573   DeclareAndCast(IFSelect_Transformer,tsf,WS->NamedItem(arg1));
1574   Standard_Integer effect = WS->RunTransformer(tsf);
1575   switch (effect) {
1576     case -4 : sout<<"Edition sur place, nouveau Protocole, erreur recalcul graphe"<<endl; break;
1577     case -3 : sout<<"Erreur, Transformation ignoree"<<endl; break;
1578     case -2 : sout<<"Erreur sur edition sur place, risque de corruption (verifier)"<<endl; break;
1579     case -1 : sout<<"Erreur sur edition locale, risque de corruption (verifier)"<<endl; break;
1580     case  0 :
1581       if   (tsf.IsNull()) sout<<"Erreur, pas un Transformer: "<<arg1<<endl;
1582       else sout<<"Execution non faite"<<endl;
1583               break;
1584     case  1 : sout<<"Transformation locale (graphe non touche)"<<endl; break;
1585     case  2 : sout<<"Edition sur place (graphe recalcule)"<<endl;  break;
1586     case  3 : sout<<"Modele reconstruit"<<endl; break;
1587     case  4 : sout<<"Edition sur place, nouveau Protocole"<<endl;  break;
1588     case  5 : sout<<"Nouveau Modele avec nouveau Protocole"<<endl; break;
1589     default : break;
1590   }
1591   return ((effect > 0) ? IFSelect_RetDone : IFSelect_RetFail);
1592 }
1593
1594 static IFSelect_ReturnStatus fun62
1595   (const Handle(IFSelect_SessionPilot)& pilot)
1596 {
1597   Handle(IFSelect_WorkSession) WS = pilot->Session();
1598 //        ****    TransformStandard Copy         ****
1599   return pilot->RecordItem(WS->NewTransformStandard(Standard_True));
1600 }
1601
1602 static IFSelect_ReturnStatus fun63
1603   (const Handle(IFSelect_SessionPilot)& pilot)
1604 {
1605   Handle(IFSelect_WorkSession) WS = pilot->Session();
1606 //        ****    TransformStandard OntheSpot         ****
1607   return pilot->RecordItem(WS->NewTransformStandard(Standard_False));
1608 }
1609
1610 static IFSelect_ReturnStatus fun6465
1611   (const Handle(IFSelect_SessionPilot)& pilot)
1612 {
1613   Handle(IFSelect_WorkSession) WS = pilot->Session();
1614   Standard_Integer argc = pilot->NbWords();
1615   const Standard_CString arg1 = pilot->Arg(1);
1616 //        ****    Run Modifier avec Standard Copy     ****
1617 //        ****    Run Modifier avec OnTheSpot         ****
1618   Standard_Boolean runcopy = (pilot->Arg(0)[3] == 'c');
1619 //  soit c est un nom, sinon c est une commande
1620   Handle(IFSelect_Modifier) modif;
1621   if (WS->NameIdent(arg1) > 0)
1622     modif = GetCasted(IFSelect_Modifier,WS->NamedItem(arg1));
1623   else {
1624     pilot->RemoveWord(0);    // c etait la commande run
1625     pilot->Perform();
1626     modif = GetCasted(IFSelect_Modifier,pilot->RecordedItem());
1627   }
1628   Handle(Message_Messenger) sout = Message::DefaultMessenger();
1629   if (modif.IsNull())
1630     { sout<<"Pas un nom de Modifier : "<<arg1<<endl;  return IFSelect_RetError;  }
1631
1632   Handle(TColStd_HSequenceOfTransient) list;
1633   Handle(IFSelect_SelectPointed) sp;
1634   if (argc > 2) {
1635     list = IFSelect_Functions::GiveList (WS,pilot->CommandPart(2));
1636     sp = new IFSelect_SelectPointed;
1637     sp->SetList (list);
1638   }
1639
1640   Standard_Integer effect = 0;
1641   effect = WS->RunModifierSelected (modif,sp,runcopy);
1642 //      sout<<"Modifier applique sur TransformStandard #"<<WS->ItemIdent(tsf)<<endl;
1643   switch (effect) {
1644     case -4 : sout<<"Edition sur place, nouveau Protocole, erreur recalcul graphe"<<endl; break;
1645     case -3 : sout<<"Erreur, Transformation ignoree"<<endl; break;
1646     case -2 : sout<<"Erreur sur edition sur place, risque de corruption (verifier)"<<endl; break;
1647     case -1 : sout<<"Erreur sur edition locale, risque de corruption (verifier)"<<endl; break;
1648     case  0 :
1649       if   (modif.IsNull()) sout<<"Erreur, pas un Modifier: "<<arg1<<endl;
1650       else sout<<"Execution non faite"<<endl;
1651               break;
1652     case  1 : sout<<"Transformation locale (graphe non touche)"<<endl; break;
1653     case  2 : sout<<"Edition sur place (graphe recalcule)"<<endl;  break;
1654     case  3 : sout<<"Modele reconstruit"<<endl; break;
1655     case  4 : sout<<"Edition sur place, nouveau Protocole"<<endl;  break;
1656     case  5 : sout<<"Nouveau Modele avec nouveau Protocole"<<endl; break;
1657     default : break;
1658   }
1659   return ((effect > 0) ? IFSelect_RetDone : IFSelect_RetFail);
1660 }
1661
1662 static IFSelect_ReturnStatus fun66
1663   (const Handle(IFSelect_SessionPilot)& pilot)
1664 {
1665 //        ****    (xset) ModifReorder         ****
1666   char opt = ' ';
1667   Standard_Integer argc = pilot->NbWords();
1668   if (argc >= 2) opt = pilot->Word(1).Value(1);
1669   Handle(Message_Messenger) sout = Message::DefaultMessenger();
1670   if (opt != 'f' && opt != 'l')
1671     { sout<<"Donner option : f -> root-first  l -> root-last"<<endl; return IFSelect_RetError; }
1672   return pilot->RecordItem(new IFSelect_ModifReorder(opt == 'l'));
1673 }
1674
1675 static IFSelect_ReturnStatus fun70
1676   (const Handle(IFSelect_SessionPilot)& pilot)
1677 {
1678   Handle(IFSelect_WorkSession) WS = pilot->Session();
1679   Standard_Integer argc = pilot->NbWords();
1680   const Standard_CString arg1 = pilot->Arg(1);
1681 //        ****    SelToggle         ****
1682   Handle(Message_Messenger) sout = Message::DefaultMessenger();
1683   if (argc < 2) { sout<<"Donner Nom de Selection"<<endl; return IFSelect_RetError;  }
1684   DeclareAndCast(IFSelect_Selection,sel,WS->NamedItem(arg1));
1685   if (!WS->ToggleSelectExtract(sel))
1686     { sout<<"Pas une SelectExtract : "<<arg1<<endl; return IFSelect_RetFail;  }
1687   if (WS->IsReversedSelectExtract(sel)) sout<<arg1<<" a present Reversed"<<endl;
1688   else sout<<arg1<<" a present Directe"<<endl;
1689   return IFSelect_RetDone;
1690 }
1691
1692 static IFSelect_ReturnStatus fun71
1693   (const Handle(IFSelect_SessionPilot)& pilot)
1694 {
1695   Handle(IFSelect_WorkSession) WS = pilot->Session();
1696   Standard_Integer argc = pilot->NbWords();
1697   const Standard_CString arg1 = pilot->Arg(1);
1698   const Standard_CString arg2 = pilot->Arg(2);
1699 //        ****    SelInput          ****
1700   Handle(Message_Messenger) sout = Message::DefaultMessenger();
1701   if (argc < 3) { sout<<"Donner Noms Selections cible et input"<<endl; return IFSelect_RetError; }
1702   DeclareAndCast(IFSelect_Selection,sel,WS->NamedItem(arg1));
1703   DeclareAndCast(IFSelect_Selection,sou,WS->NamedItem(arg2));
1704   if (sel.IsNull() || sou.IsNull())
1705     {  sout<<"Incorrect : "<<arg1<<","<<arg2<<endl;  return IFSelect_RetError;  }
1706   if (!WS->SetInputSelection(sel,sou)) { 
1707     sout<<"Nom incorrect ou Selection "<<arg1<<" ni Extract ni Deduct"<<endl;
1708     return IFSelect_RetFail;
1709   }
1710   return IFSelect_RetDone;
1711 }
1712
1713 static IFSelect_ReturnStatus fun72
1714   (const Handle(IFSelect_SessionPilot)& pilot)
1715 {
1716   Handle(IFSelect_WorkSession) WS = pilot->Session();
1717 //        ****    SelModelRoots     ****
1718   return pilot->RecordItem (new IFSelect_SelectModelRoots);
1719 }
1720
1721 static IFSelect_ReturnStatus fun73
1722   (const Handle(IFSelect_SessionPilot)& pilot)
1723 {
1724   Handle(IFSelect_WorkSession) WS = pilot->Session();
1725   Standard_Integer argc = pilot->NbWords();
1726   const Standard_CString arg1 = pilot->Arg(1);
1727   const Standard_CString arg2 = pilot->Arg(2);
1728 //        ****    SelRange          ****
1729   Handle(Message_Messenger) sout = Message::DefaultMessenger();
1730   if (argc >= 2 && arg1[0] == '?') argc = 1;
1731   if (argc < 2) {
1732     sout<<"Donner la description du SelectRange"
1733       <<"    Formes admises :\n <n1> <n2>  : Range de <n1> a <n2>\n"
1734       <<" <n1> tout seul : Range n0 <n1>\n  from <n1>  : Range From <n1>\n"
1735       <<"  until <n2> : Range Until <n2>"<<endl;
1736     return IFSelect_RetVoid;
1737   }
1738
1739   Handle(IFSelect_IntParam) low,up;
1740   Handle(IFSelect_SelectRange) sel;
1741 //                                         Range From
1742   if (pilot->Word(1).IsEqual("from")) {
1743     if (argc < 3) { sout<<"Forme admise : from <i>"<<endl; return IFSelect_RetError; }
1744     low = GetCasted(IFSelect_IntParam,WS->NamedItem(arg2));
1745     sel = new IFSelect_SelectRange;
1746     sel->SetFrom (low);
1747 //                                         Range Until
1748   } else if (pilot->Word(1).IsEqual("until")) {
1749     if (argc < 3) { sout<<"Forme admise : until <i>"<<endl; return IFSelect_RetError; }
1750     up  = GetCasted(IFSelect_IntParam,WS->NamedItem(arg2));
1751     sel = new IFSelect_SelectRange;
1752     sel->SetUntil (up);
1753 //                                         Range One (n-th)
1754   } else if (argc < 3) {
1755     low = GetCasted(IFSelect_IntParam,WS->NamedItem(arg1));
1756     sel = new IFSelect_SelectRange;
1757     sel->SetOne (low);
1758 //                                         Range (from-to)
1759   } else {
1760     low = GetCasted(IFSelect_IntParam,WS->NamedItem(arg1));
1761     up  = GetCasted(IFSelect_IntParam,WS->NamedItem(arg2));
1762     sel = new IFSelect_SelectRange;
1763     sel->SetRange (low,up);
1764   }
1765   return pilot->RecordItem (sel);
1766 }
1767
1768 static IFSelect_ReturnStatus fun74
1769   (const Handle(IFSelect_SessionPilot)& pilot)
1770 {
1771   Handle(IFSelect_WorkSession) WS = pilot->Session();
1772 //        ****    SelRoots          ****
1773   return pilot->RecordItem (new IFSelect_SelectRoots);
1774 }
1775
1776 static IFSelect_ReturnStatus fun75
1777   (const Handle(IFSelect_SessionPilot)& pilot)
1778 {
1779   Handle(IFSelect_WorkSession) WS = pilot->Session();
1780 //        ****    SelShared         ****
1781   return pilot->RecordItem (new IFSelect_SelectShared);
1782 }
1783
1784 static IFSelect_ReturnStatus fun76
1785   (const Handle(IFSelect_SessionPilot)& pilot)
1786 {
1787   Handle(IFSelect_WorkSession) WS = pilot->Session();
1788   Standard_Integer argc = pilot->NbWords();
1789   const Standard_CString arg1 = pilot->Arg(1);
1790   const Standard_CString arg2 = pilot->Arg(2);
1791 //        ****    SelDiff           ****
1792   Handle(IFSelect_Selection) sel = new IFSelect_SelectDiff;
1793   if (sel.IsNull()) return IFSelect_RetFail;
1794   Handle(Message_Messenger) sout = Message::DefaultMessenger();
1795   if (argc < 3) sout<<"Diff sans input : ne pas oublier de les definir (ctlmain, ctlsec)!"<<endl;
1796   DeclareAndCast(IFSelect_Selection,selmain,WS->NamedItem(arg1));
1797   DeclareAndCast(IFSelect_Selection,selsec ,WS->NamedItem(arg2));
1798   if (argc >= 2)
1799     if (!WS->SetControl(sel,selmain,Standard_True))
1800       sout<<"Echec ControlMain:"<<arg1<<" , a refaire (ctlmain)"<<endl;
1801   if (argc >= 3)
1802     if (!WS->SetControl(sel,selsec,Standard_False))
1803       sout<<"Echec ControlSecond:"<<arg2<<" , a refaire (ctlsec)"<<endl;
1804   return pilot->RecordItem (sel);
1805 }
1806
1807 static IFSelect_ReturnStatus fun77
1808   (const Handle(IFSelect_SessionPilot)& pilot)
1809 {
1810   Handle(IFSelect_WorkSession) WS = pilot->Session();
1811   Standard_Integer argc = pilot->NbWords();
1812   const Standard_CString arg1 = pilot->Arg(1);
1813   const Standard_CString arg2 = pilot->Arg(2);
1814 //        ****    SelControlMain       ****
1815   Handle(Message_Messenger) sout = Message::DefaultMessenger();
1816   if (argc < 3) { sout<<"Donner Noms de Control et MainInput"<<endl; return IFSelect_RetError; }
1817   DeclareAndCast(IFSelect_Selection,sel,WS->NamedItem(arg1));
1818   DeclareAndCast(IFSelect_Selection,selmain,WS->NamedItem(arg2));
1819   if (WS->SetControl(sel,selmain,Standard_True)) return IFSelect_RetDone;
1820   sout<<"Nom incorrect ou Selection "<<arg1<<" pas de type Control"<<endl;
1821   return IFSelect_RetFail;
1822 }
1823
1824 static IFSelect_ReturnStatus fun78
1825   (const Handle(IFSelect_SessionPilot)& pilot)
1826 {
1827   Handle(IFSelect_WorkSession) WS = pilot->Session();
1828   Standard_Integer argc = pilot->NbWords();
1829   const Standard_CString arg1 = pilot->Arg(1);
1830   const Standard_CString arg2 = pilot->Arg(2);
1831 //        ****    SelControlSecond       ****
1832   Handle(Message_Messenger) sout = Message::DefaultMessenger();
1833   if (argc < 3) { sout<<"Donner Noms de Control et SecondInput"<<endl; return IFSelect_RetError; }
1834   DeclareAndCast(IFSelect_Selection,sel,WS->NamedItem(arg1));
1835   DeclareAndCast(IFSelect_Selection,seldif,WS->NamedItem(arg2));
1836   if (WS->SetControl(sel,seldif,Standard_False))  return IFSelect_RetDone;
1837   sout<<"Nom incorrect ou Selection "<<arg1<<" pas de type Control"<<endl;
1838   return IFSelect_RetFail;
1839 }
1840
1841 static IFSelect_ReturnStatus fun79
1842   (const Handle(IFSelect_SessionPilot)& pilot)
1843 {
1844   Handle(IFSelect_WorkSession) WS = pilot->Session();
1845 //        ****    SelModelAll       ****
1846   return pilot->RecordItem (new IFSelect_SelectModelEntities);
1847 }
1848
1849 static IFSelect_ReturnStatus fun80
1850   (const Handle(IFSelect_SessionPilot)& pilot)
1851 {
1852   Handle(IFSelect_WorkSession) WS = pilot->Session();
1853   Standard_Integer argc = pilot->NbWords();
1854   const Standard_CString arg1 = pilot->Arg(1);
1855   const Standard_CString arg2 = pilot->Arg(2);
1856 //        ****    SelCombAdd        ****
1857   Handle(Message_Messenger) sout = Message::DefaultMessenger();
1858   if (argc < 3) { sout<<"Donner n0 Combine et une Input"<<endl; return IFSelect_RetError; }
1859   DeclareAndCast(IFSelect_Selection,sel,WS->NamedItem(arg1));
1860   DeclareAndCast(IFSelect_Selection,seladd,WS->NamedItem(arg2));
1861   if (WS->CombineAdd(sel,seladd)) return IFSelect_RetDone;
1862   sout<<"Nom incorrect ou Selection "<<arg1<<" pas Combine"<<endl;
1863   return IFSelect_RetFail;
1864 }
1865
1866 static IFSelect_ReturnStatus fun81
1867   (const Handle(IFSelect_SessionPilot)& pilot)
1868 {
1869   Handle(IFSelect_WorkSession) WS = pilot->Session();
1870   Standard_Integer argc = pilot->NbWords();
1871   const Standard_CString arg1 = pilot->Arg(1);
1872   const Standard_CString arg2 = pilot->Arg(2);
1873 //        ****    SelCombRem        ****
1874   Handle(Message_Messenger) sout = Message::DefaultMessenger();
1875   if (argc < 3) { sout<<"Donner n0 Combine et RANG a supprimer"<<endl; return IFSelect_RetError; }
1876   DeclareAndCast(IFSelect_Selection,sel,WS->NamedItem(arg1));
1877   DeclareAndCast(IFSelect_Selection,inp,WS->NamedItem(arg2));
1878   if (WS->CombineRemove(sel,inp)) return IFSelect_RetDone;
1879   sout<<"Nom incorrect ou Selection "<<arg1<<" ni Union ni Intersection"<<endl;
1880   return IFSelect_RetFail;
1881 }
1882
1883 static IFSelect_ReturnStatus fun82
1884   (const Handle(IFSelect_SessionPilot)& pilot)
1885 {
1886   Handle(IFSelect_WorkSession) WS = pilot->Session();
1887   Standard_Integer argc = pilot->NbWords();
1888   const Standard_CString arg1 = pilot->Arg(1);
1889 //        ****    SelEntNumber      ****
1890   Handle(Message_Messenger) sout = Message::DefaultMessenger();
1891   if (argc < 2) { sout<<"Donner Nom IntParam pour n0 Entite"<<endl; return IFSelect_RetError; }
1892   DeclareAndCast(IFSelect_IntParam,par,WS->NamedItem(arg1));
1893   Handle(IFSelect_SelectEntityNumber) sel = new IFSelect_SelectEntityNumber;
1894   sel->SetNumber(par);
1895   return pilot->RecordItem (sel);
1896 }
1897
1898 static IFSelect_ReturnStatus fun83
1899   (const Handle(IFSelect_SessionPilot)& pilot)
1900 {
1901   Handle(IFSelect_WorkSession) WS = pilot->Session();
1902 //        ****    SelUnion          ****
1903   return pilot->RecordItem (new IFSelect_SelectUnion);
1904 }
1905
1906 static IFSelect_ReturnStatus fun84
1907   (const Handle(IFSelect_SessionPilot)& pilot)
1908 {
1909   Handle(IFSelect_WorkSession) WS = pilot->Session();
1910 //        ****    SelIntersection   ****
1911   return pilot->RecordItem (new IFSelect_SelectIntersection);
1912 }
1913
1914 static IFSelect_ReturnStatus fun85
1915   (const Handle(IFSelect_SessionPilot)& pilot)
1916 {
1917   Standard_Integer argc = pilot->NbWords();
1918   const Standard_CString arg1 = pilot->Arg(1);
1919 //        ****    SelTextType Exact ****
1920   Handle(Message_Messenger) sout = Message::DefaultMessenger();
1921   if (argc < 2) { sout<<"Donner le TYPE a selectionner"<<endl; return IFSelect_RetError; }
1922   return pilot->RecordItem (new IFSelect_SelectSignature
1923                             (new IFSelect_SignType,arg1,Standard_True));
1924 }
1925
1926 static IFSelect_ReturnStatus fun86
1927   (const Handle(IFSelect_SessionPilot)& pilot)
1928 {
1929 //        ****    SelErrorEntities  ****
1930   return pilot->RecordItem (new IFSelect_SelectErrorEntities);
1931 }
1932       
1933 static IFSelect_ReturnStatus fun87
1934   (const Handle(IFSelect_SessionPilot)& pilot)
1935 {
1936 //        ****    SelUnknownEntities  **
1937   return pilot->RecordItem (new IFSelect_SelectUnknownEntities);
1938 }
1939
1940 static IFSelect_ReturnStatus fun88
1941   (const Handle(IFSelect_SessionPilot)& pilot)
1942 {
1943 //        ****    SelSharing        ****
1944   return pilot->RecordItem (new IFSelect_SelectSharing);
1945 }
1946
1947 static IFSelect_ReturnStatus fun89
1948   (const Handle(IFSelect_SessionPilot)& pilot)
1949 {
1950   Standard_Integer argc = pilot->NbWords();
1951   const Standard_CString arg1 = pilot->Arg(1);
1952 //        ****    SelTextType Contain **
1953   Handle(Message_Messenger) sout = Message::DefaultMessenger();
1954   if (argc < 2) { sout<<"Donner le TYPE a selectionner"<<endl; return IFSelect_RetError; }
1955   return pilot->RecordItem (new IFSelect_SelectSignature
1956                             (new IFSelect_SignType,arg1,Standard_False));
1957 }
1958
1959 static IFSelect_ReturnStatus fun90
1960   (const Handle(IFSelect_SessionPilot)& pilot)
1961 {
1962 //        ****    SelPointed        ****
1963   Handle(IFSelect_SelectPointed) sp = new IFSelect_SelectPointed;
1964   if (pilot->NbWords() > 1) {
1965     Handle(TColStd_HSequenceOfTransient) list = IFSelect_Functions::GiveList
1966     (pilot->Session(),pilot->CommandPart(1));
1967     if (list.IsNull()) return IFSelect_RetFail;
1968     Handle(Message_Messenger) sout = Message::DefaultMessenger();
1969     sout<<"SelectPointed : "<<list->Length()<<" entities"<<endl;
1970     sp->AddList (list);
1971   }
1972   return pilot->RecordItem (sp);
1973 }
1974
1975 static IFSelect_ReturnStatus fun91
1976   (const Handle(IFSelect_SessionPilot)& pilot)
1977 {
1978   Handle(IFSelect_WorkSession) WS = pilot->Session();
1979   Standard_Integer argc = pilot->NbWords();
1980   const Standard_CString arg1 = pilot->Arg(1);
1981 //        ****    SetPointed (edit) / SetList (edit)    ****
1982   Handle(Message_Messenger) sout = Message::DefaultMessenger();
1983   if (argc < 2) {
1984     sout<<"Donner NOM SelectPointed + Option(s) :\n"
1985         <<" aucune : liste des entites pointees\n"
1986         <<" 0: Clear  +nn ajout entite nn  -nn enleve nn  /nn toggle nn"<<endl;
1987         return IFSelect_RetError;
1988   }
1989   DeclareAndCast(IFSelect_SelectPointed,sp,WS->NamedItem(arg1));
1990   if (sp.IsNull()) { sout<<"Pas une SelectPointed:"<<arg1<<endl; return IFSelect_RetError; }
1991   Handle(Interface_InterfaceModel) model = WS->Model();  // pour Print
1992   if (argc == 2) {    // listage simple
1993     Standard_Integer nb = sp->NbItems();
1994     sout<<" SelectPointed : "<<arg1<<" : "<<nb<<" Items :"<<endl;
1995     for (Standard_Integer i = 1; i <= nb; i ++) {
1996       Handle(Standard_Transient) pointed = sp->Item(i);
1997       Standard_Integer id = WS->StartingNumber(pointed);
1998       if (id == 0) sout <<" (inconnu)";
1999       else  {  sout<<"  "; model->Print(pointed,sout);  }
2000     }
2001     if (nb > 0) sout<<endl;
2002     return IFSelect_RetDone;
2003   }
2004
2005   for (Standard_Integer ia = 2; ia < argc ; ia ++) {
2006     const TCollection_AsciiString argi = pilot->Word(ia);
2007     Standard_Integer id = pilot->Number(&(argi.ToCString())[1]);
2008     if (id == 0) {
2009       if (!argi.IsEqual("0")) sout<<"Incorrect,ignore:"<<argi<<endl;
2010       else {  sout<<"Clear SelectPointed"<<endl; sp->Clear(); }
2011     } else if (argi.Value(1) == '-') {
2012       Handle(Standard_Transient) item = WS->StartingEntity(id);
2013       if (sp->Remove(item)) sout<<"Removed:no."<<id;
2014       else sout<<" Echec Remove "<<id;
2015       sout<<": "; model->Print(item,sout);  sout<<endl;
2016     } else if (argi.Value(1) == '/') {
2017       Handle(Standard_Transient) item = WS->StartingEntity(id);
2018       if (sp->Remove(item)) sout<<"Toggled:n0."<<id;
2019       else sout<<" Echec Toggle "<<id;
2020       sout<<": "; model->Print(item,sout);  sout<<endl;
2021     } else if (argi.Value(1) == '+') {
2022       Handle(Standard_Transient) item = WS->StartingEntity(id);
2023       if (sp->Add(item)) sout<<"Added:no."<<id;
2024       else sout<<" Echec Add "<<id;
2025       sout<<": "; model->Print(item,sout);  sout<<endl;
2026     } else {
2027       sout<<"Ignore:"<<argi<<" , donner n0 PRECEDE de + ou - ou /"<<endl;
2028     }
2029   }
2030   return IFSelect_RetDone;
2031 }
2032
2033 static IFSelect_ReturnStatus fun92
2034   (const Handle(IFSelect_SessionPilot)& pilot)
2035 {
2036   Handle(IFSelect_WorkSession) WS = pilot->Session();
2037 //        ****    SelIncorrectEntities  ****
2038   WS->ComputeCheck();
2039   return pilot->RecordItem (new IFSelect_SelectIncorrectEntities);
2040 }
2041
2042 static IFSelect_ReturnStatus fun93
2043   (const Handle(IFSelect_SessionPilot)& pilot)
2044 {
2045   Standard_Integer argc = pilot->NbWords();
2046   const Standard_CString arg1 = pilot->Arg(1);
2047   const Standard_CString arg2 = pilot->Arg(2);
2048   Handle(IFSelect_WorkSession) WS = pilot->Session();
2049 //        ****    SelSignature        ****
2050   Handle(Message_Messenger) sout = Message::DefaultMessenger();
2051   if (argc < 3) { sout<<"Give name of Signature or Counter, text + option exact(D) else contains"<<endl; return IFSelect_RetError; }
2052   Standard_Boolean exact = Standard_True;
2053   if (argc > 3) { if (pilot->Arg(3)[0] == 'c') exact = Standard_False; }
2054
2055   DeclareAndCast(IFSelect_Signature,sign,WS->NamedItem(arg1));
2056   DeclareAndCast(IFSelect_SignCounter,cnt,WS->NamedItem(arg1));
2057   Handle(IFSelect_SelectSignature) sel;
2058
2059   if (!sign.IsNull())     sel = new IFSelect_SelectSignature (sign,arg2,exact);
2060   else if (!cnt.IsNull()) sel = new IFSelect_SelectSignature (cnt,arg2,exact);
2061   else { sout<<arg1<<":neither Signature nor Counter"<<endl; return IFSelect_RetError; }
2062
2063   return pilot->RecordItem(sel);
2064 }
2065
2066 static IFSelect_ReturnStatus fun94
2067   (const Handle(IFSelect_SessionPilot)& pilot)
2068 {
2069   Standard_Integer argc = pilot->NbWords();
2070   const Standard_CString arg1 = pilot->Arg(1);
2071   Handle(IFSelect_WorkSession) WS = pilot->Session();
2072 //        ****    SignCounter        ****
2073   Handle(Message_Messenger) sout = Message::DefaultMessenger();
2074   if (argc < 2) { sout<<"Donner nom signature"<<endl; return IFSelect_RetError; }
2075   DeclareAndCast(IFSelect_Signature,sign,WS->NamedItem(arg1));
2076   if (sign.IsNull()) { sout<<arg1<<":pas une signature"<<endl; return IFSelect_RetError; }
2077   Handle(IFSelect_SignCounter) cnt = new IFSelect_SignCounter (sign,Standard_True,Standard_True);
2078   return pilot->RecordItem(cnt);
2079 }
2080
2081 static IFSelect_ReturnStatus funbselected
2082   (const Handle(IFSelect_SessionPilot)& pilot)
2083 {
2084   Standard_Integer argc = pilot->NbWords();
2085   const Standard_CString arg1 = pilot->Arg(1);
2086   Handle(IFSelect_WorkSession) WS = pilot->Session();
2087 //        ****    NbSelected = GraphCounter        ****
2088   Handle(Message_Messenger) sout = Message::DefaultMessenger();
2089   if (argc < 2) { sout<<"Donner nom selection (deduction) a appliquer"<<endl; return IFSelect_RetError; }
2090   DeclareAndCast(IFSelect_SelectDeduct,applied,WS->GiveSelection(arg1));
2091   if (applied.IsNull()) { sout<<arg1<<":pas une SelectDeduct"<<endl; return IFSelect_RetError; }
2092   Handle(IFSelect_GraphCounter) cnt = new IFSelect_GraphCounter (Standard_True,Standard_True);
2093   cnt->SetApplied (applied);
2094   return pilot->RecordItem(cnt);
2095 }
2096
2097 //  #########################################
2098 //  ####    EDITOR  -  EDITFORM          ####
2099 //  #########################################
2100
2101 static IFSelect_ReturnStatus fun_editlist
2102   (const Handle(IFSelect_SessionPilot)& pilot)
2103 {
2104   Standard_Integer argc = pilot->NbWords();
2105   Handle(Message_Messenger) sout = Message::DefaultMessenger();
2106   if (argc < 2) { sout<<"Give the name of an EditForm or an Editor"<<endl;
2107                   return IFSelect_RetError;  }
2108   const Standard_CString arg1 = pilot->Arg(1);
2109   const Standard_CString arg2 = pilot->Arg(2);
2110   Handle(IFSelect_WorkSession) WS = pilot->Session();
2111
2112 //  EditForm
2113
2114   DeclareAndCast(IFSelect_EditForm,edf,WS->NamedItem(arg1));
2115   Handle(IFSelect_Editor) edt;
2116   if (!edf.IsNull()) {
2117     sout<<"Print EditForm "<<arg1<<endl;
2118     edt = edf->Editor();
2119     if (argc < 3) {
2120
2121 //       DEFINITIONS : Editor (direct ou via EditForm)
2122
2123       if (edt.IsNull()) edt = GetCasted(IFSelect_Editor,WS->NamedItem(arg1));
2124       if (edt.IsNull()) return IFSelect_RetVoid;
2125
2126       sout<<"Editor, Label : "<<edt->Label()<<endl;
2127       sout<<endl<<" --  Names (short - complete) + Labels of Values"<<endl;
2128       edt->PrintNames(sout);
2129       sout<<endl<<" --  Definitions  --"<<endl;
2130       edt->PrintDefs (sout);
2131       if (!edf.IsNull()) {
2132         edf->PrintDefs(sout);
2133         sout<<endl<<"To display values, add an option : o original  f final  m modified"<<endl;
2134       }
2135
2136       return IFSelect_RetVoid;
2137
2138     } else {
2139       char opt = arg2[0];
2140       Standard_Integer what = 0;
2141       if (opt == 'o') what = -1;
2142       else if (opt == 'f') what = 1;
2143
2144       edf->PrintValues (sout,what,Standard_False);
2145     }
2146   }
2147
2148   return IFSelect_RetVoid;
2149 }
2150
2151 static IFSelect_ReturnStatus fun_editvalue
2152   (const Handle(IFSelect_SessionPilot)& pilot)
2153 {
2154   Standard_Integer argc = pilot->NbWords();
2155   Handle(Message_Messenger) sout = Message::DefaultMessenger();
2156   if (argc < 3) { sout<<"Give the name of an EditForm + name of Value [+ newvalue or . to nullify]"<<endl;
2157                   return IFSelect_RetError;  }
2158   const Standard_CString arg1 = pilot->Arg(1);
2159   const Standard_CString arg2 = pilot->Arg(2);
2160   Handle(IFSelect_WorkSession) WS = pilot->Session();
2161   DeclareAndCast(IFSelect_EditForm,edf,WS->NamedItem(arg1));
2162   if (edf.IsNull())
2163     {  sout<<"Not an EditForm : "<<arg1<<endl; return IFSelect_RetError;  }
2164   Standard_Integer num = edf->NameNumber (arg2);
2165   if (num == 0) sout<<"Unknown Value Name : "<<arg2<<endl;
2166   if (num <  0) sout<<"Not Extracted Value Name : "<<arg2<<endl;
2167   if (num <= 0) return IFSelect_RetError;
2168
2169   Standard_Boolean islist = edf->Editor()->IsList(num);
2170   Standard_CString name = edf->Editor()->Name(num,Standard_True); // vrai nom
2171   Handle(TColStd_HSequenceOfHAsciiString) listr;
2172   Handle(TCollection_HAsciiString) str;
2173   sout<<"Value Name : "<<name<<(edf->IsModified(num) ? "(already edited) : " : " : ");
2174
2175   if (islist) {
2176     listr = edf->EditedList(num);
2177     if (listr.IsNull()) sout<<"(NULL LIST)"<<endl;
2178     else {
2179       Standard_Integer ilist,nblist = listr->Length();
2180       sout<<"(List : "<<nblist<<" Items)"<<endl;
2181       for (ilist = 1; ilist <= nblist; ilist ++) {
2182         str = listr->Value(ilist);
2183         sout<<"  ["<<ilist<<"]  "<< (str.IsNull() ? "(NULL)" : str->ToCString())<<endl;
2184       }
2185     }
2186     if (argc < 4) sout<<"To Edit, options by editval edit-form value-name ?"<<endl;
2187   } else {
2188     str = edf->EditedValue (num);
2189     sout<<(str.IsNull() ? "(NULL)" : str->ToCString())<<endl;
2190   }
2191   if (argc < 4) return IFSelect_RetVoid;
2192
2193 //  Valeur simple ou liste ?
2194   Standard_Integer numarg = 3;
2195   str.Nullify();
2196
2197   const Standard_CString argval = pilot->Arg(numarg);
2198   if (islist) {
2199     if (argval[0] == '?') {
2200       sout<<"To Edit, options"<<endl<<" + val : add value at end (blanks allowed)"
2201         <<endl<<" +nn text : insert val before item nn"<<endl
2202         <<" nn text : replace item nn with a new value"<<endl
2203         <<" -nn : remove item nn"<<endl<<" . : clear the list"<<endl;
2204       return IFSelect_RetVoid;
2205     }
2206     Standard_Boolean stated = Standard_False;
2207     Handle(IFSelect_ListEditor) listed = edf->ListEditor (num);
2208     if (listed.IsNull()) return IFSelect_RetError;
2209     if (argval[0] == '.') { listr.Nullify();  stated = listed->LoadEdited(listr); }
2210     else if (argval[0] == '+') {
2211       Standard_Integer numadd = 0;
2212       if (argval[1] != '\0') numadd = atoi(argval);
2213       stated = listed->AddValue (new TCollection_HAsciiString(pilot->CommandPart(numarg+1)),numadd);
2214     }
2215     else if (argval[0] == '-') {
2216       Standard_Integer numrem = atoi(argval);
2217       stated = listed->Remove(numrem);
2218     }
2219     else {
2220       Standard_Integer numset = atoi(argval);
2221       if (numset > 0) stated = listed->AddValue
2222         (new TCollection_HAsciiString(pilot->CommandPart(numarg+1)),numset);
2223     }
2224     if (stated) stated = edf->ModifyList (num,listed,Standard_True);
2225     if (stated) sout<<"List Edition done"<<endl;
2226     else sout<<"List Edition not done, option"<<argval<<endl;
2227   } else {
2228     if (argval[0] == '.' && argval[1] == '\0') str.Nullify();
2229     else str = new TCollection_HAsciiString (pilot->CommandPart(numarg));
2230     if (edf->Modify (num,str,Standard_True)) {
2231       sout<<"Now set to "<<(str.IsNull() ? "(NULL)" : str->ToCString())<<endl;
2232     } else {
2233       sout<<"Modify not done"<<endl;  return IFSelect_RetFail;
2234     }
2235   }
2236   return IFSelect_RetDone;
2237 }
2238
2239 static IFSelect_ReturnStatus fun_editclear
2240   (const Handle(IFSelect_SessionPilot)& pilot)
2241 {
2242   Standard_Integer argc = pilot->NbWords();
2243   Handle(Message_Messenger) sout = Message::DefaultMessenger();
2244   if (argc < 2) { sout<<"Give the name of an EditForm [+ name of Value  else all]"<<endl;
2245                   return IFSelect_RetError;  }
2246   const Standard_CString arg1 = pilot->Arg(1);
2247   const Standard_CString arg2 = pilot->Arg(2);
2248   Handle(IFSelect_WorkSession) WS = pilot->Session();
2249   DeclareAndCast(IFSelect_EditForm,edf,WS->NamedItem(arg1));
2250   if (edf.IsNull())
2251     {  sout<<"Not an EditForm : "<<arg1<<endl; return IFSelect_RetError;  }
2252   if (argc < 3) { edf->ClearEdit(); sout<<"All Modifications Cleared"<<endl; }
2253   else {
2254     Standard_Integer num = edf->NameNumber (arg2);
2255     if (num == 0) sout<<"Unknown Value Name : "<<arg2<<endl;
2256     if (num <  0) sout<<"Not Extracted Value Name : "<<arg2<<endl;
2257     if (num <= 0) return IFSelect_RetError;
2258     if (!edf->IsModified(num))
2259       { sout<<"Value "<<arg2<<" was not modified"<<endl; return IFSelect_RetVoid; }
2260     edf->ClearEdit (num);
2261     sout<<"Modification on Value "<<arg2<<" Cleared"<<endl;
2262   }
2263   return IFSelect_RetDone;
2264 }
2265
2266 static IFSelect_ReturnStatus fun_editapply
2267   (const Handle(IFSelect_SessionPilot)& pilot)
2268 {
2269   Standard_Integer argc = pilot->NbWords();
2270   Handle(Message_Messenger) sout = Message::DefaultMessenger();
2271   if (argc < 2) { sout<<"Give the name of an EditForm [+ option keep to re-apply edited values]"<<endl;
2272                   return IFSelect_RetError;  }
2273   const Standard_CString arg1 = pilot->Arg(1);
2274   const Standard_CString arg2 = pilot->Arg(2);
2275   Handle(IFSelect_WorkSession) WS = pilot->Session();
2276   DeclareAndCast(IFSelect_EditForm,edf,WS->NamedItem(arg1));
2277   if (edf.IsNull())
2278     {  sout<<"Not an EditForm : "<<arg1<<endl; return IFSelect_RetError;  }
2279
2280   Handle(Standard_Transient) ent = edf->Entity();
2281   Handle(Interface_InterfaceModel) model = edf->Model();
2282   if (!model.IsNull()) {
2283     if (ent.IsNull()) sout<<"Applying modifications on loaded model"<<endl;
2284     else {
2285       sout<<"Applying modifications on loaded entity : ";
2286       model->PrintLabel (ent,sout);
2287     }
2288   }
2289   else sout<<"Applying modifications"<<endl;
2290
2291   if (!edf->ApplyData (edf->Entity(),edf->Model())) {
2292     sout<<"Modifications could not be applied"<<endl;
2293     return IFSelect_RetFail;
2294   }
2295   sout<<"Modifications have been applied"<<endl;
2296
2297   Standard_Boolean stat = Standard_True;
2298   if (argc > 2 && arg2[0] == 'k') stat = Standard_False;
2299   if (stat) {
2300     edf->ClearEdit();
2301     sout<<"Edited values are cleared"<<endl;
2302   }
2303   else sout<<"Edited values are kept for another loading/applying"<<endl;
2304
2305   return IFSelect_RetDone;
2306 }
2307
2308 static IFSelect_ReturnStatus fun_editload
2309   (const Handle(IFSelect_SessionPilot)& pilot)
2310 {
2311   Standard_Integer argc = pilot->NbWords();
2312   Handle(Message_Messenger) sout = Message::DefaultMessenger();
2313   if (argc < 2) { sout<<"Give the name of an EditForm [+ Entity-Ident]"<<endl;
2314                   return IFSelect_RetError;  }
2315   const Standard_CString arg1 = pilot->Arg(1);
2316   const Standard_CString arg2 = pilot->Arg(2);
2317   Handle(IFSelect_WorkSession) WS = pilot->Session();
2318   DeclareAndCast(IFSelect_EditForm,edf,WS->NamedItem(arg1));
2319   if (edf.IsNull())
2320     {  sout<<"Not an EditForm : "<<arg1<<endl; return IFSelect_RetError;  }
2321
2322   Standard_Integer num = (argc < 3 ? 0 : pilot->Number (arg2));
2323   Standard_Boolean stat = Standard_False;
2324   if (argc < 3) {
2325     sout<<"EditForm "<<arg1<<" : Loading Model"<<endl;
2326     stat = edf->LoadModel(WS->Model());
2327   } else if (num <= 0) {
2328     sout<<"Not an entity ident : "<<arg2<<endl;
2329     return IFSelect_RetError;
2330   } else {
2331     sout<<"EditForm "<<arg1<<" : Loading Entity "<<arg2<<endl;
2332     stat = edf->LoadData (WS->StartingEntity(num),WS->Model());
2333   }
2334
2335   if (!stat) {
2336     sout<<"Loading not done"<<endl;
2337     return IFSelect_RetFail;
2338   }
2339   sout<<"Loading done"<<endl;
2340   return IFSelect_RetDone;
2341 }
2342
2343 //  #########################################
2344 //  ####    FONCTIONS COMPLEMENTAIRES    ####
2345 //  #########################################
2346
2347     Handle(Standard_Transient)  IFSelect_Functions::GiveEntity
2348   (const Handle(IFSelect_WorkSession)& WS,
2349    const Standard_CString name)
2350 {
2351   Handle(Standard_Transient) ent;  // demarre a Null
2352   Standard_Integer num = GiveEntityNumber(WS,name);
2353   if (num > 0) ent = WS->StartingEntity(num);
2354   return ent;
2355 }
2356
2357     Standard_Integer  IFSelect_Functions::GiveEntityNumber
2358   (const Handle(IFSelect_WorkSession)& WS,
2359    const Standard_CString name)
2360 {
2361   Standard_Integer num = 0;
2362   if (!name || name[0] == '\0') {
2363     char ligne[80];  ligne[0] = '\0';
2364     cin >> ligne;
2365 //    cin.clear();  cin.getline (ligne,79);
2366     if (ligne[0] == '\0') return 0;
2367     num    = WS->NumberFromLabel (ligne);
2368   }
2369   else num = WS->NumberFromLabel (name);
2370   return num;
2371 }
2372
2373     Handle(TColStd_HSequenceOfTransient)  IFSelect_Functions::GiveList
2374   (const Handle(IFSelect_WorkSession)& WS,
2375    const Standard_CString first, const Standard_CString second)
2376 {
2377   return WS->GiveList (first,second);
2378 }
2379
2380
2381 //  Function which returns an EVALUATED DISPATCH
2382 //   (could be added in WorkSession.cdl ...)
2383 //  Two modes : returns dispatch as it is, or return with edition
2384 //  Dispatch Name can be : an immediate name of already recorded Dispatch
2385 //  Or a name of dispatch + a parameter :  dispatch-name(param-value)
2386 //  According to type of Dispatch : integer , signature name
2387
2388 Handle(IFSelect_Dispatch)  IFSelect_Functions::GiveDispatch
2389   (const Handle(IFSelect_WorkSession)& WS,
2390    const Standard_CString name, const Standard_Boolean mode)
2391 {
2392   DeclareAndCast(IFSelect_Dispatch,disp,WS->NamedItem(name));
2393   if (!disp.IsNull()) return disp;    // OK as it is given
2394
2395 //   Else, let s try special cases
2396   TCollection_AsciiString nam(name);
2397   Standard_Integer paro = nam.Location(1,'(',1,nam.Length());
2398   Standard_Integer parf = nam.Location(1,')',1,nam.Length());
2399   nam.SetValue(paro,'\0'); nam.SetValue(parf,'\0');
2400   if (paro <= 0 &&parf <= 0) return disp;
2401   disp = GetCasted(IFSelect_Dispatch,WS->NamedItem(nam.ToCString()));
2402   if (disp.IsNull()) return disp;     // KO anyway
2403
2404 //  According to the type of dispatch :
2405   Handle(Message_Messenger) sout = Message::DefaultMessenger();
2406   DeclareAndCast(IFSelect_DispPerCount,dc,disp);
2407   if (!dc.IsNull()) {
2408     Standard_Integer nb = atoi( &(nam.ToCString())[paro]);
2409     if (nb <= 0) {
2410       sout<<" DispPerCount, count is not positive"<<endl;
2411       disp.Nullify();
2412       return disp;
2413     }
2414     if (mode) {
2415       Handle(IFSelect_IntParam) val = new IFSelect_IntParam;
2416       val->SetValue(nb);
2417       dc->SetCount (val);
2418     }
2419     return dc;
2420   }
2421   DeclareAndCast(IFSelect_DispPerFiles,dp,disp);
2422   if (!dp.IsNull()) {
2423     Standard_Integer nb = atoi( &(nam.ToCString())[paro]);
2424     if (nb <= 0) {
2425       sout<<" DispPerFiles, count is not positive"<<endl;
2426       disp.Nullify();
2427       return disp;
2428     }
2429     if (mode) {
2430       Handle(IFSelect_IntParam) val = new IFSelect_IntParam;
2431       val->SetValue(nb);
2432       dp->SetCount (val);
2433     }
2434     return dp;
2435   }
2436   DeclareAndCast(IFSelect_DispPerSignature,ds,disp);
2437   if (!ds.IsNull()) {
2438     DeclareAndCast(IFSelect_Signature,sg,WS->NamedItem( &(nam.ToCString())[paro]));
2439     if (sg.IsNull()) {
2440       sout<<"DispPerSignature "<<nam<<" , Signature not valid : "<<&(nam.ToCString())[paro]<<endl;
2441       disp.Nullify();
2442       return disp;
2443     }
2444     if (mode) ds->SetSignCounter (new IFSelect_SignCounter(sg));
2445     return ds;
2446   }
2447   sout<<"Dispatch : "<<name<<" , Parameter : "<<&(nam.ToCString())[paro]<<endl;
2448   return disp;
2449 }
2450
2451
2452 //  #########################################
2453 //  ####    INITIALISATIONS              ####
2454 //  #########################################
2455
2456 static int initactor = 0;
2457
2458
2459     void  IFSelect_Functions::Init ()
2460 {
2461   if (initactor) return;  initactor = 1;
2462   IFSelect_Act::SetGroup("DE: General");
2463   IFSelect_Act::AddFunc("xstatus","Lists XSTEP Status : Version, System Name ...",funstatus);
2464   IFSelect_Act::AddFunc("handler","Toggle status catch Handler Error of the session",fun1);
2465   IFSelect_Act::AddFunc("xload","file:string  : Read File -> Load Model",fun3);
2466 // IFSelect_Act::AddFunc("load","file:string  : Read File -> Load Model",fun3);
2467   IFSelect_Act::AddFunc("xread","file:string  : Read File -> Load Model",fun3);
2468   IFSelect_Act::AddFunc("whatfile"," -> analyses a file (specific per norm)",fun_whatfile);
2469   IFSelect_Act::AddFunc("writeall","file:string  : Write all model (no split)",fun4);
2470   IFSelect_Act::AddFunc("writesel","file:string sel:Selection : Write Selected (no split)",fun5);
2471   IFSelect_Act::AddFunc("writeent","file:string  n1ent n2ent...:integer : Write Entite(s) (no split)",fun6);
2472   IFSelect_Act::AddFunc("writent", "file:string  n1ent n2ent...:integer : Write Entite(s) (no split)",fun6);
2473   IFSelect_Act::AddFunc("elabel","nument:integer   : Displays Label Model of an entity",fun7);
2474   IFSelect_Act::AddFunc("enum","label:string  : Displays entities n0.s of which Label Model ends by..",fun8);
2475
2476   IFSelect_Act::AddFunc("listtypes","List nb entities per type. Optional selection name  else all model",fun9);
2477   IFSelect_Act::AddFunc("count","Count : counter [selection]",funcount);
2478   IFSelect_Act::AddFunc("listcount","List Counted : counter [selection [nument]]",funcount);
2479   IFSelect_Act::AddFunc("sumcount","Summary Counted : counter [selection [nument]]",funcount);
2480   IFSelect_Act::AddFunc("signtype","Sign Type [newone]",funsigntype);
2481   IFSelect_Act::AddFunc("signcase","signature : displays possible cases",funsigncase);
2482
2483   IFSelect_Act::AddFunc("estatus","ent/nument : displays status of an entity",fun10);
2484   IFSelect_Act::AddFunc("data","Data (DumpModel); whole help : data tout court",fun11);
2485   IFSelect_Act::AddFunc("entity","give n0 ou id of entity [+ level]",fundumpent);
2486   IFSelect_Act::AddFunc("signature","signature name + n0/ident entity",funsign);
2487   IFSelect_Act::AddFunc("queryparent"," give 2 n0s/labels of entities : dad son",funqp);
2488
2489   IFSelect_Act::AddFunc("dumpshare","Dump Share (dispatches, IntParams)",fun12);
2490   IFSelect_Act::AddFunc("listitems","List Items [label else all]  ->Type,Label[,Name]",fun13);
2491   IFSelect_Act::AddFSet("integer","value:integer : cree un IntParam",fun14);
2492   IFSelect_Act::AddFunc("setint","name:IntParam   newValue:integer  : Change valeur IntParam",fun15);
2493   IFSelect_Act::AddFSet("text","value:string  : cree un TextParam",fun16);
2494   IFSelect_Act::AddFunc("settext","Name:TextParam  newValue:string   : Change valeur TextParam",fun17);
2495   IFSelect_Act::AddFunc("dumpsel","Dump Selection suivi du Nom de la Selection a dumper",fun19);
2496   IFSelect_Act::AddFunc("evalsel","name:Selection [num/sel]  : Evalue une Selection",fun20);
2497   IFSelect_Act::AddFunc("givelist","num/sel [num/sel ...]  : Evaluates GiveList",fun20);
2498   IFSelect_Act::AddFunc("giveshort","num/sel [num/sel ...]  : GiveList in short form",fun20);
2499   IFSelect_Act::AddFunc("givepointed","num/sel [num/sel ...]  : GiveList to fill a SelectPointed",fun20);
2500   IFSelect_Act::AddFunc("makelist","listname [givelist] : Makes a List(SelectPointed) from GiveList",fun20);
2501   IFSelect_Act::AddFunc("givecount","num/sel [num/sel ...]  : Counts GiveList",fun20c);
2502   IFSelect_Act::AddFSet("selsuite","sel sel ...  : Creates a SelectSuite",funselsuite);
2503   IFSelect_Act::AddFunc("clearitems","Clears all items (selections, dispatches, etc)",fun21);
2504   IFSelect_Act::AddFunc("cleardata","mode:a-g-c-p  : Clears all or some data (model, check...)",fun22);
2505
2506   IFSelect_Act::AddFunc("itemlabel","xxx xxx : liste items having this label",fun24);
2507   IFSelect_Act::AddFunc("xsave","filename:string  : sauve items-session",fun25);
2508   IFSelect_Act::AddFunc("xrestore","filename:string  : restaure items-session",fun26);
2509   IFSelect_Act::AddFunc("param","nompar:string : displays parameter value; + nompar val : changes it",fun27);
2510   IFSelect_Act::AddFunc("defparam","nompar:string : display def. param; also : nompar edit, nompar init",fun28);
2511
2512   IFSelect_Act::AddFunc("sentfiles","Lists files sent from last Load",fun29);
2513   IFSelect_Act::AddFunc("fileprefix","prefix:string    : definit File Prefix",fun30);
2514   IFSelect_Act::AddFunc("fileext","extent:string    : definit File Extension",fun31);
2515   IFSelect_Act::AddFunc("fileroot","disp:Dispatch  root:string  : definit File Root sur un Dispatch",fun32);
2516   IFSelect_Act::AddFunc("filedef","defroot:string   : definit File DefaultRoot",fun33);
2517   IFSelect_Act::AddFunc("evalfile","Evaluation du FileNaming et memorisation",fun34);
2518   IFSelect_Act::AddFunc("clearfile","Efface la liste d'EvalFile",fun35);
2519   IFSelect_Act::AddFunc("xsplit","[disp:Dispatch  sinon tout]  : Split, la grande affaire !",fun36);
2520   IFSelect_Act::AddFunc("remaining","options... : Remaining Entities, help complet par  remaining ?",fun37);
2521   IFSelect_Act::AddFunc("setcontent","sel:Selection mode:k ou r  : Restreint contenu du modele",fun38);
2522
2523   IFSelect_Act::AddFunc("listmodif","List Final Modifiers",fun40);
2524   IFSelect_Act::AddFunc("dumpmodif","modif:Modifier  : Affiche le Statut d'un Modifier",fun41);
2525   IFSelect_Act::AddFunc("modifsel","modif:Modifier [sel:Selection]  : Change/Annule Selection de Modifier",fun42);
2526   IFSelect_Act::AddFunc("setapplied","modif:Modifier [name:un item sinon sortie fichier]  : Applique un Modifier",fun43);
2527   IFSelect_Act::AddFunc("resetapplied","modif:Modifier  : Enleve un Modifier de la sortie fichier",fun44);
2528   IFSelect_Act::AddFunc("modifmove","modif:Modifier M(model)/F(file) avant,apres:integer  : Deplace un Modifier (sortie fichier)",fun45);
2529
2530   IFSelect_Act::AddFunc("dispsel","disp:Dispatch sel:Selection  -> Selection Finale de Dispatch",fun51);
2531   IFSelect_Act::AddFSet("dispone","cree DispPerOne",fun_dispone);
2532   IFSelect_Act::AddFSet("dispglob","cree DispGlobal",fun_dispglob);
2533   IFSelect_Act::AddFSet("dispcount","count:IntParam  : cree DispPerCount",fun_dispcount);
2534   IFSelect_Act::AddFSet("dispfile","files:IntParam  : cree DispPerFiles",fun_dispfiles);
2535   IFSelect_Act::AddFSet("dispsign","sign:Signature  : cree DispPerSignature",fun_dispsign);
2536   IFSelect_Act::AddFunc("dumpdisp","disp:Dispatch   : Affiche le Statut d'un Dispatch",fun56);
2537
2538   IFSelect_Act::AddFunc("xremove","nom  : Remove a Control Item de la Session",fun57);
2539   IFSelect_Act::AddFunc("evaldisp","mode=[0-3]  disp:Dispatch  : Evaluates one or more Dispatch(es)",fun58);
2540   IFSelect_Act::AddFunc("evaladisp","mode=[0-3]  disp:Dispatch [givelist]  : Evaluates a Dispatch (on a GiveList)",fun_evaladisp);
2541   IFSelect_Act::AddFunc("writedisp","filepattern  disp:Dispatch [givelist]  : Writes Entities by Splitting by a Dispatch",fun_writedisp);
2542   IFSelect_Act::AddFunc("evalcomplete","Evaluation Complete de la Repartition",fun59);
2543
2544   IFSelect_Act::AddFunc("runcheck","affiche LastRunCheckList (write,modif)",fun60);
2545   IFSelect_Act::AddFunc("runtranformer","transf:Transformer  : Applique un Transformer",fun61);
2546   IFSelect_Act::AddFSet("copy","cree TransformStandard, option Copy, vide",fun62);
2547   IFSelect_Act::AddFSet("onthespot","cree TransformStandard, option OntheSpot, vide",fun63);
2548   IFSelect_Act::AddFunc("runcopy","modif:ModelModifier [givelist] : Run <modif> via TransformStandard option Copy",fun6465);
2549   IFSelect_Act::AddFunc("runonthespot","modif:ModelModifier [givelist] : Run <modif> via TransformStandard option OnTheSpot",fun6465);
2550   IFSelect_Act::AddFSet("reorder","[f ou t] reordonne le modele",fun66);
2551
2552   IFSelect_Act::AddFunc("toggle","sel:Selection genre Extract  : Toggle Direct/Reverse",fun70);
2553   IFSelect_Act::AddFunc("input","sel:Selection genre Deduct ou Extract  input:Selection  : Set Input",fun71);
2554   IFSelect_Act::AddFSet("modelroots","cree SelectModelRoots",fun72);
2555   IFSelect_Act::AddFSet("range","options... : cree SelectRange ...; tout court pour help",fun73);
2556   IFSelect_Act::AddFSet("roots","cree SelectRoots (local roots)",fun74);
2557   IFSelect_Act::AddFSet("shared","cree SelectShared",fun75);
2558   IFSelect_Act::AddFSet("diff","[main:Selection diff:Selection]  : cree SelectDiff",fun76);
2559   IFSelect_Act::AddFunc("selmain","sel:Selection genre Control  main:Selection  : Set Main Input",fun77);
2560   IFSelect_Act::AddFunc("selsecond","sel:Selection genre Control  sec:Selection   : Set Second Input",fun78);
2561   IFSelect_Act::AddFSet("modelall","cree SelectModelAll",fun79);
2562   IFSelect_Act::AddFunc("seladd","sel:Selection genre Combine  input:Selection  : Add Selection",fun80);
2563   IFSelect_Act::AddFunc("selrem","sel:Selection genre Combine  input:Selection  : Remove Selection",fun81);
2564   IFSelect_Act::AddFSet("number","num:IntParam  : Cree SelectEntityNumber",fun82);
2565
2566   IFSelect_Act::AddFSet("union","cree SelectUnion (vide), cf aussi combadd, combrem",fun83);
2567   IFSelect_Act::AddFSet("intersect","cree SelectIntersection (vide), cf aussi combadd, combrem",fun84);
2568   IFSelect_Act::AddFSet("typexact","type:string  : cree SelectTextType Exact",fun85);
2569   IFSelect_Act::AddFSet("errors","cree SelectErrorEntities (from file)",fun86);
2570   IFSelect_Act::AddFSet("unknown","cree SelectUnknownEntities",fun87);
2571   IFSelect_Act::AddFSet("sharing","cree SelectSharing",fun88);
2572   IFSelect_Act::AddFSet("typecontain","type:string  : cree SelectTextType Contains",fun89);
2573   IFSelect_Act::AddFSet("pointed","cree SelectPointed [num/sel num/sel]",fun90);
2574   IFSelect_Act::AddFunc("setpointed","sel:SelectPointed  : edition SelectPointed. tout court pour help",fun91);
2575   IFSelect_Act::AddFunc("setlist","sel:SelectPointed  : edition SelectPointed. tout court pour help",fun91);
2576   IFSelect_Act::AddFSet("incorrect","cree SelectIncorrectEntities (computed)",fun92);
2577
2578   IFSelect_Act::AddFSet("signsel","sign:Signature|cnt:Counter text:string [e(D)|c] : cree SelectSignature",fun93);
2579   IFSelect_Act::AddFSet("signcounter","sign:Signature : cree SignCounter",fun94);
2580   IFSelect_Act::AddFSet("nbselected","applied:Selection : cree GraphCounter(=NbSelected)",funbselected);
2581
2582   IFSelect_Act::AddFunc("editlist","editor or editform : lists defs + values",fun_editlist);
2583   IFSelect_Act::AddFunc("editvalue","editform paramname [newval or .] : lists-changes a value",fun_editvalue);
2584   IFSelect_Act::AddFunc("editclear","editform [paramname] : clears edition on all or one param",fun_editclear);
2585   IFSelect_Act::AddFunc("editload","editform [entity-id] : loads from model or an entity",fun_editload);
2586   IFSelect_Act::AddFunc("editapply","editform [keep] : applies on loaded data",fun_editapply);
2587 }