Salome HOME
Modifications liees a MT
[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.initModif()
52         test,mess = self.item.nommeSd(nom)
53         if (test== 0):
54            self.editor.afficheInfos(mess,Qt.red)
55            old=self.item.getText()
56            self.monWidgetNom.setText(old)
57         else :
58            self.editor.afficheCommentaire(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.getGenealogie()) 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.getNom() == "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.getName()
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.validChild()
153          valid=valid * self.validRegles("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.mcListe:
183   #        if v.nom == name : return v
184   #    return None
185       
186  # def getType_sd_prod(self):
187  #     """
188  #        Retourne le nom du type du concept résultat de l'étape
189  #     """
190  #     sd_prod=self.object.getType_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           return (0,tr('Impossible de supprimer un mot-clef obligatoire '))
207       if self.object.suppEntite(itemobject):
208           message = tr("Mot-clef %s supprime " , itemobject.nom)
209           return (1,message)
210       else :
211           return (0,tr('Pb interne : impossible de supprimer ce mot-clef'))
212
213   def getText(self):
214       try:
215           return self.object.getSdname()
216       except:
217           return ''
218
219   # PNPN ????
220   #def keys(self):
221   #    keys=self.object.mc_dict
222   #    return keys
223
224   def getSubList(self):
225       """
226          Reactualise la liste des items fils stockes dans self.sublist
227       """
228       if self.isActif():
229          liste=self.object.mcListe
230       else:
231          liste=[]
232
233       sublist=[None]*len(liste)
234       # suppression des items lies aux objets disparus
235       for item in self.sublist:
236          old_obj=item.getObject()
237          if old_obj in liste:
238             pos=liste.index(old_obj)
239             sublist[pos]=item
240          else:
241             pass # objets supprimes ignores
242
243       # ajout des items lies aux nouveaux objets
244       pos=0
245       for obj in liste:
246          if sublist[pos] is None:
247             # nouvel objet : on cree un nouvel item
248             def setFunction(value, object=obj):
249                 object.setval(value)
250             item = self.makeObjecttreeitem(self.appli, obj.nom + " : ", obj, setFunction)
251             sublist[pos]=item
252          pos=pos+1
253
254       self.sublist=sublist
255       return self.sublist
256
257   def isValid(self):
258       return self.object.isValid()
259
260   def isCopiable(self):
261       """
262       Retourne 1 si l'objet est copiable, 0 sinon
263       """
264       return 1
265
266   def updateDeplace(self,item):
267       if item.sd and item.sd.nom:
268          self.object.sd=item.sd
269          self.object.sd.nom=item.sd.nom
270
271   def update(self,item):
272       if item.sd and item.sd.nom:
273          self.nommeSd(item.sd.nom)
274
275   def nommeSd(self,nom):
276       """ Lance la méthode de nommage de la SD """
277       oldnom=""
278       if self.object.sd != None :
279          oldnom=self.object.sd.nom
280       test,mess= self.object.nommeSd(nom)
281       if test:self.object.parent.resetContext()
282       if (test and oldnom in self.appli.dict_reels ):
283               self.appli.dict_reels[nom]=self.appli.dict_reels[oldnom]
284       return test,mess
285
286   def isReentrant(self):
287       return self.object.isReentrant()
288     
289   def getNomsSdOperReentrant(self):
290       return self.object.getNomsSdOperReentrant()
291
292   def getObjetCommentarise(self):
293       """
294           Cette méthode retourne un objet commentarisé
295           représentatif de self.object
296       """
297       # Format de fichier utilisé
298       format=self.appli.appliEficas.format_fichier
299       return self.object.getObjetCommentarise(format)
300
301   def getObjetCommentarise_BAK(self):
302       """
303           Cette méthode retourne un objet commentarisé
304           représentatif de self.object
305       """
306       import generator,Accas
307       # Format de fichier utilisé
308       format=self.appli.appliEficas.format_fichier
309       g=generator.plugins[format]()
310       texte_commande = g.gener(self.object,format='beautifie')
311       # Il faut enlever la premiere ligne vide de texte_commande que 
312       # rajoute le generator
313       rebut,texte_commande = texte_commande.split('\n',1)
314       # on construit l'objet COMMANDE_COMM repésentatif de self mais non 
315       # enregistré dans le jdc
316       commande_comment = Accas.COMMANDE_COMM(texte=texte_commande,reg='non',
317                                              parent=self.object.parent)
318       commande_comment.niveau = self.object.niveau
319       commande_comment.jdc = commande_comment.parent = self.object.jdc
320
321       pos=self.object.parent.etapes.index(self.object)
322       parent=self.object.parent
323       self.object.parent.suppEntite(self.object)
324       parent.addEntite(commande_comment,pos)
325
326       return commande_comment
327
328
329 import Accas
330 treeitem = EtapeTreeItem
331 objet = Accas.ETAPE    
332