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.
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.
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.
20 # ======================================================================
28 class OPERPanel(panels.OngletPanel):
31 nb = Pmw.NoteBook(self,raisecommand=self.raisecmd)
32 nb.pack(fill = 'both', expand = 1)
34 nb.add('Mocles', tab_text='Nouveau mot-clé')
35 nb.add('Concept', tab_text='Nommer concept')
36 nb.add('Commande', tab_text='Nouvelle Commande')
37 nb.add('Commentaire',tab_text='Paramètre/Commentaire')
38 panneau=Pmw.PanedWidget(nb.page("Mocles"),
40 panneau.add('left',min=0.4,max=0.6,size=0.5)
41 panneau.add('right',min=0.4,max=0.6,size=0.5)
42 panneau.pack(expand=1,fill='both')
43 self.makeCommandePage(nb.page("Commande"))
44 self.makeConceptPage_oper(nb.page("Concept"))
45 self.makeMoclesPage(panneau.pane('left'))
46 self.makeReglesPage(panneau.pane('right'))
47 #self.makeCommentairePage(nb.page("Commentaire"))
48 self.makeParamCommentPage_for_etape(nb.page("Commentaire"))
49 nb.tab('Mocles').focus_set()
53 def makeConceptPage_oper(self,page):
54 """ Crée la page de saisie du nom du concept """
55 if self.node.item.is_reentrant():
56 # commande obligatoirement reentrante
57 self.makeConceptPage_reentrant(page)
59 # commande non reentrante ou facultativement reentrante
60 self.makeConceptPage(page)
62 def makeConceptPage_reentrant(self,page):
63 """ Crée la page de saisie du nom de concept pour un opérateur reentrant
64 cad propose dans la liste des SD utilisées dans la commande celle(s) dont le
65 type est compatible avec celui que retourne l'opérateur """
66 liste_noms_sd = self.node.item.get_noms_sd_oper_reentrant()
67 self.listbox = Pmw.ScrolledListBox(page,
70 label_text="Structure(s) de données à enrichir par l'opérateur courant :",
72 selectioncommand=self.select_valeur_from_list,
73 dblclickcommand=lambda s=self,c=self.execConcept : s.choose_valeur_from_list(c))
74 self.listbox.place(relx=0.5,rely=0.3,relheight=0.4,anchor='center')
75 Label(page,text='Structure de donnée choisie :').place(relx=0.05,rely=0.6)
76 self.valeur_choisie = StringVar()
77 self.label_valeur = Label(page,textvariable=self.valeur_choisie)
78 self.label_valeur.place(relx=0.45,rely=0.6)
79 if len(liste_noms_sd) == 1 :
80 self.valeur_choisie.set(liste_noms_sd[0])
82 def select_valeur_from_list(self):
84 choix = self.listbox.getcurselection()[0]
85 self.valeur_choisie.set(choix)
90 def choose_valeur_from_list(self,command):
92 choix = self.listbox.getcurselection()[0]
93 self.valeur_choisie.set(choix)
99 class Node(treewidget.Node):
100 def doPaste(self,node_selected):
102 Déclenche la copie de l'objet item avec pour cible
103 l'objet passé en argument : node_selected
105 objet_a_copier = self.item.get_copie_objet()
106 child=node_selected.doPaste_Commande(objet_a_copier)
109 def doPaste_Commande(self,objet_a_copier):
111 Réalise la copie de l'objet passé en argument qui est nécessairement
115 #child = parent.item.append_child(objet_a_copier,self.item.getObject())
116 child = self.append_brother(objet_a_copier,retour='oui')
117 #if child is None:return 0
120 def doPaste_MCF(self,objet_a_copier):
122 Réalise la copie de l'objet passé en argument (objet_a_copier)
123 Il s'agit forcément d'un mot clé facteur
125 child = self.append_child(objet_a_copier,pos='first',retour='oui')
129 class EtapeTreeItem(Objecttreeitem.ObjectTreeItem):
130 """ La classe EtapeTreeItem est un adaptateur des objets ETAPE du noyau
131 Accas. Elle leur permet d'etre affichés comme des noeuds
132 d'un arbre graphique.
133 Cette classe a entre autres deux attributs importants :
134 - _object qui est un pointeur vers l'objet du noyau
135 - object qui pointe vers l'objet auquel sont délégués les
136 appels de méthode et les accès aux attributs
137 Dans le cas d'une ETAPE, _object et object pointent vers le
143 def IsExpandable(self):
146 def GetIconName(self):
148 Retourne le nom de l'icône à afficher dans l'arbre
149 Ce nom dépend de la validité de l'objet
151 if not self.object.isactif():
152 return "ast-white-square"
153 elif self.object.isvalid():
154 return "ast-green-square"
156 return "ast-red-square"
158 def GetLabelText(self):
159 """ Retourne 3 valeurs :
160 - le texte à afficher dans le noeud représentant l'item
161 - la fonte dans laquelle afficher ce texte
162 - la couleur du texte
164 if self.object.isactif():
165 # None --> fonte et couleur par défaut
166 return self.labeltext,None,None
168 return self.labeltext,fontes.standard_italique,None
170 def get_objet(self,name) :
171 for v in self.object.mc_liste:
172 if v.nom == name : return v
175 def get_type_sd_prod(self):
177 Retourne le nom du type du concept résultat de l'étape
179 sd_prod=self.object.get_type_produit()
181 return sd_prod.__name__
185 def additem(self,name,pos):
186 #print "compooper.additem",name,pos
187 mcent = self._object.addentite(name,pos)
190 def suppitem(self,item) :
191 # item : item du MOCLE de l'ETAPE à supprimer
192 # item.getObject() = MCSIMP, MCFACT, MCBLOC ou MCList
193 itemobject=item.getObject()
194 if itemobject.isoblig() :
195 self.appli.affiche_infos('Impossible de supprimer un mot-clé obligatoire ')
197 if self.object.suppentite(itemobject):
198 message = "Mot-clé " + itemobject.nom + " supprimé"
199 self.appli.affiche_infos(message)
202 self.appli.affiche_infos('Pb interne : impossible de supprimer ce mot-clé')
207 return self.object.get_sdname()
212 keys=self.object.mc_dict.keys()
215 def GetSubList(self):
217 Reactualise la liste des items fils stockes dans self.sublist
220 liste=self.object.mc_liste
224 sublist=[None]*len(liste)
225 # suppression des items lies aux objets disparus
226 for item in self.sublist:
227 old_obj=item.getObject()
229 pos=liste.index(old_obj)
232 pass # objets supprimes ignores
234 # ajout des items lies aux nouveaux objets
237 if sublist[pos] is None:
238 # nouvel objet : on cree un nouvel item
239 def setfunction(value, object=obj):
241 item = self.make_objecttreeitem(self.appli, obj.nom + " : ", obj, setfunction)
248 def GetSubList_BAK(self):
250 liste=self.object.mc_liste
255 isublist=iter(self.sublist)
260 for item in isublist:
261 old_obj=item.getObject()
262 if old_obj in liste:break
265 if obj is old_obj:break
266 # nouvel objet : on cree un nouvel item
267 def setfunction(value, object=obj):
269 it = self.make_objecttreeitem(self.appli, obj.nom + " : ", obj, setfunction)
272 if old_obj is None and obj is None:break
280 return self.object.isvalid()
282 def iscopiable(self):
284 Retourne 1 si l'objet est copiable, 0 sinon
288 def update(self,item):
289 if item.sd and item.sd.nom:
290 self.nomme_sd(item.sd.nom)
292 def nomme_sd(self,nom):
293 """ Lance la méthode de nommage de la SD """
294 test,mess= self.object.nomme_sd(nom)
295 if test:self.object.parent.reset_context()
298 def is_reentrant(self):
299 return self.object.is_reentrant()
301 def get_noms_sd_oper_reentrant(self):
302 return self.object.get_noms_sd_oper_reentrant()
304 def get_objet_commentarise(self):
306 Cette méthode retourne un objet commentarisé
307 représentatif de self.object
309 import generator,string,Accas
310 # Format de fichier utilisé
311 format=self.appli.format_fichier.get()
312 g=generator.plugins[format]()
313 texte_commande = g.gener(self.object,format='beautifie')
314 # Il faut enlever la première ligne vide de texte_commande que
315 # rajoute le generator
316 rebut,texte_commande = string.split(texte_commande,'\n',1)
317 # on construit l'objet COMMANDE_COMM repésentatif de self mais non
318 # enregistré dans le jdc
319 commande_comment = Accas.COMMANDE_COMM(texte=texte_commande,reg='non',
320 parent=self.object.parent)
321 commande_comment.niveau = self.object.niveau
322 commande_comment.jdc = commande_comment.parent = self.object.jdc
324 pos=self.object.parent.etapes.index(self.object)
325 self.object.parent.suppentite(self.object)
326 self.object.parent.addentite(commande_comment,pos)
328 return commande_comment
330 def additem_BAK(self,name,pos):
331 mcent=self.addentite(name,pos)
335 # on ne peut ajouter l'élément de nom name
337 def setfunction(value, object=mcent):
339 item = self.make_objecttreeitem(self.appli,mcent.nom + " : ", mcent, setfunction)
342 def GetSubList_BAK(self):
344 for obj in self.object.mc_liste:
345 def setfunction(value, object=obj):
347 item = self.make_objecttreeitem(self.appli, obj.nom + " : ", obj, setfunction)
351 def verif_condition_bloc_BAK(self):
352 return self.object.verif_condition_bloc()
354 def replace_child(self,old_item,new_item):
356 Remplace old_item.getObject() par new_item.getObject() dans
357 les fils de self.object
360 old_itemobject=old_item.getObject()
361 index = self.object.mc_liste.index(old_itemobject)
362 self.object.init_modif()
363 self.object.mc_liste.remove(old_itemobject)
364 self.object.mc_liste.insert(index,new_item.getObject())
365 self.object.fin_modif()
368 treeitem = EtapeTreeItem