1 # -*- coding: utf-8 -*-
2 # Copyright (C) 2007-2013 EDF R&D
4 # This library is free software; you can redistribute it and/or
5 # modify it under the terms of the GNU Lesser General Public
6 # License as published by the Free Software Foundation; either
7 # version 2.1 of the License.
9 # This library is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 # Lesser General Public License for more details.
14 # You should have received a copy of the GNU Lesser General Public
15 # License along with this library; if not, write to the Free Software
16 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18 # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
21 Ce module contient le plugin generateur de fichier au format
26 import types,string,re
27 from Extensions.i18n import tr
28 from Extensions.eficas_exception import EficasException
30 from Noyau import N_CR
31 from Noyau.N_utils import repr_float
32 from Accas import ETAPE,PROC_ETAPE,MACRO_ETAPE,ETAPE_NIVEAU,JDC,FORM_ETAPE
33 from Accas import MCSIMP,MCFACT,MCBLOC,MCList,EVAL
34 from Accas import GEOM,ASSD,MCNUPLET
35 from Accas import COMMENTAIRE,PARAMETRE, PARAMETRE_EVAL,COMMANDE_COMM
39 Retourne les informations nécessaires pour le chargeur de plugins
41 Ces informations sont retournées dans un dictionnaire
46 # La factory pour créer une instance du plugin
47 'factory' : AplatGenerator,
53 Ce generateur parcourt un objet de type JDC et produit
54 un fichier au format aplat
56 L'acquisition et le parcours sont réalisés par la méthode
57 generator.gener(objet_jdc,format)
59 L'écriture du fichier au format ini par appel de la méthode
60 generator.writefile(nom_fichier)
62 Ses caractéristiques principales sont exposées dans des attributs
64 - extensions : qui donne une liste d'extensions de fichier préconisées
67 # Les extensions de fichier préconisées
70 def __init__(self,cr=None):
71 # Si l'objet compte-rendu n'est pas fourni, on utilise le compte-rendu standard
75 self.cr=N_CR.CR(debut='CR generateur format aplat pour eficas',
76 fin='fin CR format aplat pour eficas')
78 # Le séparateur utiisé
80 # Le texte au format aplat est stocké dans l'attribut text
83 def writefile(self,filename):
88 def gener(self,obj,format='brut',config=None):
90 Retourne une représentation du JDC obj sous une forme qui est paramétrée par format.
91 Si format vaut 'brut', 'standard' ou 'beautifie', retourne le texte issu de generator
93 liste= self.generator(obj)
96 elif format == 'standard':
98 elif format == 'beautifie':
101 raise EficasException(tr("Format pas implemente : %s", format))
104 def generator(self,obj):
106 Cette methode joue un role d'aiguillage en fonction du type de obj
107 On pourrait utiliser les méthodes accept et visitxxx à la
108 place (dépend des gouts !!!)
110 # ATTENTION a l'ordre des tests : il peut avoir de l'importance (héritage)
111 if isinstance(obj,PROC_ETAPE):
112 return self.generPROC_ETAPE(obj)
113 elif isinstance(obj,MACRO_ETAPE):
114 return self.generMACRO_ETAPE(obj)
115 elif isinstance(obj,FORM_ETAPE):
116 return self.generFORM_ETAPE(obj)
117 elif isinstance(obj,ETAPE):
118 return self.generETAPE(obj)
119 elif isinstance(obj,MCFACT):
120 return self.generMCFACT(obj)
121 elif isinstance(obj,MCList):
122 return self.generMCList(obj)
123 elif isinstance(obj,MCBLOC):
124 return self.generMCBLOC(obj)
125 elif isinstance(obj,MCSIMP):
126 return self.generMCSIMP(obj)
127 elif isinstance(obj,ASSD):
128 return self.generASSD(obj)
129 elif isinstance(obj,ETAPE_NIVEAU):
130 return self.generETAPE_NIVEAU(obj)
131 elif isinstance(obj,COMMENTAIRE):
132 return self.generCOMMENTAIRE(obj)
133 # Attention doit etre placé avant PARAMETRE (raison : héritage)
134 elif isinstance(obj,PARAMETRE_EVAL):
135 return self.generPARAMETRE_EVAL(obj)
136 elif isinstance(obj,PARAMETRE):
137 return self.generPARAMETRE(obj)
138 elif isinstance(obj,EVAL):
139 return self.generEVAL(obj)
140 elif isinstance(obj,COMMANDE_COMM):
141 return self.generCOMMANDE_COMM(obj)
142 elif isinstance(obj,JDC):
143 return self.generJDC(obj)
144 elif isinstance(obj,MCNUPLET):
145 return self.generMCNUPLET(obj)
147 raise EficasException(tr("Format non implemente : %s", format))
150 def generJDC(self,obj):
152 Cette méthode convertit un objet JDC en une chaine de
153 caractères à la syntaxe aplat
156 if obj.definition.l_niveaux == ():
157 # Il n'y a pas de niveaux
158 for etape in obj.etapes:
159 text=text+self.generator(etape)+'\n'
162 for etape_niveau in obj.etapes_niveaux:
163 text=text+self.generator(etape_niveau)+'\n'
166 def generCOMMANDE_COMM(self,obj):
168 Cette méthode convertit un COMMANDE_COMM
169 en une chaine de caractères à la syntaxe aplat
171 l_lignes = string.split(obj.valeur,'\n')
173 for ligne in l_lignes:
174 txt = txt + '##'+ligne+'\n'
177 def generEVAL(self,obj):
179 Cette méthode convertit un EVAL
180 en une chaine de caractères à la syntaxe aplat
182 return 'EVAL("""'+ obj.valeur +'""")'
184 def generCOMMENTAIRE(self,obj):
186 Cette méthode convertit un COMMENTAIRE
187 en une chaine de caractères à la syntaxe aplat
189 l_lignes = string.split(obj.valeur,'\n')
191 for ligne in l_lignes:
192 txt = txt + '#'+ligne+'\n'
195 def generPARAMETRE_EVAL(self,obj):
197 Cette méthode convertit un PARAMETRE_EVAL
198 en une chaine de caractères à la syntaxe aplat
200 if obj.valeur == None:
201 return obj.nom + ' = None ;\n'
203 return obj.nom + ' = '+ self.generator(obj.valeur) +';\n'
205 def generPARAMETRE(self,obj):
207 Cette méthode convertit un PARAMETRE
208 en une chaine de caractères à la syntaxe aplat
210 if type(obj.valeur) == types.StringType:
211 # PN pour corriger le bug a='3+4' au lieu de a= 3+4
212 #return obj.nom + " = '" + obj.valeur + "';\n"
213 return obj.nom + " = " + obj.valeur + ";\n"
215 return obj.nom + ' = ' + str(obj.valeur) + ';\n'
217 def generETAPE_NIVEAU(self,obj):
219 Cette méthode convertit une étape niveau
220 en une chaine de caractères à la syntaxe aplat
223 if obj.etapes_niveaux == []:
224 for etape in obj.etapes:
225 text=text+self.generator(etape)+'\n'
227 for etape_niveau in obj.etapes_niveaux:
228 text=text+self.generator(etape_niveau)+'\n'
231 def gener_etape(self,obj):
233 Cette méthode est utilisé pour convertir les objets etape
234 en une chaine de caractères à la syntaxe aplat
237 for v in obj.mc_liste:
238 text=text + self.generator(v)
240 return self.init+'\n'
244 def generETAPE(self,obj):
246 Cette méthode convertit une étape
247 en une chaine de caractères à la syntaxe aplat
250 sdname= self.generator(obj.sd)
253 self.init = sdname + self.sep + obj.nom
254 return self.gener_etape(obj)
256 def generMACRO_ETAPE(self,obj):
258 Cette méthode convertit une macro-étape
259 en une chaine de caractères à la syntaxe aplat
265 sdname= self.generator(obj.sd)
266 self.init = sdname + self.sep + obj.nom
268 self.init = 'sansnom' + self.sep + obj.nom
270 return self.gener_etape(obj)
272 generPROC_ETAPE = generMACRO_ETAPE
274 generFORM_ETAPE = generMACRO_ETAPE
276 def generASSD(self,obj):
278 Convertit un objet dérivé d'ASSD en une chaine de caractères à la
281 return obj.get_name()
283 def generMCList(self,obj):
285 Convertit un objet MCList en une chaine de caractères à la
290 init = self.init + self.sep + obj.nom
292 for data in obj.data :
294 self.init = init + self.sep + "occurrence n°"+`i`
295 text = text + self.generator(data)
299 def generMCSIMP(self,obj) :
301 Convertit un objet MCSIMP en une chaine de caractères à la
304 if type(obj.valeur) in (types.TupleType,types.ListType) :
305 # On est en présence d'une liste de valeur
307 for val in obj.valeur:
308 if type(val) == types.InstanceType :
309 rep = rep + self.generator(val) +','
311 rep = rep + `val`+','
313 elif type(obj.valeur) == types.InstanceType :
314 # On est en présence d'une valeur unique de type instance
315 rep = self.generator(obj.valeur)
317 # On est en présence d'une valeur unique
319 return self.init + self.sep + obj.nom + ' :' + rep + '\n'
321 def generMCCOMPO(self,obj):
323 Convertit un objet MCCOMPO en une chaine de caractères à la
328 self.init = self.init + self.sep + obj.nom
329 for mocle in obj.mc_liste :
330 text = text + self.generator(mocle)
334 generMCFACT=generMCCOMPO
336 generMCBLOC=generMCCOMPO
338 generMCNUPLET=generMCCOMPO