Salome HOME
big mineur
[tools/eficas.git] / InterfaceQT4 / monWidgetMatrice.py
1 # -*- coding: utf-8 -*-
2 # Copyright (C) 2007-2021   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 from __future__ import print_function
23 try :
24     from builtins import str
25     from builtins import range
26 except : pass
27
28 import types,os,sys
29
30 # Modules Eficas
31 from Extensions.i18n import tr
32 from .feuille         import Feuille
33 from Extensions.eficas_exception import EficasException
34
35
36 from desWidgetMatrice  import Ui_desWidgetMatrice
37
38 from PyQt5.QtCore import QSize, Qt
39 from PyQt5.QtWidgets import QTableWidgetItem, QTableWidget
40 from PyQt5.QtGui import QIcon, QColor
41 from PyQt5.QtWidgets import  QMessageBox
42
43
44 class MonWidgetMatrice (Ui_desWidgetMatrice,Feuille):
45 # c est juste la taille des differents widgets de base qui change
46
47     def __init__(self,node,monSimpDef,nom,objSimp,parentQt,commande):
48         Feuille.__init__(self,node,monSimpDef,nom,objSimp,parentQt,commande)
49         self.monType = self.node.item.object.definition.type[0]
50         parentQt.commandesLayout.insertWidget(-1,self)
51         self.nbLigs=0
52         self.nbCols=0
53         self.creeColonnes()
54         self.connecterSignaux()
55         self.initialValeur()
56
57
58     def connecterSignaux(self) :
59         self.TBMatrice.itemChanged.connect(self.itemChanged)
60         self.PBrefresh.clicked.connect( self.acceptVal)
61         self.TBMatrice.focusOutEvent=self.monFocusOutEvent
62
63
64     def monFocusOutEvent(self,event):
65         self.acceptVal()
66         QTableWidget.focusOutEvent(self.TBMatrice,event)
67
68
69     def itemChanged(self):
70         monItem=self.TBMatrice.currentItem()
71         if monItem==None : return
72         texte=monItem.text()
73         if texte=="" : return
74         boolOk, commentaire = self.monType.verifItem(texte,self.node.item.object)
75         if not boolOk :
76             self.editor.afficheInfos(tr(commentaire),Qt.red)
77             monItem.setText("")
78             return
79         if self.monType.coloree : self.coloreItem(monItem,texte)
80
81
82     def coloreItem(self,monItem,texte):
83         if texte in self.monType.dictCouleurs.keys() :
84             monItem.setBackground(self.monType.dictCouleurs[texte])
85         else :
86             i=self.monType.indiceCouleur%20
87             newCouleur=QColor(*self.monType.listeCouleurs[i])
88             #monItem.setBackground(Qt.red)
89             monItem.setBackground(newCouleur)
90             self.monType.dictCouleurs[texte]=newCouleur
91             self.monType.indiceCouleur+=1
92             
93
94
95     def creeColonnes(self):
96         if self.monType.methodeCalculTaille != None :
97             try:
98                 MonWidgetMatrice.__dict__[self.monType.methodeCalculTaille](*(self,))
99             except :
100                 QMessageBox.critical( self, tr("Mauvaise execution "),tr( "impossible d executer la methode ") + self.monType.methodeCalculTaille )
101                 return
102         else :
103             self.nbLigs=self.monType.nbLigs
104             self.nbCols=self.monType.nbCols
105         self.TBMatrice.setColumnCount(self.nbCols)
106         self.TBMatrice.setRowCount(self.nbLigs)
107         if self.nbLigs <15 : taille = 50
108         else : taille = 30
109         for i in range(self.nbLigs) :
110             self.TBMatrice.setRowHeight(i,taille)
111         for i in range(self.nbCols) :
112             self.TBMatrice.setColumnWidth(i,taille)
113         if self.monType.listeHeaders != None :
114             self.TBMatrice.setHorizontalHeaderLabels(self.monType.listeHeaders[0])
115             self.TBMatrice.setVerticalHeaderLabels(self.monType.listeHeaders[1])
116         else :
117             self.TBMatrice.verticalHeader().hide()
118             self.TBMatrice.horizontalHeader().hide()
119         #   self.TBMatrice.setFixedSize(self.nbCols*20+10,self.nbLigs*20+10)
120
121
122     def  initialValeur(self):
123         liste=self.node.item.getValeur()
124         if liste == None : return
125         dejaAffiche=0
126         if (len(liste)) != self.nbLigs  :
127             QMessageBox.critical( self,tr( "Mauvaise dimension de matrice"),tr( "le nombre de ligne n est pas egal a ") + str(self.nbLigs))
128         for i in range(self.nbLigs):
129             inter=liste[i]
130             if (len(inter)) != self.nbCols :
131                 QMessageBox.critical( self, tr("Mauvaise dimension de matrice"), tr("le nombre de colonne n est pas egal a ") + str(self.nbCols))
132                 raise  EficasException('dimension')
133             for j in range(self.nbCols):
134                 self.TBMatrice.setItem(i,j,QTableWidgetItem(str(liste[i][j])))
135                 if self.monType.coloree : self.coloreItem(self.TBMatrice.item(i,j),str(liste[i][j]))
136
137     def acceptVal(self):
138         liste=[]
139         for i in range(self.nbLigs):
140             listeCol=[]
141             for j in range(self.nbCols):
142                 monItem=self.TBMatrice.item(i,j)
143                 if monItem : texte=monItem.text()
144                 else       : texte = ''
145                 if texte != '' : val=self.monType.convertItem(texte)
146                 else : val = None
147                 listeCol.append(val)
148             liste.append(listeCol)
149         self.node.item.setValeur(liste)
150
151
152 class MonWidgetMatriceOT (MonWidgetMatrice):
153
154     def __init__(self,node,monSimpDef,nom,objSimp,parentQt,commande):
155         monWidgetMatrice.__init__(self,node,monSimpDef,nom,objSimp,parentQt,commande)
156
157     def connecterSignaux(self) :
158         self.TBMatrice.itemChanged.connect(self.itemChanged)
159         self.PBrefresh.clicked.connect( self.afficheEntete)
160
161
162     def afficheEntete(self):
163         self.objSimp.changeEnteteMatrice()
164         self.TBMatrice.clear()
165         if self.node.item.getValeur()== None:  self.initialSsValeur()
166         else :
167             try    : self.initialValeur()
168             except : self.initialSsValeur()
169         self.node.item.object.state='changed'
170         self.node.item.object.parent.state='changed'
171         self.setValide()
172         self.parentQt.setValide()
173         self.node.item.jdc.isValid()
174
175
176     def itemChanged(self):
177         monItem=self.TBMatrice.currentItem()
178         if monItem==None : return
179         texte=monItem.text()
180         if texte=="" : return
181         try :
182             val=float(str(texte))
183             ok=True
184         except :
185             ok=False
186         if ok == False :
187             self.editor.afficheInfos(tr("Entrer un float SVP"),Qt.red)
188             monItem.setText("")
189             return
190         if self.monType.valSup != None :
191             if val > self.monType.valSup :
192                 self.editor.afficheInfos(tr("Entrer un float inferieur a ") + repr(self.monType.valSup),Qt.red)
193                 monItem.setText("")
194                 return
195         if self.monType.valMin != None :
196             if val < self.monType.valMin :
197                 self.editor.afficheInfos(tr("Entrer un float superieur a ") + repr(self.monType.valMin),Qt.red)
198                 monItem.setText("")
199                 return
200         self.editor.afficheInfos("")
201         if self.monType.structure != None: MonWidgetMatrice.__dict__[self.monType.structure](*(self,))
202         self.acceptVal()
203
204
205
206     def creeColonnes(self):
207         if self.monType.methodeCalculTaille != None :
208             try:
209                 MonWidgetMatrice.__dict__[self.monType.methodeCalculTaille](*(self,))
210             except :
211                 QMessageBox.critical( self, tr("Mauvaise execution "),tr( "impossible d executer la methode ") + self.monType.methodeCalculTaille )
212                 return
213         else :
214             self.nbLigs=self.monType.nbLigs
215             self.nbCols=self.monType.nbCols
216
217
218     def  nbDeVariables(self):
219     # uniquement pour OT
220         jdc=self.node.item.object.jdc
221         etape=self.node.item.object.etape
222         self.listeVariables=jdc.getVariables(etape)
223         if self.listeVariables == [] :
224             QMessageBox.critical( self, tr("Mauvaise Commande "),tr( "Aucune variable connue"))
225             return
226         self.TBMatrice.setColumnCount(len(self.listeVariables))
227         self.TBMatrice.setRowCount(len(self.listeVariables))
228         self.nbLigs=len(self.listeVariables)
229         self.nbCols=len(self.listeVariables)
230
231
232     def  initialSsValeur(self):
233     # uniquement pour OT
234         self.listeVariables=[]
235         for row in range(self.nbLigs):
236             for column in range(self.nbCols):
237                 if row == column :
238                     initialFloat=1
239                 else :
240                     initialFloat=0
241                 self.TBMatrice.setItem(row,column,QTableWidgetItem(str(initialFloat)))
242         header =[]
243         for var in liste[0]: header .append(str(var))
244         self.TBMatrice.setVerticalHeaderLabels(header)
245         self.TBMatrice.setHorizontalHeaderLabels(header)
246
247     def  nbDeVariables(self):
248     # uniquement pour OT
249         jdc=self.node.item.object.jdc
250         etape=self.node.item.object.etape
251         self.listeVariables=jdc.getVariables(etape)
252         if self.listeVariables == [] :
253             QMessageBox.critical( self, tr("Mauvaise Commande "),tr( "Aucune variable connue. Entrez les variables avant la matrice"))
254             return
255         self.TBMatrice.setColumnCount(len(self.listeVariables))
256         self.TBMatrice.setRowCount(len(self.listeVariables))
257         self.nbLigs=len(self.listeVariables)
258         self.nbCols=len(self.listeVariables)
259
260
261     def  initialValeur(self):
262     # uniquement pour OT
263         liste=self.node.item.getValeur()
264         dejaAffiche=0
265         if (len(liste)) != self.nbLigs +1   :
266             QMessageBox.critical( self,tr( "Mauvaise dimension de matrice"),tr( "le nombre de ligne n est pas egal a ") + str(self.nbLigs))
267             raise  EficasException('dimension')
268         for i in range(self.nbLigs):
269             inter=liste[i+1]
270             if (len(inter)) != self.nbCols :
271                 QMessageBox.critical( self, tr("Mauvaise dimension de matrice"), tr("le nombre de colonne n est pas egal a ") + str(self.nbCols))
272                 raise  EficasException('dimension')
273             for j in range(self.nbCols):
274                 self.TBMatrice.setItem(i,j,QTableWidgetItem(str(liste[i][j])))
275         header =[]
276         for var in liste[0]: header .append(str(var))
277         self.TBMatrice.setVerticalHeaderLabels(header)
278         self.TBMatrice.setHorizontalHeaderLabels(header)