Salome HOME
CCAR:amelioration de la fonctionnalité mots clés inconnus
[tools/eficas.git] / Noyau / N_utils.py
1 """
2    Ce module contient des fonctions utilitaires
3 """
4
5 # Modules Python
6 import sys,types
7 import string
8
9 # Modules EFICAS
10 from N_Exception import AsException
11
12 SEP='_'
13
14 try:
15    # Si la version de Python possède la fonction _getframe
16    # on l'utilise.
17    cur_frame=sys._getframe
18 except:
19    # Sinon on l'émule
20    def cur_frame(offset=0):
21      """ Retourne la frame d execution effective eventuellement en remontant
22          de offset niveaux dans la pile d execution
23          Si il y a moins de offset niveaux retourne None
24      """
25      try:1/0
26      except:
27        frame=sys.exc_info()[2].tb_frame.f_back
28      while offset > 0:
29        if frame == None:return None
30        frame=frame.f_back
31        offset=offset-1
32      return frame
33
34
35 def callee_where(niveau=4):
36    """ 
37       recupere la position de l appel 
38    """
39    frame=cur_frame(niveau)
40    if frame == None: return 0,"inconnu",0,{}
41    try:
42      return frame.f_lineno,frame.f_code.co_filename,frame.f_code.co_firstlineno,frame.f_locals
43    except:
44      return 0,"inconnu",0,{}
45
46 def AsType(a):
47    """
48       Retourne le type d'un concept (a) à partir
49       des caractéristiques de l'objet Python
50    """
51    if type(a) in (types.TupleType,types.ListType):return AsType(a[0])
52    if type(a) == types.InstanceType:return a.__class__
53    if type(a) == types.FloatType:return "R"
54    if type(a) == types.IntType:return "I"
55    if type(a) == types.StringType:return "TXM"
56    if a == None : return None
57    print 'a=',a,type(a)
58    raise AsException("type inconnu")
59
60 def prbanner(s):
61    print "*"*(len(s)+10)
62    print "*"*5 + s + "*"*5
63    print "*"*(len(s)+10)
64
65 def repr_float(valeur):
66   """ 
67       Cette fonction représente le réel valeur comme une chaîne de caractères
68       sous forme mantisse exposant si nécessaire cad si le nombre contient plus de
69       5 caractères
70       NB : valeur est un réel au format Python ou une chaîne de caractères représentant un réel
71   """
72   if type(valeur) == types.StringType : valeur = eval(valeur)
73   if valeur == 0. : return '0.0'
74   if abs(valeur) > 1. :
75     if abs(valeur) < 10000. : return repr(valeur)
76   else :
77     if abs(valeur) > 0.01 : return repr(valeur)
78   t=repr(valeur)
79   if string.find(t,'e') != -1 or string.find(t,'E') != -1 :
80     # le réel est déjà sous forme mantisse exposant !
81     # --> on remplace e par E
82     t=string.replace(t,'e','E')
83     # --> on doit encore vérifier que la mantisse contient bien un '.'
84     if string.find(t,'.')!= -1:
85       return t
86     else:
87       # -->il faut rajouter le point avant le E
88       t=string.replace(t,'E','.E')
89       return t
90   s=''
91   neg = 0
92   if t[0]=='-':
93     s=s+t[0]
94     t=t[1:]
95   cpt = 0
96   if string.atof(t[0]) == 0.:
97     # réel plus petit que 1
98     neg = 1
99     t=t[2:]
100     cpt=1
101     while string.atof(t[0]) == 0. :
102       cpt = cpt+1
103       t=t[1:]
104     s=s+t[0]+'.'
105     for c in t[1:]:
106       s=s+c
107   else:
108     # réel plus grand que 1
109     s=s+t[0]+'.'
110     if string.atof(t[1:]) == 0.:
111       l=string.split(t[1:],'.')
112       cpt = len(l[0])
113     else:
114       r=0
115       pt=0
116       for c in t[1:]:
117         r=r+1
118         if c != '.' :
119           if pt != 1 : cpt = cpt + 1
120           s=s+c
121         else:
122           pt = 1
123           if r+1 == len(t) or string.atof(t[r+1:]) == 0.:break
124   s=s+'E'+neg*'-'+repr(cpt)
125   return s
126