Index: trunk/SophyaPI/PIGcont/pigncont.cc
===================================================================
--- trunk/SophyaPI/PIGcont/pigncont.cc	(revision 1919)
+++ trunk/SophyaPI/PIGcont/pigncont.cc	(revision 2250)
@@ -565,4 +565,22 @@
   for(int i=0 ; i<k ; i++)My_Levels[i] = ptr[i];
 }
+//++
+// void SetMyLevels(vector<double>vec)
+//      Setting du tableau des niveaux des contours 
+//Inputs      
+//| 
+//| vector <double> vec  : vecteur des niveaux 
+//--
+void 
+GNUPlotContour::SetMyLevels(vector <double> vec){
+  
+  if(My_Levels!=NULL) delete My_Levels;
+  int sz = vec.size();
+  assert (sz>0);
+
+  My_Levels = new double[sz];
+  for(int i=0 ; i<sz ; i++)
+    My_Levels[i] = vec[i];
+}
 
 //++
@@ -639,4 +657,5 @@
     if(_nti!=NULL){delete _nti ; _nti=NULL;}
   }
+  DeactivateControlWindow(NULL);
   //if (mColorMap!=NULL){delete  mColorMap;  mColorMap=NULL;}
 }
@@ -762,4 +781,20 @@
 }
 
+//++
+void PIContourDrawer::DeactivateControlWindow(PIBaseWdgGen* wdg)
+//
+//	Desactivation de la fenetre de controle specialisee
+//--
+{
+  // si wdg != NULL, c'est un Detach (Drawer detache du PIBaseWdg
+  // si wdg == NULL, c'est un delete du PIHisto2D (du PIDrawer)
+  
+  PICnTools::SetCurrentBaseWdg(NULL);
+  PICnTools::SetCurrentCnDrw(NULL);
+  PICnTools::HidePICnTools(); 
+
+  return;
+}
+
 
 /* --Methode-- */
@@ -793,5 +828,134 @@
   mLabelOn = false;
 }
- 
-
-
+
+int PIContourDrawer::DecodeOptionString(vector<string> & opt, bool rmdecopt)
+{
+  // inspire de int PINTuple::DecodeOptionString
+  // OP 11/2002 LAL Orsay
+  
+  int ndec = opt.size();
+  if (ndec < 1)  return(0);  
+
+
+  cout << " PIDrawer::DecodeOptionString  : ndec = "<< ndec <<endl;
+  // On appelle d'abord le decodage de la classe PIDrawer de laquelle
+  // on herite. (Pas obligatoire) on decode donc ici les attributs de
+  // couleur, fontes ...
+  int ndec1 = PIDrawer::DecodeOptionString(opt, rmdecopt);
+  cout << " PIDrawer::DecodeOptionString apres PIDrawer::DecodeOptionString : ndec = "
+       << ndec1 <<"<>" << ndec <<endl;
+  if( ndec - ndec1 < 1 ) return(ndec1);  // si tout a ete decode
+
+  vector<string> udopt;  // On gardera ici les options non decodees
+  int iopt  = 0;
+  ndec = opt.size();
+  int recalc = 0;
+  for (iopt = 0 ; iopt<ndec ; iopt++){
+
+    string sopt = opt[iopt];
+    if( sopt.find_first_of("=") != string::npos ){
+      // options avec = 
+      string deb = sopt.substr(0,sopt.find_first_of("="));
+      cout << " option avec =  : "<<deb<<" "<<sopt<<endl;
+      if( (deb =="ncont") || (deb =="nc") ){ // # de contours 
+	string fin =  sopt.substr(sopt.find_first_of("=")+1 , string::npos);
+	cout <<" fin "<<fin<<endl;
+	int nlev = atoi(fin.c_str());
+	this->SetNLevel(nlev);
+	this->SetCntLevelKind(LEVELS_NUM);
+	recalc =1;
+      }else if(deb=="niv"||deb=="lev"){ // hauteur des niveaux 
+	string fin =  sopt.substr(sopt.find_first_of("=")+1 , string::npos);
+	char * buff = strdup(fin.c_str());
+	char *tmp;
+	tmp = strtok(buff,",");
+	
+	if(tmp==NULL){
+	   cerr<< " PICOntourDrawer::DecodeOptionString ERREUR decodage des niveaux impossible " << buff <<endl;
+	  
+	}else {
+	
+	  vector <double> ztmp;
+	  while(tmp!=NULL){
+	    ztmp.push_back(atof(tmp));
+	    tmp = strtok(NULL,",");
+	  }
+	  int nlev = ztmp.size();
+	  cout << "  PICOntourDrawer::DecodeOptionString "<<nlev<<" niveaux decodes "<<endl; 
+	  this->SetCntLevelKind(LEVELS_DISCRETE);
+	  this->SetNLevel(nlev); 
+	  this->SetMyLevels(ztmp);
+	  recalc =1;
+	}
+      }else if(deb=="lstep" ){ // niveaux incrementaux : args = nombre,depart,pas
+	string fin =  sopt.substr(sopt.find_first_of("=")+1 , string::npos);
+	char * buff = strdup(fin.c_str());
+	char *tmp;
+	tmp = strtok(buff,",");
+	
+	if(tmp==NULL){
+	  cerr<< " PICOntourDrawer::DecodeOptionString ERREUR decodage nvx/incr. impossible " << buff <<endl;
+	}else{
+	  
+	  vector <double> ztmp;
+	  while(tmp!=NULL){
+	    ztmp.push_back(atof(tmp));
+	    tmp = strtok(NULL,",");
+	  }
+	  if(ztmp.size() !=2) {
+	    cerr<< " PICOntourDrawer::DecodeOptionString ERREUR nb params incorrect(incr) " << buff <<endl;
+	  }else{
+	    vector <double> zlev;
+	    zlev.push_back(ztmp[1]);
+	    zlev.push_back(ztmp[2]);
+	    this->SetCntLevelKind(LEVELS_INCREMENTAL);
+	    this->SetNLevel( (int) ztmp[0]); 
+	    this->SetMyLevels(zlev);
+	    recalc=1;
+	  }
+	}
+
+      }else{
+	cout<<"PICOntourDrawer::DecodeOptionString ERREUR  option "<<sopt<<" non reconnue "<<endl;
+	ndec--;
+	if (rmdecopt)  udopt.push_back( sopt );
+      }
+    }else{ //options sans "="
+      if( sopt == "labon" )
+	this->SetLabelOn();
+      else if (sopt == "bspline" ){
+	this->SetCntKind(CONTOUR_KIND_BSPLINE);
+	recalc = 1;
+      }else if (sopt == "3spl" ){
+	this->SetCntKind(CONTOUR_KIND_CUBIC_SPL);
+	recalc = 1;
+      }
+      else{
+	cout<<"PICOntourDrawer::DecodeOptionString ERREUR  option "<<sopt<<" non reconnue "<<endl;
+	ndec--;
+	if (rmdecopt)  udopt.push_back(sopt);
+      }
+    }
+    
+  }// FIN DE LA BOUCLE SUR LES OPTIONS 
+
+  if(recalc==1){
+    // il faut (re)calculer les contours 
+    cout << " PICOntourDrawer::DecodeOptionString(re)calcul des contours "<<endl;
+    this->CalcContour(); 
+  }
+  this->Refresh();
+
+  
+  //
+
+  // S'il faut supprimer les options decodees, on remplace l'argument opt
+  // par le vecteur des options non decodees.
+  if (rmdecopt)  opt = udopt;
+
+  return(ndec+ndec1);  
+  
+}
+
+
+ 
