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')
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()
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))
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
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
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)
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
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
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')
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']