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)
13 from salome.smesh import smeshBuilder
14 smesh = smeshBuilder.New(salome.myStudy)
19 from PyQt5.QtWidgets import QDialog, QFileDialog, QTableWidgetItem, QComboBox, QMessageBox
24 salome_gui = libSALOME_Swig.SALOMEGUI_Swig()
26 from generate_interpolz import generate, generate_B
28 def get_med_groups( file_path ):
29 #print "get_med_groups", file_path
31 #meshes = MEDLoader.GetMeshNames(file_path)
32 (meshes, status) = smesh.CreateMeshesFromMED(file_path)
34 print 'No meshes found'
40 print 'Found mesh:', mesh1
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]
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"
49 print 'Found groups:', groups
51 print 'No groups found'
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()
64 regions_names.append( str(rname) )
66 # shape_groups = case.GetGeometryGroups()
67 # for sg in shape_groups:
68 # sgname = sg.GetName()
69 # regions_names.append( sgname )
75 def get_selected_calc_case():
76 ind = SalomePyQt.SalomePyQt.getObjectBrowser().selectionModel().selectedIndexes()
77 aStudyId = salome.myStudyId
78 doc = HYDROPy.HYDROData_Document.Document( aStudyId )
82 case = doc.FindObjectByName( name )
83 if isinstance(case, HYDROPy.HYDROData_CalculationCase):
87 def get_selected_bathy():
88 ind = SalomePyQt.SalomePyQt.getObjectBrowser().selectionModel().selectedIndexes()
89 aStudyId = salome.myStudyId
90 doc = HYDROPy.HYDROData_Document.Document( aStudyId )
94 case = doc.FindObjectByName( name )
95 if isinstance(case, HYDROPy.HYDROData_Bathymetry):
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
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 )
136 def onOutputFile( self ):
137 caption = "Python file"
139 fname, filt = QFileDialog.getSaveFileName( self, caption, ".", mask )
140 if fname!=None and fname!="":
141 if string.split(fname, '.')[-1] != 'py':
143 self.OutputPath.setText( fname )
145 def onMEDFile( self ):
148 fname, filt = QFileDialog.getOpenFileName( self, caption, ".", mask )
149 if fname!=None and fname!="":
150 self.MEDFile.setText( fname )
152 def onCalcCaseChanged( self ):
153 self.regions = get_hydro_regions( str(self.CalcCase.text()) )
156 #def onBathyNameChanged( self ):
157 # #self.regions = get_hydro_regions( str(self.CalcCase.text()) )
158 # self.onMEDChanged()
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])
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] )
176 cb = QComboBox( self.Groups )
178 for r in self.regions:
180 self.Groups.setCellWidget( i, 1, cb )
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)
189 def onCBInterpChanged( self ):
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("")
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())
204 def onApplyClose( 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())
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"
241 #if 'Linear' in interp:
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"
248 QMessageBox.information( self, "", msg )
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()
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"
267 msg = "Please choose interpolation method"
273 if 'Linear' in interp:
275 generate_B( path, bathy_name, med_file, group_name, z_undef, iinterp )
276 msg = "InterpolZ_B script is successfully generated"
279 QMessageBox.information( self, "", msg )
285 """Shows help page"""
288 <h2>Interpolz dialog</h2>
290 This dialog is a tool for automation the writing of the script <b>interpolz.py</b>.
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.
296 The path for the output, i.e. the path of the target script interpolz.
299 The path to MED file where MED groups are extracted.
302 The interpolation method (interpolation at the nearest point and linear interpolation from a triangulation of the cloud of points).
305 The Z value for nodes outside the regions.
308 The table with MED groups and regions names.
310 When the data is input, the user clicks on "Apply" or "Apply and Close" button to perform the script generation.
312 QMessageBox.about(self, self.tr("About boundary conditions dialog"), msg);
315 if __name__=='__main__':