]> SALOME platform Git repositories - modules/eficas.git/commitdiff
Salome HOME
Restitution de PN_DecoupePanel
authoreficas <>
Thu, 11 Mar 2004 09:59:06 +0000 (09:59 +0000)
committereficas <>
Thu, 11 Mar 2004 09:59:06 +0000 (09:59 +0000)
57 files changed:
Aster/Cata/Macro/macr_aspic_calc_ops.py [new file with mode: 0644]
Aster/Cata/Macro/macr_aspic_mail_ops.py
Aster/Cata/cata_STA7.py
Aster/eficas_aster.py
Aster/prefs.py
Doc/Makefile
Editeur/appli.py
Editeur/browser.py
Editeur/bureau.py
Editeur/cataediteur.py
Editeur/compocomm.py
Editeur/compocommandecomm.py
Editeur/compoformule.py
Editeur/compomacro.py
Editeur/compoparameval.py
Editeur/composimp.py
Editeur/configuration.py
Editeur/eficas.py
Editeur/eficas_go.py
Editeur/fonctionpanel.py [new file with mode: 0644]
Editeur/jdcdisplay.py
Editeur/newsimppanel.py [new file with mode: 0644]
Editeur/options.py
Editeur/panels.py
Editeur/panelsSalome.py [new file with mode: 0644]
Editeur/patches.py
Editeur/plusieursassdpanel.py [new file with mode: 0644]
Editeur/plusieursbasepanel.py [new file with mode: 0644]
Editeur/plusieursintopanel.py [new file with mode: 0644]
Editeur/plusieurspanel.py [new file with mode: 0644]
Editeur/readercata.py
Editeur/shellpanel.py [new file with mode: 0644]
Editeur/statusbar.py
Editeur/uniqueassdpanel.py [new file with mode: 0644]
Editeur/uniquebasepanel.py [new file with mode: 0644]
Editeur/uniquecomppanel.py [new file with mode: 0644]
Editeur/uniqueintopanel.py [new file with mode: 0644]
Editeur/uniquepanel.py [new file with mode: 0644]
Editeur/uniquesdcopanel.py [new file with mode: 0644]
Editeur/utils.py
Editeur/widgets.py
Extensions/parametre.py
Extensions/parametre_eval.py
Ihm/I_ETAPE.py
Ihm/I_MCSIMP.py
Ihm/I_OBJECT.py
Noyau/N_ETAPE.py
Noyau/N_JDC.py
Noyau/N_MACRO_ETAPE.py
Noyau/N_MCBLOC.py
Noyau/N_MCCOMPO.py
Noyau/N_MCLIST.py
Noyau/N_MCSIMP.py
Noyau/N_OBJECT.py
Noyau/N_VALIDATOR.py
Validation/V_MCSIMP.py
generator/generator_python.py

diff --git a/Aster/Cata/Macro/macr_aspic_calc_ops.py b/Aster/Cata/Macro/macr_aspic_calc_ops.py
new file mode 100644 (file)
index 0000000..0f3d0e6
--- /dev/null
@@ -0,0 +1,832 @@
+#@ MODIF macr_aspic_calc_ops Macro  DATE 03/02/2004   AUTEUR LEBOUVIE F.LEBOUVIER 
+#            CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2004  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.                                                  
+#                                                                       
+# 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.                              
+#                                                                       
+# 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.        
+# ======================================================================
+def macr_aspic_calc_ops(self,TYPE_MAILLAGE,TUBULURE,MAILLAGE,MODELE,CHAM_MATER,CARA_ELEM,
+                             FOND_FISS_1,FOND_FISS_2,CHARGE,RESU_THER,AFFE_MATERIAU,EQUILIBRE,
+                             PRES_REP,ECHANGE,TORS_CORP,TORS_TUBU,COMP_INCR,COMP_ELAS,
+                             THETA_3D,OPTION,SOLVEUR,CONVERGENCE,NEWTON,RECH_LINEAIRE,
+                             INCREMENT,PAS_AZIMUT,IMPRESSION,INFO,TITRE ,**args):          
+  """
+     Ecriture de la macro MACR_ASPIC_CALC
+  """
+  from Accas import _F
+  import types
+  ier=0
+#------------------------------------------------------------------
+  # On recopie le mot cle affe_materiau pour le proteger
+  mc_AFFE_MATERIAU=AFFE_MATERIAU
+#------------------------------------------------------------------
+  # On importe les definitions des commandes a utiliser dans la macro
+  AFFE_MODELE      =self.get_cmd('AFFE_MODELE'     )
+  AFFE_MATERIAU    =self.get_cmd('AFFE_MATERIAU'   )
+  AFFE_CARA_ELEM   =self.get_cmd('AFFE_CARA_ELEM'  )
+  AFFE_CHAR_THER_F =self.get_cmd('AFFE_CHAR_THER_F')
+  THER_LINEAIRE    =self.get_cmd('THER_LINEAIRE'   )
+  AFFE_CHAR_MECA   =self.get_cmd('AFFE_CHAR_MECA'  )
+  STAT_NON_LINE    =self.get_cmd('STAT_NON_LINE'   )
+  CALC_ELEM        =self.get_cmd('CALC_ELEM'       )
+  POST_RELEVE_T    =self.get_cmd('POST_RELEVE_T'   )
+  IMPR_TABLE       =self.get_cmd('IMPR_TABLE'      )
+  POST_RCCM        =self.get_cmd('POST_RCCM'       )
+  DEFI_FOND_FISS   =self.get_cmd('DEFI_FOND_FISS'  )
+  CALC_THETA       =self.get_cmd('CALC_THETA'      )
+  CALC_G_THETA_T   =self.get_cmd('CALC_G_THETA_T'  )
+  CALC_G_LOCAL_T   =self.get_cmd('CALC_G_LOCAL_T'  )
+  IMPR_RESU        =self.get_cmd('IMPR_RESU'       )
+
+  # La macro compte pour 1 dans la numerotation des commandes
+  self.set_icmd(1)
+#------------------------------------------------------------------
+# data
+  GRMAIL= ('EQUERRE','PEAUINT','EXCORP1','EXCORP2','EXTUBU','LEVRTUBU','LEVRCORP')
+  NOMNOE= ('P1_CORP','P2_CORP','P_TUBU ')
+  IMPRT1= ('NUME_ORDRE','INTITULE','RESU'  ,'NOM_CHAM',
+           'ABSC_CURV' ,'COOR_X'  ,'COOR_Y','COOR_Z'  ,
+           'SIXX'      ,'SIXY'    ,'SIXZ'   )
+  IMPRT2= ('NUME_ORDRE','INTITULE','RESU'  ,'NOM_CHAM',
+           'ABSC_CURV' ,'COOR_X'  ,'COOR_Y','COOR_Z'  ,
+           'SIYY'      ,'SIXY'    ,'SIYZ'   )
+  IMPRT3= ('NUME_ORDRE','INTITULE','RESU'  ,'NOM_CHAM',
+           'ABSC_CURV' ,'COOR_X'  ,'COOR_Y','COOR_Z'  ,
+           'TEMP'   )
+  APPRES= ('PEAUINT ','LEVRTUBU','LEVRCORP')
+#------------------------------------------------------------------
+#
+  if mc_AFFE_MATERIAU.__class__.__name__!='MCList' : mc_AFFE_MATERIAU=[mc_AFFE_MATERIAU,]
+  i=0
+  for mate in mc_AFFE_MATERIAU:
+     if mate['RCCM']=='OUI' :
+        i=i+1
+        MRCCM=mate['MATER']
+  if i>1 :
+     ier=ier+1
+     self.cr.fatal("""<E> <MACR_ASPIC_CALC> vous affectez plus d un materiau contenant l option rccm""")
+     return ier
+#
+  if (TYPE_MAILLAGE[:4]=='SAIN') and (TUBULURE==None) :
+     ier=ier+1
+     self.cr.fatal("""<E> <MACR_ASPIC_CALC> pour les piquages sains, TUBULURE doit etre renseigne""")
+     return ier
+#
+  if EQUILIBRE['NOEUD'] not in ('P1_CORP','P2_CORP') :
+     ier=ier+1
+     self.cr.fatal("""<E> <MACR_ASPIC_CALC> EQUILIBRE[NOEUD] : on attend 'P1_CORP ' ou 'P2_CORP'""")
+     return ier
+#
+  if PRES_REP['EFFE_FOND']=='OUI' :
+     if PRES_REP['NOEUD']==None :
+       ier=ier+1
+       self.cr.fatal("""<E> <MACR_ASPIC_CALC> il faut preciser un noeud pour EFFE_FOND""")
+       return ier
+     if PRES_REP['NOEUD'] not in ('P1_CORP','P2_CORP') :
+       ier=ier+1
+       self.cr.fatal("""<E> <MACR_ASPIC_CALC> PRES_REP[NOEUD] : on attend 'P1_CORP' ou 'P2_CORP'""")
+       return ier
+     if PRES_REP['NOEUD']==EQUILIBRE['NOEUD'] :
+       ier=ier+1
+       self.cr.fatal("""<E> <MACR_ASPIC_CALC> on ne peut appliquer un EFFE_FOND sur PRES_REP[NOEUD] car ce noeud est bloque""")
+       return ier
+#
+  if TORS_CORP!=None :
+     if TORS_CORP['NOEUD'] not in ('P1_CORP','P2_CORP') :
+       ier=ier+1
+       self.cr.fatal("""<E> <MACR_ASPIC_CALC> TORS_CORP[NOEUD] : on attend 'P1_CORP' ou 'P2_CORP'""")
+       return ier
+     if TORS_CORP['NOEUD']==EQUILIBRE['NOEUD'] :
+       ier=ier+1
+       self.cr.fatal("""<E> <MACR_ASPIC_CALC> on ne peut appliquer un torseur sur TORS_CORP[NOEUD] car ce noeud est bloque""")
+       return ier
+#
+  if (TYPE_MAILLAGE[:4]=='SAIN') and (THETA_3D!=None) :
+     ier=ier+1
+     self.cr.fatal("""<E> <MACR_ASPIC_CALC> si TYPE_MAILLAGE SAIN : mecanique de la rupture impossible""")
+     return ier
+#
+  if OPTION in ('CALC_G_MAX','CALC_G_MAX_LOCAL') :
+    if BORNES==None :
+       ier=ier+1
+       self.cr.fatal("""<E> <MACR_ASPIC_CALC> mot-clef <BORNES> obligatoire avec cette option""")
+       return ier
+#
+  if IMPRESSION!=None :
+    if IMPRESSION['FORMAT'] in ('IDEAS','CASTEM') :
+      if IMPRESSION['NOM_CHAM']==None :
+        ier=ier+1
+        self.cr.fatal("""<E> <MACR_ASPIC_CALC> impression de resultats demandée sans preciser le nom des champs
+                                               cf. la documentation utilisateur : U4.PC.20.""")
+        return ier
+#
+#------------------------------------------------------------------
+#
+#     --- commande AFFE_MODELE ---
+#
+  if MODELE!=None : self.DeclareOut('modele',MODELE)
+  mcfact=[]
+  if (PRES_REP['PRES_LEVRE']=='OUI') and (TYPE_MAILLAGE[-4:]=='_DEB') :
+     mcfact.append(_F(GROUP_MA=GRMAIL,     PHENOMENE='MECANIQUE',MODELISATION='3D'    ))
+  else:
+     mcfact.append(_F(GROUP_MA=GRMAIL[:-2],PHENOMENE='MECANIQUE',MODELISATION='3D'    ))
+  mcfact.append(   _F(GROUP_MA='P1_CORP'  ,PHENOMENE='MECANIQUE',MODELISATION='DIS_TR'))
+  mcfact.append(   _F(GROUP_MA='P2_CORP'  ,PHENOMENE='MECANIQUE',MODELISATION='DIS_TR'))
+  mcfact.append(   _F(GROUP_MA='P_TUBU'   ,PHENOMENE='MECANIQUE',MODELISATION='DIS_TR'))
+  modele = AFFE_MODELE( MAILLAGE = MAILLAGE ,
+                        AFFE     = mcfact    )
+  if ECHANGE!=None :                                # modele thermique
+     __modthe = AFFE_MODELE( MAILLAGE = MAILLAGE ,
+                             AFFE     = _F(GROUP_MA    =GRMAIL[:-2],
+                                           PHENOMENE   ='THERMIQUE',
+                                           MODELISATION='3D' )       )
+#
+#     --- commande AFFE_MATERIAU ---
+#
+  if CHAM_MATER!=None : self.DeclareOut('affmat',CHAM_MATER)
+  mcfact=[]
+  for mater in mc_AFFE_MATERIAU :
+     if mater['TOUT']!=None : mcfact.append(_F(TOUT    =mater['TOUT'    ],MATER=mater['MATER'],TEMP_REF=mater['TEMP_REF']))
+     else                   : mcfact.append(_F(GROUP_MA=mater['GROUP_MA'],MATER=mater['MATER'],TEMP_REF=mater['TEMP_REF']))
+  affmat = AFFE_MATERIAU( MAILLAGE = MAILLAGE ,
+                          MODELE   = modele ,
+                          AFFE     = mcfact    )
+#
+#     --- commande AFFE_CARA_ELEM ---
+#
+  if CARA_ELEM!=None : self.DeclareOut('carael',CARA_ELEM)
+  carael = AFFE_CARA_ELEM( MODELE   = modele ,
+                           DISCRET  = ( _F( GROUP_MA='P1_CORP' ,
+                                            CARA    ='K_TR_D_N',
+                                            VALE    = ( 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 ) ),
+                                        _F( GROUP_MA='P2_CORP' ,
+                                            CARA    ='K_TR_D_N',
+                                            VALE    = ( 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 ) ),
+                                        _F( GROUP_MA='P_TUBU' ,
+                                            CARA    ='K_TR_D_N',
+                                            VALE    = ( 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 ) ), ) )
+#
+#     --- commande AFFE_CHAR_THER_F ---
+#         condition aux limites
+#
+  if ECHANGE!=None :
+     __chther = AFFE_CHAR_THER_F( MODELE = __modthe ,
+                                  ECHANGE=( _F(GROUP_MA='PEAUTUBU',
+                                               COEF_H  =ECHANGE['COEF_H_TUBU'],
+                                               TEMP_EXT=ECHANGE['TEMP_EXT'],),
+                                            _F(GROUP_MA='PEAUCORP',
+                                               COEF_H  =ECHANGE['COEF_H_CORP'],
+                                               TEMP_EXT=ECHANGE['TEMP_EXT'],),))
+#
+#     --- calcul thermique ---
+#
+     if RESU_THER!=None : self.DeclareOut('resuth',RESU_THER)
+     mcsimp={}
+     if INCREMENT['NUME_INST_INIT']!=None : mcsimp['NUME_INIT']=INCREMENT['NUME_INST_INIT']
+     if INCREMENT['NUME_INST_FIN' ]!=None : mcsimp['NUME_FIN' ]=INCREMENT['NUME_INST_FIN' ]
+     mcfact=_F(LIST_INST=INCREMENT['LIST_INST'],**mcsimp)
+     resuth = THER_LINEAIRE( MODELE     = __modthe ,
+                             CHAM_MATER = affmat ,
+                             TEMP_INIT  = _F(STATIONNAIRE='OUI',),
+                             EXCIT      = _F(CHARGE=__chther,),
+                             INCREMENT  = mcfact, )
+#
+     if CHARGE!=None : self.DeclareOut('chmeth',CHARGE)
+     chmeth = AFFE_CHAR_MECA( MODELE        = modele ,
+                              TEMP_CALCULEE = resuth )
+#
+#     --- commande AFFE_CHAR_MECA ---
+#         condition aux limites
+#
+  if     EQUILIBRE['NOEUD']=='P1_CORP' :
+         NENCAS = EQUILIBRE['NOEUD']
+         AEFOCO = 'EXCORP2'
+         ATORCO = 'P2_CORP'
+         LINTC  = 'L_INT_C2'
+  elif   EQUILIBRE['NOEUD']=='P2_CORP' :
+         NENCAS = EQUILIBRE['NOEUD']
+         AEFOCO = 'EXCORP1'
+         ATORCO = 'P1_CORP'
+         LINTC  = 'L_INT_C1'
+  __conlim = AFFE_CHAR_MECA( MODELE   = modele ,
+                             LIAISON_ELEM  = ( _F( OPTION    ='3D_POU'  ,
+                                                   GROUP_MA_1='EXCORP1',
+                                                   GROUP_NO_2='P1_CORP'),
+                                               _F( OPTION    ='3D_POU'  ,
+                                                   GROUP_MA_1='EXCORP2' ,
+                                                   GROUP_NO_2='P2_CORP'),
+                                               _F( OPTION    ='3D_POU'  ,
+                                                   GROUP_MA_1='EXTUBU',
+                                                   GROUP_NO_2='P_TUBU'), ),
+                             DDL_IMPO      =   _F( GROUP_NO  = NENCAS  ,
+                                                   DX        = 0.0 ,
+                                                   DY        = 0.0 ,
+                                                   DZ        = 0.0 ,
+                                                   DRX       = 0.0 ,
+                                                   DRY       = 0.0 ,
+                                                   DRZ       = 0.0 , ) )
+#
+#     --- commande AFFE_CHAR_MECA ---
+#         chargement mecanique : pres_rep, effet de fond 
+#
+  motscles={}
+  if (PRES_REP['PRES_LEVRE']=='OUI') and (TYPE_MAILLAGE[-4:]=='_DEB') :
+      motscles['PRES_REP'  ]= _F(GROUP_MA=APPRES,   PRES=PRES_REP['PRES'])
+  else :
+      motscles['PRES_REP'  ]= _F(GROUP_MA=APPRES[0],PRES=PRES_REP['PRES'])
+  if  PRES_REP['EFFE_FOND' ]!=None :
+      motscles['EFFE_FOND' ]=(_F(GROUP_MA    ='EXTUBU  ',
+                                 GROUP_MA_INT='L_INT_TU',
+                                 PRES        =PRES_REP['PRES']),
+                              _F(GROUP_MA    =AEFOCO,
+                                 GROUP_MA_INT=LINTC,
+                                 PRES        =PRES_REP['PRES']))
+  __chpres = AFFE_CHAR_MECA( MODELE   = modele ,**motscles)
+#
+#     --- commande AFFE_CHAR_MECA ---
+#         chargement mecanique : torseur sur le corps
+#
+  if TORS_CORP!=None:
+     if TORS_CORP.__class__.__name__!='MCList' : TORS_CORP=[TORS_CORP,]
+     __chtrc = [None]*6
+     i=0
+     for tors in TORS_CORP :
+       mcsimp={}
+       if tors['FX']!=None : mcsimp['FX']=tors['FX']
+       if tors['FY']!=None : mcsimp['FY']=tors['FY']
+       if tors['FZ']!=None : mcsimp['FZ']=tors['FZ']
+       if tors['MX']!=None : mcsimp['MX']=tors['MX']
+       if tors['MY']!=None : mcsimp['MY']=tors['MY']
+       if tors['MZ']!=None : mcsimp['MZ']=tors['MZ']
+       mcfact=_F(GROUP_NO=ATORCO,**mcsimp)
+       __chtrc[i] = AFFE_CHAR_MECA( MODELE       = modele ,
+                                    FORCE_NODALE = mcfact , )
+       i=i+1
+#
+#     --- commande AFFE_CHAR_MECA ---
+#         chargement mecanique : torseur sur la tubulure
+#
+  if TORS_TUBU!=None:
+     if TORS_TUBU.__class__.__name__!='MCList' : TORS_TUBU=[TORS_TUBU,]
+     __chtrt = [None]*6
+     i=0
+     for tors in TORS_TUBU :
+       mcsimp={}
+       if tors['FX']!=None : mcsimp['FX']=tors['FX']
+       if tors['FY']!=None : mcsimp['FY']=tors['FY']
+       if tors['FZ']!=None : mcsimp['FZ']=tors['FZ']
+       if tors['MX']!=None : mcsimp['MX']=tors['MX']
+       if tors['MY']!=None : mcsimp['MY']=tors['MY']
+       if tors['MZ']!=None : mcsimp['MZ']=tors['MZ']
+       mcfact=_F(GROUP_NO='P_TUBU  ',**mcsimp)
+       __chtrt[i] = AFFE_CHAR_MECA( MODELE       = modele ,
+                                    FORCE_NODALE = mcfact , )
+       i=i+1
+#
+#     --- commande STAT_NON_LINE ---
+#
+  motscles={}
+#
+  mcfex=[]  # mot clé facteur EXCIT
+  mcfex.append(_F(CHARGE=__conlim,))
+  if ECHANGE!=None :
+     mcfex.append(_F(CHARGE=chmeth,))
+  if PRES_REP['FONC_MULT']!=None :
+     mcfex.append(_F(CHARGE=__chpres,FONC_MULT=PRES_REP['FONC_MULT']))
+  else :
+     mcfex.append(_F(CHARGE=__chpres,))
+  if TORS_CORP!=None:
+     i=0
+     for tors in TORS_CORP :
+       if tors['FONC_MULT']!=None :
+          mcfex.append(_F(CHARGE=__chtrc[i],FONC_MULT=tors['FONC_MULT']))
+       else :
+          mcfex.append(_F(CHARGE=__chtrc[i],))
+       i=i+1
+  if TORS_TUBU!=None:
+     i=0
+     for tors in TORS_TUBU :
+       if tors['FONC_MULT']!=None :
+          mcfex.append(_F(CHARGE=__chtrt[i],FONC_MULT=tors['FONC_MULT']))
+       else :
+          mcfex.append(_F(CHARGE=__chtrt[i],))
+       i=i+1
+  motscles['EXCIT'] =mcfex
+#
+  mcfci=[]  # mot clé facteur COMP_INCR :obligatoire pour les noeuds discrets
+  if COMP_INCR!=None :
+    mcfci.append(_F(TOUT    ='OUI' ,RELATION=COMP_INCR['RELATION']))
+  mcfci.append(  _F(GROUP_MA=NOMNOE,RELATION='ELAS'))
+  motscles['COMP_INCR'] =mcfci
+#
+  if COMP_ELAS!=None :
+    motscles['COMP_ELAS'] =_F(GROUP_MA=GRMAIL[:-2] ,RELATION=COMP_ELAS['RELATION'])
+#
+  dSolveur=SOLVEUR.cree_dict_valeurs(SOLVEUR.mc_liste)
+  for i in dSolveur.keys():
+      if dSolveur[i]==None : del dSolveur[i]
+#
+  dConverg=CONVERGENCE.cree_dict_valeurs(CONVERGENCE.mc_liste)
+  for i in dConverg.keys():
+      if dConverg[i]==None : del dConverg[i]
+#
+  dNewton=NEWTON.cree_dict_valeurs(NEWTON.mc_liste)
+  for i in dNewton.keys():
+      if dNewton[i]==None : del dNewton[i]
+#
+  dRechlin=RECH_LINEAIRE.cree_dict_valeurs(RECH_LINEAIRE.mc_liste)
+  for i in dRechlin.keys():
+      if dRechlin[i]==None : del dRechlin[i]
+#
+  dIncrem=INCREMENT.cree_dict_valeurs(INCREMENT.mc_liste)
+  for i in dIncrem.keys():
+      if dIncrem[i]==None : del dIncrem[i]
+#
+  if TITRE!=None :
+    motscles['TITRE'        ] =TITRE
+  motscles  ['SOLVEUR'      ] =dSolveur
+  motscles  ['CONVERGENCE'  ] =dConverg
+  motscles  ['NEWTON'       ] =dNewton
+  motscles  ['RECH_LINEAIRE'] =dRechlin
+  motscles  ['INCREMENT'    ] =dIncrem
+  self.DeclareOut('nomres',self.sd)
+  nomres = STAT_NON_LINE( MODELE     = modele ,
+                          CHAM_MATER = affmat ,
+                          CARA_ELEM  = carael ,
+                          INFO       = INFO   , **motscles)
+#
+  motscles = {}
+  if ECHANGE!=None :
+     motscles['EXCIT']=_F(CHARGE = chmeth)
+  nomres = CALC_ELEM( reuse      = nomres,
+                      RESULTAT   = nomres ,
+                      MODELE     = modele ,
+                      CHAM_MATER = affmat ,
+                      CARA_ELEM  = carael ,
+                      TOUT_ORDRE = 'OUI'  ,
+                      OPTION     = ('SIEF_ELNO_ELGA','VARI_ELNO_ELGA','EQUI_ELNO_SIGM') ,
+                      INFO       = INFO   , **motscles)
+#
+#-----------------------------------------------------------------------
+  if TYPE_MAILLAGE[:4]=='SAIN' :
+#-----------------------------------------------------------------------
+#
+#     --- post traitement :  POST_RELEVE_T  --- azimuts droits
+#
+#     ----  champs de contrainte SI, SII ET SIII  ----
+#
+    if TYPE_MAILLAGE=='SAIN_GROS' : NBAZIM = 40
+    else                          : NBAZIM = 48
+    mcfact=[]
+    TYPSOU=None
+    if TUBULURE!=None : TYPSOU = TUBULURE['TYPE']
+    for i in range(1,NBAZIM+1,PAS_AZIMUT):
+      if i<10 : NUME = '0'+str(i)
+      else    : NUME =     str(i)
+      mcsimp={}
+      if TYPSOU=='TYPE_1':
+          mcsimp['REPERE' ]='CYLINDRIQUE',
+          mcsimp['ORIGINE']=( 0.0 , 0.0 , 0.0 )
+          mcsimp['AXE_Z'  ]=( 0.0 , 0.0 , 1.0 )
+          INTITD = 'AZI_'+NUME+'_D-REP_CYL'
+      else:
+          mcsimp['REPERE' ]='LOCAL'
+          mcsimp['VECT_Y' ]=( 0.0 , 0.0 , 1.0 )
+          INTITD = 'AZI_'+NUME+'_D-REP_LOC'
+      mcsimp['INTITULE' ]=INTITD
+      mcsimp['GROUP_NO' ]='LD'+str(i)
+      mcfact.append( _F( RESULTAT   = nomres,
+                         TOUT_ORDRE ='OUI',
+                         NOM_CHAM   ='SIEF_ELNO_ELGA',
+                         PRECISION  =55.E-1,
+                         TOUT_CMP   ='OUI',
+                         OPERATION  ='EXTRACTION',**mcsimp))
+    __noposd=POST_RELEVE_T(ACTION = mcfact,
+                           TITRE  = '-- TRAITEMENT DES AZIMUTS DROITS --')
+#
+#     --- IMPR_TABLE dans un repere cylindrique ou local
+#         des champs de contrainte SI, SII ET SIII
+#
+    if TYPSOU=='TYPE_1' : nompara=IMPRT1
+    else                : nompara=IMPRT2
+    IMPR_TABLE(TABLE    = __noposd,
+               NOM_PARA = nompara   )
+#
+#     ----  Pm, Pm+Pb sur les lignes de depouillement  ----
+#
+    if mc_AFFE_MATERIAU[0]['RCCM']=='OUI':
+      mcfact=[]
+      for i in range(1,NBAZIM+1,PAS_AZIMUT):
+        if i<10 : NUME = '0'+str(i)
+        else    : NUME =     str(i)
+        mcsimp={}
+        mcsimp['PRECISION']=55.E-1
+        mcsimp['GROUP_NO' ]='LD'+str(i)
+        mcfact.append( _F(**mcsimp) )
+      __pmpbsd=POST_RCCM(MATER       = MRCCM,
+                         MAILLAGE    = MAILLAGE,
+                         TYPE_RESU   = 'VALE_MAX',
+                         OPTION      = 'PM_PB',
+                         SEGMENT     = mcfact,
+                         TRANSITOIRE = _F(RESULTAT  =nomres,
+                                          NOM_CHAM  ='SIEF_ELNO_ELGA',
+                                          TOUT_ORDRE='OUI',),
+                         TITRE       = '-- TRAITEMENT DES AZIMUTS DROITS --',)
+      IMPR_TABLE(TABLE = __pmpbsd, )
+#
+#     ----  champ de temperature, si il a ete calcule, sur les lignes de depouillement  ----
+#
+    if ECHANGE!=None :
+      mcfact=[]
+      for i in range(1,NBAZIM+1,PAS_AZIMUT):
+        if i<10 : NUME = '0'+str(i)
+        else    : NUME =     str(i)
+        mcsimp={}
+        mcsimp['GROUP_NO'   ]='LD'+str(i)
+        mcsimp['RESULTAT'   ]=resuth
+        mcsimp['TOUT_ORDRE' ]='OUI'
+        mcsimp['NOM_CHAM'   ]='TEMP'
+        mcsimp['PRECISION'  ]=55.E-1
+        mcsimp['TOUT_CMP'   ]='OUI'
+        mcsimp['INTITULE'   ]='AZI_'+NUME+'_D'
+        mcsimp['OPERATION'  ]='EXTRACTION'
+        mcfact.append( _F(**mcsimp) )
+      __rthazd=POST_RELEVE_T(ACTION=mcfact)
+      IMPR_TABLE(TABLE = __rthazd, )
+#
+#     ----  parametres caracterisant la distribution de temperature,
+#           si elle a ete calculee, dans l epaisseur du ligament  ----
+#
+      mcfact=[]
+      for i in range(1,NBAZIM+1,PAS_AZIMUT):
+        if i<10 : NUME = '0'+str(i)
+        else    : NUME =     str(i)
+        mcsimp={}
+        mcsimp['GROUP_NO'   ]='LD'+str(i)
+        mcsimp['RESULTAT'   ]=resuth
+        mcsimp['TOUT_ORDRE' ]='OUI'
+        mcsimp['NOM_CHAM'   ]='TEMP'
+        mcsimp['PRECISION'  ]=55.E-1
+        mcsimp['TOUT_CMP'   ]='OUI'
+        mcsimp['INTITULE'   ]='AZI_'+NUME+'_D'
+        mcsimp['OPERATION'  ]='MOYENNE'
+        mcfact.append( _F(**mcsimp) )
+      __rmothd=POST_RELEVE_T(ACTION=mcfact)
+      IMPR_TABLE(TABLE = __rmothd, )
+#
+#-----------------------------------------------------------------------
+#
+#     --- post traitement :  POST_RELEVE_T  --- azimuts inclines
+#     --- champs de contrainte SI, SII ET SIII  ----
+#
+    mcfact=[]
+    for i in range(1,NBAZIM+1,PAS_AZIMUT):
+      if i<10 : NUME = '0'+str(i)
+      else    : NUME =     str(i)
+      mcsimp={}
+      mcsimp['GROUP_NO'   ]='LI'+str(i)
+      mcsimp['RESULTAT'   ]=nomres
+      mcsimp['TOUT_ORDRE' ]='OUI'
+      mcsimp['NOM_CHAM'   ]='SIEF_ELNO_ELGA'
+      mcsimp['PRECISION'  ]=55.E-1
+      mcsimp['TOUT_CMP'   ]='OUI'
+      mcsimp['REPERE'     ]='LOCAL'
+      mcsimp['VECT_Y'     ]=( 0.0 , 0.0 , 1.0 )
+      mcsimp['INTITULE'   ]='AZI_'+NUME+'_I-REP_LOC'
+      mcsimp['OPERATION'  ]='EXTRACTION'
+      mcfact.append( _F(**mcsimp) )
+    __noposi=POST_RELEVE_T(ACTION=mcfact)
+    IMPR_TABLE(TABLE = __noposi, )
+#
+#     ----  Pm, Pm+Pb sur les lignes de depouillement  ----
+#
+    if mc_AFFE_MATERIAU[0]['RCCM']=='OUI':
+      mcfact=[]
+      for i in range(1,NBAZIM+1,PAS_AZIMUT):
+        if i<10 : NUME = '0'+str(i)
+        else    : NUME =     str(i)
+        mcsimp={}
+        mcsimp['PRECISION']=55.E-1
+        mcsimp['GROUP_NO' ]='LI'+str(i)
+        mcfact.append( _F(**mcsimp) )
+      __pmpbsi=POST_RCCM(MATER       = MRCCM,
+                         MAILLAGE    = MAILLAGE,
+                         TYPE_RESU   = 'VALE_MAX',
+                         OPTION      = 'PM_PB',
+                         SEGMENT     = mcfact,
+                         TRANSITOIRE = _F(RESULTAT  =nomres,
+                                          NOM_CHAM  ='SIEF_ELNO_ELGA',
+                                          TOUT_ORDRE='OUI',),
+                         TITRE       = '-- TRAITEMENT DES AZIMUTS INCLINES --',)
+      IMPR_TABLE(TABLE = __pmpbsi, )
+#
+#     ----  champs de temperature,si il a ete calcule, sur les lignes de depouillement  ----
+#
+    if ECHANGE!=None :
+      mcfact=[]
+      for i in range(1,NBAZIM+1,PAS_AZIMUT):
+        if i<10 : NUME = '0'+str(i)
+        else    : NUME =     str(i)
+        mcsimp={}
+        mcsimp['GROUP_NO'   ]='LI'+str(i)
+        mcsimp['RESULTAT'   ]=resuth
+        mcsimp['TOUT_ORDRE' ]='OUI'
+        mcsimp['NOM_CHAM'   ]='TEMP'
+        mcsimp['PRECISION'  ]=55.E-1
+        mcsimp['TOUT_CMP'   ]='OUI'
+        mcsimp['INTITULE'   ]='AZI_'+NUME+'_I'
+        mcsimp['OPERATION'  ]='EXTRACTION'
+        mcfact.append( _F(**mcsimp) )
+      __rthazi=POST_RELEVE_T(ACTION=mcfact)
+      IMPR_TABLE(TABLE    = __rthazi,
+                 NOM_PARA = IMPRT3 )
+#
+#     ----  parametres caracterisant la distribution de temperature,
+#           si elle a ete calculee, dans l epaisseur du ligament  ----
+#
+      mcfact=[]
+      for i in range(1,NBAZIM+1,PAS_AZIMUT):
+        if i<10 : NUME = '0'+str(i)
+        else    : NUME =     str(i)
+        mcsimp={}
+        mcsimp['GROUP_NO'   ]='LI'+str(i)
+        mcsimp['RESULTAT'   ]=resuth
+        mcsimp['TOUT_ORDRE' ]='OUI'
+        mcsimp['NOM_CHAM'   ]='TEMP'
+        mcsimp['PRECISION'  ]=55.E-1
+        mcsimp['TOUT_CMP'   ]='OUI'
+        mcsimp['INTITULE'   ]='AZI_'+NUME+'_I'
+        mcsimp['OPERATION'  ]='MOYENNE'
+        mcfact.append( _F(**mcsimp) )
+      __rmothi=POST_RELEVE_T(ACTION=mcfact)
+      IMPR_TABLE(TABLE = __rmothi, )
+#
+#-----------------------------------------------------------------------
+  elif TYPE_MAILLAGE[:4]=='FISS' :
+#-----------------------------------------------------------------------
+#
+    NOMGRO=[]
+    NOMGRE=[]
+    TABMA8=[]
+    NOMMA =[]
+    if TYPE_MAILLAGE in ('FISS_COUR_DEB','FISS_LONG_DEB','FISS_AXIS_DEB','FISS_COUR_NONDEB') :
+       NBFIS = 1
+       NOMGRO.append(('P_FON1' ,'P_FIS1' ),)
+       NOMGRE.append(('P_FON2' ,'P_FIS2' ),)
+       TABMA8.append('FONDFISS')
+       if TYPE_MAILLAGE in ('FISS_COUR_DEB','FISS_LONG_DEB') : FERME=0
+       else :
+          FERME=1
+          NOMMA.append('MAIL_ORI')
+    elif TYPE_MAILLAGE in ('FISS_LONG_NONDEB','FISS_AXIS_NONDEB') :
+       NBFIS = 2
+       NOMGRO.append(('P_FON1' ,'P_FIS1' ),)
+       NOMGRE.append(('P_FON2' ,'P_FIS2' ),)
+       NOMGRO.append(('PI_FON1','PI_FIS1'),)
+       NOMGRE.append(('PI_FON2','PI_FIS2'),)
+       TABMA8.append('FOND_SUP')
+       TABMA8.append('FOND_INF')
+       if TYPE_MAILLAGE=='FISS_LONG_NONDEB' : FERME=0
+       else :
+          FERME=1
+          NOMMA.append('MA_ORI_S')
+          NOMMA.append('MA_ORI_I')
+#
+    if ECHANGE!=None:
+#
+#     ----  champs de temperature en fond de fissure
+#           si il a ete calcule, cas 1 fond de fissure  ----
+#
+      if NBFIS==1:
+        __rthfis=POST_RELEVE_T(ACTION=_F(GROUP_NO   ='FONDFISS',
+                                         RESULTAT   =resuth,
+                                         TOUT_ORDRE ='OUI',
+                                         NOM_CHAM   ='TEMP',
+                                         PRECISION  =55.E-1,
+                                         TOUT_CMP   ='OUI',
+                                         INTITULE   ='FONDFISS',
+                                         OPERATION  ='EXTRACTION',))
+        IMPR_TABLE(TABLE = __rthfis, )
+#
+#     ----  champs de temperature en fond de fissure
+#           si il a ete calcule, cas 2 fonds de fissure  ----
+#
+      elif NBFIS==2:
+#
+        __rthfis1=POST_RELEVE_T(ACTION=_F(GROUP_NO   ='FOND_SUP',
+                                          RESULTAT   =resuth,
+                                          TOUT_ORDRE ='OUI',
+                                          NOM_CHAM   ='TEMP',
+                                          PRECISION  =55.E-1,
+                                          TOUT_CMP   ='OUI',
+                                          INTITULE   ='FOND_SUP',
+                                          OPERATION  ='EXTRACTION',))
+        IMPR_TABLE(TABLE = __rthfis1, )
+        __rthfis2=POST_RELEVE_T(ACTION=_F(GROUP_NO   ='FOND_INF',
+                                          RESULTAT   =resuth,
+                                          TOUT_ORDRE ='OUI',
+                                          NOM_CHAM   ='TEMP',
+                                          PRECISION  =55.E-1,
+                                          TOUT_CMP   ='OUI',
+                                          INTITULE   ='FOND_INF',
+                                          OPERATION  ='EXTRACTION',))
+        IMPR_TABLE(TABLE = __rthfis2, )
+#
+#        boucle sur le nombre de fond de fissure
+#
+    fond3d = [None]*2
+    for j in range(NBFIS):
+      if FOND_FISS_1!=None : self.DeclareOut('fond3d_0',FOND_FISS_1)
+      if FOND_FISS_2!=None : self.DeclareOut('fond3d_1',FOND_FISS_2)
+#
+#          --- commande DEFI_FOND_FISS ---
+#
+      motscles={}
+      if not FERME:
+         motscles['FOND_FISS']=_F(GROUP_MA     =TABMA8[j],
+                                  GROUP_NO_ORIG=NOMGRO[j][0],
+                                  GROUP_NO_EXTR=NOMGRE[j][0],)
+         motscles['VECT_GRNO_ORIG']=NOMGRO[j]
+         motscles['VECT_GRNO_EXTR']=NOMGRE[j]
+      else:
+         if TYPE_MAILLAGE.find('AXIS')!=-1  : grnoorig=NOMGRE[j][0]
+#                  si AXIS, P_FON1 est remplace par P_FON2 pour
+#                  fermer le fond de fissure
+         else                               : grnoorig=NOMGRO[j][0]
+         motscles['FOND_FERME']=_F(GROUP_MA     =TABMA8[j],
+                                   GROUP_NO_ORIG=grnoorig,
+                                   GROUP_MA_ORIG=NOMMA[j],)
+      fond3d[j]=DEFI_FOND_FISS( MAILLAGE  = MAILLAGE,
+                                LEVRE_SUP = _F(GROUP_MA='LEVRCORP',),
+                                LEVRE_INF = _F(GROUP_MA='LEVRTUBU',),**motscles)
+      if THETA_3D!=None:
+        if THETA_3D.__class__.__name__!='MCList' : THETA_3D=[THETA_3D,]
+        for tht3d in THETA_3D : 
+#
+#          --- commande CALC_THETA ---
+#
+          __theta = CALC_THETA( MODELE    = modele,
+                                FOND_FISS = fond3d[j],
+                                THETA_3D  = _F( TOUT    = 'OUI',
+                                                MODULE  =  1.0 ,
+                                                R_INF   = tht3d['R_INF'],
+                                                R_SUP   = tht3d['R_SUP'], ) )
+#
+#          --- commande CALC_G_THETA_T ---
+#
+          montit = 'G_THETA AVEC R_INF = '+str(tht3d['R_INF'])+' ET R_SUP = '+str(tht3d['R_SUP'])
+          motscles={}
+          charge  =[]
+          if (PRES_REP['PRES_LEVRE']=='OUI') and (TYPE_MAILLAGE[-4:]=='_DEB') : charge.append(__chpres)
+          if ECHANGE  !=None                                                  : charge.append(chmeth  )
+          if COMP_ELAS!=None:  motscles['COMP_ELAS']=  _F(TOUT     = 'OUI',
+                                                          RELATION = COMP_ELAS['RELATION'],)
+          if COMP_INCR!=None:  motscles['COMP_INCR']=  _F(RELATION = COMP_INCR['RELATION'],)
+          if charge!=[]:       motscles['CHARGE'   ]= charge
+          __gtheta = CALC_G_THETA_T( MODELE     = modele,
+                                     CHAM_MATER = affmat,
+                                     THETA      = __theta,
+                                     RESULTAT   = nomres,
+                                     TOUT_ORDRE = 'OUI',
+                                     TITRE      = montit,**motscles)
+          IMPR_TABLE(TABLE = __gtheta, )
+#
+#           recherche du g max
+#
+          if OPTION=='CALC_G_MAX' :
+            if BORNES!=None:
+              if BORNES.__class__.__name__!='MCList' : BORNES=[BORNES,]
+              mcfact=[]
+              for born in BORNES :
+                mcfact.append(_F( NUME_ORDRE = born['NUME_ORDRE'] ,
+                                  VALE_MIN   = born['VALE_MIN'  ] ,
+                                  VALE_MAX   = born['VALE_MAX'  ]   ) )
+              __gbil = CALC_G_THETA_T( MODELE     = modele,
+                                       CHAM_MATER = affmat,
+                                       THETA      = __theta,
+                                       RESULTAT   = nomres,
+                                       TOUT_ORDRE = 'OUI',
+                                       COMP_ELAS  =  _F(TOUT     = 'OUI',
+                                                        RELATION = COMP_ELAS['RELATION'],),
+                                       TITRE    = montit,
+                                       OPTION   = OPTION,
+                                       BORNES   = mcfact,)
+              IMPR_TABLE(TABLE = __gbil, )
+#
+#          --- commande CALC_G_LOCAL_T ---
+#
+          montit = 'G_LOCAL AVEC R_INF = '+str(tht3d['R_INF'])+' ET R_SUP = '+str(tht3d['R_SUP'])
+          motscles={}
+          charge  =[]
+          if (PRES_REP['PRES_LEVRE']=='OUI') and (TYPE_MAILLAGE[-4:]=='_DEB') : charge.append(__chpres)
+          if ECHANGE  !=None                                                  : charge.append(chmeth  )
+          if COMP_ELAS!=None:  motscles['COMP_ELAS'    ]=  _F(TOUT     = 'OUI',
+                                                              RELATION = COMP_ELAS['RELATION'],)
+          if charge!=[]:       motscles['CHARGE'       ]= charge
+          if FERME:
+                               motscles['LISSAGE_THETA']= 'LAGRANGE'
+                               motscles['LISSAGE_G'    ]= 'LAGRANGE'
+          __glocal = CALC_G_LOCAL_T( MODELE     = modele,
+                                     CHAM_MATER = affmat,
+                                     FOND_FISS  = fond3d[j],
+                                     RESULTAT   = nomres,
+                                     TOUT_ORDRE = 'OUI',
+                                     R_INF      = tht3d['R_INF'],
+                                     R_SUP      = tht3d['R_SUP'],
+                                     TITRE      = montit,**motscles)
+#
+#          recherche du g max local
+#
+          if OPTION=='CALC_G_MAX_LOCAL' :
+            if BORNES!=None:
+              if BORNES.__class__.__name__!='MCList' : BORNES=[BORNES,]
+              motscles={}
+              mcfact=[]
+              if FERME:
+                        motscles['LISSAGE_THETA']= 'LAGRANGE'
+                        motscles['LISSAGE_G'    ]= 'LAGRANGE'
+              for born in BORNES :
+                mcfact.append(_F( NUME_ORDRE = born['NUME_ORDRE'] ,
+                                  VALE_MIN   = born['VALE_MIN'  ] ,
+                                  VALE_MAX   = born['VALE_MAX'  ]   ) )
+              motscles['BORNES']=mcfact
+              __glbil = CALC_G_LOCAL_T( MODELE     = modele,
+                                        CHAM_MATER = affmat,
+                                        FOND_FISS  = fond3d[j],
+                                        RESULTAT   = nomres,
+                                        TOUT_ORDRE = 'OUI',
+                                        COMP_ELAS  =  _F(TOUT     = 'OUI',
+                                                         RELATION = COMP_ELAS['RELATION'],),
+                                        TITRE      = montit,
+                                        OPTION     = 'CALC_G_MAX',
+                                        R_INF      = tht3d['R_INF'],
+                                        R_SUP      = tht3d['R_SUP'],**motscles)
+              IMPR_TABLE(TABLE = __glbil, )
+#
+#     --- commande IMPR_RESU  ---
+#
+  if IMPRESSION!=None:
+    mcfresu =[]
+    motscles={}
+    if IMPRESSION['FORMAT'] in ('IDEAS','CASTEM') :
+      ncham   =[]
+      if IMPRESSION['NOM_CHAM']!=None :
+         if type(IMPRESSION['NOM_CHAM']) in (types.TupleType,types.ListType) : ncham= IMPRESSION['NOM_CHAM']
+         else                                                                : ncham=[IMPRESSION['NOM_CHAM'],]
+      if    len(ncham)==3       : motscles['NOM_CHAM'  ]=('DEPL','EQUI_ELNO_SIGM')
+      elif (len(ncham)==1) and (ncham[0][:4]!='TEMP')  :
+                                  motscles['NOM_CHAM'  ]= ncham[0]['NOM_CHAM']
+      elif (len(ncham)==2) and (ncham[0][:4]!='TEMP') and (ncham[1][:4]!='TEMP')  :
+                                  motscles['NOM_CHAM'  ]=(ncham[0]['NOM_CHAM'],ncham[1]['NOM_CHAM'])
+      elif (len(ncham)==2) and (ncham[0][:4]=='TEMP')  :
+                                  motscles['NOM_CHAM'  ]= ncham[1]['NOM_CHAM']
+      elif (len(ncham)==2) and (ncham[1][:4]=='TEMP') :
+                                  motscles['NOM_CHAM'  ]= ncham[0]['NOM_CHAM']
+      if   IMPRESSION['TOUT_ORDRE']!=None :
+                                  motscles['TOUT_ORDRE']= IMPRESSION['TOUT_ORDRE']
+      elif IMPRESSION['NUME_ORDRE']!=None :
+                                  motscles['NUME_ORDRE']= IMPRESSION['NUME_ORDRE']
+      elif IMPRESSION['INST']!=None :
+                                  motscles['INST'      ]= IMPRESSION['INST']
+    if IMPRESSION['FORMAT']=='IDEAS' :
+                                  motscles['VERSION'   ]= IMPRESSION['VERSION']
+    if IMPRESSION['FORMAT']=='CASTEM' :
+                                  motscles['NIVE_GIBI' ]= IMPRESSION['NIVE_GIBI']
+    mcfresu.append(_F(MAILLAGE=MAILLAGE,RESULTAT=nomres,FORMAT=IMPRESSION['FORMAT'],**motscles))
+    if ECHANGE!=None:
+      motscles={}
+      if IMPRESSION['FORMAT'] in ('IDEAS','CASTEM') :
+        if    len(ncham)==3       : motscles['NOM_CHAM'  ]=('TEMP',)
+        elif (len(ncham)==1) and (ncham[0][:4]=='TEMP') :
+                                    motscles['NOM_CHAM'  ]= ncham[0]['NOM_CHAM']
+        elif (len(ncham)==2) and (ncham[0][:4]=='TEMP') :
+                                    motscles['NOM_CHAM'  ]= ncham[0]['NOM_CHAM']
+        elif (len(ncham)==2) and (ncham[1][:4]=='TEMP') :
+                                    motscles['NOM_CHAM'  ]= ncham[1]['NOM_CHAM']
+        if   IMPRESSION['TOUT_ORDRE']!=None :
+                                    motscles['TOUT_ORDRE']= IMPRESSION['TOUT_ORDRE']
+        elif IMPRESSION['NUME_ORDRE']!=None :
+                                    motscles['NUME_ORDRE']= IMPRESSION['NUME_ORDRE']
+        elif IMPRESSION['INST']!=None :
+                                    motscles['INST'      ]= IMPRESSION['INST']
+      if IMPRESSION['FORMAT']=='IDEAS' :
+                                    motscles['VERSION'   ]= IMPRESSION['VERSION']
+      if IMPRESSION['FORMAT']=='CASTEM' :
+                                    motscles['NIVE_GIBI' ]= IMPRESSION['NIVE_GIBI']
+      mcfresu.append(_F(RESULTAT=nomres,FORMAT=IMPRESSION['FORMAT'],**motscles))
+    IMPR_RESU( MODELE = modele,
+               RESU   = mcfresu )
+#
+  return ier
index 4e232f751e30b302569fac27fa6c2b7ec0e146a2..e517132f02cd9bb5063ffc811150edd2d246d1a7 100644 (file)
@@ -1,4 +1,4 @@
-#@ MODIF macr_aspic_mail_ops Macro  DATE 19/01/2004   AUTEUR DURAND C.DURAND 
+#@ MODIF macr_aspic_mail_ops Macro  DATE 30/01/2004   AUTEUR CIBHHLV L.VIVAN 
 #            CONFIGURATION MANAGEMENT OF EDF VERSION
 # ======================================================================
 # COPYRIGHT (C) 1991 - 2004  EDF R&D                  WWW.CODE-ASTER.ORG
@@ -497,6 +497,17 @@ def macr_aspic_mail_ops(self,EXEC_MAILLAGE,TYPE_ELEM,RAFF_MAIL,TUBULURE,
   __MAPROV=DEFI_GROUP(reuse   =__MAPROV,
                       MAILLAGE=__MAPROV,
                       **motscles )
+#
+  if not SAIN :
+     motscles={}
+     motscles['CREA_GROUP_NO']=[]
+     if not (TFISS=='NON_DEB')  :
+        motscles['CREA_GROUP_NO'].append(_F(GROUP_MA = 'FONDFISS',))
+     if (TFISS=='NON_DEB') and (FISS_SOUDURE['TYPE']=='LONGUE') :
+        motscles['CREA_GROUP_NO'].append(_F(GROUP_MA = ('FOND_SUP','FOND_INF',),))
+     __MAPROV=DEFI_GROUP(reuse   =__MAPROV,
+                         MAILLAGE=__MAPROV,
+                         **motscles )
 #
   __MAPROV=MODI_MAILLAGE(reuse   =__MAPROV,
                          MAILLAGE=__MAPROV,
index 6f325de94d1f878bdd477daad58a93be1070cda2..4a10f1aea4357fb4941fd9e4d69ab94f770dcdef 100755 (executable)
@@ -20,7 +20,7 @@ import Accas
 from Accas import *
 from Accas import _F
 import string
-import Numeric
+#import Numeric
 
 import ops
 
@@ -31,7 +31,7 @@ except:
 
 #
 __version__="$Name:  $"
-__Id__="$Id: cata_aster_v6.py,v 1.12 2001/01/16 15:55:05 iliade Exp $"
+__Id__="$Id: cata_STA7.py,v 1.5.2.1 2004/03/01 11:00:25 eficas Exp $"
 #
 JdC = JDC_CATA(code='ASTER',
                execmodul=None,
@@ -1395,41 +1395,41 @@ AFFE_CHAR_CINE_F=OPER(nom="AFFE_CHAR_CINE_F",op= 108,sd_prod=affe_char_cine_f_pr
          INFO            =SIMP(statut='f',typ='I',defaut= 1,into=( 1 , 2) ),
 )  ;
 
-#& MODIF COMMANDE  DATE 18/11/2003   AUTEUR CIBHHLV L.VIVAN 
+#& MODIF COMMANDE  DATE 04/02/2004   AUTEUR VABHHTS J.PELLET 
 #            CONFIGURATION MANAGEMENT OF EDF VERSION
 # ======================================================================
 # COPYRIGHT (C) 1991 - 2001  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.                                 
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
 #
-# 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 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.
 #
-# 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.      
+# 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.
 # ======================================================================
-# RESPONSABLE G8BHHXD X.DESROCHES 
+# RESPONSABLE G8BHHXD X.DESROCHES
 
 AFFE_CHAR_MECA=OPER(nom="AFFE_CHAR_MECA",op=   7,sd_prod=char_meca
                     ,fr="Affectation de charges et conditions aux limites mécaniques constantes",
                      docu="U4.44.01-g",reentrant='n',
             UIinfo={"groupes":("Modélisation",)},
-         regles=(AU_MOINS_UN('DDL_IMPO','FACE_IMPO','LIAISON_DDL','FORCE_NODALE',  
-                             'FORCE_FACE','FORCE_ARETE','FORCE_CONTOUR','FORCE_INTERNE',       
-                             'PRES_REP','FORCE_POUTRE','FORCE_COQUE','LIAISON_OBLIQUE',        
-                             'FORCE_ELEC','INTE_ELEC','PESANTEUR','ROTATION','IMPE_FACE',      
-                             'VITE_FACE','TEMP_CALCULEE','RELA_CINE_BP','EPSI_INIT','CONTACT', 
-                             'LIAISON_GROUP','LIAISON_UNIF','FLUX_THM_REP',  
-                             'LIAISON_SOLIDE','LIAISON_ELEM','ONDE_FLUI','PRES_CALCULEE',      
-                             'EPSA_CALCULEE','LIAISON_CHAMNO','VECT_ASSE','LIAISON_COQUE',     
-                             'LIAISON_MAIL','FORCE_TUYAU','SECH_CALCULEE','HYDR_CALCULEE',     
+         regles=(AU_MOINS_UN('DDL_IMPO','FACE_IMPO','LIAISON_DDL','FORCE_NODALE',
+                             'FORCE_FACE','FORCE_ARETE','FORCE_CONTOUR','FORCE_INTERNE',
+                             'PRES_REP','FORCE_POUTRE','FORCE_COQUE','LIAISON_OBLIQUE',
+                             'FORCE_ELEC','INTE_ELEC','PESANTEUR','ROTATION','IMPE_FACE',
+                             'VITE_FACE','TEMP_CALCULEE','RELA_CINE_BP','EPSI_INIT','CONTACT',
+                             'LIAISON_GROUP','LIAISON_UNIF','FLUX_THM_REP',
+                             'LIAISON_SOLIDE','LIAISON_ELEM','ONDE_FLUI','PRES_CALCULEE',
+                             'EPSA_CALCULEE','LIAISON_CHAMNO','VECT_ASSE','LIAISON_COQUE',
+                             'LIAISON_MAIL','FORCE_TUYAU','SECH_CALCULEE','HYDR_CALCULEE',
                              'EFFE_FOND','EVOL_CHAR','ARLEQUIN','DDL_POUTRE','GRAPPE_FLUIDE'),
-                 EXCLUS('PRES_CALCULEE','EVOL_CHAR'),),            
+                 EXCLUS('PRES_CALCULEE','EVOL_CHAR'),),
          VERI_DDL        =SIMP(statut='f',typ='TXM',defaut="OUI",into=("OUI","NON") ),
          VERI_NORM       =SIMP(statut='f',typ='TXM',defaut="OUI",into=("OUI","NON") ),
          MODELE          =SIMP(statut='o',typ=(modele) ),
@@ -1446,11 +1446,11 @@ AFFE_CHAR_MECA=OPER(nom="AFFE_CHAR_MECA",op=   7,sd_prod=char_meca
                                typ=evol_char ),
          PRES_CALCULEE   =SIMP(statut='f',fr="Champ de pression issu d'un autre calcul",
                                typ=evol_char ),
-         
+
          PESANTEUR       =SIMP(statut='f',typ='R',fr="Champ de pesanteur",min=4,max=4),
          ROTATION        =SIMP(statut='f',typ='R',fr="Champ de rotation", min=4,max=4),
          b_rotation      =BLOC ( condition = "ROTATION != None",
-           CENTRE          =SIMP(statut='f',typ='R',defaut=(0.,0.,0.),max=3),),     
+           CENTRE          =SIMP(statut='f',typ='R',defaut=(0.,0.,0.),max=3),),
 
          DDL_IMPO        =FACT(statut='f',max='**',
              regles=(AU_MOINS_UN('TOUT','GROUP_MA','MAILLE','GROUP_NO','NOEUD'),
@@ -1536,7 +1536,7 @@ AFFE_CHAR_MECA=OPER(nom="AFFE_CHAR_MECA",op=   7,sd_prod=char_meca
                             ),
 
 
-         
+
            FACE_IMPO       =FACT(statut='f',max='**',
              regles=(UN_PARMI('GROUP_MA','MAILLE',),
                      AU_MOINS_UN('DX','DY','DZ','DRX','DRY','DRZ','GRX','PRES','PHI',
@@ -1553,7 +1553,7 @@ AFFE_CHAR_MECA=OPER(nom="AFFE_CHAR_MECA",op=   7,sd_prod=char_meca
                      EXCLUS('DTAN','DRX'),
                      EXCLUS('DTAN','DRY'),
                      EXCLUS('DTAN','DRZ'),),
-#  rajout d'un mot clé REPERE :/ LOCAL /GLOBAL                     
+#  rajout d'un mot clé REPERE :/ LOCAL /GLOBAL
              GROUP_MA        =SIMP(statut='f',typ=grma,validators=NoRepeat(),max='**'),
              MAILLE          =SIMP(statut='f',typ=ma  ,validators=NoRepeat(),max='**'),
              DX              =SIMP(statut='f',typ='R' ),
@@ -1595,14 +1595,14 @@ AFFE_CHAR_MECA=OPER(nom="AFFE_CHAR_MECA",op=   7,sd_prod=char_meca
              DRX             =SIMP(statut='f',typ='R' ),
              DRY             =SIMP(statut='f',typ='R' ),
              DRZ             =SIMP(statut='f',typ='R' ),
-           ), 
+           ),
+
            LIAISON_GROUP   =FACT(statut='f',max='**',
                                  fr="Définir des relations linéaires entre certains ddls de couples de noeuds",
-             regles=(UN_PARMI('GROUP_MA_1','MAILLE_1','GROUP_NO_1','NOEUD_1'),        
+             regles=(UN_PARMI('GROUP_MA_1','MAILLE_1','GROUP_NO_1','NOEUD_1'),
                      UN_PARMI('GROUP_MA_2','MAILLE_2','GROUP_NO_2','NOEUD_2'),
                      EXCLUS('GROUP_MA_1','GROUP_NO_2'),
-                     EXCLUS('GROUP_MA_1','NOEUD_2'),      
+                     EXCLUS('GROUP_MA_1','NOEUD_2'),
                      EXCLUS('GROUP_NO_1','GROUP_MA_2'),
                      EXCLUS('GROUP_NO_1','MAILLE_2'),
                      EXCLUS('MAILLE_1','GROUP_NO_2'),
@@ -1610,7 +1610,7 @@ AFFE_CHAR_MECA=OPER(nom="AFFE_CHAR_MECA",op=   7,sd_prod=char_meca
                      EXCLUS('NOEUD_1','GROUP_MA_2'),
                      EXCLUS('NOEUD_1','MAILLE_2'),
                      EXCLUS('SANS_NOEUD','SANS_GROUP_NO'),),
-             
+
                GROUP_MA_1      =SIMP(statut='f',typ=grma,validators=NoRepeat(),max='**'),
                MAILLE_1        =SIMP(statut='f',typ=ma  ,validators=NoRepeat(),max='**'),
                GROUP_MA_2      =SIMP(statut='f',typ=grma,validators=NoRepeat(),max='**'),
@@ -1619,7 +1619,7 @@ AFFE_CHAR_MECA=OPER(nom="AFFE_CHAR_MECA",op=   7,sd_prod=char_meca
                NOEUD_1         =SIMP(statut='f',typ=no  ,validators=NoRepeat(),max='**'),
                GROUP_NO_2      =SIMP(statut='f',typ=no  ,validators=NoRepeat(),max='**'),
                NOEUD_2         =SIMP(statut='f',typ=no  ,validators=NoRepeat(),max='**'),
-             
+
              SANS_NOEUD      =SIMP(statut='f',typ=no   ,validators=NoRepeat(),max='**'),
              SANS_GROUP_NO   =SIMP(statut='f',typ=grno ,validators=NoRepeat(),max='**'),
              DDL_1           =SIMP(statut='o',typ='TXM',max='**'),
@@ -1638,11 +1638,11 @@ AFFE_CHAR_MECA=OPER(nom="AFFE_CHAR_MECA",op=   7,sd_prod=char_meca
                      AU_MOINS_UN('GROUP_MA_ESCL','MAILLE_ESCL','GROUP_NO_ESCL','NOEUD_ESCL'),
                      PRESENT_PRESENT('DDL_MAIT','DDL_ESCL'),),
               GROUP_MA_MAIT   =SIMP(statut='f',typ=grma,validators=NoRepeat(),max='**'),
-              MAILLE_MAIT     =SIMP(statut='f',typ=ma  ,validators=NoRepeat(),max='**'), 
+              MAILLE_MAIT     =SIMP(statut='f',typ=ma  ,validators=NoRepeat(),max='**'),
               GROUP_MA_ESCL   =SIMP(statut='f',typ=grma,validators=NoRepeat(),max='**'),
-              MAILLE_ESCL     =SIMP(statut='f',typ=ma  ,validators=NoRepeat(),max='**'), 
+              MAILLE_ESCL     =SIMP(statut='f',typ=ma  ,validators=NoRepeat(),max='**'),
               GROUP_NO_ESCL   =SIMP(statut='f',typ=grno,validators=NoRepeat(),max='**'),
-              NOEUD_ESCL      =SIMP(statut='f',typ=no  ,validators=NoRepeat(),max='**'), 
+              NOEUD_ESCL      =SIMP(statut='f',typ=no  ,validators=NoRepeat(),max='**'),
               TRAN            =SIMP(statut='f',typ='R',max=3 ),
               ANGL_NAUT       =SIMP(statut='f',typ='R',max=3 ),
               CENTRE          =SIMP(statut='f',typ='R',max=3 ),
@@ -1650,7 +1650,7 @@ AFFE_CHAR_MECA=OPER(nom="AFFE_CHAR_MECA",op=   7,sd_prod=char_meca
               DDL_ESCL        =SIMP(statut='f',typ='TXM',into=("DNOR",) ),
          ),
 
-         
+
            LIAISON_SOLIDE  =FACT(statut='f',fr="Modéliser une partie indéformable d'une structure",max='**',
              regles=(UN_PARMI('GROUP_NO','NOEUD','GROUP_MA','MAILLE'),),
              GROUP_NO        =SIMP(statut='f',typ=grno,validators=NoRepeat(),max='**'),
@@ -1658,7 +1658,7 @@ AFFE_CHAR_MECA=OPER(nom="AFFE_CHAR_MECA",op=   7,sd_prod=char_meca
              GROUP_MA        =SIMP(statut='f',typ=grma,validators=NoRepeat(),max='**'),
              MAILLE          =SIMP(statut='f',typ=ma  ,validators=NoRepeat(),max='**'),
              NUME_LAGR       =SIMP(statut='f',typ='TXM',defaut="NORMAL",into=("NORMAL","APRES") ),
-           ), 
+           ),
 
            LIAISON_ELEM    =FACT(statut='f',fr="Raccorder une poutre à une partie massive 3D ou une coque",max='**',
              regles=(UN_PARMI('GROUP_MA_1','MAILLE_1'),
@@ -1682,7 +1682,7 @@ AFFE_CHAR_MECA=OPER(nom="AFFE_CHAR_MECA",op=   7,sd_prod=char_meca
              GROUP_MA        =SIMP(statut='f',typ=grma,validators=NoRepeat(),max='**'),
              MAILLE          =SIMP(statut='f',typ=ma  ,validators=NoRepeat(),max='**'),
              DDL             =SIMP(statut='o',typ='TXM',max='**'),
-           ), 
+           ),
 
          LIAISON_CHAMNO  =FACT(statut='f',max='**',
                                fr="définir une relation linéaire entre tous les ddls d'un concept cham_no",
@@ -1690,7 +1690,7 @@ AFFE_CHAR_MECA=OPER(nom="AFFE_CHAR_MECA",op=   7,sd_prod=char_meca
              CHAM_NO         =SIMP(statut='o',typ=cham_no), #CO()
              COEF_IMPO       =SIMP(statut='o',typ='R' ),
              NUME_LAGR       =SIMP(statut='f',typ='TXM',defaut="NORMAL",into=("NORMAL","APRES") ),
-           ), 
+           ),
 
          VECT_ASSE       =SIMP(statut='f',typ=cham_no_depl_r ),
 
@@ -1699,22 +1699,22 @@ AFFE_CHAR_MECA=OPER(nom="AFFE_CHAR_MECA",op=   7,sd_prod=char_meca
            APPARIEMENT     =SIMP(statut='f',typ='TXM',defaut="MAIT_ESCL",
                                  into=("NON","NODAL","NODAL_SYME","MAIT_ESCL","MAIT_ESCL_SYME")),
            RECHERCHE       =SIMP(statut='f',typ='TXM',defaut="NOEUD_VOISIN",into=("NOEUD_BOUCLE","NOEUD_VOISIN")),
-           LISSAGE         =SIMP(statut='f',typ='TXM',defaut="NON",into=("OUI","NON")),                 
+           LISSAGE         =SIMP(statut='f',typ='TXM',defaut="NON",into=("OUI","NON")),
            NORMALE         =SIMP(statut='f',typ='TXM',defaut="MAIT",into=("MAIT","MAIT_ESCL")),
-           METHODE         =SIMP(statut='f',typ='TXM',defaut="CONTRAINTE",    
-                                 into=("CONTRAINTE","LAGRANGIEN","PENALISATION","CONTINUE") ),           
+           METHODE         =SIMP(statut='f',typ='TXM',defaut="CONTRAINTE",
+                                 into=("CONTRAINTE","LAGRANGIEN","PENALISATION","CONTINUE") ),
            PROJECTION      =SIMP(statut='f',typ='TXM',defaut="LINEAIRE",into=("LINEAIRE","QUADRATIQUE") ),
            GROUP_MA_MAIT   =SIMP(statut='f',typ=grma,validators=NoRepeat(),max='**'),
            MAILLE_MAIT     =SIMP(statut='f',typ=ma  ,validators=NoRepeat(),max='**'),
            GROUP_MA_ESCL   =SIMP(statut='f',typ=grma,validators=NoRepeat(),max='**'),
            MAILLE_ESCL     =SIMP(statut='f',typ=ma  ,validators=NoRepeat(),max='**'),
-           TOLE_PROJ       =SIMP(statut='f',typ='R',defaut=0.25),             
+           TOLE_PROJ       =SIMP(statut='f',typ='R',defaut=0.25),
            b_active        =BLOC(condition = "METHODE == 'CONTRAINTE' ",
                                  fr="Paramètres de la méthode des contraintes actives (contact uniquement)",
                 regles=(EXCLUS('DIST_2','COEF_IMPO'),
                         EXCLUS('DIST_1','COEF_IMPO'),),
                 NOM_CHAM        =SIMP(statut='f',typ='TXM',defaut="DEPL",into=("DEPL","PRES","TEMP")),
-                FROTTEMENT      =SIMP(statut='f',typ='TXM',defaut="SANS",into=("SANS",) ), 
+                FROTTEMENT      =SIMP(statut='f',typ='TXM',defaut="SANS",into=("SANS",) ),
                 NB_RESOL        =SIMP(statut='f',typ='I', defaut=10 ),
                 REAC_GEOM       =SIMP(statut='f',typ='TXM',defaut="AUTOMATIQUE",into=("AUTOMATIQUE","CONTROLE","SANS")),
                 b_reac_geom     =BLOC(condition = "REAC_GEOM == 'CONTROLE' ",
@@ -1733,7 +1733,7 @@ AFFE_CHAR_MECA=OPER(nom="AFFE_CHAR_MECA",op=   7,sd_prod=char_meca
                                  fr="Paramètres de la méthode Lagrangienne (contact avec ou sans frottement)",
                 NOM_CHAM        =SIMP(statut='f',typ='TXM',defaut="DEPL",into=("DEPL",)),
                 FROTTEMENT      =SIMP(statut='f',typ='TXM',defaut="SANS",into=("SANS","COULOMB",) ),
-                NB_RESOL        =SIMP(statut='f',typ='I', defaut=10 ), 
+                NB_RESOL        =SIMP(statut='f',typ='I', defaut=10 ),
                 REAC_GEOM       =SIMP(statut='f',typ='TXM',defaut="AUTOMATIQUE",into=("AUTOMATIQUE","CONTROLE","SANS")),
                 b_reac_geom     =BLOC(condition = "REAC_GEOM == 'CONTROLE' ",
                                  fr="Paramètre de la réactualisation géométrique",
@@ -1746,13 +1746,13 @@ AFFE_CHAR_MECA=OPER(nom="AFFE_CHAR_MECA",op=   7,sd_prod=char_meca
                 STOP_SINGULIER  =SIMP(statut='f',typ='TXM',defaut="OUI",into=("OUI","NON")),
                 b_frottement    =BLOC(condition = "FROTTEMENT == 'COULOMB' ",fr="Paramètres du frottement de Coulomb",
                      COULOMB         =SIMP(statut='o',typ='R',),
-                     COEF_MATR_FROT  =SIMP(statut='f',typ='R',defaut=0.E+0),  
+                     COEF_MATR_FROT  =SIMP(statut='f',typ='R',defaut=0.E+0),
                      ),),
            b_penalisation       =BLOC(condition = "METHODE == 'PENALISATION' ",
                                       fr="Paramètres de la méthode pénalisée (contact avec ou sans frottement)",
                 NOM_CHAM        =SIMP(statut='f',typ='TXM',defaut="DEPL",into=("DEPL",)),
-                E_N             =SIMP(statut='f',typ='R'), 
-                FROTTEMENT      =SIMP(statut='f',typ='TXM',defaut="SANS",into=("SANS","COULOMB",) ), 
+                E_N             =SIMP(statut='f',typ='R'),
+                FROTTEMENT      =SIMP(statut='f',typ='TXM',defaut="SANS",into=("SANS","COULOMB",) ),
                 NB_RESOL        =SIMP(statut='f',typ='I', defaut=10 ),
                 REAC_GEOM       =SIMP(statut='f',typ='TXM',defaut="AUTOMATIQUE",into=("AUTOMATIQUE","CONTROLE","SANS")),
                 b_reac_geom     =BLOC(condition = "REAC_GEOM == 'CONTROLE' ",
@@ -1768,12 +1768,12 @@ AFFE_CHAR_MECA=OPER(nom="AFFE_CHAR_MECA",op=   7,sd_prod=char_meca
                      COULOMB         =SIMP(statut='o',typ='R',),
                      E_T             =SIMP(statut='f',typ='R',
                                            fr="Active la pénalisation sur le frottement et définit le coefficient de pénalisation"),
-                     COEF_MATR_FROT  =SIMP(statut='f',typ='R',defaut=0.E+0),  
+                     COEF_MATR_FROT  =SIMP(statut='f',typ='R',defaut=0.E+0),
                      ),),
            b_continue      =BLOC(condition = "METHODE == 'CONTINUE' ",
                                  fr="Paramètres de la méthode continue (contact avec ou sans frottement)",
                 NOM_CHAM        =SIMP(statut='f',typ='TXM',defaut="DEPL",into=("DEPL",)),
-                FROTTEMENT      =SIMP(statut='f',typ='TXM',defaut="SANS",into=("SANS","COULOMB",) ), 
+                FROTTEMENT      =SIMP(statut='f',typ='TXM',defaut="SANS",into=("SANS","COULOMB",) ),
                 INTEGRATION     =SIMP(statut='f',typ='TXM',defaut="NOEUD",into=("GAUSS","NOEUD","SIMPSON","SIMPSON1","SIMPSON2")),
                 COEF_REGU_CONT  =SIMP(statut='f',typ='R',defaut=100.E+0),
                 MODL_AXIS       =SIMP(statut='o',typ='TXM',into=("OUI","NON")),
@@ -1785,8 +1785,8 @@ AFFE_CHAR_MECA=OPER(nom="AFFE_CHAR_MECA",op=   7,sd_prod=char_meca
                      ITER_FROT_MAXI  =SIMP(statut='f',typ='I',defaut=2),
                      COEF_REGU_FROT  =SIMP(statut='f',typ='R',defaut=100.E+0),
                      SEUIL_INIT      =SIMP(statut='f',typ='I',defaut=0),),),
-         ),         
-         
+         ),
+
          FORCE_NODALE    =FACT(statut='f',fr="Imposer des forces nodales en des noeuds",max='**',
            regles=(AU_MOINS_UN('GROUP_NO','NOEUD'),
                    AU_MOINS_UN('FX','FY','FZ','MX','MY','MZ' ),),
@@ -1810,7 +1810,7 @@ AFFE_CHAR_MECA=OPER(nom="AFFE_CHAR_MECA",op=   7,sd_prod=char_meca
              FX              =SIMP(statut='f',typ='R' ),
              FY              =SIMP(statut='f',typ='R' ),
              FZ              =SIMP(statut='f',typ='R' ),
-           ), 
+           ),
 
          FORCE_ARETE     =FACT(statut='f',max='**',
                                fr="Appliquer des forces linéiques à une arete d élément volumique ou de coque",
@@ -1824,8 +1824,8 @@ AFFE_CHAR_MECA=OPER(nom="AFFE_CHAR_MECA",op=   7,sd_prod=char_meca
              MX              =SIMP(statut='f',typ='R' ),
              MY              =SIMP(statut='f',typ='R' ),
              MZ              =SIMP(statut='f',typ='R' ),
-           ), 
-         
+           ),
+
          FORCE_CONTOUR   =FACT(statut='f',max='**',
                                fr="Appliquer des forces linéiques au bord d'un domaine 2D ou AXIS_FOURIER",
              regles=(AU_MOINS_UN('GROUP_MA','MAILLE'),
@@ -1838,7 +1838,7 @@ AFFE_CHAR_MECA=OPER(nom="AFFE_CHAR_MECA",op=   7,sd_prod=char_meca
              MX              =SIMP(statut='f',typ='R' ),
              MY              =SIMP(statut='f',typ='R' ),
              MZ              =SIMP(statut='f',typ='R' ),
-           ), 
+           ),
 
          FORCE_INTERNE   =FACT(statut='f',max='**',
                                fr="Appliquer des forces volumiques (2D ou 3D) à un domaine volumique",
@@ -1851,7 +1851,7 @@ AFFE_CHAR_MECA=OPER(nom="AFFE_CHAR_MECA",op=   7,sd_prod=char_meca
              FX              =SIMP(statut='f',typ='R' ),
              FY              =SIMP(statut='f',typ='R' ),
              FZ              =SIMP(statut='f',typ='R' ),
-           ), 
+           ),
 
          PRES_REP        =FACT(statut='f',max='**',
                                fr="Appliquer une pression à un domaine de milieu continu 2D ou 3D",
@@ -1864,7 +1864,7 @@ AFFE_CHAR_MECA=OPER(nom="AFFE_CHAR_MECA",op=   7,sd_prod=char_meca
              PRES            =SIMP(statut='f',typ='R' ),
              CISA_2D         =SIMP(statut='f',typ='R' ),
            ),
-         
+
          EFFE_FOND       =FACT(statut='f',fr="Imposer un effet de fond",max='**',
            regles=(AU_MOINS_UN('GROUP_MA','MAILLE'),),
            GROUP_MA_INT    =SIMP(statut='o',typ=grma,validators=NoRepeat(),max='**'),
@@ -1872,7 +1872,7 @@ AFFE_CHAR_MECA=OPER(nom="AFFE_CHAR_MECA",op=   7,sd_prod=char_meca
            MAILLE          =SIMP(statut='f',typ=ma  ,validators=NoRepeat(),max='**'),
            PRES            =SIMP(statut='o',typ='R' ),
          ),
-        
+
          EPSI_INIT       =FACT(statut='f',max='**',
                                fr="Appliquer un chargement de déformation initiale à un volume 3D ou 2D",
              regles=(AU_MOINS_UN('TOUT','GROUP_MA','MAILLE'),
@@ -1898,7 +1898,7 @@ AFFE_CHAR_MECA=OPER(nom="AFFE_CHAR_MECA",op=   7,sd_prod=char_meca
              KYY             =SIMP(statut='f',typ='R' ),
              KXY             =SIMP(statut='f',typ='R' ),
            ),
-           
+
          ARLEQUIN        =FACT(statut='f',max='**',
            GROUP_MA_1     =SIMP(statut='o',typ=grma,validators=NoRepeat(),max='**'),
            GROUP_MA_2     =SIMP(statut='o',typ=grma,validators=NoRepeat(),max='**'),
@@ -1908,12 +1908,12 @@ AFFE_CHAR_MECA=OPER(nom="AFFE_CHAR_MECA",op=   7,sd_prod=char_meca
            POIDS_1       =SIMP(statut='f',typ='R'),
            POIDS_2       =SIMP(statut='f',typ='R'),
          ),
-         
+
         FORCE_POUTRE    =FACT(statut='f',fr="Appliquer des forces linéiques sur des poutres",max='**',
              regles=(AU_MOINS_UN('TOUT','GROUP_MA','MAILLE'),
                      PRESENT_ABSENT('TOUT','GROUP_MA','MAILLE'),
                      AU_MOINS_UN('FX','FY','FZ','N','VY','VZ'),
-                     PRESENT_ABSENT('FX','N','VY','VZ'),              
+                     PRESENT_ABSENT('FX','N','VY','VZ'),
                      PRESENT_ABSENT('FY','N','VY','VZ'),
                      PRESENT_ABSENT('FZ','N','VY','VZ'),
                      PRESENT_ABSENT('N','FX','FY','FZ'),
@@ -1923,17 +1923,17 @@ AFFE_CHAR_MECA=OPER(nom="AFFE_CHAR_MECA",op=   7,sd_prod=char_meca
              GROUP_MA        =SIMP(statut='f',typ=grma,validators=NoRepeat(),max='**'),
              MAILLE          =SIMP(statut='f',typ=ma  ,validators=NoRepeat(),max='**'),
              TYPE_CHARGE     =SIMP(statut='f',typ='TXM',defaut="FORCE",into=("VENT","FORCE",) ),
-#  rajour d'un mot clé REPERE :/ LOCAL /GLOBAL              
+#  rajour d'un mot clé REPERE :/ LOCAL /GLOBAL
                FX              =SIMP(statut='f',typ='R' ),
                FY              =SIMP(statut='f',typ='R' ),
                FZ              =SIMP(statut='f',typ='R' ),
-             
+
                N               =SIMP(statut='f',typ='R' ),
                VY              =SIMP(statut='f',typ='R' ),
                VZ              =SIMP(statut='f',typ='R' ),
-              
+
            ),
-         
+
          FORCE_TUYAU     =FACT(statut='f',fr="imposer une pression dans un élément TUYAU",max='**',
              regles=(AU_MOINS_UN('TOUT','GROUP_MA','MAILLE'),
                      PRESENT_ABSENT('TOUT','GROUP_MA','MAILLE'),),
@@ -1942,11 +1942,11 @@ AFFE_CHAR_MECA=OPER(nom="AFFE_CHAR_MECA",op=   7,sd_prod=char_meca
              MAILLE          =SIMP(statut='f',typ=ma  ,validators=NoRepeat(),max='**'),
              PRES            =SIMP(statut='f',typ='R' ),
            ),
-          
+
          FORCE_COQUE     =FACT(statut='f',fr="Appliquer des forces surfaciques sur des coques",max='**',
              regles=(AU_MOINS_UN('TOUT','GROUP_MA','MAILLE'),
                      PRESENT_ABSENT('TOUT','GROUP_MA','MAILLE'),
-                     AU_MOINS_UN('FX','FY','FZ','MX','MY','MZ','PRES','F1','F2','F3','MF1','MF2'),               
+                     AU_MOINS_UN('FX','FY','FZ','MX','MY','MZ','PRES','F1','F2','F3','MF1','MF2'),
                      PRESENT_ABSENT('FX','PRES','F1','F2','F3','MF1','MF2'),
                      PRESENT_ABSENT('FY','PRES','F1','F2','F3','MF1','MF2'),
                      PRESENT_ABSENT('FZ','PRES','F1','F2','F3','MF1','MF2'),
@@ -1959,24 +1959,24 @@ AFFE_CHAR_MECA=OPER(nom="AFFE_CHAR_MECA",op=   7,sd_prod=char_meca
                      PRESENT_ABSENT('MF1','FX','FY','FZ','MX','MY','MZ','PRES'),
                      PRESENT_ABSENT('MF2','FX','FY','FZ','MX','MY','MZ','PRES'),
                      PRESENT_ABSENT('PRES','FX','FY','FZ','MX','MY','MZ','F1','F2','F3','MF1','MF2'),),
-#  rajour d'un mot clé REPERE :/ LOCAL /GLOBAL              
+#  rajour d'un mot clé REPERE :/ LOCAL /GLOBAL
              TOUT            =SIMP(statut='f',typ='TXM',into=("OUI",) ),
              GROUP_MA        =SIMP(statut='f',typ=grma,validators=NoRepeat(),max='**'),
              MAILLE          =SIMP(statut='f',typ=ma  ,validators=NoRepeat(),max='**'),
-             
+
                FX              =SIMP(statut='f',typ='R' ),
                FY              =SIMP(statut='f',typ='R' ),
                FZ              =SIMP(statut='f',typ='R' ),
                MX              =SIMP(statut='f',typ='R' ),
                MY              =SIMP(statut='f',typ='R' ),
                MZ              =SIMP(statut='f',typ='R' ),
-             
+
                F1              =SIMP(statut='f',typ='R' ),
                F2              =SIMP(statut='f',typ='R' ),
                F3              =SIMP(statut='f',typ='R' ),
                MF1             =SIMP(statut='f',typ='R' ),
                MF2             =SIMP(statut='f',typ='R' ),
-              
+
              PRES            =SIMP(statut='f',typ='R' ),
              PLAN            =SIMP(statut='f',typ='TXM',defaut="MAIL",into=("SUP","INF","MOY","MAIL",) ),
            ),
@@ -2060,42 +2060,40 @@ AFFE_CHAR_MECA=OPER(nom="AFFE_CHAR_MECA",op=   7,sd_prod=char_meca
            SIGM_BPEL       =SIMP(statut='f',typ='TXM',defaut="NON",into=("OUI","NON") ),
            RELA_CINE       =SIMP(statut='f',typ='TXM',defaut="OUI",into=("OUI","NON") ),
          ),
-           
+
          FORCE_ELEC      =FACT(statut='f',max='**',
                                fr="Force de Laplace due à la présence d'un conducteur rectiligne secondaire non maillé",
              regles=(AU_MOINS_UN('TOUT','GROUP_MA','MAILLE'),
-                     PRESENT_ABSENT('TOUT','GROUP_MA','MAILLE'),
-                     AU_MOINS_UN('FX','FY','FZ','POSITION'),
-                     EXCLUS('FX','POSITION'),
-                     EXCLUS('FY','POSITION'),   
-                     EXCLUS('FZ','POSITION'),),
-#  trop de regles : les blocs conditionnels permettent d en suprimer              
+                     PRESENT_ABSENT('TOUT','GROUP_MA','MAILLE'),),
+
              TOUT            =SIMP(statut='f',typ='TXM',into=("OUI",) ),
              GROUP_MA        =SIMP(statut='f',typ=grma,validators=NoRepeat(),max='**'),
              MAILLE          =SIMP(statut='f',typ=ma  ,validators=NoRepeat(),max='**'),
-              
-             FX              =SIMP(statut='f',typ='R',defaut= 0.E+0 ),
-             FY              =SIMP(statut='f',typ='R',defaut= 0.E+0 ),
-             FZ              =SIMP(statut='f',typ='R',defaut= 0.E+0 ),
-             
+
              POSITION        =SIMP(statut='f',typ='TXM',fr="Direction prédéfinie",into=("PARA","INFI","FINI",) ),
+             b_fxyz  =BLOC ( condition = "POSITION == None",
+                  FX   =SIMP(statut='f',typ='R',defaut= 0.E+0 ),
+                  FY   =SIMP(statut='f',typ='R',defaut= 0.E+0 ),
+                  FZ   =SIMP(statut='f',typ='R',defaut= 0.E+0 ),
+                       ),
+
              b_para     =BLOC ( condition = "POSITION == 'PARA'",
                regles=(UN_PARMI('TRANS','DIST'),),
                TRANS           =SIMP(statut='f',typ='R',max=3),
                DIST            =SIMP(statut='f',typ='R' ),
-               b_point2        =BLOC ( condition = "DIST != None", 
+               b_point2        =BLOC ( condition = "DIST != None",
                  POINT2           =SIMP(statut='o',typ='R',max=3),
                ),
              ),
              b_fini_infi     =BLOC ( condition = "(POSITION == 'FINI') or (POSITION == 'INFI')",
                POINT1          =SIMP(statut='o',typ='R',max=3),
                POINT2          =SIMP(statut='o',typ='R',max=3),
-             ), 
+             ),
            ),
 
 
 
-             
+
         INTE_ELEC       =FACT(statut='f',max='**',
                               fr="Force de Laplace due à la présence d'un conducteur non rectiligne secondaire",
              regles=(AU_MOINS_UN('TOUT','GROUP_MA','MAILLE'),
@@ -2110,7 +2108,7 @@ AFFE_CHAR_MECA=OPER(nom="AFFE_CHAR_MECA",op=   7,sd_prod=char_meca
              TRANS           =SIMP(statut='f',typ='R' ,max='**'),
              SYME            =SIMP(statut='f',typ='R' ,max='**'),
            ),
-         
+
 
          IMPE_FACE       =FACT(statut='f',fr="Appliquer une impédance acoustique à une face",max='**',
              regles=(AU_MOINS_UN('GROUP_MA','MAILLE' ),),
@@ -2118,14 +2116,14 @@ AFFE_CHAR_MECA=OPER(nom="AFFE_CHAR_MECA",op=   7,sd_prod=char_meca
              MAILLE          =SIMP(statut='f',typ=ma  ,validators=NoRepeat(),max='**'),
              IMPE            =SIMP(statut='o',typ='R' ),
            ),
-         
+
          VITE_FACE       =FACT(statut='f',fr="Imposer des vitesses acoustiquesnormales à une face",max='**',
              regles=(AU_MOINS_UN('GROUP_MA','MAILLE'),),
              GROUP_MA        =SIMP(statut='f',typ=grma,validators=NoRepeat(),max='**'),
              MAILLE          =SIMP(statut='f',typ=ma  ,validators=NoRepeat(),max='**'),
              VNOR            =SIMP(statut='o',typ='R' ),
            ),
-           
+
 
 
          ONDE_FLUI       =FACT(statut='f',fr="Appliquer une amplitude de pression d onde incidente",max='**',
@@ -2134,7 +2132,7 @@ AFFE_CHAR_MECA=OPER(nom="AFFE_CHAR_MECA",op=   7,sd_prod=char_meca
              MAILLE          =SIMP(statut='f',typ=ma  ,validators=NoRepeat(),max='**'),
              PRES            =SIMP(statut='o',typ='R' ),
            ),
-         
+
          FLUX_THM_REP    =FACT(statut='f',max='**',
              regles=(AU_MOINS_UN('TOUT','GROUP_MA','MAILLE'),
                      PRESENT_ABSENT('TOUT','GROUP_MA','MAILLE'),
@@ -4395,7 +4393,7 @@ b_charge =BLOC( condition = "OPTION in ('EPME_ELNO_DEPL','EPSI_ELGA_DEPL','EPME_
      TITRE           =SIMP(statut='f',typ='TXM',max='**'),
 ) ;
 
-#& MODIF COMMANDE  DATE 24/11/2003   AUTEUR F1BHHAJ J.ANGLES 
+#& MODIF COMMANDE  DATE 26/01/2004   AUTEUR F1BHHAJ J.ANGLES 
 #            CONFIGURATION MANAGEMENT OF EDF VERSION
 # ======================================================================
 # COPYRIGHT (C) 1991 - 2001  EDF R&D                  WWW.CODE-ASTER.ORG
@@ -4459,11 +4457,11 @@ CALC_FATIGUE=OPER(nom="CALC_FATIGUE",op= 151,sd_prod=calc_fatigue_prod,reentrant
            GROUP_NO      =SIMP(statut='f',typ=grno,validators=NoRepeat(),max='**' ),
            NOEUD         =SIMP(statut='f',typ=no  ,validators=NoRepeat(),max='**' ),
            b_period       =BLOC(condition = "TYPE_CHARGE == 'PERIODIQUE'",
-               CRITERE       =SIMP(statut='o',typ='TXM',into=("MATAKE","DANG_VAN_MODI") ),
+               CRITERE       =SIMP(statut='o',typ='TXM',into=("MATAKE","DANG_VAN_MODI_AC") ),
                METHODE       =SIMP(statut='o',typ='TXM',into=("CERCLE_EXACT",) ),
            ),
            b_non_period   =BLOC(condition = "TYPE_CHARGE == 'NON_PERIODIQUE'",
-               CRITERE       =SIMP(statut='o',typ='TXM',into=("DOMM_MAXI",) ),
+               CRITERE       =SIMP(statut='o',typ='TXM',into=("DOMM_MAXI","DANG_VAN_MODI_AV") ),
                PROJECTION    =SIMP(statut='o',typ='TXM',into=("UN_AXE", "DEUX_AXES") ),
                DELTA_OSCI    = SIMP(statut='f',typ='R',defaut= 0.0E+0),  
            ),
@@ -4565,7 +4563,7 @@ CALC_FONC_INTERP=OPER(nom="CALC_FONC_INTERP",op= 134,sd_prod=fonction,
          INFO            =SIMP(statut='f',typ='I',defaut= 1,into=( 1 , 2 ) ),
 )  ;
 
-#& MODIF COMMANDE  DATE 09/09/2003   AUTEUR DURAND C.DURAND 
+#& MODIF COMMANDE  DATE 04/02/2004   AUTEUR CAMBIER S.CAMBIER 
 #            CONFIGURATION MANAGEMENT OF EDF VERSION
 # ======================================================================
 # COPYRIGHT (C) 1991 - 2001  EDF R&D                  WWW.CODE-ASTER.ORG
@@ -4601,7 +4599,7 @@ def calc_fonction_prod(DERIVE,EXTRACTION,INTEGRE,ECART_TYPE,INVERSE,RMS,NOCI_SEI
   if (COMPOSE     != None): return fonction
   if (ASSE        != None): return fonction
   if (FFT         != None): 
-     vale=FFT.get_child('FONCTION').get_valeur()
+     vale=FFT['FONCTION']
      if (AsType(vale) == fonction )  : return fonction_c
      if (AsType(vale) == fonction_c) : return fonction
   if (CORR_ACCE   != None): return fonction
@@ -5478,7 +5476,7 @@ CALC_NO=OPER(nom="CALC_NO",op= 106,sd_prod=calc_no_prod,docu="U4.81.02-f",reentr
          NOEUD_RESU      =SIMP(statut='f',typ=ma,validators=NoRepeat(),max='**'),
 )  ;
 
-#& MODIF COMMANDE  DATE 09/09/2003   AUTEUR DURAND C.DURAND 
+#& MODIF COMMANDE  DATE 10/02/2004   AUTEUR LEBOUVIE F.LEBOUVIER 
 #            CONFIGURATION MANAGEMENT OF EDF VERSION
 # ======================================================================
 # COPYRIGHT (C) 1991 - 2003  EDF R&D                  WWW.CODE-ASTER.ORG
@@ -5550,7 +5548,6 @@ CALC_PRECONT=MACRO(nom="CALC_PRECONT",op=calc_precont_ops,sd_prod=evol_noli,
                                  ,defaut= 1.0E-6),
             ITER_INTE_MAXI  =SIMP(statut='f',typ='I',defaut= 10 ),
             ITER_INTE_PAS   =SIMP(statut='f',typ='I',defaut= 0 ),
-            TYPE_MATR_COMP  =SIMP(statut='f',typ='TXM',defaut="TANG_VIT",into=("TANG_VIT",)),
             RESO_INTE       =SIMP(statut='f',typ='TXM',defaut="IMPLICITE",
                                   into=("RUNGE_KUTTA_2","RUNGE_KUTTA_4","IMPLICITE")),
           ),
@@ -5777,7 +5774,7 @@ CALC_VECT_ELEM=OPER(nom="CALC_VECT_ELEM",op=8,sd_prod=calc_vect_elem_prod,docu="
          ),
 ) ;
 
-#& MODIF COMMANDE  DATE 09/09/2003   AUTEUR DURAND C.DURAND 
+#& MODIF COMMANDE  DATE 04/02/2004   AUTEUR CAMBIER S.CAMBIER 
 #            CONFIGURATION MANAGEMENT OF EDF VERSION
 # ======================================================================
 # COPYRIGHT (C) 1991 - 2001  EDF R&D                  WWW.CODE-ASTER.ORG
@@ -5799,11 +5796,11 @@ CALC_VECT_ELEM=OPER(nom="CALC_VECT_ELEM",op=8,sd_prod=calc_vect_elem_prod,docu="
 def comb_cham_elem_prod(COMB_R=None,COMB_C=None,COMB_FOURIER=None,**args):
 
   if COMB_R != None:
-    vale=COMB_R.get_child('CHAM_ELEM').get_valeur()
+    vale=COMB_R[0]['CHAM_ELEM']
   elif COMB_C != None:
-    vale=COMB_C.get_child('CHAM_ELEM').get_valeur()
+    vale=COMB_C[0]['CHAM_ELEM']
   elif COMB_FOURIER != None:
-    vale=COMB_FOURIER.get_child('CHAM_ELEM').get_valeur()
+    vale=COMB_FOURIER[0]['CHAM_ELEM']
   else :
     raise AsException("type de concept resultat non prevu")
 
@@ -5846,7 +5843,7 @@ COMB_CHAM_ELEM=OPER(nom="COMB_CHAM_ELEM",op= 139,sd_prod=comb_cham_elem_prod,ree
 )  ;
 
 
-#& MODIF COMMANDE  DATE 09/09/2003   AUTEUR DURAND C.DURAND 
+#& MODIF COMMANDE  DATE 04/02/2004   AUTEUR CAMBIER S.CAMBIER 
 #            CONFIGURATION MANAGEMENT OF EDF VERSION
 # ======================================================================
 # COPYRIGHT (C) 1991 - 2001  EDF R&D                  WWW.CODE-ASTER.ORG
@@ -5867,18 +5864,18 @@ COMB_CHAM_ELEM=OPER(nom="COMB_CHAM_ELEM",op= 139,sd_prod=comb_cham_elem_prod,ree
 # RESPONSABLE G8BHHXD X.DESROCHES
 def comb_cham_no_prod(COMB_R,COMB_C,COMB_FOURIER,**args):
   if COMB_C != None:
-    type_mat = AsType(COMB_C.get_child('CHAM_NO').get_valeur())
+    type_mat = AsType(COMB_C[0]['CHAM_NO'])
     if type_mat in  (cham_no_depl_c,cham_no_depl_r) : return cham_no_depl_c
     if type_mat in  (cham_no_temp_c,cham_no_temp_r) : return cham_no_temp_c
     if type_mat in  (cham_no_pres_c,cham_no_pres_r) : return cham_no_pres_c
   elif COMB_R != None:
-    type_mat = AsType(COMB_R.get_child('CHAM_NO').get_valeur())
+    type_mat = AsType(COMB_R[0]['CHAM_NO'])
     if type_mat in  (cham_no_depl_c,cham_no_depl_r) : return cham_no_depl_r
     if type_mat in  (cham_no_temp_c,cham_no_temp_r) : return cham_no_temp_r
     if type_mat in  (cham_no_pres_c,cham_no_pres_r) : return cham_no_pres_r
     if type_mat ==  matr_asse_gene_r : return matr_asse_gene_r
   elif COMB_FOURIER != None:
-    type_mat = AsType(COMB_FOURIER.get_child('CHAM_NO').get_valeur())
+    type_mat = AsType(COMB_FOURIER[0]['CHAM_NO'])
     if type_mat == cham_no_temp_r : return cham_no_temp_r
     if type_mat == cham_no_depl_r : return cham_no_depl_r
   raise AsException("type de concept resultat non prevu")
@@ -5941,7 +5938,7 @@ COMB_FOURIER=OPER(nom="COMB_FOURIER",op= 161,sd_prod=comb_fourier,
                                into=("DEPL","REAC_NODA","SIEF_ELGA_DEPL","EPSI_ELNO_DEPL","SIGM_ELNO_DEPL") ),
 )  ;
 
-#& MODIF COMMANDE  DATE 09/09/2003   AUTEUR DURAND C.DURAND 
+#& MODIF COMMANDE  DATE 04/02/2004   AUTEUR CAMBIER S.CAMBIER 
 #            CONFIGURATION MANAGEMENT OF EDF VERSION
 # ======================================================================
 # COPYRIGHT (C) 1991 - 2001  EDF R&D                  WWW.CODE-ASTER.ORG
@@ -5962,13 +5959,13 @@ COMB_FOURIER=OPER(nom="COMB_FOURIER",op= 161,sd_prod=comb_fourier,
 # RESPONSABLE VABHHTS J.PELLET
 def comb_matr_asse_prod(COMB_R,COMB_C,CALC_AMOR_GENE,**args):
   if COMB_C != None:
-    type_mat = AsType(COMB_C.get_child('MATR_ASSE').get_valeur())
+    type_mat = AsType(COMB_C[0]['MATR_ASSE'])
     if type_mat in  (matr_asse_depl_c,matr_asse_depl_r) : return matr_asse_depl_c
     if type_mat in  (matr_asse_gene_c,matr_asse_gene_r) : return matr_asse_gene_c    
     if type_mat in  (matr_asse_temp_c,matr_asse_temp_r) : return matr_asse_temp_c
     if type_mat in  (matr_asse_pres_c,matr_asse_pres_r) : return matr_asse_pres_c
   elif COMB_R != None:
-    type_mat = AsType(COMB_R.get_child('MATR_ASSE').get_valeur())
+    type_mat = AsType(COMB_R[0]['MATR_ASSE'])
     if type_mat in  (matr_asse_depl_c,matr_asse_depl_r) : return matr_asse_depl_r
     if type_mat in  (matr_asse_temp_c,matr_asse_temp_r) : return matr_asse_temp_r
     if type_mat in  (matr_asse_pres_c,matr_asse_pres_r) : return matr_asse_pres_r
@@ -6866,7 +6863,7 @@ DEFI_COQU_MULT=OPER(nom="DEFI_COQU_MULT",op=56,sd_prod=mater,docu="U4.42.03-f",r
          ),
 )  ;
 
-#& MODIF COMMANDE  DATE 10/10/2003   AUTEUR D6BHHJP J.P.LEFEBVRE 
+#& MODIF COMMANDE  DATE 29/01/2004   AUTEUR D6BHHJP J.P.LEFEBVRE 
 #            CONFIGURATION MANAGEMENT OF EDF VERSION
 # ======================================================================
 # COPYRIGHT (C) 1991 - 2003  EDF R&D                  WWW.CODE-ASTER.ORG
@@ -6890,21 +6887,35 @@ DEFI_FICHIER=PROC(nom="DEFI_FICHIER",op=26,docu="U4.12.03-a",
                   fr="Gestion d une unité logique : ajout, suppression",
 
             ACTION        =SIMP(statut='f',typ='TXM',into=("ASSOCIER","LIBERER"),defaut="ASSOCIER"),
-            UNITE         =SIMP(statut='o',typ='I' ,val_min=1),
             b_associer    =BLOC(condition = "ACTION == 'ASSOCIER'",fr="Paramètres pour l ouverture du fichier",
                TYPE          =SIMP(statut='f',typ='TXM',into=("ASCII","BINARY","LIBRE"),defaut="ASCII"),
                b_type_ascii  =BLOC(condition = "TYPE == 'ASCII'",fr="Paramètres pour le type ASCII",
                   NOM_SYSTEME   =SIMP(statut='f',typ='TXM',validators=LongStr(1,255)),
+                  b_nom_systeme_present =BLOC(condition="NOM_SYSTEME == None",
+                                              fr="Sans nom de fichier,l unite logique est nécessaire",
+                      UNITE         =SIMP(statut='o',typ='I' ,val_min=1),
+                  ),
+                  b_nom_systeme_absent =BLOC(condition="NOM_SYSTEME != None",
+                                             fr="Avec un nom de fichier,l unite logique est facultative",
+                      UNITE         =SIMP(statut='f',typ='I' ,val_min=1),
+                  ),
                   FICHIER       =SIMP(statut='o',typ='TXM'),
+                  ACCES         =SIMP(statut='f',typ='TXM',into=("NEW","APPEND","OLD"),defaut="NEW"),
                ),
                b_type_autre  =BLOC(condition = "TYPE != 'ASCII'",fr="Paramètres pour les types BINARY et LIBRE",
-                  regles=(AU_MOINS_UN('NOM_SYSTEME','FICHIER'),),
+                  regles=(AU_MOINS_UN('NOM_SYSTEME','UNITE'),),
+                  UNITE         =SIMP(statut='f',typ='I' ,val_min=1),
                   NOM_SYSTEME   =SIMP(statut='f',typ='TXM',validators=LongStr(1,255)),
                   FICHIER       =SIMP(statut='f',typ='TXM'),
+                  ACCES         =SIMP(statut='f',typ='TXM',into=("NEW","OLD"),defaut="NEW"),
                ),
-               ACCES         =SIMP(statut='f',typ='TXM',into=("NEW","APPEND","OLD"),defaut="NEW"),
             ),
-            INFO          =SIMP(statut='f',typ='I',into=(1,2) ),           
+            b_liberer    =BLOC(condition = "ACTION == 'LIBERER'",fr="Paramètres pour la fermeture du fichier",
+                  regles=(UN_PARMI('NOM_SYSTEME','UNITE'),),
+                  UNITE         =SIMP(statut='f',typ='I' ,val_min=1),
+                  NOM_SYSTEME   =SIMP(statut='f',typ='TXM',validators=LongStr(1,255)),
+           ),
+           INFO          =SIMP(statut='f',typ='I',into=(1,2) ),           
            )
 
 #& MODIF COMMANDE  DATE 09/09/2003   AUTEUR DURAND C.DURAND 
@@ -7179,7 +7190,7 @@ DEFI_FONCTION=OPER(nom="DEFI_FONCTION",op=3,sd_prod=defi_fonction_prod
          TITRE           =SIMP(statut='f',typ='TXM',max='**'),
 )  ;
 
-#& MODIF COMMANDE  DATE 09/09/2003   AUTEUR DURAND C.DURAND 
+#& MODIF COMMANDE  DATE 03/02/2004   AUTEUR LEBOUVIE F.LEBOUVIER 
 #            CONFIGURATION MANAGEMENT OF EDF VERSION
 # ======================================================================
 # COPYRIGHT (C) 1991 - 2001  EDF R&D                  WWW.CODE-ASTER.ORG
@@ -7200,7 +7211,7 @@ DEFI_FONCTION=OPER(nom="DEFI_FONCTION",op=3,sd_prod=defi_fonction_prod
 DEFI_FOND_FISS=OPER(nom="DEFI_FOND_FISS",op=55,sd_prod=fond_fiss,docu="U4.82.01-f",reentrant='n',
             UIinfo={"groupes":("Post traitements",)},
                     fr="Définition de lèvres et d un fond de fissure en 3D",
-         regles=(UN_PARMI('FOND','FOND_FERME'),
+         regles=(UN_PARMI('FOND_FISS','FOND_FERME'),
                  EXCLUS('FOND_FERME','DTAN_ORIG'),
                  EXCLUS('FOND_FERME','DTAN_EXTR'),
                       EXCLUS('FOND_FERME','VECT_GRNO_ORIG'),
@@ -7212,7 +7223,7 @@ DEFI_FOND_FISS=OPER(nom="DEFI_FOND_FISS",op=55,sd_prod=fond_fiss,docu="U4.82.01-
                       EXCLUS('DTAN_ORIG','VECT_GRNO_ORIG'),
                       EXCLUS('DTAN_EXTR','VECT_GRNO_EXTR') ,),
            MAILLAGE        =SIMP(statut='o',typ=maillage ),
-           FOND            =FACT(statut='f',
+           FOND_FISS       =FACT(statut='f',
              regles=(UN_PARMI('GROUP_NO','NOEUD','GROUP_MA','MAILLE'),
                      EXCLUS('NOEUD_ORIG','GROUP_NO_ORIG'),
                           EXCLUS('NOEUD_EXTR','GROUP_NO_EXTR'),),
@@ -7696,7 +7707,7 @@ DEFI_MAILLAGE=OPER(nom="DEFI_MAILLAGE",op=  88,sd_prod=maillage,
          ),
 )  ;
 
-#& MODIF COMMANDE  DATE 12/01/2004   AUTEUR GRANET S.GRANET 
+#& MODIF COMMANDE  DATE 02/02/2004   AUTEUR ROMEO R.FERNANDES 
 #            CONFIGURATION MANAGEMENT OF EDF VERSION
 # ======================================================================
 # COPYRIGHT (C) 1991 - 2001  EDF R&D                  WWW.CODE-ASTER.ORG
@@ -9486,23 +9497,14 @@ DEFI_MATERIAU=OPER(nom="DEFI_MATERIAU",op=5,sd_prod=mater,
                                            VERI_P           = SIMP(statut='c',typ='TXM',defaut=("TEMP",)),
                                              ),
 # =================================================================================
-# --- MOT-CLE OBLIGATOIRE ---------------------------------------------------------
+# --- MOT-CLE INUTILE -------------------------------------------------------------
 # =================================================================================
-                             THM_GAZ    = FACT(statut='o',
-# ---------------------------------------------------------------------------------
-# -------------------   DONNEES OBLIGATOIRE   -------------------------------------
-# ---------------------------------------------------------------------------------
-                                           MASS_MOL         = SIMP(statut='o',typ='R'),
-                                           VISC             = SIMP(statut='o',typ=(fonction,formule)),
-                                           D_VISC_TEMP      = SIMP(statut='o',typ=(fonction,formule)),
-# ---------------------------------------------------------------------------------
-# -------------------   DONNEES NECESSAIRE SI THERMIQUE   -------------------------
-# ---------------------------------------------------------------------------------
+                             THM_GAZ    = FACT(statut='f',
+                                           MASS_MOL         = SIMP(statut='f',typ='R'),
+                                           VISC             = SIMP(statut='f',typ=(fonction,formule)),
+                                           D_VISC_TEMP      = SIMP(statut='f',typ=(fonction,formule)),
                                            CP               = SIMP(statut='f',typ='R'),
-# ---------------------------------------------------------------------------------
-# -------------------   DONNEES CACHEES ---------------------------------------------
-# ---------------------------------------------------------------------------------
-                                           VERI_P          = SIMP(statut='c',typ='TXM',defaut=("TEMP",)),
+                                           VERI_P           = SIMP(statut='c',typ='TXM',defaut=("TEMP",)),
                                              ),
 # =================================================================================
 # --- MOT-CLE INUTILE -------------------------------------------------------------
@@ -10177,24 +10179,24 @@ DEFI_MATERIAU=OPER(nom="DEFI_MATERIAU",op=5,sd_prod=mater,
              VERI_P          =SIMP(statut='c',typ='TXM',max='**',defaut=("TEMP",) ),
            ),
            CISA_PLAN_CRIT  =FACT(statut='f',
-             CRITERE       =SIMP(statut='o',typ='TXM',into=("MATAKE","DANG_VAN_MODI","DOMM_MAXI") ),
+             CRITERE       =SIMP(statut='o',typ='TXM',into=("MATAKE","DANG_VAN_MODI_AC","DANG_VAN_MODI_AV","DOMM_MAXI") ),
 
              b_critere_matake =BLOC(condition="CRITERE=='MATAKE'",
-                                    fr="cisaillement plan critique  critère de matake",
+                                    fr="Cisaillement plan critique  critère de matake",
                MATAKE_A         =SIMP(statut='o',typ='R'),
                MATAKE_B         =SIMP(statut='o',typ='R'),
                COEF_FLEX_TORS   =SIMP(statut='o',typ='R',val_min=1.0E0,val_max=1.7321E0),
              ),
 
-             b_critere_dang_van =BLOC(condition="CRITERE=='DANG_VAN_MODI'",
-                                 fr="cisaillement plan critique critère de Dang Van modifié",
+             b_critere_dang_van =BLOC(condition="(CRITERE=='DANG_VAN_MODI_AC' or CRITERE=='DANG_VAN_MODI_AV')",
+                                 fr="Critère de Dang Van modifié pour les cas amplitude constante et amplitude variable",
                D_VAN_A            =SIMP(statut='o',typ='R'),
                D_VAN_B            =SIMP(statut='o',typ='R'),
                COEF_CISA_TRAC     =SIMP(statut='o',typ='R',val_min=1.0E0,val_max=1.7321E0),
              ),
 
              b_crit_domm_maxi  =BLOC(condition="CRITERE=='DOMM_MAXI'",
-                                      fr="critère pour chargement non périodique : domm_maxi",
+                                      fr="Critère pour chargement non périodique : domm_maxi",
                DOMM_A             =SIMP(statut='o',typ='R'),
                DOMM_B             =SIMP(statut='o',typ='R'),
                COEF_CISA_TRAC     =SIMP(statut='o',typ='R',val_min=1.0E0,val_max=1.7321E0),
@@ -11211,7 +11213,7 @@ DYNA_LINE_TRAN=OPER(nom="DYNA_LINE_TRAN",op=  48,sd_prod=dyna_trans,
          INFO            =SIMP(statut='f',typ='I',into=(1,2) ),
 )  ;
 
-#& MODIF COMMANDE  DATE 21/01/2004   AUTEUR CIBHHLV L.VIVAN 
+#& MODIF COMMANDE  DATE 10/02/2004   AUTEUR LEBOUVIE F.LEBOUVIER 
 #            CONFIGURATION MANAGEMENT OF EDF VERSION
 # ======================================================================
 # COPYRIGHT (C) 1991 - 2001  EDF R&D                  WWW.CODE-ASTER.ORG
@@ -11428,7 +11430,6 @@ DYNA_NON_LINE=OPER(nom="DYNA_NON_LINE",op= 70,sd_prod=evol_noli,reentrant='f',
                                 ,defaut= 1.0E-6),
            ITER_INTE_MAXI  =SIMP(statut='f',typ='I',defaut= 10 ),
            ITER_INTE_PAS   =SIMP(statut='f',typ='I',defaut= 0 ),
-           TYPE_MATR_COMP  =SIMP(statut='f',typ='TXM',defaut="TANG_VIT",into=("TANG_VIT",)),
            RESO_INTE       =SIMP(statut='f',typ='TXM',defaut="IMPLICITE",
                                  into=("RUNGE_KUTTA_2","RUNGE_KUTTA_4","IMPLICITE")),
          ),
@@ -11535,7 +11536,7 @@ DYNA_SPEC_MODAL=OPER(nom="DYNA_SPEC_MODAL",op= 147,sd_prod=tabl_intsp,
          TITRE           =SIMP(statut='f',typ='TXM',max='**'),
 )  ;
 
-#& MODIF COMMANDE  DATE 21/01/2004   AUTEUR CIBHHLV L.VIVAN 
+#& MODIF COMMANDE  DATE 10/02/2004   AUTEUR LEBOUVIE F.LEBOUVIER 
 #            CONFIGURATION MANAGEMENT OF EDF VERSION
 # ======================================================================
 # COPYRIGHT (C) 1991 - 2003  EDF R&D                  WWW.CODE-ASTER.ORG
@@ -11724,7 +11725,6 @@ DYNA_TRAN_EXPLI=OPER(nom="DYNA_TRAN_EXPLI",op= 69,sd_prod=evol_noli,reentrant='f
                                 ,defaut= 1.0E-6),
            ITER_INTE_MAXI  =SIMP(statut='f',typ='I',defaut= 10 ),
            ITER_INTE_PAS   =SIMP(statut='f',typ='I',defaut= 0 ),
-           TYPE_MATR_COMP  =SIMP(statut='f',typ='TXM',defaut="TANG_VIT",into=("TANG_VIT",)),
            RESO_INTE       =SIMP(statut='f',typ='TXM',defaut="IMPLICITE",
                                  into=("RUNGE_KUTTA_2","RUNGE_KUTTA_4","IMPLICITE")),
          ),
@@ -13162,7 +13162,7 @@ IMPR_JEVEUX=PROC(nom="IMPR_JEVEUX",op=16,docu="U4.91.21-g",
          COMMENTAIRE     =SIMP(statut='f',typ='TXM' ),  
 )  ;
 
-#& MODIF COMMANDE  DATE 09/09/2003   AUTEUR DURAND C.DURAND 
+#& MODIF COMMANDE  DATE 04/02/2004   AUTEUR ACBHHCD G.DEVESA 
 #            CONFIGURATION MANAGEMENT OF EDF VERSION
 # ======================================================================
 # COPYRIGHT (C) 1991 - 2001  EDF R&D                  WWW.CODE-ASTER.ORG
@@ -13194,11 +13194,12 @@ IMPR_MACR_ELEM=PROC(nom="IMPR_MACR_ELEM",op= 160,
            VERSION          =SIMP(statut='f',typ='I',defaut= 5,into=( 5 ,) ),
          ),             
          b_miss_3d       =BLOC(condition = "FORMAT == 'MISS_3D'",
+           regles=(EXCLUS('AMOR_REDUIT','LIST_AMOR'),),
            UNITE           =SIMP(statut='f',typ='I',defaut= 26 ),
            SOUS_TITRE      =SIMP(statut='f',typ='TXM',max='**'),
            AMOR_REDUIT     =SIMP(statut='f',typ='R'  ,max='**'),
+           LIST_AMOR       =SIMP(statut='f',typ=listr8 ),
            GROUP_MA_INTERF =SIMP(statut='o',typ=grma ,max='**'),
-#  Ces trois mots cles sont-ils dans le bon bloc et avec le bon statut        
            GROUP_MA_FLU_STR=SIMP(statut='f',typ=grma,max='**'),
            GROUP_MA_FLU_SOL=SIMP(statut='f',typ=grma,max='**'),
            GROUP_MA_SOL_SOL=SIMP(statut='f',typ=grma,max='**'),
@@ -13626,7 +13627,7 @@ INCLUDE_MATERIAU=MACRO(nom="INCLUDE_MATERIAU",op=-14,docu="U4.43.02-b",
          INFO            =SIMP(statut='f',typ='I',defaut= 1,into=(1,2) ),
 )  ;
 
-#& MODIF COMMANDE  DATE 09/09/2003   AUTEUR DURAND C.DURAND 
+#& MODIF COMMANDE  DATE 03/02/2004   AUTEUR ASSIRE A.ASSIRE 
 #            CONFIGURATION MANAGEMENT OF EDF VERSION
 # ======================================================================
 # COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
@@ -13651,7 +13652,7 @@ INFO_EXEC_ASTER=OPER(nom="INFO_EXEC_ASTER",op=35,sd_prod=table,
                     UIinfo={"groupes":("Gestion du travail",)},
 
          regles=(),
-         LISTE_INFO      =SIMP(statut='o',typ='TXM',validators=NoRepeat(),max=2,into=("CPU_RESTANT","CPU",),),
+         LISTE_INFO      =SIMP(statut='o',typ='TXM',validators=NoRepeat(),max=2,into=("CPU_RESTANT","CPU","UNITE_LIBRE",),),
          TITRE           =SIMP(statut='f',typ='TXM',max='**'),
          INFO            =SIMP(statut='f',typ='I',defaut=1,into=(1,2) ),
 )  ;
@@ -14174,7 +14175,7 @@ LIRE_PLEXUS=OPER(nom="LIRE_PLEXUS",op= 184,sd_prod=evol_char,
          TITRE           =SIMP(statut='f',typ='TXM',max='**'),
 )  ;
 
-#& MODIF COMMANDE  DATE 09/09/2003   AUTEUR DURAND C.DURAND 
+#& MODIF COMMANDE  DATE 10/02/2004   AUTEUR NICOLAS O.NICOLAS 
 #            CONFIGURATION MANAGEMENT OF EDF VERSION
 # ======================================================================
 # COPYRIGHT (C) 1991 - 2001  EDF R&D                  WWW.CODE-ASTER.ORG
@@ -14203,6 +14204,7 @@ def lire_resu_prod(TYPE_RESU,**args):
   if TYPE_RESU == "DYNA_HARMO" : return dyna_harmo
   if TYPE_RESU == "HARM_GENE" :  return harm_gene
   if TYPE_RESU == "MODE_MECA" :  return mode_meca
+  if TYPE_RESU == "MODE_MECA_C" : return mode_meca_c
   raise AsException("type de concept resultat non prevu")
 
 # pour éviter d'écrire 3 fois cette liste :
@@ -14244,7 +14246,8 @@ LIRE_RESU=OPER(nom="LIRE_RESU",op=150,sd_prod=lire_resu_prod,docu="U7.02.01-d",r
 # 0) mots clés généraux :
 #----------------------
          TYPE_RESU       =SIMP(statut='o',typ='TXM',into=("EVOL_THER","EVOL_ELAS","EVOL_NOLI","MODE_MECA",
-                                                          "DYNA_TRANS","DYNA_HARMO","HARM_GENE","EVOL_CHAR") ),
+                                                          "MODE_MECA_C","DYNA_TRANS","DYNA_HARMO","HARM_GENE",
+                                                          "EVOL_CHAR") ),
 
          FORMAT          =SIMP(statut='o',typ='TXM',into=("IDEAS","IDEAS_DS58","ENSIGHT","MED") ),
 
@@ -14281,6 +14284,7 @@ LIRE_RESU=OPER(nom="LIRE_RESU",op=150,sd_prod=lire_resu_prod,docu="U7.02.01-d",r
 # ---------
          b_ideas         =BLOC(condition="FORMAT=='IDEAS'",
            UNITE           =SIMP(statut='f',typ='I',defaut= 19 ),
+#           TEST            =SIMP(statut='f',typ='TXM',into=("OUI","NON"),defaut="NON" ),
            NOM_CHAM        =SIMP(statut='o',typ='TXM',validators=NoRepeat(),max='**',into=l_nom_cham_pas_elga()),
            FORMAT_IDEAS    =FACT(statut='f',max='**',
              regles=(UN_PARMI('POSI_INST','POSI_FREQ'),),
@@ -14319,7 +14323,7 @@ LIRE_RESU=OPER(nom="LIRE_RESU",op=150,sd_prod=lire_resu_prod,docu="U7.02.01-d",r
 
 # 2) blocs selon le type du résultat :
 #---------------------------------
-         b_mode_meca     =BLOC(condition="TYPE_RESU=='MODE_MECA'",
+         b_mode_meca     =BLOC(condition="(TYPE_RESU=='MODE_MECA')or(TYPE_RESU=='MODE_MECA_C')",
            MATR_A         =SIMP(statut='f',typ=matr_asse_depl_r,),
            MATR_B         =SIMP(statut='f',typ=matr_asse_depl_r,),
          ),
@@ -14831,7 +14835,7 @@ MACR_ADAP_MAIL=MACRO(nom="MACR_ADAP_MAIL",op=macr_adap_mail_ops,sd_prod=macr_ada
 #
 )  ;
 
-#& MODIF COMMANDE  DATE 09/09/2003   AUTEUR DURAND C.DURAND 
+#& MODIF COMMANDE  DATE 10/02/2004   AUTEUR LEBOUVIE F.LEBOUVIER 
 #            CONFIGURATION MANAGEMENT OF EDF VERSION
 # ======================================================================
 # COPYRIGHT (C) 1991 - 2001  EDF R&D                  WWW.CODE-ASTER.ORG
@@ -14959,7 +14963,6 @@ MACR_ASCOUF_CALC=MACRO(nom="MACR_ASCOUF_CALC",op= -20,sd_prod=macr_ascouf_calc_p
                                 ,defaut= 1.0E-6),
            ITER_INTE_MAXI  =SIMP(statut='f',typ='I',defaut= 10 ),
            ITER_INTE_PAS   =SIMP(statut='f',typ='I',defaut= 0 ),
-           TYPE_MATR_COMP  =SIMP(statut='f',typ='TXM',defaut="TANG_VIT",into=("TANG_VIT",)),
            RESO_INTE       =SIMP(statut='f',typ='TXM',defaut="IMPLICITE",into=("RUNGE_KUTTA_2","RUNGE_KUTTA_4","IMPLICITE")),
          ),
 
@@ -15185,7 +15188,7 @@ MACR_ASCOUF_MAIL=MACRO(nom="MACR_ASCOUF_MAIL",op= -19,sd_prod=maillage,
          INFO            =SIMP(statut='f',typ='I',defaut= 1,into=(1,2) ),
 )  ;
 
-#& MODIF COMMANDE  DATE 09/09/2003   AUTEUR DURAND C.DURAND 
+#& MODIF COMMANDE  DATE 10/02/2004   AUTEUR LEBOUVIE F.LEBOUVIER 
 #            CONFIGURATION MANAGEMENT OF EDF VERSION
 # ======================================================================
 # COPYRIGHT (C) 1991 - 2001  EDF R&D                  WWW.CODE-ASTER.ORG
@@ -15204,6 +15207,8 @@ MACR_ASCOUF_MAIL=MACRO(nom="MACR_ASCOUF_MAIL",op= -19,sd_prod=maillage,
 #    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.      
 # ======================================================================
 # RESPONSABLE F1BHHAJ J.ANGLES
+from Macro.macr_aspic_calc_ops import macr_aspic_calc_ops
+
 def macr_aspic_calc_prod(self,MODELE,CHAM_MATER,CARA_ELEM,FOND_FISS_1,FOND_FISS_2,CHARGE,RESU_THER,**args):
   if MODELE      != None:self.type_sdprod(MODELE,modele)
   if CHAM_MATER  != None:self.type_sdprod(CHAM_MATER,cham_mater)
@@ -15214,7 +15219,7 @@ def macr_aspic_calc_prod(self,MODELE,CHAM_MATER,CARA_ELEM,FOND_FISS_1,FOND_FISS_
   if RESU_THER   != None:self.type_sdprod(RESU_THER,evol_ther)
   return evol_noli
 
-MACR_ASPIC_CALC=MACRO(nom="MACR_ASPIC_CALC",op=-17,sd_prod=macr_aspic_calc_prod,
+MACR_ASPIC_CALC=MACRO(nom="MACR_ASPIC_CALC",op=macr_aspic_calc_ops,sd_prod=macr_aspic_calc_prod,
                     fr=" ",docu="U4.pc.20-b",reentrant='n',
             UIinfo={"groupes":("Outils métier",)},
          regles=(UN_PARMI('COMP_INCR','COMP_ELAS'),),
@@ -15339,7 +15344,6 @@ MACR_ASPIC_CALC=MACRO(nom="MACR_ASPIC_CALC",op=-17,sd_prod=macr_aspic_calc_prod,
            RESI_INTE_RELA  =SIMP(statut='f',typ='R',defaut=1.0E-6),
            ITER_INTE_MAXI  =SIMP(statut='f',typ='I',defaut=10),
            ITER_INTE_PAS   =SIMP(statut='f',typ='I',defaut=0),
-           TYPE_MATR_COMP  =SIMP(statut='f',typ='TXM',defaut="TANG_VIT",into=("TANG_VIT",)),
            RESO_INTE       =SIMP(statut='f',typ='TXM',defaut="IMPLICITE",into=("RUNGE_KUTTA_2","RUNGE_KUTTA_4","IMPLICITE")),
          ),
 
@@ -15400,8 +15404,7 @@ MACR_ASPIC_CALC=MACRO(nom="MACR_ASPIC_CALC",op=-17,sd_prod=macr_aspic_calc_prod,
          INFO            =SIMP(statut='f',typ='I',defaut=1,into=(1,2)),
 
          TITRE           =SIMP(statut='f',typ='TXM'),
-)  ;
-# debut entete
+)
 
 #& MODIF COMMANDE  DATE 19/01/2004   AUTEUR DURAND C.DURAND 
 #            CONFIGURATION MANAGEMENT OF EDF VERSION
@@ -15501,7 +15504,7 @@ MACR_ASPIC_MAIL=MACRO(nom="MACR_ASPIC_MAIL",op= macr_aspic_mail_ops,sd_prod=mail
          INFO            =SIMP(statut='f',typ='I',defaut=1,into=(1,2)),
 )  ;
 
-#& MODIF COMMANDE  DATE 09/09/2003   AUTEUR DURAND C.DURAND 
+#& MODIF COMMANDE  DATE 10/02/2004   AUTEUR LEBOUVIE F.LEBOUVIER 
 #            CONFIGURATION MANAGEMENT OF EDF VERSION
 # ======================================================================
 # COPYRIGHT (C) 1991 - 2003  EDF R&D                  WWW.CODE-ASTER.ORG
@@ -15651,7 +15654,6 @@ MACR_CABRI_CALC=MACRO(nom="MACR_CABRI_CALC",
                         RESI_GLOB_RELA  =SIMP(statut='f',typ='R'),
                         ITER_GLOB_MAXI  =SIMP(statut='f',typ='I',defaut=10),
                         ITER_GLOB_ELAS  =SIMP(statut='f',typ='I',defaut=25),
-                        TYPE_MATR_COMP  =SIMP(statut='f',typ='TXM',defaut="TANG_VIT",into=("TANG_VIT",)),
                         RESO_INTE       =SIMP(statut='f',typ='TXM',defaut="IMPLICITE",
                                  into=("IMPLICITE",)),
                       ),
@@ -16339,108 +16341,6 @@ MACR_FIABILITE = MACRO ( nom="MACR_FIABILITE",op=macr_fiabilite_ops,
 #
 );
 
-#& MODIF COMMANDE  DATE 09/09/2003   AUTEUR DURAND C.DURAND 
-#            CONFIGURATION MANAGEMENT OF EDF VERSION
-# ======================================================================
-# COPYRIGHT (C) 1991 - 2001  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.                                 
-#
-# 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.                            
-#
-# 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.      
-# ======================================================================
-MACR_GOUJ2E_CALC=MACRO(nom="MACR_GOUJ2E_CALC",op=-23,sd_prod=evol_noli,
-                      fr=" ",docu="U4.gj.20-b",reentrant='n',
-            UIinfo={"groupes":("Outils métier",)},
-         MAILLAGE        =SIMP(statut='o',typ=maillage),
-         DEFI_GOUJ       =FACT(statut='o',
-           TYPE            =SIMP(statut='o',typ='TXM',into=("M33","M64","M90","M115","M155","M180","M186")),
-           VARIANTE        =SIMP(statut='o',typ='TXM',into=("A","B","C","D","E","F","G","H","I","J","K","L","M",  
-                                                            "N","O","P","Q","R","S","T","U","V","W","X","Y","Z")),
-           FILET_TRONQUE   =SIMP(statut='f',typ='I',max='**'),  
-           FILET_TRONQA    =SIMP(statut='f',typ='I',max='**'),  
-           FILET_TRONQB    =SIMP(statut='f',typ='I',max='**'),  
-           FILET_JEU_HT    =SIMP(statut='f',typ='I',max='**'),  
-           FILET_JEU_HTA   =SIMP(statut='f',typ='I',max='**'),  
-           FILET_JEU_HTB   =SIMP(statut='f',typ='I',max='**'),  
-         ),
-         EXCIT           =FACT(statut='o',
-           TYPE_BLOCAGE    =SIMP(statut='o',typ='I',defaut=2,into=(1,2,3)),
-           FORCE_GOUJ      =SIMP(statut='o',typ='R'),  
-         ),
-         CALCUL          =FACT(statut='o',
-           TYPE_CALCUL     =SIMP(statut='o',typ='TXM',into=("ELASTIQUE","ELASTOPLASTIQUE")),
-           NB_INCR         =SIMP(statut='o',typ='I'),  
-         ),
-         IMPRESSION      =FACT(statut='f',
-           FORMAT          =SIMP(statut='f',typ='TXM',defaut="TABLE",    
-                                 into=("RESULTAT","IDEAS","ASTER","CASTEM","ENSIGHT","MED","TABLE")),
-           VERSION         =SIMP(statut='f',typ='I',defaut=5,into=(4,5)),
-         ),
-         TITRE           =SIMP(statut='f',typ='TXM'),  
-         INFO            =SIMP(statut='f',typ='I',defaut=1 ,into=(1,2)),
-)  ;
-
-#& MODIF COMMANDE  DATE 09/09/2003   AUTEUR DURAND C.DURAND 
-#            CONFIGURATION MANAGEMENT OF EDF VERSION
-# ======================================================================
-# COPYRIGHT (C) 1991 - 2001  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.                                 
-#
-# 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.                            
-#
-# 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.      
-# ======================================================================
-MACR_GOUJ2E_MAIL=MACRO(nom="MACR_GOUJ2E_MAIL",op= -22,sd_prod=maillage,
-                      fr=" ",docu="U4.gj.10-b",reentrant='n',
-            UIinfo={"groupes":("Outils métier",)},
-         EXEC_MAILLAGE   =FACT(statut='o',
-           LOGICIEL        =SIMP(statut='o',typ='TXM',defaut="GIBI2000",into=("GIBI98","GIBI2000") ),
-           UNITE_DATG      =SIMP(statut='f',typ='I',defaut=70),  
-           UNITE_MGIB      =SIMP(statut='f',typ='I',defaut=19),  
-           NIVE_GIBI       =SIMP(statut='f',typ='I',defaut=10,into=(3,4,5,6,7,8,9,10)),
-         ),
-         DEFI_GOUJ       =FACT(statut='o',
-           TYPE            =SIMP(statut='o',typ='TXM',into=("M33","M64","M90","M115","M155","M180","M186")),
-           VARIANTE        =SIMP(statut='o',typ='TXM',into=("A","B","C","D","E","F","G","H","I","J","K","L","M",  
-                                                            "N","O","P","Q","R","S","T","U","V","W","X","Y","Z")), 
-         ),
-         GEOM_GOUJ_BRID  =FACT(statut='o',
-           NB_FILET        =SIMP(statut='o',typ='I'),  
-           H_CORP_BRID     =SIMP(statut='o',typ='R'),  
-           R_EXT_BRID      =SIMP(statut='o',typ='R'),  
-           H_HAUT_BRID     =SIMP(statut='f',typ='R',defaut=0.0E+0),  
-           H_BAS_BRID      =SIMP(statut='f',typ='R',defaut= 0.0E+0),  
-           FILET_ABST      =SIMP(statut='f',typ='I',validators=NoRepeat(),max='**'),  
-         ),
-         IMPRESSION      =FACT(statut='f',
-           regles=(PRESENT_PRESENT('FICHIER','UNITE'),),
-           FORMAT          =SIMP(statut='f',typ='TXM',defaut="RESULTAT",    
-                                 into=("RESULTAT","IDEAS","ASTER","CASTEM","ENSIGHT","MED")),
-           FICHIER         =SIMP(statut='f',typ='TXM'),  
-           UNITE           =SIMP(statut='f',typ='I'),  
-           VERSION         =SIMP(statut='f',typ='I',defaut=5,into=(4,5)),
-           NIVE_GIBI       =SIMP(statut='f',typ='I',defaut=10,into=(3,10)),
-         ),
-         INFO            =SIMP(statut='f',typ='I',defaut=1,into=(1,2)),
-)  ;
-
 #& MODIF COMMANDE  DATE 09/09/2003   AUTEUR DURAND C.DURAND 
 #            CONFIGURATION MANAGEMENT OF EDF VERSION
 # ======================================================================
@@ -19355,31 +19255,6 @@ POURSUITE=MACRO(nom="POURSUITE",op=ops.build_poursuite,repetable='n',fr="Poursui
          ),
 )  ;
 
-#& MODIF COMMANDE  DATE 09/09/2003   AUTEUR DURAND C.DURAND 
-#            CONFIGURATION MANAGEMENT OF EDF VERSION
-# ======================================================================
-# COPYRIGHT (C) 1991 - 2001  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.                                 
-#
-# 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.                            
-#
-# 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.      
-# ======================================================================
-PRE_CHAR_IDEAS=PROC(nom="PRE_CHAR_IDEAS",op=100,docu="U7.01.02-e",
-                    fr="Conversion de conditions aux limites et chargements IDEAS en commandes Aster",
-         UNITE_IDEAS     =SIMP(statut='f',typ='I',defaut=19),  
-         UNITE_ASTER     =SIMP(statut='f',typ='I',defaut=21),  
-         MODELE          =SIMP(statut='o',typ=modele),
-)  ;
-
 #& MODIF COMMANDE  DATE 09/09/2003   AUTEUR DURAND C.DURAND 
 #            CONFIGURATION MANAGEMENT OF EDF VERSION
 # ======================================================================
@@ -20274,7 +20149,7 @@ REST_SPEC_PHYS=OPER(nom="REST_SPEC_PHYS",op= 148,sd_prod=tabl_intsp,
          TITRE           =SIMP(statut='f',typ='TXM',max='**' ),  
 )  ;
 
-#& MODIF COMMANDE  DATE 28/10/2003   AUTEUR DURAND C.DURAND 
+#& MODIF COMMANDE  DATE 10/02/2004   AUTEUR LEBOUVIE F.LEBOUVIER 
 #            CONFIGURATION MANAGEMENT OF EDF VERSION
 # ======================================================================
 # COPYRIGHT (C) 1991 - 2001  EDF R&D                  WWW.CODE-ASTER.ORG
@@ -20437,7 +20312,6 @@ STAT_NON_LINE=OPER(nom="STAT_NON_LINE",op=70,sd_prod=evol_noli,
                                 ,defaut= 1.0E-6),
            ITER_INTE_MAXI  =SIMP(statut='f',typ='I',defaut= 10 ),
            ITER_INTE_PAS   =SIMP(statut='f',typ='I',defaut= 0 ),
-           TYPE_MATR_COMP  =SIMP(statut='f',typ='TXM',defaut="TANG_VIT",into=("TANG_VIT",)),
            RESO_INTE       =SIMP(statut='f',typ='TXM',defaut="IMPLICITE",
                                  into=("RUNGE_KUTTA_2","RUNGE_KUTTA_4","IMPLICITE")),
          ),
index 01d867012c0ac667084ff4a1ddda68095969d54a..8d4c9e15934a4a712dff86256a2b6fa0b18ce49c 100755 (executable)
@@ -1,4 +1,5 @@
 #!/usr/bin/env python
+# -*- coding: utf-8 -*-
 #            CONFIGURATION MANAGEMENT OF EDF VERSION
 # ======================================================================
 # COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
 # ======================================================================
 
 """
-    Ce module sert à lancer EFICAS configuré pour Code_Aster
+   Ce module sert à lancer EFICAS configuré pour Code_Aster
 """
 # Modules Python
 import sys
 
 # Modules Eficas
 import prefs
+if hasattr(prefs,'encoding'):
+   # Hack pour changer le codage par defaut des strings
+   import sys
+   reload(sys)
+   sys.setdefaultencoding(prefs.encoding)
+   del sys.setdefaultencoding
+   # Fin hack
+
 sys.path[:0]=[prefs.INSTALLDIR]
 
 import Editeur
index 261ee3b2d3db9d67c007c946c2c70c55578466d4..3c00b5af25d2b8dce1576c3d7bb00907b715e6c8 100644 (file)
@@ -42,6 +42,9 @@ ICONDIR=os.path.join(INSTALLDIR,'Editeur','icons')
 # lang indique la langue utilisée pour les chaines d'aide : fr ou ang
 lang='fr'
 
+# Codage des strings qui accepte les accents (en remplacement de 'ascii')
+encoding='iso-8859-1'
+
 labels= ('Fichier','Edition','Jeu de commandes',
 #               'Catalogue','Browsers',
                 'Options',
@@ -72,7 +75,7 @@ menu_defs={ 'bureau': [
               ),
               ('Jeu de commandes',[
                                    ('Rapport de validation','visuCRJDC'),
-           #                        ('Fichier à plat','visu_a_plat'),
+#                                   ('Fichier à plat','visu_a_plat'),
                                    ('Fichier format v6','visuJDC_py'),
                                    ('Fichier source','visu_txt_brut_JDC'),
                                    ('Paramètres Eficas','affichage_fichier_ini'),
index 5ddac94bfde51bd81b0f4a7328be0346aadcfa20..42c3b9af728e7781e3507b6f917bc868722b8143 100644 (file)
@@ -1,17 +1,23 @@
-tiny:
-       env PYTHONPATH=`pwd`:`pwd`/..:`pwd`/../Aster epydoc -n EFICASV1.5 --show-imports -o tiny_api  \
-                            ../Aster/prefs.py \
-                            ../Noyau/*.py \
-                            ../Validation/*.py \
-                            ../Ihm/*.py \
-                            ../Extensions/*.py \
-                            ../Accas/*.py \
-                            ../Editeur/*.py \
-                            ../generator/*.py \
-                            ../convert/*.py \
-                            ../convert/Parserv5/__init__.py \
-                            ../convert/Parserv5/conv.py \
-                      ../AIDE/__init__.py  ../AIDE/aide_gui.py  ../AIDE/aide_objets.py  ../AIDE/viewer.py \
-                            ../Tools/*.py \
-                            ../Tools/*/*.py \
+EFICAS=..
+
+api:
+       (export PYTHONPATH=$(EFICAS)/Aster;\
+           epydoc -n EFICAS  --show-imports -o api_eficas -u http://eficas.der.edf.fr \
+                     $(EFICAS)/Noyau/ \
+                     $(EFICAS)/Validation/ \
+                     $(EFICAS)/Ihm/ \
+                     $(EFICAS)/Extensions/ \
+                     $(EFICAS)/Accas/ \
+                     $(EFICAS)/Editeur/ \
+                     $(EFICAS)/generator/ \
+                     $(EFICAS)/convert/*.py $(EFICAS)/convert/Parserv5/__init__.py $(EFICAS)/convert/Parserv5/conv.py \
+                     $(EFICAS)/AIDE/__init__.py $(EFICAS)/AIDE/aide_gui.py $(EFICAS)/AIDE/aide_objets.py $(EFICAS)/AIDE/viewer.py \
+                     $(EFICAS)/Tools/ \
+                            )
+
+debug:                       # options -v --debug pour debugger
+       (export PYTHONPATH=$(EFICAS)/Aster;\
+           epydoc -n EFICAS  --show-imports -v --debug -o api_debug -u http://eficas.der.edf.fr \
+                     $(EFICAS)/Editeur/ \
+                            )
 
index 96f69f2b7fd60035f834cf72648058324d4134fa..104ba2d99c47b41770efc6840af0ac2fd0e9def3 100644 (file)
     L'aspect applicatif doit etre pris en charge par la classe dérivée
 """
 # Modules Python
+import os
 import sys
 import types
 import Pmw
 import Tkinter
-from tkMessageBox import showinfo,askyesno,showerror
+from widgets import showerror
 
 # Modules Eficas
 import splash
@@ -61,11 +62,15 @@ class APPLI:
       self.affiche_FAQ()
       # AY : cas ou le nom du fichier a été passé en argument
       if fichier :
-           try :
-                self.bureau.openJDC( str(MakeNomComplet.FILENAME(fichier)) )
-           except Exception,e :
-                showerror( "ARGUMENT INVALIDE", str(e) )
+           fich=str(MakeNomComplet.FILENAME(fichier))
+           if not os.path.isfile(fich):
+              showerror("Fichier inexistant", "Fichier %s en argument n'existe pas" % fich)
+           else:
+              self.bureau.openJDC( fich)
       # AY : fin
+      # PN : ajout d un attribut pour indiquer si 
+      # l appli a ete lance depuis Salome
+      self.salome=0
 
   def send_message(self,message):
       self.message=message
index ba5b9eeee65dd4c26995a4518008c534c66bfb51..b5a6d9d9eac45d7df6213589a661790c8f6f286f 100644 (file)
@@ -21,7 +21,6 @@
 """
 # Modules Python
 import os,string
-from tkFileDialog import *
 
 # Modules Eficas
 import Interp
index 82a7e402caf43dbdf1c92d8358bfcec6817c5828..226e85d79e88748e605932d3373f3e7fe57281b9 100644 (file)
@@ -24,8 +24,8 @@
 import os,string
 import traceback
 import Pmw
-from tkFileDialog import askopenfilename,asksaveasfilename
-from tkMessageBox import showinfo,askyesno,showerror
+from widgets import askopenfilename,asksaveasfilename
+from widgets import showinfo,askyesno,showerror
 
 # Modules Eficas
 import splash
@@ -244,7 +244,7 @@ class BUREAU:
                                  defaultextension=".comm",
                                  filetypes = filetypes,
                                  initialdir = self.initialdir)
-      if file != '':
+      if file :
           self.fileName = file
           e=extension_fichier(file)
           self.JDCName=stripPath(file)
@@ -327,9 +327,9 @@ class BUREAU:
       """ 
           Sauvegarde le JDC courant.
           Retourne 1 si la sauvegarde s'est bien faite, 0 sinon.
-            - Si echo = 'oui' : interactif (l'utilisateur donne le nom sous lequel il 
+          Si echo = 'oui' : interactif (l'utilisateur donne le nom sous lequel il 
                             veut sauver le JDC
-            - Si echo = 'non' : muet (sauvegarde le JDC dans JDC.procedure)
+          Si echo = 'non' : muet (sauvegarde le JDC dans JDC.procedure)
       """
       if not hasattr(self,'JDC') : return 0
       format=self.appli.format_fichier.get()
@@ -352,6 +352,15 @@ class BUREAU:
       if echo =='oui' or self.JDCDisplay_courant.fichier == None:
           return self.asknomsauvegardeJDC()
       elif self.JDCDisplay_courant.fichier != None :
+          #PN  Ajout --> Salome
+          # Pour sauvegarde dans l etude si lancement depuis salome
+          if self.appli.salome != 0:
+             import eficas_etude 
+             self.appli.salome.rangeInStudy(self.JDCDisplay_courant.fichier)
+            from panelsSalome import SALOME_UNIQUE_BASE_Panel
+            if len(SALOME_UNIQUE_BASE_Panel.dict_fichier_unite) > 0 :
+               self.appli.salome.creeConfigTxt(self.appli.CONFIGURATION.initialdir,SALOME_UNIQUE_BASE_Panel.dict_fichier_unite)
+          #PN  Fin Ajout --> Salome
           # le JDC a déjà un nom : on sauvegarde directement sans demander
           # un autre nom au développeur
           if not save_in_file(self.JDCDisplay_courant.fichier,self.jdc_fini) :
@@ -376,7 +385,16 @@ class BUREAU:
                                      filetypes = filtyp,
                                      initialdir = self.appli.CONFIGURATION.initialdir)
                                      #initialdir = self.appli.CONFIGURATION.rep_user)
-      if sauvegarde != '':
+      if sauvegarde :
+          # PN ajout --> Salome
+          # Pour sauvegarde dans l etude si lancement depuis salome
+          if self.appli.salome != 0:
+             import eficas_etude 
+             self.appli.salome.rangeInStudy(sauvegarde)
+            from panelsSalome import SALOME_UNIQUE_BASE_Panel
+            if len(SALOME_UNIQUE_BASE_Panel.dict_fichier_unite) > 0 :
+               self.appli.salome.creeConfigTxt(self.appli.CONFIGURATION.initialdir,SALOME_UNIQUE_BASE_Panel.dict_fichier_unite)
+          # PN fin ajout --> Salome
           if not save_in_file(sauvegarde,self.jdc_fini) :
               showinfo("Erreur","Problème à la sauvegarde du fichier "+`sauvegarde`)
               return 0
@@ -466,7 +484,7 @@ class BUREAU:
    def visuJDC_py(self):
       """ 
           Méthode permettant d'afficher dans une fenêtre à part l'écho au 
-          format python du jdc courant 
+            format python du jdc courant 
       """
       if not hasattr(self,'JDC') : return
       jdc_fini = self.get_text_JDC('python')
@@ -478,7 +496,7 @@ class BUREAU:
    def visuJDC(self):
       """ 
           Méthode permettant d'afficher dans une fenêtre à part l'écho au 
-          format .comm ou .py du jdc courant 
+            format .comm ou .py du jdc courant 
       """
       if not hasattr(self,'JDC') : return
       titre = 'fichier '+ self.JDCName + ' à la syntaxe '+ self.code
index b2f30f00e2ddf8ca89bf082b800c72c8ed650738..c64a6a5aa7bd6ecfa06efb1a26537af3018bbd66 100644 (file)
@@ -23,7 +23,7 @@ import sys
 import types
 import string
 import Pmw
-from tkMessageBox import showinfo,askyesno,showerror,askretrycancel
+from widgets import showinfo
 from Tkinter import *
 
 # Modules Eficas
@@ -39,7 +39,7 @@ import definition_cata
 
 #
 __version__="$Name:  $"
-__Id__="$Id: cataediteur.py,v 1.2 2002/05/15 15:31:58 eficas Exp $"
+__Id__="$Id: cataediteur.py,v 1.3.6.1 2004/03/01 11:14:09 eficas Exp $"
 #
 
 Fonte_Niveau = fontes.canvas_gras_italique
index 78d7f1952e4d5b493386275061ee86d77e811d37..4961de3b21f500ac4c598a0575b479ec91ae51b7 100644 (file)
@@ -89,7 +89,12 @@ class COMMPanel(panels.OngletPanel):
     Affiche dans self.widget_text la valeur de l'objet commentaire
     (annule d'éventuelles modifications faite par l'utilisateur)
     """
-    self.widget_text.settext(self.node.item.get_valeur())
+    t=self.node.item.get_valeur()
+    try:
+        self.widget_text.settext(unicode(t))
+    except:
+        # Si probleme avec unicode
+        self.widget_text.settext(t)
     
 class COMMTreeItem(Objecttreeitem.ObjectTreeItem):
     panel = COMMPanel
index cab37e893de20350d252da3d117387cddea6cd64..2c8875b6eac64ef2f543e98b4039066097ab724b 100644 (file)
@@ -20,7 +20,7 @@
 from Tkinter import *
 import Pmw
 import string
-from tkMessageBox import showerror
+from widgets import showerror
 
 import Objecttreeitem
 import panels
index e018495b1a4275d8a9e8c5f3dba20d6bf47c4b7d..346dc86e604054d82e417261ed21ff6ebffd0eb6 100644 (file)
@@ -27,9 +27,9 @@ d'EFICAS
 from Tkinter import *
 import Pmw
 import string
-import tkMessageBox
 
 # import modules EFICAS
+import widgets
 import panels
 import fontes
 import compooper
@@ -142,7 +142,7 @@ valeurs seront effectivement prises en compte."""
         self.parent.appli.affiche_infos("FORMULE %s modifiée" %self.node.item.get_nom())
     else:
         # la formule est incorrecte : on affiche les erreurs
-        tkMessageBox.showerror("Formule incorrecte",erreur)
+        widgets.showerror("Formule incorrecte",erreur)
         self.parent.appli.affiche_infos("FORMULE %s non modifiée" %self.node.item.get_nom())
     
   def display_valeur(self):
@@ -180,7 +180,7 @@ valeurs seront effectivement prises en compte."""
         else:
             test,erreur = self.node.item.verif_nom(nom)
         if not test:
-            tkMessageBox.showerror("Nom invalide",erreur)
+            widgets.showerror("Nom invalide",erreur)
             self.entry_nom.focus()
             self.entry_nom.selection_range(0,END)
             self.parent.appli.affiche_infos("%s n'est pas un nom valide pour une FORMULE" %nom)
@@ -198,7 +198,7 @@ valeurs seront effectivement prises en compte."""
         else:
             test,erreur = self.node.item.verif_arguments(arguments)
         if not test:
-            tkMessageBox.showerror("Argument(s) invalide(s)",erreur)
+            widgets.showerror("Argument(s) invalide(s)",erreur)
             self.entry_arg.focus()
             self.entry_arg.selection_range(0,END)
             self.parent.appli.affiche_infos("Argument(s) invalide(s) pour une FORMULE")
@@ -220,7 +220,7 @@ valeurs seront effectivement prises en compte."""
             test,erreur = self.node.item.verif_formule((new_nom,new_typ,new_arg,new_exp))
  
         if not test:
-            tkMessageBox.showerror("Corps de FORMULE invalide",erreur)
+            widgets.showerror("Corps de FORMULE invalide",erreur)
             self.entry_exp.focus()
             self.entry_exp.selection_range(0,END)
             self.parent.appli.affiche_infos("Corps de FORMULE invalide")
index 8b003a95cb6a5cea70ac805206e31a9e7c95bca2..f456ff88576147c85d1410344c35b9e651ac256a 100644 (file)
@@ -22,8 +22,6 @@ import os,sys,string
 import types
 import Tkinter
 import Pmw
-from tkFileDialog import *
-from tkMessageBox import showinfo,showerror,askyesno
 import traceback
 
 # Modules Eficas
@@ -32,11 +30,13 @@ import panels
 import fontes
 import compooper
 import convert
+from widgets import askopenfilename
 from widgets import Fenetre,FenetreYesNo
+from widgets import showinfo,showerror
 
 #
 __version__="$Name:  $"
-__Id__="$Id: compomacro.py,v 1.10 2002/11/14 12:14:20 eficas Exp $"
+__Id__="$Id: compomacro.py,v 1.11.2.1 2004/03/01 11:14:09 eficas Exp $"
 #
 
 class MACROPanel(panels.OngletPanel):
@@ -222,7 +222,7 @@ class MACROPanel(panels.OngletPanel):
          sélectionné dans self.entry 
     """
     file = askopenfilename(title="Choix du fichier %s" %self.node.item.get_nom())
-    if file != '' :
+    if file :
       self.entry.delete(0,Tkinter.END)
       self.entry.insert(0,file)
     
index 2fa34a60baa4fab2cf12712ba76a04113e9168ef..e3c7a8996fde56c537816976020aad8f9f1a88a6 100644 (file)
@@ -27,9 +27,9 @@ d'EFICAS
 from Tkinter import *
 import Pmw
 import string
-import tkMessageBox
 
 # import modules EFICAS
+import widgets
 import Objecttreeitem
 import panels
 import fontes
@@ -131,7 +131,7 @@ class PARAM_EVALPanel(panels.OngletPanel):
         self.parent.appli.affiche_infos("Expression EVAL %s modifiée" %self.node.item.get_nom())
     else:
         # la formule est incorrecte : on affiche les erreurs
-        tkMessageBox.showerror("Expression EVAL incorrecte",erreur)
+        widgets.showerror("Expression EVAL incorrecte",erreur)
         self.parent.appli.affiche_infos("Expression EVAL %s non modifiée" %self.node.item.get_nom())
     
   def display_valeur(self):
@@ -152,7 +152,7 @@ class PARAM_EVALPanel(panels.OngletPanel):
     nom = self.entry_nom.get()
     test,erreur = self.node.item.verif_nom(nom)
     if not test :
-        tkMessageBox.showerror("Nom invalide",erreur)
+        widgets.showerror("Nom invalide",erreur)
         self.entry_nom.focus()
         self.entry_nom.selection_range(0,END)
         self.parent.appli.affiche_infos("Nom du paramètre refusé")
@@ -166,7 +166,7 @@ class PARAM_EVALPanel(panels.OngletPanel):
     exp_eval = self.entry_val.get()
     test,erreur = self.node.item.verif_eval(exp_eval)
     if not test:
-        tkMessageBox.showerror("Expression EVAL invalide",erreur)
+        widgets.showerror("Expression EVAL invalide",erreur)
         self.entry_val.focus()
         self.entry_val.selection_range(0,END)
         self.parent.appli.affiche_infos("Expression EVAL refusée")
index b8aaba32ad871531964cc9838fbfa297d15ca137..6646c54a17f6048e3e9f7f7364d0f830a35e8891 100644 (file)
@@ -21,8 +21,6 @@
 import string,types,os
 from Tkinter import *
 import Pmw
-from tkFileDialog import *
-from tkMessageBox import showinfo
 from copy import copy,deepcopy
 import traceback
 
@@ -37,1406 +35,37 @@ from widgets import FenetreDeSelection
 from Noyau.N_CR import justify_text
 from utils import substract_list
 
-
-class newSIMPPanel(panels.OngletPanel):
-  """
-  Classe virtuelle servant de classe mère à toutes les classes Panel
-  servant à afficher et récupérer la valeur d'un mot-clé simple.
-  Le panel est différent suivant le type de la valeur attendu
-  """
-  def init(self):
-      """
-      Méthode appelée par le constructeur de OngletPanel :
-      construit le notebook à 2 onglets utilisé par tous les panels de
-      tous les mots-clés simples
-      """
-      nb = Pmw.NoteBook(self,raisecommand=self.raisecmd)
-      nb.pack(fill = 'both', expand = 1)
-      self.nb=nb
-      nb.add('Valeur', tab_text='Saisir valeur')
-      #nb.add('Commentaire',tab_text='Insérer commentaire')
-      self.makeValeurPage(nb.page('Valeur'))
-      #self.makeCommentairePage(nb.page("Commentaire"))
-      nb.setnaturalsize()
-      
-# ----------------------------------------------------------------------------------------
-#   Méthodes utilisées pour l'affectation de la valeur donnée par l'utilisateur
-#    au mot-clé courant
-# ----------------------------------------------------------------------------------------
-
-  def reset_old_valeur(self,name=None,mess='Valeur du mot-clé enregistrée'):
-      """
-          Enregistre  val comme valeur de self.node.item.object SANS 
-          faire de test de validité ni ré-évaluer l'ancienne valeur
-          permet de rester avec des valeurs non entrees et de ne pas 
-          ré-évaluer des entiers par exemple
-      """
-      if self.parent.modified == 'n' : self.parent.init_modif()
-      self.node.item.set_valeur(name)
-      self.parent.appli.affiche_infos(mess)
-      if self.node.item.get_position()=='global':
-           self.node.etape.verif_all()
-      elif self.node.item.get_position()=='global_jdc':
-           self.node.racine.verif_all()
-      else :
-           self.node.parent.verif()
-      self.node.update()
-
-  def record_valeur(self,name=None,mess='Valeur du mot-clé enregistrée'):
-      """
-          Enregistre  val comme valeur de self.node.item.object  
-         en evaluant l item et en le validant 
-      """
-      if self.parent.modified == 'n' : self.parent.init_modif()
-      if name != None:
-          valeur = name
-          validite = 1
-      else :
-          valeurentree= self.entry.get()
-          self.entry.delete(0,END)
-          if valeurentree == '': valeurentree=None
-          valeur,validite=self.node.item.eval_valeur(valeurentree)
-          if not validite :
-               valeur= self.entry.get()
-                commentaire = "impossible d'évaluer : %s " %`valeurentree`
-               self.parent.appli.affiche_infos(commentaire)
-               
-      if validite : 
-         if self.node.item.is_list() :
-            validite=self.node.item.valide_liste_complete(valeur)
-            commentaire=self.node.item.info_erreur_liste()
-         else :
-           validite=self.node.item.valide_item(valeur)
-            commentaire=self.node.item.info_erreur_item()
-      if validite :
-          self.node.item.set_valeur(valeur)
-          self.parent.appli.affiche_infos(mess)
-          if self.node.item.get_position()=='global':
-              self.node.etape.verif_all()
-          elif self.node.item.get_position()=='global_jdc':
-              self.node.racine.verif_all()
-          else :
-              self.node.parent.verif()
-          self.node.update()
-          if self.node.item.isvalid():
-              self.node.parent.select()
-      else :
-          self.parent.appli.affiche_infos(commentaire)
-
-# ----------------------------------------------------------------------------------------
-#   Méthodes utilisées pour la manipulation des items dans les listes de choix
-# ----------------------------------------------------------------------------------------
-  def selectValeur(self,name):
-      self.selected_valeur = name
-
-  def deselectValeur(self,name):
-      self.selectValeur = None
-
-  def sup_valeur(self,name=None):
-      """
-      Supprime la valeur selectionnée de la liste des valeurs et la rajoute
-      à la liste des choix possibles
-      """
-      if hasattr(self,'selected_valeur') :
-         if ( self.selected_valeur != None and self.selected_valeur != ''):
-            liste_valeurs = self.Liste_valeurs.get_liste()
-            liste_valeurs.remove(self.selected_valeur)
-            self.Liste_valeurs.put_liste(liste_valeurs)
-            listeActuelle=self.Liste_valeurs.get_liste()
-            liste_choix=self.node.item.get_liste_possible(listeActuelle)
-            self.Liste_choix.put_liste(liste_choix)
-            self.selected_valeur = None
-
-  def add_choix(self,name=None):
-      """
-      Ajoute le choix selectionné à la liste des valeurs et le retire
-      de la liste des choix possibles
-      """
-      
-      if hasattr(self,'selected_choix') :
-         if (self.selected_choix != None and self.selected_choix != ''):
-            min,max = self.node.item.GetMinMax()
-            liste_valeurs = self.Liste_valeurs.get_liste()
-            if len(liste_valeurs) >= max :
-                self.parent.appli.affiche_infos("La liste ne peut pas avoir plus de %d éléments" %max)
-                return
-            liste_valeurs.append(self.selected_choix)
-            self.Liste_valeurs.put_liste(liste_valeurs)
-            listeActuelle=self.Liste_valeurs.get_liste()
-            liste_choix=self.node.item.get_liste_possible(listeActuelle)
-            self.Liste_choix.put_liste(liste_choix)
-            self.selected_choix = None
-
-  def selectChoix(self,name):
-      self.selected_choix = name
-
-  def deselectChoix(self,name):
-      self.selectChoix = None
-      
-  def raisecmd(self,page):
-      try:
-         self.entry.focus()
-      except:
-         pass
-
-class SHELLPanel(newSIMPPanel):
-  """
-  Classe Panel utilisé pour les mots-clés simples qui attendent un shell pour valeur
-  """
-
-  def makeValeurPage(self,page):
-      """ 
-      Affiche la page concernant l'objet pointé par self qui attend un shell
-      """
-      objet_mc = self.node.item.get_definition()
-      aide = self.gen_aide()
-      aide = justify_text(texte=aide)
-      self.frame = Frame(page)
-      self.frame.place(relx=0,rely=0,relwidth=1,relheight=1)
-      label_aide = Label(self.frame,text = aide)
-      label_aide.place(relx=0.5,rely=0.1,anchor='center')
-      self.text = Text(self.frame,bg='gray95')
-      self.text.place(relx=0.2,rely=0.2,relwidth=0.6,relheight=0.6)
-      but_val = Button(self.frame,text='Valider',command = self.valide_shell)
-      but_ann = Button(self.frame,text='Annuler',command = self.annule_shell)
-      but_val.place(relx=0.35,rely=0.9,anchor='center')
-      but_ann.place(relx=0.65,rely=0.9,anchor='center')
-      self.display_valeur()
-
-  def gen_aide(self):
-      """
-      Retourne une chaîne de caractères d'aide sur la valeur qu'attend l'objet
-      pointé par self
-      """
-      return "Un shell est attendu"
-    
-  def valide_shell(self,event=None):
-      """
-      Récupère la valeur saisie par l'utilisateur dans self.text
-      et la stocke dans l'objet MCSIMP courant
-      """
-      texte = self.text.get(1.0,END)
-      self.record_valeur(texte)
-
-  def annule_shell(self,event=None):
-      """
-      Annule toute saisie dans self.text
-      """
-      self.text.delete(0,END)
-
-  def display_valeur(self,val=None):
-      """
-      Affiche la valeur de l'objet pointé par self
-      """
-      if val != None :
-          valeur = val
-      else:
-          valeur = self.node.item.get_valeur()
-      if valeur == None  or valeur == '': return
-      self.text.insert(END,valeur)
-
-class PLUSIEURS_Panel(newSIMPPanel):
-  """
-  Classe virtuelle servant de classe mère à toutes celles définissant
-  un panneau pour un mot-clé simple qui attend une liste de valeurs
-  """
-  def accepte_modifs_valeur(self,min,max):
-      """
-      Méthode qui récupère la liste des valeurs donnée par l'utilisateur
-      et l'affecte au mot-clé courant.
-      """
-      l1_valeurs = self.Liste_valeurs.get_liste()
-      l_valeurs=[]
-      for  val in l1_valeurs :
-        if val != '' and val != None :
-           l_valeurs.append(val)
-    
-      longueur = len(l_valeurs)
-      if longueur < min or longueur > max :
-          self.parent.appli.affiche_infos("Valeur refusée : nombre d'éléments incorrect dans la liste")
-          return
-      if longueur > 1:
-         valeur = tuple(l_valeurs)
-      elif longueur == 1:
-         valeur = l_valeurs[0]
-      else:
-         valeur = None
-
-      self.parent.appli.affiche_infos("Valeur acceptée")
-      self.record_valeur(valeur)
-      #if self.node.item.isvalid():
-      #    self.node.parent.select()
-      # fermeture de la fenêtre de sélection
-      if self.ajout_valeurs:
-          self.ajout_valeurs.quit()
-          
-  def annule_modifs_valeur(self):
-      """
-      RAZ de la liste des valeurs (annule toutes les valeurs saisies par l'utilisateur)
-      """
-      self.node.select()
-      # fermeture de la fenêtre de sélection
-      if self.ajout_valeurs:
-          self.ajout_valeurs.quit()
-          
-  def add_valeur_sans_into(self,name=None,encorevalide=1):
-      """
-      Lit ce que l'utilisateur a saisi dans self.entry et cherche à
-      l'évaluer :
-        - si la valeur est acceptable, elle est ajoutée dans la liste des valeurs
-        - sinon elle est refusée
-      encorevalide vaut 1 si le validateur trouve l item et la liste correctes
-                        0 si le validateur trouve la valeur de l item incorrecte
-                       -1 si le validateur trouve la liste incorrecte
-      """
-
-      commentaire="Valeur incorrecte : ajout à la liste refusé"
-      testvalide=1
-
-      # Lecture de la zone de saisie et evaluation si nécessaire
-      if name != None :
-         valeur = name
-      else:
-         valeurentree = self.get_valeur()
-         if valeurentree == '': valeur=None
-         valeurentree,testvalide=self.node.item.eval_valeur(valeur)
-         if (not testvalide) :
-            commentaire = "impossible d'évaluer : %s " %`valeurentree`
-
-      # Pas de traitement des valeurs nulles ( a priori clic involontaire
-      if (valeur == None or valeur =="") :
-          commentaire = "Pas de saisie des valeurs nulles"
-          encorevalide = -2 
-          testtype=0
-      else :
-          testtype = self.node.item.object.verif_type(valeur)
-          if not testtype :
-            commentaire ="Type de la valeur incorrecte"
-            encorevalide=-2
-               
-      if (encorevalide ==0) :
-         commentaire=self.node.item.info_erreur_item()
-      if (encorevalide == -1) :
-         commentaire=self.node.item.info_erreur_liste()
-        # On traite le cas ou la liste n est pas valide pour un pb de cardinalite
-         min,max = self.node.item.GetMinMax()
-         if len(self.Liste_valeurs.get_liste()) >= max : 
-            commentaire="La liste a déjà atteint le nombre maximum d'éléments,ajout refusé"
-
-      if testvalide and (encorevalide == 1):
-         min,max = self.node.item.GetMinMax()
-
-         if testtype :
-            liste_valeurs = self.Liste_valeurs.get_liste()
-            if len(liste_valeurs) >= max :
-                commentaire="La liste a déjà atteint le nombre maximum d'éléments,ajout refusé"
-            else :
-               liste_valeurs.append(valeur)
-               self.Liste_valeurs.put_liste(liste_valeurs)
-               self.erase_valeur()
-               commentaire="Nouvelle valeur acceptée"
-         else :
-            commentaire ="Type de la valeur incorrecte"
-
-      #self.erase_valeur()
-      self.parent.appli.affiche_infos(commentaire)
-
-  def sup_valeur_sans_into(self,name=None):
-      """
-      Méthode qui sert à retirer de la liste des valeurs la valeur sélectionnée
-      """
-      liste_valeurs = self.Liste_valeurs.get_liste()
-      try:
-          liste_valeurs.remove(self.selected_valeur)
-      except:
-          # la valeur sélectionnée n'est pas dans la liste
-          return
-      self.Liste_valeurs.put_liste(liste_valeurs)
-      self.display_valeur(self.selected_valeur)
-      self.selected_valeur = None      
-
-  def display_valeur(self,val=None):
-      """
-      Affiche la valeur passée en argument dans l'entry de saisie.
-      Par défaut affiche la valeur du mot-clé simple
-      """
-      if not val :
-          valeur = self.node.item.getval()
-      else:
-          valeur = val
-      self.entry.delete(0,END)
-      if not valeur : return
-      self.entry.insert(0,str(valeur))
-      
-            
-class PLUSIEURS_INTO_Panel(PLUSIEURS_Panel):
-  """
-  Classe servant à définir le panneau permettant d'afficher et de saisir une
-  liste de valeurs à choisir parmi une liste discrètes de valeurs possibles
-  """
-  def makeValeurPage(self,page):
-      """
-      Génère la page de saisie de plusieurs valeurs parmi un ensemble discret
-      de possibles
-      """
-      self.ajout_valeurs = None
-      # On récupère la bulle d'aide du panneau, l'objet, min et max (cardinalité de la liste),
-      # la liste des choix et la liste des valeurs
-      aide = self.get_aide()
-      aide = justify_text(texte=aide)
-      bulle_aide=self.get_bulle_aide()
-      objet_mc = self.node.item.get_definition()
-      min,max = self.node.item.GetMinMax()
-      #l_choix=list(objet_mc.into)
-      l_valeurs = self.node.item.GetListeValeurs()
-      l_choix= self.node.item.get_liste_possible(l_valeurs)
-      # reinitialisation de l_valeurs
-      l_valeurs = self.node.item.GetListeValeurs()
-
-      # remplissage du panneau
-      self.frame_valeurs = Frame(page)
-      self.frame_valeurs.place(relx=0.05,rely=0.05,relwidth=0.35,relheight=0.7)
-      self.frame_boutons_fleches = Frame(page)
-      self.frame_boutons_fleches.place(relx=0.4,rely=0.,relwidth=0.2,relheight=0.7)
-      self.frame_choix = Frame(page)
-      self.frame_choix.place(relx=0.6,rely=0.05,relwidth=0.35,relheight=0.7)
-      self.frame_boutons = Frame(page)
-      self.frame_boutons.place(relx=0.35,rely=0.87,relwidth=0.3,relheight=0.1)
-      self.frame_aide = Frame(page)
-      self.frame_aide.place(relx=0.1,rely=0.75,relwidth=0.9,relheight=0.1)
-      liste_commandes_valeurs = (("<Button-1>",self.selectValeur),
-                                 ("<Button-3>",self.deselectValeur),
-                                 ("<Double-Button-1>",self.sup_valeur))
-      liste_commandes_choix = (("<Button-1>",self.selectChoix),
-                               ("<Button-3>",self.deselectChoix),
-                               ("<Double-Button-1>",self.add_choix))
-      self.Liste_valeurs = ListeChoix(self,self.frame_valeurs,
-                                      l_valeurs,liste_commandes = liste_commandes_valeurs,
-                                      titre="Valeur(s) actuelle(s)")
-      self.Liste_choix = ListeChoix(self,self.frame_choix,l_choix,
-                                    liste_commandes = liste_commandes_choix,
-                                    titre= "Valeurs possibles")
-      bouton_add = Button(self.frame_boutons_fleches,
-                          #text="<--",
-                          image = images.get_image('arrow_left'),
-                          command = self.add_choix)
-      bouton_sup = Button(self.frame_boutons_fleches,
-                          #text="-->",
-                          image = images.get_image('arrow_right'),
-                          command = self.sup_valeur)
-      bouton_accepter = Button(self.frame_boutons,
-                               text='Valider',
-                               command = lambda s=self,m=min,M=max : s.accepte_modifs_valeur(m,M))
-      bouton_annuler = Button(self.frame_boutons,
-                              text = 'Annuler',
-                              command = self.annule_modifs_valeur)
-      bouton_add.place(relx=0.3,rely=0.35)
-      bouton_sup.place(relx=0.3,rely=0.65)
-      for but in (bouton_accepter,bouton_annuler):
-          but.pack(side='left',padx=5)
-      self.Liste_valeurs.affiche_liste()
-      self.Liste_choix.affiche_liste()
-      for fram in (self.frame_valeurs,self.frame_boutons_fleches,self.frame_choix,self.frame_boutons):
-          fram.bind("<Button-3>",lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a))
-          fram.bind("<ButtonRelease-3>",self.parent.appli.efface_aide)
-      self.frame_aide.update()
-      self.aide = Label(self.frame_aide,
-                        text = aide,
-                        justify='center',
-                        anchor='center',
-                       wraplength=int(self.frame_aide.winfo_width()*0.8))
-      self.aide.place(relx=0.5,rely=0.5,anchor='center',relwidth=1)
-
-  def get_aide(self):
-      """
-      Retourne la phrase d'aide indiquant de quel type de base doivent être les valeurs
-      que saisit l'utilisateur
-      """
-      commentaire=""
-      mc = self.node.item.get_definition()
-      d_aides = { 'TXM' : 'chaînes de caractères',
-                  'R'   : 'réels',
-                  'I'   : 'entiers',
-                  'C'   : 'complexes'}
-      type = mc.type[0]
-      if not d_aides.has_key(type) : 
-        if mc.min == mc.max:
-           return str(mc.min)+" valeur(s) est(sont) attendue(s)"
-         else :
-           return "entrez entre "+str(mc.min)+" et "+str(mc.max)+" valeurs"
-      if mc.min == mc.max:
-           commentaire="Une liste de "+str(mc.min)+" "+d_aides[type]+" est attendue"
-      else :
-           commentaire="Entre "+str(mc.min)+" et "+str(mc.max)+" valeurs de type  "+d_aides[type]+" sont attendues"
-      aideval=self.node.item.aide()
-      commentaire=commentaire + "\n" + aideval
-      return commentaire
-
-  def get_bulle_aide(self):
-      """
-      Retourne la bulle d'aide du panneau (affichée par clic droit)
-      """
-      return """Un clic sur une valeur des deux listes la sélectionne.
-      - Un clic sur la flèche gauche stocke la valeur possible sélectionnée
-      dans la liste des valeurs que vous voulez affecter au mot-clé simple
-      - Un clic sur la flèche droite déstocke la valeur du mot-clé simple
-      sélectionnée (elle apparaît alors à nouveau comme choix possible
-      dans la liste des choix à droite)
-      - Cliquez sur 'Valider' pour affecter la liste des valeurs sélectionnées
-      au mot-clé simple courant
-      - Cliquez sur 'Annuler' pour restaurer la valeur du mot-clé simple
-      avant toute modification depuis le dernier 'Valider'"""
-
-class PLUSIEURS_BASE_Panel(PLUSIEURS_Panel):
-  """
-  Classe définissant le panel associé aux mots-clés qui demandent
-  à l'utilisateur de donner une liste de valeurs qui ne sont pas
-  à choisir dans une liste discrètes et qui sont de type de base :
-  entier, réel, string,...
-  """
-  def makeValeurPage(self,page):
-      """
-      Crée la page de saisie d'une liste de valeurs à priori quelconques,
-      cad qui ne sont  pas à choisir dans une liste prédéfinie
-      """
-      # On récupère la bulle d'aide du panneau, l'objet, l'aide,min et max (cardinalité de la liste),
-      # et la liste des valeurs déjà affectées à l'objet courant
-      bulle_aide=self.get_bulle_aide()
-      objet_mc = self.node.item.get_definition()
-      aide = self.get_aide()
-      aide = justify_text(texte=aide)
-      min,max = self.node.item.GetMinMax()
-      l_valeurs = self.node.item.GetListeValeurs()
-
-      # création des frames globales
-      self.frame1 = Frame(page,relief='groove',bd=2)
-      self.frame2 = Frame(page)
-      self.frame1.place(relx=0.,rely=0.,relwidth=1.,relheight=0.85)
-      self.frame2.place(relx=0.,rely=0.85,relwidth=1,relheight=0.15)
-      self.frame_right = Frame(self.frame1)
-      self.frame_right.place(relx=0.35,rely=0.,relwidth=0.65,relheight=1.)
-
-      # création des frames internes
-      self.frame_valeurs = Frame(self.frame1)
-      self.frame_valeurs.place(relx=0.02,rely=0.05,relwidth=0.35,relheight=0.95)
-      self.frame_boutons_fleches = Frame(self.frame_right)
-      self.frame_boutons_fleches.place(relx=0.,rely=0.2,relwidth=0.2,relheight=0.5)
-      self.frame_choix = Frame(self.frame_right)
-      self.frame_choix.place(relx=0.2,rely=0.2,relwidth=0.7,relheight=0.5)
-      self.frame_aide = Frame(self.frame_right)
-      self.frame_aide.place(relx=0.1,rely=0.7,relwidth=0.8,relheight=0.3)
-      self.frame_boutons = Frame(self.frame2)
-      self.frame_boutons.place(relx=0.35,rely=0.,relwidth=0.3,relheight=1.)
-      for fram in (self.frame1,self.frame2,self.frame_right,self.frame_valeurs,
-                 self.frame_boutons_fleches,self.frame_choix,self.frame_aide,self.frame_boutons):
-          fram.bind("<Button-3>",lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a))
-          fram.bind("<ButtonRelease-3>",self.parent.appli.efface_aide)
-
-      # création des objets dans les frames
-      liste_commandes_valeurs = (("<Button-1>",self.selectValeur),
-                                 ("<Button-3>",self.deselectValeur),
-                                 ("<Double-Button-1>",self.sup_valeur_sans_into))
-      self.Liste_valeurs = ListeChoix(self,self.frame_valeurs,l_valeurs,liste_commandes = liste_commandes_valeurs,
-                                      titre="Valeur(s) actuelle(s)")
-
-      # Création de l'entry ou de la liste des SD
-      self.label = Label(self.frame_choix,text="Valeur :")
-      # PN : pour ajouter les validators
-      self.make_entry(frame = self.frame_choix,command = self.add_valeur_plusieurs_base)
-      self.label.place(relx=0.05,rely=0.5)
-
-      # Création d'un bouton "Importer ..." sur le panel.
-      bouton_valeurs_fichier = Button(self.frame_choix,
-                                      text="Importer ...",
-                                      command=self.select_in_file)
-      bouton_valeurs_fichier.place(relx=0.28,rely=0.7,relwidth=0.6)
-      self.ajout_valeurs = None
-
-      # boutons Ajouter et Supprimer
-      bouton_add = Button(self.frame_boutons_fleches,
-                          image = images.get_image('arrow_left'),
-                          command = self.add_valeur_plusieurs_base)
-      bouton_sup = Button(self.frame_boutons_fleches,
-                          image = images.get_image('arrow_right'),
-                          command = self.sup_valeur_sans_into)
-      bouton_add.place(relx=0.3,rely=0.35)
-      bouton_sup.place(relx=0.3,rely=0.65)
-      # affichage de l'aide
-      self.frame_aide.update()
-      self.aide = Label(self.frame_aide,
-                        text = aide,
-                        justify='center',
-                        anchor='center',
-                       wraplength=int(self.frame_aide.winfo_width()*0.8))
-      self.aide.place(relx=0.5,rely=0.5,anchor='center',relwidth=1)
-      self.Liste_valeurs.affiche_liste()
-      # boutons Accepter et Annuler
-      bouton_accepter = Button(self.frame_boutons,
-                               text='Valider',
-                               command = lambda s=self,m=min,M=max : s.accepte_modifs_valeur(m,M))
-      bouton_annuler = Button(self.frame_boutons,
-                              text = 'Annuler',
-                              command = self.annule_modifs_valeur)
-      for but in (bouton_accepter,bouton_annuler):
-          but.pack(side='left',padx=5)
-
-  def add_valeur_plusieurs_base(self,name=None):
-      if name != None :
-         valeur = name
-      else:
-         valeurentree = self.get_valeur()
-         if valeurentree == '': valeur=None
-         valeur,validite=self.node.item.eval_valeur(valeurentree)
-         if not validite :
-            commentaire = "impossible d'évaluer : %s " %`valeurentree`
-            self.parent.appli.affiche_infos(commentaire)
-            return
-
-      encorevalide=self.node.item.valide_item(valeur)
-      if encorevalide :
-         listecourante=self.Liste_valeurs.get_liste()
-         encorevalide=self.node.item.valide_liste_partielle(valeur,listecourante)
-         if not encorevalide : encorevalide = -1
-      self.add_valeur_sans_into(valeur,encorevalide)
-    
-  def select_in_file(self):
-      """ Permet d'ouvrir un fichier choisi par l'utilisateur. """
-      nom_fichier = askopenfilename(title="Choix fichier :")
-      if nom_fichier == "":
-          return
-      try:
-          f = open(nom_fichier, "rb")
-          selection_texte = f.read()
-          f.close()
-          self.ajout_valeurs = FenetreDeSelection(self, 
-                                                 self.node.item,
-                                                 self.parent.appli,
-                                                 titre="Sélection de valeurs",
-                                                 texte=selection_texte)
-      except:
-          traceback.print_exc()
-          showinfo("Erreur de fichier","impossible d'ouvir le fichier "+nom_fichier)
-          
-  def get_bulle_aide(self):
-      """
-      Retourne l'aide associée au panneau courant
-      """
-      return """Taper dans la boîte de saisie de droite la valeur que
-      vous voulez affecter au mot-clé simple.
-      - Cliquez sur la flèche gauche ou pressez <Return> pour la faire glisser
-      dans la liste des valeurs que vous voulez affecter au mot-clé simple
-      - Un clic sur une valeur de la liste la sélectionne
-      - Un clic sur la flèche droite ou un double-clic retire la valeur
-      sélectionnée de la liste
-      - Cliquez sur 'Valider' pour que la nouvelle valeur désirée soit affectée
-      au mot-clé simple
-      - Cliquez sur 'Annuler' pour annuler toutes les modifications faites
-      depuis le dernier clic sur 'Valider'"""
-
-  def get_aide(self):
-      """
-      Retourne la phrase d'aide indiquant de quel type de base doivent être les valeurs
-      que saisit l'utilisateur
-      """
-      commentaire=""
-      mc = self.node.item.get_definition()
-      d_aides = { 'TXM' : 'chaînes de caractères',
-                  'R'   : 'réels',
-                  'I'   : 'entiers',
-                  'C'   : 'complexes'}
-      type = mc.type[0]
-      if not d_aides.has_key(type) : return 'Type de base inconnu'
-      if mc.min == mc.max:
-          commentaire="Une liste de "+d_aides[type]+" chaînes de caractères est attendue"
-      else :
-          commentaire="Une liste de "+d_aides[type]+" est attendue (min="+`mc.min`+",max="+`mc.max`+')'
-      aideval=self.node.item.aide()
-      commentaire=commentaire +"\n"+aideval
-      return commentaire
-
-  def make_entry(self,frame,command):
-      """
-      Crée l'entry de saisie de la valeur souhaitée : distingue le
-      cas d'un complexe attendu, d'une autre valeur quelconque
-      """
-      if self.node.item.wait_complex():
-          self.typ_cplx=StringVar()
-          self.typ_cplx.set('RI')
-          rb1 = Radiobutton(frame, text='RI',variable=self.typ_cplx,value='RI')
-          rb2 = Radiobutton(frame, text='MP',variable=self.typ_cplx,value='MP')
-          self.entry1 = Pmw.EntryField(frame,validate='real')
-          self.entry2 = Pmw.EntryField(frame,validate='real')
-          rb1.place(relx=0.05,rely = 0.4)
-          rb2.place(relx=0.05,rely = 0.6)
-          self.entry1.component('entry').bind("<Return>",lambda e,s=self:s.entry2.component('entry').focus)
-          self.entry2.component('entry').bind("<Return>",lambda e,c=command:c())
-          self.entry1.place(relx=0.27,rely = 0.5,relwidth=0.35)
-          self.entry2.place(relx=0.65,rely = 0.5,relwidth=0.35)
-          self.entry1.focus()
-      else:
-          self.entry = Entry(frame,relief='sunken')
-          self.entry.place(relx=0.28,rely=0.5,relwidth=0.6)
-          self.entry.bind("<Return>",lambda e,c=command:c())
-          self.entry.focus()
-
-  def get_valeur(self):
-      """
-      Retourne la valeur saisie par l'utilisateur dans self.entry
-      """
-      return self.entry.get()
-
-  def erase_valeur(self):
-      """
-      Efface la valeur donnée par l'utilisateur dans l'entry
-      """
-      self.entry.delete(0,END)
-        
-class PLUSIEURS_ASSD_Panel(PLUSIEURS_Panel):
-  """
-  Classe définissant le panel associé aux mots-clés qui demandent
-  à l'utilisateur de donner une liste de valeurs qui ne sont pas
-  à choisir dans une liste discrètes et qui sont de type dérivé d'ASSD
-  """
-  def makeValeurPage(self,page):
-      """
-      Génère la page de saisie de plusieurs noms de SD parmi un ensemble discret
-      de SD possibles, cad d'un type cohérent avec les types attendus par le mot-clé simple
-      """
-      # On récupère la bulle d'aide du panneau, l'objet, l'aide, min et max (cardinalité de la liste),
-      # la liste des valeurs déjà affectées à l'objet courant et la liste des SD du bon type
-      bulle_aide=self.get_bulle_aide()
-      self.ajout_valeurs=None
-      objet_mc = self.node.item.get_definition()
-      aide = self.get_aide()
-      aide = justify_text(texte=aide)
-      min,max = self.node.item.GetMinMax()
-      l_valeurs = self.node.item.GetListeValeurs()
-      l_choix=self.node.item.get_sd_avant_du_bon_type()
-      l_choix.sort()
-      # remplissage du panneau
-      self.frame_valeurs = Frame(page)
-      self.frame_valeurs.place(relx=0.05,rely=0.05,relwidth=0.35,relheight=0.7)
-      self.frame_boutons_fleches = Frame(page)
-      self.frame_boutons_fleches.place(relx=0.4,rely=0.,relwidth=0.2,relheight=0.7)
-      self.frame_choix = Frame(page)
-      self.frame_choix.place(relx=0.6,rely=0.05,relwidth=0.35,relheight=0.7)
-      self.frame_boutons = Frame(page)
-      self.frame_boutons.place(relx=0.35,rely=0.87,relwidth=0.3,relheight=0.1)
-      liste_commandes_valeurs = (("<Button-1>",self.selectValeur),
-                                 ("<Button-3>",self.deselectValeur),
-                                 ("<Double-Button-1>",self.sup_valeur_sans_into))
-      liste_commandes_choix = (("<Button-1>",self.selectChoix),
-                               ("<Button-3>",self.deselectChoix),
-      #                         ("<Double-Button-1>",self.add_valeur_sans_into))
-                               ("<Double-Button-1>",self.add_eval_valeur_sans_into))
-      self.Liste_valeurs = ListeChoix(self,self.frame_valeurs,l_valeurs,liste_commandes = liste_commandes_valeurs,
-                                      titre="Valeur(s) actuelle(s)")
-      self.Liste_choix = ListeChoix(self,self.frame_choix,l_choix,liste_commandes = liste_commandes_choix,
-                                    titre= "Valeurs possibles")
-      bouton_add = Button(self.frame_boutons_fleches,
-                          #text="<--",
-                          image = images.get_image('arrow_left'),
-      #                    command = self.add_valeur_sans_into)
-                          command = self.add_eval_valeur_sans_into)
-      bouton_sup = Button(self.frame_boutons_fleches,
-                          #text="-->",
-                          image = images.get_image('arrow_right'),
-                          command = self.sup_valeur_sans_into)
-      bouton_accepter = Button(self.frame_boutons,
-                               text='Valider',
-                               command = lambda s=self,m=min,M=max : s.accepte_modifs_valeur(m,M))
-      bouton_annuler = Button(self.frame_boutons,
-                              text = 'Annuler',
-                              command = self.annule_modifs_valeur)
-      bouton_add.place(relx=0.3,rely=0.35)
-      bouton_sup.place(relx=0.3,rely=0.65)
-      for but in (bouton_accepter,bouton_annuler):
-          but.pack(side='left',padx=5)
-      self.Liste_valeurs.affiche_liste()
-      self.Liste_choix.affiche_liste()
-      for fram in (self.frame_valeurs,self.frame_boutons_fleches,self.frame_choix,self.frame_boutons):
-          fram.bind("<Button-3>",lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a))
-          fram.bind("<ButtonRelease-3>",self.parent.appli.efface_aide)
-  
-  def add_eval_valeur_sans_into(self,valeurentree=None):
-      valeur,validite=self.node.item.eval_valeur(valeurentree)
-      if not validite :
-             commentaire = "impossible d'évaluer : %s " %`valeurentree`
-             self.parent.appli.affiche_infos(commentaire)
-             return
-      self.add_valeur_sans_into(valeur)
-
-  def get_bulle_aide(self):
-      """
-      Retourne la bulle d'aide associée au panneau
-      """
-      return """Un clic sur une valeur des deux listes la sélectionne.
-      - Un clic sur la flèche gauche stocke la valeur possible sélectionnée
-      dans la liste des valeurs que vous voulez affecter au mot-clé simple
-      - Un clic sur la flèche droite déstocke la valeur du mot-clé simple
-      sélectionnée (elle apparaît alors à nouveau comme choix possible
-      dans la liste des choix à droite)
-      - Cliquez sur 'Valider' pour affecter la liste des valeurs sélectionnées
-      au mot-clé simple courant
-      - Cliquez sur 'Annuler' pour restaurer la valeur du mot-clé simple
-      avant toute modification depuis le dernier 'Valider'"""
-
-  def get_aide(self):
-      """
-      Retourne la phrase d'aide indiquant de quel type doivent être les
-      valeurs que doit entrer l'utilisateur
-      """
-      commentaire=""
-      mc = self.node.item.get_definition()
-      type = mc.type[0].__name__  
-      if len(mc.type)>1 :
-          for typ in mc.type[1:] :
-              type = type + ' ou '+typ.__name__
-      if mc.min == mc.max:
-        commentaire="Une liste de "+`mc.min`+" objets de type "+type+" est attendue"
-      else :
-        commentaire="Une liste d'objets de type "+type+" est attendue (min="+`mc.min`+",max="+`mc.max`+')'
-      aideval=self.node.item.aide()
-      commentaire=commentaire +"\n"+ aideval
-      return commentaire
-
-    
-  def sup_valeur(self,name=None):
-      """
-      Supprime la valeur selectionnée de la liste des valeurs et la rajoute
-      à la liste des choix possibles
-      """
-      liste_valeurs = self.Liste_valeurs.get_liste()
-      liste_valeurs.remove(self.selected_valeur)
-      liste_choix = self.node.item.get_definition().into
-      liste_choix = substract_list(liste_choix,liste_valeurs)
-      self.Liste_valeurs.put_liste(liste_valeurs)
-      self.Liste_choix.put_liste(liste_choix)
-      self.selected_valeur = None      
-    
-  def erase_valeur(self):
-      pass
-
-  def get_valeur(self):
-      """
-      Retourne la valeur sélectionnée dans la liste des choix
-      """
-      return self.selected_choix
-
-  def display_valeur(self,val=None):
-      """
-         Affiche la valeur passée en argument dans l'entry de saisie.
-         Par défaut affiche la valeur du mot-clé simple
-      """
-      # Il n'y a pas d'entry pour ce type de panneau
-      return
-
-    
-class UNIQUE_Panel(newSIMPPanel):
-  """
-  Classe virtuelle servant de classe mère à toutes celles définissant un panneau
-  permettant l'affichage et la saisie d'une valeur unique pour le mot-clé simple
-  """
-
-  def erase_valeur(self):
-      """
-      Efface l'entry de saisie
-      """
-      self.entry.delete(0,END)
-
-  def get_valeur(self):
-      """
-      Retourne la valeur donnée par l'utilisateur
-      """
-      return self.entry.get()
-    
-  def valid_valeur(self):
-      """
-      Teste si la valeur fournie par l'utilisateur est une valeur permise :
-      - si oui, l'enregistre
-      - si non, restaure l'ancienne valeur
-      """
-      if self.parent.modified == 'n' : self.parent.init_modif()
-      anc_val = self.node.item.get_valeur()
-      valeurentree = self.get_valeur()
-      self.erase_valeur()
-      valeur,validite=self.node.item.eval_valeur(valeurentree)
-      if not validite :
-             commentaire = "impossible d'évaluer : %s " %`valeurentree`
-             self.parent.appli.affiche_infos(commentaire)
-             return
-   
-      test = self.node.item.set_valeur(valeur)
-       
-      if not test :
-          mess = "impossible d'évaluer : %s " %`valeur`
-          self.parent.appli.affiche_infos("Valeur du mot-clé non autorisée : "+mess)
-      elif self.node.item.isvalid() :
-          self.parent.appli.affiche_infos('Valeur du mot-clé enregistrée')
-         if self.node.item.get_position()=='global':
-              self.node.etape.verif_all()
-         elif self.node.item.get_position()=='global_jdc':
-              self.node.racine.verif_all()
-         else :
-              self.node.parent.verif()
-         self.node.update()
-          self.node.parent.select()
-      else :
-          cr = self.node.item.get_cr()
-          mess = "Valeur du mot-clé non autorisée :"+cr.get_mess_fatal()
-          self.reset_old_valeur(anc_val,mess=mess)
-
-class UNIQUE_INTO_Panel(UNIQUE_Panel):
-  """
-  Classe définissant le panel associé aux mots-clés qui demandent
-  à l'utilisateur de choisir une seule valeur parmi une liste de valeurs
-  discrètes
-  """
-  def makeValeurPage(self,page):
-      """
-      Génère la page de saisie d'une seule valeur parmi un ensemble
-      discret de possibles
-      """
-      # récupération de la bulle d'aide et de l'objet mc
-      bulle_aide=self.get_bulle_aide()
-      objet_mc = self.node.item.get_definition()
-      # remplissage du panel
-      self.frame_valeur = Frame(page)
-      self.frame_valeur.pack(fill='both',expand=1)
-      self.frame_valeur.bind("<Button-3>",lambda e,s=self,a=bulle_aide : 
-                              s.parent.appli.affiche_aide(e,a))
-      self.frame_valeur.bind("<ButtonRelease-3>",self.parent.appli.efface_aide)
-      #l_choix=list(objet_mc.into)
-      #l_choix.sort()
-      l_choix=self.node.item.get_liste_possible([])
-      self.label = Label(self.frame_valeur,text='Choisir une valeur :')
-      self.label.pack(side='top')
-      self.frame = Frame(page)
-      self.frame.place(relx=0.33,rely=0.2,relwidth=0.33,relheight=0.6)
-      liste_commandes = (("<Button-1>",self.selectChoix),
-                         ("<Button-3>",self.deselectChoix),
-                         ("<Double-Button-1>",self.record_valeur))
-      self.Liste_choix = ListeChoix(self,self.frame,l_choix,
-                                    liste_commandes = liste_commandes,
-                                    titre="Valeurs possibles")
-      self.Liste_choix.affiche_liste()
-
-  def get_bulle_aide(self):
-      """
-      Retourne la bulle d'aide affectée au panneau courant (affichée par clic droit)
-      """
-      return """Double-cliquez sur la valeur désirée
-      pour valoriser le mot-clé simple courant"""
-
-class UNIQUE_ASSD_Panel(UNIQUE_Panel):
-  """
-  Classe servant à définir le panneau associé aux objets qui attendent une valeur unique
-  d'un type dérivé d'ASSD
-  """
-  def valid_valeur_automatique(self):
-      """
-         Réalise la validation d'un concept sans remonter dans le
-         node parent dans le cas ou il n'y a qu'un concept possible (liste de longueur 1)
-         Identique à valid_valeur moins appel de self.node.parent.select()
-         On pourrait supposer que le seul concept présent est valide et donc ne pas
-         réaliser tous les tests de vérification.
-      """
-      if self.parent.modified == 'n' : self.parent.init_modif()
-      valeur = self.get_valeur()
-      self.erase_valeur()
-      anc_val = self.node.item.get_valeur()
-      valeur,validite=self.node.item.eval_valeur_item(valeur)
-      test = self.node.item.set_valeur(valeur)
-      if not test :
-          mess = "impossible d'évaluer : %s " %`valeur`
-          self.parent.appli.affiche_infos("Valeur du mot-clé non autorisée :"+mess)
-      elif self.node.item.isvalid() :
-          self.parent.appli.affiche_infos('Valeur du mot-clé enregistrée')
-          if self.node.item.get_position()=='global':
-              self.node.etape.verif_all()
-          elif self.node.item.get_position()=='global_jdc':
-              self.node.racine.verif_all()
-          else :
-              self.node.parent.verif()
-          self.node.update()
-      else :
-          cr = self.node.item.get_cr()
-          mess = "Valeur du mot-clé non autorisée :"+cr.get_mess_fatal()
-          self.reset_old_valeur(anc_val,mess=mess)
-
-  def makeValeurPage(self,page):
-      """
-          Génère la page de saisie de la valeur du mot-clé simple courant qui doit être une 
-          SD de type dérivé d'ASSD
-      """
-      # Récupération de l'aide associée au panneau, de l'aide destinée à l'utilisateur,
-      # et de la liste des SD du bon type (constituant la liste des choix)
-      bulle_aide=self.get_bulle_aide()
-      aide=self.get_aide()
-      aide= justify_text(texte=aide)
-      liste_noms_sd = self.node.item.get_sd_avant_du_bon_type()
-      # Remplissage du panneau
-      self.valeur_choisie = StringVar()
-      self.valeur_choisie.set('')
-      min,max =  self.node.item.GetMinMax()
-      if (min == 1 and min == max and len(liste_noms_sd)==1):
-          if self.valeur_choisie.get() != liste_noms_sd[0]:
-            self.valeur_choisie.set(liste_noms_sd[0])
-             self.valid_valeur_automatique()
-        
-      self.frame_valeur = Frame(page)
-      self.frame_valeur.pack(fill='both',expand=1)
-      self.frame_valeur.bind("<Button-3>",lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a))
-      self.frame_valeur.bind("<ButtonRelease-3>",self.parent.appli.efface_aide)
-      self.listbox = Pmw.ScrolledListBox(self.frame_valeur,
-                                         items=liste_noms_sd,
-                                         labelpos='n',
-                                         label_text="Structures de données du type\n requis par l'objet courant :",
-                                         listbox_height = 6,
-                                         selectioncommand=self.select_valeur_from_list,
-                                         dblclickcommand=lambda s=self,c=self.valid_valeur : s.choose_valeur_from_list(c))
-      self.listbox.place(relx=0.5,rely=0.3,relheight=0.4,anchor='center')
-      Label(self.frame_valeur,text='Structure de donnée choisie :').place(relx=0.05,rely=0.6)
-      #self.label_valeur = Label(self.frame_valeur,textvariable=self.valeur_choisie)
-      Label(self.frame_valeur,textvariable=self.valeur_choisie).place(relx=0.5,rely=0.6)
-      # affichage de la valeur courante
-      self.display_valeur()
-
-  def get_bulle_aide(self):
-      """
-      Retourne l'aide associée au panneau
-      """
-      return "Double-cliquez sur la structure de donnée désirée pour valoriser le mot-clé simple courant"
-
-  def get_aide(self):
-      """
-      Retourne la phrase d'aide indiquant de quel type doit être la valeur à donner par l'utilisateur
-      """
-      mc = self.node.item.get_definition()
-      type = mc.type[0].__name__  
-      if len(mc.type)>1 :
-          for typ in mc.type[1:] :
-              type = type + ' ou '+typ.__name__
-      commentaire="Un objet de type "+type+" est attendu"
-      aideval=self.node.item.aide()
-      commentaire=commentaire +"\n"+ aideval
-      return commentaire
-
-    
-  def select_valeur_from_list(self):
-      """
-      Affecte à valeur choisie la sélection courante dans la liste des choix proposée
-      """
-      if len(self.listbox.get()) == 0 : return
-      choix = self.listbox.getcurselection()[0]
-      self.valeur_choisie.set(choix)
-
-  def choose_valeur_from_list(self,command):
-      """
-      Affecte à valeur choisie la sélection courante dans la liste des choix proposée
-      Exécute command
-      """
-      if len(self.listbox.get()) == 0 : return
-      choix = self.listbox.getcurselection()[0]
-      self.valeur_choisie.set(choix)
-      apply(command,(),{})
-
-  def get_valeur(self):
-      """
-      Retourne la valeur donnée par l'utilisateur au MCS
-      """
-      return self.valeur_choisie.get()
-    
-  def display_valeur(self):
-      """
-      Affiche la valeur de l'objet pointé par self
-      """
-      valeur = self.node.item.get_valeur()
-      if valeur == None or valeur == '' : return # pas de valeur à afficher ...
-      self.valeur_choisie.set(valeur.nom)
-
-  def erase_valeur(self):
-      pass
-
-class UNIQUE_SDCO_Panel(UNIQUE_ASSD_Panel):
-  """
-  Classe servant à définir le panneau correspondant à un mot-clé simple
-  qui attend une valeur unique de type dérivé d'ASSD ou non encore
-  existante (type CO(...) utilisé dans les macros uniquement)
-  """
-  def makeValeurPage(self,page):
-      """
-      Génère la page de saisie de la valeur du mot-clé simple courant qui doit être une SD de type dérivé
-      d'ASSD
-      """
-      # Récupération de l'aide associée au panneau, de l'aide destinée à l'utilisateur,
-      # et de la liste des SD du bon type (constituant la liste des choix)
-      bulle_aide=self.get_bulle_aide()
-      aide=self.get_aide()
-      aide= justify_text(texte=aide)
-      liste_noms_sd = self.node.item.get_sd_avant_du_bon_type()
-      # Remplissage du panneau
-      self.frame_valeur = Frame(page)
-      self.frame_valeur.pack(fill='both',expand=1)
-      self.frame_valeur.bind("<Button-3>",lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a))
-      self.frame_valeur.bind("<ButtonRelease-3>",self.parent.appli.efface_aide)
-      # affichage de la liste des SD existantes et du bon type
-      self.listbox = Pmw.ScrolledListBox(self.frame_valeur,
-                                         items=liste_noms_sd,
-                                         labelpos='n',
-                                         label_text="Structures de données du type\n requis par l'objet courant :",
-                                         listbox_height = 6,
-                                         selectioncommand=self.select_valeur_from_list,
-                                         dblclickcommand=lambda s=self,c=self.valid_valeur : s.choose_valeur_from_list(c))
-      self.listbox.place(relx=0.5,rely=0.3,relheight=0.4,anchor='center')
-      # affichage du bouton 'Nouveau concept'
-      self.b_co = Pmw.OptionMenu(self.frame_valeur,labelpos='w',label_text = "Nouveau concept : ",
-                                 items = ('NON','OUI'),menubutton_width=10)
-      self.b_co.configure(command = lambda e,s=self : s.ask_new_concept())
-      self.b_co.place(relx=0.05,rely=0.6,anchor='w')
-      self.label_co = Label(self.frame_valeur,text='Nom du nouveau concept :')
-      self.entry_co = Entry(self.frame_valeur)
-      self.entry_co.bind('<Return>',self.valid_nom_concept_co)
-      # affichage du label de la structure de donnée choisie
-      self.l_resu = Label(self.frame_valeur,text='Structure de donnée choisie :')
-      self.valeur_choisie = StringVar()
-      self.label_valeur = Label(self.frame_valeur,textvariable=self.valeur_choisie)
-      self.frame_valeur.update()
-      self.aide = Label(self.frame_valeur,
-                        text = aide,
-                       wraplength=int(self.frame_valeur.winfo_width()*0.8),
-                       justify='center')
-      self.aide.place(relx=0.5,rely=0.85,anchor='n')
-      # affichage de la valeur courante
-      self.display_valeur()
-      
-  def get_bulle_aide(self):
-      """
-      Retourne la bulle d'aide du panneau
-      """
-      return """Double-cliquez sur la structure de donnée désirée
-      pour valoriser le mot-clé simple courant ou cliquez sur NOUVEAU CONCEPT pour
-      entrer le nom d'un concept non encore existant"""
-
-  def valid_valeur(self):
-      """
-      Teste si la valeur fournie par l'utilisateur est une valeur permise :
-      - si oui, l'enregistre
-      - si non, restaure l'ancienne valeur
-      """
-      if self.parent.modified == 'n' : self.parent.init_modif()
-      valeur = self.get_valeur()
-      self.erase_valeur()
-      anc_val = self.node.item.get_valeur()
-      test_CO=self.node.item.is_CO(anc_val)
-      test = self.node.item.set_valeur(valeur)
-      if not test :
-          mess = "impossible d'évaluer : %s " %`valeur`
-          self.parent.appli.affiche_infos("Valeur du mot-clé non autorisée :"+mess)
-          return
-      elif self.node.item.isvalid() :
-          self.parent.appli.affiche_infos('Valeur du mot-clé enregistrée')
-          if test_CO:
-             # il faut egalement propager la destruction de l'ancien concept
-             self.node.item.delete_valeur_co(valeur=anc_val)
-             # et on force le recalcul des concepts de sortie de l'etape
-             self.node.item.object.etape.get_type_produit(force=1)
-             # et le recalcul du contexte
-             self.node.item.object.etape.parent.reset_context()
-          self.node.parent.select()
-      else :
-          cr = self.node.item.get_cr()
-          mess = "Valeur du mot-clé non autorisée :"+cr.get_mess_fatal()
-          self.reset_old_valeur(anc_val,mess=mess)
-          return
-      if self.node.item.get_position()=='global':
-          self.node.etape.verif_all()
-      elif self.node.item.get_position()=='global_jdc':
-          self.node.racine.verif_all()
-      else :
-          self.node.parent.verif()
-      self.node.update()
-
-  def valid_nom_concept_co(self,event=None):
-      """
-      Lit le nom donné par l'utilisateur au concept de type CO qui doit être
-      la valeur du MCS courant et stocke cette valeur
-      """
-      if self.parent.modified == 'n' : self.parent.init_modif()
-      anc_val = self.node.item.get_valeur()
-      nom_concept = self.entry_co.get()
-      test,mess=self.node.item.set_valeur_co(nom_concept)
-      if not test:
-          # On n'a pas pu créer le concept
-          self.parent.appli.affiche_infos(mess)
-          return
-      elif self.node.item.isvalid() :
-          self.parent.appli.affiche_infos('Valeur du mot-clé enregistrée')
-          self.node.parent.select()
-      else :
-          cr = self.node.item.get_cr()
-          mess = "Valeur du mot-clé non autorisée :"+cr.get_mess_fatal()
-          self.reset_old_valeur(anc_val,mess=mess)
-          return
-      if self.node.item.get_position()=='global':
-          self.node.etape.verif_all()
-      elif self.node.item.get_position()=='global_jdc':
-          self.node.racine.verif_all()
-      else :
-          self.node.parent.verif()
-      if self.node.item.isvalid():
-          self.node.parent.select()
-      self.node.update()
-
-  def ask_new_concept(self):
-      """
-      Crée une entry dans le panneau d'un MCS qui attend un concept OU un CO() afin de
-      permettre à l'utilisateur de donner le nom du nouveau concept
-      """
-      new_concept = self.b_co.getcurselection()
-      if new_concept == 'OUI':
-          self.label_co.place(relx=0.05,rely=0.7)
-          self.entry_co.place(relx=0.45,rely=0.7,relwidth=0.25)
-          self.l_resu.place_forget()
-          self.label_valeur.place_forget()
-          self.entry_co.focus()
-      elif new_concept == 'NON':
-          # On est passe de OUI à NON, on supprime la valeur
-# PN correction de bug (on passe de non a non et cela supprime la valeur)
-# ajout du if de le ligne suivane
-          if self.node.item.is_CO():
-                self.node.item.delete_valeur_co()
-                self.record_valeur(name=None,mess="Suppression CO enregistrée")
-                self.label_co.place_forget()
-                self.entry_co.place_forget()
-                self.l_resu.place(relx=0.05,rely=0.7)
-                self.label_valeur.place(relx=0.45,rely=0.7)
-          
-  def display_valeur(self):
-      """
-      Affiche la valeur de l'objet pointé par self
-      """
-      valeur = self.node.item.get_valeur()
-      if valeur == None or valeur == '': 
-         self.valeur_choisie.set('')
-         return # pas de valeur à afficher ...
-      # il faut configurer le bouton si la valeur est un objet CO
-      # sinon afficher le nom du concept dans self.valeur_choisie
-      if self.node.item.is_CO():
-          self.b_co.invoke('OUI')
-          self.entry_co.insert(0,valeur.nom)
-      else:
-          self.valeur_choisie.set(valeur.nom)
-
-  def record_valeur(self,name=None,mess='Valeur du mot-clé enregistrée'):
-      """
-      Enregistre  val comme valeur de self.node.item.object SANS faire de test de validité
-      """
-      if self.parent.modified == 'n' : self.parent.init_modif()
-      if name != None:
-          valeur =name
-      else :
-          self.entry_co.delete(0,END)
-          valeur= self.entry_co.get()
-      self.node.item.set_valeur_co(valeur)
-      self.parent.appli.affiche_infos(mess)
-      # On met a jour le display dans le panneau
-      self.display_valeur()
-      if self.node.item.get_position()=='global':
-          self.node.etape.verif_all()
-      elif self.node.item.get_position()=='global_jdc':
-          self.node.racine.verif_all()
-      else :
-          self.node.parent.verif()
-      if self.node.item.isvalid():
-          self.node.parent.select()
-      self.node.update()
-
-
-class UNIQUE_BASE_Panel(UNIQUE_Panel):
-  """
-  Classe servant à définir le panneau associé aux mots-clés simples qui attendent
-  une valeur d'un type de base (entier, réel ou string).
-  """
-  def makeValeurPage(self,page):
-      """
-      Génère la page de saisie de la valeur du mot-clé simple courant qui doit être de type
-      de base cad entier, réel, string ou complexe
-      """
-      # Récupération de l'aide associée au panneau, de l'aide destinée à l'utilisateur,
-      # et de la liste des SD du bon type (constituant la liste des choix)
-      bulle_aide=self.get_bulle_aide()
-      aide=self.get_aide()
-      aide= justify_text(texte=aide)
-      liste_noms_sd = self.node.item.get_sd_avant_du_bon_type()
-      # Remplissage du panneau
-      self.frame_valeur = Frame(page)
-      self.frame_valeur.pack(fill='both',expand=1)
-      self.frame_valeur.bind("<Button-3>",lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a))
-      self.frame_valeur.bind("<ButtonRelease-3>",self.parent.appli.efface_aide)
-      self.label = Label(self.frame_valeur,text='Valeur :')
-      self.label.place(relx=0.1,rely=0.5)
-      self.entry = Entry(self.frame_valeur,relief='sunken')
-      self.entry.place(relx=0.28,rely=0.5,relwidth=0.6)
-      self.entry.bind("<Return>",lambda e,c=self.valid_valeur:c())
-      self.entry.focus()
-      # aide associée au panneau
-      self.frame_valeur.update()
-      self.aide = Label(self.frame_valeur, 
-                        text = aide,
-                       wraplength=int(self.frame_valeur.winfo_width()*0.8),
-                       justify='center')
-      self.aide.place(relx=0.5,rely=0.7,anchor='n')
-      # affichage de la valeur du MCS
-      self.display_valeur()
-
-  def get_aide(self):
-      """
-      Retourne la phrase d'aide indiquant de quel type doit être la valeur
-      du mot-clé simple fournie par l'utilisateur
-      """
-      mc = self.node.item.get_definition()
-      d_aides = { 'TXM' : "Une chaîne de caractères est attendue",
-                  'R'   : "Un réel est attendu",
-                  'I'   : "Un entier est attendu"}
-      type = mc.type[0]
-      commentaire=d_aides.get(type,"Type de base inconnu")
-      aideval=self.node.item.aide()
-      commentaire=commentaire +"\n"+ aideval
-      return commentaire
-
-  def get_bulle_aide(self):
-      """
-      Retourne la bulle d'aide associée au panneau et affichée par clic droit
-      """
-      return """Saisissez la valeur que vous voulez affecter au mot-clé simple
-      dans la zone de saisie et pressez <Return>"""
-      
-  def display_valeur(self):
-      """
-      Affiche la valeur de l'objet pointé par self
-      """
-      valeur = self.node.item.get_valeur()
-      if valeur == None or valeur == '' : return # pas de valeur à afficher ...
-      self.entry.delete(0,END)
-      self.entry.insert(0,valeur)
-      self.entry.focus()
-      
-class UNIQUE_COMP_Panel(UNIQUE_Panel):
-  """
-  Classe servant à définir le panneau associé aux mots-clés simples
-  qui attendent une valeur de type complexe
-  """
-  def makeValeurPage(self,page):
-      """
-      Génère la page de saisie de la valeur du mot-clé simple courant qui doit être de type
-      de base cad entier, réel, string ou complexe
-      """
-      # Récupération de l'aide associée au panneau et de l'aide destinée à l'utilisateur
-      bulle_aide=self.get_bulle_aide()
-      aide=self.get_aide()
-      aide= justify_text(texte=aide)
-      # Remplissage du panneau
-      self.frame_valeur = Frame(page)
-      self.frame_valeur.pack(fill='both',expand=1)
-      self.frame_valeur.bind("<Button-3>",lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a))
-      self.frame_valeur.bind("<ButtonRelease-3>",self.parent.appli.efface_aide)
-      self.label = Label(self.frame_valeur,text='Valeur :')
-      self.label.place(relx=0.1,rely=0.5)
-      self.typ_cplx=StringVar()
-      self.typ_cplx.set('RI')
-      rb1 = Radiobutton(self.frame_valeur, text='RI',variable=self.typ_cplx,value='RI')
-      rb2 = Radiobutton(self.frame_valeur, text='MP',variable=self.typ_cplx,value='MP')
-      self.entry1 = Pmw.EntryField(self.frame_valeur,validate='real')
-      self.entry2 = Pmw.EntryField(self.frame_valeur,validate='real')
-      rb1.place(relx=0.05,rely = 0.4)
-      rb2.place(relx=0.05,rely = 0.6)
-      self.entry1.component('entry').bind("<Return>",lambda e,s=self:s.entry2.component('entry').focus())
-      self.entry2.component('entry').bind("<Return>",lambda e,c=self.valid_valeur:c())
-      self.entry1.place(relx=0.27,rely = 0.5,relwidth=0.35)
-      self.entry2.place(relx=0.65,rely = 0.5,relwidth=0.35)
-      self.entry1.focus()
-      self.frame_valeur.update()
-      self.aide = Label(self.frame_valeur,
-                        text = aide,
-                        wraplength=int(self.frame_valeur.winfo_width()*0.8),
-                       justify='center')
-      self.aide.place(relx=0.5,rely=0.7,anchor='n')
-      # affichage de la valeur du MCS
-      self.display_valeur()
-
-  def display_valeur(self):
-      """
-      Affiche la valeur de l'objet pointé par self
-      """
-      valeur = self.node.item.get_valeur()
-      if valeur == None or valeur == '' : return # pas de valeur à afficher ...
-      typ_cplx,x1,x2=valeur
-      self.entry1.delete(0,END)
-      self.entry2.delete(0,END)
-      self.typ_cplx.set(typ_cplx)
-      self.entry1.setentry(x1)
-      self.entry2.setentry(x2)
-
-  def get_bulle_aide(self):
-      """
-      Retourne la bulle d'aide du panneau
-      """
-      return """-Choisissez votre format de saisie du complexe :
-      \t 'RI' = parties réelle et imaginaire
-      \t 'MP' = module/phase (en degrés)
-      - Saisissez ensuite dans les deux zones de saisie les deux nombres attendus"""
-
-  def get_aide(self):
-      """
-      Retourne la phrase d'aide décrivant le type de la valeur que peut prendre
-      le mot-clé simple courant
-      """
-      commentaire='Un complexe est attendu'
-      aideval=self.node.item.aide()
-      commentaire=commentaire +"\n"+ aideval
-      return commentaire
-
-  def get_valeur(self):
-      """
-      Retourne le complexe saisi par l'utilisateur
-      """
-      l=[]
-      l.append(self.typ_cplx.get())
-      l.append(string.atof(self.entry1.get()))
-      l.append(string.atof(self.entry2.get()))
-      return `tuple(l)`
-
-  def erase_valeur(self):
-      """
-      Efface les entries de saisie
-      """
-      self.typ_cplx = 'RI'
-      self.entry1.delete(0,END)
-      self.entry2.delete(0,END)
       
 class SIMPTreeItem(Objecttreeitem.AtomicObjectTreeItem):
+  from newsimppanel import newSIMPPanel
   panel = newSIMPPanel
 
   def init(self) :
       self.expandable = 0
       self.affect_panel()
 
+
   def affect_panel(self):
       """
       Cette méthode attribue le panel à l'objet pointé par self en fonction de la
       nature de la valeur demandée pour cet objet
       """
+      from uniquepanel import UNIQUE_Panel
+      from plusieurspanel import PLUSIEURS_Panel
+
       #print "affect_panel : ",self.nom,self.is_list(),self.has_into(), self.get_into(None)
+
       if self.wait_shell():
           # l'objet attend un shell
+          from shellpanel import SHELLPanel
           self.panel = SHELLPanel
       elif self.has_into():
           # l'objet prend sa (ses) valeur(s) dans un ensemble discret de valeurs
           if self.is_list() :
+             from plusieursintopanel import PLUSIEURS_INTO_Panel
              self.panel = PLUSIEURS_INTO_Panel
           else:
+             from uniqueintopanel import UNIQUE_INTO_Panel
              self.panel = UNIQUE_INTO_Panel
       else:
           # l'objet prend une ou des valeurs à priori quelconques
@@ -1444,27 +73,76 @@ class SIMPTreeItem(Objecttreeitem.AtomicObjectTreeItem):
               # on attend une liste de valeurs mais de quel type ?
               if self.wait_assd():
                   # on attend une liste de SD
+                  from plusieursassdpanel import PLUSIEURS_ASSD_Panel
                   self.panel = PLUSIEURS_ASSD_Panel
               else:
                   # on attend une liste de valeurs de types debase (entiers, réels,...)
+                  from plusieursbasepanel import PLUSIEURS_BASE_Panel
                   self.panel = PLUSIEURS_BASE_Panel
           else:
               # on n'attend qu'une seule valeur mais de quel type ?
               if self.wait_co():
                   # on attend une SD ou un objet de la classe CO (qui n'existe pas encore)
+                  from uniquesdcopanel import UNIQUE_SDCO_Panel
                   self.panel = UNIQUE_SDCO_Panel
               elif self.wait_assd():
                   # on attend une SD
+                  from uniqueassdpanel import UNIQUE_ASSD_Panel
                   self.panel = UNIQUE_ASSD_Panel
               else:
                   # on attend une valeur d'un type de base (entier,réel,...)
                   if self.wait_complex():
                       # on attend un complexe
+                      from uniquecomppanel import UNIQUE_COMP_Panel
                       self.panel = UNIQUE_COMP_Panel
                   else:
                       # on attend un entier, un réel ou une string
+                     from uniquebasepanel import UNIQUE_BASE_Panel
                       self.panel = UNIQUE_BASE_Panel
-      #print "affect_panel : ",self.panel
+      # cas particulier des fonctions
+      genea = self.get_genealogie()
+      if "DEFI_FONCTION" in genea :
+         if "VALE" in genea :
+            from fonctionpanel import FONCTION_Panel
+            self.panel=FONCTION_Panel
+      #---------------------------------------------------------
+      # PN ajout pour lancement de Salome
+      #---------------------------------------------------------
+      if  self.appli.salome != 0 :
+          import panelsSalome
+
+          self.clef_fonction="SALOME"
+          for i in range(0,len( genea )) :
+             self.clef_fonction=self.clef_fonction+"_"+ genea[i]
+
+          self.select_noeud_maille=0
+          if (self.clef_fonction.find("GROUP_NO") != -1)  :
+             self.select_noeud_maille=1
+          if (self.clef_fonction.find("GROUP_MA") != -1) :
+             self.select_noeud_maille=1
+
+          recherche=panelsSalome.dict_classes_salome[self.panel]
+          if hasattr(recherche,self.clef_fonction):
+             self.panel=recherche
+          if self.select_noeud_maille==1 :
+             self.panel=recherche
+
+
+  #-----------------------------------------------
+  #
+  # Methodes liees aux informations sur le Panel
+  # ou au mot-clef simple
+  #
+  #-----------------------------------------------
+  # is_list
+  # get_into           a priori inutile --> commentee
+  # has_into
+  # wait_into          a priori inutile --> commentee
+  # GetMinMax
+  # GetMultiplicite
+  # GetIntervalle
+  # GetListeValeurs
+  # get_liste_possible
 
   def is_list(self):
       """
@@ -1491,20 +169,20 @@ class SIMPTreeItem(Objecttreeitem.AtomicObjectTreeItem):
          is_a_list= self.definition.validators.is_list() * is_a_list
       return is_a_list 
 
-  def get_into(self,liste_courante=None):
-      """
-          Cette méthode retourne la liste de choix proposée par le mot cle. Si le mot cle ne propose
-          pas de liste de choix, la méthode retourne None.
-          L'argument d'entrée liste_courante, s'il est différent de None, donne la liste des choix déjà
-          effectués par l'utilisateur. Dans ce cas, la méthode get_into doit calculer la liste des choix
-          en en tenant compte.
-          Cette méthode part du principe que la relation entre into du mot clé et les validateurs est
-          une relation de type ET (AndVal).
-      """
-      if not self.object.definition.validators :
-         return self.object.definition.into
-      else:
-         return self.object.definition.validators.get_into(liste_courante,self.definition.into)
+  #def get_into(self,liste_courante=None):
+  #    """
+  #        Cette méthode retourne la liste de choix proposée par le mot cle. Si le mot cle ne propose
+  #        pas de liste de choix, la méthode retourne None.
+  #        L'argument d'entrée liste_courante, s'il est différent de None, donne la liste des choix déjà
+  #        effectués par l'utilisateur. Dans ce cas, la méthode get_into doit calculer la liste des choix
+  #        en en tenant compte.
+  #        Cette méthode part du principe que la relation entre into du mot clé et les validateurs est
+  #        une relation de type ET (AndVal).
+  #    """
+  #    if not self.object.definition.validators :
+  #       return self.object.definition.into
+  #    else:
+  #       return self.object.definition.validators.get_into(liste_courante,self.definition.into)
 
   def has_into(self):
       """
@@ -1526,9 +204,80 @@ class SIMPTreeItem(Objecttreeitem.AtomicObjectTreeItem):
          has_an_into= self.definition.validators.has_into()
       return has_an_into
 
+#  def wait_into(self):
+#      """ Méthode booléenne qui retourne 1 si l'objet pointé par self
+#      prend ses valeurs dans un ensemble discret (into), 0 sinon """
+#      if self.object.definition.into != None :
+#          return 1
+#      else:
+#          return 0
+
+  def GetMinMax(self):
+      """ Retourne les valeurs min et max de la définition de object """
+      return self.object.get_min_max()
+
+  def GetMultiplicite(self):
+      """ A préciser.
+          Retourne la multiplicité des valeurs affectées à l'objet
+          représenté par l'item. Pour le moment retourne invariablement 1.
+      """
+      return 1
+
+  def GetIntervalle(self):
+      """ 
+           Retourne le domaine de valeur attendu par l'objet représenté 
+           par l'item.
+      """
+      return self.object.getintervalle()
+
+  def GetListeValeurs(self) :
+      """ Retourne la liste des valeurs de object """
+      return self.object.get_liste_valeurs()
+    
+  def get_liste_possible(self,listeActuelle=[]):
+      if hasattr(self.definition.validators,'into'):
+        self.get_definition().into=self.definition.validators.into 
+      valeurspossibles = self.get_definition().into
+      # CCAR : Ne serait-il pas preferable d'appeler get_into ?
+      #valeurspossibles=self.get_into(listeActuelle)
+
+      listevalideitem=[]
+      for item in valeurspossibles:
+          encorevalide=self.valide_item(item)
+          if encorevalide :
+             listevalideitem.append(item)
+      # on ne verifie pas la liste des choix si max = 1 
+      # (sinon cela enleve tous les choix possibles)
+      min,max=self.GetMinMax()
+      if max != 1 : 
+         listevalideliste=[]
+         for item in listevalideitem:
+             listetravail=[]
+             for item2 in listeActuelle : listetravail.append(item2)
+             encorevalide=self.valide_liste_partielle(item,listetravail)
+             if encorevalide :
+                listevalideliste.append(item)
+      else :
+         listevalideliste=listevalideitem
+      return listevalideliste
+
+
+  #--------------------------------------------------
+  #
+  # Methodes liees a la validite des valeurs saisies
+  #
+  #---------------------------------------------------
+  # valide_item
+  # valide_liste_partielle
+  # valide_liste_complete
+  # info_erreur_item
+  # info_erreur_liste
+  # IsInIntervalle
+  # isvalid
+
   def valide_item(self,item):
       """
-       On fait un try except pour les erreurs de types (exple
+       On fait un try except pour les erreurs de type (exple
        on rentre 1 pour une chaine de caracteres
       """
       valide=1
@@ -1585,12 +334,37 @@ class SIMPTreeItem(Objecttreeitem.AtomicObjectTreeItem):
          commentaire=self.definition.validators.info_erreur_liste()
       return commentaire
 
-  def SetText(self, text):
-    try:
-      value = eval(text)
-      self.object.setval(value)
-    except:
-      pass
+  def IsInIntervalle(self,valeur):
+      """ 
+          Retourne 1 si la valeur est dans l'intervalle permis par
+          l'objet représenté par l'item.
+      """
+      return self.object.isinintervalle(valeur)
+
+  def isvalid(self):
+    valide=self.object.isvalid()
+    return self.object.isvalid()
+
+  #--------------------------------------------------
+  #
+  # Autres ...
+  #
+  #---------------------------------------------------
+  # SetText    a priori inutilisee --> commentee
+  # GetIconName
+  # GetText
+  # getval     a  priori inutilisee --> commentee
+  # set_valeur_co
+  # get_sd_avant_du_bon_type
+  # verif      a  priori inutilisee --> commentee
+  # delete_valeur_co
+
+  #def SetText(self, text):
+  #  try:
+  #    value = eval(text)
+  #    self.object.setval(value)
+  #  except:
+  #    pass
 
   def GetIconName(self):
     if self.isvalid():
@@ -1608,6 +382,50 @@ class SIMPTreeItem(Objecttreeitem.AtomicObjectTreeItem):
     """
     text= self.object.GetText()
     return text
+    
+  #def getval(self):
+  #    return self.object.getval()
+
+  def set_valeur_co(self,nom_co):
+      """
+      Affecte au MCS pointé par self l'objet de type CO et de nom nom_co
+      """
+      return self.object.set_valeur_co(nom_co)
+      
+  def get_sd_avant_du_bon_type(self):
+      """
+      Retourne la liste des noms des SD présentes avant l'étape qui contient
+      le MCS pointé par self et du type requis par ce MCS
+      """
+      a=self.object.etape.parent.get_sd_avant_du_bon_type(self.object.etape,self.object.definition.type)
+      return self.object.etape.parent.get_sd_avant_du_bon_type(self.object.etape,
+                                                               self.object.definition.type)
+
+  #def verif(self):
+  #    pass
+
+  def delete_valeur_co(self,valeur=None):
+      """
+           Supprime la valeur du mot cle (de type CO)
+           il faut propager la destruction aux autres etapes
+      """
+      if not valeur : valeur=self.object.valeur
+      # XXX faut il vraiment appeler del_sdprod ???
+      #self.object.etape.parent.del_sdprod(valeur)
+      self.object.etape.parent.delete_concept(valeur)
+
+  #-----------------------------------------------
+  #
+  # Methodes liees au type de l objet attendu
+  #
+  #-----------------------------------------------
+  # wait_co 
+  # wait_geom
+  # wait_complex
+  # wait_reel
+  # wait_shell
+  # wait_assd
+  # GetType
 
   def wait_co(self):
       """
@@ -1648,78 +466,26 @@ class SIMPTreeItem(Objecttreeitem.AtomicObjectTreeItem):
       else:
           return 0
 
-  def wait_into(self):
-      """ Méthode booléenne qui retourne 1 si l'objet pointé par self
-      prend ses valeurs dans un ensemble discret (into), 0 sinon """
-      if self.object.definition.into != None :
-          return 1
-      else:
-          return 0
-
   def wait_assd(self):
       """Méthode booléenne qui retourne 1 si l'objet pointé par self
       attend un objet de type ASSD ou dérivé, 0 sinon """
       return self.object.wait_assd()
     
-  def getval(self):
-      return self.object.getval()
-    
-  def GetMinMax(self):
-      """ Retourne les valeurs min et max de la définition de object """
-      return self.object.get_min_max()
-
-  def GetMultiplicite(self):
-      """ A préciser.
-          Retourne la multiplicité des valeurs affectées à l'objet
-          représenté par l'item. Pour le moment retourne invariablement 1.
-      """
-      return 1
-
   def GetType(self):
       """ 
           Retourne le type de valeur attendu par l'objet représenté par l'item.
       """
       return self.object.get_type()
 
-  def GetIntervalle(self):
-      """ 
-           Retourne le domaine de valeur attendu par l'objet représenté 
-           par l'item.
-      """
-      return self.object.getintervalle()
-
-  def IsInIntervalle(self,valeur):
-      """ 
-          Retourne 1 si la valeur est dans l'intervalle permis par
-          l'objet représenté par l'item.
-      """
-      return self.object.isinintervalle(valeur)
-
-  def set_valeur_co(self,nom_co):
-      """
-      Affecte au MCS pointé par self l'objet de type CO et de nom nom_co
-      """
-      return self.object.set_valeur_co(nom_co)
-      
-  def get_sd_avant_du_bon_type(self):
-      """
-      Retourne la liste des noms des SD présentes avant l'étape qui contient
-      le MCS pointé par self et du type requis par ce MCS
-      """
-      a=self.object.etape.parent.get_sd_avant_du_bon_type(self.object.etape,self.object.definition.type)
-      return self.object.etape.parent.get_sd_avant_du_bon_type(self.object.etape,
-                                                               self.object.definition.type)
-    
-  def GetListeValeurs(self) :
-      """ Retourne la liste des valeurs de object """
-      return self.object.get_liste_valeurs()
-    
-  def verif(self):
-      pass
-
-  def isvalid(self):
-    valide=self.object.isvalid()
-    return self.object.isvalid()
+  #-----------------------------------------------------
+  #
+  # Methodes liees  a l evaluation de la valeur saisie
+  #
+  #-----------------------------------------------------
+  # eval_valeur
+  # eval_valeur_item
+  # is_CO
+  # traite_reel
 
   def eval_valeur(self,valeur):
       """ Lance l'interprétation de 'valeur' (chaîne de caractères) comme valeur
@@ -1744,6 +510,11 @@ class SIMPTreeItem(Objecttreeitem.AtomicObjectTreeItem):
       return valeurretour,validite
 
   def eval_valeur_item(self,valeur):
+      """ Lance l'interprétation de 'valeur' qui doit ne pas etre un tuple 
+         - va retourner la valeur de retour et la validite
+            selon le type de l objet attendu
+          - traite les reels et les parametres 
+      """ 
       if valeur==None or valeur == "" :
         return None,0
       validite=1
@@ -1767,16 +538,13 @@ class SIMPTreeItem(Objecttreeitem.AtomicObjectTreeItem):
          except:
             valeurretour=None
             validite=0
-
       # on est dans le cas où on a évalué et où on n'aurait pas du
       if self.object.wait_TXM() :
          if type(valeurretour) != types.StringType:
              valeurretour=str(valeur)
              validite=1
-
       return valeurretour,validite
       
-
   def is_CO(self,valeur=None):
       """
          Indique si valeur est un concept produit de la macro
@@ -1795,43 +563,6 @@ class SIMPTreeItem(Objecttreeitem.AtomicObjectTreeItem):
       if valeur.__class__.__name__ == 'CO':return 1
       return 0
 
-  def delete_valeur_co(self,valeur=None):
-      """
-           Supprime la valeur du mot cle (de type CO)
-           il faut propager la destruction aux autres etapes
-      """
-      if not valeur : valeur=self.object.valeur
-      # XXX faut il vraiment appeler del_sdprod ???
-      #self.object.etape.parent.del_sdprod(valeur)
-      self.object.etape.parent.delete_concept(valeur)
-
-  def get_liste_possible(self,listeActuelle=[]):
-      if hasattr(self.definition.validators,'into'):
-        self.get_definition().into=self.definition.validators.into 
-      valeurspossibles = self.get_definition().into
-      # CCAR : Ne serait-il pas preferable d'appeler get_into ?
-      #valeurspossibles=self.get_into(listeActuelle)
-
-      listevalideitem=[]
-      for item in valeurspossibles:
-          encorevalide=self.valide_item(item)
-          if encorevalide :
-             listevalideitem.append(item)
-      # on ne verifie pas la liste des choix si max = 1 
-      # (sinon cela enleve tous les choix possibles)
-      min,max=self.GetMinMax()
-      if max != 1 : 
-         listevalideliste=[]
-         for item in listevalideitem:
-             listetravail=[]
-             for item2 in listeActuelle : listetravail.append(item2)
-             encorevalide=self.valide_liste_partielle(item,listetravail)
-             if encorevalide :
-                listevalideliste.append(item)
-      else :
-         listevalideliste=listevalideitem
-      return listevalideliste
-
   def traite_reel(self,valeur):
       """
       Cette fonction a pour but de rajouter le '.' en fin de chaîne pour un réel
index 703ec6d490c5a3f25687cd0bbca83b561432fd14..75043cee69464fe4ef1be6c12a855a72f521a616 100644 (file)
 # Modules Python
 import os,sys,string,types
 import traceback
-try:
-  from tkMessageBox import showinfo,askyesno,showerror,askretrycancel
-except:
-  pass
 
 # Modules Eficas
+from widgets import showinfo,showerror,askretrycancel
 import utils
 
 class CONFIG:
index f9e97f9b5fe14896d28cea74ab4b47e1c949282d..bb38e0d6bebd47deec5a0ff5811ca56f37c8794d 100644 (file)
 import string
 from Tkinter import Label
 import Pmw
-from tkCommonDialog import Dialog
-from tkFileDialog import *
-from tkMessageBox import askyesno,showerror
 import traceback
 
 # Modules Eficas
+from widgets import showerror
+from widgets import askopenfilename
 import patches
 import appli
 from widgets import Fenetre
index 3f4df08b35236d725c6e4faf1928ba3c55a438dd..11f9c88c214e0d43394c724ee01f3411b4d06ef9 100644 (file)
@@ -32,6 +32,7 @@ def lance_eficas(code,fichier=None):
     """
         Lance l'appli EFICAS
     """
+
     root = Tkinter.Tk()
     splash.init_splash(root,code=code,titre="Lancement d'EFICAS pour %s" %code)
     splash._splash.configure(text="Chargement d'EFICAS en cours.\n Veuillez patienter ...")
diff --git a/Editeur/fonctionpanel.py b/Editeur/fonctionpanel.py
new file mode 100644 (file)
index 0000000..b6f8a49
--- /dev/null
@@ -0,0 +1,211 @@
+#            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.
+#
+# 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.
+#
+# 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.
+#
+#
+# ======================================================================
+# Modules Python
+import string,types,os
+from Tkinter import *
+import Pmw
+from copy import copy,deepcopy
+import traceback
+
+# Modules Eficas
+import Objecttreeitem
+import prefs
+import panels
+import images
+from widgets import ListeChoix
+from widgets import FenetreDeSelection
+
+from Noyau.N_CR import justify_text
+from utils import substract_list
+from plusieursbasepanel import PLUSIEURS_BASE_Panel
+
+
+class FONCTION_Panel(PLUSIEURS_BASE_Panel):
+  def makeValeurPage(self,page):
+      """
+      Crée la page de saisie d'une liste de valeurs à priori quelconques,
+      cad qui ne sont  pas à choisir dans une liste prédéfinie
+      """
+      # On récupère la bulle d'aide du panneau, l'objet, l'aide,min et max (cardinalité de la liste),
+      # et la liste des valeurs déjà affectées à l'objet courant
+      bulle_aide=self.get_bulle_aide()
+      objet_mc = self.node.item.get_definition()
+      aide = self.get_aide()
+      aide = justify_text(texte=aide)
+      min,max = self.node.item.GetMinMax()
+      l_valeurs = self.node.item.GetListeValeurs()
+      l2_valeurs=self.decoupeListeValeurs(l_valeurs)
+
+      # création des frames globales
+      self.frame1 = Frame(page,relief='groove',bd=2)
+      self.frame2 = Frame(page)
+      self.frame1.place(relx=0.,rely=0.,relwidth=1.,relheight=0.85)
+      self.frame2.place(relx=0.,rely=0.85,relwidth=1,relheight=0.15)
+      self.frame_right = Frame(self.frame1)
+      self.frame_right.place(relx=0.35,rely=0.,relwidth=0.65,relheight=1.)
+
+      # création des frames internes
+      self.frame_valeurs = Frame(self.frame1)
+      self.frame_valeurs.place(relx=0.02,rely=0.05,relwidth=0.35,relheight=0.95)
+      self.frame_boutons_fleches = Frame(self.frame_right)
+      self.frame_boutons_fleches.place(relx=0.,rely=0.2,relwidth=0.2,relheight=0.5)
+      self.frame_choix = Frame(self.frame_right)
+      self.frame_choix.place(relx=0.2,rely=0.2,relwidth=0.7,relheight=0.5)
+      self.frame_aide = Frame(self.frame_right)
+      self.frame_aide.place(relx=0.1,rely=0.7,relwidth=0.8,relheight=0.3)
+      self.frame_boutons = Frame(self.frame2)
+      self.frame_boutons.place(relx=0.35,rely=0.,relwidth=0.3,relheight=1.)
+      for fram in (self.frame1,self.frame2,self.frame_right,self.frame_valeurs,
+                 self.frame_boutons_fleches,self.frame_choix,self.frame_aide,self.frame_boutons):
+          fram.bind("<Button-3>",lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a))
+          fram.bind("<ButtonRelease-3>",self.parent.appli.efface_aide)
+
+      # création des objets dans les frames
+      liste_commandes_valeurs = (("<Button-1>",self.selectValeur),
+                                 ("<Button-3>",self.deselectValeur),
+                                 ("<Double-Button-1>",self.sup_valeur_sans_into))
+      self.Liste_valeurs = ListeChoix(self,self.frame_valeurs,l2_valeurs,liste_commandes = liste_commandes_valeurs,
+                                      titre="Valeur(s) actuelle(s)")
+
+      # Création de l'entry ou de la liste des SD
+      self.label = Label(self.frame_choix,text="Valeur :")
+      self.make_entry(frame = self.frame_choix,command = self.add_double_valeur_plusieurs_base)
+      self.label.place(relx=0.05,rely=0.5)
+
+      # Création d'un bouton "Importer ..." sur le panel.
+      bouton_valeurs_fichier = Button(self.frame_choix,
+                                      text="Importer ...",
+                                      command=self.select_in_file)
+      bouton_valeurs_fichier.place(relx=0.28,rely=0.7,relwidth=0.6)
+      self.ajout_valeurs = None
+
+      # boutons Ajouter et Supprimer
+      bouton_add = Button(self.frame_boutons_fleches,
+                          image = images.get_image('arrow_left'),
+                          command = self.add_double_valeur_plusieurs_base)
+      bouton_sup = Button(self.frame_boutons_fleches,
+                          image = images.get_image('arrow_right'),
+                          command = self.sup_valeur_sans_into)
+      bouton_add.place(relx=0.3,rely=0.35)
+      bouton_sup.place(relx=0.3,rely=0.65)
+      # affichage de l'aide
+      self.frame_aide.update()
+      self.aide = Label(self.frame_aide,
+                        text = aide,
+                        justify='center',
+                        anchor='center',
+                       wraplength=int(self.frame_aide.winfo_width()*0.8))
+      self.aide.place(relx=0.5,rely=0.5,anchor='center',relwidth=1)
+      self.Liste_valeurs.affiche_liste()
+      # boutons Accepter et Annuler
+      bouton_accepter = Button(self.frame_boutons,
+                               text='Valider',
+                               command = lambda s=self,m=min,M=max : s.accepte_modifs_valeur_recolle(m,M))
+      bouton_annuler = Button(self.frame_boutons,
+                              text = 'Annuler',
+                              command = self.annule_modifs_valeur)
+      for but in (bouton_accepter,bouton_annuler):
+          but.pack(side='left',padx=5)
+
+
+  def decoupeListeValeurs(self,liste):
+      #decoupe la liste des valeurs en 2 ( les x puis les y)
+      l_valeurs=[]
+      for i in range(len(liste)/2) :
+          t=(liste[i*2], liste[i*2+1])
+          l_valeurs.append(t)
+      return l_valeurs
+
+
+  def accepte_modifs_valeur_recolle(self,min,max):
+      l_valeurs=[]
+      l1_valeurs = self.Liste_valeurs.get_liste()
+      for val in l1_valeurs :
+         for item in val :
+            l_valeurs.append(item) 
+      self.accepte_modifs_valeur(min,max,l_valeurs)
+
+
+  def add_double_valeur_plusieurs_base(self):
+      # on verifie qu'il s agit bien d un tuple
+      # on enleve les parentheses eventuelles
+      doublevaleur_entree=self.get_valeur()
+      try:
+       if doublevaleur_entree[0]=='(' :
+          doublevaleur_entree=doublevaleur_entree[1:-1]
+       if doublevaleur_entree[-1]==')' :
+          doublevaleur_entree=doublevaleur_entree[0:-2]
+       val1=doublevaleur_entree.split(',')[0] 
+       val2=doublevaleur_entree.split(',')[1] 
+      except :
+        commentaire = "%s n est pas un tuple de la forme (x,y)" %`doublevaleur_entree`
+        self.parent.appli.affiche_infos(commentaire)
+        return
+
+      # et seulement d un tuple
+      try:
+       val3=doublevaleur_entree.split(',')[2]
+        commentaire = "%s n est pas un tuple de la forme (x,y)" %`doublevaleur_entree`
+        self.parent.appli.affiche_infos(commentaire)
+        return
+      except :
+        # c est la le cas normal
+       pass
+
+      # on verifie la validite des valeurs sont correctes
+      valeur,validite=self.node.item.eval_valeur((val1,val2))
+      if not validite :
+        commentaire = "impossible d'évaluer : %s " %`doublevaleur_entree`
+        self.parent.appli.affiche_infos(commentaire)
+       return
+
+      # on verifie la validite de la liste
+      liste=[]
+      l1_valeurs = self.Liste_valeurs.get_liste()
+      for val in l1_valeurs :
+         for item in val :
+            liste.append(item) 
+      validite_liste=self.node.item.valide_liste_partielle(valeur[0],liste)
+      if not validite_liste:
+        commentaire = "impossible d'ajouter %s a la liste " %`doublevaleur_entree`
+        self.parent.appli.affiche_infos(commentaire)
+       return
+      # liste a deja ete modifiee par l appel precedent a valide_liste_partielle 
+      # et contient deja valeur[0]
+      validite_liste=self.node.item.valide_liste_partielle(valeur[1],liste)
+      if not validite_liste:
+        commentaire = "impossible d'ajouter %s a la liste " %`doublevaleur_entree`
+        self.parent.appli.affiche_infos(commentaire)
+       return
+     
+      # si une valeur est selectionnee on la remplace
+      # sinon on ajoute la valeur
+      if (self.Liste_valeurs.selection != None):
+         l1_valeurs=[]
+         trouve=0
+         for val in self.Liste_valeurs.get_liste():
+          if val == self.Liste_valeurs.selection[0] and trouve == 0:
+             l1_valeurs.append((valeur[0],valeur[1]))
+             trouve=1
+         else :
+            l1_valeurs.append(val)
+      else :
+         l1_valeurs.append((valeur[0],valeur[1]))
+      self.Liste_valeurs.put_liste(l1_valeurs)
index da4d1ac82486a5c00b079de03517698e74d470a2..addda697a8190b34be2e7425495939aef413421c 100644 (file)
@@ -30,7 +30,7 @@ import Pmw
 # Modules Eficas
 import panels
 from treeitemincanvas import TREEITEMINCANVAS
-from tkMessageBox import showinfo,showerror
+from widgets import showinfo,showerror
 
 class CONFIG:
    isdeveloppeur='NON'
diff --git a/Editeur/newsimppanel.py b/Editeur/newsimppanel.py
new file mode 100644 (file)
index 0000000..3365876
--- /dev/null
@@ -0,0 +1,180 @@
+#            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.
+#
+# 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.
+#
+# 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.
+#
+#
+# ======================================================================
+# Modules Python
+import string,types,os
+from Tkinter import *
+import Pmw
+from copy import copy,deepcopy
+import traceback
+
+# Modules Eficas
+import Objecttreeitem
+import prefs
+import panels
+import images
+import composimp
+from widgets import ListeChoix
+from widgets import FenetreDeSelection
+
+from Noyau.N_CR import justify_text
+from utils import substract_list
+
+
+class newSIMPPanel(panels.OngletPanel):
+  """
+  Classe virtuelle servant de classe mère à toutes les classes Panel
+  servant à afficher et récupérer la valeur d'un mot-clé simple.
+  Le panel est différent suivant le type de la valeur attendu
+  """
+  def init(self):
+      """
+      Méthode appelée par le constructeur de OngletPanel :
+      construit le notebook à 2 onglets utilisé par tous les panels de
+      tous les mots-clés simples
+      """
+      nb = Pmw.NoteBook(self,raisecommand=self.raisecmd)
+      nb.pack(fill = 'both', expand = 1)
+      self.nb=nb
+      nb.add('Valeur', tab_text='Saisir valeur')
+      self.makeValeurPage(nb.page('Valeur'))
+      nb.setnaturalsize()
+      
+# ----------------------------------------------------------------------------------------
+#   Méthodes utilisées pour l'affectation de la valeur donnée par l'utilisateur
+#    au mot-clé courant
+# ----------------------------------------------------------------------------------------
+
+  def reset_old_valeur(self,name=None,mess='Valeur du mot-clé enregistrée'):
+      """
+          Enregistre  val comme valeur de self.node.item.object SANS 
+          faire de test de validité ni ré-évaluer l'ancienne valeur
+          permet de rester avec des valeurs non entrees et de ne pas 
+          ré-évaluer des entiers par exemple
+      """
+      if self.parent.modified == 'n' : self.parent.init_modif()
+      self.node.item.set_valeur(name)
+      self.parent.appli.affiche_infos(mess)
+      if self.node.item.get_position()=='global':
+           self.node.etape.verif_all()
+      elif self.node.item.get_position()=='global_jdc':
+           self.node.racine.verif_all()
+      else :
+           self.node.parent.verif()
+      self.node.update()
+
+  def record_valeur(self,name=None,mess='Valeur du mot-clé enregistrée'):
+      """
+          Enregistre  val comme valeur de self.node.item.object  
+         en evaluant l item et en le validant 
+          Si name n'est pas renseigné, la valeur 
+      """
+      if self.parent.modified == 'n' : self.parent.init_modif()
+      if name != None:
+          valeur = name
+          validite = 1
+      else :
+          valeurentree= self.entry.get()
+          self.entry.delete(0,END)
+          if valeurentree == '': valeurentree=None
+          valeur,validite=self.node.item.eval_valeur(valeurentree)
+          if not validite :
+               valeur= self.entry.get()
+                commentaire = "impossible d'évaluer : %s " %`valeurentree`
+               self.parent.appli.affiche_infos(commentaire)
+               
+      if validite : 
+         if self.node.item.is_list() :
+            validite=self.node.item.valide_liste_complete(valeur)
+            commentaire=self.node.item.info_erreur_liste()
+         else :
+           validite=self.node.item.valide_item(valeur)
+            commentaire=self.node.item.info_erreur_item()
+      if validite :
+          self.node.item.set_valeur(valeur)
+          self.parent.appli.affiche_infos(mess)
+          if self.node.item.get_position()=='global':
+              self.node.etape.verif_all()
+          elif self.node.item.get_position()=='global_jdc':
+              self.node.racine.verif_all()
+          else :
+              self.node.parent.verif()
+          self.node.update()
+          if self.node.item.isvalid():
+              self.node.parent.select()
+      else :
+          self.parent.appli.affiche_infos(commentaire)
+
+# ----------------------------------------------------------------------------------------
+#   Méthodes utilisées pour la manipulation des items dans les listes de choix
+# ----------------------------------------------------------------------------------------
+  def selectValeur(self,name):
+      self.selected_valeur = name
+
+  def deselectValeur(self,name):
+      self.selectValeur = None
+
+  def sup_valeur(self,name=None):
+      """
+      Supprime la valeur selectionnée de la liste des valeurs et la rajoute
+      à la liste des choix possibles
+      """
+      if hasattr(self,'selected_valeur') :
+         if ( self.selected_valeur != None and self.selected_valeur != ''):
+            liste_valeurs = self.Liste_valeurs.get_liste()
+            liste_valeurs.remove(self.selected_valeur)
+            self.Liste_valeurs.put_liste(liste_valeurs)
+            listeActuelle=self.Liste_valeurs.get_liste()
+            liste_choix=self.node.item.get_liste_possible(listeActuelle)
+            self.Liste_choix.put_liste(liste_choix)
+            self.selected_valeur = None
+
+  def add_choix(self,name=None):
+      """
+      Ajoute le choix selectionné à la liste des valeurs et le retire
+      de la liste des choix possibles
+      """
+      
+      if hasattr(self,'selected_choix') :
+         if (self.selected_choix != None and self.selected_choix != ''):
+            min,max = self.node.item.GetMinMax()
+            liste_valeurs = self.Liste_valeurs.get_liste()
+            if len(liste_valeurs) >= max :
+                self.parent.appli.affiche_infos("La liste ne peut pas avoir plus de %d éléments" %max)
+                return
+            liste_valeurs.append(self.selected_choix)
+            self.Liste_valeurs.put_liste(liste_valeurs)
+            listeActuelle=self.Liste_valeurs.get_liste()
+            liste_choix=self.node.item.get_liste_possible(listeActuelle)
+            self.Liste_choix.put_liste(liste_choix)
+            self.selected_choix = None
+
+  def selectChoix(self,name):
+      self.selected_choix = name
+
+  def deselectChoix(self,name):
+      self.selectChoix = None
+      
+  def raisecmd(self,page):
+      try:
+         self.entry.focus()
+      except:
+         pass
+
index db1d1b6f81cfbc5b375fc6a5b85bf096adabd964..84b4c90575c99c10d9f0cc4afb8fb2059ebea147 100644 (file)
@@ -21,9 +21,9 @@
 """
 # Modules Python
 import os,string
-from tkFileDialog import *
 
 # Modules Eficas
+from widgets import askopenfilename
 
 # l'option affichage_commandes peut prendre les valeurs "groupes" ou "alphabetic"
 affichage_commandes="alphabetic"
@@ -62,7 +62,7 @@ class OPTIONS:
       file = askopenfilename(title="Choix d'un catalogue personnel",
                              defaultextension=".py",
                              filetypes = ( ("Catalogue", "cata*.py"),))
-      if file != '':
+      if file :
           self.parent.update_idletasks()
           self.appli.reset_affichage_infos()
           rep_fic = os.path.dirname(file)
index 61b142c9fabd22604aa7aa94cc737c1a311c26c3..b04631ea6acd7f8157eb85248d342b0fff788255 100644 (file)
@@ -21,9 +21,9 @@ import string
 import os
 from Tkinter import *
 import Pmw
-import tkMessageBox
 import time
 
+import widgets
 from widgets import ListeChoix
 from widgets import ListeChoixParGroupes
 import prefs
@@ -511,7 +511,7 @@ class OngletPanel(Panel) :
         commande_comment = self.node.item.get_objet_commentarise()
         self.parent.appli.bureau.JDCDisplay_courant.ReplaceObjectNode(self.node,commande_comment,None)
     except Exception,e:
-        tkMessageBox.showerror("TOO BAD",str(e))
+        widgets.showerror("TOO BAD",str(e))
     return
       
 class Panel_Inactif(Panel):
diff --git a/Editeur/panelsSalome.py b/Editeur/panelsSalome.py
new file mode 100644 (file)
index 0000000..57efd36
--- /dev/null
@@ -0,0 +1,485 @@
+print "Import de panelsSalome"
+
+from Tkinter import *
+from widgets import ListeChoix
+from widgets import showerror
+
+from fonctionpanel      import FONCTION_Panel
+from shellpanel         import SHELLPanel
+from plusieursintopanel import PLUSIEURS_INTO_Panel
+from plusieursassdpanel import PLUSIEURS_ASSD_Panel
+from plusieursbasepanel import PLUSIEURS_BASE_Panel
+from uniquesdcopanel    import UNIQUE_SDCO_Panel
+from uniqueassdpanel    import UNIQUE_ASSD_Panel
+from uniqueintopanel    import UNIQUE_INTO_Panel
+from uniquecomppanel    import UNIQUE_COMP_Panel
+from uniquebasepanel    import UNIQUE_BASE_Panel
+
+from Noyau.N_CR import justify_text
+
+import traceback
+import SalomePyQt
+import salome
+import images
+import SMESH_utils
+sgQt=SalomePyQt.SalomePyQt()
+
+
+
+# 2 types de commandes vont etre particularisees dans Salome
+#
+# - un cas general : 
+# Toutes les commandes possedant GROUP_NO ou GROUP_MA
+# seront surchargees d office
+# pour cela on va utiliser le dictionnaire dict_classes_salome
+# qui va permettre de changer la classe de la commande
+# ainsi si un panel en dehors de salome a pour classe PLUSIEURS_BASE_Panel
+# la classe de ce panel devient alors SALOME_PLUSIEURS_BASE_Panel
+# (pour cela voir composimp)
+
+# des commandes "autres" ne pouvant pas etre identifiées par leur nom 
+# il suffit de creer dans la classe SALOME de la commande
+# une fonction portant son nom 
+# Exemple de particularisation d un panel :
+# Supposons que l on veuille particulariser la commande
+#      - LIRE_MAILLAGE_UNITE 
+# le panel initial a pour classe UNIQUE_BASE_Panel
+# il suffit d'ajouter dans la classe derivée SALOME_UNIQUE_BASE_Panel
+# une fonction  SALOME_LIRE_MAILLAGE_UNITE
+# la classe de ce panel devient alors SALOME_UNIQUE_BASE_Panel
+# on peut surcharger les methodes nécessaires (affichage par exemple)  
+
+
+class SALOME_SHELLPanel (SHELLPanel):
+       ""
+
+class SALOME_FONCTION_Panel (FONCTION_Panel):
+       ""
+
+class SALOME_PLUSIEURS_INTO_Panel (PLUSIEURS_INTO_Panel):
+       ""
+
+class SALOME_PLUSIEURS_ASSD_Panel (PLUSIEURS_ASSD_Panel):
+       ""
+
+class SALOME_UNIQUE_INTO_Panel (UNIQUE_INTO_Panel):
+       ""
+
+class SALOME_UNIQUE_SDCO_Panel (UNIQUE_SDCO_Panel):
+       ""
+
+class SALOME_UNIQUE_ASSD_Panel (UNIQUE_ASSD_Panel):
+       ""
+
+class SALOME_UNIQUE_COMP_Panel (UNIQUE_COMP_Panel):
+       ""
+
+# ------------------------------------------------------------------------------#
+# classe SALOME_PLUSIEURS_BASE_Panel
+#
+# Commandes modifiées  :  
+#      - AFFE_CHAR_MECA_DDL_IMPO_GROUP_NO
+# Methodes surchargées :  
+#      - makeValeurPage(self,page)
+#
+# ------------------------------------------------------------------------------#
+
+class SALOME_PLUSIEURS_BASE_Panel(PLUSIEURS_BASE_Panel):
+
+
+  def convertit_group_no_from_salome(self,liste_in):
+      newr=[]
+      try:
+          print liste_in
+         for entree in liste_in :
+              travail=[]
+              travail.append(entree)
+              entryname_list=SMESH_utils.entryToName(salome.myStudy,travail)
+               entreeName=entryname_list[0]
+              if dict_geom_numgroupe.has_key(entreeName):
+                  r=dict_geom_numgroupe[entreeName]
+              else:
+                   r=SMESH_utils.getAsterGroupNo(salome.myStudy,travail)
+                  dict_geom_numgroupe[entreeName]=r
+               for i in r :
+                   newr.append(i)
+      except:
+          print "pas de groupe de noeuds associé"
+          showerror("Pas de groupe associé","Cet Objet ne peut pas être défini comme un ensemble de groupe de noeuds")
+      return newr
+
+  def convertit_group_maille_from_salome(self,liste_in):
+      newr=[]
+      try:
+          print liste_in
+         for entree in liste_in :
+              travail=[]
+              travail.append(entree)
+              entryname_list=SMESH_utils.entryToName(salome.myStudy,travail)
+               entreeName=entryname_list[0]
+              if dict_geom_numgroupe.has_key(entreeName):
+                  r=dict_geom_numgroupe[entreeName]
+              else:
+                   r=SMESH_utils.getAsterGroupMa(salome.myStudy,travail)
+                  dict_geom_numgroupe[entreeName]=r
+               for i in r :
+                   newr.append(i)
+      except:
+          print "pas de groupe de maille associé"
+          showerror("Pas de groupe associé","Cet Objet ne peut pas être défini comme un ensemble de groupe de maille")
+      return newr
+
+  def convertit_entrees_en_valeurs(self,entrychaine):
+      if SALOME_PLUSIEURS_BASE_Panel.__dict__.has_key(self.clef_fonction):
+           valeur=apply(SALOME_PLUSIEURS_BASE_Panel.__dict__[self.clef_fonction],(self,entrychaine))
+      else :
+          if self.clef_fonction.find("GROUP_NO") != -1 :
+              valeur=self.convertit_group_no_from_salome(entrychaine)
+          else :
+              if self.clef_fonction.find("GROUP_MA") != -1 :
+                  valeur=self.convertit_group_maille_from_salome(entrychaine)
+              else :
+                   print "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
+                   print "Pb pas de fonction de conversion de la valeur Salome en valeur Aster"
+                   print "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
+                    valeur=[]
+      print "VALEUR", valeur
+      return valeur
+
+  def sup_valeur_from_salome(self,name=None):
+      """
+      Méthode qui sert à retirer de la liste des valeurs la valeur sélectionnée
+      """
+      liste_valeurs = self.Liste_valeurs.get_liste()
+      liste_valeurs_salome=self.Liste_valeurs_salome.get_liste()
+      entrychaine=salome.sg.getAllSelected()
+
+      try:
+          valeur = self.convertit_entrees_en_valeurs(entrychaine)
+          for i in valeur :
+            if i in liste_valeurs :
+               liste_valeurs.remove(i)
+                print "enleve" , i
+      except:
+          # la valeur sélectionnée n'est pas dans la liste
+          pass
+
+      entryname_list=SMESH_utils.entryToName(salome.myStudy,entrychaine)
+      print  entryname_list
+      self.entrygroupe.delete(0,END)
+      self.sortie.delete(0,END)
+      for entryname in entryname_list:
+          try:
+            liste_valeurs_salome.remove(entryname)
+         except:
+            print "la valeur ", entryname, "n est pas dans la liste"
+         entryname=entryname + " "
+          self.sortie.insert(0,entryname)
+      self.selected_valeur = None
+      self.Liste_valeurs.put_liste(liste_valeurs)
+      self.Liste_valeurs_salome.put_liste(liste_valeurs_salome)
+      self.recalcule()
+
+  def recalcule(self):
+      liste_valeurs_salome=self.Liste_valeurs_salome.get_liste()
+      groups={}
+      liste_valeurs = self.Liste_valeurs.get_liste()
+      for valeur in liste_valeurs_salome:
+         r=dict_geom_numgroupe[valeur]
+          for i in r :
+              if i not in liste_valeurs :
+                 liste_valeurs.append(i)
+      self.Liste_valeurs.put_liste(liste_valeurs)
+
+  def add_valeur_from_salome(self,name=None):
+       entrychaine=salome.sg.getAllSelected()
+       self.sortie.delete(0,END)
+       self.entrygroupe.delete(0,END)
+       if entrychaine != '':
+          entryname_list=SMESH_utils.entryToName(salome.myStudy,entrychaine)
+          touteslesvaleurs = self.convertit_entrees_en_valeurs(entrychaine)
+         
+          valeur=[]
+          liste_valeurs  = self.Liste_valeurs.get_liste()
+          for i in touteslesvaleurs:
+              if i not in liste_valeurs:
+                valeur.append(i)
+             
+          print valeur
+          if valeur==[]:
+            entryname_list=[]
+
+          liste_valeurs_salome = self.Liste_valeurs_salome.get_liste()
+         for entryname in entryname_list:
+             if entryname not in liste_valeurs_salome: 
+                 liste_valeurs_salome.append(entryname)
+             entryname=entryname + " "
+              self.entrygroupe.insert(0,entryname)
+          self.Liste_valeurs_salome.put_liste(liste_valeurs_salome)
+
+          if self.node.item.wait_reel():
+             print "wait_reel()"
+             valeur = self.traite_reel(valeur)
+          if self.node.item.wait_geom():
+             print "wait_geom()"
+             val,test1 = valeur,1
+          else:
+             print "else wait"
+             val,test1 = self.node.item.object.eval_valeur(valeur)
+
+          if test1 :
+             test2 = self.node.item.object.verif_type(val)
+             if test2 :
+                 liste_valeurs = self.Liste_valeurs.get_liste()
+                 if len(liste_valeurs) >= max :
+                     self.parent.appli.affiche_infos("La liste a déjà atteint le nombre maximum d'éléments, ajout refusé")
+                     self.erase_valeur()
+                     return
+                 if type(val) == type([]):
+                   for groupe in val:
+                     liste_valeurs.append(groupe)
+                 else:
+                   liste_valeurs.append(val)
+                 self.Liste_valeurs.put_liste(liste_valeurs)
+                 self.parent.appli.affiche_infos("Nouvelle valeur acceptée")
+             else:
+                 self.parent.appli.affiche_infos("Valeur incorrecte : ajout à la liste refusé")
+          else:
+             print "impossible d'évaluer %s" %val
+             self.parent.appli.affiche_infos("Valeur incorrecte : ajout à la liste refusé")
+
+   
+  def makeValeurPage(self,page):
+      """
+      Crée la page de saisie d'une liste de valeurs à priori quelconques,
+      cad qui ne sont  pas à choisir dans une liste prédéfinie
+      """
+      # On récupère la bulle d'aide du panneau, l'objet, l'aide,min et max (cardinalité de la liste),
+      # et la liste des valeurs déjà affectées à l'objet courant
+      bulle_aide=self.get_bulle_aide()
+      objet_mc = self.node.item.get_definition()
+      aide = self.get_aide()
+      aide = justify_text(texte=aide)
+      min,max = self.node.item.GetMinMax()
+      self.clef_fonction=  self.node.item.clef_fonction
+      l_valeurs = self.node.item.GetListeValeurs()
+
+      self.frame1 = Frame(page,relief='groove',bd=2)
+      self.frame2 = Frame(page)
+      self.frame1.place(relx=0.,rely=0.,relwidth=1.,relheight=0.85)
+      self.frame2.place(relx=0.,rely=0.85,relwidth=1,relheight=0.15)
+      self.frame_right = Frame(self.frame1)
+      self.frame_right.place(relx=0.35,rely=0.,relwidth=0.65,relheight=1.)
+
+      # création des frames internes
+      self.frame_valeurs = Frame(self.frame1)
+      self.frame_valeurs.place(relx=0.02,rely=0.05,relwidth=0.35,relheight=0.95)
+
+      self.frame_boutons_fleches = Frame(self.frame_right)
+      self.frame_boutons_fleches.place(relx=0.,rely=0.2,relwidth=0.2,relheight=0.3)
+      self.frame_choix = Frame(self.frame_right)
+      self.frame_choix.place(relx=0.2,rely=0.1,relwidth=0.85,relheight=0.9)
+      self.frame_valeurs_salome = Frame(self.frame_right)
+      self.frame_valeurs_salome.place(relx=0.02,rely=0.7,relwidth=0.9,relheight=0.3)
+
+      self.frame_boutons = Frame(self.frame2)
+      self.frame_boutons.place(relx=0.1,rely=0.,relwidth=0.5,relheight=1.)
+      self.frame_aide = Frame(self.frame2)
+      self.frame_aide.place(relx=0.6,rely=0.,relwidth=0.5,relheight=1)
+
+      for fram in (self.frame1,self.frame2,self.frame_right,self.frame_valeurs,
+                 self.frame_boutons_fleches,self.frame_choix,self.frame_aide,self.frame_boutons):
+            fram.bind("<Button-3>",lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a))
+            fram.bind("<ButtonRelease-3>",self.parent.appli.efface_aide)
+
+      # création des objets dans les frames
+      liste_commandes_valeurs = (("<Button-1>",self.selectValeur),
+                                 ("<Button-3>",self.deselectValeur),
+                                 ("<Double-Button-1>",self.sup_valeur_sans_into))
+      self.Liste_valeurs = ListeChoix(self,self.frame_valeurs,l_valeurs,
+                                     liste_commandes = liste_commandes_valeurs,
+                                      titre="Valeur(s) actuelle(s)")
+
+      self.label = Label(self.frame_choix,text="Valeur :")
+      self.label.place(relx=0.05,rely=0.4)
+    # PN : pour ajouter les validators
+      self.make_entry(frame = self.frame_choix,command = self.add_valeur_plusieurs_base)
+
+      bouton_valeurs_fichier = Button(self.frame_choix,
+                                      text="Importer ...",
+                                      command=self.select_in_file)
+      bouton_valeurs_fichier.place(relx=0.28,rely=0.55,relwidth=0.6)
+
+      self.ajout_valeurs = None
+      self.b = Button(self.frame_choix,text='ajouter  selection',command=self.add_valeur_from_salome)
+
+      self.b.place(relx=0.05,rely=0.05)
+      self.entrygroupe = Entry(self.frame_choix,relief='sunken')
+      self.entrygroupe.place(relx=0.50,rely=0.05)
+
+      self.a = Button(self.frame_choix,text='enlever selection',command=self.sup_valeur_from_salome)
+      self.a.place(relx=0.05,rely=0.2)
+      self.sortie = Entry(self.frame_choix,relief='sunken')
+      self.sortie.place(relx=0.50,rely=0.2)
+
+      l_salome_valeurs=self.node.item.get_salome_valeurs()
+      self.Liste_valeurs_salome=ListeChoix(self,self.frame_valeurs_salome,l_salome_valeurs,
+                                       liste_commandes = liste_commandes_valeurs,
+                                       titre="Valeur(s) Salome actuelle(s) ")
+      self.Liste_valeurs_salome.affiche_liste()
+
+
+      # boutons Ajouter et Supprimer
+      bouton_add = Button(self.frame_boutons_fleches,
+                          image = images.get_image('arrow_left'),
+                          command = self.add_valeur_plusieurs_base)
+      bouton_sup = Button(self.frame_boutons_fleches,
+                          image = images.get_image('arrow_right'),
+                          command = self.sup_valeur_sans_into)
+      bouton_add.place(relx=0.3,rely=0.35)
+      bouton_sup.place(relx=0.3,rely=0.65)
+
+      # affichage de l'aide
+      self.frame_aide.update()
+      self.aide = Label(self.frame_aide, text = aide,
+                        justify='center', anchor='center',
+                        wraplength=int(self.frame_aide.winfo_width()*0.8))
+      self.aide.place(relx=0.5,rely=0.5,anchor='center',relwidth=1)
+      self.Liste_valeurs.affiche_liste()
+
+      # boutons Accepter et Annuler
+      bouton_accepter = Button(self.frame_boutons,
+                               text='Valider',
+                               command = lambda s=self,m=min,M=max : s.accepte_modifs_valeur(m,M))
+      bouton_annuler = Button(self.frame_boutons,
+                              text = 'Annuler',
+                              command = self.annule_modifs_valeur)
+      for but in (bouton_accepter,bouton_annuler):
+          but.pack(side='left',padx=5)
+
+
+
+# ------------------------------------------------------------------------------#
+# classe SALOME_UNIQUE_BASE_Panel
+#
+# Commandes modifiées  :  
+#      - LIRE_MAILLAGE_UNITE 
+# Methodes surchargées :  
+#      - makeValeurPage(self,page)
+#
+# ------------------------------------------------------------------------------#
+
+class SALOME_UNIQUE_BASE_Panel(UNIQUE_BASE_Panel):
+
+# ce dictionnaire va servir lors de la sortie d efficas
+# a creer le fichier qui sera integre au config.txt
+# pour relier une unite logique et un nom de fichier
+
+  dict_fichier_unite={}
+
+  def SALOME_LIRE_MAILLAGE_UNITE(self):
+
+      unite=self.node.item.get_valeur()
+      entrychaine=salome.sg.getAllSelected()
+      if entrychaine != '':
+         self.entry2.delete(0,END)
+
+          try:
+             print salome.myStudy
+              SO = salome.myStudy.FindObjectID(entrychaine[0])
+             print SO
+          except:
+              boo = 0
+              SO = None
+
+          if SO != None:
+             myBuilder = salome.myStudy.NewBuilder()
+              boo,FileAttr = myBuilder.FindAttribute(SO,"AttributeComment")
+
+          if boo == 0 :
+            FileName=''
+             print "a"
+          else :
+            Comment=FileAttr.Value()
+             print "ICI"
+             print Comment
+             if Comment.find("FICHIERMED")== -1 :
+                FileName=''
+             else :
+                FileName=Comment[10:]
+
+
+          print "FileName = " , FileName
+         if FileName != '' :
+              print FileName
+             self.entry2.insert(0,FileName)
+              typefic='D'
+              SALOME_UNIQUE_BASE_Panel.dict_fichier_unite[unite]=typefic+FileName
+          else :
+             print "il faut afficher une Fenetre d impossibilité"
+             showerror("Pas de Fichier MED","Cet Objet n a pas de fichier MED Associé")
+
+  def makeValeurPage(self,page):
+      """
+      Génère la page de saisie de la valeur du mot-clé simple courant qui doit être de type
+      de base cad entier, réel, string ou complexe
+      """
+      # Récupération de l'aide associée au panneau, de l'aide destinée à l'utilisateur,
+      # et de la liste des SD du bon type (constituant la liste des choix)
+      bulle_aide=self.get_bulle_aide()
+      aide=self.get_aide()
+      aide= justify_text(texte=aide)
+      liste_noms_sd = self.node.item.get_sd_avant_du_bon_type()
+      # Remplissage du panneau
+      self.frame_valeur = Frame(page)
+      self.frame_valeur.pack(fill='both',expand=1)
+      self.frame_valeur.bind("<Button-3>",lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a))
+      self.frame_valeur.bind("<ButtonRelease-3>",self.parent.appli.efface_aide)
+      self.label = Label(self.frame_valeur,text='Valeur :')
+      self.label.place(relx=0.1,rely=0.5)
+      self.entry = Entry(self.frame_valeur,relief='sunken')
+      self.entry.place(relx=0.28,rely=0.5,relwidth=0.6)
+      self.entry.bind("<Return>",lambda e,c=self.valid_valeur:c())
+
+      # PN : Ajout d'un bouton pour selectionner  à partir de Salome  
+      self.b = Button(self.frame_valeur,text='Relier a selection',command=self.SALOME_LIRE_MAILLAGE_UNITE)
+      self.b.place(relx=0.1,rely=0.1)
+      unite=self.node.item.get_valeur()
+      self.entry2 = Entry(self.frame_valeur,relief='sunken')
+      self.entry2.place(relx=0.3,rely=0.1)
+      self.entry2.configure(width = 250)
+
+      if SALOME_UNIQUE_BASE_Panel.dict_fichier_unite.has_key(unite):
+         associe=SALOME_UNIQUE_BASE_Panel.dict_fichier_unite[unite][1:]
+        self.entry2.delete(0,END)
+        if associe != "" :
+             self.entry2.insert(0,associe)
+      else:
+        self.entry2.delete(0,END)
+
+      # aide associée au panneau
+      self.frame_valeur.update()
+      self.aide = Label(self.frame_valeur,
+                        text = aide,
+                        wraplength=int(self.frame_valeur.winfo_width()*0.8),
+                        justify='center')
+      self.aide.place(relx=0.5,rely=0.7,anchor='n')
+      # affichage de la valeur du MCS
+      self.display_valeur()
+
+#---------------------------------------------------------------------------------------
+# Correspondances entre les classes eficas et les classes salome_eficas 
+#______________________________________________________________________________________
+dict_classes_salome = { SHELLPanel : SALOME_SHELLPanel, 
+                          FONCTION_Panel       : SALOME_FONCTION_Panel,
+                         PLUSIEURS_INTO_Panel : SALOME_PLUSIEURS_INTO_Panel,
+                         PLUSIEURS_ASSD_Panel : SALOME_PLUSIEURS_ASSD_Panel,
+                         PLUSIEURS_BASE_Panel : SALOME_PLUSIEURS_BASE_Panel,
+                         UNIQUE_INTO_Panel :  SALOME_UNIQUE_INTO_Panel,
+                         UNIQUE_SDCO_Panel : SALOME_UNIQUE_SDCO_Panel,
+                         UNIQUE_ASSD_Panel : SALOME_UNIQUE_ASSD_Panel,
+                         UNIQUE_COMP_Panel : SALOME_UNIQUE_COMP_Panel,
+                         UNIQUE_BASE_Panel : SALOME_UNIQUE_BASE_Panel}
+
+dict_geom_numgroupe = { }
+dict_geom_numface = { }
index fd6741180f2f823460ab4f251f25e3246b5ba4c6..04f75332c8bda859a1e4958e96f924604bad968f 100644 (file)
 """
 import string
 
-if 1:
-   # Modification de la fonction justify_text de Noyau.N_CR
-   separateurs=(' ',',','/')
-   def split(ligne,cesure):
-       ligne= string.rstrip(ligne)
-       if len(ligne) <= cesure : 
-          return ligne
-       else:
-          coupure=cesure
-          while ligne[coupure] not in separateurs and coupure > 0:
-             coupure = coupure - 1
-          if coupure == 0:
-             # Il faut augmenter la cesure
-             coupure =cesure
-             while ligne[coupure] not in separateurs and coupure < len(ligne)-1 :
-                coupure = coupure + 1
-          if coupure == len(ligne)-1:
-             return ligne
-          else:
-             return ligne[:coupure+1]+ '\n' + split(ligne[coupure+1:],cesure)
-
-   def justify_text(texte='',cesure=50):
-       texte = string.strip(texte)
-       liste_lignes = string.split(texte,'\n')
-       l=[split(l,cesure) for l in liste_lignes]
-       texte_justifie=string.join(l,'\n')
-       return texte_justifie
-   try:
-      import Noyau.N_CR
-      Noyau.N_CR.justify_text=justify_text
-   except:
-      pass
-
-def encadre_message(texte,motif):
-  """
-     Retourne la chaine de caractères texte entourée d'un cadre formés
-     d'éléments 'motif'
-  """
-  texte = justify_text(texte,cesure=80)
-  lignes = string.split(texte,'\n')
-  longueur = 0
-  for ligne in lignes :
-    if len(ligne)> longueur : longueur = len(ligne)
-  longueur = longueur + 4
-  txt = motif*longueur+'\n'
-  for ligne in lignes :
-    txt = txt + motif + ' '+ligne+' '*(longueur-len(motif+ligne)-2)+motif+'\n'
-  txt = txt + motif*longueur+'\n'
-  return txt
-
 if __name__ == "__main__":
-   print encadre_message(motif='!',
+   import Noyau.N_CR
+   print Noyau.N_CR.encadre_message(motif='!',
 texte="""- Il faut au moins un mot-clé parmi : ('DEBUT', 'POURSUITE')     
 - Il faut au moins un mot-clé parmi : ('FIN',)               
 - Il faut qu'au moins un objet de la liste : ('DEBUT', 'POURSUITE') soit suivi d'au moins un objet de la liste : ('FIN',) 
diff --git a/Editeur/plusieursassdpanel.py b/Editeur/plusieursassdpanel.py
new file mode 100644 (file)
index 0000000..761a4af
--- /dev/null
@@ -0,0 +1,181 @@
+#            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.
+#
+# 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.
+#
+# 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.
+#
+#
+# ======================================================================
+# Modules Python
+import string,types,os
+from Tkinter import *
+import Pmw
+from copy import copy,deepcopy
+import traceback
+
+# Modules Eficas
+import Objecttreeitem
+import prefs
+import panels
+import images
+from widgets import ListeChoix
+from widgets import FenetreDeSelection
+
+from Noyau.N_CR import justify_text
+from utils import substract_list
+
+# Import des panels
+from plusieurspanel import PLUSIEURS_Panel 
+
+class PLUSIEURS_ASSD_Panel(PLUSIEURS_Panel):
+  """
+  Classe définissant le panel associé aux mots-clés qui demandent
+  à l'utilisateur de donner une liste de valeurs qui ne sont pas
+  à choisir dans une liste discrètes et qui sont de type dérivé d'ASSD
+  """
+  def makeValeurPage(self,page):
+      """
+      Génère la page de saisie de plusieurs noms de SD parmi un ensemble discret
+      de SD possibles, cad d'un type cohérent avec les types attendus par le mot-clé simple
+      """
+      # On récupère la bulle d'aide du panneau, l'objet, l'aide, min et max (cardinalité de la liste),
+      # la liste des valeurs déjà affectées à l'objet courant et la liste des SD du bon type
+      bulle_aide=self.get_bulle_aide()
+      self.ajout_valeurs=None
+      objet_mc = self.node.item.get_definition()
+      aide = self.get_aide()
+      aide = justify_text(texte=aide)
+      min,max = self.node.item.GetMinMax()
+      l_valeurs = self.node.item.GetListeValeurs()
+      l_choix=self.node.item.get_sd_avant_du_bon_type()
+      l_choix.sort()
+      # remplissage du panneau
+      self.frame_valeurs = Frame(page)
+      self.frame_valeurs.place(relx=0.05,rely=0.05,relwidth=0.35,relheight=0.7)
+      self.frame_boutons_fleches = Frame(page)
+      self.frame_boutons_fleches.place(relx=0.4,rely=0.,relwidth=0.2,relheight=0.7)
+      self.frame_choix = Frame(page)
+      self.frame_choix.place(relx=0.6,rely=0.05,relwidth=0.35,relheight=0.7)
+      self.frame_boutons = Frame(page)
+      self.frame_boutons.place(relx=0.35,rely=0.87,relwidth=0.3,relheight=0.1)
+      liste_commandes_valeurs = (("<Button-1>",self.selectValeur),
+                                 ("<Button-3>",self.deselectValeur),
+                                 ("<Double-Button-1>",self.sup_valeur_sans_into))
+      liste_commandes_choix = (("<Button-1>",self.selectChoix),
+                               ("<Button-3>",self.deselectChoix),
+      #                         ("<Double-Button-1>",self.add_valeur_sans_into))
+                               ("<Double-Button-1>",self.add_eval_valeur_sans_into))
+      self.Liste_valeurs = ListeChoix(self,self.frame_valeurs,l_valeurs,liste_commandes = liste_commandes_valeurs,
+                                      titre="Valeur(s) actuelle(s)")
+      self.Liste_choix = ListeChoix(self,self.frame_choix,l_choix,liste_commandes = liste_commandes_choix,
+                                    titre= "Valeurs possibles")
+      bouton_add = Button(self.frame_boutons_fleches,
+                          #text="<--",
+                          image = images.get_image('arrow_left'),
+      #                    command = self.add_valeur_sans_into)
+                          command = self.add_eval_valeur_sans_into)
+      bouton_sup = Button(self.frame_boutons_fleches,
+                          #text="-->",
+                          image = images.get_image('arrow_right'),
+                          command = self.sup_valeur_sans_into)
+      bouton_accepter = Button(self.frame_boutons,
+                               text='Valider',
+                               command = lambda s=self,m=min,M=max : s.accepte_modifs_valeur(m,M))
+      bouton_annuler = Button(self.frame_boutons,
+                              text = 'Annuler',
+                              command = self.annule_modifs_valeur)
+      bouton_add.place(relx=0.3,rely=0.35)
+      bouton_sup.place(relx=0.3,rely=0.65)
+      for but in (bouton_accepter,bouton_annuler):
+          but.pack(side='left',padx=5)
+      self.Liste_valeurs.affiche_liste()
+      self.Liste_choix.affiche_liste()
+      for fram in (self.frame_valeurs,self.frame_boutons_fleches,self.frame_choix,self.frame_boutons):
+          fram.bind("<Button-3>",lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a))
+          fram.bind("<ButtonRelease-3>",self.parent.appli.efface_aide)
+  
+  def add_eval_valeur_sans_into(self,valeurentree=None):
+      valeur,validite=self.node.item.eval_valeur(valeurentree)
+      if not validite :
+             commentaire = "impossible d'évaluer : %s " %`valeurentree`
+             self.parent.appli.affiche_infos(commentaire)
+             return
+      self.add_valeur_sans_into(valeur)
+
+  def get_bulle_aide(self):
+      """
+      Retourne la bulle d'aide associée au panneau
+      """
+      return """Un clic sur une valeur des deux listes la sélectionne.
+      - Un clic sur la flèche gauche stocke la valeur possible sélectionnée
+      dans la liste des valeurs que vous voulez affecter au mot-clé simple
+      - Un clic sur la flèche droite déstocke la valeur du mot-clé simple
+      sélectionnée (elle apparaît alors à nouveau comme choix possible
+      dans la liste des choix à droite)
+      - Cliquez sur 'Valider' pour affecter la liste des valeurs sélectionnées
+      au mot-clé simple courant
+      - Cliquez sur 'Annuler' pour restaurer la valeur du mot-clé simple
+      avant toute modification depuis le dernier 'Valider'"""
+
+  def get_aide(self):
+      """
+      Retourne la phrase d'aide indiquant de quel type doivent être les
+      valeurs que doit entrer l'utilisateur
+      """
+      commentaire=""
+      mc = self.node.item.get_definition()
+      type = mc.type[0].__name__  
+      if len(mc.type)>1 :
+          for typ in mc.type[1:] :
+              type = type + ' ou '+typ.__name__
+      if mc.min == mc.max:
+        commentaire="Une liste de "+`mc.min`+" objets de type "+type+" est attendue"
+      else :
+        commentaire="Une liste d'objets de type "+type+" est attendue (min="+`mc.min`+",max="+`mc.max`+')'
+      aideval=self.node.item.aide()
+      commentaire=commentaire +"\n"+ aideval
+      return commentaire
+
+    
+  def sup_valeur(self,name=None):
+      """
+      Supprime la valeur selectionnée de la liste des valeurs et la rajoute
+      à la liste des choix possibles
+      """
+      liste_valeurs = self.Liste_valeurs.get_liste()
+      liste_valeurs.remove(self.selected_valeur)
+      liste_choix = self.node.item.get_definition().into
+      liste_choix = substract_list(liste_choix,liste_valeurs)
+      self.Liste_valeurs.put_liste(liste_valeurs)
+      self.Liste_choix.put_liste(liste_choix)
+      self.selected_valeur = None      
+    
+  def erase_valeur(self):
+      pass
+
+  def get_valeur(self):
+      """
+      Retourne la valeur sélectionnée dans la liste des choix
+      """
+      return self.selected_choix
+
+  def display_valeur(self,val=None):
+      """
+         Affiche la valeur passée en argument dans l'entry de saisie.
+         Par défaut affiche la valeur du mot-clé simple
+      """
+      # Il n'y a pas d'entry pour ce type de panneau
+      return
+
+    
diff --git a/Editeur/plusieursbasepanel.py b/Editeur/plusieursbasepanel.py
new file mode 100644 (file)
index 0000000..c375760
--- /dev/null
@@ -0,0 +1,297 @@
+#            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.
+#
+# 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.
+#
+# 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.
+#
+#
+# ======================================================================
+# Modules Python
+import string,types,os
+from Tkinter import *
+import Pmw
+from copy import copy,deepcopy
+import traceback
+
+# Modules Eficas
+import Objecttreeitem
+import prefs
+import panels
+import images
+from widgets import showinfo
+from widgets import askopenfilename
+from widgets import ListeChoix
+from widgets import FenetreDeSelection
+
+from Noyau.N_CR import justify_text
+from utils import substract_list
+from plusieurspanel import PLUSIEURS_Panel
+
+
+
+class PLUSIEURS_BASE_Panel(PLUSIEURS_Panel):
+  """
+  Classe définissant le panel associé aux mots-clés qui demandent
+  à l'utilisateur de donner une liste de valeurs qui ne sont pas
+  à choisir dans une liste discrètes et qui sont de type de base :
+  entier, réel, string,...
+  """
+  def makeValeurPage(self,page):
+      """
+      Crée la page de saisie d'une liste de valeurs à priori quelconques,
+      cad qui ne sont  pas à choisir dans une liste prédéfinie
+      """
+      # On récupère la bulle d'aide du panneau, l'objet, l'aide,min et max (cardinalité de la liste),
+      # et la liste des valeurs déjà affectées à l'objet courant
+      bulle_aide=self.get_bulle_aide()
+      objet_mc = self.node.item.get_definition()
+      aide = self.get_aide()
+      aide = justify_text(texte=aide)
+      min,max = self.node.item.GetMinMax()
+      l_valeurs = self.node.item.GetListeValeurs()
+
+      # création des frames globales
+      self.frame1 = Frame(page,relief='groove',bd=2)
+      self.frame2 = Frame(page)
+      self.frame1.place(relx=0.,rely=0.,relwidth=1.,relheight=0.85)
+      self.frame2.place(relx=0.,rely=0.85,relwidth=1,relheight=0.15)
+      self.frame_right = Frame(self.frame1)
+      self.frame_right.place(relx=0.35,rely=0.,relwidth=0.65,relheight=1.)
+
+      # création des frames internes
+      self.frame_valeurs = Frame(self.frame1)
+      self.frame_valeurs.place(relx=0.02,rely=0.05,relwidth=0.35,relheight=0.95)
+      self.frame_boutons_fleches = Frame(self.frame_right)
+      self.frame_boutons_fleches.place(relx=0.,rely=0.2,relwidth=0.2,relheight=0.5)
+      self.frame_choix = Frame(self.frame_right)
+      self.frame_choix.place(relx=0.2,rely=0.2,relwidth=0.7,relheight=0.5)
+      self.frame_aide = Frame(self.frame_right)
+      self.frame_aide.place(relx=0.1,rely=0.7,relwidth=0.8,relheight=0.3)
+      self.frame_boutons = Frame(self.frame2)
+      self.frame_boutons.place(relx=0.35,rely=0.,relwidth=0.3,relheight=1.)
+      for fram in (self.frame1,self.frame2,self.frame_right,self.frame_valeurs,
+                 self.frame_boutons_fleches,self.frame_choix,self.frame_aide,self.frame_boutons):
+          fram.bind("<Button-3>",lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a))
+          fram.bind("<ButtonRelease-3>",self.parent.appli.efface_aide)
+
+      # création des objets dans les frames
+      liste_commandes_valeurs = (("<Button-1>",self.selectValeur),
+                                 ("<Button-3>",self.deselectValeur),
+                                 ("<Double-Button-1>",self.sup_valeur_sans_into))
+      self.Liste_valeurs = ListeChoix(self,self.frame_valeurs,l_valeurs,liste_commandes = liste_commandes_valeurs,
+                                      titre="Valeur(s) actuelle(s)")
+
+      # Création de l'entry ou de la liste des SD
+      self.label = Label(self.frame_choix,text="Valeur :")
+      # PN : pour ajouter les validators
+      self.make_entry(frame = self.frame_choix,command = self.add_valeur_plusieurs_base)
+      self.label.place(relx=0.05,rely=0.5)
+
+      # Création d'un bouton "Importer ..." sur le panel.
+      bouton_valeurs_fichier = Button(self.frame_choix,
+                                      text="Importer ...",
+                                      command=self.select_in_file)
+      bouton_valeurs_fichier.place(relx=0.28,rely=0.7,relwidth=0.6)
+      self.ajout_valeurs = None
+
+      # boutons Ajouter et Supprimer
+      bouton_add = Button(self.frame_boutons_fleches,
+                          image = images.get_image('arrow_left'),
+                          command = self.add_valeur_plusieurs_base)
+      bouton_sup = Button(self.frame_boutons_fleches,
+                          image = images.get_image('arrow_right'),
+                          command = self.sup_valeur_sans_into)
+      bouton_add.place(relx=0.3,rely=0.35)
+      bouton_sup.place(relx=0.3,rely=0.65)
+      # affichage de l'aide
+      self.frame_aide.update()
+      self.aide = Label(self.frame_aide,
+                        text = aide,
+                        justify='center',
+                        anchor='center',
+                       wraplength=int(self.frame_aide.winfo_width()*0.8))
+      self.aide.place(relx=0.5,rely=0.5,anchor='center',relwidth=1)
+      self.Liste_valeurs.affiche_liste()
+      # boutons Accepter et Annuler
+      bouton_accepter = Button(self.frame_boutons,
+                               text='Valider',
+                               command = lambda s=self,m=min,M=max : s.accepte_modifs_valeur(m,M))
+      bouton_annuler = Button(self.frame_boutons,
+                              text = 'Annuler',
+                              command = self.annule_modifs_valeur)
+      for but in (bouton_accepter,bouton_annuler):
+          but.pack(side='left',padx=5)
+
+  def add_valeur_plusieurs_base(self,name=None):
+      if name != None :
+         valeur = name
+      else:
+         valeur,validite,commentaire=self.get_valeur()
+         if not validite :
+            self.parent.appli.affiche_infos(commentaire)
+            return
+
+      encorevalide=self.node.item.valide_item(valeur)
+      if encorevalide :
+         listecourante=self.Liste_valeurs.get_liste()
+         encorevalide=self.node.item.valide_liste_partielle(valeur,listecourante)
+         if not encorevalide : encorevalide = -1
+      self.add_valeur_sans_into(valeur,encorevalide)
+    
+  def select_in_file(self):
+      """ Permet d'ouvrir un fichier choisi par l'utilisateur. """
+      nom_fichier = askopenfilename(title="Choix fichier :")
+
+      if not nom_fichier:
+          return
+
+      try:
+          f = open(nom_fichier, "rb")
+          selection_texte = f.read()
+          f.close()
+          self.ajout_valeurs = FenetreDeSelection(self, 
+                                                 self.node.item,
+                                                 self.parent.appli,
+                                                 titre="Sélection de valeurs",
+                                                 texte=selection_texte)
+      except:
+          traceback.print_exc()
+          showinfo("Erreur de fichier","impossible d'ouvir le fichier "+nom_fichier)
+          
+  def get_bulle_aide(self):
+      """
+      Retourne l'aide associée au panneau courant
+      """
+      return """Taper dans la boîte de saisie de droite la valeur que
+      vous voulez affecter au mot-clé simple.
+      - Cliquez sur la flèche gauche ou pressez <Return> pour la faire glisser
+      dans la liste des valeurs que vous voulez affecter au mot-clé simple
+      - Un clic sur une valeur de la liste la sélectionne
+      - Un clic sur la flèche droite ou un double-clic retire la valeur
+      sélectionnée de la liste
+      - Cliquez sur 'Valider' pour que la nouvelle valeur désirée soit affectée
+      au mot-clé simple
+      - Cliquez sur 'Annuler' pour annuler toutes les modifications faites
+      depuis le dernier clic sur 'Valider'"""
+
+  def get_aide(self):
+      """
+      Retourne la phrase d'aide indiquant de quel type de base doivent être les valeurs
+      que saisit l'utilisateur
+      """
+      commentaire=""
+      mc = self.node.item.get_definition()
+      d_aides = { 'TXM' : 'chaînes de caractères',
+                  'R'   : 'réels',
+                  'I'   : 'entiers',
+                  'C'   : 'complexes'}
+      type = mc.type[0]
+      if not d_aides.has_key(type) : return 'Type de base inconnu'
+      if mc.min == mc.max:
+          commentaire="Une liste de "+d_aides[type]+" de longueur " + `mc.min`  + " est attendue"
+      else :
+          commentaire="Une liste de "+d_aides[type]+" est attendue (min="+`mc.min`+",max="+`mc.max`+')'
+
+      aideval=self.node.item.aide()
+      commentaire=commentaire +"\n"+aideval
+      return commentaire
+
+  def make_entry(self,frame,command):
+      """
+      Crée l'entry de saisie de la valeur souhaitée : distingue le
+      cas d'un complexe attendu, d'une autre valeur quelconque
+      """
+      if self.node.item.wait_complex():
+          self.typ_cplx=StringVar()
+          self.typ_cplx.set('RI')
+          rb1 = Radiobutton(frame, text='RI',variable=self.typ_cplx,value='RI')
+          rb2 = Radiobutton(frame, text='MP',variable=self.typ_cplx,value='MP')
+          self.entry1 = Pmw.EntryField(frame,validate='real')
+          self.entry2 = Pmw.EntryField(frame,validate='real')
+          rb1.place(relx=0.05,rely = 0.4)
+          rb2.place(relx=0.05,rely = 0.6)
+          self.entry1.component('entry').bind("<Return>",lambda e,s=self:s.entry2.component('entry').focus)
+          self.entry2.component('entry').bind("<Return>",lambda e,c=command:c())
+          self.entry1.place(relx=0.27,rely = 0.5,relwidth=0.35)
+          self.entry2.place(relx=0.65,rely = 0.5,relwidth=0.35)
+          self.entry1.focus()
+      else:
+          self.entry = Entry(frame,relief='sunken')
+          self.entry.place(relx=0.28,rely=0.5,relwidth=0.6)
+          self.entry.bind("<Return>",lambda e,c=command:c())
+          self.entry.focus()
+
+  def get_valeur(self):
+      """
+      Retourne la valeur saisie par l'utilisateur dans self.entry
+      """
+      if hasattr(self,'entry'):
+         # Traitement d'une entree unique
+         valeurentree = self.entry.get()
+         valeur,validite=self.node.item.eval_valeur(valeurentree)
+         if not validite :
+            commentaire = "impossible d'évaluer : %s " %`valeurentree`
+         else:
+            commentaire = ""
+         return valeur,validite,commentaire
+      else:
+         # Traitement d'une entree de type complexe
+         try:
+            valeur= (self.typ_cplx.get(),
+                     string.atof(self.entry1.get()),
+                     string.atof(self.entry2.get()))
+            return valeur,1,""
+         except:
+            #traceback.print_exc()
+            return None,0,"impossible d'évaluer la valeur d'entree"
+
+  def erase_valeur(self):
+      """
+      Efface la valeur donnée par l'utilisateur dans l'entry
+      """
+      if hasattr(self,'entry'):
+         self.entry.delete(0,END)
+      else:
+         self.typ_cplx.set('RI')
+         self.entry1.delete(0,END)
+         self.entry2.delete(0,END)
+
+        
+  def display_valeur(self,val=None):
+      """
+      Affiche la valeur passée en argument dans l'entry de saisie.
+      Par défaut affiche la valeur du mot-clé simple
+      """
+      if not val :
+          #valeur = self.node.item.getval()
+          #valeur = self.node.item.get_valeur()
+          valeur = self.node.item.object.getval()
+      else:
+          valeur = val
+      if not valeur : return
+
+      if hasattr(self,'entry'):
+         # Traitement d'une entree unique
+         self.entry.delete(0,END)
+         self.entry.insert(0,str(valeur))
+      else:
+         # Traitement d'une entree de type complexe
+         typ_cplx,x1,x2=valeur
+         self.entry1.delete(0,END)
+         self.entry2.delete(0,END)
+         self.typ_cplx.set(typ_cplx)
+         self.entry1.setentry(x1)
+         self.entry2.setentry(x2)
+
+
diff --git a/Editeur/plusieursintopanel.py b/Editeur/plusieursintopanel.py
new file mode 100644 (file)
index 0000000..a43e579
--- /dev/null
@@ -0,0 +1,158 @@
+#            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.
+#
+# 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.
+#
+# 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.
+#
+#
+# ======================================================================
+# Modules Python
+import string,types,os
+from Tkinter import *
+import Pmw
+from copy import copy,deepcopy
+import traceback
+
+# Modules Eficas
+import Objecttreeitem
+import prefs
+import panels
+import images
+from widgets import ListeChoix
+from widgets import FenetreDeSelection
+
+from Noyau.N_CR import justify_text
+from utils import substract_list
+
+# Import des panels
+from plusieurspanel import PLUSIEURS_Panel
+
+class PLUSIEURS_INTO_Panel(PLUSIEURS_Panel):
+  """
+  Classe servant à définir le panneau permettant d'afficher et de saisir une
+  liste de valeurs à choisir parmi une liste discrètes de valeurs possibles
+  """
+  def makeValeurPage(self,page):
+      """
+      Génère la page de saisie de plusieurs valeurs parmi un ensemble discret
+      de possibles
+      """
+      self.ajout_valeurs = None
+      # On récupère la bulle d'aide du panneau, l'objet, min et max (cardinalité de la liste),
+      # la liste des choix et la liste des valeurs
+      aide = self.get_aide()
+      aide = justify_text(texte=aide)
+      bulle_aide=self.get_bulle_aide()
+      objet_mc = self.node.item.get_definition()
+      min,max = self.node.item.GetMinMax()
+      #l_choix=list(objet_mc.into)
+      l_valeurs = self.node.item.GetListeValeurs()
+      l_choix= self.node.item.get_liste_possible(l_valeurs)
+      # reinitialisation de l_valeurs
+      l_valeurs = self.node.item.GetListeValeurs()
+
+      # remplissage du panneau
+      self.frame_valeurs = Frame(page)
+      self.frame_valeurs.place(relx=0.05,rely=0.05,relwidth=0.35,relheight=0.7)
+      self.frame_boutons_fleches = Frame(page)
+      self.frame_boutons_fleches.place(relx=0.4,rely=0.,relwidth=0.2,relheight=0.7)
+      self.frame_choix = Frame(page)
+      self.frame_choix.place(relx=0.6,rely=0.05,relwidth=0.35,relheight=0.7)
+      self.frame_boutons = Frame(page)
+      self.frame_boutons.place(relx=0.35,rely=0.87,relwidth=0.3,relheight=0.1)
+      self.frame_aide = Frame(page)
+      self.frame_aide.place(relx=0.1,rely=0.75,relwidth=0.9,relheight=0.1)
+      liste_commandes_valeurs = (("<Button-1>",self.selectValeur),
+                                 ("<Button-3>",self.deselectValeur),
+                                 ("<Double-Button-1>",self.sup_valeur))
+      liste_commandes_choix = (("<Button-1>",self.selectChoix),
+                               ("<Button-3>",self.deselectChoix),
+                               ("<Double-Button-1>",self.add_choix))
+      self.Liste_valeurs = ListeChoix(self,self.frame_valeurs,
+                                      l_valeurs,liste_commandes = liste_commandes_valeurs,
+                                      titre="Valeur(s) actuelle(s)")
+      self.Liste_choix = ListeChoix(self,self.frame_choix,l_choix,
+                                    liste_commandes = liste_commandes_choix,
+                                    titre= "Valeurs possibles")
+      bouton_add = Button(self.frame_boutons_fleches,
+                          #text="<--",
+                          image = images.get_image('arrow_left'),
+                          command = self.add_choix)
+      bouton_sup = Button(self.frame_boutons_fleches,
+                          #text="-->",
+                          image = images.get_image('arrow_right'),
+                          command = self.sup_valeur)
+      bouton_accepter = Button(self.frame_boutons,
+                               text='Valider',
+                               command = lambda s=self,m=min,M=max : s.accepte_modifs_valeur(m,M))
+      bouton_annuler = Button(self.frame_boutons,
+                              text = 'Annuler',
+                              command = self.annule_modifs_valeur)
+      bouton_add.place(relx=0.3,rely=0.35)
+      bouton_sup.place(relx=0.3,rely=0.65)
+      for but in (bouton_accepter,bouton_annuler):
+          but.pack(side='left',padx=5)
+      self.Liste_valeurs.affiche_liste()
+      self.Liste_choix.affiche_liste()
+      for fram in (self.frame_valeurs,self.frame_boutons_fleches,self.frame_choix,self.frame_boutons):
+          fram.bind("<Button-3>",lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a))
+          fram.bind("<ButtonRelease-3>",self.parent.appli.efface_aide)
+      self.frame_aide.update()
+      self.aide = Label(self.frame_aide,
+                        text = aide,
+                        justify='center',
+                        anchor='center',
+                       wraplength=int(self.frame_aide.winfo_width()*0.8))
+      self.aide.place(relx=0.5,rely=0.5,anchor='center',relwidth=1)
+
+  def get_aide(self):
+      """
+      Retourne la phrase d'aide indiquant de quel type de base doivent être les valeurs
+      que saisit l'utilisateur
+      """
+      commentaire=""
+      mc = self.node.item.get_definition()
+      d_aides = { 'TXM' : 'chaînes de caractères',
+                  'R'   : 'réels',
+                  'I'   : 'entiers',
+                  'C'   : 'complexes'}
+      type = mc.type[0]
+      if not d_aides.has_key(type) : 
+        if mc.min == mc.max:
+           return str(mc.min)+" valeur(s) est(sont) attendue(s)"
+         else :
+           return "entrez entre "+str(mc.min)+" et "+str(mc.max)+" valeurs"
+      if mc.min == mc.max:
+           commentaire="Une liste de "+str(mc.min)+" "+d_aides[type]+" est attendue"
+      else :
+           commentaire="Entre "+str(mc.min)+" et "+str(mc.max)+" valeurs de type  "+d_aides[type]+" sont attendues"
+      aideval=self.node.item.aide()
+      commentaire=commentaire + "\n" + aideval
+      return commentaire
+
+  def get_bulle_aide(self):
+      """
+      Retourne la bulle d'aide du panneau (affichée par clic droit)
+      """
+      return """Un clic sur une valeur des deux listes la sélectionne.
+      - Un clic sur la flèche gauche stocke la valeur possible sélectionnée
+      dans la liste des valeurs que vous voulez affecter au mot-clé simple
+      - Un clic sur la flèche droite déstocke la valeur du mot-clé simple
+      sélectionnée (elle apparaît alors à nouveau comme choix possible
+      dans la liste des choix à droite)
+      - Cliquez sur 'Valider' pour affecter la liste des valeurs sélectionnées
+      au mot-clé simple courant
+      - Cliquez sur 'Annuler' pour restaurer la valeur du mot-clé simple
+      avant toute modification depuis le dernier 'Valider'"""
+
diff --git a/Editeur/plusieurspanel.py b/Editeur/plusieurspanel.py
new file mode 100644 (file)
index 0000000..7ec31f4
--- /dev/null
@@ -0,0 +1,175 @@
+#            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.
+#
+# 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.
+#
+# 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.
+#
+#
+# ======================================================================
+# Modules Python
+import string,types,os
+from Tkinter import *
+import Pmw
+from copy import copy,deepcopy
+import traceback
+
+# Modules Eficas
+import Objecttreeitem
+import prefs
+import panels
+import images
+from widgets import ListeChoix
+from widgets import FenetreDeSelection
+
+from Noyau.N_CR import justify_text
+from utils import substract_list
+
+# Import des panels
+from  newsimppanel import newSIMPPanel
+
+
+class PLUSIEURS_Panel(newSIMPPanel):
+  """
+  Classe virtuelle servant de classe mère à toutes celles définissant
+  un panneau pour un mot-clé simple qui attend une liste de valeurs
+  """
+  def accepte_modifs_valeur(self,min,max,liste=None):
+      """
+      Méthode qui récupère la liste des valeurs donnée par l'utilisateur
+      et l'affecte au mot-clé courant.
+      le parametre None n'est pas rempli sauf par l appel a partir de fonctionpanel
+      """
+      if liste==None:
+         l1_valeurs = self.Liste_valeurs.get_liste()
+      else:
+         l1_valeurs = liste
+      l_valeurs=[]
+      for  val in l1_valeurs :
+        if val != '' and val != None :
+           l_valeurs.append(val)
+    
+      longueur = len(l_valeurs)
+      if longueur < min or longueur > max :
+          self.parent.appli.affiche_infos("Valeur refusée : nombre d'éléments incorrect dans la liste")
+          return
+      if longueur > 1:
+         valeur = tuple(l_valeurs)
+      elif longueur == 1:
+         valeur = l_valeurs[0]
+      else:
+         valeur = None
+
+      self.parent.appli.affiche_infos("Valeur acceptée")
+      self.record_valeur(valeur)
+      # fermeture de la fenêtre de sélection
+      if self.ajout_valeurs:
+          self.ajout_valeurs.quit()
+          
+  def annule_modifs_valeur(self):
+      """
+      RAZ de la liste des valeurs (annule toutes les valeurs saisies par l'utilisateur)
+      """
+      self.node.select()
+      # fermeture de la fenêtre de sélection
+      if self.ajout_valeurs:
+          self.ajout_valeurs.quit()
+          
+  def add_valeur_sans_into(self,name=None,encorevalide=1):
+      """
+      Lit ce que l'utilisateur a saisi dans self.entry et cherche à
+      l'évaluer :
+        - si la valeur est acceptable, elle est ajoutée dans la liste des valeurs
+        - sinon elle est refusée
+      encorevalide vaut 1 si le validateur trouve l item et la liste correctes
+                        0 si le validateur trouve la valeur de l item incorrecte
+                       -1 si le validateur trouve la liste incorrecte
+      """
+
+      commentaire="Valeur incorrecte : ajout à la liste refusé"
+      testvalide=1
+
+      # Lecture de la zone de saisie et evaluation si nécessaire
+      if name != None :
+         valeur = name
+      else:
+         valeurentree = self.get_valeur()
+         if valeurentree == '': valeur=None
+         valeurentree,testvalide=self.node.item.eval_valeur(valeur)
+         if (not testvalide) :
+            commentaire = "impossible d'évaluer : %s " %`valeurentree`
+
+      # Pas de traitement des valeurs nulles ( a priori clic involontaire
+      if (valeur == None or valeur =="") :
+          commentaire = "Pas de saisie des valeurs nulles"
+          encorevalide = -2 
+          testtype=0
+      else :
+          testtype = self.node.item.object.verif_type(valeur)
+          if not testtype :
+            commentaire ="Type de la valeur incorrecte"
+            encorevalide=-2
+               
+      if (encorevalide ==0) :
+         commentaire=self.node.item.info_erreur_item()
+      if (encorevalide == -1) :
+         commentaire=self.node.item.info_erreur_liste()
+        # On traite le cas ou la liste n est pas valide pour un pb de cardinalite
+         min,max = self.node.item.GetMinMax()
+         if len(self.Liste_valeurs.get_liste()) >= max : 
+            commentaire="La liste a déjà atteint le nombre maximum d'éléments,ajout refusé"
+
+      if testvalide and (encorevalide == 1):
+         min,max = self.node.item.GetMinMax()
+
+         if testtype :
+            liste_valeurs = self.Liste_valeurs.get_liste()
+            if len(liste_valeurs) >= max :
+                commentaire="La liste a déjà atteint le nombre maximum d'éléments,ajout refusé"
+            else :
+               liste_valeurs.append(valeur)
+               self.Liste_valeurs.put_liste(liste_valeurs)
+               self.erase_valeur()
+               commentaire="Nouvelle valeur acceptée"
+         else :
+            commentaire ="Type de la valeur incorrecte"
+
+      #self.erase_valeur()
+      self.parent.appli.affiche_infos(commentaire)
+
+  def sup_valeur_sans_into(self,name=None):
+      """
+      Méthode qui sert à retirer de la liste des valeurs la valeur sélectionnée
+      """
+      try:
+          self.Liste_valeurs.remove_selected_item()
+          self.display_valeur(self.selected_valeur)
+          self.selected_valeur = None      
+      except:
+          # la valeur sélectionnée n'est pas dans la liste
+          return
+
+  def display_valeur(self,val=None):
+      """
+      Affiche la valeur passée en argument dans l'entry de saisie.
+      Par défaut affiche la valeur du mot-clé simple
+      """
+      if not val :
+          #valeur = self.node.item.getval()
+          valeur = self.node.item.object.getval()
+      else:
+          valeur = val
+      self.entry.delete(0,END)
+      if not valeur : return
+      self.entry.insert(0,str(valeur))
+      
index 68e4aaa917f5e032b54abfcf2af04afed88c25f1..5b8a73736348220697e8ca4a332e56974742a145 100644 (file)
@@ -28,7 +28,6 @@ import os,sys,py_compile
 import traceback
 import cPickle
 import Pmw
-from tkMessageBox import showinfo,showerror
 
 # Modules Eficas
 import prefs
@@ -36,6 +35,7 @@ import splash
 import fontes
 import analyse_catalogue
 from Noyau.N_CR import CR
+from widgets import showinfo,showerror
 from widgets import Fenetre
 from utils import init_rep_cata_dev
 
diff --git a/Editeur/shellpanel.py b/Editeur/shellpanel.py
new file mode 100644 (file)
index 0000000..1b75f8f
--- /dev/null
@@ -0,0 +1,95 @@
+#            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.
+#
+# 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.
+#
+# 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.
+#
+#
+# ======================================================================
+# Modules Python
+import string,types,os
+from Tkinter import *
+import Pmw
+from copy import copy,deepcopy
+import traceback
+
+# Modules Eficas
+import Objecttreeitem
+#import prefs
+#import panels
+#import images
+#from widgets import ListeChoix
+#from widgets import FenetreDeSelection
+
+from Noyau.N_CR import justify_text
+from utils import substract_list
+from newsimppanel import newSIMPPanel
+
+
+class SHELLPanel(newSIMPPanel):
+  """
+  Classe Panel utilisé pour les mots-clés simples qui attendent un shell pour valeur
+  """
+
+  def makeValeurPage(self,page):
+      """ 
+      Affiche la page concernant l'objet pointé par self qui attend un shell
+      """
+      objet_mc = self.node.item.get_definition()
+      aide = self.gen_aide()
+      aide = justify_text(texte=aide)
+      self.frame = Frame(page)
+      self.frame.place(relx=0,rely=0,relwidth=1,relheight=1)
+      label_aide = Label(self.frame,text = aide)
+      label_aide.place(relx=0.5,rely=0.1,anchor='center')
+      self.text = Text(self.frame,bg='gray95')
+      self.text.place(relx=0.2,rely=0.2,relwidth=0.6,relheight=0.6)
+      but_val = Button(self.frame,text='Valider',command = self.valide_shell)
+      but_ann = Button(self.frame,text='Annuler',command = self.annule_shell)
+      but_val.place(relx=0.35,rely=0.9,anchor='center')
+      but_ann.place(relx=0.65,rely=0.9,anchor='center')
+      self.display_valeur()
+
+  def gen_aide(self):
+      """
+      Retourne une chaîne de caractères d'aide sur la valeur qu'attend l'objet
+      pointé par self
+      """
+      return "Un shell est attendu"
+    
+  def valide_shell(self,event=None):
+      """
+      Récupère la valeur saisie par l'utilisateur dans self.text
+      et la stocke dans l'objet MCSIMP courant
+      """
+      texte = self.text.get(1.0,END)
+      self.record_valeur(texte)
+
+  def annule_shell(self,event=None):
+      """
+      Annule toute saisie dans self.text
+      """
+      self.text.delete(0,END)
+
+  def display_valeur(self,val=None):
+      """
+      Affiche la valeur de l'objet pointé par self
+      """
+      if val != None :
+          valeur = val
+      else:
+          valeur = self.node.item.get_valeur()
+      if valeur == None  or valeur == '': return
+      self.text.insert(END,valeur)
+
index c6ba1892fe0bbf37314246ce5e938d23a9978d08..d8348a15e2719b46d41d9b6e1c0793c1bfb778ed 100644 (file)
@@ -37,14 +37,12 @@ class STATUSBAR:
       self.label.pack(side='left',expand=1,fill='both')
 
    def affiche_infos(self,texte):
-      assert type(texte) is types.StringType
       if len(texte)>150 :
           texte_infos=texte[0:150]
       else :
           texte_infos=texte
       self.label.configure(text=texte_infos)
 
-
    def reset_affichage_infos(self):
       """ Efface tout message présent dans le panneau en bas d'EFICAS """
       self.affiche_infos('')
diff --git a/Editeur/uniqueassdpanel.py b/Editeur/uniqueassdpanel.py
new file mode 100644 (file)
index 0000000..4906321
--- /dev/null
@@ -0,0 +1,170 @@
+# ======================================================================
+# 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.
+#
+# 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.
+#
+# 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.
+#
+#
+# ======================================================================
+# Modules Python
+import string,types,os
+from Tkinter import *
+import Pmw
+from copy import copy,deepcopy
+import traceback
+
+# Modules Eficas
+import Objecttreeitem
+import prefs
+import panels
+import images
+from widgets import ListeChoix
+from widgets import FenetreDeSelection
+
+from Noyau.N_CR import justify_text
+from utils import substract_list
+
+# Import des panels
+from uniquepanel import UNIQUE_Panel
+
+
+class UNIQUE_ASSD_Panel(UNIQUE_Panel):
+  """
+  Classe servant à définir le panneau associé aux objets qui attendent une valeur unique
+  d'un type dérivé d'ASSD
+  """
+  def valid_valeur_automatique(self):
+      """
+         Réalise la validation d'un concept sans remonter dans le
+         node parent dans le cas ou il n'y a qu'un concept possible (liste de longueur 1)
+         Identique à valid_valeur moins appel de self.node.parent.select()
+         On pourrait supposer que le seul concept présent est valide et donc ne pas
+         réaliser tous les tests de vérification.
+      """
+      if self.parent.modified == 'n' : self.parent.init_modif()
+      valeur = self.get_valeur()
+      self.erase_valeur()
+      anc_val = self.node.item.get_valeur()
+      valeur,validite=self.node.item.eval_valeur_item(valeur)
+      test = self.node.item.set_valeur(valeur)
+      if not test :
+          mess = "impossible d'évaluer : %s " %`valeur`
+          self.parent.appli.affiche_infos("Valeur du mot-clé non autorisée :"+mess)
+      elif self.node.item.isvalid() :
+          self.parent.appli.affiche_infos('Valeur du mot-clé enregistrée')
+          if self.node.item.get_position()=='global':
+              self.node.etape.verif_all()
+          elif self.node.item.get_position()=='global_jdc':
+              self.node.racine.verif_all()
+          else :
+              self.node.parent.verif()
+          self.node.update()
+      else :
+          cr = self.node.item.get_cr()
+          mess = "Valeur du mot-clé non autorisée :"+cr.get_mess_fatal()
+          self.reset_old_valeur(anc_val,mess=mess)
+
+  def makeValeurPage(self,page):
+      """
+          Génère la page de saisie de la valeur du mot-clé simple courant qui doit être une 
+          SD de type dérivé d'ASSD
+      """
+      # Récupération de l'aide associée au panneau, de l'aide destinée à l'utilisateur,
+      # et de la liste des SD du bon type (constituant la liste des choix)
+      bulle_aide=self.get_bulle_aide()
+      aide=self.get_aide()
+      aide= justify_text(texte=aide)
+      liste_noms_sd = self.node.item.get_sd_avant_du_bon_type()
+      # Remplissage du panneau
+      self.valeur_choisie = StringVar()
+      self.valeur_choisie.set('')
+      min,max =  self.node.item.GetMinMax()
+      if (min == 1 and min == max and len(liste_noms_sd)==1):
+          if self.valeur_choisie.get() != liste_noms_sd[0]:
+            self.valeur_choisie.set(liste_noms_sd[0])
+             self.valid_valeur_automatique()
+        
+      self.frame_valeur = Frame(page)
+      self.frame_valeur.pack(fill='both',expand=1)
+      self.frame_valeur.bind("<Button-3>",lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a))
+      self.frame_valeur.bind("<ButtonRelease-3>",self.parent.appli.efface_aide)
+      self.listbox = Pmw.ScrolledListBox(self.frame_valeur,
+                                         items=liste_noms_sd,
+                                         labelpos='n',
+                                         label_text="Structures de données du type\n requis par l'objet courant :",
+                                         listbox_height = 6,
+                                         selectioncommand=self.select_valeur_from_list,
+                                         dblclickcommand=lambda s=self,c=self.valid_valeur : s.choose_valeur_from_list(c))
+      self.listbox.place(relx=0.5,rely=0.3,relheight=0.4,anchor='center')
+      Label(self.frame_valeur,text='Structure de donnée choisie :').place(relx=0.05,rely=0.6)
+      #self.label_valeur = Label(self.frame_valeur,textvariable=self.valeur_choisie)
+      Label(self.frame_valeur,textvariable=self.valeur_choisie).place(relx=0.5,rely=0.6)
+      # affichage de la valeur courante
+      self.display_valeur()
+
+  def get_bulle_aide(self):
+      """
+      Retourne l'aide associée au panneau
+      """
+      return "Double-cliquez sur la structure de donnée désirée pour valoriser le mot-clé simple courant"
+
+  def get_aide(self):
+      """
+      Retourne la phrase d'aide indiquant de quel type doit être la valeur à donner par l'utilisateur
+      """
+      mc = self.node.item.get_definition()
+      type = mc.type[0].__name__  
+      if len(mc.type)>1 :
+          for typ in mc.type[1:] :
+              type = type + ' ou '+typ.__name__
+      commentaire="Un objet de type "+type+" est attendu"
+      aideval=self.node.item.aide()
+      commentaire=commentaire +"\n"+ aideval
+      return commentaire
+
+    
+  def select_valeur_from_list(self):
+      """
+      Affecte à valeur choisie la sélection courante dans la liste des choix proposée
+      """
+      if len(self.listbox.get()) == 0 : return
+      choix = self.listbox.getcurselection()[0]
+      self.valeur_choisie.set(choix)
+
+  def choose_valeur_from_list(self,command):
+      """
+      Affecte à valeur choisie la sélection courante dans la liste des choix proposée
+      Exécute command
+      """
+      if len(self.listbox.get()) == 0 : return
+      choix = self.listbox.getcurselection()[0]
+      self.valeur_choisie.set(choix)
+      apply(command,(),{})
+
+  def get_valeur(self):
+      """
+      Retourne la valeur donnée par l'utilisateur au MCS
+      """
+      return self.valeur_choisie.get()
+    
+  def display_valeur(self):
+      """
+      Affiche la valeur de l'objet pointé par self
+      """
+      valeur = self.node.item.get_valeur()
+      if valeur == None or valeur == '' : return # pas de valeur à afficher ...
+      self.valeur_choisie.set(valeur.nom)
+
+  def erase_valeur(self):
+      pass
+
diff --git a/Editeur/uniquebasepanel.py b/Editeur/uniquebasepanel.py
new file mode 100644 (file)
index 0000000..d565a27
--- /dev/null
@@ -0,0 +1,110 @@
+#            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.
+#
+# 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.
+#
+# 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.
+#
+#
+# ======================================================================
+# Modules Python
+import string,types,os
+from Tkinter import *
+import Pmw
+from copy import copy,deepcopy
+import traceback
+
+# Modules Eficas
+import Objecttreeitem
+import prefs
+import panels
+import images
+from widgets import ListeChoix
+from widgets import FenetreDeSelection
+
+from Noyau.N_CR import justify_text
+from utils import substract_list
+
+# Import des panels
+from uniquepanel import UNIQUE_Panel
+
+
+class UNIQUE_BASE_Panel(UNIQUE_Panel):
+  """
+  Classe servant à définir le panneau associé aux mots-clés simples qui attendent
+  une valeur d'un type de base (entier, réel ou string).
+  """
+  def makeValeurPage(self,page):
+      """
+      Génère la page de saisie de la valeur du mot-clé simple courant qui doit être de type
+      de base cad entier, réel, string ou complexe
+      """
+      # Récupération de l'aide associée au panneau, de l'aide destinée à l'utilisateur,
+      # et de la liste des SD du bon type (constituant la liste des choix)
+      bulle_aide=self.get_bulle_aide()
+      aide=self.get_aide()
+      aide= justify_text(texte=aide)
+      liste_noms_sd = self.node.item.get_sd_avant_du_bon_type()
+      # Remplissage du panneau
+      self.frame_valeur = Frame(page)
+      self.frame_valeur.pack(fill='both',expand=1)
+      self.frame_valeur.bind("<Button-3>",lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a))
+      self.frame_valeur.bind("<ButtonRelease-3>",self.parent.appli.efface_aide)
+      self.label = Label(self.frame_valeur,text='Valeur :')
+      self.label.place(relx=0.1,rely=0.5)
+      self.entry = Entry(self.frame_valeur,relief='sunken')
+      self.entry.place(relx=0.28,rely=0.5,relwidth=0.6)
+      self.entry.bind("<Return>",lambda e,c=self.valid_valeur:c())
+      self.entry.focus()
+      # aide associée au panneau
+      self.frame_valeur.update()
+      self.aide = Label(self.frame_valeur, 
+                        text = aide,
+                       wraplength=int(self.frame_valeur.winfo_width()*0.8),
+                       justify='center')
+      self.aide.place(relx=0.5,rely=0.7,anchor='n')
+      # affichage de la valeur du MCS
+      self.display_valeur()
+
+  def get_aide(self):
+      """
+      Retourne la phrase d'aide indiquant de quel type doit être la valeur
+      du mot-clé simple fournie par l'utilisateur
+      """
+      mc = self.node.item.get_definition()
+      d_aides = { 'TXM' : "Une chaîne de caractères est attendue",
+                  'R'   : "Un réel est attendu",
+                  'I'   : "Un entier est attendu"}
+      type = mc.type[0]
+      commentaire=d_aides.get(type,"Type de base inconnu")
+      aideval=self.node.item.aide()
+      commentaire=commentaire +"\n"+ aideval
+      return commentaire
+
+  def get_bulle_aide(self):
+      """
+      Retourne la bulle d'aide associée au panneau et affichée par clic droit
+      """
+      return """Saisissez la valeur que vous voulez affecter au mot-clé simple
+      dans la zone de saisie et pressez <Return>"""
+      
+  def display_valeur(self):
+      """
+      Affiche la valeur de l'objet pointé par self
+      """
+      valeur = self.node.item.get_valeur()
+      if valeur == None or valeur == '' : return # pas de valeur à afficher ...
+      self.entry.delete(0,END)
+      self.entry.insert(0,valeur)
+      self.entry.focus()
+      
diff --git a/Editeur/uniquecomppanel.py b/Editeur/uniquecomppanel.py
new file mode 100644 (file)
index 0000000..f7763a9
--- /dev/null
@@ -0,0 +1,134 @@
+#            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.
+#
+# 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.
+#
+# 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.
+#
+#
+# ======================================================================
+# Modules Python
+import string,types,os
+from Tkinter import *
+import Pmw
+from copy import copy,deepcopy
+import traceback
+
+# Modules Eficas
+import Objecttreeitem
+import prefs
+import panels
+import images
+from widgets import ListeChoix
+from widgets import FenetreDeSelection
+
+from Noyau.N_CR import justify_text
+from utils import substract_list
+
+# Import des panels
+from uniquepanel import UNIQUE_Panel
+
+      
+class UNIQUE_COMP_Panel(UNIQUE_Panel):
+  """
+  Classe servant à définir le panneau associé aux mots-clés simples
+  qui attendent une valeur de type complexe
+  """
+  def makeValeurPage(self,page):
+      """
+      Génère la page de saisie de la valeur du mot-clé simple courant qui doit être de type
+      de base cad entier, réel, string ou complexe
+      """
+      # Récupération de l'aide associée au panneau et de l'aide destinée à l'utilisateur
+      bulle_aide=self.get_bulle_aide()
+      aide=self.get_aide()
+      aide= justify_text(texte=aide)
+      # Remplissage du panneau
+      self.frame_valeur = Frame(page)
+      self.frame_valeur.pack(fill='both',expand=1)
+      self.frame_valeur.bind("<Button-3>",lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a))
+      self.frame_valeur.bind("<ButtonRelease-3>",self.parent.appli.efface_aide)
+      self.label = Label(self.frame_valeur,text='Valeur :')
+      self.label.place(relx=0.1,rely=0.5)
+      self.typ_cplx=StringVar()
+      self.typ_cplx.set('RI')
+      rb1 = Radiobutton(self.frame_valeur, text='RI',variable=self.typ_cplx,value='RI')
+      rb2 = Radiobutton(self.frame_valeur, text='MP',variable=self.typ_cplx,value='MP')
+      self.entry1 = Pmw.EntryField(self.frame_valeur,validate='real')
+      self.entry2 = Pmw.EntryField(self.frame_valeur,validate='real')
+      rb1.place(relx=0.05,rely = 0.4)
+      rb2.place(relx=0.05,rely = 0.6)
+      self.entry1.component('entry').bind("<Return>",lambda e,s=self:s.entry2.component('entry').focus())
+      self.entry2.component('entry').bind("<Return>",lambda e,c=self.valid_valeur:c())
+      self.entry1.place(relx=0.27,rely = 0.5,relwidth=0.35)
+      self.entry2.place(relx=0.65,rely = 0.5,relwidth=0.35)
+      self.entry1.focus()
+      self.frame_valeur.update()
+      self.aide = Label(self.frame_valeur,
+                        text = aide,
+                        wraplength=int(self.frame_valeur.winfo_width()*0.8),
+                       justify='center')
+      self.aide.place(relx=0.5,rely=0.7,anchor='n')
+      # affichage de la valeur du MCS
+      self.display_valeur()
+
+  def display_valeur(self):
+      """
+      Affiche la valeur de l'objet pointé par self
+      """
+      valeur = self.node.item.get_valeur()
+      if valeur == None or valeur == '' : return # pas de valeur à afficher ...
+      typ_cplx,x1,x2=valeur
+      self.entry1.delete(0,END)
+      self.entry2.delete(0,END)
+      self.typ_cplx.set(typ_cplx)
+      self.entry1.setentry(x1)
+      self.entry2.setentry(x2)
+
+  def get_bulle_aide(self):
+      """
+      Retourne la bulle d'aide du panneau
+      """
+      return """-Choisissez votre format de saisie du complexe :
+      \t 'RI' = parties réelle et imaginaire
+      \t 'MP' = module/phase (en degrés)
+      - Saisissez ensuite dans les deux zones de saisie les deux nombres attendus"""
+
+  def get_aide(self):
+      """
+      Retourne la phrase d'aide décrivant le type de la valeur que peut prendre
+      le mot-clé simple courant
+      """
+      commentaire='Un complexe est attendu'
+      aideval=self.node.item.aide()
+      commentaire=commentaire +"\n"+ aideval
+      return commentaire
+
+  def get_valeur(self):
+      """
+      Retourne le complexe saisi par l'utilisateur
+      """
+      l=[]
+      l.append(self.typ_cplx.get())
+      l.append(string.atof(self.entry1.get()))
+      l.append(string.atof(self.entry2.get()))
+      return `tuple(l)`
+
+  def erase_valeur(self):
+      """
+      Efface les entries de saisie
+      """
+      self.typ_cplx.set('RI')
+      self.entry1.delete(0,END)
+      self.entry2.delete(0,END)
+      
diff --git a/Editeur/uniqueintopanel.py b/Editeur/uniqueintopanel.py
new file mode 100644 (file)
index 0000000..f6a1242
--- /dev/null
@@ -0,0 +1,82 @@
+#            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.
+#
+# 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.
+#
+# 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.
+#
+#
+# ======================================================================
+# Modules Python
+import string,types,os
+from Tkinter import *
+import Pmw
+from copy import copy,deepcopy
+import traceback
+
+# Modules Eficas
+import Objecttreeitem
+import prefs
+import panels
+import images
+from widgets import ListeChoix
+from widgets import FenetreDeSelection
+
+from Noyau.N_CR import justify_text
+from utils import substract_list
+
+# Import des panels
+from uniquepanel import UNIQUE_Panel
+
+class UNIQUE_INTO_Panel(UNIQUE_Panel):
+  """
+  Classe définissant le panel associé aux mots-clés qui demandent
+  à l'utilisateur de choisir une seule valeur parmi une liste de valeurs
+  discrètes
+  """
+  def makeValeurPage(self,page):
+      """
+      Génère la page de saisie d'une seule valeur parmi un ensemble
+      discret de possibles
+      """
+      # récupération de la bulle d'aide et de l'objet mc
+      bulle_aide=self.get_bulle_aide()
+      objet_mc = self.node.item.get_definition()
+      # remplissage du panel
+      self.frame_valeur = Frame(page)
+      self.frame_valeur.pack(fill='both',expand=1)
+      self.frame_valeur.bind("<Button-3>",lambda e,s=self,a=bulle_aide : 
+                              s.parent.appli.affiche_aide(e,a))
+      self.frame_valeur.bind("<ButtonRelease-3>",self.parent.appli.efface_aide)
+      #l_choix=list(objet_mc.into)
+      #l_choix.sort()
+      l_choix=self.node.item.get_liste_possible([])
+      self.label = Label(self.frame_valeur,text='Choisir une valeur :')
+      self.label.pack(side='top')
+      self.frame = Frame(page)
+      self.frame.place(relx=0.33,rely=0.2,relwidth=0.33,relheight=0.6)
+      liste_commandes = (("<Button-1>",self.selectChoix),
+                         ("<Button-3>",self.deselectChoix),
+                         ("<Double-Button-1>",self.record_valeur))
+      self.Liste_choix = ListeChoix(self,self.frame,l_choix,
+                                    liste_commandes = liste_commandes,
+                                    titre="Valeurs possibles")
+      self.Liste_choix.affiche_liste()
+
+  def get_bulle_aide(self):
+      """
+      Retourne la bulle d'aide affectée au panneau courant (affichée par clic droit)
+      """
+      return """Double-cliquez sur la valeur désirée
+      pour valoriser le mot-clé simple courant"""
+
diff --git a/Editeur/uniquepanel.py b/Editeur/uniquepanel.py
new file mode 100644 (file)
index 0000000..3573ff0
--- /dev/null
@@ -0,0 +1,95 @@
+#            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.
+#
+# 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.
+#
+# 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.
+#
+#
+# ======================================================================
+# Modules Python
+import string,types,os
+from Tkinter import *
+import Pmw
+from copy import copy,deepcopy
+import traceback
+
+# Modules Eficas
+import Objecttreeitem
+import prefs
+import panels
+import images
+from widgets import ListeChoix
+from widgets import FenetreDeSelection
+
+from Noyau.N_CR import justify_text
+from utils import substract_list
+
+# Import des panels
+from newsimppanel import newSIMPPanel
+
+    
+class UNIQUE_Panel(newSIMPPanel):
+  """
+  Classe virtuelle servant de classe mère à toutes celles définissant un panneau
+  permettant l'affichage et la saisie d'une valeur unique pour le mot-clé simple
+  """
+
+  def erase_valeur(self):
+      """
+      Efface l'entry de saisie
+      """
+      self.entry.delete(0,END)
+
+  def get_valeur(self):
+      """
+      Retourne la valeur donnée par l'utilisateur
+      """
+      return self.entry.get()
+    
+  def valid_valeur(self):
+      """
+      Teste si la valeur fournie par l'utilisateur est une valeur permise :
+      - si oui, l'enregistre
+      - si non, restaure l'ancienne valeur
+      """
+      if self.parent.modified == 'n' : self.parent.init_modif()
+      anc_val = self.node.item.get_valeur()
+      valeurentree = self.get_valeur()
+      self.erase_valeur()
+      valeur,validite=self.node.item.eval_valeur(valeurentree)
+      if not validite :
+             commentaire = "impossible d'évaluer : %s " %`valeurentree`
+             self.parent.appli.affiche_infos(commentaire)
+             return
+   
+      test = self.node.item.set_valeur(valeur)
+       
+      if not test :
+          mess = "impossible d'évaluer : %s " %`valeur`
+          self.parent.appli.affiche_infos("Valeur du mot-clé non autorisée : "+mess)
+      elif self.node.item.isvalid() :
+          self.parent.appli.affiche_infos('Valeur du mot-clé enregistrée')
+         if self.node.item.get_position()=='global':
+              self.node.etape.verif_all()
+         elif self.node.item.get_position()=='global_jdc':
+              self.node.racine.verif_all()
+         else :
+              self.node.parent.verif()
+         self.node.update()
+          self.node.parent.select()
+      else :
+          cr = self.node.item.get_cr()
+          mess = "Valeur du mot-clé non autorisée :"+cr.get_mess_fatal()
+          self.reset_old_valeur(anc_val,mess=mess)
+
diff --git a/Editeur/uniquesdcopanel.py b/Editeur/uniquesdcopanel.py
new file mode 100644 (file)
index 0000000..41d1ea5
--- /dev/null
@@ -0,0 +1,236 @@
+#            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.
+#
+# 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.
+#
+# 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.
+#
+#
+# ======================================================================
+# Modules Python
+import string,types,os
+from Tkinter import *
+import Pmw
+from copy import copy,deepcopy
+import traceback
+
+# Modules Eficas
+import Objecttreeitem
+import prefs
+import panels
+import images
+from widgets import ListeChoix
+from widgets import FenetreDeSelection
+
+from Noyau.N_CR import justify_text
+from utils import substract_list
+
+# Import des panels
+from uniqueassdpanel import UNIQUE_ASSD_Panel
+
+
+class UNIQUE_SDCO_Panel(UNIQUE_ASSD_Panel):
+  """
+  Classe servant à définir le panneau correspondant à un mot-clé simple
+  qui attend une valeur unique de type dérivé d'ASSD ou non encore
+  existante (type CO(...) utilisé dans les macros uniquement)
+  """
+  def makeValeurPage(self,page):
+      """
+      Génère la page de saisie de la valeur du mot-clé simple courant qui doit être une SD de type dérivé
+      d'ASSD
+      """
+      # Récupération de l'aide associée au panneau, de l'aide destinée à l'utilisateur,
+      # et de la liste des SD du bon type (constituant la liste des choix)
+      bulle_aide=self.get_bulle_aide()
+      aide=self.get_aide()
+      aide= justify_text(texte=aide)
+      liste_noms_sd = self.node.item.get_sd_avant_du_bon_type()
+      # Remplissage du panneau
+      self.frame_valeur = Frame(page)
+      self.frame_valeur.pack(fill='both',expand=1)
+      self.frame_valeur.bind("<Button-3>",lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a))
+      self.frame_valeur.bind("<ButtonRelease-3>",self.parent.appli.efface_aide)
+      # affichage de la liste des SD existantes et du bon type
+      self.listbox = Pmw.ScrolledListBox(self.frame_valeur,
+                                         items=liste_noms_sd,
+                                         labelpos='n',
+                                         label_text="Structures de données du type\n requis par l'objet courant :",
+                                         listbox_height = 6,
+                                         selectioncommand=self.select_valeur_from_list,
+                                         dblclickcommand=lambda s=self,c=self.valid_valeur : s.choose_valeur_from_list(c))
+      self.listbox.place(relx=0.5,rely=0.3,relheight=0.4,anchor='center')
+      # affichage du bouton 'Nouveau concept'
+      self.b_co = Pmw.OptionMenu(self.frame_valeur,labelpos='w',label_text = "Nouveau concept : ",
+                                 items = ('NON','OUI'),menubutton_width=10)
+      self.b_co.configure(command = lambda e,s=self : s.ask_new_concept())
+      self.b_co.place(relx=0.05,rely=0.6,anchor='w')
+      self.label_co = Label(self.frame_valeur,text='Nom du nouveau concept :')
+      self.entry_co = Entry(self.frame_valeur)
+      self.entry_co.bind('<Return>',self.valid_nom_concept_co)
+      # affichage du label de la structure de donnée choisie
+      self.l_resu = Label(self.frame_valeur,text='Structure de donnée choisie :')
+      self.valeur_choisie = StringVar()
+      self.label_valeur = Label(self.frame_valeur,textvariable=self.valeur_choisie)
+      self.frame_valeur.update()
+      self.aide = Label(self.frame_valeur,
+                        text = aide,
+                       wraplength=int(self.frame_valeur.winfo_width()*0.8),
+                       justify='center')
+      self.aide.place(relx=0.5,rely=0.85,anchor='n')
+      # affichage de la valeur courante
+      self.display_valeur()
+      
+  def get_bulle_aide(self):
+      """
+      Retourne la bulle d'aide du panneau
+      """
+      return """Double-cliquez sur la structure de donnée désirée
+      pour valoriser le mot-clé simple courant ou cliquez sur NOUVEAU CONCEPT pour
+      entrer le nom d'un concept non encore existant"""
+
+  def valid_valeur(self):
+      """
+      Teste si la valeur fournie par l'utilisateur est une valeur permise :
+      - si oui, l'enregistre
+      - si non, restaure l'ancienne valeur
+      """
+      if self.parent.modified == 'n' : self.parent.init_modif()
+      valeur = self.get_valeur()
+      self.erase_valeur()
+      anc_val = self.node.item.get_valeur()
+      test_CO=self.node.item.is_CO(anc_val)
+      test = self.node.item.set_valeur(valeur)
+      if not test :
+          mess = "impossible d'évaluer : %s " %`valeur`
+          self.parent.appli.affiche_infos("Valeur du mot-clé non autorisée :"+mess)
+          return
+      elif self.node.item.isvalid() :
+          self.parent.appli.affiche_infos('Valeur du mot-clé enregistrée')
+          if test_CO:
+             # il faut egalement propager la destruction de l'ancien concept
+             self.node.item.delete_valeur_co(valeur=anc_val)
+             # et on force le recalcul des concepts de sortie de l'etape
+             self.node.item.object.etape.get_type_produit(force=1)
+             # et le recalcul du contexte
+             self.node.item.object.etape.parent.reset_context()
+          self.node.parent.select()
+      else :
+          cr = self.node.item.get_cr()
+          mess = "Valeur du mot-clé non autorisée :"+cr.get_mess_fatal()
+          self.reset_old_valeur(anc_val,mess=mess)
+          return
+      if self.node.item.get_position()=='global':
+          self.node.etape.verif_all()
+      elif self.node.item.get_position()=='global_jdc':
+          self.node.racine.verif_all()
+      else :
+          self.node.parent.verif()
+      self.node.update()
+
+  def valid_nom_concept_co(self,event=None):
+      """
+      Lit le nom donné par l'utilisateur au concept de type CO qui doit être
+      la valeur du MCS courant et stocke cette valeur
+      """
+      if self.parent.modified == 'n' : self.parent.init_modif()
+      anc_val = self.node.item.get_valeur()
+      nom_concept = self.entry_co.get()
+      test,mess=self.node.item.set_valeur_co(nom_concept)
+      if not test:
+          # On n'a pas pu créer le concept
+          self.parent.appli.affiche_infos(mess)
+          return
+      elif self.node.item.isvalid() :
+          self.parent.appli.affiche_infos('Valeur du mot-clé enregistrée')
+          self.node.parent.select()
+      else :
+          cr = self.node.item.get_cr()
+          mess = "Valeur du mot-clé non autorisée :"+cr.get_mess_fatal()
+          self.reset_old_valeur(anc_val,mess=mess)
+          return
+      if self.node.item.get_position()=='global':
+          self.node.etape.verif_all()
+      elif self.node.item.get_position()=='global_jdc':
+          self.node.racine.verif_all()
+      else :
+          self.node.parent.verif()
+      if self.node.item.isvalid():
+          self.node.parent.select()
+      self.node.update()
+
+  def ask_new_concept(self):
+      """
+      Crée une entry dans le panneau d'un MCS qui attend un concept OU un CO() afin de
+      permettre à l'utilisateur de donner le nom du nouveau concept
+      """
+      new_concept = self.b_co.getcurselection()
+      if new_concept == 'OUI':
+          self.label_co.place(relx=0.05,rely=0.7)
+          self.entry_co.place(relx=0.45,rely=0.7,relwidth=0.25)
+          self.l_resu.place_forget()
+          self.label_valeur.place_forget()
+          self.entry_co.focus()
+      elif new_concept == 'NON':
+          # On est passe de OUI à NON, on supprime la valeur
+# PN correction de bug (on passe de non a non et cela supprime la valeur)
+# ajout du if de le ligne suivane
+          if self.node.item.is_CO():
+                self.node.item.delete_valeur_co()
+                self.record_valeur(name=None,mess="Suppression CO enregistrée")
+                self.label_co.place_forget()
+                self.entry_co.place_forget()
+                self.l_resu.place(relx=0.05,rely=0.7)
+                self.label_valeur.place(relx=0.45,rely=0.7)
+          
+  def display_valeur(self):
+      """
+      Affiche la valeur de l'objet pointé par self
+      """
+      valeur = self.node.item.get_valeur()
+      if valeur == None or valeur == '': 
+         self.valeur_choisie.set('')
+         return # pas de valeur à afficher ...
+      # il faut configurer le bouton si la valeur est un objet CO
+      # sinon afficher le nom du concept dans self.valeur_choisie
+      if self.node.item.is_CO():
+          self.b_co.invoke('OUI')
+          self.entry_co.insert(0,valeur.nom)
+      else:
+          self.valeur_choisie.set(valeur.nom)
+
+  def record_valeur(self,name=None,mess='Valeur du mot-clé enregistrée'):
+      """
+      Enregistre  val comme valeur de self.node.item.object SANS faire de test de validité
+      """
+      if self.parent.modified == 'n' : self.parent.init_modif()
+      if name != None:
+          valeur =name
+      else :
+          self.entry_co.delete(0,END)
+          valeur= self.entry_co.get()
+      self.node.item.set_valeur_co(valeur)
+      self.parent.appli.affiche_infos(mess)
+      # On met a jour le display dans le panneau
+      self.display_valeur()
+      if self.node.item.get_position()=='global':
+          self.node.etape.verif_all()
+      elif self.node.item.get_position()=='global_jdc':
+          self.node.racine.verif_all()
+      else :
+          self.node.parent.verif()
+      if self.node.item.isvalid():
+          self.node.parent.select()
+      self.node.update()
+
+
index 44eb986f6bab3ad9b1c85e8f6cb4e1487b98b9aa..ef46ad5386f9aa4e81e8594fdf960b538de95293 100644 (file)
@@ -84,11 +84,7 @@ def save_in_file(file,text):
       retourne 1 si OK 0 sinon
   """
   try :
-      if type(text) == types.StringType:
-         f=open(file,'w')
-      else:
-         # Probablement Unicode
-         f=codecs.open(file,'w','iso-8859-1')
+      f=open(file,'w')
       f.write(text)
       f.close()
       return 1
index 593cf88b0aa3ff9e3940cf33f90941b96d40f7a2..6840f4120470d2fa7067959c896719089521ecd5 100644 (file)
@@ -22,6 +22,7 @@
 #          EFICAS
 # ----------------------------------------------------------
 
+import Tkinter
 from Tkinter import *
 import Pmw
 import os,sys,re,string
@@ -36,6 +37,18 @@ from centerwindow import centerwindow
 
 from Noyau.N_utils import repr_float
 from Accas import AsException
+
+# Surcharge de la fonction askyesno qui retourne un resultat errone en Python 2.3 avec Tk 8.4
+# et Tkinter.wantobject==1
+import tkMessageBox
+def askyesno(title=None, message=None, **options):
+    "Ask a question; return true if the answer is yes"
+    s = tkMessageBox._show(title, message, tkMessageBox.QUESTION, tkMessageBox.YESNO, **options)
+    if s == tkMessageBox.YES:return 1
+    if s == tkMessageBox.NO:return 0
+    if s:return 1
+    return 0
+
     
 class Fenetre :
     """ Cette classe permet de créer une fenêtre Toplevel dans laquelle
@@ -115,7 +128,7 @@ class Fenetre :
                                #initialdir = self.appli.CONFIGURATION.rep_user,
                                initialdir = self.appli.CONFIGURATION.initialdir,
                                title="Sauvegarde du "+self.titre)
-        if file != '':
+        if file :
             if not save_in_file(file,self.texte) :
                 showerror("Sauvegarde impossible",
                        "Impossible de sauvegarder le texte dans le fichier spécifié\n"+
@@ -672,6 +685,12 @@ class ListeChoix :
         self.arg_selected = ''
         if commande != None : commande(mot)
 
+    def remove_selected_item(self):
+        index=self.MCbox.index(self.selection[1])
+        lign,col=map(int,string.split(index,'.'))
+        del self.liste[lign-1]
+        self.affiche_liste()
+
     def entry_changed(self,event=None):
         """ Cette méthode est invoquée chaque fois que l'utilisateur modifie le contenu
         de l'entry et frappe <Return>"""
index cab74e36125808aebb2916a95340b7a0ecfa17d6..8c9e8312c743a57e3db7141ef1ea8cf907907997 100644 (file)
@@ -223,7 +223,7 @@ class PARAMETRE :
     """
         Donne un echo de self sous la forme nom = valeur
     """
-    return self.nom+' = '+str(self.valeur)+'\n'
+    return self.nom+' = '+str(self.valeur)
 
   def __str__(self):
     """
index 65713bb2082f1a0d9f309105c3fc15c3aaaa5e25..20cdddb09705a8f49fb041b4f5ab2c88efa844ed 100644 (file)
@@ -65,7 +65,7 @@ class PARAMETRE_EVAL(parametre.PARAMETRE) :
     """
         Donne un echo de self sous la forme nom = valeur
     """
-    return self.nom+' = '+ repr(self.valeur) + '\n'
+    return self.nom+' = '+ repr(self.valeur) 
 
   def __str__(self):
     """
index 3b51fbb6444c90bab0d755a51298bb2bbd435e33..07ca3d69dca7ca946c483248f36dc814ae668488 100644 (file)
@@ -153,11 +153,14 @@ class ETAPE(I_MCCOMPO.MCCOMPO):
             # Il n'existe pas de concept de ce nom dans le voisinage de l'etape courante
             # On peut donc créer le concept retourné.
             # Il est créé sans nom mais enregistré dans la liste des concepts existants
-            self.get_sd_prod()
-            # Il suffit de changer son attribut nom pour le nommer
-            self.sd.nom = nom
-            self.sdnom=nom
-            return 1,"Nommage du concept effectué"
+            try:
+               self.get_sd_prod()
+               # Il suffit de changer son attribut nom pour le nommer
+               self.sd.nom = nom
+               self.sdnom=nom
+               return 1,"Nommage du concept effectué"
+            except:
+               return 0,"Nommage impossible"+str(sys.exc_info()[1])
       else :
           old_nom=self.sd.nom
           if string.find(old_nom,'sansnom') :
index 2ba38ccbf5ebfa7a85041966818adf000b51301a..b897fa0627af5f40e3ef5ab37fc401134dc2b729 100644 (file)
@@ -335,6 +335,47 @@ class MCSIMP(I_OBJECT.OBJECT):
      Retourne le type attendu par le mot-clé simple
      """
      return self.definition.type
+
+#--------------------------------------------------------------------------------
+# PN : ajout pour Salome des methodes suivantes (jusqu aux méthodes surchargees)
+#--------------------------------------------------------------------------------
+  def get_salome_valeurs(self):
+       l=[]
+       if not hasattr(self,'list_salome_valeurs'):
+           self.list_salome_valeurs=[]
+       if self.list_salome_valeurs != [] :
+           for val in self.list_salome_valeurs:
+                l.append(val)
+       return l
+
+  def put_salome_valeurs(self,list):
+       self.list_salome_valeurs=[]
+       for val in list:
+           self.list_salome_valeurs.append(val)
+
+  def add_salome_valeurs(self,val):
+      if not hasattr(self,'list_salome_valeurs'):
+           self.list_salome_valeurs=[]
+      try:
+           self.list_salome_valeurs.append(val)
+      except :
+           try:
+              for uneval in val :
+                  self.list_salome_valeurs.append(uneval)
+           except :
+              pass
+
+  def has_salome_valeurs(self):
+      if not hasattr(self,'list_salome_valeurs'):
+           self.list_salome_valeurs=[]
+      if self.list_salome_valeurs != []:
+           return true
+      else:
+           return false
+
+#--------------------------------------------------------------------------------
+# PN : fin ajout pour Salome 
+#--------------------------------------------------------------------------------
  
 #ATTENTION SURCHARGE : toutes les methodes ci apres sont des surcharges du Noyau et de Validation
 # Elles doivent etre reintegrees des que possible
index 728b6355aa602ce2b49133f0eea6aaed8a9576f1..85c869379de020d1a9e294687e7af6e5ec4a2786 100644 (file)
 """
 import string
 
-import prefs
 import Noyau
 
+try:
+  import prefs
+  lang=prefs.lang
+except:
+  lang='fr'
+  
+
 class OBJECT:
   from Noyau.N_CO import CO
   from Noyau.N_ASSD import assd
@@ -123,7 +129,7 @@ class OBJECT:
          en tenant compte de la langue
      """
      try :
-        return getattr(self.definition,prefs.lang)
+        return getattr(self.definition,lang)
      except:
         return ''
 
index 1e703ba0c5586f1ac65f06a2b287758f1e961413..2eb2b584faff29a229b71b9df11812015fd92ecb 100644 (file)
@@ -1,4 +1,4 @@
-#@ MODIF N_ETAPE Noyau  DATE 26/09/2003   AUTEUR DURAND C.DURAND 
+#@ MODIF N_ETAPE Noyau  DATE 04/02/2004   AUTEUR CAMBIER S.CAMBIER 
 #            CONFIGURATION MANAGEMENT OF EDF VERSION
 # ======================================================================
 # COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
index 059b6c21962d95b8122814ea71d736544f4e3162..419ca118e860d8598c9f5a7c8754ed0cbc035d96 100644 (file)
@@ -1,4 +1,4 @@
-#@ MODIF N_JDC Noyau  DATE 05/11/2003   AUTEUR CAMBIER S.CAMBIER 
+#@ MODIF N_JDC Noyau  DATE 04/02/2004   AUTEUR CAMBIER S.CAMBIER 
 #            CONFIGURATION MANAGEMENT OF EDF VERSION
 # ======================================================================
 # COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
index d663047e74c5e67e5be9cbc7d28ceebe4c946857..64d875aaff8e9cca55e0067adbe62266646f00f9 100644 (file)
@@ -1,4 +1,4 @@
-#@ MODIF N_MACRO_ETAPE Noyau  DATE 26/09/2003   AUTEUR DURAND C.DURAND 
+#@ MODIF N_MACRO_ETAPE Noyau  DATE 04/02/2004   AUTEUR CAMBIER S.CAMBIER 
 #            CONFIGURATION MANAGEMENT OF EDF VERSION
 # ======================================================================
 # COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
index 34fdb45ec70eb15717df7c3b8ff7a8e4ad569360..29f53bd26847c29ac3bcae59ae4f5319f3e9d8c0 100644 (file)
@@ -1,4 +1,4 @@
-#@ MODIF N_MCBLOC Noyau  DATE 03/09/2002   AUTEUR GNICOLAS G.NICOLAS 
+#@ MODIF N_MCBLOC Noyau  DATE 04/02/2004   AUTEUR CAMBIER S.CAMBIER 
 #            CONFIGURATION MANAGEMENT OF EDF VERSION
 # ======================================================================
 # COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
index bb77a945d3be8fd6bebcb94fe5327d1ed3b75400..7fc903056dfcad19bb1fc458eb9a7d14f34bb272 100644 (file)
@@ -1,4 +1,4 @@
-#@ MODIF N_MCCOMPO Noyau  DATE 28/10/2003   AUTEUR DURAND C.DURAND 
+#@ MODIF N_MCCOMPO Noyau  DATE 04/02/2004   AUTEUR CAMBIER S.CAMBIER 
 #            CONFIGURATION MANAGEMENT OF EDF VERSION
 # ======================================================================
 # COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
index 49736eb1586449587333b421f1cc4f91f1a66b58..21e64dfaf9a5bee3fd6157e624bc36ef13636fed 100644 (file)
@@ -1,4 +1,4 @@
-#@ MODIF N_MCLIST Noyau  DATE 03/09/2002   AUTEUR GNICOLAS G.NICOLAS 
+#@ MODIF N_MCLIST Noyau  DATE 04/02/2004   AUTEUR CAMBIER S.CAMBIER 
 #            CONFIGURATION MANAGEMENT OF EDF VERSION
 # ======================================================================
 # COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
index 5e123bd147d93a0a6eeb00930a708a7d329841b4..07cd783a5282c3fa8c932e0eca16afdb6302fe0f 100644 (file)
@@ -1,4 +1,4 @@
-#@ MODIF N_MCSIMP Noyau  DATE 03/09/2002   AUTEUR GNICOLAS G.NICOLAS 
+#@ MODIF N_MCSIMP Noyau  DATE 04/02/2004   AUTEUR CAMBIER S.CAMBIER 
 #            CONFIGURATION MANAGEMENT OF EDF VERSION
 # ======================================================================
 # COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
index 52abd6cdcd76ea2746b843e858c98fbb771a628d..27876396c07ec306e97ef4b0e44350f8fa9d19ca 100644 (file)
@@ -1,4 +1,4 @@
-#@ MODIF N_OBJECT Noyau  DATE 27/03/2002   AUTEUR DURAND C.DURAND 
+#@ MODIF N_OBJECT Noyau  DATE 04/02/2004   AUTEUR CAMBIER S.CAMBIER 
 #            CONFIGURATION MANAGEMENT OF EDF VERSION
 # ======================================================================
 # COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
index 6db3a475cb2986d4e5397756a53653138829ad6e..7099deb88a783970168a4720a5b47f226093742d 100644 (file)
@@ -1,4 +1,4 @@
-#@ MODIF N_VALIDATOR Noyau  DATE 09/09/2003   AUTEUR DURAND C.DURAND 
+#@ MODIF N_VALIDATOR Noyau  DATE 04/02/2004   AUTEUR CAMBIER S.CAMBIER 
 #            CONFIGURATION MANAGEMENT OF EDF VERSION
 # ======================================================================
 # COPYRIGHT (C) 1991 - 2003  EDF R&D                  WWW.CODE-ASTER.ORG
@@ -257,7 +257,7 @@ class RangeVal(ListVal):
           return valeur > self.low and valeur < self.high
 
       def info_erreur_item(self) :
-          return "La valeur doit être comprise entre %s et %s" % (self.low,
+          return "La valeur doit etre comprise entre %s et %s" % (self.low,
                                                                   self.high)
 
       def verif_cata(self):
@@ -281,7 +281,7 @@ class CardVal(Valid):
           return "longueur de liste comprise entre  %s et %s" % (self.min,self.max)
 
       def info_erreur_liste(self):
-          return "La cardinalité de la liste doit être comprise entre %s et %s" % (self.min,self.max)
+          return "Le cardinal de la liste doit etre compris entre %s et %s" % (self.min,self.max)
 
       def is_list(self):
           return self.max == '**' or self.max > 1
@@ -336,7 +336,7 @@ class PairVal(ListVal):
           return "valeur paire"
 
       def info_erreur_item(self):
-          return "La valeur saisie doit être paire"
+          return "La valeur saisie doit etre paire"
 
       def verif_item(self,valeur):
           if type(valeur) == types.InstanceType:
@@ -469,7 +469,7 @@ class OrdList(ListVal):
           return "liste %s" % self.ord
 
       def info_erreur_liste(self) :
-          return "La liste doit être en ordre "+self.ord
+          return "La liste doit etre en ordre "+self.ord
 
       def verif(self,valeur):
           if type(valeur) in (types.ListType,types.TupleType):
index 16a59d69259346f5589560dc7a4591a90fcf3bf5..83cb03be6e03950b5eda84d6ce984e81c586fd3f 100644 (file)
@@ -1,4 +1,4 @@
-#@ MODIF V_MCSIMP Validation  DATE 06/10/2003   AUTEUR DURAND C.DURAND 
+#@ MODIF V_MCSIMP Validation  DATE 04/02/2004   AUTEUR CAMBIER S.CAMBIER 
 #            CONFIGURATION MANAGEMENT OF EDF VERSION
 # ======================================================================
 # COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
@@ -100,10 +100,7 @@ class MCSIMP:
               self.cr.fatal("None n'est pas une valeur autorisée")
         else:
            # type,into ...
-           #valid = self.verif_type(val=v,cr=cr)*self.verif_into(cr=cr)*self.verif_card(cr=cr)
-           valid = self.verif_type(val=v,cr=cr)
-           valid=valid*self.verif_into(cr=cr)
-           valid=valid*self.verif_card(cr=cr)
+           valid = self.verif_type(val=v,cr=cr)*self.verif_into(cr=cr)*self.verif_card(cr=cr)
            #
            # On verifie les validateurs s'il y en a et si necessaire (valid == 1)
            #
index 0b82defb73b4fb28fcfa2ac06c5dbb85e4a6dd65..3a6c592862e0bd8bf3e6c785680ac90beec1a8de 100644 (file)
@@ -473,53 +473,49 @@ class PythonGenerator:
           syntaxe python
       """
       if type(obj.valeur) in (types.TupleType,types.ListType) :
-        s = ''
-        for val in obj.valeur :
-          if type(val) == types.InstanceType :
-            if hasattr(obj.etape,'sdprods'):
-               if val in obj.etape.sdprods :
+         s = ''
+         for val in obj.valeur :
+            if type(val) == types.InstanceType :
+               if hasattr(obj.etape,'sdprods') and val in obj.etape.sdprods :
                   s = s + "CO('"+ self.generator(val) +"')"
                elif val.__class__.__name__ == 'CO':
                   s = s + "CO('"+ self.generator(val) +"')"
+               elif isinstance(val,PARAMETRE):
+                  # il ne faut pas prendre la string que retourne gener
+                  # mais seulement le nom dans le cas d'un paramètre
+                  s = s + val.nom
                else:
                   s = s + self.generator(val)
-            elif isinstance(val,PARAMETRE):
-               # il ne faut pas prendre la string que retourne gener
-               # mais seulement le nom dans le cas d'un paramètre
-               s = s + val.nom
-            else:
-               s = s + self.generator(val)
-          elif type(val) == types.FloatType :
-            # Pour un flottant on utilise str qui a une precision de
-            # "seulement" 12 chiffres : evite les flottants du genre 0.599999999999998
-            s = s + str(val)
-          else :
-            s = s + `val`
-          s = s + ','
-        if len(obj.valeur) > 1:
-           s = '(' + s + '),'
+            elif type(val) == types.FloatType :
+               # Pour un flottant on utilise str qui a une precision de
+               # "seulement" 12 chiffres : evite les flottants du genre 0.599999999999998
+               s = s + str(val)
+            else :
+               # Pour les autres types on utilise repr
+               s = s + `val`
+            s = s + ','
+         if len(obj.valeur) > 1:
+            s = '(' + s + '),'
       else :
-        val=obj.valeur
-        if type(val) == types.InstanceType :
-          if hasattr(obj.etape,'sdprods'):
-             if val in obj.etape.sdprods :
-                s = "CO('"+ self.generator(val) +"')"
-             elif val.__class__.__name__ == 'CO':
+         val=obj.valeur
+         if type(val) == types.InstanceType :
+            if hasattr(obj.etape,'sdprods') and val in obj.etape.sdprods :
+               s = "CO('"+ self.generator(val) +"')"
+            elif val.__class__.__name__ == 'CO':
                 s = "CO('"+ self.generator(val) +"')"
-             else:
+            elif isinstance(val,PARAMETRE):
+                # il ne faut pas prendre la string que retourne gener
+                # mais seulement le nom dans le cas d'un paramètre
+                s = val.nom
+            else:
                 s = self.generator(val)
-          elif isinstance(val,PARAMETRE):
-             # il ne faut pas prendre la string que retourne gener
-             # mais seulement le nom dans le cas d'un paramètre
-             s = val.nom
-          else:
-             s = self.generator(val)
-        elif type(val) == types.FloatType :
-          #s = repr_float(val)
-          s = str(val)
-        else :
-          s = `val`
-        s= s + ','
+         elif type(val) == types.FloatType :
+            # Pour un flottant on utilise str 
+            s = str(val)
+         else :
+            # Pour les autres types on utilise repr
+            s = `val`
+         s= s + ','
       return s