X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=generator%2Fgenerator_python.py;h=e49ca579150ef653b26290e4a5b5a4ab6148c921;hb=4147504b4d035ba277d39be61779ed638405c48a;hp=309d12beefe5e234f896ed7d16c8a817a5cbb27f;hpb=f915c06cd9182a855ff99527a373ff976fbcd815;p=tools%2Feficas.git diff --git a/generator/generator_python.py b/generator/generator_python.py index 309d12be..e49ca579 100644 --- a/generator/generator_python.py +++ b/generator/generator_python.py @@ -1,23 +1,22 @@ # -*- coding: utf-8 -*- -# CONFIGURATION MANAGEMENT OF EDF VERSION -# ====================================================================== -# COPYRIGHT (C) 1991 - 2002 EDF R&D WWW.CODE-ASTER.ORG -# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY -# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY -# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR -# (AT YOUR OPTION) ANY LATER VERSION. +# Copyright (C) 2007-2013 EDF R&D # -# THIS PROGRAM IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, BUT -# WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF -# MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. SEE THE GNU -# GENERAL PUBLIC LICENSE FOR MORE DETAILS. +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. # -# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE -# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER, -# 1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE. +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. # +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com # -# ====================================================================== """ Ce module contient le plugin generateur de fichier au format python pour EFICAS. @@ -31,19 +30,23 @@ from Noyau.N_utils import repr_float import Accas import Extensions from Extensions.parametre import ITEM_PARAMETRE -from Formatage import Formatage +from Formatage import Formatage +from Formatage import FormatageLigne from Extensions.param2 import Formula +from Extensions.eficas_exception import EficasException +from Extensions.i18n import tr + def entryPoint(): """ - Retourne les informations nécessaires pour le chargeur de plugins + Retourne les informations necessaires pour le chargeur de plugins - Ces informations sont retournées dans un dictionnaire + Ces informations sont retournees dans un dictionnaire """ return { # Le nom du plugin 'name' : 'python', - # La factory pour créer une instance du plugin + # La factory pour creer une instance du plugin 'factory' : PythonGenerator, } @@ -53,18 +56,18 @@ class PythonGenerator: Ce generateur parcourt un objet de type JDC et produit un fichier au format python - L'acquisition et le parcours sont réalisés par la méthode + L'acquisition et le parcours sont realises par la methode generator.gener(objet_jdc,format) - L'écriture du fichier au format ini par appel de la méthode + L'ecriture du fichier au format ini par appel de la methode generator.writefile(nom_fichier) - Ses caractéristiques principales sont exposées dans des attributs + Ses caracteristiques principales sont exposees dans des attributs de classe : - - extensions : qui donne une liste d'extensions de fichier préconisées + - extensions : qui donne une liste d'extensions de fichier preconisees """ - # Les extensions de fichier préconisées + # Les extensions de fichier preconisees extensions=('.comm',) def __init__(self,cr=None): @@ -74,7 +77,7 @@ class PythonGenerator: else: self.cr=N_CR.CR(debut='CR generateur format python pour python', fin='fin CR format python pour python') - # Le texte au format python est stocké dans l'attribut text + # Le texte au format python est stocke dans l'attribut text self.text='' self.appli=None @@ -83,13 +86,13 @@ class PythonGenerator: fp.write(self.text) fp.close() - def gener(self,obj,format='brut'): + def gener(self,obj,format='brut',config=None,appli=None): """ - Retourne une représentation du JDC obj sous une - forme qui est paramétrée par format. + Retourne une representation du JDC obj sous une + forme qui est parametree par format. Si format vaut 'brut', retourne une liste de listes de ... - 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 concatenation de la liste + Si format vaut 'beautifie', retourne le meme texte beautifie """ self.appli=obj.get_jdc_root().appli #self.appli=obj.appli @@ -101,21 +104,23 @@ class PythonGenerator: elif format == 'beautifie': jdc_formate = Formatage(liste,mode='.py') self.text=jdc_formate.formate_jdc() + elif format == 'Ligne': + jdc_formate = FormatageLigne(liste,mode='.py') + self.text=jdc_formate.formate_jdc() else: - raise "Format pas implémenté : "+format + raise EficasException(tr("Format non implemente ") +format) return self.text def generator(self,obj): """ Cette methode joue un role d'aiguillage en fonction du type de obj - On pourrait utiliser les méthodes accept et visitxxx à la - place (dépend des gouts !!!) + On pourrait utiliser les methodes accept et visitxxx a la + place (depend des gouts !!!) """ - # ATTENTION a l'ordre des tests : il peut avoir de l'importance (héritage) - premier=1 + # ATTENTION a l'ordre des tests : il peut avoir de l'importance (heritage) if isinstance(obj,Accas.PROC_ETAPE): return self.generPROC_ETAPE(obj) - # Attention doit etre placé avant MACRO (raison : héritage) + # Attention doit etre place avant MACRO (raison : heritage) elif isinstance(obj,Accas.FORM_ETAPE): return self.generFORM_ETAPE(obj) elif isinstance(obj,Accas.MACRO_ETAPE): @@ -135,8 +140,8 @@ class PythonGenerator: elif isinstance(obj,Accas.ETAPE_NIVEAU): return self.generETAPE_NIVEAU(obj) elif isinstance(obj,Accas.COMMENTAIRE): - return self.generCOMMENTAIRE(obj,premier) - # Attention doit etre placé avant PARAMETRE (raison : héritage) + return self.generCOMMENTAIRE(obj) + # Attention doit etre place avant PARAMETRE (raison : heritage) elif isinstance(obj,Accas.PARAMETRE_EVAL): return self.generPARAMETRE_EVAL(obj) elif isinstance(obj,Accas.PARAMETRE): @@ -154,13 +159,12 @@ class PythonGenerator: elif isinstance(obj,Formula): return self.generFormula(obj) else: - raise "Type d'objet non prévu",obj - premier=0 + raise EficasException(tr("Type d'objet non prevu") +obj) def generJDC(self,obj): """ - Cette méthode convertit un objet JDC en une liste de chaines de - caractères à la syntaxe python + Cette methode convertit un objet JDC en une liste de chaines de + caracteres a la syntaxe python """ l=[] if obj.definition.l_niveaux == (): @@ -172,7 +176,7 @@ class PythonGenerator: for etape_niveau in obj.etapes_niveaux: l.extend(self.generator(etape_niveau)) if l != [] : - # Si au moins une étape, on ajoute le retour chariot sur la dernière étape + # Si au moins une etape, on ajoute le retour chariot sur la derniere etape if type(l[-1])==types.ListType: l[-1][-1] = l[-1][-1]+'\n' elif type(l[-1])==types.StringType: @@ -181,7 +185,7 @@ class PythonGenerator: def generMCNUPLET(self,obj): """ - Méthode générant une représentation de self permettant son ecriture + Methode generant une representation de self permettant son ecriture dans le format python """ l=[] @@ -194,8 +198,8 @@ class PythonGenerator: def generCOMMANDE_COMM(self,obj): """ - Cette méthode convertit un COMMANDE_COMM - en une liste de chaines de caractères à la syntaxe python + Cette methode convertit un COMMANDE_COMM + en une liste de chaines de caracteres a la syntaxe python """ l_lignes = string.split(obj.valeur,'\n') txt='' @@ -205,18 +209,18 @@ class PythonGenerator: def generEVAL(self,obj): """ - Cette méthode convertit un EVAL - en une liste de chaines de caractères à la syntaxe python + Cette methode convertit un EVAL + en une liste de chaines de caracteres a la syntaxe python """ return 'EVAL("""'+ obj.valeur +'""")' - def generCOMMENTAIRE(self,obj,premier=0): + def generCOMMENTAIRE(self,obj): """ - Cette méthode convertit un COMMENTAIRE - en une liste de chaines de caractères à la syntaxe python + Cette methode convertit un COMMENTAIRE + en une liste de chaines de caracteres a la syntaxe python """ - # modification pour répondre à la demande de C. Durand, d'éviter - # l'ajout systématique d'un dièse, à la suite du commentaire + # modification pour repondre a la demande de C. Durand, d'eviter + # l'ajout systematique d'un diese, a la suite du commentaire # Dans la chaine de caracteres obj.valeur, on supprime le dernier # saut de ligne sans_saut = re.sub("\n$","",obj.valeur) @@ -227,18 +231,18 @@ class PythonGenerator: txt = txt + '#'+ligne+'\n' # suppression du dernier saut de ligne - txt = re.sub("\n$","",txt) + #txt = re.sub("\n$","",txt) # on ajoute un saut de ligne avant pattern=re.compile(" ?\#") m=pattern.match(txt) - if m and not premier: + if m: txt="\n"+txt return txt def generPARAMETRE_EVAL(self,obj): """ - Cette méthode convertit un PARAMETRE_EVAL - en une liste de chaines de caractères à la syntaxe python + Cette methode convertit un PARAMETRE_EVAL + en une liste de chaines de caracteres a la syntaxe python """ if obj.valeur == None: return obj.nom + ' = None ;\n' @@ -254,15 +258,15 @@ class PythonGenerator: def generPARAMETRE(self,obj): """ - Cette méthode convertit un PARAMETRE - en une liste de chaines de caractères à la syntaxe python + Cette methode convertit un PARAMETRE + en une liste de chaines de caracteres a la syntaxe python """ return repr(obj) + ";\n" def generETAPE_NIVEAU(self,obj): """ - Cette méthode convertit une étape niveau - en une liste de chaines de caractères à la syntaxe python + Cette methode convertit une etape niveau + en une liste de chaines de caracteres a la syntaxe python """ l=[] if obj.etapes_niveaux == []: @@ -275,11 +279,12 @@ class PythonGenerator: def generETAPE(self,obj): """ - Cette méthode convertit une étape - en une liste de chaines de caractères à la syntaxe python + Cette methode convertit une etape + en une liste de chaines de caracteres a la syntaxe python """ try: sdname= self.generator(obj.sd) + if string.find(sdname,'SD_') != -1: sdname='sansnom' except: sdname='sansnom' l=[] @@ -309,7 +314,7 @@ class PythonGenerator: def generFORM_ETAPE(self,obj): """ - Méthode particulière pour les objets de type FORMULE + Methode particuliere pour les objets de type FORMULE """ l=[] nom = obj.get_nom() @@ -323,8 +328,8 @@ class PythonGenerator: def generMACRO_ETAPE(self,obj): """ - Cette méthode convertit une macro-étape - en une liste de chaines de caractères à la syntaxe python + Cette methode convertit une macro-etape + en une liste de chaines de caracteres a la syntaxe python """ try: if obj.sd == None: @@ -362,8 +367,8 @@ class PythonGenerator: def generPROC_ETAPE(self,obj): """ - Cette méthode convertit une PROC étape - en une liste de chaines de caractères à la syntaxe python + Cette methode convertit une PROC etape + en une liste de chaines de caracteres a la syntaxe python """ l=[] label=obj.definition.nom+'(' @@ -390,21 +395,21 @@ class PythonGenerator: def generASSD(self,obj): """ - Convertit un objet dérivé d'ASSD en une chaine de caractères à la + Convertit un objet derive d'ASSD en une chaine de caracteres a la syntaxe python """ return obj.get_name() def generMCFACT(self,obj): """ - Convertit un objet MCFACT en une liste de chaines de caractères à la + Convertit un objet MCFACT en une liste de chaines de caracteres a la syntaxe python """ l=[] l.append('_F(') for v in obj.mc_liste: 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 + # on est en presence d'une entite composee : on recupere une liste liste=self.generator(v) liste[0]=v.nom+'='+liste[0] l.append(liste) @@ -413,19 +418,19 @@ class PythonGenerator: for arg in liste : l.append(arg) else: - # on est en présence d'un MCSIMP : on récupère une string + # on est en presence d'un MCSIMP : on recupere une string text =self.generator(v) - l.append(v.nom+'='+text) - # il faut être plus subtil dans l'ajout de la virgule en différenciant - # le cas où elle est obligatoire (si self a des frères cadets + if v.nom != "Consigne" : l.append(v.nom+'='+text) + # il faut etre plus subtil dans l'ajout de la virgule en differenciant + # le cas ou elle est obligatoire (si self a des freres cadets # dans self.parent) ou non - # (cas où self est seul ou le benjamin de self.parent) + # (cas ou self est seul ou le benjamin de self.parent) l.append('),') return l def generMCList(self,obj): """ - Convertit un objet MCList en une liste de chaines de caractères à la + Convertit un objet MCList en une liste de chaines de caracteres a la syntaxe python """ if len(obj.data) > 1: @@ -438,7 +443,7 @@ class PythonGenerator: def generMCBLOC(self,obj): """ - Convertit un objet MCBLOC en une liste de chaines de caractères à la + Convertit un objet MCBLOC en une liste de chaines de caracteres a la syntaxe python """ l=[] @@ -471,24 +476,20 @@ class PythonGenerator: l.append(data) return l - def format_item(self,valeur,etape): - if type(valeur) == types.InstanceType : - if valeur.__class__.__name__ == 'CO' or hasattr(etape,'sdprods') and valeur in etape.sdprods : - s = "CO('"+ self.generator(valeur) +"')" - elif isinstance(valeur,Accas.PARAMETRE): - # il ne faut pas prendre la string que retourne gener - # mais seulement le nom dans le cas d'un paramètre - s = valeur.nom - else: - s = self.generator(valeur) - elif type(valeur) == types.FloatType : - # Pour un flottant on utilise str + + def format_item(self,valeur,etape,obj,vientDeListe=0): + if (type(valeur) == types.FloatType or 'R' in obj.definition.type) and not(isinstance(valeur,Accas.PARAMETRE)) : + # Pour un flottant on utilise str ou repr si on vient d une liste # ou la notation scientifique + # On ajoute un . si il n y en a pas dans la valeur s = str(valeur) + if vientDeListe and repr(valeur) != str(valeur) : s=repr(valeur) + if (s.find('.')== -1 and s.find('e')== -1 and s.find('E')==-1) : s=s+'.0' clefobj=etape.get_sdname() - if self.appli.dict_reels.has_key(clefobj): - if self.appli.dict_reels[clefobj].has_key(valeur): - s=self.appli.dict_reels[clefobj][valeur] + if self.appli.appliEficas and self.appli.appliEficas.dict_reels.has_key(clefobj): + if self.appli.appliEficas.dict_reels[clefobj].has_key(valeur): + s=self.appli.appliEficas.dict_reels[clefobj][valeur] + elif type(valeur) == types.StringType : if valeur.find('\n') == -1: # pas de retour chariot, on utilise repr @@ -498,43 +499,89 @@ class PythonGenerator: s='"""'+valeur+'"""' else: s = repr(valeur) + elif isinstance(valeur,Accas.CO) or hasattr(etape,'sdprods') and valeur in etape.sdprods: + s = "CO('"+ self.generator(valeur) +"')" + elif isinstance(valeur,Accas.ASSD): + s = self.generator(valeur) + elif isinstance(valeur,Accas.PARAMETRE): + # il ne faut pas prendre la string que retourne gener + # mais seulement le nom dans le cas d'un parametre + s = valeur.nom + + #elif type(valeur) == types.InstanceType or isinstance(valeur,object): + # if valeur.__class__.__name__ == 'CO' or hasattr(etape,'sdprods') and valeur in etape.sdprods : + # s = "CO('"+ self.generator(valeur) +"')" + # elif isinstance(valeur,Accas.PARAMETRE): + # il ne faut pas prendre la string que retourne gener + # mais seulement le nom dans le cas d'un parametre + # s = valeur.nom + # else: + # s = self.generator(valeur) + else : # Pour les autres types on utilise repr s = repr(valeur) return s - def generMCSIMP(self,obj) : """ - Convertit un objet MCSIMP en une liste de chaines de caractères à la + Convertit un objet MCSIMP en une liste de chaines de caracteres a la syntaxe python """ + waitTuple=0 if type(obj.valeur) in (types.TupleType,types.ListType) : s = '' - for val in obj.valeur : - s =s +self.format_item(val,obj.etape) + ',' - if len(obj.valeur) > 1: - s = '(' + s + '),' + for ss_type in obj.definition.type: + if repr(ss_type).find('Tuple') != -1 : + waitTuple=1 + break + + if waitTuple : + #s = str(obj.valeur) +',' + #obj.valeurFormatee=obj.valeur + s = obj.GetText() +',' + obj.valeurFormatee=obj.GetText() + else : + obj.valeurFormatee=[] + for val in obj.valeur : + s =s +self.format_item(val,obj.etape,obj,1) + ',' + if obj.wait_TXM() : + obj.valeurFormatee.append(val) + else : + obj.valeurFormatee.append(self.format_item(val,obj.etape,obj)) + if len(obj.valeur) >= 1: + s = '(' + s + '),' + if obj.valeur==[] or obj.valeur==() : s="()," if obj.nbrColonnes() : - s=self.formatColonnes(obj.nbrColonnes(),s) + s=self.formatColonnes(obj.nbrColonnes(),obj.valeur,obj) else : - s=self.format_item(obj.valeur,obj.etape) + ',' + obj.valeurFormatee=obj.valeur + s=self.format_item(obj.valeur,obj.etape,obj) + ',' return s - def formatColonnes(self,nbrColonnes,text): - try : - #if 1 == 1 : - liste=text.split(",") + def formatColonnes(self,nbrColonnes,listeValeurs,obj): + #try : + if 1 == 1 : indice=0 - textformat="" - while ( indice < len(liste) -2 ) : - for l in range(nbrColonnes) : - textformat=textformat+liste[indice]+"," - indice=indice+1 - textformat=textformat+"\n" - textformat=textformat+")," - except : - #else : - textformat=text + textformat="(" + while ( indice < len(listeValeurs) ) : + try : + #if 1 : + for l in range(nbrColonnes) : + texteVariable=self.format_item(listeValeurs[indice],obj.etape,obj) + textformat=textformat+texteVariable+" ," + indice=indice+1 + textformat=textformat+"\n" + except : + #else : + while ( indice < len(listeValeurs) ) : + texteVariable=self.format_item(listeValeurs[indice],obj.etape,obj) + textformat=textformat+texteVariable+", " + indice=indice+1 + textformat=textformat+"\n" + textformat=textformat[0:-1]+"),\n" + #except : + else : + textformat=str(obj.valeur) return textformat