Salome HOME
chgt date copyright
[tools/eficas.git] / InterfaceQT4 / compooper.py
1 #-*- coding: iso-8859-1 -*-
2 # Copyright (C) 2007-2017   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 from __future__ import absolute_import
21 try :
22    from builtins import str
23 except : pass
24
25 import os
26 import tempfile
27 from PyQt5.QtWidgets import QMessageBox, QAction, QApplication
28 from PyQt5.QtGui  import QCursor
29 from PyQt5.QtCore import Qt
30
31 from Extensions.i18n import tr
32 from Extensions.eficas_exception import EficasException
33
34 from Editeur     import Objecttreeitem
35 from . import browser
36 from . 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            self.Graphe.triggered.connect(self.viewPng)
84            self.Graphe.setStatusTip(tr("affiche la distribution "))
85            self.menu.addAction(self.Graphe)
86            if self.item.isvalid() :
87               self.Graphe.setEnabled(1)
88            else:
89               self.Graphe.setEnabled(0)
90
91     def view3D(self) :
92         from Editeur import TroisDPal
93         troisD=TroisDPal.TroisDPilote(self.item,self.editor.appliEficas)
94         troisD.envoievisu()
95
96     def viewPng(self) :
97         from monPixmap import MonLabelPixmap
98         import generator
99         try:
100             QApplication.setOverrideCursor(QCursor(Qt.WaitCursor))
101             g = generator.plugins[self.appliEficas.format_fichier]()
102             g.gener(self.item.object, format='beautifie')
103             stdGener = g.getGenerateur()
104             loi = list(g.dictMCLois.keys())[0]
105             nomLoi = loi.get_name()
106             (fd, fichier) = tempfile.mkstemp(prefix = "openturns_graph_", suffix = ".png")
107             os.close(fd)
108             chemin = os.path.dirname(fichier)
109             base = os.path.splitext(os.path.basename(fichier))[0]
110             script = stdGener.GraphiquePDF(loi, chemin, base)
111             #print script
112             d = {}
113             exec(script, d)
114             widgetPng=MonLabelPixmap(self.appliEficas,fichier,nomLoi)
115             os.remove(fichier)
116             QApplication.restoreOverrideCursor()
117             widgetPng.show()
118         except:
119             QApplication.restoreOverrideCursor()
120             QMessageBox.warning(
121                 self.appliEficas,
122                 tr("Erreur interne"),
123                 tr("La PDF de la loi ne peut pas etre affichee."),
124                 tr("&Annuler"))
125
126 class EtapeTreeItem(Objecttreeitem.ObjectTreeItem):
127   """ La classe EtapeTreeItem est un adaptateur des objets ETAPE du noyau
128       Accas. Elle leur permet d'etre affichés comme des noeuds
129       d'un arbre graphique.
130       Cette classe a entre autres deux attributs importants :
131         - _object qui est un pointeur vers l'objet du noyau
132         - object qui pointe vers l'objet auquel sont délégués les
133           appels de méthode et les acces aux attributs
134       Dans le cas d'une ETAPE, _object et object pointent vers le 
135       meme objet.
136   """
137   itemNode=Node
138   
139   def IsExpandable(self):
140       return 1
141
142   def GetIconName(self):
143       """
144       Retourne le nom de l'icone a afficher dans l'arbre
145       Ce nom depend de la validite de l'objet
146       """
147       if not self.object.isactif():
148          return "ast-white-square"
149       elif self.object.isvalid():
150          return "ast-green-square"
151       else:
152          valid=self.valid_child()
153          valid=valid * self.valid_regles("non")
154          if self.reste_val != {}:
155             valid=0
156          if valid==0  :
157             return "ast-red-square"
158          else :
159             try :
160             # on traite ici le cas d include materiau
161             #  print self.object.definition.nom 
162               if  self.object.fichier_ini != self.object.nom_mater :
163                   return "ast-red-square"
164             except :
165               pass
166             return "ast-yellow-square"
167
168   def GetLabelText(self):
169       """ Retourne 3 valeurs :
170       - le texte a afficher dans le noeud représentant l'item
171       - la fonte dans laquelle afficher ce texte
172       - la couleur du texte
173       """
174       return self.labeltext,None,None
175       #if self.object.isactif():
176         # None --> fonte et couleur par défaut
177       #  return self.labeltext,None,None
178       #else:
179       #  return self.labeltext, None, None #CS_pbruno todo
180       
181   def get_objet(self,name) :
182       for v in self.object.mc_liste:
183           if v.nom == name : return v
184       return None
185       
186   def get_type_sd_prod(self):
187       """
188          Retourne le nom du type du concept résultat de l'étape
189       """
190       sd_prod=self.object.get_type_produit()
191       if sd_prod:
192          return sd_prod.__name__
193       else:
194          return ""
195
196   def additem(self,name,pos):      
197       mcent = self._object.addentite(name,pos)
198       return mcent
199       
200
201   def suppitem(self,item) :
202       # item : item du MOCLE de l'ETAPE a supprimer
203       # item.getObject() = MCSIMP, MCFACT, MCBLOC ou MCList 
204       itemobject=item.getObject()
205       if itemobject.isoblig() :
206           #self.editor.affiche_infos(tr('Impossible de supprimer un mot-clef obligatoire '),Qt.red)
207           return (0,tr('Impossible de supprimer un mot-clef obligatoire '))
208       if self.object.suppentite(itemobject):
209           message = tr("Mot-clef %s supprime " , itemobject.nom)
210           #self.editor.affiche_commentaire(message)
211           return (1,message)
212       else :
213           #self.editor.affiche_commentaire(tr('Pb interne : impossible de supprimer ce mot-clef'),Qt.red)
214           return (0,tr('Pb interne : impossible de supprimer ce mot-clef'))
215
216   def GetText(self):
217       try:
218           return self.object.get_sdname()
219       except:
220           return ''
221
222   # PNPN ????
223   #def keys(self):
224   #    keys=self.object.mc_dict
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 oldnom in self.appli.dict_reels ):
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,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 = texte_commande.split('\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