Example #1
0
 def _build_data(self):
     """Read keywords to build the data"""
     CalcFonctionOper._build_list_fonc(self)
     kw = self.kw
     self._dat = {}
     # amor
     if kw['AMOR_REDUIT'] is None:
         l_amor = [0.02, 0.05, 0.1]
         UTMESS('I', 'FONCT0_31', valr=l_amor)
     else:
         l_amor = force_list(kw['AMOR_REDUIT'])
     eps = 1.e-6
     for amor in l_amor:
         if amor > (1 - eps):
             UTMESS('S', 'FONCT0_36')
     self._dat['AMOR'] = l_amor
     # freq
     if kw['LIST_FREQ'] is not None:
         l_freq = kw['LIST_FREQ'].Valeurs()
     elif kw['FREQ'] is not None:
         l_freq = force_list(kw['FREQ'])
     else:
         l_freq = []
         for i in range(56):
             l_freq.append(0.2 + 0.050 * i)
         for i in range(8):
             l_freq.append(3.0 + 0.075 * i)
         for i in range(14):
             l_freq.append(3.6 + 0.100 * i)
         for i in range(24):
             l_freq.append(5.0 + 0.125 * i)
         for i in range(28):
             l_freq.append(8.0 + 0.250 * i)
         for i in range(6):
             l_freq.append(15.0 + 0.500 * i)
         for i in range(4):
             l_freq.append(18.0 + 1.0 * i)
         for i in range(10):
             l_freq.append(22.0 + 1.500 * i)
         texte = []
         for i in range(len(l_freq) / 5):
             texte.append(' %f %f %f %f %f' %
                          tuple(l_freq[i * 5:i * 5 + 5]))
         UTMESS('I',
                'FONCT0_32',
                vali=len(l_freq),
                valk=os.linesep.join(texte))
     if min(l_freq) < 1.E-10:
         UTMESS('F', 'FONCT0_43')
     self._dat['FREQ'] = l_freq
     # check
     if abs(kw['NORME']) < 1.E-10:
         UTMESS('S', 'FONCT0_33')
     if kw['NATURE_FONC'] == 'DSP':
         ASSERT(kw['METHODE'] == 'RICE')
Example #2
0
 def visitMCSIMP(self, mcsimp):
     """Visit the MCSIMP object."""
     self.mcsimp = mcsimp.nom
     self.value = ''
     lval = force_list(mcsimp.valeur)
     as_list = (mcsimp.definition.max == '**' or mcsimp.definition.max > 1) \
         and mcsimp.definition.into is not None
     svalues = []
     for i, value in enumerate(lval):
         repr_value = ''
         if is_float(value):
             repr_value = repr_float(value)
         elif is_int(value):
             repr_value = str(value)
         elif type(value) in (str, unicode):
             repr_value = repr(value)
         svalues.append(repr_value)
     if as_list and len(svalues) == 1:
         svalues.append("")
     self.value = ", ".join(svalues)
     if as_list:
         self.value = "(%s)" % self.value
     if mcsimp.definition.into is None and mcsimp.valeur != mcsimp.definition.defaut:
         self.value = ''
     self.add_args()
Example #3
0
 def visitMCSIMP(self, mcsimp):
     """Visit the MCSIMP object."""
     # print "visit MCSIMP", mcsimp.nom
     for value in force_list(mcsimp.valeur):
         if isinstance(value, ASSD):
             value.accept(self)
         elif mcsimp.nom.startswith('UNITE'):
             self.tree.add_dependency(NodeKeywordUL(mcsimp.nom, value))
Example #4
0
def _detr_list_co(self, context):
    """Utilitaire pour DETRUIRE"""
    list_co = set()
    # par nom de concept (typ=assd)
    for mc in self['CONCEPT'] or []:
        list_co.update(force_list(mc["NOM"]))
    # par chaine de caractères (typ='TXM')
    for mc in self['OBJET'] or []:
        # longueur <= 8, on cherche les concepts existants
        for nom in force_list(mc['CHAINE']):
            assert type(nom) in (
                str, unicode), 'On attend une chaine de caractères : %s' % nom
            if len(nom.strip()) <= 8:
                if self.jdc.sds_dict.get(nom) != None:
                    list_co.add(self.jdc.sds_dict[nom])
                elif context.get(nom) != None:
                    list_co.add(context[nom])
            # else uniquement destruction des objets jeveux
    return list_co
Example #5
0
 def _get_mcsimp(self, mcsimp):
     """Return the list of mcsimp values for all occurrences of mcfact."""
     # only one occurrence of MCFACT or only one value in MCSIMP
     value = []
     try:
         nbmf = len(self.kw)
     except AttributeError:
         nbmf = 1
     for mcf in self.kw:
         val = force_list(mcf[mcsimp])
         assert nbmf == 1 or len(val) == 1, (nbmf, val)
         value.extend(val)
     return value
Example #6
0
 def get_context(self, ctxt_msg, idmess, dicarg):
     """Prise en compte du context du message pour donner d'autres infos
     à l'utilisateur.
     ctxt_msg est un dictionnaire. Les clés traitées sont :
         - CONCEPT
     """
     if not ctxt_msg:
         return ''
     msg = []
     # tout dans un try/except car c'est du bonus, il ne faudrait pas
     # planter !
     try:
         if ctxt_msg.has_key('CONCEPT'):
             l_co = [dicarg[arg] for arg in force_list(ctxt_msg['CONCEPT'])]
             for co in l_co:
                 msg.append(message_context_concept(co))
     except:
         pass
     return os.linesep.join(msg)
Example #7
0
 def _repr_MCSIMP(self, mcsimp):
     """Return the representation of the value of a MCSIMP."""
     lval = force_list(mcsimp.valeur)
     svalues = []
     for i, value in enumerate(lval):
         if isinstance(value, ASSD):
             value.accept(self)
             repr_value = self.sdname
             if hasattr(mcsimp.etape,
                        'sdprods') and value in mcsimp.etape.sdprods:
                 repr_value = "CO(%s)" % repr_value
         elif is_float(value):
             repr_value = repr_float(value)
         elif mcsimp.definition.type[0] == 'shell':
             # the initial text of the formula is store in mcsimp.val
             repr_value = '"""%s"""' % mcsimp.val
         else:
             repr_value = repr(value)
         svalues.append(repr_value)
     return svalues
Example #8
0
 def install(self, lang=None):
     """Install the translation object for the given 'lang'."""
     if not self.domain:
         self.set_domain()
     lang = (lang or self.default_lang).lower()
     self.current_lang = lang
     if lang:
         lang = force_list(lang)
         low = lang[0].lower()
         lang.append(low)
         # add variants lang* (ex. en-UK, en-US...)
         try:
             variants = [i for i in os.listdir(self.localedir) \
                         if i.startswith(low)]
         except OSError:
             variants = []
         lang.extend(variants)
     tr = gettext.translation(
         self.domain, self.localedir, languages=lang, fallback=True)
     tr.install(unicode=True)
     return tr
Example #9
0
    def check(self):
        """Vérification des règles impossible à écrire dans le .capy"""
        # tâches à la demande
        if self['TYPE_RESU'] in ('HARM_GENE', 'TRAN_GENE', 'TABLE', 'CHARGE'):
            self.set('_calc_impe', True)
            self.set('_calc_forc', True)
        elif self['TYPE_RESU'] in ('FICHIER', 'TABLE_CONTROL'):
            if self.get('UNITE_RESU_IMPE') is not None:
                self.set('_calc_impe', True)
            if self.get('UNITE_RESU_FORC') is not None:
                self.set('_calc_forc', True)
        else:
            if self['EXCIT_SOL'] is not None:
                self.set('_calc_forc', True)
        self.set('_hasPC', self.get('GROUP_MA_CONTROL') is not None)
        # unités logiques
        if self.get('UNITE_RESU_IMPE') is None:
            self.set('_exec_Miss', True)
            self['UNITE_RESU_IMPE'] = self.UL.Libre(action='ASSOCIER')
        if self.get('UNITE_RESU_FORC') is None:
            self.set('_exec_Miss', True)
            self['UNITE_RESU_FORC'] = self.UL.Libre(action='ASSOCIER')

        # fréquences
        if self['TYPE_RESU'] not in ('CHARGE'):
            if self['LIST_FREQ'] is not None \
                    and self['TYPE_RESU'] not in ('FICHIER', 'HARM_GENE', 'TABLE_CONTROL'):
                raise aster.error('MISS0_17')

        # si base modale, vérifier/compléter les amortissements réduits
        if self['TYPE_RESU'] not in ('CHARGE'):
            if self['BASE_MODALE']:
                res = aster.dismoi('NB_MODES_DYN', self['BASE_MODALE'].nom,
                                   'RESULTAT', 'C')
                ASSERT(res[0] == 0)
                self['_NBM_DYN'] = res[1]
                res = aster.dismoi('NB_MODES_STA', self['BASE_MODALE'].nom,
                                   'RESULTAT', 'C')
                ASSERT(res[0] == 0)
                self['_NBM_STAT'] = res[1]
                if self['AMOR_REDUIT']:
                    self.set('AMOR_REDUIT', force_list(self['AMOR_REDUIT']))
                    nval = len(self['AMOR_REDUIT'])
                    if nval < self['_NBM_DYN']:
                        # complète avec le dernier
                        nadd = self['_NBM_DYN'] - nval
                        self._keywords['AMOR_REDUIT'].extend([
                            self['AMOR_REDUIT'][-1],
                        ] * nadd)
                        nval = self['_NBM_DYN']
                    if nval < self['_NBM_DYN'] + self['_NBM_STAT']:
                        # on ajoute 0.
                        self._keywords['AMOR_REDUIT'].append(0.)
        # la règle ENSEMBLE garantit que les 3 GROUP_MA_xxx sont tous absents
        # ou tous présents
        if self['TYPE_RESU'] not in ('CHARGE'):
            if self['ISSF'] != 'NON':
                if self['GROUP_MA_FLU_STR'] is None:
                    UTMESS('F', 'MISS0_22')
                if self['MATER_FLUIDE'] is None:
                    UTMESS('F', 'MISS0_23')
Example #10
0
def calc_table_ops(self, TABLE, ACTION, INFO, **args):
    """
    Macro CALC_TABLE permettant de faire des opérations sur une table
    """
    import aster

    from code_aster.Cata.Syntax import _F
    from Noyau.N_types import force_list
    from code_aster.Cata.DataStructure import table_fonction, table_container
    from Utilitai.Utmess import UTMESS
    from Utilitai.Table import merge
    from Utilitai.utils import get_titre_concept

    ier = 0
    # La macro compte pour 1 dans la numerotation des commandes
    self.set_icmd(1)

    # Le concept sortant (de type table_sdaster ou dérivé) est tabout
    self.DeclareOut('tabout', self.sd)
    if self.sd.__class__ == table_fonction:
        typ_tabout = 'TABLE_FONCTION'
    elif self.sd.__class__ == table_container:
        typ_tabout = 'TABLE_CONTENEUR'
    else:
        typ_tabout = 'TABLE'

    # On importe les definitions des commandes a utiliser dans la macro
    # Le nom de la variable doit etre obligatoirement le nom de la commande
    CREA_TABLE = self.get_cmd('CREA_TABLE')
    DETRUIRE = self.get_cmd('DETRUIRE')

    tab = TABLE.EXTR_TABLE()

    # Réinitialiser le titre si on n'est pas réentrant
    if self.reuse is None:
        tab.titr = get_titre_concept(self.sd)

    # Boucle sur les actions à effectuer
    for fOP in ACTION:
        occ = fOP.cree_dict_valeurs(fOP.mc_liste)
        for mc, val in occ.items():
            if val == None:
                del occ[mc]

        # 1. Traitement du FILTRE
        # format pour l'impression des filtres
        form_filtre = '\nFILTRE -> NOM_PARA: %-16s CRIT_COMP: %-4s VALE: %s'
        if occ['OPERATION'] == 'FILTRE':
            # peu importe le type, c'est la meme méthode d'appel
            opts = [
                occ[k] for k in ('VALE', 'VALE_I', 'VALE_C', 'VALE_K')
                if occ.has_key(k)
            ]
            kargs = {}
            for k in ('CRITERE', 'PRECISION'):
                if occ.has_key(k):
                    kargs[k] = occ[k]

            col = getattr(tab, occ['NOM_PARA'])
            tab = getattr(col, occ['CRIT_COMP'])(*opts, **kargs)

            # trace l'operation dans le titre
            # if FORMAT in ('TABLEAU', 'ASTER'):
            tab.titr += form_filtre % (occ['NOM_PARA'], occ['CRIT_COMP'],
                                       ' '.join([str(v) for v in opts]))

        # 2. Traitement de EXTR
        if occ['OPERATION'] == 'EXTR':
            lpar = force_list(occ['NOM_PARA'])
            for p in lpar:
                if not p in tab.para:
                    UTMESS('F', 'TABLE0_2', valk=[p, TABLE.nom])
            tab = tab[lpar]

        # 3. Traitement de SUPPRIME
        if occ['OPERATION'] == 'SUPPRIME':
            lpar = force_list(occ['NOM_PARA'])
            keep = []
            for p in tab.para:
                if not p in lpar:
                    keep.append(p)
            tab = tab[keep]

        # 4. Traitement de RENOMME
        if occ['OPERATION'] == 'RENOMME':
            try:
                tab.Renomme(*occ['NOM_PARA'])
            except KeyError, msg:
                UTMESS('F', 'TABLE0_3', valk=msg)

        # 5. Traitement du TRI
        if occ['OPERATION'] == 'TRI':
            tab.sort(CLES=occ['NOM_PARA'], ORDRE=occ['ORDRE'])

        # 6. Traitement de COMB
        if occ['OPERATION'] == 'COMB':
            tab2 = occ['TABLE'].EXTR_TABLE()
            lpar = []
            if occ.get('NOM_PARA') != None:
                lpar = force_list(occ['NOM_PARA'])
                for p in lpar:
                    if not p in tab.para:
                        UTMESS('F', 'TABLE0_2', valk=[p, TABLE.nom])
                    if not p in tab2.para:
                        UTMESS('F', 'TABLE0_2', valk=[p, occ['TABLE'].nom])
            restrict = occ.get('RESTREINT') == 'OUI'
            format_r = occ.get('FORMAT_R')
            tab = merge(tab, tab2, lpar, restrict=restrict, format_r=format_r)

        # 7. Traitement de OPER
        if occ['OPERATION'] == 'OPER':
            if occ.get('NOM_COLONNE') \
                    and len(occ['NOM_COLONNE']) != len(occ['FORMULE'].nompar):
                UTMESS('F', 'TABLE0_19', vali=len(occ['FORMULE'].nompar))
            # ajout de la colonne dans la table
            tab.fromfunction(occ['NOM_PARA'],
                             occ['FORMULE'],
                             l_para=occ.get('NOM_COLONNE'))
            if INFO == 2:
                vectval = getattr(tab, occ['NOM_PARA']).values()
                aster.affiche(
                    'MESSAGE', 'Ajout de la colonne %s : %s' %
                    (occ['NOM_PARA'], repr(vectval)))

        # 8. Traitement de AJOUT_LIGNE
        if occ['OPERATION'] == 'AJOUT_LIGNE':
            lpar = force_list(occ['NOM_PARA'])
            lval = force_list(occ['VALE'])
            if len(lpar) != len(lval):
                UTMESS('F', 'TABLE0_14', valk=('NOM_PARA', 'VALE'))
            dnew = dict(zip(lpar, lval))
            # ajout de la ligne avec vérification des types
            tab.append(dnew)

        # 9. Traitement de AJOUT_COLONNE
        if occ['OPERATION'] == 'AJOUT_COLONNE':
            lpar = force_list(occ['NOM_PARA'])
            lcol = occ.get('VALE_COLONNE')
            if lcol:
                lcol = force_list(lcol)
                if len(lpar) != 1:
                    UTMESS('F', 'TABLE0_4')
                tab[lpar[0]] = lcol[:len(tab)]
            else:
                lval = force_list(occ['VALE'])
                if len(lpar) != len(lval):
                    UTMESS('F', 'TABLE0_14', valk=('NOM_PARA', 'VALE'))
                for para, value in zip(lpar, lval):
                    nval = [
                        value,
                    ] * len(tab)
                    tab[para] = nval

        # 10. Suppression des doublons
        if occ['OPERATION'] == 'UNIQUE':
            from Utilitai.Table import remove_twins
            format_r = occ.get('FORMAT_R')
            lpar = force_list(occ['NOM_PARA'])
            remove_twins(tab, lpar, format_r)

        # Traitement de STATISTIQUES
        if occ['OPERATION'] == 'STATISTIQUES':
            for nom_para in ('STAT_NOM', 'STAT_VALE'):
                if nom_para in tab.para:
                    UTMESS('F', 'TABLE0_24', valk=nom_para)
            nbVide = 0
            for col in tab.values().values():
                nbVide += sum([1 for i in col if i is None])
            # be care to extract the statistics before changing `tab`!
            tab['STAT_VALE'] = [len(tab), len(tab.para), nbVide]
            tab['STAT_NOM'] = ['NB_LIGNES', 'NB_COLONNES', 'NB_VIDE']