Index: /trunk/SophyaPI/PIext/basexecut.cc
===================================================================
--- /trunk/SophyaPI/PIext/basexecut.cc	(revision 348)
+++ /trunk/SophyaPI/PIext/basexecut.cc	(revision 349)
@@ -77,4 +77,16 @@
   mImgApp->SetXYLimits(xmin, xmax, ymin, ymax);
   }
+else if (kw == "addtext") {
+  if (tokens.size() < 4) { cout << "Usage: addtext x y colfontatt txt" << endl;  return(0); }
+  double xp = atof(tokens[0].c_str());
+  double yp = atof(tokens[1].c_str());
+  bool fgsr = true;
+  string txt = tokens[3];
+  for(int k=4; k<tokens.size(); k++) txt += (' ' + tokens[k]);
+  int opt = mObjMgr->GetServiceObj()->DecodeDispOption(tokens[2], fgsr);
+  mImgApp->AddText(txt, xp, yp);
+  if (fgsr) mImgApp->RestoreGraphicAtt(); 
+  }
+  
 // >>>>>>>>>>> Link dynamique de fonctions C++
 else if (kw == "link" ) {
@@ -609,4 +621,11 @@
 kw = "setxylimits";
 usage = "Define 2-D plot limits \n Usage: setxylimits xmin xmax ymin ymax";
+usage += "\n  Related commands: gratt";  
+mpiac->RegisterCommand(kw, usage, this, "Graphics");
+
+kw = "addtext";
+usage = "Adds a text string to the current graphic object";
+usage += "\n at the specified position (Gr-Object Coordinate) with graphic attribute specification";
+usage += "\n  Usage: addtext x y ColFontAtt TextString";
 usage += "\n  Related commands: gratt";  
 mpiac->RegisterCommand(kw, usage, this, "Graphics");
Index: /trunk/SophyaPI/PIext/piacmd.cc
===================================================================
--- /trunk/SophyaPI/PIext/piacmd.cc	(revision 348)
+++ /trunk/SophyaPI/PIext/piacmd.cc	(revision 349)
@@ -2,4 +2,5 @@
 #include <stdio.h>
 #include <stdlib.h>
+#include <ctype.h>
 #include <math.h>
 
@@ -17,5 +18,6 @@
 
 // ------------------------------------------------------------
-//         Gestion d'une fenetre d'aide interactive        
+//         Gestion d'une fenetre d'aide interactive  
+//                    Classe   PIAHelpWind   
 // ------------------------------------------------------------
 
@@ -117,4 +119,147 @@
 }
 
+// ------------------------------------------------------------
+//         Bloc de commandes (Foreach, ...)    
+//               Classe  PIACmdBloc    
+// ------------------------------------------------------------
+
+class PIACmdBloc {
+public:
+		PIACmdBloc(PIACmd* piac, PIACmdBloc* par, vector<string>& args); 
+		~PIACmdBloc();
+  inline PIACmdBloc*   Parent() { return(parent); }
+  inline bool   CheckOK() { return((typ >= 0) ? true : false); }
+  inline void	AddLine(string& line)  
+    { lines.push_back(line); bloclineid.push_back(lines.size()); }
+  inline void	AddBloc(PIACmdBloc* blk)  
+    { blocs.push_back(blk); bloclineid.push_back(-blocs.size()); }
+  PIACmdBloc*	Execute();
+protected:
+  PIACmd* piacmd;
+  PIACmdBloc* parent;
+  int typ;           // 0 foreach , 1 integer loop, 2 float loop
+  string varname;
+  vector<string> strlist;
+  vector<string> lines;
+  vector<PIACmdBloc *> blocs;
+  vector<int> bloclineid;
+  int i1,i2,di;
+  float f1,f2,df;
+};
+
+/* --Methode-- */
+PIACmdBloc::PIACmdBloc(PIACmd* piac, PIACmdBloc* par, vector<string>& args)
+{
+piacmd = piac;
+parent = par;
+typ = -1;
+i1 = 0;  i2 = -1;  di = 1;
+f1 = 0.; f2 = -1.; df = 1.;
+if ((args.size() < 2) ||  !isalpha((int)args[0][0]) )  return; 
+varname = args[0];
+if (isalpha((int)args[1][0]) ) { // This is a foreach-integer bloc
+  for(int kk=1; kk<args.size(); kk++) strlist.push_back(args[kk]);
+  typ = 0;
+  }
+else { // This is an integer or float loop
+  size_t l = args[1].length();
+  size_t p = args[1].find(':');
+  size_t pp = args[1].find('.');
+  bool fl = (pp < l) ? true : false;  // Float loop or integer loop
+  if (p >= l) return;  // Syntaxe error
+  string a1 = args[1].substr(0, p);
+  string aa = args[1].substr(p+1);
+  p = aa.find(':');
+  string a2, a3;
+  bool hasa3 = false;
+  if (p < aa.length() ) { 
+    a2 = aa.substr(0,p);
+    a3 = aa.substr(p+1);
+    hasa3 = true;
+    }
+  else  a2 = aa; 
+  if (fl) { 
+    typ = 2;
+    f1 = atof(a1.c_str());
+    f2 = atof(a2.c_str());
+    if (hasa3)  df = atof(a3.c_str());
+    else df = 1.;
+    }
+  else { 
+    typ = 1;
+    i1 = atoi(a1.c_str());
+    i2 = atoi(a2.c_str());
+    if (hasa3)  di = atoi(a3.c_str());
+    else di = 1;
+    }
+  }
+}
+
+/* --Methode-- */
+PIACmdBloc::~PIACmdBloc()
+{
+for(int k=0; k<blocs.size(); k++) delete blocs[k];
+}
+
+/* --Methode-- */
+PIACmdBloc* PIACmdBloc::Execute()
+{
+// cout << " DBG * PIACmdBloc::Execute() " << typ << " - " << bloclineid.size() <<
+//      " I1,I2=" << i1 << " , " << i2 << " , " << di << endl;
+string cmd;
+int k=0;
+int kj=0;
+int kk=0;
+char buff[32];
+if (typ == 0)   // foreach string loop
+  for(k=0; k<strlist.size(); k++) {
+    cmd = "set " + varname + " " + strlist[k];
+    piacmd->Interpret(cmd);
+    for(kj=0; kj<bloclineid.size(); kj++) {
+      kk = bloclineid[kj]; 
+      if (kk > 0)  piacmd->Interpret(lines[kk-1]);
+      else blocs[-kk-1]->Execute();
+      }
+  }
+else if (typ == 1)  // Integer loop
+  for(int i=i1; i<i2; i+=di) {
+    k++;
+    if (++k > 9999) {
+      cout << ">>> Maximum PIACmdBloc loop limit (9999) -> break " << endl;
+      break;
+      }
+    sprintf(buff, " %d", i);
+    cmd = "set " + varname + buff;
+    piacmd->Interpret(cmd);
+    for(kj=0; kj<bloclineid.size(); kj++) {
+      kk = bloclineid[kj]; 
+      if (kk > 0)  piacmd->Interpret(lines[kk-1]);
+      else blocs[-kk-1]->Execute();
+      }
+  }
+else if (typ == 2)  // float loop
+  for(float f=f1; f<f2; f+=df) {
+    k++;
+    if (++k > 9999) {
+      cout << ">>> Maximum PIACmdBloc loop limit (9999) -> break " << endl;
+      break;
+      }
+    sprintf(buff, " %g", f);
+    cmd = "set " + varname + buff;
+    piacmd->Interpret(cmd);
+    for(kj=0; kj<bloclineid.size(); kj++) {
+      kk = bloclineid[kj]; 
+      if (kk > 0)  piacmd->Interpret(lines[kk-1]);
+      else blocs[-kk-1]->Execute();
+      }
+  }
+
+return(parent); 
+}
+
+// ------------------------------------------------------------
+//         Classe PIACmd
+// ------------------------------------------------------------
+
 static PIACmd* curpiacmd = NULL;
 /* --Methode-- */
@@ -125,6 +270,9 @@
 system("cp history.pic hisold.pic");
 hist.open("history.pic");
+histon = true;
 trace = false;   timing = false;
 gltimer = NULL;
+curblk = NULL;
+felevel = 0;
 
 cmdhgrp["All"] = 0;
@@ -138,10 +286,13 @@
 string usage;
 usage = ">>> (piacmd) Interpreter's keywords : \n";
-usage += "  timingon  timingoff traceon  traceoff \n";
-usage += "  set unset listvar listcommands exec shell \n";
-usage += "  > set varname 'string'   # To set a variable, $varname \n";
+usage += "  > set varname string   # To set a variable, $varname \n";
+usage += "  > get newvarname varname # To set a newvariable, equal to $varname \n";
 usage += "  > setol varname patt     # Fills varname with object list \n";
 usage += "  > unset varname          # clear variable definition \n";
 usage += "  > echo string            # output string \n";
+usage += "  > foreach varname string-list # Loop \n"; 
+usage += "  > foreach varname i1:i2[:di]  # Integer loop  \n"; 
+usage += "  > foreach varname f1:f2[:df]  # Float loop  \n";
+usage += "  > end                         # end loops \n"; 
 usage += "  > listvars   # List of variable names and values \n";
 usage += "  > listcommands # List of all known commands \n";
@@ -150,4 +301,5 @@
 usage += "  > help <command_name>  # <command_name> usage info \n"; 
 usage += "  > helpwindow           # Displays help window \n";
+usage += "  > timingon  timingoff traceon  traceoff \n";
 string grp = "Commands";
 RegisterHelp(kw, usage, grp);
@@ -266,6 +418,5 @@
 {
 if (!cl) return;
-interpmap[cl->Name()] = cl;
-}
+interpmap[cl->Name()] = cl;}
 
 /* --Methode-- */
@@ -286,37 +437,163 @@
 int rc = 0;
 cmdtok tokens;
-if (s.length() < 1)  return(0);
-
-hist << s << endl;   // On enregistre les commandes 
-
-if (s[0] == '#') {
-  cout << "PIACmd::Interpret() Comment-Line:" << s << endl;
-  return(0); 
-  } 
+CmdVarList::iterator it;
+
+// Removing leading blanks
+size_t p,q,q2,l;
+l = s.length();
+if (l < 1)  return(0);
+if (s[0] == '#') return(0); // si c'est un commentaire
+p=s.find_first_not_of(" \t");
+if (p < l) s = s.substr(p);
+// else return(0);
+
+// On enregistre les commandes 
+if (histon) hist << s << endl;   
+
+
 string toks,kw;
-size_t p = s.find_first_not_of(" ");
-s = s.substr(p);
-p = 0;
-size_t q = s.find_first_of(" ");
-size_t l = s.length();
-
+
+// >>>> Substitution d'alias (1er mot)
+int als = 0;
+while (als < 2) {
+  p = s.find_first_not_of(" ");
+  s = s.substr(p);
+  p = 0;
+  q = s.find_first_of(" ");
+  l = s.length();
+  string w1 =  (q < l) ? s.substr(p,q-p) : s.substr(p);
+  it = mAliases.find(w1);
+  if (it != mAliases.end())  s =  (*it).second + s.substr(q);
+  else als++;
+  als++;
+  }
+
+// >>>> Separating keyword 
 if (q < l)
   {  kw = s.substr(p,q-p);  toks = s.substr(q, l-q); }
 else { kw = s.substr(p,l-p);  toks = ""; }
 
+// On verifie si nous sommes dans un bloc 
+if ( (curblk != NULL) && (kw != "foreach") ) { // On est dans un bloc 
+  if (kw != "end")   { curblk->AddLine(s);  return(0); }
+  else { 
+    PIACmdBloc* curb = curblk;
+    curblk = curb->Parent();
+    felevel--;
+    if (curblk  == NULL) { 
+       mImgApp->GetConsole()->SetPrompt("Cmd> ");
+       //       cout << " *DBG* Executing bloc " << endl;
+       curb->Execute();
+       }
+    else  {
+      char prompt[64];
+      sprintf(prompt, "foreach-%d> ", felevel);
+      mImgApp->GetConsole()->SetPrompt(prompt);
+      }
+    return(0);
+    }
+  }
+
+// Nous ne sommes donc pas dans un bloc ....   
+
+// >>>> Variable substitution  
+string s2="";
+p = 0;
+l = s.length();
+string vn;
+while (p < l) {
+  q = s.find('$',p);
+  //  cout << "DBG: " << s2 << " p= " << p << " q= " << q << " L= " << l << endl;
+  if (q > l) break;
+  if ((q>0) && (s[q-1] == '\\')) {   // Escape character \$
+     s2 += (s.substr(p,q-1-p) + '$') ; p = q+1;
+     continue;
+     }
+  if (q >= l-1) {
+      cerr << " Syntax error !!! " << endl;
+      return(0);
+      }
+  vn = "";
+  if ( s[q+1] == '{' ) {  // Variable in the form ${name}
+    q2 = s.find('}',q+1);
+    if (q2 >= l) {
+      cerr << " Syntax error !!! " << endl;
+      return(0);
+      }
+    vn = s.substr(q+2,q2-q-2);
+    q2++;
+    }
+  else if ( s[q+1] == '[' ) {  // Variable in the form $[varname]  -> This is $$varname
+    q2 = s.find(']',q+1);
+    if (q2 >= l) {
+      cerr << " Syntax error !!! " << endl;
+      return(0);
+      }
+    vn = s.substr(q+2,q2-q-2);
+    it =  mVars.find(vn);  
+    if ( (vn.length() < 1) || (it == mVars.end()) ) {
+      cerr << " Error: Undefined variable " << vn << " ! " << endl;
+      return(0);
+      }
+    vn = mVars[vn];
+    q2++;
+    }
+  else { 
+    q2 = s.find_first_of(" .:/,]()$",q+1); 
+    if (q2 > l) q2 = l;
+    vn = s.substr(q+1, q2-q-1); 
+    }
+  it =  mVars.find(vn);  
+  if ( (vn.length() < 1) || (it == mVars.end()) ) {
+    cerr << " Error: Undefined variable " << vn << " ! " << endl;
+    return(0);
+    }
+  s2 += (s.substr(p, q-p) + (*it).second);
+  p = q2;
+  } 
+if (p < l) s2 += s.substr(p);
+
+p = s2.find_first_not_of(" \t");
+if (p < l) s2 = s2.substr(p);
+
+
+// >>>> Separating keyword and tokens 
+q = s2.find(' '); 
+l = s2.length();
+if (q < l)
+  {  kw = s2.substr(0,q);  toks = s2.substr(q, l-q); }
+else { kw = s2;  toks = ""; }
+
 q = 0;
 while (q < l)  {
-  p = toks.find_first_not_of(" ",q+1); // au debut d'un token
+  p = toks.find_first_not_of(" \t",q+1); // au debut d'un token
   if (p>=l) break;
-  q = toks.find_first_of(" ",p); // la fin du token;
+  q = toks.find_first_of(" \t",p); // la fin du token;
   string token = toks.substr(p,q-p);
   tokens.push_back(token);
   }
 
-for(int k=0; k<tokens.size(); k++) { // On remplace les $varname par la valeur de la variable
-  if ((tokens[k])[0] != '$')  continue; 
-  CmdVarList::iterator it = mVars.find(tokens[k].substr(1));
-  if (it != mVars.end())  tokens[k] = (*it).second;
-  }
+
+// Si c'est un foreach, on cree un nouveau bloc
+if (kw == "foreach") {
+  //     cout << " *DBG* We got a foreach... " << endl;
+  PIACmdBloc* bloc = new PIACmdBloc(this, curblk, tokens);
+  if (!bloc->CheckOK()) {
+    cerr << "foreach syntax Error ! " << endl;
+    delete bloc;
+    return(0);
+    }
+  felevel++;
+  if (curblk)  curblk->AddBloc(bloc);
+  else {
+    char prompt[64];
+    sprintf(prompt, "foreach-%d> ", felevel);
+    mImgApp->GetConsole()->SetPrompt(prompt);
+    }
+  curblk = bloc;
+  //  cout << " *DBG* New Bloc created ... " << endl;
+  return(0);
+  }
+
 
 // cout << "PIACmd::Do() DBG  KeyW= " << kw << " NbArgs= " << tokens.size() << endl;
@@ -325,5 +602,5 @@
 
 // >>>>>>>>>>> Commande d'interpreteur
-if (kw == "helpwindow") ShowHelpWindow();
+else if (kw == "helpwindow") ShowHelpWindow();
 else if (kw == "help") {
   if (tokens.size() > 0) cout << GetUsage(tokens[0]) << endl;
@@ -336,14 +613,52 @@
 else if (kw == "set") {
   if (tokens.size() < 2) { cout << "PIACmd::Interpret() Usage: set varname string" << endl;  return(0); }
-  string xx = "";
-  for (int kk=1; kk<tokens.size(); kk++)  xx += (tokens[kk] + ' ');
+  if ((tokens[0].length() < 1) || !isalpha((int)tokens[0][0]) ) {
+    cerr << "PIACmd::Interpret()/Error Variable name should start with alphabetic" << endl;
+    return(0);
+    }
+  string xx = tokens[1];
+  for (int kk=2; kk<tokens.size(); kk++)  xx += (' ' + tokens[kk] );
   mVars[tokens[0]] = xx;
   }
+
+else if (kw == "getvar") {
+  if (tokens.size() < 2) { cout << "PIACmd::Interpret() Usage: getvar newvarname varname" << endl;  return(0); }
+  it = mVars.find(tokens[1]);
+  if (it == mVars.end()) {
+    cerr << "Error - No " << tokens[1] << " Variable " << endl;
+    return(0);
+    } 
+  if ((tokens[0].length() < 1) || !isalpha((int)tokens[0][0]) ) {
+    cerr << "PIACmd::Interpret()/Error Variable name should start with alphabetic" << endl;
+    return(0);
+    }
+  mVars[tokens[0]] = (*it).second;
+  }
+
+else if (kw == "alias") {
+  if (tokens.size() < 2) { cout << "PIACmd::Interpret() Usage: alias aliasname string" << endl;  return(0); }
+  if ((tokens[0].length() < 1) || !isalpha((int)tokens[0][0]) ) {
+    cerr << "PIACmd::Interpret()/Error alias name should start with alphabetic" << endl;
+    return(0);
+    }
+  string xx = tokens[1];
+  for (int kk=2; kk<tokens.size(); kk++)  xx += (' ' + tokens[kk]);
+  mAliases[tokens[0]] = xx;
+  }
+
 else if (kw == "setol") {
   if (tokens.size() < 2) { cout << "PIACmd::Interpret() Usage: setol varname objnamepattern" << endl;  return(0); }
+  if ((tokens[0].length() < 1) || !isalpha((int)tokens[0][0]) ) {
+    cerr << "PIACmd::Interpret()/Error Variable name should start with alphabetic" << endl;
+    return(0);
+    }
   vector<string> ol;
-  mObjMgr->GetObjList(tokens[1], ol); 
-  string vol = ""; 
-  for (int kk=0; kk<ol.size(); kk++)  vol += (ol[kk] + ' ');
+  mObjMgr->GetObjList(tokens[1], ol);
+  string vol; 
+  if (ol.size() < 1) vol = "";
+  else { 
+     vol = ol[0]; 
+    for (int kk=1; kk<ol.size(); kk++)  vol += (' ' + ol[kk]);
+    }
   mVars[tokens[0]] = vol;
   }
@@ -388,5 +703,5 @@
 else if (kw == "exec") {
   if (tokens.size() < 1) { cout << "PIACmd::Interpret() Usage: exec filename" << endl;  return(0); }
-  ExecFile(tokens[0]);
+  ExecFile(tokens[0], tokens);
   }
 else if (kw == "shell") {
@@ -444,5 +759,5 @@
 
 /* --Methode-- */
-int PIACmd::ExecFile(string& file)
+int PIACmd::ExecFile(string& file, vector<string>& args)
 {
 char line_buff[512];
@@ -454,6 +769,31 @@
   return(0);
   }
- 
-hist << "### Executing commands from " << file << endl;
+
+// hist << "### Executing commands from " << file << endl;
+
+// Setting $0 ... $99 variables 
+int k;
+CmdVarList::iterator it;
+char buff[32];
+// First, we clear all previous values
+string vn="#";
+it = mVars.find(vn);
+if (it != mVars.end())  mVars.erase(it);
+for(k=0; k<99; k++) {   
+  sprintf(buff,"%d",k);
+  vn = buff;
+  it = mVars.find(vn);
+  if (it != mVars.end())  mVars.erase(it);
+  }
+// We then set them
+vn="#";
+sprintf(buff,"%d",(int)args.size());
+mVars[vn] = buff;
+for(k=0; k<args.size(); k++) {   
+  sprintf(buff,"%d",k);
+  vn = buff;
+  mVars[vn] = args[k];
+  }
+
 if (trace) { 
   mImgApp->GetConsole()->AddStr("### Executing commands from ", PIVA_Magenta);
@@ -462,4 +802,5 @@
   }
 
+histon = false; 
 while (fgets(line_buff,511,fip) != NULL)
   {
@@ -469,5 +810,7 @@
   Interpret(line);
   }
-hist << "### End of Exec( " << file << " ) " << endl;
+histon = false; 
+
+// hist << "### End of Exec( " << file << " ) " << endl;
 if (trace) { 
   mImgApp->GetConsole()->AddStr("### End of Exec( ", PIVA_Magenta);
Index: /trunk/SophyaPI/PIext/piacmd.h
===================================================================
--- /trunk/SophyaPI/PIext/piacmd.h	(revision 348)
+++ /trunk/SophyaPI/PIext/piacmd.h	(revision 349)
@@ -45,5 +45,7 @@
 class Timer;
 class PDynLinkMgr;
-class PIAHelpWind;
+
+class PIAHelpWind; // Fenetre d'aide en ligne 
+class PIACmdBloc;
 
 // ---------------------------------------------------------------------
@@ -53,5 +55,4 @@
 // ---------------------------------------------------------------------
 
-class PIAHelpWind;   // Fenetre d'aide en ligne 
 
 class PIACmd : public CmdInterpreter  {
@@ -74,5 +75,5 @@
   virtual int		ExecuteCommandLine(string& line);
   virtual int		ExecuteCommand(string& keyw, vector<string>& args);
-  virtual int		ExecFile(string& file);
+  virtual int		ExecFile(string& file, vector<string>& args);
 
   virtual string&	GetUsage(const string& kw);
@@ -114,6 +115,12 @@
 //  Pour stocker les variables definies par l'interpreteur
   typedef map<string, string, less<string> > CmdVarList;
-  CmdVarList mVars;    // Liste des variables 
+  CmdVarList mVars;     // Liste des variables 
+  CmdVarList mAliases;  // Liste des alias 
+
+  PIACmdBloc * curblk;  // Bloc de commande courant (foreach, ...)
+  int felevel;          // foreah level 
+
   ofstream hist;       //  History file 
+  bool histon;        //  True ->  history file
   bool trace;          // Trace flag
   bool timing;         // Display CPU Time
Index: /trunk/SophyaPI/PIext/pistdimgapp.cc
===================================================================
--- /trunk/SophyaPI/PIext/pistdimgapp.cc	(revision 348)
+++ /trunk/SophyaPI/PIext/pistdimgapp.cc	(revision 349)
@@ -533,4 +533,34 @@
 }
 
+/* --Methode-- */
+void PIStdImgApp::AddText(string const & txt, double xp, double yp)
+{
+if (!mLastWdg)  return;
+PIElDrawer *eld=NULL;
+PIScDrawWdg* sdw=NULL;
+PIDraw3DWdg* w3d=NULL;
+PIImage* imgw;
+switch(mLastWdg->kind()) {
+  case PIScDrawWdg::ClassId :
+    sdw = dynamic_cast<PIScDrawWdg *>(mLastWdg);
+    if (sdw) eld = sdw->BaseDrawer();
+    break;
+  case PIDraw3DWdg::ClassId :
+    w3d = dynamic_cast<PIDraw3DWdg *>(mLastWdg);
+    if (w3d) eld = w3d->BaseDrawer();
+    break;
+  case PIImage::ClassId :
+    imgw = dynamic_cast<PIImage *>(mLastWdg);
+    if (imgw) eld = imgw->MyElDrawer();
+    break;
+  default :
+    break;
+  }
+if (eld) { 
+  if ( (mFSz != PI_NotDefFontSize) && (mFAtt != PI_NotDefFontAtt) )     eld->SetFontAtt(mFSz, mFAtt); 
+  eld->ElAddText(xp,yp,txt.c_str(),mFCol);
+  eld->Refresh();
+  }
+}
 
 /* --Methode-- */
Index: /trunk/SophyaPI/PIext/pistdimgapp.h
===================================================================
--- /trunk/SophyaPI/PIext/pistdimgapp.h	(revision 348)
+++ /trunk/SophyaPI/PIext/pistdimgapp.h	(revision 349)
@@ -53,4 +53,8 @@
      int  DispScDrawer(PIDrawer* scd, string const & name, int opt, string title="", int oid=0);
      int  Disp3DDrawer(PIDrawer3D* scd, string const & name, int opt, string title="", int oid=0);
+
+  //  Fonction d'ajout de texte (provisoire - Aout 99)
+     void AddText(string const & txt, double xp, double yp);
+
 
      void CreateGraphWin(int nx=1, int ny=1, int sx=0, int sy = 0);
Index: /trunk/SophyaPI/PIext/servnobjm.cc
===================================================================
--- /trunk/SophyaPI/PIext/servnobjm.cc	(revision 348)
+++ /trunk/SophyaPI/PIext/servnobjm.cc	(revision 349)
@@ -1652,34 +1652,34 @@
 gi.a2 = PI_NotDefFontSize;
 gi.a1 = PI_NotDefFontAtt;
-GrAlines["deffont"] = gi;
+GrAfonts["deffont"] = gi;
 
 gi.a2 = PI_NormalSizeFont;
 gi.a1 = PI_RomanFont;
-GrAlines["normalfont"] = gi;
+GrAfonts["normalfont"] = gi;
 gi.a1 = PI_BoldFont;
-GrAlines["boldfont"] = gi;
+GrAfonts["boldfont"] = gi;
 gi.a1 = PI_ItalicFont;
-GrAlines["italicfont"] = gi;
+GrAfonts["italicfont"] = gi;
 gi.a2 = PI_SmallSizeFont;
 gi.a1 = PI_RomanFont;
-GrAlines["smallfont"] = gi;
+GrAfonts["smallfont"] = gi;
 gi.a1 = PI_BoldFont;
-GrAlines["smallboldfont"] = gi;
+GrAfonts["smallboldfont"] = gi;
 gi.a1 = PI_ItalicFont;
-GrAlines["smallitalicfont"] = gi;
+GrAfonts["smallitalicfont"] = gi;
 gi.a2 = PI_BigSizeFont;
 gi.a1 = PI_RomanFont;
-GrAlines["bigfont"] = gi;
+GrAfonts["bigfont"] = gi;
 gi.a1 = PI_BoldFont;
-GrAlines["bigboldfont"] = gi;
+GrAfonts["bigboldfont"] = gi;
 gi.a1 = PI_ItalicFont;
-GrAlines["bigitalicfont"] = gi;
+GrAfonts["bigitalicfont"] = gi;
 gi.a2 = PI_HugeSizeFont;
 gi.a1 = PI_RomanFont;
-GrAlines["hugefont"] = gi;
+GrAfonts["hugefont"] = gi;
 gi.a1 = PI_BoldFont;
-GrAlines["hugeboldfont"] = gi;
+GrAfonts["hugeboldfont"] = gi;
 gi.a1 = PI_ItalicFont;
-GrAlines["hugeitalicfont"] = gi;
+GrAfonts["hugeitalicfont"] = gi;
 
 
