Salome HOME
onItem=Deplie
[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
35     def select(self):
36         browser.JDCNode.select(self)
37         #self.treeParent.tree.openPersistentEditor(self,1)
38         #self.monWidgetNom=self.treeParent.tree.itemWidget(self,1)
39         #self.treeParent.tree.connect(self.monWidgetNom,SIGNAL("returnPressed()"), self.nomme)
40         #if self.item.GetIconName() == "ast-red-square" : self.monWidgetNom.setDisabled(True)
41         #else : self.monWidgetNom.setFocus()  ;self.monWidgetNom.setDisabled(False)
42
43     def nomme(self):
44         nom=str(self.monWidgetNom.text())
45         self.editor.init_modif()
46         test,mess = self.item.nomme_sd(nom)
47         if (test== 0):
48            self.editor.affiche_infos(mess,Qt.red)
49            old=self.item.GetText()
50            self.monWidgetNom.setText(old)
51         else :
52            self.editor.affiche_commentaire(tr("Nommage du concept effectue"))
53            self.onValid()
54            try :
55                self.editor.panel.LENomConcept.setText(nom)
56            except :
57                pass
58
59
60     def getPanel(self):
61         from monWidgetCommande import MonWidgetCommande
62         return MonWidgetCommande(self,self.editor,self.item.object)
63
64     def createPopUpMenu(self):
65         typeNode.PopUpMenuNode.createPopUpMenu(self)
66         if ("AFFE_CARA_ELEM" in self.item.get_genealogie()) and self.editor.salome: 
67            self.ViewElt = QAction(tr('View3D'),self.tree)
68            self.tree.connect(self.ViewElt,SIGNAL("triggered()"),self.view3D)
69            self.ViewElt.setStatusTip(tr("affiche dans Geom les elements de structure"))
70            self.menu.addAction(self.ViewElt)
71            if self.item.isvalid() :
72               self.ViewElt.setEnabled(1)
73            else:
74               self.ViewElt.setEnabled(0)
75         if  self.item.get_nom() == "DISTRIBUTION" :
76            self.Graphe = QAction(tr('Graphique'),self.tree)
77            self.tree.connect(self.Graphe,SIGNAL("triggered()"),self.viewPng)
78            self.Graphe.setStatusTip(tr("affiche la distribution "))
79            self.menu.addAction(self.Graphe)
80            if self.item.isvalid() :
81               self.Graphe.setEnabled(1)
82            else:
83               self.Graphe.setEnabled(0)
84
85     def view3D(self) :
86         from Editeur import TroisDPal
87         troisD=TroisDPal.TroisDPilote(self.item,self.editor.appliEficas)
88         troisD.envoievisu()
89
90     def viewPng(self) :
91         from monPixmap import MonLabelPixmap
92         import generator
93         try:
94             QApplication.setOverrideCursor(QCursor(Qt.WaitCursor))
95             g = generator.plugins[self.appliEficas.format_fichier]()
96             g.gener(self.item.object, format='beautifie')
97             stdGener = g.getGenerateur()
98             loi = g.dictMCLois.keys()[0]
99             nomLoi = loi.get_name()
100             (fd, fichier) = tempfile.mkstemp(prefix = "openturns_graph_", suffix = ".png")
101             os.close(fd)
102             chemin = os.path.dirname(fichier)
103             base = os.path.splitext(os.path.basename(fichier))[0]
104             script = stdGener.GraphiquePDF(loi, chemin, base)
105             #print script
106             d = {}
107             exec script in d
108             widgetPng=MonLabelPixmap(self.appliEficas,fichier,nomLoi)
109             os.remove(fichier)
110             QApplication.restoreOverrideCursor()
111             widgetPng.show()
112         except:
113             QApplication.restoreOverrideCursor()
114             QMessageBox.warning(
115                 self.appliEficas,
116                 tr("Erreur interne"),
117                 tr("La PDF de la loi ne peut pas etre affichee."),
118                 tr("&Annuler"))
119
120 class EtapeTreeItem(Objecttreeitem.ObjectTreeItem):
121   """ La classe EtapeTreeItem est un adaptateur des objets ETAPE du noyau
122       Accas. Elle leur permet d'etre affichés comme des noeuds
123       d'un arbre graphique.
124       Cette classe a entre autres deux attributs importants :
125         - _object qui est un pointeur vers l'objet du noyau
126         - object qui pointe vers l'objet auquel sont délégués les
127           appels de méthode et les acces aux attributs
128       Dans le cas d'une ETAPE, _object et object pointent vers le 
129       meme objet.
130   """
131   itemNode=Node
132   
133   def IsExpandable(self):
134       return 1
135
136   def GetIconName(self):
137       """
138       Retourne le nom de l'icone a afficher dans l'arbre
139       Ce nom depend de la validite de l'objet
140       """
141       if not self.object.isactif():
142          return "ast-white-square"
143       elif self.object.isvalid():
144          return "ast-green-square"
145       else:
146          valid=self.valid_child()
147          valid=valid * self.valid_regles("non")
148          if self.reste_val != {}:
149             valid=0
150          if valid==0  :
151             return "ast-red-square"
152          else :
153             try :
154             # on traite ici le cas d include materiau
155             #  print self.object.definition.nom 
156               if  self.object.fichier_ini != self.object.nom_mater :
157                   return "ast-red-square"
158             except :
159               pass
160             return "ast-yellow-square"
161
162   def GetLabelText(self):
163       """ Retourne 3 valeurs :
164       - le texte a afficher dans le noeud représentant l'item
165       - la fonte dans laquelle afficher ce texte
166       - la couleur du texte
167       """
168       return self.labeltext,None,None
169       #if self.object.isactif():
170         # None --> fonte et couleur par défaut
171       #  return self.labeltext,None,None
172       #else:
173       #  return self.labeltext, None, None #CS_pbruno todo
174       
175   def get_objet(self,name) :
176       for v in self.object.mc_liste:
177           if v.nom == name : return v
178       return None
179       
180   def get_type_sd_prod(self):
181       """
182          Retourne le nom du type du concept résultat de l'étape
183       """
184       sd_prod=self.object.get_type_produit()
185       if sd_prod:
186          return sd_prod.__name__
187       else:
188          return ""
189
190   def additem(self,name,pos):      
191       mcent = self._object.addentite(name,pos)
192       return mcent
193       
194
195   def suppitem(self,item) :
196       # item : item du MOCLE de l'ETAPE a supprimer
197       # item.getObject() = MCSIMP, MCFACT, MCBLOC ou MCList 
198       itemobject=item.getObject()
199       if itemobject.isoblig() :
200           #self.editor.affiche_infos(tr('Impossible de supprimer un mot-clef obligatoire '),Qt.red)
201           return (0,tr('Impossible de supprimer un mot-clef obligatoire '))
202       if self.object.suppentite(itemobject):
203           message = tr("Mot-clef %s supprime " , itemobject.nom)
204           #self.editor.affiche_commentaire(message)
205           return (1,message)
206       else :
207           #self.editor.affiche_commentaire(tr('Pb interne : impossible de supprimer ce mot-clef'),Qt.red)
208           return (0,tr('Pb interne : impossible de supprimer ce mot-clef'))
209
210   def GetText(self):
211       try:
212           return self.object.get_sdname()
213       except:
214           return ''
215
216   def keys(self):
217       keys=self.object.mc_dict.keys()
218       return keys
219
220   def GetSubList(self):
221       """
222          Reactualise la liste des items fils stockes dans self.sublist
223       """
224       if self.isactif():
225          liste=self.object.mc_liste
226       else:
227          liste=[]
228
229       sublist=[None]*len(liste)
230       # suppression des items lies aux objets disparus
231       for item in self.sublist:
232          old_obj=item.getObject()
233          if old_obj in liste:
234             pos=liste.index(old_obj)
235             sublist[pos]=item
236          else:
237             pass # objets supprimes ignores
238
239       # ajout des items lies aux nouveaux objets
240       pos=0
241       for obj in liste:
242          if sublist[pos] is None:
243             # nouvel objet : on cree un nouvel item
244             def setfunction(value, object=obj):
245                 object.setval(value)
246             item = self.make_objecttreeitem(self.appli, obj.nom + " : ", obj, setfunction)
247             sublist[pos]=item
248          pos=pos+1
249
250       self.sublist=sublist
251       return self.sublist
252
253   def isvalid(self):
254       return self.object.isvalid()
255
256   def iscopiable(self):
257       """
258       Retourne 1 si l'objet est copiable, 0 sinon
259       """
260       return 1
261
262   def updateDeplace(self,item):
263       if item.sd and item.sd.nom:
264          self.object.sd=item.sd
265          self.object.sd.nom=item.sd.nom
266
267   def update(self,item):
268       if item.sd and item.sd.nom:
269          self.nomme_sd(item.sd.nom)
270
271   def nomme_sd(self,nom):
272       """ Lance la méthode de nommage de la SD """
273       oldnom=""
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]
280       return test,mess
281
282   def is_reentrant(self):
283       return self.object.is_reentrant()
284     
285   def get_noms_sd_oper_reentrant(self):
286       return self.object.get_noms_sd_oper_reentrant()
287
288   def get_objet_commentarise(self):
289       """
290           Cette méthode retourne un objet commentarisé
291           représentatif de self.object
292       """
293       # Format de fichier utilisé
294       format=self.appli.appliEficas.format_fichier
295       return self.object.get_objet_commentarise(format)
296
297   def get_objet_commentarise_BAK(self):
298       """
299           Cette méthode retourne un objet commentarisé
300           représentatif de self.object
301       """
302       import generator,string,Accas
303       # Format de fichier utilisé
304       format=self.appli.appliEficas.format_fichier
305       g=generator.plugins[format]()
306       texte_commande = g.gener(self.object,format='beautifie')
307       # Il faut enlever la premiere 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
316
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)
321
322       return commande_comment
323
324
325 import Accas
326 treeitem = EtapeTreeItem
327 objet = Accas.ETAPE    
328