Salome HOME
modif pour MT
[tools/eficas.git] / InterfaceQT4 / monWidgetPlusieursTupleAvril11.py
1 # -*- coding: utf-8 -*-
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 # Modules Python
21 from __future__ import absolute_import
22 try :
23    from builtins import str
24    from builtins import range
25    from builtins import object
26 except : pass
27
28 import types,os,sys
29
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
34
35 from Extensions.i18n import tr
36
37
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
52
53
54 #--------------------------
55 class TupleCustom(object) :
56 #--------------------------
57
58   def __init__(self,tailleTuple,parent,parentQt,index):
59   #-------------------------------------------------
60       QWidget.__init__(self,parent)
61       self.setupUi(self)
62       self.tailleTuple=tailleTuple
63       self.parent=parent
64       self.parentQt=parentQt
65       self.valeur=None
66       self.index=index
67       self.inFocusOutEvent=False
68
69
70       for i in range(self.tailleTuple):
71          nomLE="lineEditVal_"+str(i+1)
72          courant=getattr(self,nomLE)
73          courant.num=index
74          courant.dansUnTuple=True
75          courant.numDsLaListe = i+1
76          courant.tupleCustomParent=self
77
78
79
80   def setValeur(self,value):
81   #----------------------
82
83       listeVal=[]
84       valeurNulle=True
85       for i in range(self.tailleTuple):
86          nomLE="lineEditVal_"+str(i+1)
87          courant=getattr(self,nomLE)
88          try :
89            if str(value[i]) != "" : valeurNulle=False
90          except :
91            pass
92
93          try :
94            courant.setText(str(value[i]))
95          except :
96            courant.setText("")
97          val=str(courant.text())
98          try :
99            valeur=eval(val,{})
100          except :
101            try :
102              d=self.parentQt.objSimp.jdc.getContexteAvant(self.parentQt.objSimp. etape)
103              valeur=eval(val,d)
104            except :
105              valeur=val
106          listeVal.append(valeur)
107       if  valeurNulle == True : self.valeur=None
108       else                    : self.valeur=listeVal
109
110   def getValeur(self):
111   #----------------------
112       return self.valeur
113
114   def text(self):
115   #--------------
116       return self.valeur
117
118   def setText(self,value):
119   #-----------------------
120       self.setValeur(value)
121
122   def clean(self):
123   #-------------------
124       self.valeur=None
125       for i in range(self.tailleTuple):
126          nomLE="lineEditVal_"+str(i+1)
127          courant=getattr(self,nomLE)
128          courant.setText("")
129
130   def finCommentaire(self):
131   #-------------------
132         return self.finCommentaireListe()
133
134
135 #-------------------------------------------------
136 class TupleCustom2(QWidget,Ui_Tuple2,TupleCustom):
137 #-------------------------------------------------
138   def __init__(self,tailleTuple,parent,parentQt,index):
139   #-------------------
140       TupleCustom.__init__(self,tailleTuple,parent,parentQt,index)
141
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)
148       
149 #-------------------------------------------------
150 class TupleCustom3(QWidget,Ui_Tuple3,TupleCustom):
151 #-------------------------------------------------
152   def __init__(self,tailleTuple,parent,parentQt,index):
153   #-------------------
154       TupleCustom.__init__(self,tailleTuple,parent,parentQt,index)
155
156 #-------------------------------------------------
157 class TupleCustom4(QWidget,Ui_Tuple4,TupleCustom):
158 #-------------------------------------------------
159   def __init__(self,tailleTuple,parent,parentQt,index):
160   #-------------------
161       TupleCustom.__init__(self,tailleTuple,parent,parentQt,index)
162
163 #-------------------------------------------------
164 class TupleCustom5(QWidget,Ui_Tuple5,TupleCustom):
165 #-------------------------------------------------
166   def __init__(self,tailleTuple,parent,parentQt,index):
167   #-------------------
168       TupleCustom.__init__(self,tailleTuple,parent,parentQt,index)
169
170 #-------------------------------------------------
171 class TupleCustom6(QWidget,Ui_Tuple6,TupleCustom):
172 #-------------------------------------------------
173   def __init__(self,tailleTuple,parent,parentQt,index):
174   #-------------------
175       TupleCustom.__init__(self,tailleTuple,parent,parentQt,index)
176
177 #-------------------------------------------------
178 class TupleCustom7(QWidget,Ui_Tuple7,TupleCustom):
179 #-------------------------------------------------
180   def __init__(self,tailleTuple,parent,parentQt,index):
181   #-------------------
182       TupleCustom.__init__(self,tailleTuple,parent,parentQt,index)
183
184 #-------------------------------------------------
185 class TupleCustom8(QWidget,Ui_Tuple8,TupleCustom):
186 #-------------------------------------------------
187   def __init__(self,tailleTuple,parent,parentQt,index):
188   #-------------------
189       TupleCustom.__init__(self,tailleTuple,parent,parentQt,index)
190
191 #-------------------------------------------------
192 class TupleCustom9(QWidget,Ui_Tuple9,TupleCustom):
193 #-------------------------------------------------
194   def __init__(self,tailleTuple,parent,parentQt,index):
195   #-------------------
196       TupleCustom.__init__(self,tailleTuple,parent,parentQt,index)
197
198 #-------------------------------------------------
199 class TupleCustom10(QWidget,Ui_Tuple10,TupleCustom):
200 #-------------------------------------------------
201   def __init__(self,tailleTuple,parent,parentQt,index):
202   #-------------------
203       TupleCustom.__init__(self,tailleTuple,parent,parentQt,index)
204
205
206
207
208
209 # -------------------------------------------- #
210 class MonWidgetPlusieursTuple(Feuille,GereListe):
211 # -------------------------------------------- #
212
213   def __init__(self, node, monSimpDef, nom, objSimp, parentQt, commande):
214   #-----------------------------------------------------
215
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)
225
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)
240  
241
242
243
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
250          return
251
252       nomCustomTuple='TupleCustom'+str(self.nbValeurs)
253       laClasseDuTuple=globals()[nomCustomTuple]
254       nouveauLE=laClasseDuTuple(self.nbValeurs,self.scrollArea,self,self.indexDernierLabel)
255
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)
258                  
259       self.verticalLayoutLE.insertWidget(self.indexDernierLabel-1,nouveauLE)
260       setattr(self,nomLineEdit,nouveauLE)
261       if valeur != None : nouveauLE.setValeur(valeur)
262
263       for i in range(self.nbValeurs) :
264           num=i+1
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)
271
272       self.etablitOrdre()
273
274       # deux lignes pour que le ensureVisible fonctionne
275       self.estVisible=nouveauLE.lineEditVal_1
276       if inInit==False :QTimer.singleShot(1, self.rendVisibleLigne)
277
278   def etablitOrdre(self):
279   # ---------------------
280       i=0
281       while(i +1 < len(self.listeAffichageWidget)):
282          self.listeAffichageWidget[i].setFocusPolicy(Qt.StrongFocus)
283          self.setTabOrder(self.listeAffichageWidget[i],self.listeAffichageWidget[i+1])
284          i=i+1
285
286
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
293        else : aCreer=max 
294
295        if valeurs == () or valeurs == None :
296           for i in range(aCreer): self.ajoutLineEdit(inInit=True)
297           return
298
299        for v in valeurs:
300            self.ajoutLineEdit(v,inInit=True)
301
302        for i in range(len(valeurs),aCreer) : self.ajoutLineEdit(inInit=True)
303
304   def rendVisibleLigne(self):
305   # -------------------------
306       QApplication.processEvents()
307       self.estVisible.setFocus(True)
308       self.scrollArea.ensureWidgetVisible(self.estVisible,0,0)
309
310    
311   def changeValeur(self,changeDePlace=False,oblige=True):
312   # -----------------------------------------------------
313       #Pour compatibilite signature
314
315       self.aEuLeFocus=False # set pour le leaveEvent voir gereListe
316       aLeFocus=self.focusWidget()
317       listeComplete=[]
318       libre=False
319       #print ('ds changeValeur', self.indexDernierLabel)
320       for i in range(self.indexDernierLabel) :
321           #print (i)
322           nom=self.nomLine+str(i+1)
323           #print (nom)
324           courant=getattr(self,nom)
325           #print (courant)
326           valeurTuple=courant.valeur
327           #print (valeurTuple)
328           if valeurTuple == None or valeurTuple== "": 
329              libre=True
330              continue
331           print (i, valeurTuple)
332           validite,comm,comm2,listeRetour= self.politique.ajoutTuple(valeurTuple,listeComplete)
333           if not validite:
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)
339              return
340           listeComplete.append(tuple(courant.valeur))
341       if listeComplete == [] : listeComplete=None
342       self.node.item.setValeur(listeComplete)
343
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 :
348           self.ajoutLineEdit()
349           self.listeAffichageWidget[-2].setFocus(True)
350       else :
351          try :
352            QApplication.processEvents()
353            w=self.listeAffichageWidget[self.listeAffichageWidget.index(aLeFocus)+1]
354            w.setFocus(True)
355            self.scrollArea.ensureWidgetVisible(w,0,0)
356          except :
357            pass
358           
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
364
365         if len(liste)%self.nbValeurs != 0 :
366            texte="Nombre incorrect de valeurs"
367            self.editor.afficheInfos(tr(texte),Qt.red)
368            return
369
370         i=0
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)
375
376         min,max=self.node.item.getMinMax()
377         if self.objSimp.valeur == None : listeComplete=listeFormatee
378         else : listeComplete =self.objSimp.valeur + listeFormatee
379
380         if len(listeComplete) > max : 
381            texte=tr("Nombre maximum de valeurs ")+str(max)+tr(" atteint")
382            self.editor.afficheInfos(texte,Qt.red)
383            return
384
385         validite,comm,comm2,listeRetour= self.politique.ajoutNTuple(listeComplete)
386         if not validite : 
387            self.editor.afficheInfos(texte,Qt.red)
388            return
389
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
393
394         self.politique.recordValeur(listeComplete)
395
396         while ( i < len(liste) ) :
397             try :
398               t=tuple(liste[i:i+self.nbValeurs])
399             except:
400               t=tuple(liste[i:len(liste)])
401             i=i+self.nbValeurs
402             if indexDernierRempli < self.indexDernierLabel:
403
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]))
410             else : 
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)
414
415                nomCustomTuple='TupleCustom'+str(self.nbValeurs)
416                laClasseDuTuple=globals()[nomCustomTuple]
417                nouveauLE=laClasseDuTuple(self.nbValeurs,self.scrollArea,self,self.indexDernierLabel)
418                  
419                self.verticalLayoutLE.insertWidget(self.indexDernierLabel-1,nouveauLE)
420                setattr(self,nomLineEdit,nouveauLE)
421                nouveauLE.setValeur(t)
422
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
428
429         self.etablitOrdre()
430
431         
432
433   def RBListePush(self):
434   #----------------------
435   # PN a rendre generique avec un truc tel prerempli
436   # pour l instant specifique PSEN
437
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 :
446          val=[]
447          if  hasattr(self.objSimp.jdc,'LineDico'):
448           for k in self.objSimp.jdc.LineDico :
449               try :
450                valeur=self.objSimp.jdc.getConcept(k)
451                val.append((valeur,0))
452               except :
453                pass
454          self.node.item.setValeur(val)
455       if self.objSimp.definition.validators.typeDesTuples[0]==self.editor.readercata.cata.sd_generateur :
456          val=[]
457          if  hasattr(self.objSimp.jdc,'MachineDico'):
458           for k in self.objSimp.jdc.MachineDico :
459               try :
460                valeur=self.objSimp.jdc.getConcept(k)
461                val.append((valeur,0))
462               except :
463                pass
464          self.node.item.setValeur(val)
465       if self.objSimp.definition.validators.typeDesTuples[0]==self.editor.readercata.cata.sd_transfo :
466          val=[]
467          if  hasattr(self.objSimp.jdc,'TransfoDico'):
468           for k in self.objSimp.jdc.TransfoDico :
469               try :
470                valeur=self.objSimp.jdc.getConcept(k)
471                val.append((valeur,0))
472               except :
473                pass
474          self.node.item.setValeur(val)
475       if self.objSimp.definition.validators.typeDesTuples[0]==self.editor.readercata.cata.sd_charge :
476          val=[]
477          if  hasattr(self.objSimp.jdc,'LoadDico'):
478           for k in self.objSimp.jdc.LoadDico :
479               try :
480                valeur=self.objSimp.jdc.getConcept(k)
481                val.append((valeur,0))
482               except :
483                pass
484          self.node.item.setValeur(val)
485       if self.objSimp.definition.validators.typeDesTuples[0]==self.editor.readercata.cata.sd_moteur :
486          val=[]
487          if  hasattr(self.objSimp.jdc,'MotorDico'):
488           for k in self.objSimp.jdc.MotorDico :
489               try :
490                valeur=self.objSimp.jdc.getConcept(k)
491                val.append((valeur,0))
492               except :
493                pass
494          self.node.item.setValeur(val)
495