Salome HOME
PN : pour visualisation des geométries + correction de bug
[tools/eficas.git] / Editeur / catabrowser.py
1 # -*- coding: utf-8 -*-
2 #            CONFIGURATION MANAGEMENT OF EDF VERSION
3 # ======================================================================
4 # COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
5 # THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
6 # IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
7 # THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
8 # (AT YOUR OPTION) ANY LATER VERSION.
9 #
10 # THIS PROGRAM IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, BUT
11 # WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF
12 # MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. SEE THE GNU
13 # GENERAL PUBLIC LICENSE FOR MORE DETAILS.
14 #
15 # YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
16 # ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
17 #    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
18 #
19 #
20 # ======================================================================
21 # Modules Python
22 import os
23 import sys
24 import types
25 import string
26 import Pmw
27 from Tkinter import *
28
29 # Modules Eficas
30 import fontes
31 from treewidget import Tree
32 from Objecttreeitem import TreeItem
33 from Accas import AsException
34 from Noyau.N_CR import justify_text
35 from Accas import OPER,PROC,MACRO,FORM
36 from Accas import FACT,BLOC,SIMP
37
38 #
39 __version__="$Name:  $"
40 __Id__="$Id: catabrowser.py,v 1.3 2002/09/10 15:59:37 eficas Exp $"
41 #
42 class Tableau:
43   incr = 10
44   def __init__(self,parent,colonnes):
45     self.parent = parent
46     self.colonnes = colonnes
47     self.init()
48
49   def init(self):
50     # recherche du nombre maxi de lignes et de colonnes....
51     for col in self.colonnes :
52       nb_l = 0
53       if len(col) > nb_l : nb_l = len(col)
54     self.nb_lignes = nb_l
55     self.nb_colonnes = len(self.colonnes)
56     # initialisation des coordonnées dans le canvas
57     self.x0 = self.incr
58     self.y0 = self.incr
59     self.x = self.x0 + self.incr
60     self.y = self.y0 + self.incr
61
62   def affiche(self):    
63     self.scrolledcanvas=Pmw.ScrolledCanvas(self.parent,
64                                            hull_width=1.,
65                                            hull_height=1.,
66                                            borderframe=1)
67     Pmw.Color.changecolor(self.scrolledcanvas.component('canvas'),background='gray95')
68     self.scrolledcanvas.pack(padx=10,pady=10,expand=1, fill="both")
69     self.canvas = self.scrolledcanvas.component('canvas')
70     self.affiche_colonnes()
71
72   def affiche_colonnes(self):
73     for i in range(self.nb_lignes):
74       self.affiche_ligne(i)
75     self.aligne_colonnes()
76     self.trace_traits()
77     self.scrolledcanvas.resizescrollregion()
78
79   def get_xy_max(self):
80     try:
81       x0,y0,xmax,ymax = self.canvas.bbox(ALL)
82       return xmax,ymax
83     except:
84       return None,None
85     
86   def trace_traits(self):
87     xmax,ymax = self.get_xy_max()
88     if not xmax : return
89     xmax = xmax+self.incr
90     ymax = ymax+self.incr
91     # trace les traits horizontaux
92     for i in range(self.nb_lignes):
93       tag_lig = 'ligne_'+`i`
94       l_id = self.canvas.find_withtag(tag_lig)
95       x0,y0,x1,y1 = self.bbox(l_id)
96       self.canvas.create_line(x0-self.incr,y0-self.incr,xmax,y0-self.incr)
97     self.canvas.create_line(self.x0,ymax,xmax,ymax)  
98     # trace les traits verticaux
99     for j in range(self.nb_colonnes):
100       tag_col = 'colonne_'+`j`
101       l_id = self.canvas.find_withtag(tag_col)
102       x0,y0,x1,y1 = self.bbox(l_id)
103       self.canvas.create_line(x0-self.incr,y0-self.incr,x0-self.incr,ymax)
104     self.canvas.create_line(xmax,self.y0,xmax,ymax)
105     
106   def bbox(self,l_id):
107     x0,y0,x1,y1 = self.canvas.bbox(l_id[0])
108     for id in l_id[1:]:
109       x2,y2,x3,y3 = self.canvas.bbox(id)
110       x0 = min(x2,x0)
111       y0 = min(y2,y0)
112       x1 = max(x3,x1)
113       y1 = max(y3,y1)
114     return x0,y0,x1,y1
115   
116   def affiche_ligne(self,num_lig):
117     tag_lig = 'ligne_'+`num_lig`
118     num_col = 0
119     for col in self.colonnes:
120       tag_col = 'colonne_'+`num_col`
121       x = 100*num_col+self.x
122       id = self.canvas.create_text(x,self.y,
123                                    text = justify_text(col[num_lig],cesure=60),
124                                    tag=(tag_lig,tag_col),
125                                    anchor='nw',
126                                    font = fontes.canvas)
127       x0,y0,x1,y1 = self.canvas.bbox(id)
128       num_col = num_col+1
129     l_id = self.canvas.find_withtag(tag_lig)
130     x0,y0,x1,y1 = self.bbox(l_id)
131     self.y = y1 + 2*self.incr
132
133   def aligne_colonnes(self):
134     num_col = 0
135     for col in self.colonnes:
136       tag_col = 'colonne_'+`num_col`
137       l_id = self.canvas.find_withtag(tag_col)
138       if not l_id : continue
139       x0,y0,x1,y1 = self.bbox(l_id)
140       self.move(x1+self.incr,self.colonnes[num_col+1:],num_col+1)
141       num_col = num_col+1
142
143   def move(self,x,colonnes,num):
144     num_col = num
145     for col in colonnes:
146       tag_col = 'colonne_'+`num_col`
147       l_id = self.canvas.find_withtag(tag_col)
148       if not l_id : continue
149       x0,y0,x1,y1 = self.canvas.bbox(l_id[0])
150       self.canvas.move(tag_col,x+self.incr-x0,0)
151       num_col = num_col+1
152     
153 class CATAPanel(Frame) :
154   """ Classe servant à créer le panneau représentant l'objet sélectionné dans l'arbre"""
155   def __init__(self,parent,panneau,node) :
156     self.parent=parent
157     self.panneau = panneau
158     self.node=node
159     Frame.__init__(self,self.panneau)
160     self.place(x=0,y=0,relheight=1,relwidth=1)
161     self.init()
162
163   def init(self):
164     # création du label initial
165     label = Label(self,
166                   text = 'Attributs de '+self.node.item.labeltext,
167                   font = fontes.standard_gras_souligne)
168     label.pack(side='top',pady=10)
169     # création des listes correspondant aux colonnes du tableau à afficher
170     colonne1,colonne2 = self.get_listes()
171     # affichage du tableau
172     self.tableau = Tableau(self,(colonne1,colonne2))
173     self.tableau.affiche()
174
175   def get_listes(self):    
176     self.node.item.get_dico_attributs()
177     l_cles_attributs = self.node.item.d_attributs.keys()
178     l_cles_attributs.sort()
179     ind=0
180     liste1 = []
181     liste2=[]
182     for nom_attr in l_cles_attributs :
183       valeur = self.node.item.d_attributs[nom_attr]
184       if type(valeur) == types.TupleType:
185         texte =''
186         for elem in valeur:
187           if type(elem) == types.ClassType:
188             texte = texte + elem.__name__
189           else:
190             texte = texte + str(elem)
191       elif type(valeur) == types.ClassType :
192         texte = valeur.__name__
193       else:
194         texte = str(valeur)
195       liste1.append(nom_attr)
196       liste2.append(texte)
197     return liste1,liste2
198
199 class CATAItem(TreeItem):
200   panel = CATAPanel
201   def __init__(self,appli,labeltext,object,setfunction=None,objet_cata_ordonne = None):
202     self.appli = appli
203     self.labeltext = labeltext
204     self.object=object
205     self.setfunction = setfunction
206     self.objet_cata_ordonne = objet_cata_ordonne
207
208   def get_dico_fils(self):
209     d_fils = {}
210     if type(self.object) != types.TupleType:
211       for e in dir(self.object):
212         cmd = getattr(self.object,e)
213         if isCMD(cmd) :
214           d_fils[string.strip(cmd.nom)] = cmd
215     else:
216       for obj in self.object :
217         for e in dir(obj):
218           cmd = getattr(obj,e)
219           if isCMD(cmd) :
220             d_fils[string.strip(cmd.nom)] = cmd
221     self.d_fils = d_fils
222
223   def get_dico_attributs(self):
224     d_attributs ={}
225     if type(self.object) == types.TupleType :
226       self.d_attributs = d_attributs
227       return
228     l_noms_attributs = ['nom','op','sd_prod','reentrant','repetable','fr','docu','into','valide_vide','actif',
229                         'regles','op_init','niveau','definition','code','niveaux','statut',
230                         'defaut','min','max','homo','position','val_min','val_max','condition']
231     for nom_attribut in l_noms_attributs :
232       if hasattr(self.object,nom_attribut):
233         attr = getattr(self.object,nom_attribut)
234         d_attributs[nom_attribut] = attr
235     self.d_attributs = d_attributs
236
237   def get_liste_mc_ordonnee(self):
238     """ Retourne la liste ordonnée (suivant le catalogue) brute des fils
239     de l'entite courante """
240     if hasattr(self.objet_cata_ordonne,'ordre_mc'):
241       return self.objet_cata_ordonne.ordre_mc
242     else :
243       l=self.objet_cata_ordonne.keys()
244       l.sort()
245       return l
246       
247   def GetLabelText(self):
248     return self.labeltext,None,None
249
250   def get_fr(self):
251     return ''
252   
253   def isMCList(self):
254     return 0
255   
256   def GetSubList(self):
257     sublist=[]
258     if not hasattr(self,'d_fils'):
259       self.get_dico_fils()
260     # on classe les fils dans l'odre du catalogue ...
261     l_cles_fils = self.get_liste_mc_ordonnee()
262     for k in l_cles_fils :
263       if type(self.objet_cata_ordonne) == types.InstanceType :
264         objet_cata = self.objet_cata_ordonne.entites[k]
265       else :
266         objet_cata = self.objet_cata_ordonne.get(k,None)
267       item = make_objecttreeitem(self.appli,k + " : ",self.d_fils[k],
268                                  objet_cata_ordonne = objet_cata)
269       sublist.append(item)
270     return sublist
271
272   def GetIconName(self):
273     return 'ast-green-square'
274
275   def isactif(self):
276     return 1
277   
278 class CMDItem(CATAItem):
279
280   def get_dico_fils(self):
281     self.d_fils = self.object.entites
282
283 class SIMPItem(CATAItem):
284   d_fils={}
285   d_attributs={}
286
287   def GetIconName(self):
288     return 'ast-green-ball'
289
290   def IsExpandable(self):
291     return 0
292   
293 class FACTItem(CMDItem):
294   def GetIconName(self):
295     return 'ast-green-los'
296
297 class BLOCItem(FACTItem): pass
298
299 class ATTRIBUTItem(SIMPItem):
300   def get_dico_attributs(self):
301     self.d_attributs = {}
302
303   def GetSubList(self):
304     return []
305
306   def IsExpandable(self):
307     return 0
308
309   def GetText(self):
310     return self.object
311
312   def GetIconName(self):
313     return 'aucune'  
314
315 class CataBrowser:
316   def __init__(self,parent,appli,cata,item = None):
317     self.parent = parent
318     self.cata = cata
319     self.appli = appli
320     self.item = item
321     self.init()
322
323   def close(self):
324     self.top.destroy()
325
326   def init(self):
327     self.nodes={}
328     self.top = Pmw.Dialog(self.parent,
329                           title = "Visualisation d'un catalogue",
330                           buttons=('OK',),
331                           command = self.quit)
332     self.pane = Pmw.PanedWidget(self.top.component('dialogchildsite'),
333                                 hull_width = 800,
334                                 hull_height = 500,
335                                 orient = 'horizontal')
336     self.pane.add('canvas',min = 0.4, max = 0.6, size = 0.5)
337     self.pane.add('panel',min = 0.4, max = 0.6, size = 0.5)
338     self.pane.pack(expand =1, fill = 'both')
339     self.scrolledcanvas = Pmw.ScrolledCanvas(self.pane.pane('canvas'),
340                                              hull_width=1.,
341                                              hull_height=1.,
342                                              borderframe=1)
343     Pmw.Color.changecolor(self.scrolledcanvas.component('canvas'),background='gray95')
344     self.scrolledcanvas.pack(padx=10,pady=10,expand=1, fill="both")
345     if self.item == None :
346       self.item = CATAItem(self.appli,"Catalogue",self.cata)
347     self.tree = Tree(self.appli,self.item,self.scrolledcanvas,command = self.select_node)
348     self.tree.draw()
349     self.node = self.tree.node_selected
350
351   def select_node(self,node):
352     self.nodes[node]=self.create_panel(node)
353
354   def create_panel(self,node):
355     if hasattr(node.item,"panel"):
356       return getattr(node.item,"panel")(self,self.pane.pane('panel'),node)
357       
358   def quit(self,nom_bouton) :
359     self.top.destroy()
360     
361   def settitle(self):
362     self.top.wm_title("Browser de catalogue " )
363     self.top.wm_iconname("CataBrowser")
364
365  
366 dispatch = {
367     OPER  : CMDItem,
368     PROC  : CMDItem,
369     MACRO  : CMDItem,
370     SIMP : SIMPItem,
371     FACT : FACTItem,
372     BLOC : BLOCItem,
373 }
374
375 def TYPE(o):
376   if isinstance(o,OPER):return OPER
377   elif isinstance(o,PROC):return PROC
378   elif isinstance(o,MACRO):return MACRO
379   elif isinstance(o,FORM):return MACRO
380   elif isinstance(o,SIMP):return SIMP
381   elif isinstance(o,FACT):return FACT
382   elif isinstance(o,BLOC):return BLOC
383   else:return type(o)
384
385 def make_objecttreeitem(appli,labeltext, object, setfunction=None,objet_cata_ordonne=None):
386     t = TYPE(object)
387     if dispatch.has_key(t):
388       c = dispatch[t]
389     else:
390       #print 'on a un objet de type :',t,'  ',object
391       c = ATTRIBUTItem
392     return c(appli,labeltext, object, setfunction = setfunction,objet_cata_ordonne=objet_cata_ordonne)
393
394 def isCMD(cmd):
395    return isinstance(cmd,OPER) or isinstance(cmd,PROC) or isinstance(cmd,MACRO) or isinstance(cmd,FORM)
396
397
398