Salome HOME
PN
[tools/eficas.git] / Ihm / I_MCSIMP.py
index 3469ee9d945311eed375e5a9f1b32ab229f15abe..c2d771fc7ee08671bf87b509b87cc50619e446d3 100644 (file)
@@ -40,24 +40,48 @@ from Noyau.N_utils import repr_float
 from Noyau.N_ASSD import ASSD,assd
 from Noyau.N_GEOM import GEOM,geom
 from Noyau.N_CO import CO
+import Accas
 # fin attention
 
 from Extensions import parametre
+from Extensions import param2
 import I_OBJECT
+import CONNECTOR
 
 class MCSIMP(I_OBJECT.OBJECT):
+
+  def GetNomConcept(self):
+      p=self
+      while p.parent :
+         try :
+            nomconcept=p.get_sdname()
+            return nomconcept
+         except:
+            try :
+               nomconcept= p.object.get_sdname()
+               return nomconcept
+            except :
+               pass
+         p=p.parent
+      return ""
+
   def GetText(self):
     """
         Retourne le texte à afficher dans l'arbre représentant la valeur de l'objet
         pointé par self
     """
+
     if self.valeur == None : 
       return None
     elif type(self.valeur) == types.FloatType : 
       # Traitement d'un flottant isolé
-      #txt = repr_float(self.valeur)
+      # txt = repr_float(self.valeur)
       # Normalement str fait un travail correct
       txt = str(self.valeur)
+      clefobj=self.GetNomConcept()
+      if self.jdc.appli.dict_reels.has_key(clefobj):
+        if self.jdc.appli.dict_reels[clefobj].has_key(self.valeur):
+           txt=self.jdc.appli.dict_reels[clefobj][self.valeur]
     elif type(self.valeur) in (types.ListType,types.TupleType) :
       # Traitement des listes
       txt='('
@@ -66,7 +90,14 @@ class MCSIMP(I_OBJECT.OBJECT):
         if type(val) == types.FloatType : 
            # CCAR : Normalement str fait un travail correct
            #txt=txt + i*',' + repr_float(val)
-           txt=txt + i*',' + str(val)
+           clefobj=self.GetNomConcept()
+           if self.jdc.appli.dict_reels.has_key(clefobj):
+              if self.jdc.appli.dict_reels[clefobj].has_key(val):
+                 txt=txt + i*',' +self.jdc.appli.dict_reels[clefobj][val]
+              else :
+                 txt=txt + i*',' + str(val)
+           else :
+              txt=txt + i*',' + str(val)
         elif isinstance(val,ASSD): 
            txt = txt + i*',' + val.get_name()
     #PN
@@ -99,6 +130,11 @@ class MCSIMP(I_OBJECT.OBJECT):
        Retourne une chaîne de caractère représentant la valeur de self 
     """
     val=self.valeur
+    if type(val) == types.FloatType : 
+      clefobj=self.GetNomConcept()
+      if self.jdc.appli.dict_reels.has_key(clefobj):
+        if self.jdc.appli.dict_reels[clefobj].has_key(val):
+           return self.jdc.appli.dict_reels[clefobj][val]
     if type(val) != types.TupleType :
       try:
         return val.get_name()
@@ -182,10 +218,67 @@ class MCSIMP(I_OBJECT.OBJECT):
   def isoblig(self):
     return self.definition.statut=='o'
 
+  def valid_valeur(self,new_valeur):
+      """
+        Verifie que la valeur passee en argument (new_valeur) est valide
+        sans modifier la valeur courante (evite d'utiliser set_valeur et est plus performant)
+      """
+      old_valeur=self.valeur
+      old_val=self.val
+      self.valeur = new_valeur
+      self.val = new_valeur
+      self.state="modified"
+      validite=self.isvalid()
+      self.valeur = old_valeur
+      self.val = old_valeur
+      self.state="modified"
+      self.isvalid()
+      return validite
+
+  def valid_valeur_partielle(self,new_valeur):
+      """
+        Verifie que la valeur passee en argument (new_valeur) est partiellement valide
+        sans modifier la valeur courante (evite d'utiliser set_valeur et est plus performant)
+      """
+      old_valeur=self.valeur
+      old_val=self.val
+
+      self.valeur = new_valeur
+      self.val = new_valeur
+      self.state="modified"
+      validite=0
+      if self.isvalid():
+         validite=1
+      elif self.definition.validators :
+         validite=self.definition.validators.valide_liste_partielle(new_valeur)
+
+      if validite==0:
+         min,max=self.get_min_max()
+         if len(new_valeur) < min :
+            validite=1
+
+      self.valeur = old_valeur
+      self.val = old_valeur
+      self.state="modified"
+      self.isvalid()
+      return validite
+
+  def update_condition_bloc(self):
+      """ Met a jour les blocs conditionnels dependant du mot cle simple self
+      """
+      if self.definition.position == 'global' : 
+         self.etape.deep_update_condition_bloc()
+      elif self.definition.position == 'global_jdc' :
+         self.jdc.deep_update_condition_bloc()
+      else:
+         self.parent.update_condition_bloc()
+
   def set_valeur(self,new_valeur,evaluation='oui'):
+        #print "set_valeur",new_valeur
         self.init_modif()
         self.valeur = new_valeur
         self.val = new_valeur
+        self.update_condition_bloc()
         self.fin_modif()
         return 1
 
@@ -194,14 +287,18 @@ class MCSIMP(I_OBJECT.OBJECT):
         Essaie d'évaluer new_valeur comme une SD, une déclaration Python 
         ou un EVAL: Retourne la valeur évaluée (ou None) et le test de réussite (1 ou 0)
     """
-    sd = self.jdc.get_contexte_avant(self.etape).get(new_valeur,None)
+    sd = self.jdc.get_sd_avant_etape(new_valeur,self.etape)
+    #sd = self.jdc.get_contexte_avant(self.etape).get(new_valeur,None)
+    #print sd
     if sd :
       return sd,1
+    lsd = self.jdc.cherche_list_avant(self.etape,new_valeur) 
+    if lsd :
+      return lsd,1
     else:
       d={}
       # On veut EVAL avec tous ses comportements. On utilise Accas. Perfs ??
-      from Accas import EVAL
-      d['EVAL']=EVAL
+      d['EVAL']=Accas.EVAL
       try :
         objet = eval(new_valeur,d)
         return objet,1
@@ -209,6 +306,10 @@ class MCSIMP(I_OBJECT.OBJECT):
        itparam=self.cherche_item_parametre(new_valeur)
        if itparam:
             return itparam,1
+       try :
+            object=eval(new_valeur.valeur,d)
+       except :
+            pass
         if CONTEXT.debug : traceback.print_exc()
         return None,0
 
@@ -225,6 +326,11 @@ class MCSIMP(I_OBJECT.OBJECT):
        except:
          return None
 
+  def update_concept(self,sd):
+    if type(self.valeur) in (types.ListType,types.TupleType) :
+       if sd in self.valeur:self.fin_modif()
+    else:
+       if sd == self.valeur:self.fin_modif()
 
   def delete_concept(self,sd):
     """ 
@@ -234,20 +340,24 @@ class MCSIMP(I_OBJECT.OBJECT):
         Met a jour la valeur du mot cle simple suite à la disparition 
         du concept sd
     """
+    #print "delete_concept",sd
     if type(self.valeur) == types.TupleType :
       if sd in self.valeur:
+        self.init_modif()
         self.valeur=list(self.valeur)
         self.valeur.remove(sd)
-        self.init_modif()
+        self.fin_modif()
     elif type(self.valeur) == types.ListType:
       if sd in self.valeur:
-        self.valeur.remove(sd)
         self.init_modif()
+        self.valeur.remove(sd)
+        self.fin_modif()
     else:
       if self.valeur == sd:
+        self.init_modif()
         self.valeur=None
         self.val=None
-        self.init_modif()
+        self.fin_modif()
 
   def replace_concept(self,old_sd,sd):
     """
@@ -258,34 +368,36 @@ class MCSIMP(I_OBJECT.OBJECT):
         Met a jour la valeur du mot cle simple suite au remplacement 
         du concept old_sd
     """
+    #print "replace_concept",old_sd,sd
     if type(self.valeur) == types.TupleType :
       if old_sd in self.valeur:
+        self.init_modif()
         self.valeur=list(self.valeur)
         i=self.valeur.index(old_sd)
         self.valeur[i]=sd
-        self.init_modif()
+        self.fin_modif()
     elif type(self.valeur) == types.ListType:
       if old_sd in self.valeur:
+        self.init_modif()
         i=self.valeur.index(old_sd)
         self.valeur[i]=sd
-        self.init_modif()
+        self.fin_modif()
     else:
       if self.valeur == old_sd:
+        self.init_modif()
         self.valeur=sd
         self.val=sd
-        self.init_modif()
+        self.fin_modif()
 
   def set_valeur_co(self,nom_co):
       """
           Affecte à self l'objet de type CO et de nom nom_co
       """
+      #print "set_valeur_co",nom_co
       step=self.etape.parent
       if nom_co == None or nom_co == '':
          new_objet=None
       else:
-         # Pour le moment on importe en local le CO de Accas.
-         # Si problème de perfs, il faudra faire autrement
-         from Accas import CO
          # Avant de créer un concept il faut s'assurer du contexte : step 
          # courant
          sd= step.get_sd_autour_etape(nom_co,self.etape,avec='oui')
@@ -302,7 +414,7 @@ class MCSIMP(I_OBJECT.OBJECT):
          CONTEXT.unset_current_step()
          CONTEXT.set_current_step(step)
          step.set_etape_context(self.etape)
-         new_objet = CO(nom_co)
+         new_objet = Accas.CO(nom_co)
          CONTEXT.unset_current_step()
          CONTEXT.set_current_step(cs)
       self.init_modif()
@@ -313,6 +425,7 @@ class MCSIMP(I_OBJECT.OBJECT):
       # On force l'enregistrement de new_objet en tant que concept produit 
       # de la macro en appelant get_type_produit avec force=1
       self.etape.get_type_produit(force=1)
+      #print "set_valeur_co",new_objet
       return 1,"Concept créé"
        
   def verif_existence_sd(self):
@@ -320,9 +433,12 @@ class MCSIMP(I_OBJECT.OBJECT):
         Vérifie que les structures de données utilisées dans self existent bien dans le contexte
        avant étape, sinon enlève la référence à ces concepts
      """
+     #print "verif_existence_sd"
+     # Attention : possible probleme avec include
      l_sd_avant_etape = self.jdc.get_contexte_avant(self.etape).values()  
      if type(self.valeur) in (types.TupleType,types.ListType) :
        l=[]
+       self.init_modif()
        for sd in self.valeur:
          if isinstance(sd,ASSD) :
            if sd in l_sd_avant_etape :
@@ -330,15 +446,12 @@ class MCSIMP(I_OBJECT.OBJECT):
         else:
            l.append(sd)
        self.valeur=tuple(l)
-       # Est ce init_modif ou init_modif_up
-       # Normalement init_modif va avec fin_modif
-       self.init_modif()
        self.fin_modif()
      else:
        if isinstance(self.valeur,ASSD) :
          if self.valeur not in l_sd_avant_etape :
-            self.valeur = None
              self.init_modif()
+            self.valeur = None
              self.fin_modif()
  
   def get_min_max(self):
@@ -354,46 +467,38 @@ class MCSIMP(I_OBJECT.OBJECT):
      """
      return self.definition.type
 
-#--------------------------------------------------------------------------------
-# PN : ajout pour Salome des methodes suivantes (jusqu aux méthodes surchargees)
-#--------------------------------------------------------------------------------
-  def get_salome_valeurs(self):
-       l=[]
-       if not hasattr(self,'list_salome_valeurs'):
-           self.list_salome_valeurs=[]
-       if self.list_salome_valeurs != [] :
-           for val in self.list_salome_valeurs:
-                l.append(val)
-       return l
-
-  def put_salome_valeurs(self,list):
-       self.list_salome_valeurs=[]
-       for val in list:
-           self.list_salome_valeurs.append(val)
-
-  def add_salome_valeurs(self,val):
-      if not hasattr(self,'list_salome_valeurs'):
-           self.list_salome_valeurs=[]
-      try:
-           self.list_salome_valeurs.append(val)
-      except :
-           try:
-              for uneval in val :
-                  self.list_salome_valeurs.append(uneval)
-           except :
-              pass
-
-  def has_salome_valeurs(self):
-      if not hasattr(self,'list_salome_valeurs'):
-           self.list_salome_valeurs=[]
-      if self.list_salome_valeurs != []:
-           return true
-      else:
-           return false
+  def delete_mc_global(self):
+      """ Retire self des declarations globales
+      """
+      if self.definition.position == 'global' : 
+         etape = self.get_etape()
+         if etape :
+            del etape.mc_globaux[self.nom]
+      elif self.definition.position == 'global_jdc' :
+         del self.jdc.mc_globaux[self.nom]
+
+  def update_mc_global(self):
+     """
+        Met a jour les mots cles globaux enregistrés dans l'étape parente
+        et dans le jdc parent.
+        Un mot cle simple peut etre global. 
+     """
+     if self.definition.position == 'global' :
+        etape = self.get_etape()
+        if etape :
+           etape.mc_globaux[self.nom]=self
+     elif self.definition.position == 'global_jdc' :
+        if self.jdc:
+           self.jdc.mc_globaux[self.nom]=self
+
+  def nbrColonnes(self):
+     genea = self.get_genealogie()
+     if "VALE_C" in genea and "DEFI_FONCTION" in genea : return 3
+     if "VALE" in genea and "DEFI_FONCTION" in genea : return 2
+     print dir(self)
+     return 0
 
 #--------------------------------------------------------------------------------
-# PN : fin ajout pour Salome 
-#--------------------------------------------------------------------------------
  
 #ATTENTION SURCHARGE : toutes les methodes ci apres sont des surcharges du Noyau et de Validation
 # Elles doivent etre reintegrees des que possible
@@ -427,19 +532,32 @@ class MCSIMP(I_OBJECT.OBJECT):
               self.cr.fatal("None n'est pas une valeur autorisée")
         else:
            # type,into ...
-          if v.__class__.__name__=='PARAMETRE' or v.__class__.__name__ == 'ITEM_PARAMETRE':
-             verif_type=1
+          #PN ??? je n ose pas y toucher ???
+          #if v.__class__.__name__ in ('PARAMETRE','EVAL', 'ITEM_PARAMETRE','PARAMETRE_EVAL'):
+          if ((issubclass(v.__class__,param2.Formula)) or
+               (v.__class__.__name__  in ('EVAL', 'ITEM_PARAMETRE','PARAMETRE_EVAL'))): 
+             verif_type=self.verif_typeihm(v)
           else:
-             verif_type=self.verif_type(val=v,cr=cr)
+             verif_type=self.verif_type(val=v,cr=None)
              # cas des tuples avec un ITEM_PARAMETRE
               if verif_type == 0:
                  if type(v) == types.TupleType :
                   new_val=[]
                   for i in v:
-                    if i.__class__.__name__ != 'ITEM_PARAMETRE': 
-                       new_val.append(i)
+                    if ((issubclass(i.__class__,param2.Formula)) or
+                        (i.__class__.__name__  in ('EVAL', 'ITEM_PARAMETRE','PARAMETRE_EVAL'))): 
+                         if self.verif_typeihm(val=i,cr=cr) == 0:
+                            verif_type = 0
+                            break
+                    else:
+                         new_val.append(i)
                   if new_val != [] :
                     verif_type=self.verif_type(val=new_val,cr=cr)
+                  else :
+                    # Cas d une liste de paramétre
+                    verif_type=self.verif_typeliste(val=v,cr=cr)
+                else:
+                    verif_type=self.verif_type(val=v,cr=cr)
            valid = verif_type*self.verif_into(cr=cr)*self.verif_card(cr=cr)
            #
            # On verifie les validateurs s'il y en a et si necessaire (valid == 1)
@@ -456,7 +574,22 @@ class MCSIMP(I_OBJECT.OBJECT):
           if valid == 0:
               if cr == 'oui' :
                 self.cr.fatal(string.join( repr (self.valeur), " a un indice incorrect"))
-                print "hhhhhhhhhhhhhhhhhhh"
 
         self.set_valid(valid)
         return self.valid
+
+
+  def verif_typeihm(self,val,cr='non'):
+      try :
+         val.eval()
+        return 1
+      except :
+       pass
+      return self.verif_type(val,cr)
+
+  def verif_typeliste(self,val,cr='non') :
+      verif=0
+      for v in val :
+       verif=verif+self.verif_typeihm(v,cr)
+      return verif
+