]> SALOME platform Git repositories - modules/hydrosolver.git/blob - src/salome_hydro/interpolz_gui.py
Salome HOME
16e06c5b1a61f23a9b9f4acc0e51ece60c3d5a11
[modules/hydrosolver.git] / src / salome_hydro / interpolz_gui.py
1
2 import sys, os
3 import string
4 #sys.path.append(os.path.join(os.environ['MEDFILE_ROOT_DIR'], 'lib/python2.7/site-packages/med'))
5 #sys.path.append(os.path.join(os.environ['MEDFICHIER_INSTALL_DIR'], 'lib/python2.7/site-packages/med'))
6 hydro_solver_root = os.path.join(os.environ['HYDROSOLVER_ROOT_DIR'], 'lib', 'python2.7', 'site-packages', 'salome', 'salome', 'hydro')
7 #sys.path.append(hydro_solver_root)
8
9 import salome
10 salome.salome_init()
11
12 import SMESH
13 from salome.smesh import smeshBuilder
14 smesh = smeshBuilder.New(salome.myStudy)
15
16 #import MEDLoader
17 import HYDROPy
18
19 from PyQt5.QtWidgets import QDialog, QFileDialog, QTableWidgetItem, QComboBox, QMessageBox
20 from PyQt5 import uic
21
22 import SalomePyQt
23 import libSALOME_Swig
24 salome_gui = libSALOME_Swig.SALOMEGUI_Swig()
25
26 from generate_interpolz import generate, generate_B
27
28 def get_med_groups( file_path ):
29     #print "get_med_groups", file_path
30     try:
31         #meshes = MEDLoader.GetMeshNames(file_path)
32         (meshes, status) = smesh.CreateMeshesFromMED(file_path)
33     except:
34         print 'No meshes found'
35         return []
36     if len(meshes)==0:
37         print 'No mesh found'
38         return []
39     mesh1 = meshes[0]
40     print 'Found mesh:', mesh1
41     try:
42         #groups = list(MEDLoader.GetMeshGroupsNames(file_path, mesh1))
43         grps = mesh1.GetGroups()
44         groups = [grp.GetName() for grp in grps if grp.GetType() == SMESH.FACE]
45         if len(groups) == 0:
46           print "Problem! There are no groups of faces in the mesh!"
47           print "Please create at least the groups of faces corresponding to each region of the HYDRO case"
48           return []
49         print 'Found groups:', groups
50     except:
51         print 'No groups found'
52         return []
53     return groups
54
55 def get_hydro_regions( calc_case_name ):
56     aStudyId = salome.myStudyId
57     doc = HYDROPy.HYDROData_Document.Document( aStudyId )
58     case = doc.FindObjectByName( calc_case_name )
59     if isinstance(case, HYDROPy.HYDROData_CalculationCase):
60       regions = case.GetRegions()
61       regions_names = []
62       for r in regions:
63         rname = r.GetName()
64         regions_names.append( str(rname) )
65
66 #       shape_groups = case.GetGeometryGroups()
67 #       for sg in shape_groups:
68 #           sgname = sg.GetName()
69 #           regions_names.append( sgname )
70
71       return regions_names
72     else:
73       return []
74
75 def get_selected_calc_case():
76     ind = SalomePyQt.SalomePyQt.getObjectBrowser().selectionModel().selectedIndexes()
77     aStudyId = salome.myStudyId
78     doc = HYDROPy.HYDROData_Document.Document( aStudyId )
79     for i in ind:
80         if i.column()==0:
81             name = str(i.data())
82             case = doc.FindObjectByName( name )
83             if isinstance(case, HYDROPy.HYDROData_CalculationCase):
84                 return name
85     return None
86
87 def get_selected_bathy():
88     ind = SalomePyQt.SalomePyQt.getObjectBrowser().selectionModel().selectedIndexes()
89     aStudyId = salome.myStudyId
90     doc = HYDROPy.HYDROData_Document.Document( aStudyId )
91     for i in ind:
92         if i.column()==0:
93             name = str(i.data())
94             case = doc.FindObjectByName( name )
95             if isinstance(case, HYDROPy.HYDROData_Bathymetry):
96                 return name
97     return None
98
99 class InterpolzDlg( QDialog ):
100     def __init__(self, parent = None):
101         QDialog.__init__( self, parent )
102         p = hydro_solver_root
103         uic.loadUi( p+'/interpolz.ui', self )
104         self.setWindowTitle( 'Generate interpolz script' )
105         SalomePyQt.SalomePyQt.getObjectBrowser().selectionChanged.connect(self.onSelectionChanged)
106         self.btnOutputPath.clicked.connect(self.onOutputFile)
107         self.btnMEDFile.clicked.connect(self.onMEDFile)
108         self.CalcCase.textChanged.connect(self.onCalcCaseChanged)
109         #self.BathyName.textChanged.connect(self.onBathyNameChanged)
110         self.MEDFile.textChanged.connect(self.onMEDChanged)
111         self.UndefZ.setRange( -100000, 100000 )
112         self.UndefZ.setValue( -9999 )
113         self.UndefZ_B.setRange( -100000, 100000 )
114         self.UndefZ_B.setValue( -9999 )
115         self.InterpMethod_B.addItem( "Interpolation at the nearest point" )
116         self.InterpMethod_B.addItem( "Linear interpolation on a cloud triangulation" )
117         self.InterpMethod.addItem( "Interpolation at the nearest point" )
118         self.InterpMethod.addItem( "Linear interpolation on a cloud triangulation" )
119         self.InterpMethod.currentIndexChanged.connect(self.onInterpChanged)
120         self.ApplyClose.clicked.connect(self.onApplyClose)
121         self.Apply.clicked.connect(self.onApply)
122         self.Close.clicked.connect(self.onClose)
123         self.Help.clicked.connect(self.onHelp)
124         self.onSelectionChanged()
125         self.tabWidget.setCurrentIndex(0)
126         self.regions = [] #to avoid attrib error
127
128     def onSelectionChanged( self ):
129         calc_case_name = get_selected_calc_case()
130         if calc_case_name is not None:
131           self.CalcCase.setText( calc_case_name )
132         bathy_name = get_selected_bathy()
133         if bathy_name is not None:
134           self.BathyName.setText( bathy_name )
135
136     def onOutputFile( self ):
137       caption = "Python file"
138       mask = "*.py"
139       fname, filt = QFileDialog.getSaveFileName( self, caption, ".", mask )
140       if fname!=None and fname!="":
141         if string.split(fname, '.')[-1] != 'py':
142           fname += '.py'
143         self.OutputPath.setText( fname )
144
145     def onMEDFile( self ):
146       caption = "MED file"
147       mask = "*.med"
148       fname, filt = QFileDialog.getOpenFileName( self, caption, ".", mask )
149       if fname!=None and fname!="":
150         self.MEDFile.setText( fname )
151
152     def onCalcCaseChanged( self ):
153       self.regions = get_hydro_regions( str(self.CalcCase.text()) )
154       self.onMEDChanged()
155           
156         #def onBathyNameChanged( self ):
157     #  #self.regions = get_hydro_regions( str(self.CalcCase.text()) )
158     #  self.onMEDChanged()
159
160     def onMEDChanged( self ):
161       self.med_groups = get_med_groups( str(self.MEDFile.text()) )
162       print self.med_groups
163       n = len( self.med_groups )
164       self.Groups.setRowCount( n )
165       self.medGroupNames.clear()
166       for i in range( 0, n ):
167         self.medGroupNames.addItem(self.med_groups[i])
168
169       for i in range( 0, n ):
170         if self.Groups.item( i, 0 ) is None:
171           self.Groups.setItem( i, 0, QTableWidgetItem() )
172           self.Groups.setItem( i, 1, QTableWidgetItem() )
173           self.Groups.setItem( i, 2, QTableWidgetItem() )
174         self.Groups.item( i, 0 ).setText( self.med_groups[i] )
175
176         cb = QComboBox( self.Groups )
177         cb.addItem( 'None' )
178         for r in self.regions:
179           cb.addItem( r )
180         self.Groups.setCellWidget( i, 1, cb )
181
182         icb = QComboBox( self.Groups )
183         icb.addItem( 'Interpolation at the nearest point' )
184         icb.addItem( 'Linear interpolation on a cloud triangulation' )
185         self.Groups.setCellWidget( i, 2, icb )
186         icb.currentIndexChanged.connect(self.onCBInterpChanged)
187         
188
189     def onCBInterpChanged( self ):
190       ind_set = set()
191       for i in range( 0, self.Groups.rowCount() ):
192         ind_set.add( self.Groups.cellWidget( i, 2 ).currentIndex() )
193       if len(ind_set) == 2:
194         self.InterpMethod.setStyleSheet("QComboBox { background-color: grey; }")
195       elif len(ind_set) == 1:
196         self.InterpMethod.setStyleSheet("")
197
198     def onInterpChanged( self ):
199       n = self.Groups.rowCount()
200       for i in range( 0, n ):
201         icb = self.Groups.cellWidget(i, 2)
202         icb.setCurrentIndex(self.InterpMethod.currentIndex())
203  
204     def onApplyClose( self ):
205         if self.onApply():
206             self.onClose()
207
208     def onApply( self ):
209         path = str(self.OutputPath.text())
210         med_file = str(self.MEDFile.text())
211         print 'current  TAB = ', self.tabWidget.currentIndex()
212         if self.tabWidget.currentIndex() == 0: #calc case tab
213             calc_case = str(self.CalcCase.text())
214             med_groups_regions = {}
215             regions_interp_method = {}
216             for i in range( 0, self.Groups.rowCount() ):
217                 med_group = str( self.Groups.item( i, 0 ).text() )
218                 hydro_reg = str( self.Groups.cellWidget( i, 1 ).currentText() )
219                 if len(med_group)>0 and len(hydro_reg)>0 and hydro_reg != 'None' :
220                     med_groups_regions[med_group] = hydro_reg
221                 interp_ind = str( self.Groups.cellWidget( i, 2 ).currentIndex() )
222                 regions_interp_method[hydro_reg] = interp_ind
223             z_undef = self.UndefZ.value()
224             #interp = str(self.InterpMethod.currentText())
225         
226             msg = ""
227             if len(path)==0:
228                 msg = "Please input the output path"
229             elif len(calc_case)==0:
230                 msg = "Please choose the calculation case"
231             elif len(med_file)==0:
232                 msg = "Please choose the MED file"
233             elif len(med_groups_regions)==0:
234                 msg = "Please fill groups table"
235             #elif len(interp)==0:
236             #    msg = "Please choose interpolation method"
237         
238             result = False
239             if len(msg)==0:
240                 #iinterp = 0
241                 #if 'Linear' in interp:
242                 #  iinterp = 1
243                 #generate( path, calc_case, med_file, med_groups_regions, z_undef, iinterp )
244                 generate( path, calc_case, med_file, med_groups_regions, z_undef, regions_interp_method )
245                 msg = "InterpolZ script is successfully generated"
246                 result = True
247         
248             QMessageBox.information( self, "", msg )
249             return result
250             
251         elif self.tabWidget.currentIndex() == 1: #bathymetry tab
252             bathy_name = str(self.BathyName.text())
253             group_name = str(self.medGroupNames.currentText())
254             interp = str(self.InterpMethod_B.currentText())
255             z_undef = self.UndefZ_B.value()
256
257             msg = ""
258             if len(path)==0:
259                 msg = "Please input the output path"
260             elif len(bathy_name)==0:
261                 msg = "Please choose the bathymetry"
262             elif len(med_file)==0:
263                 msg = "Please choose the MED file"
264             elif len(group_name)==0:
265                 msg = "Please choose MED group"
266             elif len(interp)==0:
267                 msg = "Please choose interpolation method"
268         
269             result = False
270             
271             if len(msg)==0:
272                 iinterp = 0
273                 if 'Linear' in interp:
274                   iinterp = 1
275                 generate_B( path, bathy_name, med_file, group_name, z_undef, iinterp )
276                 msg = "InterpolZ_B script is successfully generated"
277                 result = True
278         
279             QMessageBox.information( self, "", msg )
280             return result
281
282     def onClose( self ):
283         self.close()
284
285     """Shows help page"""
286     def onHelp( self ):
287         msg = """
288         <h2>Interpolz dialog</h2>
289
290         This dialog is a tool for automation the writing of the script <b>interpolz.py</b>.
291
292         <h3>Calculation case</h3>
293         The name of the calculation case. It can be filled automatically on the base of selection or can be input by user.
294
295         <h3>Output path</h3>
296         The path for the output, i.e. the path of the target script interpolz.
297
298         <h3>MED file</h3>
299         The path to MED file where MED groups are extracted.
300
301         <h3>Method</h3>
302         The interpolation method (interpolation at the nearest point and linear interpolation from a triangulation of the cloud of points).
303
304         <h3>Undefined Z</h3>
305         The Z value for nodes outside the regions.
306
307         <h3>Table</h3>
308         The table with MED groups and regions names.
309
310         When the data is input, the user clicks on "Apply" or "Apply and Close" button to perform the script generation.
311         """
312         QMessageBox.about(self, self.tr("About boundary conditions dialog"), msg);
313
314
315 if __name__=='__main__':
316   dlg = InterpolzDlg()
317   dlg.show()