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.initModif()
52 test,mess = self.item.nommeSd(nom)
54 self.editor.afficheInfos(mess,Qt.red)
55 old=self.item.getText()
56 self.monWidgetNom.setText(old)
58 self.editor.afficheCommentaire(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.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)
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)
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.getName()
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.validChild()
153 valid=valid * self.validRegles("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.mcListe:
183 # if v.nom == name : return v
186 # def getType_sd_prod(self):
188 # Retourne le nom du type du concept résultat de l'étape
190 # sd_prod=self.object.getType_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 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)
211 return (0,tr('Pb interne : impossible de supprimer ce mot-clef'))
215 return self.object.getSdname()
221 # keys=self.object.mc_dict
224 def getSubList(self):
226 Reactualise la liste des items fils stockes dans self.sublist
229 liste=self.object.mcListe
233 sublist=[None]*len(liste)
234 # suppression des items lies aux objets disparus
235 for item in self.sublist:
236 old_obj=item.getObject()
238 pos=liste.index(old_obj)
241 pass # objets supprimes ignores
243 # ajout des items lies aux nouveaux objets
246 if sublist[pos] is None:
247 # nouvel objet : on cree un nouvel item
248 def setFunction(value, object=obj):
250 item = self.makeObjecttreeitem(self.appli, obj.nom + " : ", obj, setFunction)
258 return self.object.isValid()
260 def isCopiable(self):
262 Retourne 1 si l'objet est copiable, 0 sinon
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
271 def update(self,item):
272 if item.sd and item.sd.nom:
273 self.nommeSd(item.sd.nom)
275 def nommeSd(self,nom):
276 """ Lance la méthode de nommage de la SD """
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]
286 def isReentrant(self):
287 return self.object.isReentrant()
289 def getNomsSdOperReentrant(self):
290 return self.object.getNomsSdOperReentrant()
292 def getObjetCommentarise(self):
294 Cette méthode retourne un objet commentarisé
295 représentatif de self.object
297 # Format de fichier utilisé
298 format=self.appli.appliEficas.format_fichier
299 return self.object.getObjetCommentarise(format)
301 def getObjetCommentarise_BAK(self):
303 Cette méthode retourne un objet commentarisé
304 représentatif de self.object
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
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)
326 return commande_comment
330 treeitem = EtapeTreeItem