1 import sys, pickle, tempfile, shutil
2 from os import path, getpid, environ, remove, system
5 from PyQt5.QtCore import *
6 from PyQt5.QtGui import *
7 from PyQt5.QtWidgets import *
9 from PyQt4.QtCore import *
10 from PyQt4.QtGui import *
12 import utilityFunctions as uF
13 import genereCrack, Zset, output, zcracks_ui
15 from output import message, init
16 from zcracks_ui import Ui_Zui
19 # ---------------------
21 # ---------------------
24 uF.removeFromSessionPath('LD_LIBRARY_PATH', 'Meshgems-2111')
26 def stringToFloat(string, typ=float):
27 if str(string).replace(' ','')=='':
30 out=map(typ, str(string).split())
33 def addExtension(string, extension):
42 res=string.find('.',start)
48 if strLen<=(lastPt+1+5) and lastPt!=0:
49 out=string[:(lastPt+1)]+extension.replace('.','')
51 out=string+'.'+extension.replace('.','')
55 # ----------------------------
56 # DEFINITION DE LA CLASSE
57 # ----------------------------
58 class ShipHolderApplication(QGroupBox):
60 def __init__(self, parent=None):
61 super (ShipHolderApplication, self).__init__(parent)
63 self.salomeVers=path.normpath(environ['ROOT_SALOME'])
64 self.salomeVers=path.split(self.salomeVers)[-1].split('V')[-1]
69 self.ui.widget.setVisible(False)
70 self.tmpdir=tempfile.mkdtemp()
71 self.saneGeoName=path.join(self.tmpdir,'salome_sane.geo')
72 self.crackGeoName=path.join(self.tmpdir,'salome_crack.geo')
73 self.crackMedName=path.join(self.tmpdir,'salome_crack.med')
74 self.crackedGeoName=path.join(self.tmpdir,'cracked.geo')
81 #self.connect(self.ui.CBQuad, SIGNAL("toggled(bool)"),self.pressQuad)
82 #self.connect(self.ui.btReset, SIGNAL("clicked()"),self.pressReset)
83 #self.connect(self.ui.btCancel, SIGNAL("clicked()"),self.pressCancel)
84 #self.connect(self.ui.btApply, SIGNAL("clicked()"),self.pressApply)
85 #self.connect(self.ui.btApplyClose, SIGNAL("clicked()"),self.pressApplyClose)
86 #self.connect(self.ui.btLoad, SIGNAL("clicked()"),self.pressCharger)
87 #self.connect(self.ui.btSave, SIGNAL("clicked()"),self.pressSauver)
88 #self.connect(self.ui.btLoadCracked, SIGNAL("clicked()"),self.pressLoadCracked)
89 #self.connect(self.ui.btLoadSane, SIGNAL("clicked()"),self.pressLoadSane)
91 #self.connect(self.ui.btGrVol, SIGNAL("clicked()"),self.pressLoadGroupVOL)
92 #self.connect(self.ui.btGrFace, SIGNAL("clicked()"),self.pressLoadGroupFACE)
93 #self.connect(self.ui.btGrEdge, SIGNAL("clicked()"),self.pressLoadGroupEDGE)
94 #self.connect(self.ui.btGrNode, SIGNAL("clicked()"),self.pressLoadGroupNODE)
95 #self.connect(self.ui.btGrAll, SIGNAL("clicked()"),self.pressLoadGroupALL)
96 #self.connect(self.ui.btVisu, SIGNAL("clicked()"),self.pressVisu)
98 #self.connect(self.ui.CBAdvanced, SIGNAL("toggled(bool)"),self.pressAdvanced)
100 self.ui.CBQuad.toggled.connect(self.pressQuad)
101 self.ui.btReset.clicked.connect(self.pressReset)
102 self.ui.btCancel.clicked.connect(self.pressCancel)
103 self.ui.btApply.clicked.connect(self.pressApply)
104 self.ui.btApplyClose.clicked.connect(self.pressApplyClose)
105 self.ui.btLoad.clicked.connect(self.pressCharger)
106 self.ui.btSave.clicked.connect(self.pressSauver)
107 self.ui.btLoadCracked.clicked.connect(self.pressLoadCracked)
108 self.ui.btLoadSane.clicked.connect(self.pressLoadSane)
110 self.ui.btGrVol.clicked.connect(self.pressLoadGroupVOL)
111 self.ui.btGrFace.clicked.connect(self.pressLoadGroupFACE)
112 self.ui.btGrEdge.clicked.connect(self.pressLoadGroupEDGE)
113 self.ui.btGrNode.clicked.connect(self.pressLoadGroupNODE)
114 self.ui.btGrAll.clicked.connect(self.pressLoadGroupALL)
115 self.ui.btVisu.clicked.connect(self.pressVisu)
117 self.ui.CBAdvanced.toggled.connect(self.pressAdvanced)
118 self.lineEditTypes=[str, str, float,
124 self.lineEditNames=['crackedName','saneName','minSize',
125 'maxSize','extractLength','grVol',
126 'grFace','grEdge','grNodes',
127 'gradation','iterations','layers',
130 self.lineEditObjects=[self.ui.valCrackedName,self.ui.valSaneName,self.ui.valMinSize,
131 self.ui.valMaxSize,self.ui.valExtractLength,self.ui.valGrVol,
132 self.ui.valGrFace,self.ui.valGrEdge,self.ui.valGrNode,
133 self.ui.valGradation,self.ui.valIterations,self.ui.valLayers,
136 def createWidgets(self):
138 self.ui.setupUi(self)
140 # -----------------------------------
141 # FONCTIONS D'ACTIONS DES BOUTONS
142 # -----------------------------------
145 if self.ui.CBQuad.isChecked():
146 self.ui.CBBarsoum.setEnabled(True)
147 self.ui.valGradation.setText(QString('2.3'))
149 self.ui.valGradation.setText(QString('1.3'))
150 self.ui.CBBarsoum.setChecked(False)
151 self.ui.CBBarsoum.setEnabled(False)
154 def pressReset(self):
155 for val in self.lineEditObjects:
157 self.ui.CBQuad.setChecked(False)
158 self.ui.CBBarsoum.setChecked(False)
159 nbOnglet=self.ui.tabWidget.count()
160 for iongl in range(nbOnglet):
161 onglet=self.ui.tabWidget.widget(iongl)
162 tab=onglet.findChildren(QTableWidget)[0]
163 for irow in range(tab.rowCount()):
164 if tab.item(irow,0) != None:
165 tab.item(irow,0).setText(QString(''))
166 self.ui.valGradation.setText(QString('1.3'))
167 self.ui.valLayers.setText(QString('5'))
168 self.ui.valIterations.setText(QString('2'))
169 self.ui.CBIs2D.setChecked(False)
170 self.ui.CBRefine.setChecked(False)
173 def pressApply(self):
174 message('M','\n\n -------------')
175 message('M',' Nouveau cas ')
176 message('M',' -------------')
177 message('M','Getting parameters and checking ...')
179 test=uF.check(self.data)
183 message('M','Parameters checked and ready to go')
185 message('E','Parameters checking failled',goOn=True)
188 message('M','\nGenerating crack ...')
189 res=genereCrack.main(self.data, self.crackMedName)
191 message('M','Crack generated successfully')
193 message('E','Crack generation failed',goOn=True)
196 if self.ui.CBIs2D.isChecked():
197 res=Zset.medToGeo(self.data['saneName'],self.saneGeoName, self.tmpdir, verbose=self.verbose, opt=[' **to_3d'])
199 res=Zset.medToGeo(self.data['saneName'],self.saneGeoName, self.tmpdir, verbose=self.verbose)
202 message('E','medToGeo sane failed',goOn=True)
205 #opt=['**elset crack *function 1.;','**elset elset0 *function 1.;']
206 res=Zset.medToGeo(self.crackMedName,self.crackGeoName, self.tmpdir, verbose=self.verbose)
208 message('E','medToGeo crack failed',goOn=True)
211 names={'saneGeoName':self.saneGeoName, 'crackGeoName':self.crackGeoName, 'crackedGeoName':self.crackedGeoName}
212 message('M','\nInserting crack ...')
213 res=Zset.insertCrack(self.data, names, self.tmpdir, verbose=self.verbose)
215 message('E','Crack insertion failed',goOn=True)
218 message('M','Crack inserted successfully')
220 if self.ui.CBQuad.isChecked() and self.ui.CBBarsoum.isChecked():
221 message('M','\nSaving cracked mesh in quadratic with Barsoum elements...')
222 opt=[' **lin_to_quad',' **crack_3d_quarter_nodes',' *liset FRONT0']
223 res=Zset.geoToMed(self.data['crackedName'], names['crackedGeoName'], self.tmpdir, opt=opt, verbose=self.verbose)
225 elif self.ui.CBQuad.isChecked() and not self.ui.CBBarsoum.isChecked():
226 message('M','\nSaving cracked mesh in quadratic...')
227 opt=[' **lin_to_quad']
228 res=Zset.geoToMed(self.data['crackedName'], names['crackedGeoName'], self.tmpdir, opt=opt, verbose=self.verbose)
231 message('M','\nSaving cracked mesh...')
232 res=Zset.geoToMed(self.data['crackedName'], names['crackedGeoName'], self.tmpdir, verbose=self.verbose)
234 uF.extendElsets(self.data['crackedName'])
237 message('M','Cracked mesh ready at : %s' %(self.data['crackedName']))
238 message('M','Maximal aspect ratio is %f' %(uF.getMaxAspectRatio(self.tmpdir)))
239 #message('M','medit %s/_mesh_out_to_ghs3d.mesh' %(self.tmpdir))
240 message('M','\n ----------------')
241 message('M',' Fin cas OK ')
242 message('M',' ----------------')
246 def pressApplyClose(self):
251 def pressLoadCracked(self):
252 fileDiag = QFileDialog(self)
253 fileDiag.setFileMode(QFileDialog.AnyFile)
254 fileDiag.setNameFilters(["Parametres *.med (*.*med)","All files (*)"])
255 fileDiag.setViewMode(QFileDialog.List)
256 if fileDiag.exec_() :
257 fileNames = fileDiag.selectedFiles()
258 filedef = fileNames[0]
259 filedef = addExtension(str(filedef), 'med')
260 self.ui.valCrackedName.setText(QString(filedef))
263 def pressLoadSane(self):
264 fileDiag = QFileDialog(self)
265 fileDiag.setFileMode(QFileDialog.AnyFile)
266 fileDiag.setNameFilters(["Parametres *.med (*.*med)","All files (*)"])
267 fileDiag.setViewMode(QFileDialog.List)
268 if fileDiag.exec_() :
269 fileNames = fileDiag.selectedFiles()
270 filedef = fileNames[0]
271 self.ui.valSaneName.setText(QString(filedef))
274 def pressCharger(self):
275 fileDiag = QFileDialog(self)
276 fileDiag.setFileMode(QFileDialog.AnyFile)
277 fileDiag.setNameFilters(["Parametres *.dic (*.dic)","All files (*)"])
278 fileDiag.setViewMode(QFileDialog.List)
280 if fileDiag.exec_() :
281 fileNames = fileDiag.selectedFiles()
282 filedef = fileNames[0]
283 if not path.isfile(str(filedef)):
284 message('E','Invalid dic file')
285 self.data=pickle.load(open(str(filedef),'r'))
286 message('M','\nLoading parameters from %s' %str(filedef))
288 for cont, obj in enumerate(self.lineEditObjects):
289 if self.lineEditTypes[cont] in [float, int]:
290 obj.setText(QString(self.data['TXT'+self.lineEditNames[cont]]))
292 obj.setText(QString(self.data[self.lineEditNames[cont]]))
294 self.ui.CBQuad.setChecked(True if 'quad' in self.data.keys() and self.data['quad'] else False)
295 self.ui.CBBarsoum.setChecked(True if 'barsoum' in self.data.keys() and self.data['barsoum'] else False)
296 self.ui.CBIs2D.setChecked(True if 'is2D' in self.data.keys() and self.data['is2D'] else False)
297 self.ui.CBRefine.setChecked(True if 'refine' in self.data.keys() and self.data['refine'] else False)
303 #if self.data['quad']: self.ui.CBQuad.setChecked(True)
304 #if self.data['barsoum']: self.ui.CBBarsoum.setChecked(True)
305 #if self.data['is2D']: self.ui.CBIs2D.setChecked(True)
306 #if self.data['refine']: self.ui.CBRefine.setChecked(True)
307 self.setTableParameters()
310 def pressSauver(self):
311 fileDiag = QFileDialog(self)
312 fileDiag.setFileMode(QFileDialog.AnyFile)
313 fileDiag.setNameFilters(["Parametres *.dic (*.dic)","All files (*)"])
314 fileDiag.setViewMode(QFileDialog.List)
315 if fileDiag.exec_() :
317 fileNames = fileDiag.selectedFiles()
318 filedef = fileNames[0]
319 pickle.dump(self.data, open(addExtension(str(filedef), 'dic'),'w'))
320 message('M','Saving parameters in %s' %addExtension(str(filedef), 'dic'))
322 def pressLoadGroupVOL(self):
324 self.GroupToLoad='VOL'
327 message('E','Groups loading impossible',goOn=True)
329 def pressLoadGroupFACE(self):
331 self.GroupToLoad='FACE'
334 message('E','Groups loading impossible',goOn=True)
336 def pressLoadGroupEDGE(self):
338 self.GroupToLoad='EDGE'
341 message('E','Groups loading impossible',goOn=True)
343 def pressLoadGroupNODE(self):
345 self.GroupToLoad='NODE'
348 message('E','Groups loading impossible',goOn=True)
350 def pressLoadGroupALL(self):
352 self.GroupToLoad='ALL'
355 message('E','Groups loading impossible',goOn=True)
357 def pressAdvanced(self):
358 if self.ui.CBAdvanced.isChecked():
359 self.ui.widget.setVisible(True)
361 self.ui.widget.setVisible(False)
364 meshFile1=path.join(self.tmpdir,'_mesh_out_to_ghs3d.mesh')
365 meshFile2=path.join(self.tmpdir,'_mesh_out_.mesh')
366 test1=path.isfile(meshFile1)
367 test2=path.isfile(meshFile2)
368 medit=path.join('$Z7PATH/PUBLIC/lib-Linux_64/Zmesh/bin/medit')
371 message('A','No mesh file to visualize')
373 print medit+' %s' %meshFile2
374 system(medit+' %s' %meshFile2)
376 print medit+' %s' %meshFile1
377 system(medit+' %s' %meshFile1)
380 def pressCancel(self):
381 message('M','exiting Zcracks')
383 shutil.rmtree(self.tmpdir)
385 message('E','Impossible to delete %s' %self.tmpdir,goOn=True)
389 # ---------------------------------
390 # FONCTIONS ANNEXES A LA CLASSE
391 # ---------------------------------
394 def getParameters(self):
395 for cont, name in enumerate(self.lineEditNames):
396 value=str(self.lineEditObjects[cont].text())
398 if self.lineEditTypes[cont] == float:
399 self.data['TXT'+name]=value
400 self.data[name]= stringToFloat(value)
401 elif self.lineEditTypes[cont] == int:
402 self.data['TXT'+name]=value
403 self.data[name]= stringToFloat(value, typ=int)
405 self.data[name]=value
406 self.data['quad']=self.ui.CBQuad.isChecked()
407 self.data['barsoum']=self.ui.CBBarsoum.isChecked()
408 self.data['TXTcrack']=self.getTableParameters()
409 self.data['crack']=self.getTableParameters(str2float=True)
410 self.data['is2D']=self.ui.CBIs2D.isChecked()
411 self.data['refine']=self.ui.CBRefine.isChecked()
414 def getTableParameters(self, str2float=False):
415 nbOnglet=self.ui.tabWidget.count()
417 iOngletActif=self.ui.tabWidget.currentIndex()
419 for iongl in range(nbOnglet):
421 onglet=self.ui.tabWidget.widget(iongl)
422 tab=onglet.findChildren(QTableWidget)[0]
423 for irow in range(tab.rowCount()):
424 label=tab.verticalHeaderItem(irow).text()
425 if tab.item(irow,0) is None:
427 elif 'med file' in str(label):
428 crack[str(label)]=str(tab.item(irow,0).text())
430 value=tab.item(irow,0).text()
432 crack[str(label)]=stringToFloat(value)
434 crack[str(label)]=str(value)
435 out[str(self.ui.tabWidget.tabText(iongl))]=crack
436 if iongl==iOngletActif:
437 ongletActif=str(self.ui.tabWidget.tabText(iongl))
439 out['actif']=ongletActif
443 def setTableParameters(self):
444 nbOnglet=self.ui.tabWidget.count()
445 #iOngletActif=self.ui.tabWidget.currentIndex()
446 for iongl in range(nbOnglet):
447 onglet=self.ui.tabWidget.widget(iongl)
448 tab=onglet.findChildren(QTableWidget)[0]
449 for irow in range(tab.rowCount()):
450 label=tab.verticalHeaderItem(irow).text()
451 if tab.item(irow,0) == None:
452 item = QTableWidgetItem()
453 tab.setItem(irow, 0, item)
454 tab.item(irow,0).setText(QString(self.data['TXTcrack'][str(self.ui.tabWidget.tabText(iongl))][str(label)]))
455 if str(self.ui.tabWidget.tabText(iongl)) == self.data['TXTcrack']['actif']:
456 self.ui.tabWidget.setCurrentWidget(onglet)
459 def loadGroups(self):
460 saneFile=str(self.ui.valSaneName.text())
461 message('I','Loading Sane mesh...')
462 if not path.isfile(saneFile):
463 message('E','Sane mesh med file is not valid')
466 #salome.salome_init()
467 theStudy = salome.myStudy
468 from salome.smesh import smeshBuilder
469 smesh = smeshBuilder.New(theStudy)
471 ([objetSain], status) = smesh.CreateMeshesFromMED(saneFile)
473 groupsVOL, groupsFAC, groupsEDG, groupsNOD = '', '', '', ''
476 for group in objetSain.GetGroups():
477 if (self.GroupToLoad in ['VOL','ALL']) and (group.GetType()==SMESH.VOLUME):
478 groupsVOL+=group.GetName().replace(' ','')+" "
481 if (self.GroupToLoad in ['FACE','ALL']) and (group.GetType()==SMESH.FACE):
482 groupsFAC+=group.GetName().replace(' ','')+" "
485 if (self.GroupToLoad in ['EDGE','ALL']) and (group.GetType()==SMESH.EDGE):
486 groupsEDG+=group.GetName().replace(' ','')+" "
489 if (self.GroupToLoad in ['NODE','ALL']) and (group.GetType()==SMESH.NODE):
490 groupsNOD+=group.GetName().replace(' ','')+" "
493 if groupsVOL!='': self.ui.valGrVol.setText(groupsVOL)
494 if groupsFAC!='': self.ui.valGrFace.setText(groupsFAC)
495 if groupsEDG!='': self.ui.valGrEdge.setText(groupsEDG)
496 if groupsNOD!='': self.ui.valGrNode.setText(groupsNOD)
498 message('I','%d group(s) found' %nGr)
500 def cleanTmpFiles(self):
501 for f in [self.saneGeoName, self.crackGeoName, self.crackMedName, self.crackedGeoName]:
508 # ---------------------------------
509 # LANCEMENT DE LA BOITE DE DIAG
510 # ---------------------------------