1 # -*- coding: utf-8 -*-
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
21 from __future__ import absolute_import
23 from builtins import str
24 from builtins import range
25 from builtins import object
30 from six.moves import range
31 from PyQt5.QtWidgets import QFrame,QApplication, QFrame, QWidget
32 from PyQt5.QtGui import QIcon
33 from PyQt5.QtCore import QSize, Qt, QTimer
35 from Extensions.i18n import tr
38 from InterfaceQT4.feuille import Feuille
39 from InterfaceQT4.politiquesValidation import PolitiquePlusieurs
40 from InterfaceQT4.qtSaisie import SaisieValeur
41 from InterfaceQT4.gereListe import GereListe
42 from InterfaceQT4.gereListe import LECustom
43 from Tuple2 import Ui_Tuple2
44 from Tuple3 import Ui_Tuple3
45 from Tuple4 import Ui_Tuple4
46 from Tuple5 import Ui_Tuple5
47 from Tuple6 import Ui_Tuple6
48 from Tuple7 import Ui_Tuple7
49 from Tuple8 import Ui_Tuple8
50 from Tuple9 import Ui_Tuple9
51 from Tuple10 import Ui_Tuple10
54 #--------------------------
55 class TupleCustom(object) :
56 #--------------------------
58 def __init__(self,tailleTuple,parent,parentQt,index):
59 #-------------------------------------------------
60 QWidget.__init__(self,parent)
62 self.tailleTuple=tailleTuple
64 self.parentQt=parentQt
67 self.inFocusOutEvent=False
70 for i in range(self.tailleTuple):
71 nomLE="lineEditVal_"+str(i+1)
72 courant=getattr(self,nomLE)
74 courant.dansUnTuple=True
75 courant.numDsLaListe = i+1
76 courant.tupleCustomParent=self
80 def setValeur(self,value):
81 #----------------------
85 for i in range(self.tailleTuple):
86 nomLE="lineEditVal_"+str(i+1)
87 courant=getattr(self,nomLE)
89 if str(value[i]) != "" : valeurNulle=False
94 courant.setText(str(value[i]))
97 val=str(courant.text())
102 d=self.parentQt.objSimp.jdc.getContexteAvant(self.parentQt.objSimp. etape)
106 listeVal.append(valeur)
107 if valeurNulle == True : self.valeur=None
108 else : self.valeur=listeVal
111 #----------------------
118 def setText(self,value):
119 #-----------------------
120 self.setValeur(value)
125 for i in range(self.tailleTuple):
126 nomLE="lineEditVal_"+str(i+1)
127 courant=getattr(self,nomLE)
130 def finCommentaire(self):
132 return self.finCommentaireListe()
135 #-------------------------------------------------
136 class TupleCustom2(QWidget,Ui_Tuple2,TupleCustom):
137 #-------------------------------------------------
138 def __init__(self,tailleTuple,parent,parentQt,index):
140 TupleCustom.__init__(self,tailleTuple,parent,parentQt,index)
142 #-------------------------------------------------
143 class TupleCustom3(QWidget,Ui_Tuple3,TupleCustom):
144 #-------------------------------------------------
145 def __init__(self,tailleTuple,parent,parentQt,index):
146 #-----------------------------------------------------
147 TupleCustom. __init__(self,tailleTuple,parent,parentQt,index)
149 #-------------------------------------------------
150 class TupleCustom3(QWidget,Ui_Tuple3,TupleCustom):
151 #-------------------------------------------------
152 def __init__(self,tailleTuple,parent,parentQt,index):
154 TupleCustom.__init__(self,tailleTuple,parent,parentQt,index)
156 #-------------------------------------------------
157 class TupleCustom4(QWidget,Ui_Tuple4,TupleCustom):
158 #-------------------------------------------------
159 def __init__(self,tailleTuple,parent,parentQt,index):
161 TupleCustom.__init__(self,tailleTuple,parent,parentQt,index)
163 #-------------------------------------------------
164 class TupleCustom5(QWidget,Ui_Tuple5,TupleCustom):
165 #-------------------------------------------------
166 def __init__(self,tailleTuple,parent,parentQt,index):
168 TupleCustom.__init__(self,tailleTuple,parent,parentQt,index)
170 #-------------------------------------------------
171 class TupleCustom6(QWidget,Ui_Tuple6,TupleCustom):
172 #-------------------------------------------------
173 def __init__(self,tailleTuple,parent,parentQt,index):
175 TupleCustom.__init__(self,tailleTuple,parent,parentQt,index)
177 #-------------------------------------------------
178 class TupleCustom7(QWidget,Ui_Tuple7,TupleCustom):
179 #-------------------------------------------------
180 def __init__(self,tailleTuple,parent,parentQt,index):
182 TupleCustom.__init__(self,tailleTuple,parent,parentQt,index)
184 #-------------------------------------------------
185 class TupleCustom8(QWidget,Ui_Tuple8,TupleCustom):
186 #-------------------------------------------------
187 def __init__(self,tailleTuple,parent,parentQt,index):
189 TupleCustom.__init__(self,tailleTuple,parent,parentQt,index)
191 #-------------------------------------------------
192 class TupleCustom9(QWidget,Ui_Tuple9,TupleCustom):
193 #-------------------------------------------------
194 def __init__(self,tailleTuple,parent,parentQt,index):
196 TupleCustom.__init__(self,tailleTuple,parent,parentQt,index)
198 #-------------------------------------------------
199 class TupleCustom10(QWidget,Ui_Tuple10,TupleCustom):
200 #-------------------------------------------------
201 def __init__(self,tailleTuple,parent,parentQt,index):
203 TupleCustom.__init__(self,tailleTuple,parent,parentQt,index)
209 # -------------------------------------------- #
210 class MonWidgetPlusieursTuple(Feuille,GereListe):
211 # -------------------------------------------- #
213 def __init__(self, node, monSimpDef, nom, objSimp, parentQt, commande):
214 #-----------------------------------------------------
216 self.indexDernierLabel=0
217 self.numLineEditEnCours=0
218 self.nomLine="TupleVal"
219 self.listeAffichageWidget=[]
220 Feuille.__init__(self,node,monSimpDef,nom,objSimp,parentQt,commande)
221 GereListe.__init__(self)
222 self.finCommentaireListe()
223 self.politique=PolitiquePlusieurs(self.node,self.editor)
224 self.parentQt.commandesLayout.insertWidget(-1,self)
226 if sys.platform[0:5]!="linux":
227 repIcon=self.node.editor.appliEficas.repIcon
228 fichier=os.path.join(repIcon, 'arrow_up.png')
229 icon = QIcon(fichier)
230 self.RBHaut.setIcon(icon)
231 self.RBHaut.setIconSize(QSize(32, 32))
232 fichier2=os.path.join(repIcon, 'arrow_down.png')
233 icon2 = QIcon(fichier2)
234 self.RBBas.setIcon(icon2)
235 fichier3=os.path.join(repIcon, 'file-explorer.png')
236 icon3 = QIcon(fichier3)
237 self.BSelectFichier.setIcon(icon3)
238 self.BSelectFichier.setIconSize(QSize(32, 32))
239 self.BSelectFichier.clicked.connect(self.selectInFile)
244 def ajoutLineEdit(self,valeur=None,inInit=False):
245 #------------------------------------------------
246 self.indexDernierLabel=self.indexDernierLabel+1
247 nomLineEdit=self.nomLine+str(self.indexDernierLabel)
248 if hasattr(self,nomLineEdit) :
249 self.indexDernierLabel=self.indexDernierLabel-1
252 nomCustomTuple='TupleCustom'+str(self.nbValeurs)
253 laClasseDuTuple=globals()[nomCustomTuple]
254 nouveauLE=laClasseDuTuple(self.nbValeurs,self.scrollArea,self,self.indexDernierLabel)
256 #if self.nbValeurs == 2 : nouveauLE = TupleCustom2(self.nbValeurs,self.scrollArea,self,self.indexDernierLabel)
257 #else : nouveauLE = TupleCustom3(self.nbValeurs,self.scrollArea,self,self.indexDernierLabel)
259 self.verticalLayoutLE.insertWidget(self.indexDernierLabel-1,nouveauLE)
260 setattr(self,nomLineEdit,nouveauLE)
261 if valeur != None : nouveauLE.setValeur(valeur)
263 for i in range(self.nbValeurs) :
265 nomLineEdit='lineEditVal_'+str(num)
266 lineEditVal=getattr(nouveauLE,nomLineEdit)
267 self.listeAffichageWidget.append(lineEditVal)
268 #self.listeAffichageWidget.append(nouveauLE.lineEditVal_1)
269 #self.listeAffichageWidget.append(nouveauLE.lineEditVal_2)
270 #if self.nbValeurs == 3 : self.listeAffichageWidget.append(nouveauLE.lineEditVal_3)
274 # deux lignes pour que le ensureVisible fonctionne
275 self.estVisible=nouveauLE.lineEditVal_1
276 if inInit==False :QTimer.singleShot(1, self.rendVisibleLigne)
278 def etablitOrdre(self):
279 # ---------------------
281 while(i +1 < len(self.listeAffichageWidget)):
282 self.listeAffichageWidget[i].setFocusPolicy(Qt.StrongFocus)
283 self.setTabOrder(self.listeAffichageWidget[i],self.listeAffichageWidget[i+1])
287 def setValeurs(self):
288 # ---------------------
289 if self.editor.code == 'PSEN' : self.RBListePush()
290 valeurs=self.node.item.getValeur()
291 min,max=self.node.item.getMinMax()
292 if max == "**" or max > 8 : aCreer= 8
295 if valeurs == () or valeurs == None :
296 for i in range(aCreer): self.ajoutLineEdit(inInit=True)
300 self.ajoutLineEdit(v,inInit=True)
302 for i in range(len(valeurs),aCreer) : self.ajoutLineEdit(inInit=True)
304 def rendVisibleLigne(self):
305 # -------------------------
306 QApplication.processEvents()
307 self.estVisible.setFocus(True)
308 self.scrollArea.ensureWidgetVisible(self.estVisible,0,0)
311 def changeValeur(self,changeDePlace=False,oblige=True):
312 # -----------------------------------------------------
313 #Pour compatibilite signature
315 self.aEuLeFocus=False # set pour le leaveEvent voir gereListe
316 aLeFocus=self.focusWidget()
319 #print ('ds changeValeur', self.indexDernierLabel)
320 for i in range(self.indexDernierLabel) :
322 nom=self.nomLine+str(i+1)
324 courant=getattr(self,nom)
326 valeurTuple=courant.valeur
328 if valeurTuple == None or valeurTuple== "":
331 print (i, valeurTuple)
332 validite,comm,comm2,listeRetour= self.politique.ajoutTuple(valeurTuple,listeComplete)
334 print (validite,comm,comm2)
335 if comm2 != '' : comm += " " + comm2
336 print (validite,comm,comm2)
337 self.editor.afficheInfos(comm+" "+str(self.objSimp.definition.validators.typeDesTuples),Qt.red)
338 print (comm+" "+str(self.objSimp.definition.validators.typeDesTuples),Qt.red)
340 listeComplete.append(tuple(courant.valeur))
341 if listeComplete == [] : listeComplete=None
342 self.node.item.setValeur(listeComplete)
344 if changeDePlace : return
345 min,max=self.node.item.getMinMax()
346 if self.indexDernierLabel == max : self.editor.afficheInfos(tr('Nb maximum de valeurs atteint'))
347 if self.indexDernierLabel < max and libre==False :
349 self.listeAffichageWidget[-2].setFocus(True)
352 QApplication.processEvents()
353 w=self.listeAffichageWidget[self.listeAffichageWidget.index(aLeFocus)+1]
355 self.scrollArea.ensureWidgetVisible(w,0,0)
359 def ajoutNValeur(self,liste):
360 #----------------------------
361 # attention quand on charge par un fichier, on ne peut pas se contenter d ajouter N fois 1 valeur
362 # car alors le temps de verification devient prohibitif reconstructu=ion et verification a
363 # chaque valeur. d ou l ajout de ajoutNTuple a politique plusieurs
365 if len(liste)%self.nbValeurs != 0 :
366 texte="Nombre incorrect de valeurs"
367 self.editor.afficheInfos(tr(texte),Qt.red)
371 longueur=len(liste)//self.nbValeurs
372 increment=self.nbValeurs
373 listeFormatee=[liste[k*increment:(k+1)*increment] for k in range(longueur)]
374 listeFormatee=tuple(listeFormatee)
376 min,max=self.node.item.getMinMax()
377 if self.objSimp.valeur == None : listeComplete=listeFormatee
378 else : listeComplete =self.objSimp.valeur + listeFormatee
380 if len(listeComplete) > max :
381 texte=tr("Nombre maximum de valeurs ")+str(max)+tr(" atteint")
382 self.editor.afficheInfos(texte,Qt.red)
385 validite,comm,comm2,listeRetour= self.politique.ajoutNTuple(listeComplete)
387 self.editor.afficheInfos(texte,Qt.red)
390 # on calcule le dernier lineedit rempli avant de changer la valeur
391 if self.objSimp.valeur != None : indexDernierRempli=len(self.objSimp.valeur)
392 else : indexDernierRempli=0
394 self.politique.recordValeur(listeComplete)
396 while ( i < len(liste) ) :
398 t=tuple(liste[i:i+self.nbValeurs])
400 t=tuple(liste[i:len(liste)])
402 if indexDernierRempli < self.indexDernierLabel:
404 nomLEARemplir=self.nomLine+str(indexDernierRempli+1)
405 LEARemplir=getattr(self,nomLEARemplir)
406 for n in range(self.nbValeurs) :
407 nomLineEdit='lineEditVal_'+str(n+1)
408 lineEditVal=getattr(LEARemplir,nomLineEdit)
409 lineEditVal.setText(str(t[n]))
411 # ne pas appeler ajoutLineEdit(t,False ) pb de boucle pb du a etablitOrdre et a listeWidgetAffichage qui bouge
412 self.indexDernierLabel=self.indexDernierLabel+1
413 nomLineEdit=self.nomLine+str(self.indexDernierLabel)
415 nomCustomTuple='TupleCustom'+str(self.nbValeurs)
416 laClasseDuTuple=globals()[nomCustomTuple]
417 nouveauLE=laClasseDuTuple(self.nbValeurs,self.scrollArea,self,self.indexDernierLabel)
419 self.verticalLayoutLE.insertWidget(self.indexDernierLabel-1,nouveauLE)
420 setattr(self,nomLineEdit,nouveauLE)
421 nouveauLE.setValeur(t)
423 for n in range(self.nbValeurs) :
424 nomLineEdit='lineEditVal_'+str(n+1)
425 lineEditVal=getattr(nouveauLE,nomLineEdit)
426 self.listeAffichageWidget.append(lineEditVal)
427 indexDernierRempli = indexDernierRempli+1
433 def RBListePush(self):
434 #----------------------
435 # PN a rendre generique avec un truc tel prerempli
436 # pour l instant specifique PSEN
438 if self.editor.code == 'VP' : return
439 if self.objSimp.valeur != None and self.objSimp.valeur != [] : return
440 if not hasattr(self.editor.readercata.cata,'sd_ligne') : self.editor.readercata.cata.sd_ligne=None
441 if not hasattr(self.editor.readercata.cata,'sd_generateur') : self.editor.readercata.cata.sd_generateur=None
442 if not hasattr(self.editor.readercata.cata,'sd_transfo') : self.editor.readercata.cata.sd_transfo=None
443 if not hasattr(self.editor.readercata.cata,'sd_charge') : self.editor.readercata.cata.sd_charge=None
444 if not hasattr(self.editor.readercata.cata,'sd_moteur') : self.editor.readercata.cata.sd_moteur=None
445 if self.objSimp.definition.validators.typeDesTuples[0]==self.editor.readercata.cata.sd_ligne :
447 if hasattr(self.objSimp.jdc,'LineDico'):
448 for k in self.objSimp.jdc.LineDico :
450 valeur=self.objSimp.jdc.getConcept(k)
451 val.append((valeur,0))
454 self.node.item.setValeur(val)
455 if self.objSimp.definition.validators.typeDesTuples[0]==self.editor.readercata.cata.sd_generateur :
457 if hasattr(self.objSimp.jdc,'MachineDico'):
458 for k in self.objSimp.jdc.MachineDico :
460 valeur=self.objSimp.jdc.getConcept(k)
461 val.append((valeur,0))
464 self.node.item.setValeur(val)
465 if self.objSimp.definition.validators.typeDesTuples[0]==self.editor.readercata.cata.sd_transfo :
467 if hasattr(self.objSimp.jdc,'TransfoDico'):
468 for k in self.objSimp.jdc.TransfoDico :
470 valeur=self.objSimp.jdc.getConcept(k)
471 val.append((valeur,0))
474 self.node.item.setValeur(val)
475 if self.objSimp.definition.validators.typeDesTuples[0]==self.editor.readercata.cata.sd_charge :
477 if hasattr(self.objSimp.jdc,'LoadDico'):
478 for k in self.objSimp.jdc.LoadDico :
480 valeur=self.objSimp.jdc.getConcept(k)
481 val.append((valeur,0))
484 self.node.item.setValeur(val)
485 if self.objSimp.definition.validators.typeDesTuples[0]==self.editor.readercata.cata.sd_moteur :
487 if hasattr(self.objSimp.jdc,'MotorDico'):
488 for k in self.objSimp.jdc.MotorDico :
490 valeur=self.objSimp.jdc.getConcept(k)
491 val.append((valeur,0))
494 self.node.item.setValeur(val)