Salome HOME
PN
[tools/eficas.git] / generator / generator_homard.py
1 # -*- coding: utf-8 -*-
2 #            CONFIGURATION MANAGEMENT OF EDF VERSION
3 # ======================================================================
4 # COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
5 # THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
6 # IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
7 # THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
8 # (AT YOUR OPTION) ANY LATER VERSION.
9 #
10 # THIS PROGRAM IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, BUT
11 # WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF
12 # MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. SEE THE GNU
13 # GENERAL PUBLIC LICENSE FOR MORE DETAILS.
14 #
15 # YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
16 # ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
17 #    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
18 #
19 #
20 # ======================================================================
21 """
22     Ce module contient le plugin generateur de fichier au format 
23     homard pour EFICAS.
24
25 """
26 import traceback
27 import types,string,re
28
29 from Noyau import N_CR
30 from Noyau.N_utils import repr_float
31 from Accas import ETAPE,PROC_ETAPE,MACRO_ETAPE,ETAPE_NIVEAU,JDC,FORM_ETAPE
32 from Accas import MCSIMP,MCFACT,MCBLOC,MCList,EVAL
33 from Accas import GEOM,ASSD,MCNUPLET
34 from Accas import COMMENTAIRE,PARAMETRE, PARAMETRE_EVAL,COMMANDE_COMM
35 from Formatage import Formatage
36 from generator_python import PythonGenerator
37
38 def entryPoint():
39    """
40        Retourne les informations nécessaires pour le chargeur de plugins
41
42        Ces informations sont retournées dans un dictionnaire
43    """
44    return {
45         # Le nom du plugin
46           'name' : 'homard',
47         # La factory pour créer une instance du plugin
48           'factory' : HomardGenerator,
49           }
50
51
52 class HomardGenerator(PythonGenerator):
53    """
54        Ce generateur parcourt un objet de type JDC et produit
55        un texte au format eficas et 
56        un texte au format homard 
57
58    """
59    # Les extensions de fichier préconisées
60    extensions=('.comm',)
61
62    def __init__(self,cr=None):
63       # Si l'objet compte-rendu n'est pas fourni, on utilise le compte-rendu standard
64       if cr :
65          self.cr=cr
66       else:
67          self.cr=N_CR.CR(debut='CR generateur format homard pour homard',
68                          fin='fin CR format homard pour homard')
69       # Le texte au format homard est stocké dans l'attribut text
70       self.dico_mot_clef={}
71       self.assoc={}
72       self.init_assoc()
73       self.text=''
74       self.textehomard=[]
75
76    def init_assoc(self):
77       self.lmots_clef_calcules = ('SuivFron','TypeBila','ModeHOMA','CCAssoci', 'CCNoChaI','HOMaiN__','HOMaiNP1','CCNumOrI', 'CCNumPTI')
78       self.lmot_clef  = ('CCMaiN__', 'CCNoMN__', 'CCIndica', 'CCSolN__', 'CCFronti', 'CCNoMFro', 'CCMaiNP1', 
79                          'CCNoMNP1', 'CCSolNP1', 'TypeRaff', 'TypeDera', 'NiveauMa', 'SeuilHau', 'SeuilHRe', 
80                          'SeuilHPE', 'NiveauMi', 'SeuilBas', 'SeuilBRe', 'SeuilBPE', 'ListeStd', 'NumeIter', 
81                          'Langue  ', 'CCGroFro', 'CCNoChaI', 'CCNumOrI', 'CCNumPTI', 'SuivFron', 'TypeBila', 
82                          'ModeHOMA', 'HOMaiN__', 'HOMaiNP1','CCCoChaI')
83
84 # Bizarre demander a Gerald : 
85 #               CVSolNP1
86       self.assoc['CCMaiN__']='FICHIER_MED_MAILLAGE_N'
87       self.assoc['CCNoMN__']='NOM_MED_MAILLAGE_N'
88       self.assoc['CCIndica']='FICHIER_MED_MAILLAGE_N'
89       self.assoc['CCSolN__']='FICHIER_MED_MAILLAGE_N'
90       self.assoc['CCFronti']='FIC_FRON'
91       self.assoc['CCNoMFro']='NOM_MED_MAILLAGE_FRONTIERE'
92       self.assoc['CCMaiNP1']='FICHIER_MED_MAILLAGE_NP1'
93       self.assoc['CCNoMNP1']='NOM_MED_MAILLAGE_NP1'
94       self.assoc['CCSolNP1']='FICHIER_MED_MAILLAGE_NP1'
95       self.assoc['TypeRaff']='RAFFINEMENT'
96       self.assoc['TypeDera']='DERAFFINEMENT'
97       self.assoc['NiveauMa']='NIVE_MAX'
98       self.assoc['SeuilHau']='CRIT_RAFF_ABS'
99       self.assoc['SeuilHRe']='CRIT_RAFF_REL'
100       self.assoc['SeuilHPE']='CRIT_RAFF_PE'
101       self.assoc['NiveauMi']='NIVE_MIN'
102       self.assoc['SeuilBas']='CRIT_DERA_ABS'
103       self.assoc['SeuilBRe']='CRIT_DERA_REL'
104       self.assoc['SeuilBPE']='CRIT_DERA_PE'
105       self.assoc['ListeStd']='MESSAGES'
106       self.assoc['NumeIter']='NITER'
107       self.assoc['Langue  ']='LANGUE'
108       self.assoc['CCGroFro']='GROUP_MA'
109 #     self.assoc['CCNoChaI']='NOM_MED' (on doit aussi ajouter 'COMPOSANTE')
110       self.assoc['CCNumOrI']='NUME_ORDRE'
111       self.assoc['CCNumPTI']='NUME_PAS_TEMPS'
112       self.assoc['CCCoChaI']='COMPOSANTE'
113      
114       self.dico_mot_depend={}
115      
116       # Attention a la synthaxe
117       self.dico_mot_depend['CCIndica'] ='self.dico_mot_clef["RAFFINEMENT"] == "LIBRE" or self.dico_mot_clef["DERAFFINEMENT"] == "LIBRE"'
118       self.dico_mot_depend['CCSolN__'] ='self.dico_mot_clef.has_key("NITER")'
119       self.dico_mot_depend['CCSolNP1'] ='self.dico_mot_clef.has_key("NITER")'
120
121    def gener(self,obj,format='brut'):
122       self.text=PythonGenerator.gener(self,obj,format)
123       self.genereConfiguration()
124       return self.text
125
126    def generMCSIMP(self,obj) :
127       """
128           Convertit un objet MCSIMP en une liste de chaines de caractères à la
129           syntaxe homard
130       """
131       s=PythonGenerator.generMCSIMP(self,obj)
132       clef=obj.nom
133       self.dico_mot_clef[clef]=obj.val
134       return s
135
136    def cherche_dependance(self,mot):
137        b_eval = 0
138        a_eval=self.dico_mot_depend[mot]
139        try :
140           b_eval=eval(self.dico_mot_depend[mot])
141        except :
142           for l in a_eval.split(" or "):
143               try:
144                  b_eval=eval(l)
145                  if not (b_eval == 0 ):
146                      break
147               except :
148                  pass
149        return b_eval
150
151
152    def genereConfiguration(self):
153       ligbla=31*' '
154       self.textehomard=[]
155       for mot in self.lmot_clef:
156
157 #         on verifie d'abord que le mot clef doit bien être calculé
158           if self.dico_mot_depend.has_key(mot) :
159              if self.cherche_dependance(mot) == 0 :
160                 continue
161
162           if mot not in self.lmots_clef_calcules :
163              clef_eficas=self.assoc[mot]
164              if self.dico_mot_clef.has_key(clef_eficas):
165                 val=self.dico_mot_clef[clef_eficas]
166                 if val != None:
167                    try :
168                     ligne=mot+' '+val
169                    except:
170                     ligne=mot+' '+repr(val)
171                    ligne.rjust(32)
172                    self.textehomard.append(ligne)
173           else:
174              val=apply(HomardGenerator.__dict__[mot],(self,))
175              if val != None:
176                 mot.rjust(8)
177                 ligne=mot+' '+val
178                 ligne.rjust(32)
179                 self.textehomard.append(ligne)
180
181    def get_homard(self):
182        return self.textehomard
183
184    def SuivFron(self):
185         val="non"
186         if self.dico_mot_clef.has_key('NOM_MED_MAILLAGE_FRONTIERE'):
187            if self.dico_mot_clef['NOM_MED_MAILLAGE_FRONTIERE'] != None:
188                 val="oui"
189         return val
190
191    def TypeBila(self):
192         inttypeBilan = 1
193         retour=None
194         dict_val={'NOMBRE':7,'INTERPENETRATION':3,'QUALITE':5,'CONNEXITE':11,'TAILLE':13}
195         for mot in ('NOMBRE','QUALITE','INTERPENETRATION','CONNEXITE','TAILLE'):
196             if self.dico_mot_clef.has_key(mot):
197                if (self.dico_mot_clef[mot] == "OUI"):
198                   inttypeBilan=inttypeBilan*dict_val[mot]
199                   retour = repr(inttypeBilan)
200         return retour
201
202
203    def ModeHOMA(self):
204         intModeHOMA=1
205         if self.dico_mot_clef.has_key('INFORMATION'):
206            if self.dico_mot_clef['INFORMATION'] == "OUI":
207               intModeHOMA=2
208         return repr(intModeHOMA)
209            
210    def CCAssoci(self):
211         return 'MED' 
212
213    def CCNoChaI(self):
214         if not (self.dico_mot_clef.has_key('NOM_MED')):
215            return None
216         if (self.dico_mot_clef['NOM_MED']== None):
217            return None
218         if not (self.dico_mot_clef.has_key('COMPOSANTE')):
219            return None
220         if (self.dico_mot_clef['COMPOSANTE']== None):
221            return None
222         chaine=self.dico_mot_clef['COMPOSANTE']+' '+self.dico_mot_clef['NOM_MED']
223         return chaine
224
225    def HOMaiN__(self):
226        chaine=None
227        if self.dico_mot_clef.has_key('NITER'):
228           if self.dico_mot_clef['NITER'] != None :
229              num="M"+repr(self.dico_mot_clef['NITER'])
230              chaine=num+" "+num+".hom"
231        return chaine
232
233    def HOMaiNP1(self):
234        chaine=None
235        if self.dico_mot_clef.has_key('NITER'):
236           if self.dico_mot_clef['NITER'] != None :
237              num="M"+repr(self.dico_mot_clef['NITER']+1)
238              chaine=num+" "+num+".hom"
239        return chaine
240
241    def CCNumOrI(self):
242        chaine=repr(1)
243        if self.dico_mot_clef.has_key('NUME_ORDRE'):
244           if self.dico_mot_clef['NUME_ORDRE'] != None :
245             chaine=repr(self.dico_mot_clef['NUME_ORDRE'])
246        return chaine
247
248    def CCNumPTI(self):
249        chaine=repr(1)
250        if self.dico_mot_clef.has_key('NUME_PAS_TEMPS'):
251           if self.dico_mot_clef['NUME_PAS_TEMPS'] != None :
252             chaine=repr(self.dico_mot_clef['NUME_PAS_TEMPS'])
253        return chaine