From: eficas <> Date: Thu, 11 Mar 2004 09:59:06 +0000 (+0000) Subject: Restitution de PN_DecoupePanel X-Git-Tag: CC_param_poursuite~275 X-Git-Url: http://git.salome-platform.org/gitweb/?a=commitdiff_plain;h=dbe648488708009d86ca09a606bd60b274fdd6f6;p=modules%2Feficas.git Restitution de PN_DecoupePanel --- diff --git a/Aster/Cata/Macro/macr_aspic_calc_ops.py b/Aster/Cata/Macro/macr_aspic_calc_ops.py new file mode 100644 index 00000000..0f3d0e6c --- /dev/null +++ b/Aster/Cata/Macro/macr_aspic_calc_ops.py @@ -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(""" 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(""" 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(""" 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(""" 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(""" PRES_REP[NOEUD] : on attend 'P1_CORP' ou 'P2_CORP'""") + return ier + if PRES_REP['NOEUD']==EQUILIBRE['NOEUD'] : + ier=ier+1 + self.cr.fatal(""" 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(""" TORS_CORP[NOEUD] : on attend 'P1_CORP' ou 'P2_CORP'""") + return ier + if TORS_CORP['NOEUD']==EQUILIBRE['NOEUD'] : + ier=ier+1 + self.cr.fatal(""" 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(""" 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(""" mot-clef 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(""" 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 diff --git a/Aster/Cata/Macro/macr_aspic_mail_ops.py b/Aster/Cata/Macro/macr_aspic_mail_ops.py index 4e232f75..e517132f 100644 --- a/Aster/Cata/Macro/macr_aspic_mail_ops.py +++ b/Aster/Cata/Macro/macr_aspic_mail_ops.py @@ -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, diff --git a/Aster/Cata/cata_STA7.py b/Aster/Cata/cata_STA7.py index 6f325de9..4a10f1ae 100755 --- a/Aster/Cata/cata_STA7.py +++ b/Aster/Cata/cata_STA7.py @@ -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")), ), diff --git a/Aster/eficas_aster.py b/Aster/eficas_aster.py index 01d86701..8d4c9e15 100755 --- a/Aster/eficas_aster.py +++ b/Aster/eficas_aster.py @@ -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 @@ -20,13 +21,21 @@ # ====================================================================== """ - 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 diff --git a/Aster/prefs.py b/Aster/prefs.py index 261ee3b2..3c00b5af 100644 --- a/Aster/prefs.py +++ b/Aster/prefs.py @@ -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'), diff --git a/Doc/Makefile b/Doc/Makefile index 5ddac94b..42c3b9af 100644 --- a/Doc/Makefile +++ b/Doc/Makefile @@ -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/ \ + ) diff --git a/Editeur/appli.py b/Editeur/appli.py index 96f69f2b..104ba2d9 100644 --- a/Editeur/appli.py +++ b/Editeur/appli.py @@ -24,11 +24,12 @@ 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 diff --git a/Editeur/browser.py b/Editeur/browser.py index ba5b9eee..b5a6d9d9 100644 --- a/Editeur/browser.py +++ b/Editeur/browser.py @@ -21,7 +21,6 @@ """ # Modules Python import os,string -from tkFileDialog import * # Modules Eficas import Interp diff --git a/Editeur/bureau.py b/Editeur/bureau.py index 82a7e402..226e85d7 100644 --- a/Editeur/bureau.py +++ b/Editeur/bureau.py @@ -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 diff --git a/Editeur/cataediteur.py b/Editeur/cataediteur.py index b2f30f00..c64a6a5a 100644 --- a/Editeur/cataediteur.py +++ b/Editeur/cataediteur.py @@ -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 diff --git a/Editeur/compocomm.py b/Editeur/compocomm.py index 78d7f195..4961de3b 100644 --- a/Editeur/compocomm.py +++ b/Editeur/compocomm.py @@ -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 diff --git a/Editeur/compocommandecomm.py b/Editeur/compocommandecomm.py index cab37e89..2c8875b6 100644 --- a/Editeur/compocommandecomm.py +++ b/Editeur/compocommandecomm.py @@ -20,7 +20,7 @@ from Tkinter import * import Pmw import string -from tkMessageBox import showerror +from widgets import showerror import Objecttreeitem import panels diff --git a/Editeur/compoformule.py b/Editeur/compoformule.py index e018495b..346dc86e 100644 --- a/Editeur/compoformule.py +++ b/Editeur/compoformule.py @@ -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") diff --git a/Editeur/compomacro.py b/Editeur/compomacro.py index 8b003a95..f456ff88 100644 --- a/Editeur/compomacro.py +++ b/Editeur/compomacro.py @@ -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) diff --git a/Editeur/compoparameval.py b/Editeur/compoparameval.py index 2fa34a60..e3c7a899 100644 --- a/Editeur/compoparameval.py +++ b/Editeur/compoparameval.py @@ -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") diff --git a/Editeur/composimp.py b/Editeur/composimp.py index b8aaba32..6646c54a 100644 --- a/Editeur/composimp.py +++ b/Editeur/composimp.py @@ -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 = (("",self.selectValeur), - ("",self.deselectValeur), - ("",self.sup_valeur)) - liste_commandes_choix = (("",self.selectChoix), - ("",self.deselectChoix), - ("",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("",lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a)) - fram.bind("",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("",lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a)) - fram.bind("",self.parent.appli.efface_aide) - - # création des objets dans les frames - liste_commandes_valeurs = (("",self.selectValeur), - ("",self.deselectValeur), - ("",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 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("",lambda e,s=self:s.entry2.component('entry').focus) - self.entry2.component('entry').bind("",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("",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 = (("",self.selectValeur), - ("",self.deselectValeur), - ("",self.sup_valeur_sans_into)) - liste_commandes_choix = (("",self.selectChoix), - ("",self.deselectChoix), - # ("",self.add_valeur_sans_into)) - ("",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("",lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a)) - fram.bind("",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("",lambda e,s=self,a=bulle_aide : - s.parent.appli.affiche_aide(e,a)) - self.frame_valeur.bind("",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 = (("",self.selectChoix), - ("",self.deselectChoix), - ("",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("",lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a)) - self.frame_valeur.bind("",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("",lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a)) - self.frame_valeur.bind("",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('',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("",lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a)) - self.frame_valeur.bind("",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("",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 """ - - 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("",lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a)) - self.frame_valeur.bind("",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("",lambda e,s=self:s.entry2.component('entry').focus()) - self.entry2.component('entry').bind("",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 diff --git a/Editeur/configuration.py b/Editeur/configuration.py index 703ec6d4..75043cee 100644 --- a/Editeur/configuration.py +++ b/Editeur/configuration.py @@ -23,12 +23,9 @@ # 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: diff --git a/Editeur/eficas.py b/Editeur/eficas.py index f9e97f9b..bb38e0d6 100644 --- a/Editeur/eficas.py +++ b/Editeur/eficas.py @@ -25,12 +25,11 @@ 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 diff --git a/Editeur/eficas_go.py b/Editeur/eficas_go.py index 3f4df08b..11f9c88c 100644 --- a/Editeur/eficas_go.py +++ b/Editeur/eficas_go.py @@ -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 index 00000000..b6f8a492 --- /dev/null +++ b/Editeur/fonctionpanel.py @@ -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("",lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a)) + fram.bind("",self.parent.appli.efface_aide) + + # création des objets dans les frames + liste_commandes_valeurs = (("",self.selectValeur), + ("",self.deselectValeur), + ("",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) diff --git a/Editeur/jdcdisplay.py b/Editeur/jdcdisplay.py index da4d1ac8..addda697 100644 --- a/Editeur/jdcdisplay.py +++ b/Editeur/jdcdisplay.py @@ -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 index 00000000..3365876a --- /dev/null +++ b/Editeur/newsimppanel.py @@ -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 + diff --git a/Editeur/options.py b/Editeur/options.py index db1d1b6f..84b4c905 100644 --- a/Editeur/options.py +++ b/Editeur/options.py @@ -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) diff --git a/Editeur/panels.py b/Editeur/panels.py index 61b142c9..b04631ea 100644 --- a/Editeur/panels.py +++ b/Editeur/panels.py @@ -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 index 00000000..57efd365 --- /dev/null +++ b/Editeur/panelsSalome.py @@ -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("",lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a)) + fram.bind("",self.parent.appli.efface_aide) + + # création des objets dans les frames + liste_commandes_valeurs = (("",self.selectValeur), + ("",self.deselectValeur), + ("",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("",lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a)) + self.frame_valeur.bind("",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("",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 = { } diff --git a/Editeur/patches.py b/Editeur/patches.py index fd674118..04f75332 100644 --- a/Editeur/patches.py +++ b/Editeur/patches.py @@ -24,58 +24,9 @@ """ 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 index 00000000..761a4af6 --- /dev/null +++ b/Editeur/plusieursassdpanel.py @@ -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 = (("",self.selectValeur), + ("",self.deselectValeur), + ("",self.sup_valeur_sans_into)) + liste_commandes_choix = (("",self.selectChoix), + ("",self.deselectChoix), + # ("",self.add_valeur_sans_into)) + ("",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("",lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a)) + fram.bind("",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 index 00000000..c3757605 --- /dev/null +++ b/Editeur/plusieursbasepanel.py @@ -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("",lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a)) + fram.bind("",self.parent.appli.efface_aide) + + # création des objets dans les frames + liste_commandes_valeurs = (("",self.selectValeur), + ("",self.deselectValeur), + ("",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 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("",lambda e,s=self:s.entry2.component('entry').focus) + self.entry2.component('entry').bind("",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("",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 index 00000000..a43e5796 --- /dev/null +++ b/Editeur/plusieursintopanel.py @@ -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 = (("",self.selectValeur), + ("",self.deselectValeur), + ("",self.sup_valeur)) + liste_commandes_choix = (("",self.selectChoix), + ("",self.deselectChoix), + ("",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("",lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a)) + fram.bind("",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 index 00000000..7ec31f47 --- /dev/null +++ b/Editeur/plusieurspanel.py @@ -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)) + diff --git a/Editeur/readercata.py b/Editeur/readercata.py index 68e4aaa9..5b8a7373 100644 --- a/Editeur/readercata.py +++ b/Editeur/readercata.py @@ -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 index 00000000..1b75f8fa --- /dev/null +++ b/Editeur/shellpanel.py @@ -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) + diff --git a/Editeur/statusbar.py b/Editeur/statusbar.py index c6ba1892..d8348a15 100644 --- a/Editeur/statusbar.py +++ b/Editeur/statusbar.py @@ -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 index 00000000..4906321b --- /dev/null +++ b/Editeur/uniqueassdpanel.py @@ -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("",lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a)) + self.frame_valeur.bind("",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 index 00000000..d565a27f --- /dev/null +++ b/Editeur/uniquebasepanel.py @@ -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("",lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a)) + self.frame_valeur.bind("",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("",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 """ + + 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 index 00000000..f7763a9a --- /dev/null +++ b/Editeur/uniquecomppanel.py @@ -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("",lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a)) + self.frame_valeur.bind("",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("",lambda e,s=self:s.entry2.component('entry').focus()) + self.entry2.component('entry').bind("",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 index 00000000..f6a12425 --- /dev/null +++ b/Editeur/uniqueintopanel.py @@ -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("",lambda e,s=self,a=bulle_aide : + s.parent.appli.affiche_aide(e,a)) + self.frame_valeur.bind("",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 = (("",self.selectChoix), + ("",self.deselectChoix), + ("",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 index 00000000..3573ff06 --- /dev/null +++ b/Editeur/uniquepanel.py @@ -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 index 00000000..41d1ea5f --- /dev/null +++ b/Editeur/uniquesdcopanel.py @@ -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("",lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a)) + self.frame_valeur.bind("",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('',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() + + diff --git a/Editeur/utils.py b/Editeur/utils.py index 44eb986f..ef46ad53 100644 --- a/Editeur/utils.py +++ b/Editeur/utils.py @@ -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 diff --git a/Editeur/widgets.py b/Editeur/widgets.py index 593cf88b..6840f412 100644 --- a/Editeur/widgets.py +++ b/Editeur/widgets.py @@ -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 """ diff --git a/Extensions/parametre.py b/Extensions/parametre.py index cab74e36..8c9e8312 100644 --- a/Extensions/parametre.py +++ b/Extensions/parametre.py @@ -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): """ diff --git a/Extensions/parametre_eval.py b/Extensions/parametre_eval.py index 65713bb2..20cdddb0 100644 --- a/Extensions/parametre_eval.py +++ b/Extensions/parametre_eval.py @@ -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): """ diff --git a/Ihm/I_ETAPE.py b/Ihm/I_ETAPE.py index 3b51fbb6..07ca3d69 100644 --- a/Ihm/I_ETAPE.py +++ b/Ihm/I_ETAPE.py @@ -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') : diff --git a/Ihm/I_MCSIMP.py b/Ihm/I_MCSIMP.py index 2ba38ccb..b897fa06 100644 --- a/Ihm/I_MCSIMP.py +++ b/Ihm/I_MCSIMP.py @@ -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 diff --git a/Ihm/I_OBJECT.py b/Ihm/I_OBJECT.py index 728b6355..85c86937 100644 --- a/Ihm/I_OBJECT.py +++ b/Ihm/I_OBJECT.py @@ -21,9 +21,15 @@ """ 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 '' diff --git a/Noyau/N_ETAPE.py b/Noyau/N_ETAPE.py index 1e703ba0..2eb2b584 100644 --- a/Noyau/N_ETAPE.py +++ b/Noyau/N_ETAPE.py @@ -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 diff --git a/Noyau/N_JDC.py b/Noyau/N_JDC.py index 059b6c21..419ca118 100644 --- a/Noyau/N_JDC.py +++ b/Noyau/N_JDC.py @@ -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 diff --git a/Noyau/N_MACRO_ETAPE.py b/Noyau/N_MACRO_ETAPE.py index d663047e..64d875aa 100644 --- a/Noyau/N_MACRO_ETAPE.py +++ b/Noyau/N_MACRO_ETAPE.py @@ -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 diff --git a/Noyau/N_MCBLOC.py b/Noyau/N_MCBLOC.py index 34fdb45e..29f53bd2 100644 --- a/Noyau/N_MCBLOC.py +++ b/Noyau/N_MCBLOC.py @@ -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 diff --git a/Noyau/N_MCCOMPO.py b/Noyau/N_MCCOMPO.py index bb77a945..7fc90305 100644 --- a/Noyau/N_MCCOMPO.py +++ b/Noyau/N_MCCOMPO.py @@ -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 diff --git a/Noyau/N_MCLIST.py b/Noyau/N_MCLIST.py index 49736eb1..21e64dfa 100644 --- a/Noyau/N_MCLIST.py +++ b/Noyau/N_MCLIST.py @@ -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 diff --git a/Noyau/N_MCSIMP.py b/Noyau/N_MCSIMP.py index 5e123bd1..07cd783a 100644 --- a/Noyau/N_MCSIMP.py +++ b/Noyau/N_MCSIMP.py @@ -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 diff --git a/Noyau/N_OBJECT.py b/Noyau/N_OBJECT.py index 52abd6cd..27876396 100644 --- a/Noyau/N_OBJECT.py +++ b/Noyau/N_OBJECT.py @@ -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 diff --git a/Noyau/N_VALIDATOR.py b/Noyau/N_VALIDATOR.py index 6db3a475..7099deb8 100644 --- a/Noyau/N_VALIDATOR.py +++ b/Noyau/N_VALIDATOR.py @@ -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): diff --git a/Validation/V_MCSIMP.py b/Validation/V_MCSIMP.py index 16a59d69..83cb03be 100644 --- a/Validation/V_MCSIMP.py +++ b/Validation/V_MCSIMP.py @@ -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) # diff --git a/generator/generator_python.py b/generator/generator_python.py index 0b82defb..3a6c5928 100644 --- a/generator/generator_python.py +++ b/generator/generator_python.py @@ -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