]> SALOME platform Git repositories - modules/eficas.git/commitdiff
Salome HOME
pour traduction des mots-clefs
authorpascale.noyret <pascale.noyret@edf.fr>
Tue, 3 Nov 2015 15:21:45 +0000 (16:21 +0100)
committerpascale.noyret <pascale.noyret@edf.fr>
Tue, 3 Nov 2015 15:21:45 +0000 (16:21 +0100)
InterfaceQT4/browser.py
InterfaceQT4/feuille.py
InterfaceQT4/monChoixCommande.py
InterfaceQT4/monWidgetOptionnel.py
InterfaceQT4/monWidgetRadioButton.py
InterfaceQT4/qtEficas.py
generator/generator_CARMEL3D_frequentiel.py
generator/generator_CARMEL3D_temporel.py
generator/generator_PSEN.py

index 0f1b30b588751cfa39017940517383e9fc4fc271..7b49f301bed6330b182f6ea4c8da92481a1ec598 100644 (file)
@@ -130,10 +130,12 @@ class JDCTree( QTreeWidget,GereRegles ):
              item.setExpanded(True)
              return
         item.deplieToutEtReaffiche()
+        self.inhibeExpand == False 
 
 
     def handleOnItem(self,item,int):
         #print "je passe dans handleOnItem pour ",self, item.item.nom, item, item.item
+        
         self.inhibeExpand == True 
         self.itemCourrant=item
         itemParent=item
@@ -722,6 +724,8 @@ class JDCNode(QTreeWidgetItem,GereRegles):
 
     def plieToutEtReafficheSaufItem(self, itemADeplier):
         #print "je suis dans plieToutEtReaffiche", self.item.get_nom()
+        from InterfaceQT4 import compojdc
+        if (isinstance(self, compojdc.Node)) : self.affichePanneau(); return 
         self.editor.deplier = False
         for item in self.children :
             # il ne faut pas plier les blocs 
@@ -729,13 +733,14 @@ class JDCNode(QTreeWidgetItem,GereRegles):
             if (isinstance(item,compobloc.Node)) : continue
             item.setPlie()
             if item==itemADeplier : 
-                  print itemADeplier.item.nom
                   itemADeplier.setDeplie()
         
         self.affichePanneau()
 
     def plieToutEtReaffiche(self):
         #print "je suis dans plieToutEtReaffiche", self.item.get_nom()
+        from InterfaceQT4 import compojdc
+        if (isinstance(self, compojdc.Node)) : self.affichePanneau(); return 
         self.editor.deplier = False
         for item in self.children :
             # il ne faut pas plier les blocs 
index c910e327f64827fad4d80800d52697a8b75724f0..780ca95ec278986689a1dbc5f75c19943fe20171 100644 (file)
@@ -181,6 +181,9 @@ class Feuille(QWidget,ContientIcones,SaisieValeur,FacultatifOuOptionnel):
       else :
          if hasattr(self, 'AAfficher'): self.AAfficher.setFocus(7)
 
+   def rendVisible(self):
+       #print "jjjjjjjjjjjjjjjjjjjjj"
+       pass
 
    def traiteClicSurLabel(self,texte):
        #print self.aide 
index 59cb201eaf8baacb7e88de105572759ddc8f8610..3fdab859e6e1decdb66cbf7a77ec08e8132916fa 100644 (file)
@@ -36,7 +36,12 @@ class MonChoixCommande(Ui_ChoixCommandes,QtGui.QWidget):
   def __init__(self,node, jdc_item, editor):
       QtGui.QWidget.__init__(self,None)
       self.setupUi(self)
-      #self.labelIcone.setText('<img src="/local00/home/A96028/Install_EficasV1/KarineEficas/InterfaceQT4/loopOff.png">');
+
+      self.repIcon=os.path.join( os.path.dirname(os.path.abspath(__file__)),'..','Editeur','icons')
+      iconeFile=os.path.join(self.repIcon,'lettreRblanc30.png')
+      icon = QIcon(iconeFile)
+      self.RBRegle.setIcon(icon)
+      self.RBRegle.setIconSize(QtCore.QSize(21, 31))
 
       self.item = jdc_item
       self.node = node
@@ -44,6 +49,7 @@ class MonChoixCommande(Ui_ChoixCommandes,QtGui.QWidget):
       self.jdc  = self.item.object.get_jdc_root()
       debutTitre=self.editor.titre
       self.listeWidget=[]
+      self.dicoCmd={}
       if self.editor.fichier != None : 
           nouveauTitre=debutTitre+" "+str(os.path.basename(self.editor.fichier))
       else :
@@ -165,6 +171,7 @@ class MonChoixCommande(Ui_ChoixCommandes,QtGui.QWidget):
       if self.affiche_alpha==1 :
          liste=self.creeListeCommande(filtre)
          for cmd in liste :
+           self.dicoCmd[tr(cmd)]=cmd
            rbcmd=(QRadioButton(tr(cmd)))
            self.buttonGroup.addButton(rbcmd)
            self.commandesLayout.addWidget(rbcmd)
@@ -186,6 +193,7 @@ class MonChoixCommande(Ui_ChoixCommandes,QtGui.QWidget):
               if aAjouter == 1 :
                  self.commandesLayout.addWidget(label)
                  aAjouter=0
+              self.dicoCmd[tr(cmd)]=cmd
               rbcmd=(QRadioButton(tr(cmd)))
               self.buttonGroup.addButton(rbcmd)
               self.commandesLayout.addWidget(rbcmd)
@@ -204,6 +212,7 @@ class MonChoixCommande(Ui_ChoixCommandes,QtGui.QWidget):
             if cmd in listeFiltre :
                  liste.append(cmd)
          for cmd in liste :
+           self.dicoCmd[tr(cmd)]=cmd
            rbcmd=(QRadioButton(tr(cmd)))
            self.buttonGroup.addButton(rbcmd)
            self.commandesLayout.addWidget(rbcmd)
@@ -217,7 +226,7 @@ class MonChoixCommande(Ui_ChoixCommandes,QtGui.QWidget):
       self.ajouteRadioButtons()
 
   def rbClique(self,id):
-      self.name=str(id.text().toLatin1())
+      self.name=self.dicoCmd[str(id.text().toLatin1())]
       definitionEtape=getattr(self.jdc.cata[0],self.name)
       commentaire=getattr(definitionEtape,self.jdc.lang)
       try :
index 93a81041ac0f92a23d3b95f27f36e707f2017cf0..2bcef99c21776c177bc1a80d82cc0b9cc4ecae6b 100644 (file)
@@ -30,11 +30,12 @@ from desWidgetOptionnel import Ui_WidgetOptionnel
 class monButtonCustom(QCheckBox):
 
    def __init__(self,texte,monOptionnel,parent=None):
-      QCheckBox.__init__(self,texte,parent)
+      QCheckBox.__init__(self,QString(tr(texte)),parent)
+      self.texte=texte
       self.monOptionnel=monOptionnel
 
    def mouseDoubleClickEvent(self, event):
-      #print "dans mouseDoubleClickEvent"
+      #print "dans mouseDoubleClickEvent", self
       if self not in self.monOptionnel.dicoCb.keys() : 
          event.accept()
          return
@@ -90,13 +91,14 @@ class MonWidgetOptionnel (QWidget,Ui_WidgetOptionnel):
      self.GeneaLabel.setText(tr("Options pour \n") +texte)
 
      for cb in self.dicoCb.keys():
-         #print 'je detruit', self.dicoCb[cb], cb
+         #print 'je detruis', self.dicoCb[cb], cb
          #print cb.close()
          cb.close()
+
      self.dicoCb={}
      liste.reverse()
      for mot in liste :
-         cb = monButtonCustom(QString(mot),self)
+         cb = monButtonCustom(mot,self)
          #print "j ajoute ", mot, cb
          self.dicoCb[cb]=mot
          self.commandesOptionnellesLayout.insertWidget(0,cb)
@@ -104,7 +106,6 @@ class MonWidgetOptionnel (QWidget,Ui_WidgetOptionnel):
 
   def CBChecked(self):
       # ordre ?
-      #print "kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk"
       return
       for cb in self.dicoCb.keys() :
           if cb.isChecked()      and self.dicoCb[cb] not in self.listeChecked : self.listeChecked.append(self.dicoCb[cb])
index cff2bbc226888a28bc82549e899c0d560c7182dd..fa5b7c6c4be53db3a0971577e48a592ee86d15ff 100644 (file)
@@ -65,7 +65,7 @@ class MonWidgetRadioButtonCommun (Feuille):
          bouton=getattr(self,nomBouton)
          valeur=self.maListeDeValeur[i-1]
          if not(type(valeur) in types.StringTypes) : valeur=str(valeur)
-         bouton.setText(valeur)
+         bouton.setText(tr(valeur))
          self.dict_bouton[valeur]=bouton
          self.connect(bouton,SIGNAL("clicked()"),self.boutonclic)
          bouton.keyPressEvent=self.keyPressEvent
index e38f1e610ecd7cfd34e58102d9d774c948924aa4..99c60c4caef202f571ba376de972117f61b9b30f 100644 (file)
@@ -42,11 +42,6 @@ class Appli(Ui_Eficas,QMainWindow):
         """
         QMainWindow.__init__(self,parent)
         Ui_Eficas.__init__(self)
-        self.setupUi(self)
-        self.myQtab.removeTab(0)
-        self.blEntete= QBoxLayout(0,self.frameEntete)
-        self.blEntete.insertWidget(0,self.toolBar)
-        self.blEntete.insertWidget(0,self.menubar)
 
 
         version=getEficasVersion()
@@ -70,14 +65,27 @@ class Appli(Ui_Eficas,QMainWindow):
           import eficasSalome
           Accas.SalomeEntry = eficasSalome.SalomeEntry
 
-        #self.ajoutIcones()
         self.multi=multi
-        if langue=='fr': self.langue=langue
-        else           : self.langue="ang"
         if self.multi == False :
              self.definitCode(code,ssCode)
              if code==None: return
 
+        if not self.salome and hasattr(self.CONFIGURATION,'lang') : langue=self.CONFIGURATION.lang
+        if langue=='fr': self.langue=langue
+        else           : self.langue="ang"
+
+        from Extensions import localisation
+        app=QApplication
+        localisation.localise(app,langue)
+
+        self.setupUi(self)
+
+        self.myQtab.removeTab(0)
+        self.blEntete= QBoxLayout(0,self.frameEntete)
+        self.blEntete.insertWidget(0,self.toolBar)
+        self.blEntete.insertWidget(0,self.menubar)
+
+
         eficas_root_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
 
         self.viewmanager = MyTabview(self)
@@ -91,7 +99,6 @@ class Appli(Ui_Eficas,QMainWindow):
         self.toolBar.addSeparator()
         if self.code != None : self.construitMenu()
 
-
         self.setWindowTitle(self.VERSION_EFICAS)
         self.ouvreFichiers()
 
@@ -247,7 +254,7 @@ class Appli(Ui_Eficas,QMainWindow):
     def CARMEL3D(self):
         #if self.salome == 0 : return
         self.enleverNewInclude()
-        self.menuMesh = self.menubar.addMenu("menuMesh")
+        self.menuMesh = self.menubar.addMenu(tr("Gestion Maillage"))
         self.menuMesh.setObjectName("Mesh")
         self.menuMesh.addAction(self.actionChercheGrpMaille)
         self.griserActionsStructures()
@@ -381,12 +388,12 @@ class Appli(Ui_Eficas,QMainWindow):
 
         # Pour Carmel
         self.actionChercheGrpMaille = QAction(self)
-        self.actionChercheGrpMaille.setText(tr("Acquiert Groupe Maille"))
+        self.actionChercheGrpMaille.setText(tr("Acquiert groupe mailles"))
         self.connect(self.actionChercheGrpMaille,SIGNAL("triggered()"),self.ChercheGrpMaille)
 
         # Pour CarmelCND
         self.actionChercheGrp = QAction(self)
-        self.actionChercheGrp.setText(tr("Accquisition Groupe Maille"))
+        self.actionChercheGrp.setText(tr("Acquisition Groupe Maille"))
         self.connect(self.actionChercheGrp,SIGNAL("triggered()"),self.ChercheGrp)
 
         # Pour Aide
index 0b6f2907b81532b6c8e5c74336544c673002007e..5fa1e0619fefc5e34bc308beb0252b08ef286b93 100755 (executable)
@@ -149,6 +149,11 @@ class CARMEL3DFV0Generator(PythonGenerator):
       self.dictStrand={}
       self.dictDomaine={}
       self.dictPort={}
+      self.cutlineValeur=[]
+      self.cutplaneValeur=[]
+      self.visu3dValeur=[]
+      self.fieldmapValeur=[]
+      self.fielddumpValeur=[]
       self.repertory=""
       self.frequency=""
       self.domaine=""
@@ -303,38 +308,65 @@ class CARMEL3DFV0Generator(PythonGenerator):
         if self.debug: 
             print "MCSIMP %(v_1)s  %(v_2)s" % {'v_1': obj.nom, "v_2": obj.valeur}
         s=PythonGenerator.generMCSIMP(self,obj)
-        self.dicoCourant[obj.nom]=obj.valeurFormatee
+        try:
+            self.dicoCourant[obj.nom]=obj.valeurFormatee
+        except:
+            print "Oubli des messages texte homo='information'"
         return s
 
   
 #----------------------------------------------------------------------------------------
    def generMCFACT(self,obj) :
         """recuperation de l objet MCFACT"""
+        if self.debug:
+            print "MCFACT debut %(v_1)s  %(v_2)s" % {'v_1': unicode(obj.nom), "v_2": unicode(obj.valeur)}
         dico={}
         self.dicoMCFACTCourant=dico
         self.dicoCourant=self.dicoMCFACTCourant
         s=PythonGenerator.generMCFACT(self,obj)
-        self.dicoEtapeCourant[obj.nom]=self.dicoMCFACTCourant
+        # sauvegarde, dans self.dicoEtapeCourant, de la valeur du FACT courant, pour utilisation ultérieure dans generETAPE et generPROC_ETAPE
+        # Traitement des FACT CUTLINE et CUTPLANE multiples (max='**' dans le catalogue)
+        # Ce traitement spécial est nécessaire pour le moment car le générateur bogue sinon au niveau des matériaux (non-linéaires ?)
+        if obj.nom in ('FIELDDUMP','CUTLINE', 'CUTPLANE', 'FIELDMAP', 'VISU3D' ): 
+            # Remplissage se self.dicoEtapeCourant pour le nom du FACT courant
+            # Il ne contient qu'une seule valeur (un dictionnaire) par défaut lorsque le FACT est unique (max=1 dans le catalogue),
+            # mais il peut aussi contenir plusieurs valeurs (tableau) dans le cas contraire, e.g., max='**' dans le catalogue
+            if self.dicoEtapeCourant.has_key(obj.nom): # plusieurs valeurs
+                print "self.dicoEtapeCourant= %s"%self.dicoEtapeCourant
+                if type(self.dicoEtapeCourant[obj.nom]) == types.DictType: # une seule valeur entrée jusqu'à présent
+                    dicoMCFACTprecedent = self.dicoEtapeCourant[obj.nom] # sauvegarde de la valeur précédente
+                    print "dicoMCFACTpreceden= %s self.dicoEtapeCourant= %s"%(dicoMCFACTprecedent,self.dicoEtapeCourant) 
+                    self.dicoEtapeCourant[obj.nom] = [ dicoMCFACTprecedent, self.dicoMCFACTCourant ] # restructuration en liste et insertion de la valeur précédente et de la valeur courant
+                    print "self.dicoEtapeCourant[obj.nom]= %s"%self.dicoEtapeCourant[obj.nom]
+                else: # plusieurs valeurs entrées jusqu'à présent, sous la forme d'une liste de dictionnaires
+                    self.dicoEtapeCourant[obj.nom].append(self.dicoMCFACTCourant) # extension de la liste avec cette valeur, placée en dernier
+            else: # une seule valeur ou première valeur
+                self.dicoEtapeCourant[obj.nom]=self.dicoMCFACTCourant
+        else: # traitement usuel des FACT uniques, pour ignorer le bogue décrit plus haut
+            self.dicoEtapeCourant[obj.nom]=self.dicoMCFACTCourant
         self.dicoMCFACTCourant=None
         self.dicoCourant=self.dicoEtapeCourant
+        if self.debug:
+            print "MCFACT fin %(v_1)s  %(v_2)s" % {'v_1': unicode(obj.nom), "v_2": unicode(obj.valeur)}
         return s
 
 
 #----------------------------------------------------------------------------------------
    def generPROC_ETAPE(self,obj):
         """analyse des PROC du catalogue  ( VERSION )"""
+        if self.debug: 
+            print "PROC_ETAPE initial: %(v_1)s  %(v_2)s" % {'v_1': unicode(obj.nom), "v_2": unicode(obj.valeur)}
         dico={}
         self.dicoEtapeCourant=dico
         self.dicoCourant=self.dicoEtapeCourant
         s=PythonGenerator.generPROC_ETAPE(self,obj)
-        obj.valeur=self.dicoEtapeCourant
-        
+        obj.valeur=self.dicoEtapeCourant # on passe à obj la bonne structure générée par PythonGenerator.generPROC_ETAPE, pour le traitement de chaque partie ci-dessous
         if self.debug: 
-            print "PROC_ETAPE %(v_1)s  %(v_2)s" % {'v_1': unicode(obj.nom), "v_2": unicode(obj.valeur)}
-        s=PythonGenerator.generPROC_ETAPE(self,obj)
+            print "PROC_ETAPE mis a jour: %(v_1)s  %(v_2)s" % {'v_1': unicode(obj.nom), "v_2": unicode(obj.valeur)}
         if obj.nom=="PARAMETERS" : self.generBLOC_PARAMETERS(obj)
         if obj.nom=="SOLVEUR" : self.generSOLVEUR(obj)
         if obj.nom=="POST_COMMANDS" : self.generPOST_COMMANDS(obj)
+        s=PythonGenerator.generPROC_ETAPE(self,obj) # obj.valeur a été modifiée pour le traitement ci-dessus, alors il faut tout remettre en ordre en appelant de nouveau PythonGenerator.generPROC_ETAPE
         return s
 
 
@@ -342,19 +374,21 @@ class CARMEL3DFV0Generator(PythonGenerator):
 #----------------------------------------------------------------------------------------
    def generETAPE(self,obj):
         """analyse des OPER du catalogue"""
+        if self.debug: 
+            print "ETAPE mis a jour: obj.nom = %(v_1)s , obj.valeur= %(v_2)s" % {'v_1': obj.nom, 'v_2': obj.valeur}
         dico={}
         self.dicoEtapeCourant=dico
         self.dicoCourant=self.dicoEtapeCourant
         s=PythonGenerator.generETAPE(self,obj)
-        obj.valeur=self.dicoEtapeCourant
+        obj.valeur=self.dicoEtapeCourant # cf. generPROC_ETAPE
         if self.debug: 
-            print "ETAPE : obj.nom = %(v_1)s , obj.valeur= %(v_2)s" % {'v_1': obj.nom, 'v_2': obj.valeur}
+            print "ETAPE mis a jour: obj.nom = %(v_1)s , obj.valeur= %(v_2)s" % {'v_1': obj.nom, 'v_2': obj.valeur}
         if obj.nom=="MESHGROUP" : self.generMESHGROUP(obj)
         if obj.nom=="MATERIAL" : self.generMATERIAL(obj)
         if obj.nom=="SOURCE" : self.generSOURCE(obj)
         if obj.nom=="STRANDED_INDUCTOR_GEOMETRY" : self.generSTRANDED_INDUCTOR_GEOMETRY(obj)
         if obj.nom=="MACRO_GROUPE": self.generMACRO_GROUPE(obj)
-        s=PythonGenerator.generETAPE(self,obj)
+        s=PythonGenerator.generETAPE(self,obj) # cf. generPROC_ETAPE
         return s
 
 #----------------------------------------------------------------------------------------
@@ -412,7 +446,7 @@ class CARMEL3DFV0Generator(PythonGenerator):
             if self.debug: 
                 print "obj.valeur.keys()= %s" % obj.valeur.keys()
             if 'MATERIAL' in obj.valeur.keys() and 'SOURCE' in obj.valeur.keys(): # test d'erreur lors de presence de materiau et source a la fois
-                raise ValueError,tr(" ce groupe de maillage %s est associe a au moins un materiau  et au moins une source." % nomGroupe)
+                raise ValueError, nomGroupe + tr(" : ce groupe de maillage ne peut pas etre associe a un materiau et une source a la fois.")
             # association a un materiau
             if 'MATERIAL' in obj.valeur.keys():
                 self.dictGroupes[nomGroupe]['MATERIAL'] = obj.valeur['MATERIAL'].nom # sauvegarde de l'association entre ce groupe de maillage et un materiau ou source, par son nom, i.e. nom du concept du materiau ou de la source
@@ -464,7 +498,7 @@ class CARMEL3DFV0Generator(PythonGenerator):
             if self.debug: 
                 print "obj.valeur.keys()= %s" % obj.valeur.keys()
             if 'MATERIAL' in obj.valeur.keys() and 'SOURCE' in obj.valeur.keys(): # test d'erreur lors de presence de materiau et source a la fois
-                raise ValueError,tr("Ce MACRO_GROUPE %s ne peut pas contenir a la fois un MATERIAL et une SOURCE." % nomGroupe)
+                raise ValueError, nomgroupe + tr(" : ce MACRO_GROUPE ne peut pas contenir a la fois un MATERIAL et une SOURCE.")
             # association a une source
             if 'SOURCE' in obj.valeur.keys():
                 self.dictGroupes[nomGroupe]['SOURCE'] = obj.valeur['SOURCE'].nom # sauvegarde de l'association entre ce macro groupe et un materiau ou source, par son nom, i.e. nom du concept du materiau ou de la source
@@ -481,7 +515,7 @@ class CARMEL3DFV0Generator(PythonGenerator):
                     if not self.dictGroupes[groupe].has_key('STRAND'): listeStrandedInductorGeometry = False # au moins un groupe de la liste n'est pas un inducteur bobiné ou topologique (morceau ou entier).
                 self.dictGroupes['ordreListeJdC'].append(nomGroupe) # sauvegarde du nom du macro groupe associe a une source, dans l'ordre du JdC
                 if not listeStrandedInductorGeometry: # Erreur en cas de liste ne définissant pas que des inducteurs bobinés ou topologiques en morceaux
-                    raise ValueError, tr(u"Le MACRO_GROUPE %s ne doit contenir, dans LISTE_MESHGROUP, que des morceaux d'inducteurs bobines ou topologiques." % nomGroupe)
+                    raise ValueError, nomGroupe + tr(" : ce MACRO_GROUPE ne doit contenir, dans LISTE_MESHGROUP, que des morceaux d'inducteurs bobines ou topologiques.")
                 # test de présence du domaine pour les cas appropriés d'inducteur bobiné ou topologique en morceau.
                 if 'Domaine' in obj.valeur.keys():
                     if listeStrandedInductorGeometry: # Domaine seulement  en cas de liste définissant des inducteurs bobinés ou topologiques en morceaux
@@ -492,10 +526,12 @@ class CARMEL3DFV0Generator(PythonGenerator):
                         print"le texte=%s" %(texte)
                         self.dictDomaine[obj.get_sdname()]=texte                  
                     else: # Erreur si Domaine et macro-groupe pas complètement inducteur
-                        raise ValueError, tr(u"Ce MACRO_GROUPE %s contient, dans LISTE_MESHGROUP, des groupes qui ne sont pas que des morceaux d'inducteurs bobines ou topologiques. Il ne doit pas contenir de Domaine." % nomGroupe)
+                        raise ValueError, nomGroupe + tr(" : ce MACRO_GROUPE ne doit pas contenir de Domaine car il contient, dans LISTE_MESHGROUP, des groupes qui ne sont pas que des morceaux d'inducteurs bobines ou topologiques.")
                 else: # Domaine manquant
                     if listeStrandedInductorGeometry: # Erreur en cas de liste définissant des inducteurs bobinés ou topologiques en morceaux
-                        raise ValueError, tr(u"Ce MACRO_GROUPE %s de morceaux d'inducteurs bobines ou topologiques doit contenir aussi un Domaine." % nomGroupe)
+                        raise ValueError, nomGroupe + tr(" : ce MACRO_GROUPE de morceaux d'inducteurs bobines ou topologiques doit contenir aussi un Domaine.")
+            else:
+                raise ValueError, nomGroupe + tr(" : ce MACRO_GROUPE doit contenir une liste de groupes LISTE_MESHGROUP.")
             if self.debug:
                 print "self.dictGroupes= %s" % repr(self.dictGroupes)
                 print "self.dictDomaine=%s" %(self.dictDomaine)
@@ -578,7 +614,7 @@ class CARMEL3DFV0Generator(PythonGenerator):
        # verification des proprietes du sous bloc CONDUCTOR (PERMEABILITY, CONDUCTIVITY)
        if 'PERMEABILITY' not in obj.valeur or 'CONDUCTIVITY' not in obj.valeur:
             print "ERREUR! Le matériau conducteur (CONDUCTOR) de nom %s doit contenir les propriétés PERMEABILITY et CONDUCTIVITY." % obj.get_sdname()
-            raise ValueError, tr("ERREUR! Le materiau conducteur (CONDUCTOR) de nom %s doit contenir les proprietes PERMEABILITY et CONDUCTIVITY." % obj.get_sdname())
+            raise ValueError,  obj.get_sdname() + tr(" : ce materiau conducteur (CONDUCTOR) doit contenir les proprietes PERMEABILITY et CONDUCTIVITY.")
        else:
           # parcours des proprietes du sous bloc CONDUCTOR (PERMEABILITY, CONDUCTIVITY)
           for keyN1 in ('PERMEABILITY','CONDUCTIVITY') :
@@ -664,7 +700,7 @@ class CARMEL3DFV0Generator(PythonGenerator):
        # verification des proprietes du sous bloc ZSURFACIC (PERMEABILITY, CONDUCTIVITY)
        if 'PERMEABILITY' not in obj.valeur or 'CONDUCTIVITY' not in obj.valeur:
             print "ERREUR! Le matériau impedance de surface (ZSURFACIC) de nom %s doit contenir les propriétés PERMEABILITY et CONDUCTIVITY." % obj.get_sdname()
-            raise ValueError, tr("ERREUR! Le materiau impedance de surface (ZSURFACIC) de nom %s doit contenir les proprietes PERMEABILITY et CONDUCTIVITY." % obj.get_sdname())
+            raise ValueError, obj.get_sdname() + tr(" : ce materiau impedance de surface (ZSURFACIC) doit contenir les proprietes PERMEABILITY et CONDUCTIVITY.")
        else:
           # parcours des proprietes du sous bloc ZSURFACIC (PERMEABILITY, CONDUCTIVITY)
           for keyN1 in obj.valeur :
@@ -769,17 +805,11 @@ class CARMEL3DFV0Generator(PythonGenerator):
                wdict = obj.valeur['WAVEFORM_CONSTANT'] # dictionnaire contenant les parametres de la forme de la source
                if self.problem == HARMONIC:
                   texte+="        CURJ POLAR %s 0\n" % str(wdict['AMPLITUDE'])
-                  print tr("ATTENTION! Une source constante \
-                                  n'est possible qu'a frequence nulle \
-                                  en regime frequentiel")
             elif "WAVEFORM_SINUS" in obj.valeur:
                wdict = obj.valeur['WAVEFORM_SINUS'] # dictionnaire contenant les parametres de la forme de la source
                if self.problem == HARMONIC:
                   texte+="        CURJ POLAR %(ampli)s %(phase)s\n" \
                          % {'ampli': str(wdict['AMPLITUDE']), 'phase': str(wdict['PHASE'])}
-            else:
-               print tr("ERREUR! Une forme de la source du \
-                               type WAVEFORM_CONSTANT ou WAVEFORM_SINUS est attendue.")
             self.dictSourceStInd[obj.get_sdname()]=texte
             if self.debug: 
                 print texte
@@ -802,16 +832,11 @@ class CARMEL3DFV0Generator(PythonGenerator):
                wdict = obj.valeur['WAVEFORM_CONSTANT'] # dictionnaire contenant les parametres de la forme de la source
                if self.problem == HARMONIC:
                   texte+="        AMP POLAR %s 0\n" % str(wdict['AMPLITUDE'])
-                  print tr("ATTENTION! Une source constante n'est \
-                                  possible qu'a frequence nulle en regime frequentiel")
             elif "WAVEFORM_SINUS" in obj.valeur:
                wdict = obj.valeur['WAVEFORM_SINUS'] # dictionnaire contenant les parametres de la forme de la source
                if self.problem == HARMONIC:
                   texte+="        AMP POLAR %(ampli)s %(phase)s\n" \
                          % {'ampli': str(wdict['AMPLITUDE']), 'phase': str(wdict['PHASE'])}
-            else:
-               print tr("ERREUR! Une forme de la source du type \
-                               WAVEFORM_CONSTANT ou WAVEFORM_SINUS est attendue.")
             self.dictSourceHport[obj.get_sdname()]=texte
             if self.debug: 
                 print texte
@@ -837,15 +862,11 @@ class CARMEL3DFV0Generator(PythonGenerator):
                wdict = obj.valeur['WAVEFORM_CONSTANT'] # dictionnaire contenant les parametres de la forme de la source
                if self.problem == HARMONIC:
                   texte+="        AMP POLAR %s 0\n" % str(wdict['AMPLITUDE'])
-                  print tr("ATTENTION! Une source constante n'est possible qu'a frequence nulle en regime frequentiel")
             elif "WAVEFORM_SINUS" in obj.valeur:
                wdict = obj.valeur['WAVEFORM_SINUS'] # dictionnaire contenant les parametres de la forme de la source
                if self.problem == HARMONIC:
                   texte+="        AMP POLAR %(ampli)s %(phase)s\n" \
                          % {'ampli': str(wdict['AMPLITUDE']), 'phase': str(wdict['PHASE'])}
-            else:
-               print tr("ERREUR! Une forme de la source du type \
-                               WAVEFORM_CONSTANT ou WAVEFORM_SINUS est attendue.")
             self.dictSourceEport[obj.get_sdname()]=texte
             if self.debug: 
                 print texte
@@ -865,33 +886,146 @@ class CARMEL3DFV0Generator(PythonGenerator):
             
         if obj.valeur.has_key('GLOBAL'):
             self.texteCarmel3D_CMD+="[\nGLOBAL\n]\n"
+            
+        if obj.valeur.has_key('DUMP'):
+            champsFieldkind={'total':'TOTAL', 'reaction':'REACTION', 'diffracted':'DIFFRACTED'}
+            self.texteCarmel3D_CMD+="[\nDUMP"
+            self.texteCarmel3D_CMD+="\n"+self.projet +  '_postgroups.txt'
+            self.texteCarmel3D_CMD+="\n"+champsFieldkind[obj.valeur["DUMP"]["fieldkind"]]+"\n]\n"
+            
+        if obj.valeur.has_key('FIELDDUMP'):
+            champs = {'T':'TFIELD','H':'HFIELD', 'B':'BFIELD', 'J':'JFIELD', 'E':'EFIELD', 'pertesJoule':'OHMLOSS_DENSITY', 'champSource':'SOURCEFIELD', 'A':'AFIELD', 'Phi':'PHIFIELD', 'Omega':'OMEGAFIELD'}
+            champsFieldkind={'total':'TOTAL', 'reaction':'REACTION', 'diffracted':'DIFFRACTED'}
+            self.texteCarmel3D_CMD+="[\nFIELDDUMP"
+            if type(obj.valeur["FIELDDUMP"]) == types.DictType: # correspondance sur une 'Fielddump'
+                self.fielddumpValeur.append(obj.valeur["FIELDDUMP"]) 
+            else:
+                self.fielddumpValeur=obj.valeur["FIELDDUMP"] # correspondance sur plusieurs 'Fielddump'
+            for indexFielddump in self.fielddumpValeur:
+                self.texteCarmel3D_CMD+="\n  [\n" +"   "+ champs[indexFielddump["field"]]
+                self.texteCarmel3D_CMD+="\n" + "   " + champsFieldkind[indexFielddump["fieldkind"]] + "\n  ]"
+            self.texteCarmel3D_CMD+="\n]\n"    
+            
+        
         if obj.valeur.has_key('VISU'):
             self.texteCarmel3D_CMD+="[\nVISU"
             # test de fichier de maillage bien lu
-            if self.fichierMaillage == "":  raise ValueError, tr("ERREUR! Le fichier de maillage n'existe pas. Le bloc PARAMETERS doit etre defini au dessus du bloc POST_COMMANDS.")
+            if self.fichierMaillage == "":  raise ValueError, tr("Le fichier de maillage n'existe pas. Le bloc PARAMETERS doit etre defini au-dessus du bloc POST_COMMANDS.")
             self.texteCarmel3D_CMD+="\n"+self.projet+"\n"
-            self.texteCarmel3D_CMD+=obj.valeur["VISU"]["VISU_Format"]+"\n"
-            self.texteCarmel3D_CMD+=obj.valeur["VISU"]["VISU_Type"]+"\n]\n"
+            self.texteCarmel3D_CMD+=obj.valeur["VISU"]["visu_format"]+"\n"
+            self.texteCarmel3D_CMD+=obj.valeur["VISU"]["visu_type"]+"\n]\n"
+    
+        if obj.valeur.has_key('VISU3D'):
+            champsField = {'T':'TFIELD','H':'HFIELD', 'B':'BFIELD', 'J':'JFIELD', 'E':'EFIELD', 'pertesJoule':'OHMLOSS_DENSITY', 'champSource':'SOURCEFIELD', 'A':'AFIELD', 'Phi':'PHIFIELD', 'Omega':'OMEGAFIELD'} # correspondance sur le nom du champ entre le catalogue (clé) et le fichier de configuration de Code_Carmel3D (valeur)
+            champsFieldkind={'total':'TOTAL', 'reaction':'REACTION', 'diffracted':'DIFFRACTED'}
+            if type(obj.valeur["VISU3D"])==types.DictType:  # correspondance sur une 'VISU3D'
+                self.visu3dValeur.append(obj.valeur["VISU3D"])
+            else:
+                self.visu3dValeur=obj.valeur["VISU3D"] # correspondance sur plusieurs 'VISU3D'
+            self.texteCarmel3D_CMD+="[\nVISU3D"
+            if self.fichierMaillage == "":  raise ValueError, tr("Le fichier de maillage n'existe pas. Le bloc PARAMETERS doit etre defini au-dessus du bloc POST_COMMANDS.")
+            self.texteCarmel3D_CMD+="\n"+ self.projet
+            self.texteCarmel3D_CMD+="\n" + self.visu3dValeur[0]["visu_format"]
+            for indexVisu3d in self.visu3dValeur:
+                if indexVisu3d["visu_format"]!=self.visu3dValeur[0]["visu_format"]:
+                    print "ERREUR! Dans les multiples VISU3D du bloc POST_COMMANDS, le parametre visu_format doit prendre la meme valeur."
+                    raise ValueError, tr("Dans les multiples VISU3D du bloc POST_COMMANDS, le parametre visu_format doit prendre la meme valeur.")
+                self.texteCarmel3D_CMD+="\n   [\n   " + champsField[indexVisu3d["field"]]
+                self.texteCarmel3D_CMD+="\n   "+ champsFieldkind[indexVisu3d["fieldkind"]]
+                self.texteCarmel3D_CMD+="\n   "+ indexVisu3d["visu_type"]+"\n   ]"
+            self.texteCarmel3D_CMD+="\n]\n" 
+            
+        if obj.valeur.has_key('ASTER_RMS_LOSSES'):
+              self.texteCarmel3D_CMD+="[\nASTER_RMS_LOSSES"  
+              if self.fichierMaillage == "":  raise ValueError, tr("Le fichier de maillage n'existe pas. Le bloc PARAMETERS doit etre defini au-dessus du bloc POST_COMMANDS.")
+              self.texteCarmel3D_CMD+="\n"+self.projet+"\n"  
+              self.texteCarmel3D_CMD+= obj.valeur["ASTER_RMS_LOSSES"]["rms_losses_format"] +"\n]\n"
+              
         if obj.valeur.has_key('CUTLINE'):
-            champs = {'H':'HFIELD', 'B':'BFIELD', 'J':'JFIELD', 'E':'EFIELD'} # correspondance sur le nom du champ entre le catalogue (clé) et le fichier de configuration de Code_Carmel3D (valeur)
-            self.texteCarmel3D_CMD+="[\nCUTLINE" 
-            self.texteCarmel3D_CMD+="\n%s" % ' '.join(map(str,obj.valeur["CUTLINE"]["first_point"]))
-            self.texteCarmel3D_CMD+="\n%s" % ' '.join(map(str,obj.valeur["CUTLINE"]["last_point"]))
-            self.texteCarmel3D_CMD+="\n%d" % (obj.valeur["CUTLINE"]["number_of_points"], )
-            self.texteCarmel3D_CMD+="\n" + obj.valeur["CUTLINE"]["name"]
             # création du champ, renommé par rapport à l'interface
-            self.texteCarmel3D_CMD+="\n" + champs[obj.valeur["CUTLINE"]["field"]]
-            self.texteCarmel3D_CMD+="\n]\n"
+            champsField = {'H':'HFIELD', 'B':'BFIELD', 'J':'JFIELD', 'E':'EFIELD', 'pertesJoule':'OHMLOSS_DENSITY', 'champSource':'SOURCEFIELD', 'A':'AFIELD', 'Phi':'PHIFIELD', 'Omega':'OMEGAFIELD', 'T':'TFIELD'} # correspondance sur le nom du champ entre le catalogue (clé) et le fichier de configuration de Code_Carmel3D (valeur)
+            champsFieldkind={'total':'TOTAL', 'reaction':'REACTION', 'diffracted':'DIFFRACTED'}
+            champsOutput={'xgraphic':'XGRAPHIC', 'gnuplot':'GNUPLOT', 'gmsh':'GMSH'}
+            champsLissage={'aucun':'NONE', 'un seul point par element':'1PTELT'}
+            if type(obj.valeur["CUTLINE"]) == types.DictType: # correspondance sur une 'Cutline'
+                self.cutlineValeur.append(obj.valeur["CUTLINE"])  # transfert d'une dictionnaire à une liste
+            else:
+                self.cutlineValeur=obj.valeur["CUTLINE"] # correspondance sur plusieurs 'Cutline'
+            for indexCutline in self.cutlineValeur: 
+                self.texteCarmel3D_CMD+="[\nCUTLINE"
+                self.texteCarmel3D_CMD+="\n%s" % ' '.join(map(str,indexCutline["first_point"]), )
+                self.texteCarmel3D_CMD+="\n%s" % ' '.join(map(str,indexCutline["last_point"]), )
+                self.texteCarmel3D_CMD+="\n%d" % (indexCutline["number_of_points"], )
+                self.texteCarmel3D_CMD+="\n" +indexCutline["name"]
+                self.texteCarmel3D_CMD+="\n" + champsField[indexCutline["field"]]
+                if indexCutline.has_key('fieldkind'):
+                    self.texteCarmel3D_CMD+="\nFIELDKIND " + champsFieldkind[indexCutline["fieldkind"]]
+                if indexCutline.has_key('output'):
+                    self.texteCarmel3D_CMD+="\nOUTPUT " +champsOutput[indexCutline["output"]]
+                if indexCutline.has_key('lissage'):
+                    self.texteCarmel3D_CMD+="\nSMOOTHLEVEL " +champsLissage[indexCutline["lissage"]]
+                self.texteCarmel3D_CMD+="\n]\n"
+                
         if obj.valeur.has_key('CUTPLANE'):
-            champs = {'H':'HFIELD', 'B':'BFIELD', 'J':'JFIELD', 'E':'EFIELD'} # correspondance sur le nom du champ entre le catalogue (clé) et le fichier de configuration de Code_Carmel3D (valeur)
+            champs = {'T':'TFIELD','H':'HFIELD', 'B':'BFIELD', 'J':'JFIELD', 'E':'EFIELD','pertesJoule':'OHMLOSS_DENSITY', 'champSource':'SOURCEFIELD', 'A':'AFIELD', 'Phi':'PHIFIELD', 'Omega':'OMEGAFIELD'} # correspondance sur le nom du champ entre le catalogue (clé) et le fichier de configuration de Code_Carmel3D (valeur)
+            champsFieldkind= {'total':'TOTAL', 'reaction':'REACTION', 'diffracted':'DIFFRACTED'}
+            champsOutput={'xgraphic':'XGRAPHIC', 'gnuplot':'GNUPLOT', 'gmsh':'GMSH'}
+            champsLissage={'aucun':'NONE', 'un seul point par element':'1PTELT'}
             axes = {'Ox':1, 'Oy':2, 'Oz':3} # correspondance de l'axe normal entre le catalogue (clé) et le fichier de configuration Code_Carmel3D (valeur)
-            self.texteCarmel3D_CMD+="[\nCUTPLANE" 
-            self.texteCarmel3D_CMD+="\n%d" % (axes[obj.valeur["CUTPLANE"]["normal_vector"]], )
-            self.texteCarmel3D_CMD+="\n%f" % (obj.valeur["CUTPLANE"]["plane_position"], )
-            self.texteCarmel3D_CMD+="\n%s" % ' '.join(map(str,obj.valeur["CUTPLANE"]["number_of_points"]))
-            self.texteCarmel3D_CMD+="\n" + obj.valeur["CUTPLANE"]["name"]
-            self.texteCarmel3D_CMD+="\n" + champs[obj.valeur["CUTPLANE"]["field"]]
-            self.texteCarmel3D_CMD+="\n]\n"
+            if type(obj.valeur["CUTPLANE"]) == types.DictType:
+                self.cutplaneValeur.append(obj.valeur["CUTPLANE"]) # correspondance sur une 'Cutplane'
+            else:
+                self.cutplaneValeur=obj.valeur["CUTPLANE"] # correspondance sur plusieurs 'Cutplane'
+            for indexCutplane in self.cutplaneValeur:
+                self.texteCarmel3D_CMD+="[\nCUTPLANE" 
+                self.texteCarmel3D_CMD+="\n%d" % (axes[indexCutplane["normal_vector"]], )
+                self.texteCarmel3D_CMD+="\n%f" % (indexCutplane["plane_position"], )
+                self.texteCarmel3D_CMD+="\n%s" % ' '.join(map(str,indexCutplane["number_of_points"]))
+                self.texteCarmel3D_CMD+="\n" + indexCutplane["name"]
+                self.texteCarmel3D_CMD+="\n" + champs[indexCutplane["field"]]
+                if indexCutplane.has_key('fieldkind'):
+                    self.texteCarmel3D_CMD+="\nFIELDKIND " + champsFieldkind[indexCutplane["fieldkind"]]
+                if indexCutplane.has_key('output'):
+                    self.texteCarmel3D_CMD+="\nOUTPUT " +champsOutput[indexCutplane["output"]]
+                if indexCutplane.has_key('lissage'):
+                    self.texteCarmel3D_CMD+="\nSMOOTHLEVEL " +champsLissage[indexCutplane["lissage"]]
+                self.texteCarmel3D_CMD+="\n]\n"
+                
+        if obj.valeur.has_key('FIELDMAP'):
+            champs = {'T':'TFIELD','H':'HFIELD', 'B':'BFIELD', 'J':'JFIELD', 'E':'EFIELD','pertesJoule':'OHMLOSS_DENSITY', 'champSource':'SOURCEFIELD', 'A':'AFIELD', 'Phi':'PHIFIELD', 'Omega':'OMEGAFIELD'} # correspondance sur le nom du champ entre le catalogue (clé) et le fichier de configuration de Code_Carmel3D (valeur)
+            champsFieldkind= {'total':'TOTAL', 'reaction':'REACTION', 'diffracted':'DIFFRACTED'}
+            champsOutput={'xgraphic':'XGRAPHIC', 'gnuplot':'GNUPLOT', 'gmsh':'GMSH'}
+            champsFieldmap_type={'equation':'EQUATION', 'fichier':'FILE'}
+            champsType={'plane':'PLANE', 'line':'LINE'}
+            axes = {'Ox':1, 'Oy':2, 'Oz':3} # correspondance de l'axe normal entre le catalogue (clé) et le fichier de configuration Code_Carmel3D (valeur)
+            if type(obj.valeur["FIELDMAP"]) == types.DictType: 
+                self.fieldmapValeur.append(obj.valeur["FIELDMAP"]) # correspondance sur une 'Fieldmap'
+            else:
+                self.fieldmapValeur=obj.valeur["FIELDMAP"]# correspondance sur plusieurs 'Fieldmap'
+            for indexFieldmap in self.fieldmapValeur:
+                self.texteCarmel3D_CMD+="[\nFIELDMAP"
+                self.texteCarmel3D_CMD+="\n" + champsFieldmap_type[indexFieldmap["fieldmap_type"]]
+                if indexFieldmap["fieldmap_type"]=="equation":
+                    self.texteCarmel3D_CMD+="\n" + champsType[indexFieldmap["type"]]
+                    if indexFieldmap["type"]=="line":
+                        self.texteCarmel3D_CMD+="\n%s" % ' '.join(map(str,indexFieldmap["first_point"]), )
+                        self.texteCarmel3D_CMD+="\n%s" % ' '.join(map(str,indexFieldmap["last_point"]), )
+                        self.texteCarmel3D_CMD+="\n%d" % (indexFieldmap["number_of_points"], )
+                    if indexFieldmap["type"]=="plane":
+                        self.texteCarmel3D_CMD+="\n%d" % (axes[indexFieldmap["normal_vector"]], )
+                        self.texteCarmel3D_CMD+="\n%f" % (indexFieldmap["plane_position"], )
+                        self.texteCarmel3D_CMD+="\n%s" % ' '.join(map(str,indexFieldmap["number_of_points"]))
+                if indexFieldmap["fieldmap_type"]=="fichier":
+                        self.fichierFieldmap=indexFieldmap["filename"]
+                        self.nomFichierFieldmap = os.path.basename(self.fichierFieldmap) # nom du fichier de fieldmap, sans le chemin
+                        self.texteCarmel3D_CMD+="\n" + self.nomFichierFieldmap
+                self.texteCarmel3D_CMD+="\n" + champs[indexFieldmap["field"]]
+                self.texteCarmel3D_CMD+="\n" + champsFieldkind[indexFieldmap["fieldkind"]]
+                self.texteCarmel3D_CMD+="\n" +indexFieldmap["name"] # nom systématique, quel que soit le fieldmap_type, placé entre fieldkind et output
+                self.texteCarmel3D_CMD+="\n" +champsOutput[indexFieldmap["output"]]
+                self.texteCarmel3D_CMD+="\n]\n"
+                        
+                
 
 
 #---------------------------------------------------------------------------------------
@@ -980,7 +1114,7 @@ class CARMEL3DFV0Generator(PythonGenerator):
             if self.dictGroupes[nom]['MATERIAL'][:]  in dictProprietes.keys(): # test si le nom du materiau associe est du bon type
                 if dictProprietes[self.dictGroupes[nom]['MATERIAL'][:]]['valeur']['PERMEABILITY']['LAW'] == 'NONLINEAR': # Erreur si ce matériau est non-linéaire
                     print u"ERREUR! Le matériau de nom %s associé au groupe %s doit avoir sa perméabilité (PERMEABILITY) linéaire (LINEAR) seulement." % (self.dictGroupes[nom]['MATERIAL'][:],  nom)
-                    raise ValueError, tr("ERREUR! Le materiau de nom %s associe au groupe %s doit avoir sa permeabilite (PERMEABILITY) lineaire (LINEAR) seulement." % (self.dictGroupes[nom]['MATERIAL'][:],  nom))
+                    raise ValueError, self.dictGroupes[nom]['MATERIAL'][:] + ',' +  nom + tr(" : ce materiau (nom, groupe associe) doit avoir sa permeabilite (PERMEABILITY) lineaire (LINEAR) seulement.")
                 if dictProprietes[self.dictGroupes[nom]['MATERIAL'][:]]['valeur']['PERMEABILITY']['HOMOGENEOUS'] == 'FALSE' \
                  or dictProprietes[self.dictGroupes[nom]['MATERIAL'][:]]['valeur']['CONDUCTIVITY']['HOMOGENEOUS'] == 'FALSE': # recherche si matériau non-homogène
                     self.materiauxGroupesTousHomogenes = False # alors tous les matériaux ne sont pas homogènes
@@ -1008,7 +1142,7 @@ class CARMEL3DFV0Generator(PythonGenerator):
             if self.dictGroupes[nom]['MATERIAL'][:] in dictProprietes.keys(): # test si le nom du materiau associe est du bon type
                 if dictProprietes[self.dictGroupes[nom]['MATERIAL'][:]]['valeur']['PERMEABILITY']['LAW'] == 'NONLINEAR': # Erreur si ce matériau est non-linéaire
                     print u"ERREUR! Le matériau de nom %s associé au groupe %s doit avoir sa perméabilité (PERMEABILITY) linéaire (LINEAR) seulement." % (self.dictGroupes[nom]['MATERIAL'][:],  nom)
-                    raise ValueError, tr("ERREUR! Le materiau de nom %s associe au groupe %s doit avoir sa permeabilite (PERMEABILITY) lineaire (LINEAR) seulement." % (self.dictGroupes[nom]['MATERIAL'][:],  nom))
+                    raise ValueError, self.dictGroupes[nom]['MATERIAL'][:] + ',' +  nom + tr(" : ce materiau (nom, groupe associe) doit avoir sa permeabilite (PERMEABILITY) lineaire (LINEAR) seulement.")
                 if dictProprietes[self.dictGroupes[nom]['MATERIAL'][:]]['valeur']['PERMEABILITY']['HOMOGENEOUS'] == 'FALSE': # recherche si matériau non-homogène
                     self.materiauxGroupesTousHomogenes = False # alors tous les matériaux ne sont pas homogènes
                 if dictProprietes[self.dictGroupes[nom]['MATERIAL'][:]]['valeur']['PERMEABILITY']['ISOTROPIC'] == 'FALSE': # recherche si matériau non-homogène
@@ -1200,13 +1334,13 @@ class CARMEL3DFV0Generator(PythonGenerator):
             if self.debug: print "nomSource courant=",nom
             if self.dictGroupes[nom].has_key('SOURCE'):
                 if self.dictGroupes[nom]['SOURCE'] not in self.dictPort :
-                    if not self.dictGroupes[nom].has_key('DOMAINE'): raise ValueError,  tr("Il manque le Domaine à l'inducteur de nom : "+nom)
+                    if not self.dictGroupes[nom].has_key('DOMAINE'): raise ValueError, nom + tr(" : il manque un Domaine a cet inducteur.")
                     self.texteCarmel3D_INGEND2+="\n%s" %(self.dictGroupes[nom]['DOMAINE']) # écriture du nom de domaine
             else:
-                    if not self.dictGroupes[nom].has_key('DOMAINE'): raise ValueError,  tr("Il manque le Domaine à l'inducteur de nom : "+nom)
+                    if not self.dictGroupes[nom].has_key('DOMAINE'): raise ValueError,  nom + tr(" : il manque un Domaine a cet inducteur.")
                     self.texteCarmel3D_INGEND2+="\n%s" %(self.dictGroupes[nom]['DOMAINE']) # écriture du nom de domaine                
             if self.dictGroupes[nom].has_key('STRAND'): # inducteur en un seul morceau
-                if not self.dictGroupes[nom].has_key('DOMAINE'): raise ValueError,  tr("Il manque le Domaine à l'inducteur de nom : "+nom)
+                if not self.dictGroupes[nom].has_key('DOMAINE'): raise ValueError,  nom + tr(" : il manque un Domaine a cet inducteur.")
                 strand = self.dictGroupes[nom]['STRAND'] 
                 if self.debug: print "un seul morceau : nomStrand courant=", strand
                 self.texteCarmel3D_INGEND2+=  self.dictStrand[strand]
@@ -1280,19 +1414,19 @@ class CARMEL3DFV0Generator(PythonGenerator):
             partiesNom = nom.split(sepNomGroupeMaille) # separation du nom du groupe en parties
             # les tests suivants ne generent une erreur que si le prefixe est obligatoire
             if len(partiesNom) < 2: # test d'erreur, pas de separateur donc nom incorrect, i.e. sans prefixe c'est sur
-                print tr("ERREUR! ce groupe de maille (%s) n'a pas de prefixe \
-                                indiquant le type de materiau ou de source associee", nom)
+                print "ERREUR! ce groupe de maille (%s) n'a pas de prefixe \
+                                indiquant le type de materiau ou de source associee" % (nom, )
             elif partiesNom[0] not in listePrefixesGroupeMaille: # prefixe non defini
-                print tr("ERREUR! ce groupe de maille (%s) n'a pas de prefixe valable",  nom)
+                print "ERREUR! ce groupe de maille (%s) n'a pas de prefixe valable" %  (nom, )
             else:   
                 # verification de l'adequation du prefixe avec le type de bloc demande, si fourni    
                 if typeBloc is not None:
                     if typeBloc not in dictPrefixesGroupeMaille: # test validite de typeBloc, devant etre une cle du dictionnaire
-                        print tr("ERREUR! ce type de bloc (%s) n'est pas valable", str(typeBloc))
+                        print "ERREUR! ce type de bloc (%s) n'est pas valable" % (str(typeBloc), )
                     elif partiesNom[0] not in dictPrefixesGroupeMaille[typeBloc]: # pas de prefixe correct pour ce type de bloc
-                        print tr("ERREUR! ce groupe de maille (%(nom)s) n'a pas \
+                        print "ERREUR! ce groupe de maille (%(nom)s) n'a pas \
                                         le prefixe correct pour etre associe a un type %(type_bloc)s", \
-                                        {'nom': nom, 'type_bloc': str(typeBloc)})
+                                         {'nom': nom, 'type_bloc': str(typeBloc)}
                     else: # c'est bon
                         nomReel = join(partiesNom[1:], sepNomGroupeMaille) # reconstruction du nom du groupe sans prefixe complet
                         if self.debug: 
index 0a89bce13b168113690c2d64f28e9f2673b7ee79..6720c87dd03d0fb0ca0eb9450338c991d5912ffe 100644 (file)
@@ -125,22 +125,10 @@ class CARMEL3DTV0Generator(PythonGenerator):
       # Paramètres divers
       self.typeSolveur = "" # type de solveur, linéaire (Solveur_lineaire) ou non-linéaire (Solveur_non_lineaire)
       #Post traitement
-      self.carteChamp=""
-      self.carteCourantInduit=""
-      self.carteForce=""
-      self.perteJoule=""
-      self.fluxInducteur=""
-      self.courantInducteur=""
-      self.tensionInducteur=""
-      self.energie=""
-      self.ForceCouple=""
-      self.fluxSpire=""
-      self.fluxGroupe=""
-      self.ddpElect=""
-      self.ddpMagn=""
-      self.fluxMagn=""
-      self.fluxJinduitTotal=""
-      self.potFlottant = ""
+      self.carteChamp="" # liste des pas de temps demandés lors du post-traitement des cartes de champ
+      self.carteCourantInduit="" # liste des pas de temps demandés lors du post-traitement des cartes de courants induits
+      self.carteForce="" # liste des pas de temps demandés lors du post-traitement des cartes de force
+      self.post_global = [] # liste des grandeurs globales demandées lors du post-traitement
 
       # on force le probleme a etre frequentiel, seul possible en l'etat des choses
       self.problem = HARMONIC
@@ -443,44 +431,52 @@ class CARMEL3DTV0Generator(PythonGenerator):
 
         #Definir Post traitement
         postraitement=ET.SubElement(root, "postraitement")
+        # Ecriture des cartes de champ
         carteChamp=ET.SubElement(postraitement, "carteChamp")
         if type(self.carteChamp)==float:
             carteChamp.text="%s" %(self.carteChamp)
-        else: carteChamp.text="%s" % ','.join(map(str,self.carteChamp))
+        else:
+            carteChamp.text="%s" % ','.join(map(str,self.carteChamp))
+        # Ecriture des cartes de courants induits
         carteCourantInduit=ET.SubElement(postraitement, "carteCourantInduit")
         if type(self.carteCourantInduit)==float:
             carteCourantInduit.text="%s" %(self.carteCourantInduit)        
-        else: carteCourantInduit.text="%s" % ','.join(map(str,self.carteCourantInduit))
+        else:
+            carteCourantInduit.text="%s" % ','.join(map(str,self.carteCourantInduit))
+        # Ecriture des cartes de force
         carteForce=ET.SubElement(postraitement, "carteForce")
         if type(self.carteForce)==float:
             carteForce.text="%s" %(self.carteForce)            
-        else: carteForce.text="%s" % ','.join(map(str,self.carteForce))
-        perteJoule=ET.SubElement(postraitement, "perteJoule")
-        perteJoule.text="%s" %(correspondance_booleen[self.perteJoule])
-        fluxInducteur=ET.SubElement(postraitement, "fluxInducteur")
-        fluxInducteur.text="%s" %(correspondance_booleen[self.fluxInducteur])
-        courantInducteur=ET.SubElement(postraitement, "courantInducteur")
-        courantInducteur.text="%s" %(correspondance_booleen[self.courantInducteur])
-        tensionInducteur=ET.SubElement(postraitement, "tensionInducteur")
-        tensionInducteur.text="%s" %(correspondance_booleen[self.tensionInducteur])
-        energie=ET.SubElement(postraitement, "energie")
-        energie.text="%s" %(correspondance_booleen[self.energie])
-        ForceCouple=ET.SubElement(postraitement, "ForceCouple")
-        ForceCouple.text="%s" %(correspondance_booleen[self.ForceCouple])
-        fluxSpire=ET.SubElement(postraitement, "fluxSpire")
-        fluxSpire.text="%s" %(correspondance_booleen[self.fluxSpire])
-        fluxGroupe=ET.SubElement(postraitement, "fluxGroupe")
-        fluxGroupe.text="%s" %(correspondance_booleen[self.fluxGroupe])   
-        ddpElect=ET.SubElement(postraitement, "ddpElect")
-        ddpElect.text="%s" %(correspondance_booleen[self.ddpElect])
-        ddpMagn=ET.SubElement(postraitement, "ddpMagn")
-        ddpMagn.text="%s" %(correspondance_booleen[self.ddpMagn])
-        fluxMagn=ET.SubElement(postraitement, "fluxMagn")
-        fluxMagn.text="%s" %(correspondance_booleen[self.fluxMagn])        
-        fluxJinduitTotal=ET.SubElement(postraitement, "fluxJinduitTotal")
-        fluxJinduitTotal.text="%s" %(correspondance_booleen[self.fluxJinduitTotal])        
-        potentielFlottant=ET.SubElement(postraitement, "potFlottant")
-        potentielFlottant.text="%s" %(correspondance_booleen[self.potFlottant])
+        else:
+            carteForce.text="%s" % ','.join(map(str,self.carteForce))
+        # Sortie des grandeurs globales, enregistrées dans self.post_global
+        # liste de correspondance entre la valeur du catalogue et le nom de la balise XML
+        # sous forme ordonnée (nomXML, valeur catalogue) 
+        correspondance_global = (('energie',  "Energie"),\
+                                                   ('perteJoule', "Pertes Joules"),\
+                                                   ('fluxInducteur', "Flux par inducteur"),\
+                                                   ('courantInducteur', "Courants par inducteur"),\
+                                                   ('tensionInducteur', "Tensions par inducteur"), \
+                                                   ('forceCouple', "Force et couple"),\
+                                                   ('fluxSpire', "Flux par spire exploratrice"),\
+                                                   ('fluxGroupe', "Flux par groupe"),\
+                                                   ('ddpElect', "Tensions electriques"),\
+                                                   ('ddpMagn', "DDP magnetiques"), \
+                                                   ('fluxMagn', "Flux magnetiques"),\
+                                                   ('fluxJinduitTotal', "Flux J induit"),\
+                                                   ('potFlottant', "Potentiel flottant"))
+        # Sortie des grandeurs demandées seulement (true)
+        for table in correspondance_global:
+            if table[1] in self.post_global:
+                post_global_item=ET.SubElement(postraitement, table[0])
+                post_global_item.text = "true"
+#        # Sortie de toutes les grandeurs possibles, avec la valeur true pour celles demandées et false sinon
+#        for table in correspondance_global:
+#            post_global_item=ET.SubElement(postraitement, table[0])
+#            if table[1] in self.post_global:
+#                post_global_item.text = "true"
+#            else:
+#                post_global_item.text = "false"
 
         self.indent(root) # indentations et retours à la ligne, à l'aide d'une fonction maison, car xml.etree.ElementTree ne sait pas faire et le module lxml n'est pas disponible dans Salomé
 
@@ -512,7 +508,10 @@ class CARMEL3DTV0Generator(PythonGenerator):
         if self.debug: 
             print "MCSIMP %(v_1)s  %(v_2)s" % {'v_1': obj.nom, "v_2": obj.valeur}
         s=PythonGenerator.generMCSIMP(self,obj)
-        self.dicoCourant[obj.nom]=obj.valeurFormatee
+        try:
+            self.dicoCourant[obj.nom]=obj.valeurFormatee
+        except:
+            print "Oubli des messages texte homo='information'"
         return s
 
 
@@ -543,7 +542,6 @@ class CARMEL3DTV0Generator(PythonGenerator):
         s=PythonGenerator.generPROC_ETAPE(self,obj)
         if obj.nom=="PARAMETERS" : self.generBLOC_PARAMETERS(obj)
         if obj.nom=="SOLVEUR" : self.generSOLVEUR(obj)
-        if obj.nom=="POST_COMMANDS" : self.generPOST_COMMANDS(obj)
         if obj.nom=="SYMETRIE" : self.generBLOC_SYMETRIE(obj)
         if obj.nom=="POST_TRAITEMENT" : self.generPOST_TRAITEMENT(obj)
         return s
@@ -669,25 +667,25 @@ class CARMEL3DTV0Generator(PythonGenerator):
                     groupe = groupe.replace('"', "") # suppression des guillement doubles
                     self.dictMacroGroupes[nomMacroGroupe]['LISTE'].append(groupe) # sauvegarde du nom au formatage correct
             else:
-                raise ValueError, tr("Ce MACRO_GROUPE %s doit contenir une liste de groupes LISTE_MESHGROUP." % nomMacroGroupe)
+                raise ValueError, nomMacroGroupe + tr(" : ce MACRO_GROUPE doit contenir une liste de groupes LISTE_MESHGROUP.")
 
             for nomGroupe in self.dictMacroGroupes[nomMacroGroupe]['LISTE']: # liste des groupes MESHGROUP de ce macro-groupe. On leur associe les propriétés du MACRO_GROUPE
                 for propriete in ('SOURCE', 'MATERIAL',  'STRANDED_INDUCTOR_GEOMETRY'): # liste des propriétés automatiques à copier du MACRO_GROUPE à chaque MESHGROUP de la liste
                     if  propriete in obj.valeur.keys(): # ce macro-groupe est associé à cette propriété
                         if self.dictGroupes[nomGroupe].has_key(propriete) and self.dictGroupes[nomGroupe][propriete] != self.dictGroupes[nomGroupe][propriete].nom: # erreur, ce meshgroup a déjà une telle propriéte définie, différente
-                            print u"ERREUR! Conflit entre la %s : %s du MACRO_GROUPE %s et celle : %s du MESHGROUP associé à ce macro-groupe." % \
+                            print u"ERREUR! Conflit entre la %s : %s du MACRO_GROUPE %s et celle : %s du MESHGROUP %s associé à ce macro-groupe." % \
                              ( propriete, obj.valeur[propriete].nom,  nomMacroGroupe, self.dictGroupes[nomGroupe][propriete],  nomGroupe )
-                            raise ValueError, tr(u"ERREUR! Conflit entre la %s : %s du MACRO_GROUPE %s et celle : %s du MESHGROUP associé à ce macro-groupe." % \
-                             ( propriete, obj.valeur[propriete].nom,  nomMacroGroupe, self.dictGroupes[nomGroupe][propriete],  nomGroupe ))
+                            raise ValueError, propriete + ',' + obj.valeur[propriete].nom + ',' + nomMacroGroupe + ',' + self.dictGroupes[nomGroupe][propriete] + ',' +  nomGroupe\
+                            + tr(" : conflit entre la propriete (#1:#2) du MACRO_GROUPE (de nom #3) et celle (#4) du MESHGROUP (#5) associe a ce macro-groupe.")
                         else : # pas de conflit de cette propriété, alors copie, meme si les propriétés sont les memes pour simplifier
                             self.dictGroupes[nomGroupe][propriete] = obj.valeur[propriete].nom # sauvegarde du nom de la propriété du macro-groupe dans le meshgroup
                 for propriete in ('CONDITION_LIMITE', ): # liste des propriétés définies à l'avance automatiques à copier du MACRO_GROUPE à chaque MESHGROUP de la liste
                     if  propriete in obj.valeur.keys(): # ce macro-groupe est associé à cette propriété
                         if self.dictGroupes[nomGroupe].has_key(propriete) and self.dictGroupes[nomGroupe][propriete] != self.dictGroupes[nomGroupe][propriete]: # erreur, ce meshgroup a déjà une telle propriéte définie, différente
-                            print u"ERREUR! Conflit entre la %s : %s du MACRO_GROUPE %s et celle : %s du MESHGROUP associé à ce macro-groupe." % \
+                            print u"ERREUR! Conflit entre la %s : %s du MACRO_GROUPE %s et celle : %s du MESHGROUP %s associé à ce macro-groupe." % \
                              ( propriete, obj.valeur[propriete],  nomMacroGroupe, self.dictGroupes[nomGroupe][propriete],  nomGroupe )
-                            raise ValueError, tr(u"ERREUR! Conflit entre la %s : %s du MACRO_GROUPE %s et celle : %s du MESHGROUP associé à ce macro-groupe." % \
-                             ( propriete, obj.valeur[propriete],  nomMacroGroupe, self.dictGroupes[nomGroupe][propriete],  nomGroupe ))
+                            raise ValueError, propriete + ',' + obj.valeur[propriete].nom + ',' + nomMacroGroupe + ',' + self.dictGroupes[nomGroupe][propriete] + ',' +  nomGroupe\
+                            + tr(" : conflit entre la propriete (#1:#2) du MACRO_GROUPE (de nom #3) et celle (#4) du MESHGROUP (#5) associe a ce macro-groupe.")
                         else : # pas de conflit de cette propriété, alors copie, meme si les propriétés sont les memes pour simplifier
                             self.dictGroupes[nomGroupe][propriete] = obj.valeur[propriete] # sauvegarde du nom de la propriété du macro-groupe dans le meshgroup
         except ValueError, err:
@@ -763,22 +761,6 @@ class CARMEL3DTV0Generator(PythonGenerator):
         except ValueError, err:
             raise ValueError, str(err)
 
-   def generPOST_COMMANDS(self, obj):
-        if self.debug: 
-            print "generation POST_COMMANDS obj.valeur = %s" % obj.valeur     
-
-
-
-        self.visu = False
-        self.post_global = False
-        if obj.valeur.has_key('GLOBAL'):
-            self.post_global = True
-        if obj.valeur.has_key('VISU'):
-            self.visu = True
-            self.visu_format=obj.valeur["VISU"]["VISU_Format"]
-         #   self.visu_type=obj.valeur["VISU"]["VISU_Type"]
-
-
 #---------------------------------------------------------------------------------------
 # traitement fichier PHYS
 #---------------------------------------------------------------------------------------
@@ -861,19 +843,14 @@ class CARMEL3DTV0Generator(PythonGenerator):
         self.carteChamp=obj.valeur["Cartes_des_champs"]
         self.carteCourantInduit=obj.valeur["Cartes_des_courants_induits"]
         self.carteForce=obj.valeur["Cartes_des_forces"]
-        self.perteJoule=obj.valeur["Pertes_Joules"]
-        self.fluxInducteur=obj.valeur["Flux_par_inducteur"]
-        self.courantInducteur=obj.valeur["Courants_par_inducteur"]
-        self.tensionInducteur=obj.valeur["Tensions_par_inducteur"]
-        self.energie=obj.valeur["Energie"]
-        self.ForceCouple=obj.valeur["Forces_et_couple"]
-        self.fluxSpire=obj.valeur["Flux_par_spire"]
-        self.fluxGroupe=obj.valeur["Flux_par_groupe"]
-        self.ddpElect=obj.valeur["Tensions_electriques"]
-        self.ddpMagn=obj.valeur["DDP_magnetiques"]
-        self.fluxMagn=obj.valeur["Flux_magnetiques"]
-        self.fluxJinduitTotal=obj.valeur["Flux_J_induit"]     
-        self.potFlottant=obj.valeur["Potentiel_Flottant"]
+        if obj.valeur.has_key('GLOBAL'):
+            self.post_global = obj.valeur['GLOBAL']
+            # sauvegarde de la liste au format correct, en supprimant les guillemets simples et doubles extra générés par Eficas
+            # car Eficas génère une liste ["'Energie'","'Flux par inducteur'","'Force et couple'"] enrichie
+            # à partir de l'instruction .comm correctement formatée : GLOBAL=('Energie','Flux par inducteur','Force et couple',)
+            for i in range(len(self.post_global)): 
+                self.post_global[i] = self.post_global[i].replace("'", "") # suppression des guillement simples
+                self.post_global[i] = self.post_global[i].replace('"', "") # suppression des guillement doubles
 
 #-------------------------------------
 # Methodes utilitaires
index d158fa53d08373696b4a0aee4f4a4c92b8cac5a0..30daec5034ed980fd51efe748e028432891a16d2 100755 (executable)
@@ -91,7 +91,7 @@ class PSENGenerator(DicoImbriqueGenerator):
 #----------------------------------------------------------------------------------------
 
    def writeDefault(self,fn) :
-       fileDico = "PSEN/PSENconfig.py" 
+       fileDico=os.path.abspath(os.path.join(os.path.dirname(os.path.abspath(__file__)),'..','PSEN_Eficas','PSEN','PSENconfig.py'))
        f = open( str(fileDico), 'wb')
        f.write( self.Entete + "Dico =" + str(self.Dico) )
        f.close()