Salome HOME
nettoyage des GetPanel et affichage pler deplier selon l ancien etat
[tools/eficas.git] / InterfaceQT4 / compooper.py
1 #-*- coding: iso-8859-1 -*-
2 # Copyright (C) 2007-2013   EDF R&D
3 #
4 # This library is free software; you can redistribute it and/or
5 # modify it under the terms of the GNU Lesser General Public
6 # License as published by the Free Software Foundation; either
7 # version 2.1 of the License.
8 #
9 # This library is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12 # Lesser General Public License for more details.
13 #
14 # You should have received a copy of the GNU Lesser General Public
15 # License along with this library; if not, write to the Free Software
16 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
17 #
18 # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
19 #
20 import os
21 import tempfile
22 from PyQt4.QtGui import QMessageBox, QAction, QApplication, QCursor
23 from PyQt4.QtGui import *
24 from PyQt4.QtCore import Qt, SIGNAL, QVariant
25 from Extensions.i18n import tr
26 from Extensions.eficas_exception import EficasException
27
28 from Editeur     import Objecttreeitem
29 import browser
30 import typeNode
31
32 class Node(browser.JDCNode, typeNode.PopUpMenuNode):
33
34     def __init__(self,treeParent, item):
35         browser.JDCNode.__init__( self, treeParent, item)
36
37     def select(self):
38         browser.JDCNode.select(self)
39         #self.treeParent.tree.openPersistentEditor(self,1)
40         #self.monWidgetNom=self.treeParent.tree.itemWidget(self,1)
41         #self.treeParent.tree.connect(self.monWidgetNom,SIGNAL("returnPressed()"), self.nomme)
42         #if self.item.GetIconName() == "ast-red-square" : self.monWidgetNom.setDisabled(True)
43         #else : self.monWidgetNom.setFocus()  ;self.monWidgetNom.setDisabled(False)
44
45     def nomme(self):
46         nom=str(self.monWidgetNom.text())
47         self.editor.init_modif()
48         test,mess = self.item.nomme_sd(nom)
49         if (test== 0):
50            self.editor.affiche_infos(mess,Qt.red)
51            old=self.item.GetText()
52            self.monWidgetNom.setText(old)
53         else :
54            self.editor.affiche_commentaire(tr("Nommage du concept effectue"))
55            self.onValid()
56            try :
57                self.editor.panel.LENomConcept.setText(nom)
58            except :
59                pass
60
61
62     def getPanel(self):
63         from monWidgetCommande import MonWidgetCommande
64         return MonWidgetCommande(self,self.editor,self.item.object)
65
66     def createPopUpMenu(self):
67         typeNode.PopUpMenuNode.createPopUpMenu(self)
68         if ("AFFE_CARA_ELEM" in self.item.get_genealogie()) and self.editor.salome: 
69            self.ViewElt = QAction(tr('View3D'),self.tree)
70            self.tree.connect(self.ViewElt,SIGNAL("triggered()"),self.view3D)
71            self.ViewElt.setStatusTip(tr("affiche dans Geom les elements de structure"))
72            self.menu.addAction(self.ViewElt)
73            if self.item.isvalid() :
74               self.ViewElt.setEnabled(1)
75            else:
76               self.ViewElt.setEnabled(0)
77         if  self.item.get_nom() == "DISTRIBUTION" :
78            self.Graphe = QAction(tr('Graphique'),self.tree)
79            self.tree.connect(self.Graphe,SIGNAL("triggered()"),self.viewPng)
80            self.Graphe.setStatusTip(tr("affiche la distribution "))
81            self.menu.addAction(self.Graphe)
82            if self.item.isvalid() :
83               self.Graphe.setEnabled(1)
84            else:
85               self.Graphe.setEnabled(0)
86
87     def view3D(self) :
88         from Editeur import TroisDPal
89         troisD=TroisDPal.TroisDPilote(self.item,self.editor.appliEficas)
90         troisD.envoievisu()
91
92     def viewPng(self) :
93         from monPixmap import MonLabelPixmap
94         import generator
95         try:
96             QApplication.setOverrideCursor(QCursor(Qt.WaitCursor))
97             g = generator.plugins[self.appliEficas.format_fichier]()
98             g.gener(self.item.object, format='beautifie')
99             stdGener = g.getGenerateur()
100             loi = g.dictMCLois.keys()[0]
101             nomLoi = loi.get_name()
102             (fd, fichier) = tempfile.mkstemp(prefix = "openturns_graph_", suffix = ".png")
103             os.close(fd)
104             chemin = os.path.dirname(fichier)
105             base = os.path.splitext(os.path.basename(fichier))[0]
106             script = stdGener.GraphiquePDF(loi, chemin, base)
107             #print script
108             d = {}
109             exec script in d
110             widgetPng=MonLabelPixmap(self.appliEficas,fichier,nomLoi)
111             os.remove(fichier)
112             QApplication.restoreOverrideCursor()
113             widgetPng.show()
114         except:
115             QApplication.restoreOverrideCursor()
116             QMessageBox.warning(
117                 self.appliEficas,
118                 tr("Erreur interne"),
119                 tr("La PDF de la loi ne peut pas etre affichee."),
120                 tr("&Annuler"))
121
122 class EtapeTreeItem(Objecttreeitem.ObjectTreeItem):
123   """ La classe EtapeTreeItem est un adaptateur des objets ETAPE du noyau
124       Accas. Elle leur permet d'etre affichés comme des noeuds
125       d'un arbre graphique.
126       Cette classe a entre autres deux attributs importants :
127         - _object qui est un pointeur vers l'objet du noyau
128         - object qui pointe vers l'objet auquel sont délégués les
129           appels de méthode et les acces aux attributs
130       Dans le cas d'une ETAPE, _object et object pointent vers le 
131       meme objet.
132   """
133   itemNode=Node
134   
135   def IsExpandable(self):
136       return 1
137
138   def GetIconName(self):
139       """
140       Retourne le nom de l'icone a afficher dans l'arbre
141       Ce nom depend de la validite de l'objet
142       """
143       if not self.object.isactif():
144          return "ast-white-square"
145       elif self.object.isvalid():
146          return "ast-green-square"
147       else:
148          valid=self.valid_child()
149          valid=valid * self.valid_regles("non")
150          if self.reste_val != {}:
151             valid=0
152          if valid==0  :
153             return "ast-red-square"
154          else :
155             try :
156             # on traite ici le cas d include materiau
157             #  print self.object.definition.nom 
158               if  self.object.fichier_ini != self.object.nom_mater :
159                   return "ast-red-square"
160             except :
161               pass
162             return "ast-yellow-square"
163
164   def GetLabelText(self):
165       """ Retourne 3 valeurs :
166       - le texte a afficher dans le noeud représentant l'item
167       - la fonte dans laquelle afficher ce texte
168       - la couleur du texte
169       """
170       return self.labeltext,None,None
171       #if self.object.isactif():
172         # None --> fonte et couleur par défaut
173       #  return self.labeltext,None,None
174       #else:
175       #  return self.labeltext, None, None #CS_pbruno todo
176       
177   def get_objet(self,name) :
178       for v in self.object.mc_liste:
179           if v.nom == name : return v
180       return None
181       
182   def get_type_sd_prod(self):
183       """
184          Retourne le nom du type du concept résultat de l'étape
185       """
186       sd_prod=self.object.get_type_produit()
187       if sd_prod:
188          return sd_prod.__name__
189       else:
190          return ""
191
192   def additem(self,name,pos):      
193       mcent = self._object.addentite(name,pos)
194       return mcent
195       
196
197   def suppitem(self,item) :
198       # item : item du MOCLE de l'ETAPE a supprimer
199       # item.getObject() = MCSIMP, MCFACT, MCBLOC ou MCList 
200       itemobject=item.getObject()
201       if itemobject.isoblig() :
202           #self.editor.affiche_infos(tr('Impossible de supprimer un mot-clef obligatoire '),Qt.red)
203           return (0,tr('Impossible de supprimer un mot-clef obligatoire '))
204       if self.object.suppentite(itemobject):
205           message = tr("Mot-clef %s supprime " , itemobject.nom)
206           #self.editor.affiche_commentaire(message)
207           return (1,message)
208       else :
209           #self.editor.affiche_commentaire(tr('Pb interne : impossible de supprimer ce mot-clef'),Qt.red)
210           return (0,tr('Pb interne : impossible de supprimer ce mot-clef'))
211
212   def GetText(self):
213       try:
214           return self.object.get_sdname()
215       except:
216           return ''
217
218   def keys(self):
219       keys=self.object.mc_dict.keys()
220       return keys
221
222   def GetSubList(self):
223       """
224          Reactualise la liste des items fils stockes dans self.sublist
225       """
226       if self.isactif():
227          liste=self.object.mc_liste
228       else:
229          liste=[]
230
231       sublist=[None]*len(liste)
232       # suppression des items lies aux objets disparus
233       for item in self.sublist:
234          old_obj=item.getObject()
235          if old_obj in liste:
236             pos=liste.index(old_obj)
237             sublist[pos]=item
238          else:
239             pass # objets supprimes ignores
240
241       # ajout des items lies aux nouveaux objets
242       pos=0
243       for obj in liste:
244          if sublist[pos] is None:
245             # nouvel objet : on cree un nouvel item
246             def setfunction(value, object=obj):
247                 object.setval(value)
248             item = self.make_objecttreeitem(self.appli, obj.nom + " : ", obj, setfunction)
249             sublist[pos]=item
250          pos=pos+1
251
252       self.sublist=sublist
253       return self.sublist
254
255   def isvalid(self):
256       return self.object.isvalid()
257
258   def iscopiable(self):
259       """
260       Retourne 1 si l'objet est copiable, 0 sinon
261       """
262       return 1
263
264   def updateDeplace(self,item):
265       if item.sd and item.sd.nom:
266          self.object.sd=item.sd
267          self.object.sd.nom=item.sd.nom
268
269   def update(self,item):
270       if item.sd and item.sd.nom:
271          self.nomme_sd(item.sd.nom)
272
273   def nomme_sd(self,nom):
274       """ Lance la méthode de nommage de la SD """
275       oldnom=""
276       if self.object.sd != None :
277          oldnom=self.object.sd.nom
278       test,mess= self.object.nomme_sd(nom)
279       if test:self.object.parent.reset_context()
280       if (test and self.appli.dict_reels.has_key(oldnom) ):
281               self.appli.dict_reels[nom]=self.appli.dict_reels[oldnom]
282       return test,mess
283
284   def is_reentrant(self):
285       return self.object.is_reentrant()
286     
287   def get_noms_sd_oper_reentrant(self):
288       return self.object.get_noms_sd_oper_reentrant()
289
290   def get_objet_commentarise(self):
291       """
292           Cette méthode retourne un objet commentarisé
293           représentatif de self.object
294       """
295       # Format de fichier utilisé
296       format=self.appli.appliEficas.format_fichier
297       return self.object.get_objet_commentarise(format)
298
299   def get_objet_commentarise_BAK(self):
300       """
301           Cette méthode retourne un objet commentarisé
302           représentatif de self.object
303       """
304       import generator,string,Accas
305       # Format de fichier utilisé
306       format=self.appli.appliEficas.format_fichier
307       g=generator.plugins[format]()
308       texte_commande = g.gener(self.object,format='beautifie')
309       # Il faut enlever la premiere ligne vide de texte_commande que 
310       # rajoute le generator
311       rebut,texte_commande = string.split(texte_commande,'\n',1)
312       # on construit l'objet COMMANDE_COMM repésentatif de self mais non 
313       # enregistré dans le jdc
314       commande_comment = Accas.COMMANDE_COMM(texte=texte_commande,reg='non',
315                                              parent=self.object.parent)
316       commande_comment.niveau = self.object.niveau
317       commande_comment.jdc = commande_comment.parent = self.object.jdc
318
319       pos=self.object.parent.etapes.index(self.object)
320       parent=self.object.parent
321       self.object.parent.suppentite(self.object)
322       parent.addentite(commande_comment,pos)
323
324       return commande_comment
325
326
327 import Accas
328 treeitem = EtapeTreeItem
329 objet = Accas.ETAPE    
330