Salome HOME
dfce842478b18da2f21cca491a71c5371001cc5b
[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 import string,types,os
22
23 # Modules Eficas
24 from PyQt4.QtGui     import *
25 from PyQt4.QtCore    import *
26 from Extensions.i18n import tr
27 from feuille         import Feuille
28
29
30 from desWidgetMatrice  import Ui_desWidgetMatrice 
31
32
33 class MonWidgetMatrice (Ui_desWidgetMatrice,Feuille):
34 # c est juste la taille des differents widgets de base qui change
35
36   def __init__(self,node,monSimpDef,nom,objSimp,parentQt,commande):
37         Feuille.__init__(self,node,monSimpDef,nom,objSimp,parentQt,commande)
38         self.monType= self.node.item.object.definition.type[0]
39         parentQt.commandesLayout.insertWidget(-1,self)
40         self.nbLigs=0
41         self.nbCols=0
42         self.nomVariables={}
43         self.creeColonnes()
44         self.connecterSignaux()
45         if self.node.item.get_valeur()== None:  self.initialSsValeur()
46         else :
47            try    : self.initialValeur()
48            except : self.initialSsValeur()
49
50
51   def connecterSignaux(self) :
52       self.connect(self.TBMatrice,SIGNAL("itemChanged(QTableWidgetItem *)"),self.itemChanged)
53       self.connect(self.PBrefresh,SIGNAL("clicked()"), self.afficheEntete)
54
55   def afficheEntete(self):
56       self.objSimp.changeEnteteMatrice()
57       self.TBMatrice.clear()
58       if self.node.item.get_valeur()== None:  self.initialSsValeur()
59       else :
60          try    : self.initialValeur()
61          except : self.initialSsValeur()
62
63
64   def itemChanged(self):
65       monItem=self.TBMatrice.currentItem()
66       if monItem==None : return
67       texte=monItem.text()
68       if texte=="" : return
69       val,ok=texte.toDouble() 
70       if ok == False :
71         self.editor.affiche_infos(tr("Entrer un float SVP"),Qt.red)
72         monItem.setText("")
73         return
74       if self.monType.valSup != None :
75          if val > self.monType.valSup :
76             self.editor.affiche_infos(tr("Entrer un float inferieur a ") + repr(self.monType.valSup),Qt.red)
77             monItem.setText("")
78             return
79       if self.monType.valMin != None :
80          if val < self.monType.valMin :
81             self.editor.affiche_infos(tr("Entrer un float superieur a ") + repr(self.monType.valMin),Qt.red)
82             monItem.setText("")
83             return
84       self.editor.affiche_infos("")
85       if self.monType.structure != None: apply (MonWidgetMatrice.__dict__[self.monType.structure],(self,))
86       self.acceptVal()
87
88
89   def symetrique(self):
90       monItem=self.TBMatrice.currentItem()
91       texte=monItem.text()
92       if monItem.row() != monItem.column():
93          print monItem.row(), monItem.column()
94          monItemSym=self.TBMatrice.item(monItem.column(), monItem.row())
95          monItemSym.setText(texte)
96
97   def creeColonnes(self):
98       if self.monType.methodeCalculTaille != None :
99          #try:
100          if 1 :
101            apply (MonWidgetMatrice.__dict__[self.monType.methodeCalculTaille],(self,))
102          else :
103          #except :
104            QMessageBox.critical( self, tr("Mauvaise execution "),tr( "impossible d executer la methode ") + monType.methodeCalculTaille )
105            return
106       else :
107          self.nbLigs=self.monType.nbLigs
108          self.nbCols=self.monType.nbCols
109
110
111   def  NbDeVariables(self):
112        jdc=self.node.item.object.jdc
113        etape=self.node.item.object.etape
114        self.listeVariables=jdc.get_variables(etape)
115        if self.listeVariables == [] :
116            QMessageBox.critical( self, tr("Mauvaise Commande "),tr( "Aucune variable connue"))
117            return
118        self.TBMatrice.setColumnCount(len(self.listeVariables))
119        self.TBMatrice.setRowCount(len(self.listeVariables))
120        self.nbLigs=len(self.listeVariables)
121        self.nbCols=len(self.listeVariables)
122
123   def  NbDeDistributions(self):
124        jdc=self.node.item.object.jdc
125        etape=self.node.item.object.etape
126        self.listeVariables=jdc.get_distributions(etape)
127        if self.listeVariables == [] :
128            QMessageBox.critical( self, tr("Mauvaise Commande "),tr( "Aucune variable connue"))
129            return
130        self.TBMatrice.setColumnCount(len(self.listeVariables))
131        self.TBMatrice.setRowCount(len(self.listeVariables))
132        self.nbLigs=len(self.listeVariables)
133        self.nbCols=len(self.listeVariables)
134
135   def  initialSsValeur(self):
136        for row in range(self.nbLigs):
137            for column in range(self.nbCols):
138                if row == column :
139                   initialFloat=1
140                else :
141                   initialFloat=0
142                self.TBMatrice.setItem(row,column,QTableWidgetItem(str(initialFloat)))
143        header=QStringList()
144        for var in self.listeVariables :
145            header << var
146        self.TBMatrice.setVerticalHeaderLabels(header)
147        self.TBMatrice.setHorizontalHeaderLabels(header)
148
149   def  initialValeur(self):
150       liste=self.node.item.get_valeur()
151       dejaAffiche=0
152       if (len(liste)) != self.nbLigs +1  :
153          QMessageBox.critical( self,tr( "Mauvaise dimension de matrice"),tr( "le nombre de ligne n est pas egal a ") + str(self.nbLigs))
154          dejaAffiche=1
155          raise  EficasException('dimension')
156       for i in range(self.nbLigs):
157           inter=liste[i+1]
158           if (len(inter)) != self.nbCols and (dejaAffiche == 0 ) :
159              QMessageBox.critical( self, tr("Mauvaise dimension de matrice"), tr("le nombre de colonne n est pas egal a ") + str(self.nbCols))
160              dejaAffiche=1
161              raise  EficasException('dimension')
162           for j in range(self.nbCols):
163               self.TBMatrice.setItem(i,j,QTableWidgetItem(str(liste[i+1][j])))
164       header=QStringList()
165       for var in liste[0]:
166            header << var
167       self.TBMatrice.setVerticalHeaderLabels(header)
168       self.TBMatrice.setHorizontalHeaderLabels(header)
169               
170   def acceptVal(self):
171       liste=[]
172       liste.append(self.listeVariables)
173       if self.TBMatrice.rowCount() != self.nbLigs :
174          QMessageBox.critical( self, tr("Mauvaise dimension de matrice"),tr( "le nombre de ligne n est pas egal a ") + str(self.nbLigs))
175       if self.TBMatrice.columnCount() != self.nbCols :
176          QMessageBox.critical( self, tr("Mauvaise dimension de matrice"), tr("le nombre de colonne n est pas egal a ") + str(self.nbCols))
177       for i in range(self.nbLigs):
178           listeCol=[]
179           for j in range(self.nbCols):
180               monItem=self.TBMatrice.item(i,j)       
181               texte=monItem.text()
182               val,ok=texte.toDouble() 
183               if ok == False :
184                  QMessageBox.critical( self, tr("Mauvaise Valeur"),tr( "l element ") + str(i) + "," +str(j) +tr("n est pas correct"))
185               listeCol.append(val)
186           liste.append(listeCol)
187       # on ajoute l ordre des variables aux valeurs
188       self.node.item.set_valeur(liste)