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 # ======================================================================
24 from Editeur import Objecttreeitem
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.60,size=0.50)
41 panneau.add('right',min=0.4,max=0.60,size=0.50)
42 panneau.pack(expand=1,fill='both')
43 panneau.setnaturalsize()
44 self.makeCommandePage(nb.page("Commande"))
45 self.makeConceptPage_oper(nb.page("Concept"))
46 self.makeMoclesPage(panneau.pane('left'))
47 self.makeReglesPage(panneau.pane('right'))
48 #self.makeCommentairePage(nb.page("Commentaire"))
49 self.makeParamCommentPage_for_etape(nb.page("Commentaire"))
50 nb.tab('Mocles').focus_set()
51 self.nb.setnaturalsize()
56 def makeConceptPage_oper(self,page):
57 """ Crée la page de saisie du nom du concept """
58 if self.node.item.is_reentrant():
59 # commande obligatoirement reentrante
60 self.makeConceptPage_reentrant(page)
62 # commande non reentrante ou facultativement reentrante
63 self.makeConceptPage(page)
65 def makeConceptPage_reentrant(self,page):
66 """ Crée la page de saisie du nom de concept pour un opérateur reentrant
67 cad propose dans la liste des SD utilisées dans la commande celle(s) dont le
68 type est compatible avec celui que retourne l'opérateur """
69 liste_noms_sd = self.node.item.get_noms_sd_oper_reentrant()
70 self.listbox = Pmw.ScrolledListBox(page,
73 label_text="Structure(s) de données à enrichir par l'opérateur courant :",
75 selectioncommand=self.select_valeur_from_list,
76 dblclickcommand=lambda s=self,c=self.execConcept : s.choose_valeur_from_list(c))
77 self.listbox.place(relx=0.5,rely=0.3,relheight=0.4,anchor='center')
78 Label(page,text='Structure de donnée choisie :').place(relx=0.05,rely=0.6)
79 self.valeur_choisie = StringVar()
80 self.label_valeur = Label(page,textvariable=self.valeur_choisie)
81 self.label_valeur.place(relx=0.45,rely=0.6)
82 if len(liste_noms_sd) == 1 :
83 self.valeur_choisie.set(liste_noms_sd[0])
85 def select_valeur_from_list(self):
87 choix = self.listbox.getcurselection()[0]
88 self.valeur_choisie.set(choix)
93 def choose_valeur_from_list(self,command):
95 choix = self.listbox.getcurselection()[0]
96 self.valeur_choisie.set(choix)
102 class Node(treewidget.Node):
103 def doPaste(self,node_selected):
105 Déclenche la copie de l'objet item avec pour cible
106 l'objet passé en argument : node_selected
108 objet_a_copier = self.item.get_copie_objet()
109 child=node_selected.doPaste_Commande(objet_a_copier)
112 def doPaste_Commande(self,objet_a_copier):
114 Réalise la copie de l'objet passé en argument qui est nécessairement
118 #child = parent.item.append_child(objet_a_copier,self.item.getObject())
119 child = self.append_brother(objet_a_copier,retour='oui')
120 #if child is None:return 0
123 def doPaste_MCF(self,objet_a_copier):
125 Réalise la copie de l'objet passé en argument (objet_a_copier)
126 Il s'agit forcément d'un mot clé facteur
128 child = self.append_child(objet_a_copier,pos='first',retour='oui')
132 class EtapeTreeItem(Objecttreeitem.ObjectTreeItem):
133 """ La classe EtapeTreeItem est un adaptateur des objets ETAPE du noyau
134 Accas. Elle leur permet d'etre affichés comme des noeuds
135 d'un arbre graphique.
136 Cette classe a entre autres deux attributs importants :
137 - _object qui est un pointeur vers l'objet du noyau
138 - object qui pointe vers l'objet auquel sont délégués les
139 appels de méthode et les accès aux attributs
140 Dans le cas d'une ETAPE, _object et object pointent vers le
146 def IsExpandable(self):
149 def GetIconName(self):
151 Retourne le nom de l'icône à afficher dans l'arbre
152 Ce nom dépend de la validité de l'objet
154 if not self.object.isactif():
155 return "ast-white-square"
156 elif self.object.isvalid():
157 return "ast-green-square"
159 valid=self.valid_child()
160 valid=valid * self.valid_regles("non")
161 if self.reste_val != {}:
164 return "ast-red-square"
166 return "ast-yellow-square"
168 def GetLabelText(self):
169 """ Retourne 3 valeurs :
170 - le texte à afficher dans le noeud représentant l'item
171 - la fonte dans laquelle afficher ce texte
172 - la couleur du texte
174 if self.object.isactif():
175 # None --> fonte et couleur par défaut
176 return self.labeltext,None,None
178 return self.labeltext,fontes.standard_italique,None
180 def get_objet(self,name) :
181 for v in self.object.mc_liste:
182 if v.nom == name : return v
185 def get_type_sd_prod(self):
187 Retourne le nom du type du concept résultat de l'étape
189 sd_prod=self.object.get_type_produit()
191 return sd_prod.__name__
195 def additem(self,name,pos):
196 #print "compooper.additem",name,pos
197 mcent = self._object.addentite(name,pos)
200 def suppitem(self,item) :
201 # item : item du MOCLE de l'ETAPE à supprimer
202 # item.getObject() = MCSIMP, MCFACT, MCBLOC ou MCList
203 itemobject=item.getObject()
204 if itemobject.isoblig() :
205 self.appli.affiche_infos('Impossible de supprimer un mot-clé obligatoire ')
207 if self.object.suppentite(itemobject):
208 message = "Mot-clef " + itemobject.nom + " supprime"
209 self.appli.affiche_infos(message)
212 self.appli.affiche_infos('Pb interne : impossible de supprimer ce mot-clé')
217 return self.object.get_sdname()
222 keys=self.object.mc_dict.keys()
225 def GetSubList(self):
227 Reactualise la liste des items fils stockes dans self.sublist
230 liste=self.object.mc_liste
234 sublist=[None]*len(liste)
235 # suppression des items lies aux objets disparus
236 for item in self.sublist:
237 old_obj=item.getObject()
239 pos=liste.index(old_obj)
242 pass # objets supprimes ignores
244 # ajout des items lies aux nouveaux objets
247 if sublist[pos] is None:
248 # nouvel objet : on cree un nouvel item
249 def setfunction(value, object=obj):
251 item = self.make_objecttreeitem(self.appli, obj.nom + " : ", obj, setfunction)
259 return self.object.isvalid()
261 def iscopiable(self):
263 Retourne 1 si l'objet est copiable, 0 sinon
267 def update(self,item):
268 if item.sd and item.sd.nom:
269 self.nomme_sd(item.sd.nom)
271 def nomme_sd(self,nom):
272 """ Lance la méthode de nommage de la SD """
274 if self.object.sd != None :
275 oldnom=self.object.sd.nom
276 test,mess= self.object.nomme_sd(nom)
277 if test:self.object.parent.reset_context()
278 if (test and self.appli.dict_reels.has_key(oldnom) ):
279 self.appli.dict_reels[nom]=self.appli.dict_reels[oldnom]
282 def is_reentrant(self):
283 return self.object.is_reentrant()
285 def get_noms_sd_oper_reentrant(self):
286 return self.object.get_noms_sd_oper_reentrant()
288 def get_objet_commentarise(self):
290 Cette méthode retourne un objet commentarisé
291 représentatif de self.object
293 # Format de fichier utilisé
294 format=self.appli.format_fichier.get()
295 return self.object.get_objet_commentarise(format)
297 def get_objet_commentarise_BAK(self):
299 Cette méthode retourne un objet commentarisé
300 représentatif de self.object
302 import generator,string,Accas
303 # Format de fichier utilisé
304 format=self.appli.format_fichier.get()
305 g=generator.plugins[format]()
306 texte_commande = g.gener(self.object,format='beautifie')
307 # Il faut enlever la première ligne vide de texte_commande que
308 # rajoute le generator
309 rebut,texte_commande = string.split(texte_commande,'\n',1)
310 # on construit l'objet COMMANDE_COMM repésentatif de self mais non
311 # enregistré dans le jdc
312 commande_comment = Accas.COMMANDE_COMM(texte=texte_commande,reg='non',
313 parent=self.object.parent)
314 commande_comment.niveau = self.object.niveau
315 commande_comment.jdc = commande_comment.parent = self.object.jdc
317 pos=self.object.parent.etapes.index(self.object)
318 parent=self.object.parent
319 self.object.parent.suppentite(self.object)
320 parent.addentite(commande_comment,pos)
322 return commande_comment
324 def visu_3D(self,appli,node) :
326 troisD=TroisDPal.TroisDPilote(node.item,appli,node.parent)
330 treeitem = EtapeTreeItem