Salome HOME
optim eciture
[tools/eficas.git] / InterfaceQT4 / monWidgetMatrice.py
1 # -*- coding: utf-8 -*-
2 # Copyright (C) 2007-2013   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
34
35 from desWidgetMatrice  import Ui_desWidgetMatrice 
36
37 from six.moves import range
38 from PyQt5.QtCore import QSize
39
40
41 class MonWidgetMatrice (Ui_desWidgetMatrice,Feuille):
42 # c est juste la taille des differents widgets de base qui change
43
44   def __init__(self,node,monSimpDef,nom,objSimp,parentQt,commande):
45         Feuille.__init__(self,node,monSimpDef,nom,objSimp,parentQt,commande)
46         self.monType= self.node.item.object.definition.type[0]
47         parentQt.commandesLayout.insertWidget(-1,self)
48         self.nbLigs=0
49         self.nbCols=0
50         self.nomVariables={}
51         self.creeColonnes()
52         self.connecterSignaux()
53         if self.node.item.get_valeur()== None:  self.initialSsValeur()
54         else :
55            try    : self.initialValeur()
56            except : self.initialSsValeur()
57         if sys.platform[0:5]!="linux" : 
58           repIcon=self.node.editor.appliEficas.repIcon
59           fichier=os.path.join(repIcon, 'update.png')
60           icon = QIcon(fichier)
61           self.PBrefresh.setIcon(icon)
62           self.PBrefresh.setIconSize(QSize(32, 32))
63
64
65
66   def connecterSignauxQT4(self) :
67       self.connect(self.TBMatrice,SIGNAL("itemChanged(QTableWidgetItem *)"),self.itemChanged)
68       self.connect(self.PBrefresh,SIGNAL("clicked()"), self.afficheEntete)
69
70   def connecterSignaux(self) :
71       self.TBMatrice.itemChanged.connect(self.itemChanged)
72       self.PBrefresh.clicked.connect( self.afficheEntete)
73
74   def afficheEntete(self):
75       self.objSimp.changeEnteteMatrice()
76       self.TBMatrice.clear()
77       if self.node.item.get_valeur()== None:  self.initialSsValeur()
78       else :
79          try    : self.initialValeur()
80          except : self.initialSsValeur()
81       self.node.item.object.state='changed'
82       self.node.item.object.parent.state='changed'
83       self.setValide()
84       self.parentQt.setValide()
85       self.node.item.jdc.isvalid()
86
87
88   def itemChanged(self):
89       monItem=self.TBMatrice.currentItem()
90       if monItem==None : return
91       texte=monItem.text()
92       if texte=="" : return
93       val,ok=texte.toDouble() 
94       if ok == False :
95         self.editor.affiche_infos(tr("Entrer un float SVP"),Qt.red)
96         monItem.setText("")
97         return
98       if self.monType.valSup != None :
99          if val > self.monType.valSup :
100             self.editor.affiche_infos(tr("Entrer un float inferieur a ") + repr(self.monType.valSup),Qt.red)
101             monItem.setText("")
102             return
103       if self.monType.valMin != None :
104          if val < self.monType.valMin :
105             self.editor.affiche_infos(tr("Entrer un float superieur a ") + repr(self.monType.valMin),Qt.red)
106             monItem.setText("")
107             return
108       self.editor.affiche_infos("")
109       if self.monType.structure != None: MonWidgetMatrice.__dict__[self.monType.structure](*(self,))
110       self.acceptVal()
111
112
113   def symetrique(self):
114       monItem=self.TBMatrice.currentItem()
115       texte=monItem.text()
116       if monItem.row() != monItem.column():
117          print(monItem.row(), monItem.column())
118          monItemSym=self.TBMatrice.item(monItem.column(), monItem.row())
119          monItemSym.setText(texte)
120
121   def creeColonnes(self):
122       if self.monType.methodeCalculTaille != None :
123          #try:
124          if 1 :
125            MonWidgetMatrice.__dict__[self.monType.methodeCalculTaille](*(self,))
126          else :
127          #except :
128            QMessageBox.critical( self, tr("Mauvaise execution "),tr( "impossible d executer la methode ") + monType.methodeCalculTaille )
129            return
130       else :
131          self.nbLigs=self.monType.nbLigs
132          self.nbCols=self.monType.nbCols
133
134
135   def  NbDeVariables(self):
136        jdc=self.node.item.object.jdc
137        etape=self.node.item.object.etape
138        self.listeVariables=jdc.get_variables(etape)
139        if self.listeVariables == [] :
140            QMessageBox.critical( self, tr("Mauvaise Commande "),tr( "Aucune variable connue"))
141            return
142        self.TBMatrice.setColumnCount(len(self.listeVariables))
143        self.TBMatrice.setRowCount(len(self.listeVariables))
144        self.nbLigs=len(self.listeVariables)
145        self.nbCols=len(self.listeVariables)
146
147   def  NbDeDistributions(self):
148        jdc=self.node.item.object.jdc
149        etape=self.node.item.object.etape
150        self.listeVariables=jdc.get_distributions(etape)
151        if self.listeVariables == [] :
152            QMessageBox.critical( self, tr("Mauvaise Commande "),tr( "Aucune variable connue"))
153            return
154        self.TBMatrice.setColumnCount(len(self.listeVariables))
155        self.TBMatrice.setRowCount(len(self.listeVariables))
156        self.nbLigs=len(self.listeVariables)
157        self.nbCols=len(self.listeVariables)
158
159   def  initialSsValeur(self):
160        for row in range(self.nbLigs):
161            for column in range(self.nbCols):
162                if row == column :
163                   initialFloat=1
164                else :
165                   initialFloat=0
166                self.TBMatrice.setItem(row,column,QTableWidgetItem(str(initialFloat)))
167        header=QStringList()
168        for var in self.listeVariables :
169            header << var
170        self.TBMatrice.setVerticalHeaderLabels(header)
171        self.TBMatrice.setHorizontalHeaderLabels(header)
172
173   def  initialValeur(self):
174       liste=self.node.item.get_valeur()
175       dejaAffiche=0
176       if (len(liste)) != self.nbLigs +1  :
177          QMessageBox.critical( self,tr( "Mauvaise dimension de matrice"),tr( "le nombre de ligne n est pas egal a ") + str(self.nbLigs))
178          dejaAffiche=1
179          raise  EficasException('dimension')
180       for i in range(self.nbLigs):
181           inter=liste[i+1]
182           if (len(inter)) != self.nbCols and (dejaAffiche == 0 ) :
183              QMessageBox.critical( self, tr("Mauvaise dimension de matrice"), tr("le nombre de colonne n est pas egal a ") + str(self.nbCols))
184              dejaAffiche=1
185              raise  EficasException('dimension')
186           for j in range(self.nbCols):
187               self.TBMatrice.setItem(i,j,QTableWidgetItem(str(liste[i+1][j])))
188       header=QStringList()
189       for var in liste[0]:
190            header << var
191       self.TBMatrice.setVerticalHeaderLabels(header)
192       self.TBMatrice.setHorizontalHeaderLabels(header)
193               
194   def acceptVal(self):
195       liste=[]
196       liste.append(self.listeVariables)
197       if self.TBMatrice.rowCount() != self.nbLigs :
198          QMessageBox.critical( self, tr("Mauvaise dimension de matrice"),tr( "le nombre de ligne n est pas egal a ") + str(self.nbLigs))
199       if self.TBMatrice.columnCount() != self.nbCols :
200          QMessageBox.critical( self, tr("Mauvaise dimension de matrice"), tr("le nombre de colonne n est pas egal a ") + str(self.nbCols))
201       for i in range(self.nbLigs):
202           listeCol=[]
203           for j in range(self.nbCols):
204               monItem=self.TBMatrice.item(i,j)       
205               texte=monItem.text()
206               val,ok=texte.toDouble() 
207               if ok == False :
208                  QMessageBox.critical( self, tr("Mauvaise Valeur"),tr( "l element ") + str(i) + "," +str(j) +tr("n est pas correct"))
209               listeCol.append(val)
210           liste.append(listeCol)
211       # on ajoute l ordre des variables aux valeurs
212       self.node.item.set_valeur(liste)