1 #-*- coding: iso-8859-1 -*-
2 # Copyright (C) 2007-2017 EDF R&D
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.
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.
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
18 # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
20 from __future__ import absolute_import
22 from builtins import str
27 from PyQt5.QtWidgets import QMessageBox, QAction, QApplication
28 from PyQt5.QtGui import QCursor
29 from PyQt5.QtCore import Qt
31 from Extensions.i18n import tr
32 from Extensions.eficas_exception import EficasException
34 from Editeur import Objecttreeitem
36 from . import typeNode
38 class Node(browser.JDCNode, typeNode.PopUpMenuNode):
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)
50 nom=str(self.monWidgetNom.text())
51 self.editor.init_modif()
52 test,mess = self.item.nomme_sd(nom)
54 self.editor.affiche_infos(mess,Qt.red)
55 old=self.item.GetText()
56 self.monWidgetNom.setText(old)
58 self.editor.affiche_commentaire(tr("Nommage du concept effectue"))
61 self.fenetre.LENom.setText(nom)
67 from .monWidgetCommande import MonWidgetCommande
68 return MonWidgetCommande(self,self.editor,self.item.object)
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)
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)
89 self.Graphe.setEnabled(0)
92 from Editeur import TroisDPal
93 troisD=TroisDPal.TroisDPilote(self.item,self.editor.appliEficas)
97 from monPixmap import MonLabelPixmap
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")
108 chemin = os.path.dirname(fichier)
109 base = os.path.splitext(os.path.basename(fichier))[0]
110 script = stdGener.GraphiquePDF(loi, chemin, base)
114 widgetPng=MonLabelPixmap(self.appliEficas,fichier,nomLoi)
116 QApplication.restoreOverrideCursor()
119 QApplication.restoreOverrideCursor()
122 tr("Erreur interne"),
123 tr("La PDF de la loi ne peut pas etre affichee."),
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
139 def IsExpandable(self):
142 def GetIconName(self):
144 Retourne le nom de l'icone a afficher dans l'arbre
145 Ce nom depend de la validite de l'objet
147 if not self.object.isactif():
148 return "ast-white-square"
149 elif self.object.isvalid():
150 return "ast-green-square"
152 valid=self.valid_child()
153 valid=valid * self.valid_regles("non")
154 if self.reste_val != {}:
157 return "ast-red-square"
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"
166 return "ast-yellow-square"
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
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
179 # return self.labeltext, None, None #CS_pbruno todo
181 def get_objet(self,name) :
182 for v in self.object.mc_liste:
183 if v.nom == name : return v
186 def get_type_sd_prod(self):
188 Retourne le nom du type du concept résultat de l'étape
190 sd_prod=self.object.get_type_produit()
192 return sd_prod.__name__
196 def additem(self,name,pos):
197 mcent = self._object.addentite(name,pos)
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)
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'))
218 return self.object.get_sdname()
224 # keys=self.object.mc_dict
227 def GetSubList(self):
229 Reactualise la liste des items fils stockes dans self.sublist
232 liste=self.object.mc_liste
236 sublist=[None]*len(liste)
237 # suppression des items lies aux objets disparus
238 for item in self.sublist:
239 old_obj=item.getObject()
241 pos=liste.index(old_obj)
244 pass # objets supprimes ignores
246 # ajout des items lies aux nouveaux objets
249 if sublist[pos] is None:
250 # nouvel objet : on cree un nouvel item
251 def setfunction(value, object=obj):
253 item = self.make_objecttreeitem(self.appli, obj.nom + " : ", obj, setfunction)
261 return self.object.isvalid()
263 def iscopiable(self):
265 Retourne 1 si l'objet est copiable, 0 sinon
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
274 def update(self,item):
275 if item.sd and item.sd.nom:
276 self.nomme_sd(item.sd.nom)
278 def nomme_sd(self,nom):
279 """ Lance la méthode de nommage de la SD """
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]
289 def is_reentrant(self):
290 return self.object.is_reentrant()
292 def get_noms_sd_oper_reentrant(self):
293 return self.object.get_noms_sd_oper_reentrant()
295 def get_objet_commentarise(self):
297 Cette méthode retourne un objet commentarisé
298 représentatif de self.object
300 # Format de fichier utilisé
301 format=self.appli.appliEficas.format_fichier
302 return self.object.get_objet_commentarise(format)
304 def get_objet_commentarise_BAK(self):
306 Cette méthode retourne un objet commentarisé
307 représentatif de self.object
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
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)
329 return commande_comment
333 treeitem = EtapeTreeItem