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