Salome HOME
PN pour notation scientifique
[tools/eficas.git] / generator / generator_python.py
index a0fbbf7ba6deb121e9462210cc04f73c1c26df4e..460487299ac6e94d776ff8cff0e5fe9c9023649b 100644 (file)
@@ -28,10 +28,8 @@ import types,string,re
 
 from Noyau import N_CR
 from Noyau.N_utils import repr_float
 
 from Noyau import N_CR
 from Noyau.N_utils import repr_float
-from Accas import ETAPE,PROC_ETAPE,MACRO_ETAPE,ETAPE_NIVEAU,JDC,FORM_ETAPE
-from Accas import MCSIMP,MCFACT,MCBLOC,MCList,EVAL
-from Accas import GEOM,ASSD,MCNUPLET
-from Accas import COMMENTAIRE,PARAMETRE, PARAMETRE_EVAL,COMMANDE_COMM
+import Accas
+from Extensions.parametre import ITEM_PARAMETRE
 from Formatage import Formatage
 
 def entryPoint():
 from Formatage import Formatage
 
 def entryPoint():
@@ -76,6 +74,7 @@ class PythonGenerator:
                          fin='fin CR format python pour python')
       # Le texte au format python est stocké dans l'attribut text
       self.text=''
                          fin='fin CR format python pour python')
       # Le texte au format python est stocké dans l'attribut text
       self.text=''
+      self.appli=None
 
    def writefile(self,filename):
       fp=open(filename,'w')
 
    def writefile(self,filename):
       fp=open(filename,'w')
@@ -90,6 +89,7 @@ class PythonGenerator:
           Si format vaut 'standard', retourne un texte obtenu par concaténation de la liste
           Si format vaut 'beautifie', retourne le meme texte beautifié
       """
           Si format vaut 'standard', retourne un texte obtenu par concaténation de la liste
           Si format vaut 'beautifie', retourne le meme texte beautifié
       """
+      self.appli=obj.appli
       liste= self.generator(obj)
       if format == 'brut':
          self.text=liste
       liste= self.generator(obj)
       if format == 'brut':
          self.text=liste
@@ -109,41 +109,44 @@ class PythonGenerator:
          place (dépend des gouts !!!)
       """
       # ATTENTION a l'ordre des tests : il peut avoir de l'importance (héritage)
          place (dépend des gouts !!!)
       """
       # ATTENTION a l'ordre des tests : il peut avoir de l'importance (héritage)
-      if isinstance(obj,PROC_ETAPE):
+      if isinstance(obj,Accas.PROC_ETAPE):
          return self.generPROC_ETAPE(obj)
          return self.generPROC_ETAPE(obj)
-      elif isinstance(obj,MACRO_ETAPE):
-         return self.generMACRO_ETAPE(obj)
-      elif isinstance(obj,FORM_ETAPE):
+      # Attention doit etre placé avant MACRO (raison : héritage)
+      elif isinstance(obj,Accas.FORM_ETAPE):
          return self.generFORM_ETAPE(obj)
          return self.generFORM_ETAPE(obj)
-      elif isinstance(obj,ETAPE):
+      elif isinstance(obj,Accas.MACRO_ETAPE):
+         return self.generMACRO_ETAPE(obj)
+      elif isinstance(obj,Accas.ETAPE):
          return self.generETAPE(obj)
          return self.generETAPE(obj)
-      elif isinstance(obj,MCFACT):
+      elif isinstance(obj,Accas.MCFACT):
          return self.generMCFACT(obj)
          return self.generMCFACT(obj)
-      elif isinstance(obj,MCList):
+      elif isinstance(obj,Accas.MCList):
          return self.generMCList(obj)
          return self.generMCList(obj)
-      elif isinstance(obj,MCBLOC):
+      elif isinstance(obj,Accas.MCBLOC):
          return self.generMCBLOC(obj)
          return self.generMCBLOC(obj)
-      elif isinstance(obj,MCSIMP):
+      elif isinstance(obj,Accas.MCSIMP):
          return self.generMCSIMP(obj)
          return self.generMCSIMP(obj)
-      elif isinstance(obj,ASSD):
+      elif isinstance(obj,Accas.ASSD):
          return self.generASSD(obj)
          return self.generASSD(obj)
-      elif isinstance(obj,ETAPE_NIVEAU):
+      elif isinstance(obj,Accas.ETAPE_NIVEAU):
          return self.generETAPE_NIVEAU(obj)
          return self.generETAPE_NIVEAU(obj)
-      elif isinstance(obj,COMMENTAIRE):
+      elif isinstance(obj,Accas.COMMENTAIRE):
          return self.generCOMMENTAIRE(obj)
       # Attention doit etre placé avant PARAMETRE (raison : héritage)
          return self.generCOMMENTAIRE(obj)
       # Attention doit etre placé avant PARAMETRE (raison : héritage)
-      elif isinstance(obj,PARAMETRE_EVAL):
+      elif isinstance(obj,Accas.PARAMETRE_EVAL):
          return self.generPARAMETRE_EVAL(obj)
          return self.generPARAMETRE_EVAL(obj)
-      elif isinstance(obj,PARAMETRE):
+      elif isinstance(obj,Accas.PARAMETRE):
          return self.generPARAMETRE(obj)
          return self.generPARAMETRE(obj)
-      elif isinstance(obj,EVAL):
+      elif isinstance(obj,Accas.EVAL):
          return self.generEVAL(obj)
          return self.generEVAL(obj)
-      elif isinstance(obj,COMMANDE_COMM):
+      elif isinstance(obj,Accas.COMMANDE_COMM):
          return self.generCOMMANDE_COMM(obj)
          return self.generCOMMANDE_COMM(obj)
-      elif isinstance(obj,JDC):
+      elif isinstance(obj,Accas.JDC):
          return self.generJDC(obj)
          return self.generJDC(obj)
-      elif isinstance(obj,MCNUPLET):
+      elif isinstance(obj,Accas.MCNUPLET):
          return self.generMCNUPLET(obj)
          return self.generMCNUPLET(obj)
+      elif isinstance(obj,ITEM_PARAMETRE):
+         return self.generITEM_PARAMETRE(obj)
       else:
          raise "Type d'objet non prévu",obj
 
       else:
          raise "Type d'objet non prévu",obj
 
@@ -229,6 +232,9 @@ class PythonGenerator:
       else:
          return obj.nom + ' = '+ self.generator(obj.valeur) +';\n'
 
       else:
          return obj.nom + ' = '+ self.generator(obj.valeur) +';\n'
 
+   def generITEM_PARAMETRE(self,obj):
+       return repr(obj) 
+
    def generPARAMETRE(self,obj):
       """
          Cette méthode convertit un PARAMETRE
    def generPARAMETRE(self,obj):
       """
          Cette méthode convertit un PARAMETRE
@@ -271,11 +277,11 @@ class PythonGenerator:
         str = 'reuse ='+ self.generator(obj.reuse) + ','
         l.append(str)
       for v in obj.mc_liste:
         str = 'reuse ='+ self.generator(obj.reuse) + ','
         l.append(str)
       for v in obj.mc_liste:
-        if isinstance(v,MCBLOC) :
+        if isinstance(v,Accas.MCBLOC) :
           liste=self.generator(v)
           for mocle in liste :
             l.append(mocle)
           liste=self.generator(v)
           for mocle in liste :
             l.append(mocle)
-        elif isinstance(v,MCSIMP) :
+        elif isinstance(v,Accas.MCSIMP) :
           text=self.generator(v)
           l.append(v.nom+'='+text)
         else:
           text=self.generator(v)
           l.append(v.nom+'='+text)
         else:
@@ -296,13 +302,11 @@ class PythonGenerator:
         l=[]
         nom = obj.get_nom()
         if nom == '' : nom = 'sansnom'
         l=[]
         nom = obj.get_nom()
         if nom == '' : nom = 'sansnom'
-        if len(obj.mc_liste)>0:
-            l.append(nom + ' = FORMULE(')
-            s=obj.type_retourne + ' = ' + "'''" + obj.arguments + ' = ' + obj.corps+"'''"
-            l.append(s)
-            l.append(');')
-        else:
-            l.append(nom+' = FORMULE();')
+        l.append(nom + ' = FORMULE(')
+        for v in obj.mc_liste:
+           text=self.generator(v)
+           l.append(v.nom+'='+text)
+        l.append(');')
         return l
 
    def generMACRO_ETAPE(self,obj):
         return l
 
    def generMACRO_ETAPE(self,obj):
@@ -310,7 +314,6 @@ class PythonGenerator:
          Cette méthode convertit une macro-étape
          en une liste de chaines de caractères à la syntaxe python
       """
          Cette méthode convertit une macro-étape
          en une liste de chaines de caractères à la syntaxe python
       """
-      if obj.definition.nom == 'FORMULE' : return self.gen_formule(obj)
       try:
         if obj.sd == None:
           sdname=''
       try:
         if obj.sd == None:
           sdname=''
@@ -326,11 +329,11 @@ class PythonGenerator:
          str = "reuse =" + self.generator(obj.reuse) + ','
          l.append(str)
       for v in obj.mc_liste:
          str = "reuse =" + self.generator(obj.reuse) + ','
          l.append(str)
       for v in obj.mc_liste:
-        if isinstance(v,MCBLOC) :
+        if isinstance(v,Accas.MCBLOC) :
           liste=self.generator(v)
           for mocle in liste :
             l.append(mocle)
           liste=self.generator(v)
           for mocle in liste :
             l.append(mocle)
-        elif isinstance(v,MCSIMP) :
+        elif isinstance(v,Accas.MCSIMP) :
           text=self.generator(v)
           l.append(v.nom+'='+text)
         else:
           text=self.generator(v)
           l.append(v.nom+'='+text)
         else:
@@ -345,30 +348,6 @@ class PythonGenerator:
         l.append(');')
       return l
 
         l.append(');')
       return l
 
-   def gen_formule(self,obj):
-      """
-           Méthode particuliere aux objets de type FORMULE
-      """
-      try:
-        if obj.sd == None:
-          sdname=''
-        else:
-          sdname= self.generator(obj.sd)
-      except:
-        sdname='sansnom'
-      l=[]
-      label=sdname + ' = FORMULE('
-      l.append(label)
-      for v in obj.mc_liste:
-        s=''
-        s= v.nom+':'+sdname+'('+v.valeur+')'
-        l.append(s)
-      if len(l) == 1:
-        l[0]=label+');'
-      else :
-        l.append(');')
-      return l
-
    def generPROC_ETAPE(self,obj):
       """
          Cette méthode convertit une PROC étape
    def generPROC_ETAPE(self,obj):
       """
          Cette méthode convertit une PROC étape
@@ -378,11 +357,11 @@ class PythonGenerator:
       label=obj.definition.nom+'('
       l.append(label)
       for v in obj.mc_liste:
       label=obj.definition.nom+'('
       l.append(label)
       for v in obj.mc_liste:
-        if isinstance(v,MCBLOC) :
+        if isinstance(v,Accas.MCBLOC) :
           liste=self.generator(v)
           for mocle in liste :
             l.append(mocle)
           liste=self.generator(v)
           for mocle in liste :
             l.append(mocle)
-        elif isinstance(v,MCSIMP) :
+        elif isinstance(v,Accas.MCSIMP) :
           text=self.generator(v)
           l.append(v.nom+'='+text)
         else:
           text=self.generator(v)
           l.append(v.nom+'='+text)
         else:
@@ -412,12 +391,12 @@ class PythonGenerator:
       l=[]
       l.append('_F(')
       for v in obj.mc_liste:
       l=[]
       l.append('_F(')
       for v in obj.mc_liste:
-         if not isinstance(v,MCSIMP) and not isinstance (v,MCBLOC) :
+         if not isinstance(v,Accas.MCSIMP) and not isinstance (v,Accas.MCBLOC) :
            # on est en présence d'une entite composée : on récupère une liste
            liste=self.generator(v)
            liste[0]=v.nom+'='+liste[0]
            l.append(liste)
            # on est en présence d'une entite composée : on récupère une liste
            liste=self.generator(v)
            liste[0]=v.nom+'='+liste[0]
            l.append(liste)
-         elif isinstance(v,MCBLOC):
+         elif isinstance(v,Accas.MCBLOC):
            liste=self.generator(v)
            for arg in liste :
              l.append(arg)
            liste=self.generator(v)
            for arg in liste :
              l.append(arg)
@@ -437,12 +416,12 @@ class PythonGenerator:
           Convertit un objet MCList en une liste de chaines de caractères à la
           syntaxe python
       """
           Convertit un objet MCList en une liste de chaines de caractères à la
           syntaxe python
       """
-      l=[]
-      str =  '('
-      l.append(str)
-      for mcfact in obj.data:
-         l.append(self.generator(mcfact))
-      l.append('),')
+      if len(obj.data) > 1:
+         l=['(']
+         for mcfact in obj.data: l.append(self.generator(mcfact))
+         l.append('),')
+      else:
+         l= self.generator(obj.data[0])
       return l
 
    def generMCBLOC(self,obj):
       return l
 
    def generMCBLOC(self,obj):
@@ -452,11 +431,11 @@ class PythonGenerator:
       """
       l=[]
       for v in obj.mc_liste:
       """
       l=[]
       for v in obj.mc_liste:
-        if isinstance(v,MCBLOC) :
+        if isinstance(v,Accas.MCBLOC) :
           liste=self.generator(v)
           for mocle in liste :
             l.append(mocle)
           liste=self.generator(v)
           for mocle in liste :
             l.append(mocle)
-        elif isinstance(v,MCList):
+        elif isinstance(v,Accas.MCList):
           liste=self.generator(v)
           liste[0]=v.nom+'='+liste[0]
           for mocle in liste :
           liste=self.generator(v)
           liste[0]=v.nom+'='+liste[0]
           for mocle in liste :
@@ -483,7 +462,7 @@ class PythonGenerator:
                   s = s + "CO('"+ self.generator(val) +"')"
                elif val.__class__.__name__ == 'CO':
                   s = s + "CO('"+ self.generator(val) +"')"
                   s = s + "CO('"+ self.generator(val) +"')"
                elif val.__class__.__name__ == 'CO':
                   s = s + "CO('"+ self.generator(val) +"')"
-               elif isinstance(val,PARAMETRE):
+               elif isinstance(val,Accas.PARAMETRE):
                   # il ne faut pas prendre la string que retourne gener
                   # mais seulement le nom dans le cas d'un paramètre
                   s = s + val.nom
                   # il ne faut pas prendre la string que retourne gener
                   # mais seulement le nom dans le cas d'un paramètre
                   s = s + val.nom
@@ -506,7 +485,7 @@ class PythonGenerator:
                s = "CO('"+ self.generator(val) +"')"
             elif val.__class__.__name__ == 'CO':
                 s = "CO('"+ self.generator(val) +"')"
                s = "CO('"+ self.generator(val) +"')"
             elif val.__class__.__name__ == 'CO':
                 s = "CO('"+ self.generator(val) +"')"
-            elif isinstance(val,PARAMETRE):
+            elif isinstance(val,Accas.PARAMETRE):
                 # il ne faut pas prendre la string que retourne gener
                 # mais seulement le nom dans le cas d'un paramètre
                 s = val.nom
                 # il ne faut pas prendre la string que retourne gener
                 # mais seulement le nom dans le cas d'un paramètre
                 s = val.nom
@@ -514,7 +493,14 @@ class PythonGenerator:
                 s = self.generator(val)
          elif type(val) == types.FloatType :
             # Pour un flottant on utilise str 
                 s = self.generator(val)
          elif type(val) == types.FloatType :
             # Pour un flottant on utilise str 
-            s = str(val)
+            # ou la notation scientifique
+            try :
+              clefobj=obj.GetNomConcept()
+              if self.parent.appli.dict_reels.has_key(clefobj):
+                 if self.parent.appli.dict_reels[clefobj].has_key(val):
+                    s=self.parent.appli.dict_reels[clefobj][val]
+            except:
+               s = str(val)
          else :
             # Pour les autres types on utilise repr
             s = `val`
          else :
             # Pour les autres types on utilise repr
             s = `val`